srvAgent.lua 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. -- 游戏 agent 服务
  2. local skynet = require "skynet"
  3. local queue = require "skynet.queue"
  4. local code = require "code"
  5. local baseService = require "baseService"
  6. local nodeUtil = require("utils.nodeUtil")
  7. local lib_queue = require("lib_queue")
  8. local util_event = require("utils.util_event")
  9. local roleMgr = (require "roleMgr").new()
  10. local mapItf2Module = {}
  11. local queues = {}
  12. local function cs(uid)
  13. local q = queues[uid]
  14. if not q then
  15. q = queue()
  16. queues[uid] = q
  17. end
  18. return q
  19. end
  20. local root = {
  21. mapUid2Agent = {}
  22. }
  23. -- 登录
  24. function root.login(uid, session)
  25. cs(uid)(roleMgr.login_role, roleMgr, uid, session)
  26. -- 通知 agentmgr
  27. skynet.call(".srvAgentMgr", "lua", "login", uid, session)
  28. nodeUtil:user_master_band_node(uid)
  29. return true
  30. end
  31. -- 登出
  32. function root.logout(uid, session)
  33. cs(uid)(roleMgr.logout_role, roleMgr, uid)
  34. skynet.call(".srvAgentMgr", "lua", "logout", uid, session)
  35. nodeUtil:user_master_unband_node(uid)
  36. return true
  37. end
  38. -- 回应请求协议
  39. local function l_c2s_response(uid, protoName, errCode, res, ...)
  40. res = res or {}
  41. res.code = errCode
  42. local role = roleMgr:get_role_obj(uid)
  43. if not role or role.gateNode == nil or role.gateAgent == nil then
  44. return
  45. end
  46. nodeUtil:send_to_node(role.gateNode, role.gateAgent, "c2s_response", uid, protoName, res, ...)
  47. end
  48. -- 格式化协议
  49. local function l_get_interface_and_func(protoName)
  50. -- return protoName:match "([^_]*)_(.*)"
  51. local data = string.split(protoName, "_")
  52. local itfName = data[1]
  53. return itfName, protoName
  54. end
  55. -- 获取接口对象
  56. local function l_get_interface_module(itfName)
  57. local fileName = string.format("interface.%s", itfName)
  58. mapItf2Module[itfName] = mapItf2Module[itfName] or require(fileName)
  59. return mapItf2Module[itfName]
  60. end
  61. -- 处理客户端协议数据
  62. function root.c2s_forward(uid, protoName, args, ...)
  63. local role = roleMgr:get_role_obj(uid)
  64. if role == nil then
  65. log.warning("c2s_forward not find role! uid:%s", uid)
  66. return l_c2s_response(uid, protoName, code.INNER_SERVER_ERROR)
  67. end
  68. local itfName, funcName = l_get_interface_and_func(protoName)
  69. local itfModule = l_get_interface_module(itfName)
  70. if itfModule == nil then
  71. log.error("dont find module ! itfName:%s, funcName:%s", itfName, funcName)
  72. return l_c2s_response(uid, protoName, code.INNER_SERVER_ERROR, nil, ...)
  73. end
  74. local func = itfModule[funcName]
  75. if not func then
  76. log.error("dont find func ! itfName:%s, funcName:%s", itfName, funcName)
  77. return l_c2s_response(uid, protoName, code.INNER_SERVER_ERROR, nil, ...)
  78. end
  79. local ok, errCode, rs =
  80. xpcall(
  81. func,
  82. function()
  83. skynet.error(debug.traceback())
  84. end,
  85. itfModule,
  86. role,
  87. args
  88. )
  89. if not ok then
  90. log.error(string.format("itfName:%s, funcName:%s, args:%s", itfName, funcName, tostring(args)))
  91. return l_c2s_response(uid, protoName, code.INNER_SERVER_ERROR, nil, ...)
  92. end
  93. l_c2s_response(uid, protoName, errCode, rs, ...)
  94. -- 协议处理完后进行处理
  95. local afterFuncName = string.format("after_%s", funcName)
  96. local afterFunc = itfModule[afterFuncName]
  97. if not afterFunc then
  98. return
  99. end
  100. ok, errCode, rs =
  101. xpcall(
  102. afterFunc,
  103. function()
  104. skynet.error(debug.traceback())
  105. end,
  106. itfModule,
  107. role,
  108. args
  109. )
  110. if not ok then
  111. log.error(string.format("after itfName:%s, funcName:%s, args:%s", itfName, funcName, tostring(args)))
  112. return
  113. end
  114. end
  115. function root.doCmd(uid, itfName, cmd, args)
  116. local role = roleMgr:get_role_obj(uid)
  117. if not role then
  118. log.error("doCmd uid[%s] role nil", tostring(uid))
  119. return
  120. end
  121. local itfModule = l_get_interface_module(itfName)
  122. if itfModule == nil then
  123. log.error("doCmd dont find module ! itfName:%s, cmd:%s", itfName, cmd)
  124. return 400
  125. end
  126. local func = itfModule[cmd]
  127. if not func then
  128. log.error("doCmd dont find func ! itfName:%s, cmd:%s", itfName, cmd)
  129. return 401
  130. end
  131. local ok, errCode, rs =
  132. xpcall(
  133. func,
  134. function()
  135. skynet.error(debug.traceback())
  136. end,
  137. role,
  138. args
  139. )
  140. if not ok then
  141. log.error(string.format("doCmd itfName:%s, cmd:%s, args:%s", itfName, cmd, tostring(args)))
  142. return
  143. end
  144. return errCode, rs
  145. end
  146. -- 玩家事件
  147. function root.user_trigge_event(uid, eventId, evtParams)
  148. log.debug("user_trigge_event uid[%s] eventId[%s] eventParams[%s]", uid, eventId, tostring(evtParams))
  149. lib_queue.critical_section(uid)(util_event.user_event, util_event, uid, eventId, evtParams)
  150. end
  151. -- 启动服务
  152. function root.onStart()
  153. return true
  154. end
  155. -- 服务关闭
  156. function root.onStop()
  157. -- 向agent管理服务发送退出成功消息
  158. skynet.send(".srvAgentMgr", "lua", "exit", skynet.self())
  159. return true
  160. end
  161. function root.recycle()
  162. skynet.exit()
  163. end
  164. -- 更新配置表
  165. function root.update_config(...)
  166. baseService.update_config(...)
  167. util_event:init()
  168. end
  169. -- 更新逻辑
  170. function root.update_logic(...)
  171. baseService.update_logic(...)
  172. util_event:init()
  173. end
  174. -- 在线玩家数
  175. function root.get_player_count()
  176. local count = 0
  177. for _, v in pairs(roleMgr.get_role_obj_list()) do
  178. count = count + 1
  179. end
  180. return count
  181. end
  182. -- 打印 - 玩家列表
  183. function root.print_uid_list()
  184. local uidList = {}
  185. for uid, _ in pairs(roleMgr.get_role_obj_list()) do
  186. table.insert(uidList, uid)
  187. end
  188. log.warning("print_uid_list uidList:%s", tostring(uidList))
  189. end
  190. baseService.start(root, "srvAgent_" .. skynet.self())