proto_cmd.py 20 KB

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