util_user.lua 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. --[[
  2. Descripttion:玩家埋点
  3. version:
  4. Author: Neo,Huang
  5. Date: 2022-05-26 19:45:58
  6. LastEditors: Neo,Huang
  7. LastEditTime: 2022-05-26 19:46:41
  8. --]]
  9. local skynet = require("skynet")
  10. local serverLogUtil = require("utils.serverLogUtil")
  11. local nodeMgr = require("nodeMgr")
  12. local code = require("code")
  13. local moduleData = require("data.module")
  14. local userData = require("data.user")
  15. local root = {}
  16. -- 埋点 - 事件
  17. function root:log_event(uid, keyEvent, cnt)
  18. if is_empty(uid) or is_empty(keyEvent) or is_empty(cnt) then
  19. return
  20. end
  21. local version = moduleData:get_version(uid)
  22. local channel = moduleData:get_channel(uid)
  23. serverLogUtil.logEvent(uid, version, channel, keyEvent, cnt)
  24. end
  25. -- 埋点 - 资源变化
  26. function root:log_resource(uid, keyEvent, itemId, delta, total)
  27. if is_empty(uid) or is_empty(keyEvent) or is_empty(itemId) then
  28. return
  29. end
  30. local channel = moduleData:get_channel(uid)
  31. local bandShareCode = userData:get_key_info(uid, "bandShareCode")
  32. serverLogUtil.logResource(uid, keyEvent, itemId, delta, total, channel, bandShareCode)
  33. end
  34. -- 通知
  35. function root:user_proto_notify(uid, protoName, msg)
  36. if uid == nil or protoName == nil then
  37. log.error("玩家消息推送失败 uid[%s] protoName[%s]", tostring(uid), tostring(protoName))
  38. return false
  39. end
  40. if is_robot(uid) then
  41. return false
  42. end
  43. local nodeInfo = self:user_get_cluster_info(uid, "gate")
  44. if nodeMgr.is_node_info_valid(nodeInfo) then
  45. nodeMgr.send_with_node_info(nodeInfo, "s2c", uid, protoName, msg)
  46. return true
  47. else
  48. log.error("玩家消息推送失败 uid[%s] nodeInfo[%s] protoName[%s]", tostring(uid), tostring(nodeInfo), tostring(protoName))
  49. end
  50. return false
  51. end
  52. -- 推送 - 客户端日志
  53. function root:user_notify_client_log(uid, msg)
  54. if uid == nil or is_empty(msg) then
  55. return
  56. end
  57. if not IS_TEST then
  58. return
  59. end
  60. -- self:user_proto_notify(uid, "on_log_client", {logStr = msg})
  61. end
  62. -- 踢玩家下线
  63. function root:user_kicked(uid, msg)
  64. local nodeInfo = self:user_get_cluster_info(uid, "gate")
  65. if nodeMgr.is_node_info_valid(nodeInfo) then
  66. nodeMgr.send_with_node_info(nodeInfo, "kick", uid, msg)
  67. end
  68. end
  69. -- 事件
  70. function root:user_dispatch_event(uid, eventId, evtParams)
  71. if uid == nil or eventId == nil then
  72. return false
  73. end
  74. -- log.info(
  75. -- "user_dispatch_event uid[%s] eventId[%s] evtParams[%s]",
  76. -- tostring(uid),
  77. -- tostring(eventId),
  78. -- tostring(evtParams)
  79. -- )
  80. if evtParams.times == nil then
  81. evtParams.times = 1
  82. end
  83. local nodeInfo = self:user_get_cluster_info(uid, "game")
  84. if nodeMgr.is_node_info_valid(nodeInfo) then
  85. nodeMgr.send_with_node_info(nodeInfo, "user_game_event", uid, eventId, evtParams)
  86. return true
  87. end
  88. nodeMgr.send("game1_1", ".settleSrv", "user_game_event", uid, eventId, evtParams)
  89. return false
  90. end
  91. ----------------------------------------
  92. -- 节点分配
  93. ----------------------------------------
  94. local function l_dispatch_server_node(nodeType, uid)
  95. local ok, server = nodeMgr.call("master", ".srvNodeMgr", "user_dispatch_cluster_node", uid, nodeType)
  96. if not ok then
  97. return
  98. end
  99. return server
  100. end
  101. --- 分配网关节点
  102. function root:user_dispatch_gate_node(uid)
  103. return l_dispatch_server_node("gate", uid)
  104. end
  105. --- 分配游戏节点
  106. function root:user_dispatch_game(uid)
  107. local node = l_dispatch_server_node("game", uid)
  108. if node == nil or is_empty(node.nodename) then
  109. return
  110. end
  111. local srvAgentMgr = nodeMgr.query_node_service_addr(node.nodename, ".srvAgentMgr")
  112. if not srvAgentMgr then
  113. return
  114. end
  115. local ok, gameAgent = nodeMgr.call(node.nodename, srvAgentMgr, "user_get_game_agent", uid)
  116. if not ok or gameAgent == nil then
  117. return
  118. end
  119. return {nodeName = node.nodename, agent = gameAgent}
  120. end
  121. local MODULE_SESSION = "session"
  122. -- 玩家节点信息
  123. function root:user_get_cluster_info(uid, clusterName)
  124. if uid == nil or is_empty(clusterName) then
  125. return
  126. end
  127. local nodeInfo = moduleData:hget_json(uid, MODULE_SESSION, clusterName)
  128. if is_empty(nodeInfo) then
  129. nodeInfo = nil
  130. end
  131. return nodeInfo
  132. end
  133. -- 玩家是否登录网关
  134. function root:user_is_online_gate(uid)
  135. local nodeInfo = self:user_get_cluster_info(uid, "gate")
  136. if nodeMgr.is_node_info_valid(nodeInfo) then
  137. return true
  138. end
  139. return false
  140. end
  141. -- 玩家是否登录游戏
  142. function root:user_is_online_game(uid)
  143. local nodeInfo = self:user_get_cluster_info(uid, "game")
  144. if nodeMgr.is_node_info_valid(nodeInfo) then
  145. return true
  146. end
  147. return false
  148. end
  149. ----------------------------------------
  150. -- game
  151. ----------------------------------------
  152. function root:user_send_game_agent(uid, interface, ...)
  153. local nodeInfo = self:user_get_cluster_info(uid, "game")
  154. if nodeMgr.is_node_info_valid(nodeInfo) then
  155. nodeMgr.send_with_node_info(nodeInfo, "doCmd", uid, interface, ...)
  156. end
  157. end
  158. function root:user_call_game_agent(uid, interface, ...)
  159. local nodeInfo = self:user_get_cluster_info(uid, "game")
  160. if nodeMgr.is_node_info_valid(nodeInfo) then
  161. return nodeMgr.call_with_node_info(nodeInfo, "doCmd", uid, interface, ...)
  162. end
  163. end
  164. ----------------------------------------
  165. -- 中心服
  166. ----------------------------------------
  167. local clusterName = skynet.getenv("clusterName")
  168. local nodename = skynet.getenv("nodeName")
  169. -- 玩家登陆服务器
  170. function root:master_user_login(uid, ...)
  171. return nodeMgr.call("master", ".srvNodeMgr", "userLogin", clusterName, nodename, uid, ...)
  172. end
  173. -- 玩家登出服务器
  174. function root:master_user_logout(uid, ...)
  175. return nodeMgr.call("master", ".srvNodeMgr", "userLogout", clusterName, nodename, uid, ...)
  176. end
  177. return root