BanLogic.lua 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. --封号逻辑
  2. local Config = require("Config")
  3. Json = Json or require("common.Json")
  4. local InnerMsg = require("core.InnerMsg")
  5. local CommonDB = require("common.CommonDB")
  6. local MiddleManager = require("middle.MiddleManager")
  7. local ObjHuman = require("core.ObjHuman")
  8. local CommonDefine = require("common.CommonDefine")
  9. local Util = require("common.Util")
  10. -- 禁止等级
  11. local BAN_LEVEL1 = 1 --禁角色
  12. local BAN_LEVEL2 = 2 --禁账号
  13. local BAN_LEVEL3 = 3 --禁设备
  14. ------------------------------------------当前服是普通服的处理------------------------------------------
  15. local function generateTag(args)
  16. local strTag = ""
  17. for _, str in ipairs(args) do
  18. if strTag == "" then
  19. strTag = str
  20. else
  21. strTag = strTag .. "|" .. str
  22. end
  23. end
  24. return strTag
  25. end
  26. -- 获取本服缓存的封禁数据
  27. local function getBanCache()
  28. return CommonDB.GetBanCache()
  29. end
  30. -- 更新本服缓存的封禁数据
  31. local function updateBanCache(banTag, banTime)
  32. CommonDB.UpdateBanCache(banTag, banTime)
  33. end
  34. local function isSame(str, account)
  35. local t = Util.split(str, "|")
  36. account = tostring(account)
  37. if t[3] == account then
  38. return true
  39. end
  40. return false
  41. end
  42. -- 通过uuid踢人
  43. local function kickPlayerByuuid(uuid)
  44. if ObjHuman.onlineUuid[uuid] then
  45. local fd = ObjHuman.onlineUuid[uuid].fd
  46. ObjHuman.doDisconnect(ObjHuman.onlineUuid[uuid], CommonDefine.DISCONNECT_BAN_ROLE)
  47. local Handler = require("scene.Handler")
  48. Handler.sendDisconnect(fd, CommonDefine.DISCONNECT_BAN_ROLE)
  49. end
  50. end
  51. -- 通过account踢人
  52. local function kickPlayerByAccount(account)
  53. for uTag, h in pairs(ObjHuman.onlineNewUniqueTag) do
  54. if isSame(uTag, account) then
  55. local fd = h.fd
  56. ObjHuman.doDisconnect(h, CommonDefine.DISCONNECT_BANUSER)
  57. local Handler = require("scene.Handler")
  58. Handler.sendDisconnect(fd, CommonDefine.DISCONNECT_BANUSER)
  59. break
  60. end
  61. end
  62. end
  63. -- 通过设备号踢人
  64. local function kickPlayerByDeviceNo(deviceNo)
  65. for uTag, h in pairs(ObjHuman.onlineNewUniqueTag) do
  66. if h.deviceNo == deviceNo then
  67. local fd = h.fd
  68. ObjHuman.doDisconnect(h, CommonDefine.DISCONNECT_BANUSER)
  69. local Handler = require("scene.Handler")
  70. Handler.sendDisconnect(fd, CommonDefine.DISCONNECT_BANUSER)
  71. break
  72. end
  73. end
  74. end
  75. -- 向跨服请求封禁数据
  76. function NS_Get_BanData()
  77. local tMsgData = InnerMsg.lw.LW_QUERY_BAN_INFO
  78. tMsgData.nSrcServerID = Config.SVR_INDEX
  79. InnerMsg.sendMsg(0, tMsgData)
  80. end
  81. -- 收到跨服推送的封禁数据
  82. function NS_Init_BanData(banList)
  83. for k ,v in pairs(banList) do
  84. updateBanCache(k, v)
  85. end
  86. end
  87. -- 通知跨服更新封禁数据
  88. function Update_CrossServer_BanData(banStr)
  89. local tMsgData = InnerMsg.lw.LW_UPDATE_BAN_INFO
  90. tMsgData.nSrcServerID = Config.SVR_INDEX
  91. tMsgData.banStr = banStr
  92. InnerMsg.sendMsg(0, tMsgData)
  93. end
  94. -- 收到跨服推送的要更新的封禁数据
  95. function NS_Update_BanData(banStr)
  96. local banInfo = Json.Decode(banStr)
  97. -- 禁账号
  98. if banInfo.accountBanInfo then
  99. local banTime = tonumber(banInfo.accountBanInfo.banTime)
  100. local banTbl = {banInfo.accountBanInfo.channelTag, banInfo.accountBanInfo.accountTag}
  101. local banTag = generateTag(banTbl)
  102. if banTime > 0 then
  103. kickPlayerByAccount(banInfo.accountBanInfo.accountTag)
  104. end
  105. updateBanCache(banTag, banTime)
  106. end
  107. -- 禁设备
  108. if banInfo.appBanInfo then
  109. local banTime = tonumber(banInfo.appBanInfo.banTime)
  110. if banTime > 0 then
  111. kickPlayerByDeviceNo(banInfo.appBanInfo.appId)
  112. end
  113. updateBanCache(banInfo.appBanInfo.appId, tonumber(banInfo.appBanInfo.banTime))
  114. end
  115. end
  116. -- Web请求普通游戏服更新封号数据
  117. function Update_Ban_Info(banInfo)
  118. -- local banInfo = Json.Decode(banStr)
  119. -- 禁角色
  120. if banInfo.roleBanInfo then
  121. local banTime = tonumber(banInfo.roleBanInfo.banTime)
  122. local banTag = banInfo.roleBanInfo.roleTag
  123. if banTime > os.time() then
  124. kickPlayerByuuid(banTag)
  125. end
  126. -- 更新本地
  127. updateBanCache(banTag, banTime)
  128. end
  129. Update_CrossServer_BanData(Json.Encode(banInfo))
  130. end
  131. -- 是否被禁止登录
  132. function CheckBan(uuid, channelId, account, appId)
  133. local banListCache = getBanCache()
  134. local now = os.time()
  135. if banListCache[uuid] and banListCache[uuid] > now then
  136. return true
  137. end
  138. local banTag = generateTag({channelId, account})
  139. if banListCache[banTag] and banListCache[banTag] > now then
  140. return true
  141. end
  142. appId = tostring(appId)
  143. if banListCache[appId] and banListCache[appId] > now then
  144. return true
  145. end
  146. return false
  147. end
  148. -------------------------------------------------------------------------------------------
  149. ------------------------------------------当前服是跨服的处理------------------------------------------
  150. local function getBanData()
  151. return CommonDB.getValueByKey(CommonDB.KEY_BAN_DATA)
  152. end
  153. local function updateBanData(newData)
  154. CommonDB.UpdateBanData(newData)
  155. end
  156. -- 当前服为跨服, 收到普通服请求获取封禁数据
  157. function CS_Get_BanData(msg)
  158. local banData = getBanData()
  159. if banData then
  160. local tMsgData = InnerMsg.wl.WL_QUERY_BAN_INFO
  161. -- for k, v in pairs(banData) do
  162. -- tMsgData.banList[k] = v
  163. -- end
  164. tMsgData.banList = banData
  165. local fd = MiddleManager.getFDBySvrIndex(msg.nSrcServerID)
  166. InnerMsg.sendMsg(fd, tMsgData)
  167. end
  168. end
  169. -- 当前服为跨服, 收到普通服请求更新封禁数据
  170. function CS_Update_BanData(banStr)
  171. local banTag, banTime
  172. local bl = false
  173. local banInfo = Json.Decode(banStr)
  174. local banData = getBanData()
  175. banData = banData or {}
  176. -- 禁角色
  177. if banInfo.roleBanInfo then
  178. banTag = banInfo.roleBanInfo.roleTag
  179. banTime = tonumber(banInfo.roleBanInfo.banTime)
  180. if banTime == 0 or banTime > os.time() then
  181. bl = true
  182. banData[banTag] = banTime
  183. end
  184. if banTime == 0 then
  185. banData[banTag] = nil
  186. end
  187. end
  188. -- 禁账号
  189. if banInfo.accountBanInfo then
  190. banTime = tonumber(banInfo.accountBanInfo.banTime)
  191. local banTbl = {banInfo.accountBanInfo.channelTag, banInfo.accountBanInfo.accountTag}
  192. banTag = generateTag(banTbl)
  193. if banTime == 0 or banTime > os.time() then
  194. bl = true
  195. banData[banTag] = banTime
  196. end
  197. if banTime == 0 then
  198. banData[banTag] = nil
  199. end
  200. end
  201. -- 禁设备
  202. if banInfo.appBanInfo then
  203. banTag = tostring(banInfo.appBanInfo.appId)
  204. banTime = tonumber(banInfo.appBanInfo.banTime)
  205. if banTime == 0 or banTime > os.time() then
  206. bl = true
  207. banData[banTag] = banTime
  208. end
  209. if banTime == 0 then
  210. banData[banTag] = nil
  211. end
  212. end
  213. if not bl then
  214. return
  215. end
  216. --更新数据库
  217. updateBanData(banData)
  218. -- 广播给全部区服
  219. if banInfo.accountBanInfo or banInfo.appBanInfo then
  220. banInfo.roleBanInfo = nil
  221. banStr = Json.Encode(banInfo)
  222. local tMsgData = InnerMsg.wl.WL_UPDATE_BAN_INFO
  223. tMsgData.banStr = banStr
  224. local fdList = MiddleManager.MiddleManager_GetAllFD()
  225. for _, fd in pairs(fdList) do
  226. pcall(InnerMsg.sendMsg, fd, tMsgData)
  227. end
  228. end
  229. end
  230. -------------------------------------------------------------------------------------------