proto_cmd.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. #coding=utf-8
  2. import sys,os,re,chardet,getopt
  3. repattern = re.compile(r'.*[\.]{1}([^\.]+)')
  4. packagekey = re.compile(r'package\s+([\S]+)\s*;')
  5. messageidkey = re.compile(r'\s+([\S]+)\s+=\s+([\d]+)\s*;\s*//\s*([^\r\n]*)')
  6. messagedefRulekey = re.compile(r'\s*message\s+([\S]+).*//\s*project\s+([\S]+)\s*//\s*RouteRule\s+([\S]+)')
  7. messagedefConfirmKey = re.compile(r'\s*message\s+([\S]+).*//\s*project\s+([\S]+)\s*//\s*RouteRule\s+([\S]+)\s*//\s*confirm.*')
  8. messagedefkey = re.compile(r'\s*message\s+([\S]+).*//\s*project\s+([\S]+)')
  9. messagekey = re.compile(r'\s*message\s+([\S]+)[^\r\n]*')
  10. def useage():
  11. print("Usage %s: [-h|-c] [--help|--config] args ..." % sys.argv[0])
  12. #获得msgidconfig.cfg中定义的消息ID区间段
  13. #例如:client-login.proto 1000-1999
  14. def getMsgSection(fileName):
  15. msgSection = {}
  16. file = open(fileName, 'r', encoding='utf-8')
  17. #file = open(fileName, 'r')
  18. if file:
  19. for line in file.readlines():
  20. line = line.strip()
  21. if len(line) <= 1 or line[0] == '#':
  22. continue
  23. keys = line.split(':')
  24. if keys == None or len(keys) < 2:
  25. continue
  26. protoname = keys[0].strip()
  27. if protoname == None or len(protoname) <= 0:
  28. continue
  29. msgSection[protoname] = []
  30. for i in range(1, len(keys)):
  31. values = keys[i].strip().split('-')
  32. if values == None or len(values) < 2:
  33. continue
  34. msgSection[protoname].append({"begin":int(values[0]), "end":int(values[1])})
  35. file.close()
  36. return msgSection
  37. #生成消息对应的ID映射
  38. #messages[msgkey] = {"id":int(msgid), "desc":msgdesc}
  39. #已经存在的消息映射不会改变
  40. def analysisMessageDef(fileName):
  41. messages = {}
  42. file = open(fileName, 'r', encoding='utf-8')
  43. #file = open(fileName, 'r')
  44. if file:
  45. for line in file.readlines():
  46. match = messageidkey.search(line)
  47. if match:
  48. groups = match.groups() #返回匹配结果组
  49. if groups and len(groups) >= 3:
  50. msgkey,msgid,msgdesc = groups[0].strip(),groups[1].strip(),groups[2].strip()
  51. #print(msgkey, msgid, msgdesc)
  52. messages[msgkey] = {"id":int(msgid), "desc":msgdesc}
  53. file.close()
  54. return messages
  55. #获取路径下的指定类型文件列表
  56. def getFileList(path, fileList):
  57. for parent, dirnames, filenames in os.walk(path):
  58. for filename in filenames:
  59. match = repattern.match(filename)
  60. if match:
  61. filetype = match.groups()[0]
  62. if filetype in ['proto']:
  63. fileList.append(os.path.join(parent, filename))
  64. def data2UTF8(data):
  65. if data == None or len(data) <=0:
  66. return data
  67. charset = chardet.detect(data)
  68. try:
  69. if charset != None and charset['encoding'] and charset['encoding'] in ('utf-8'):
  70. data = data.decode('utf-8', 'replace').encode('GB2312')
  71. except BaseException:
  72. print(charst)
  73. finally:
  74. return data
  75. def saveFile(filename, data):
  76. file = open(filename, 'w', encoding='utf-8')
  77. if file:
  78. #data = data2UTF8(data)
  79. file.write(data)
  80. file.close()
  81. #根据proto中定义的结构名称生成对应规则的枚举名称
  82. #例如LoginReq -> LOGIN_REQ
  83. def messageIdGen(name, packageName):
  84. str = name[:2]
  85. up = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  86. nameLen = len(name)
  87. for i in range(2, nameLen - 1):
  88. if name[i] in up:
  89. if i == 2 or name[i-1] not in up or name[i+1] not in up:
  90. str += '_'
  91. str += name[i]
  92. str += name[nameLen - 1]
  93. return str.upper()
  94. def saveMessageDef(fileName, messageFileClient, messageDef):
  95. sortMsg = {}
  96. for key, data in messageDef.items():
  97. sproject = ''
  98. if 'project' in data:
  99. sproject = ','.join(data['project'])
  100. #协议被删除后的处理
  101. if 'name' in data:
  102. sortMsg[int(data['id'])] = {'key':key,
  103. 'desc':data['desc'],
  104. 'name':data['name'],
  105. 'file':data['file'],
  106. 'project':sproject
  107. }
  108. if 'confirm' in data:
  109. sortMsg[int(data['id'])]['confirm'] = 1
  110. #print(data)
  111. messageText = ''
  112. messageTextClient = ''
  113. for id in sorted(sortMsg.keys()):
  114. data = sortMsg[id]
  115. if 'confirm' in data:
  116. messageText += '\t%-*s = %d;\t\t//\t%s **%s **%s **%s [%s][confirm]\n' % (32, data['key'], id, data['desc'], data['name'], data['file'], data['project'],data['name'])
  117. else:
  118. messageText += '\t%-*s = %d;\t\t//\t%s **%s **%s **%s [%s]\n' % (32, data['key'], id, data['desc'], data['name'], data['file'], data['project'],data['name'])
  119. match1 = re.search('CS_', data['key'])
  120. match2 = re.search('SC_', data['key'])
  121. if (match1 and match1.start(0) == 0) or (match2 and match2.start(0) == 0):
  122. if 'confirm' in data:
  123. messageTextClient += '\t%-*s = %d;\t\t//\t%s **%s **%s **%s [%s][confirm]\n' % (32, data['key'], id, data['desc'], data['name'], data['file'], data['project'],data['name'])
  124. else:
  125. messageTextClient += '\t%-*s = %d;\t\t//\t%s **%s **%s **%s [%s]\n' % (32, data['key'], id, data['desc'], data['name'], data['file'], data['project'],data['name'])
  126. saveFile(fileName,
  127. '''syntax = "proto3";
  128. package serverproto;
  129. option go_package = "./;serverproto";
  130. enum protoMsgId{
  131. MSG_BEGIN = 0;
  132. %s
  133. }
  134. ''' %messageText)
  135. saveFile(messageFileClient,
  136. '''syntax = "proto3";
  137. package serverproto;
  138. enum protoMsgId{
  139. MSG_BEGIN = 0;
  140. %s
  141. }
  142. ''' %messageTextClient)
  143. #保存pbbind_gen.go文件
  144. def savePBbindGo(fileName, messageDef, projectList):
  145. #print('fileName:',fileName, projectList)
  146. sortHandlerMsg = {}
  147. sortInitMsg = {}
  148. for key, data in messageDef.items():
  149. sproject = ''
  150. if 'name' in data:
  151. sortInitMsg[int(data['id'])] = {'key':key,
  152. 'id': data['id'],
  153. 'desc':data['desc'],
  154. 'name':data['name'],
  155. 'file':data['file'],
  156. 'confirm':0,}
  157. if 'project' in data and 'name' in data:
  158. sproject = ','.join(data['project'])
  159. sortHandlerMsg[int(data['id'])] = {'key':key,
  160. 'desc':data['desc'],
  161. 'name':data['name'],
  162. 'file':data['file'],
  163. 'project':sproject}
  164. if 'confirm' in data and data['confirm'] == 1:
  165. sortInitMsg[int(data['id'])]['confirm'] = data['confirm']
  166. #print(sortInitMsg[int(data['id'])])
  167. messageHandlerDef ='''package serverproto
  168. import(
  169. "log"
  170. "reflect"
  171. "rocommon"
  172. )
  173. func registerInfo(id int , msgType reflect.Type, confirmId int) {
  174. rocommon.RegisterMessageInfo(&rocommon.MessageInfo{ID:id,Codec:rocommon.GetCodec(), Type:msgType, ConfirmMsgId:confirmId})
  175. }
  176. '''
  177. messageHandler = '\nfunc GetMessageHandler(sreviceName string) rocommon.EventCallBack {\n\tswitch sreviceName { //note.serviceName must be lower words'
  178. messageHandlerDetail = ''
  179. #具体每个协议的定义
  180. projectList.sort()
  181. for projectName in projectList:
  182. projectNameStr = str.upper(projectName)
  183. messageHandlerDef += '\n//'+ projectNameStr + '\nvar('
  184. messageHandler += '\n\tcase "' + str.lower(projectName) + '":\t//' + projectNameStr + ' message process part\n\t\treturn '
  185. messageHandlerDetail = ' func(e rocommon.ProcEvent) {\n\t\t\tswitch e.Msg().(type) {'
  186. for id in sorted(sortHandlerMsg.keys()):
  187. data = sortHandlerMsg[id]
  188. if projectName in data['project']:
  189. messageHandlerDef += '\n\tHandle_' + projectNameStr + '_' + data['name'] +' =func(e rocommon.ProcEvent){panic("' + data['name'] + ' not implements")}'
  190. messageHandlerDetail += '\n\t\t\tcase *' + data['name'] + ': Handle_' + projectNameStr + '_' + data['name'] + '(e)'
  191. messageHandlerDef += '\n\tHandle_' + projectNameStr +'_Default func(e rocommon.ProcEvent)' + '\n)\n'
  192. messageHandlerDetail += '\n\t\t\tdefault:\n\t\t\t\tif Handle_' + projectNameStr + '_' + 'Default != nil {\n\t\t\t\t\tHandle_' + projectNameStr + '_Default(e)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n'
  193. messageHandler += messageHandlerDetail
  194. messageHandler += '\n\tdefault: \n\t\treturn nil\n\t}\n}'
  195. #init部分
  196. messageInit = '\nfunc init() {\n\t//协议注册\n\tlog.SetFlags(log.Lshortfile | log.LstdFlags)'
  197. for id in sorted(sortInitMsg.keys()):
  198. data = sortInitMsg[id]
  199. if 'confirm' in data and data['confirm'] == 1:
  200. methodName = data['name']
  201. methodName = methodName[2:len(methodName)-3].strip() + 'Ack'
  202. #print(methodName)
  203. for findId in sortInitMsg.keys():
  204. findData = sortInitMsg[findId]
  205. if methodName in findData['name']:
  206. #print(findData, methodName)
  207. messageInit += '\n\tregisterInfo(' + str(id) +', reflect.TypeOf((*' + data['name'] + ')(nil)).Elem(), ' + str(findData['id']) + ')'
  208. break
  209. else:
  210. if 'Ack' in data['name']:
  211. methodName = data['name']
  212. methodName = methodName[2:len(methodName)-3].strip() + 'Req'
  213. #print(methodName)
  214. bFind = 0
  215. for findId in sortInitMsg.keys():
  216. findData = sortInitMsg[findId]
  217. if methodName in findData['name'] and findData['confirm'] == 1:
  218. bFind = 1
  219. messageInit += '\n\tregisterInfo(' + str(id) +', reflect.TypeOf((*' + data['name'] + ')(nil)).Elem(), ' + str(findData['id']) + ')'
  220. break
  221. if bFind == 0:
  222. messageInit += '\n\tregisterInfo(' + str(id) +', reflect.TypeOf((*' + data['name'] + ')(nil)).Elem(), 0)'
  223. else:
  224. messageInit += '\n\tregisterInfo(' + str(id) +', reflect.TypeOf((*' + data['name'] + ')(nil)).Elem(), 0)'
  225. messageInit += '\n}'
  226. messageText = messageHandlerDef + messageHandler + messageInit
  227. saveFile(fileName, messageText)
  228. def saveRouteTableGo(fileName, messageDef):
  229. sortMsg = {}
  230. for key, data in messageDef.items():
  231. sproject = ''
  232. if 'route' in data and 'project' in data:
  233. sproject = ','.join(data['project'])
  234. sortMsg[int(data['id'])] = {'key':key,
  235. 'desc':data['desc'],
  236. 'name':data['name'],
  237. 'file':data['file'],
  238. 'project':sproject,
  239. 'route':','.join(data['route'])}
  240. #https://blog.csdn.net/qq_34500270/article/details/82899057
  241. #req和ack映射处理
  242. msgMapKVListTmp = {}
  243. msgMapKVList = {}
  244. for key, data in messageDef.items():
  245. msgMapKVListTmp[int(data['id'])] = data
  246. for key, data in msgMapKVListTmp.items():
  247. matchCS = re.search(r'CS', data['name'])
  248. matchReq = re.search(r'Req', data['name'])
  249. if matchCS and matchCS.start(0) == 0 and matchReq:
  250. ackName = data['name']
  251. ackName = re.sub(r'Req', 'Ack', ackName)
  252. ackName = re.sub(r'CS', 'SC', ackName, 1)
  253. #print('start', data['name'], ackName, data['id'])
  254. if msgMapKVListTmp.get(key+1):
  255. if msgMapKVListTmp[key+1]['name'] == ackName:
  256. #print('ok', data['name'], ackName, data['id'])
  257. msgMapKVList[key] = {
  258. 'ack': key+1,
  259. 'name': data['name'],
  260. 'ackname': ackName,
  261. }
  262. #把路由信息添加到init中
  263. routeText = '''package router
  264. type ReqAckKVInfo struct {
  265. ReqMsgId int32
  266. AckMsgId int32
  267. ReqMsgName string
  268. }
  269. var(
  270. RouteTable = new(MsgRouteList)
  271. //req和ack回复确认匹配协议号
  272. ReqAckKVList = map[int]ReqAckKVInfo{}
  273. )
  274. func addRule(name string, service string, mod string, id int) {
  275. rule := &MsgRouteRule{
  276. MsgName: name,
  277. ServiceName: service,
  278. Mod: mod,
  279. MsgID: id,
  280. }
  281. RouteTable.Rules = append(RouteTable.Rules, rule)
  282. AddRouteRule(rule)
  283. }
  284. //初始化路由信息,或者从服务器发现etcd中获取
  285. func init(){'''
  286. #print('sortMsg:', sortMsg)
  287. #print('messageDef:', messageDef)
  288. for id in sorted(sortMsg.keys()):
  289. data = sortMsg[id]
  290. routeText += '\n\taddRule("' + data['name'] + '","' + data['project'] + '","' + data['route'] + '",' + str(id) + ')'
  291. routeText += '\n\n //req和ack消息映射处理'
  292. for key, data in msgMapKVList.items():
  293. keyStr = str(key)
  294. routeText += '\n\tReqAckKVList[' + keyStr + '] = ReqAckKVInfo{' + keyStr + ', ' + str(data['ack']) + ', "' + data['name'] + '|' + data['ackname']+'"}'
  295. routeText += '\n}'
  296. saveFile(fileName, routeText)
  297. def increaseMessageId(msgSection, messageIdMax, pbName, increase=1):
  298. newIndex = 0
  299. if pbName not in messageIdMax:
  300. #查看是否有找到对应的proto枚举区域段
  301. if pbName not in msgSection or len(msgSection[pbName]) <= 0:
  302. newIndex = messageIdMax['max'] + increase
  303. else:
  304. newIndex = msgSection[pbName][0]['begin']
  305. else:
  306. newIndex = messageIdMax[pbName] + increase
  307. if pbName in msgSection:
  308. idList = msgSection[pbName]
  309. #pbName当前对应的区域段ID不够使用
  310. if newIndex > idList[-1]['end']:
  311. newIndex = messageIdMax['max'] +increase
  312. print('pbName area id(msgidconfig.cfg) not enough for use:',pbName)
  313. else:
  314. print('todo...')
  315. #print('11可以处理多个区域段,暂时只处理以后后续再扩展..todo...')
  316. messageIdMax[pbName] = messageIdMax['max'] = newIndex
  317. return newIndex
  318. #解析.proto文件
  319. def analysisProto(fileName, info):
  320. print('analysis proto: %s' %fileName)
  321. defines = []
  322. file = open(fileName, 'r', encoding='utf-8')
  323. if file:
  324. gopackage = None
  325. lastLine = ''
  326. #allfile = data2UTF8(file.read())
  327. allfile = file.read()
  328. for line in allfile.split('\n'):
  329. line = line.strip()
  330. if len(line) <= 0:
  331. continue
  332. if gopackage == None:
  333. match = packagekey.search(line)
  334. if match:
  335. gopackage = match.groups()[0].strip()
  336. desc = ''
  337. if lastLine[0:2] == '//':
  338. desc = lastLine[2:].strip() #协议消息注释
  339. #查找定义的消息结构
  340. match = messagedefkey.search(line)
  341. if match:
  342. groups = match.groups()
  343. if groups and len(groups) >=2:
  344. msgdefname,project = groups[0].replace('{', '').strip(), groups[1].strip().split('|')
  345. if len(desc) <=0:
  346. desc = msgdefname
  347. msgData = {'name':msgdefname,'desc':desc,'msgid':messageIdGen(msgdefname, gopackage),'project':project}
  348. if gopackage != None:
  349. msgData['package'] = gopackage
  350. defines.append(msgData)
  351. else:
  352. match = messagekey.search(line)
  353. if match:
  354. groups = match.groups()
  355. if groups and len(groups) >=1:
  356. msgdefname = groups[0].replace('{', '').strip()
  357. if msgdefname.lower()[-3:] in ['ntf','ack','req']:
  358. if len(desc) <= 0:
  359. desc = msgdefname
  360. msgData = {'name':msgdefname,'desc':desc,'msgid':messageIdGen(msgdefname, gopackage)}
  361. if gopackage != None:
  362. msgData['package'] = gopackage
  363. defines.append(msgData)
  364. #包含路由规则
  365. #todo...路由处理
  366. match = messagedefRulekey.search(line)
  367. if match:
  368. groups = match.groups()
  369. if groups and len(groups) >=3:
  370. msgdefname,project = groups[0].replace('{', '').strip(), groups[1].strip().split('|')
  371. routeList = groups[2].strip().split('|')
  372. if len(desc) <=0:
  373. desc = msgdefname
  374. msgData = {'name':msgdefname,'desc':desc,'msgid':messageIdGen(msgdefname, gopackage),'project':project}
  375. if gopackage != None:
  376. msgData['package'] = gopackage
  377. if len(routeList) > 0 :
  378. msgData['route'] = routeList
  379. defines.append(msgData)
  380. #包含回包确认
  381. match = messagedefConfirmKey.search(line)
  382. if match:
  383. groups = match.groups()
  384. if groups and len(groups) >=3:
  385. msgdefname,project = groups[0].replace('{', '').strip(), groups[1].strip().split('|')
  386. routeList = groups[2].strip().split('|')
  387. if len(desc) <=0:
  388. desc = msgdefname
  389. msgData = {'name':msgdefname,'desc':desc,'msgid':messageIdGen(msgdefname, gopackage),'project':project}
  390. if gopackage != None:
  391. msgData['package'] = gopackage
  392. if len(routeList) > 0 :
  393. msgData['route'] = routeList
  394. msgData['confirm'] = 1
  395. #print(msgData)
  396. defines.append(msgData)
  397. lastLine = line
  398. file.close()
  399. if len(defines) > 0:
  400. newName = fileName
  401. nameArr = fileName.replace('\\', '/').split('/')
  402. if nameArr != None and len(nameArr) > 0:
  403. newName = nameArr[-1]
  404. info[newName] = defines #该proto文件对应的消息信息
  405. #输出文件
  406. #1,消息ID枚举定义文件messagedef.proto
  407. #2,处理protoMsg消息,转换为项目输出
  408. def saveOutFile(outDir, messageFile, messageFileClient, projectList, msgSection, messagesDef, protoMsgs):
  409. projectMap = {} #模块对应信息,例如gate,game,auth
  410. projectAllMap = {} #相同proto文件中的所有消息数据
  411. commomMsgMap = {} #不属于任何模块的通用信息,只是用作结构处理
  412. messageMap = {} #所有消息的集合
  413. messageIdMax = {} #更新每一个proto文件,最大的协议号
  414. #pbName为proto文件名,例如login.proto
  415. for pbName,pbData in protoMsgs.items():
  416. for data in pbData:
  417. #哪些模块需要处理该协议
  418. if 'project' in data.keys():
  419. for project in data['project']:
  420. proKey = project
  421. if proKey not in projectMap:
  422. projectMap[proKey] = {}
  423. if pbName not in projectMap[proKey]:
  424. projectMap[proKey][pbName] = [] #哪些proto文件中有该模块的操作
  425. projectMap[proKey][pbName].append({'data':data, 'project':project})
  426. if pbName not in projectAllMap:
  427. projectAllMap[pbName] = []
  428. projectAllMap[pbName].append(data)
  429. else:
  430. if pbName not in commomMsgMap:
  431. commomMsgMap[pbName] = []
  432. commomMsgMap[pbName].append(data)
  433. if pbName not in messageMap:
  434. messageMap[pbName] = []
  435. messageMap[pbName].append(data)
  436. msgid = data['msgid']
  437. #获取pbName中已经在messagedef.proto文件中定义的枚举最大值
  438. if msgid in messagesDef:
  439. msgIndex = messagesDef[msgid]['id']
  440. if pbName not in messageIdMax or messageIdMax[pbName] < msgIndex:
  441. messageIdMax[pbName] = msgIndex
  442. #获取所有协议枚举的最大值
  443. maxIndex = 0
  444. for _,data in messagesDef.items():
  445. if data != None and data['id'] > maxIndex:
  446. maxIndex = data['id']
  447. messageIdMax['max'] = maxIndex
  448. #print('messageIdMax:',messageIdMax)
  449. #print('messageMap:',messageMap)
  450. #print('messagesDef:',messagesDef)
  451. #print('msgSection:', msgSection)
  452. #print('protoMsgs:', protoMsgs)
  453. #保存messagedef.proto
  454. for pbName,msgs in messageMap.items():
  455. for data in msgs:
  456. msgId = data['msgid']
  457. if msgId not in messagesDef:
  458. messageIdMax[pbName] = increaseMessageId(msgSection, messageIdMax, pbName)
  459. messagesDef[msgId] = {'id':messageIdMax[pbName]}
  460. messagesDef[msgId]['desc'] = data['desc']
  461. messagesDef[msgId]['name'] = data['name']
  462. messagesDef[msgId]['file'] = pbName
  463. if 'project' in data:
  464. messagesDef[msgId]['project'] = data['project']
  465. if 'route' in data:
  466. messagesDef[msgId]['route'] = data['route']
  467. if 'confirm' in data:
  468. messagesDef[msgId]['confirm'] = data['confirm']
  469. #print('messageIdMax:',messageIdMax)
  470. #print('messagesDef:',messagesDef)
  471. #生成消息枚举定义文件messagedef.proto
  472. saveMessageDef(messageFile, messageFileClient, messagesDef)
  473. #生成pbbind_gen.go文件
  474. savePBbindGo('pbbind_gen.go', messagesDef, projectList)
  475. #生成路由信息routetable.go
  476. saveRouteTableGo('../baseserver/router/route_table.go', messagesDef)
  477. #生成每个消息的处理回调信息 todo...
  478. #game/////////////////////////////////////////////////////////////////////////////////////////
  479. if __name__ == '__main__':
  480. projects=['gate','game','db','auth','social','guild','aoi','rank','maprouter',"battlepve", "battleboss","battlerecord","gmweb",
  481. "crossrouter","crossserver","crossrank","gcrossrouter","gcrossmap"]
  482. #导出的proto文件协议对应ID
  483. messageFile = 'messagedef.proto'
  484. messageFileClient = 'messagedefclient.proto'
  485. #每个proto文件的消息ID分段,用来区分消息类型
  486. configFile = 'msgidconfig.cfg'
  487. try:
  488. opts,args = getopt.getopt(sys.argv[1:], "hp:c:", ["help","config="])
  489. for opt, arg in opts:
  490. if opt in ("-c", "--config"):
  491. configFile = arg
  492. except getopt.GetoptError:
  493. useage()
  494. sys.exit(1)
  495. msgSection = getMsgSection(configFile)
  496. #print('[%s] msgsection:' %configFile, msgSection)
  497. messagesDef = analysisMessageDef(messageFile)
  498. #print('[%s] messages:'%messageFile, messagesDef)
  499. #解析proto文件
  500. fileList = []
  501. getFileList('./', fileList)
  502. protoMsgs = {}
  503. for file in fileList:
  504. analysisProto(file, protoMsgs)
  505. #print('info:',protoMsgs)
  506. saveOutFile('./', messageFile, messageFileClient, projects, msgSection, messagesDef, protoMsgs)
  507. '''
  508. package serverproto
  509. import (
  510. "rocommon"
  511. "log"
  512. "reflect"
  513. )
  514. //gate
  515. var (
  516. Handle_Gate_LoginReq = func(e rocommon.ProcEvent){panic("LoginReq not implements")}
  517. Handle_Gate_Default func(e rocommon.ProcEvent)
  518. )
  519. func GetMessageHandler(sreviceName string) rocommon.EventCallBack {
  520. switch sreviceName {
  521. case "gate": return gateHandler
  522. case "game": return gameHandler
  523. case "db": return dbHandler
  524. default:
  525. return nil
  526. }
  527. }
  528. //gate消息处理部分
  529. func gateHandler(e rocommon.ProcEvent) {
  530. switch e.Msg().(type) {
  531. case *LoginReq: Handle_Gate_LoginReq(e)
  532. default:
  533. if Handle_Gate_Default != nil {
  534. Handle_Gate_Default(e)
  535. }
  536. }
  537. }
  538. func gameHandler(e rocommon.ProcEvent) {
  539. //todo...
  540. }
  541. func dbHandler(e rocommon.ProcEvent) {
  542. //todo...
  543. }
  544. func init() {
  545. //todo...协议注册
  546. log.SetFlags(log.Lshortfile | log.LstdFlags)
  547. rocommon.RegisterMessageInfo(&rocommon.MessageInfo{
  548. Codec:rocommon.GetCodec(), Type:reflect.TypeOf((*LoginReq)(nil)).Elem(), ID:1})
  549. }
  550. '''
  551. '''
  552. package router
  553. var (
  554. RouteTable = new(MsgRouteList)
  555. )
  556. func init() {
  557. //初始化路由信息,或者从服务器发现etcd中获取
  558. RouteTable.Rules = append(RouteTable.Rules, &MsgRouteRule{
  559. MsgName: "name",
  560. ServiceName: "gate|game",
  561. Mod: "pass",
  562. MsgID: 1,
  563. })
  564. }
  565. '''