util_user.lua 5.8 KB

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