local Config = require("Config") Json = Json or require("common.Json") local InnerMsg = require("core.InnerMsg") local CommonDB = require("common.CommonDB") local MiddleManager = require("middle.MiddleManager") local ObjHuman = require("core.ObjHuman") local CommonDefine = require("common.CommonDefine") local Util = require("common.Util") -- 禁止等级 local BAN_LEVEL1 = 1 --禁角色 local BAN_LEVEL2 = 2 --禁账号 local BAN_LEVEL3 = 3 --禁设备 ------------------------------------------当前服是普通服的处理------------------------------------------ -- 缓存的禁止登录信息列表 local all_ban_list = {} local function generateTag(args) local strTag = "" for _, str in ipairs(args) do if strTag == "" then strTag = str else strTag = strTag .. "|" .. str end end return strTag end local function isSame(str, account) local t = Util.split(str, "|") account = tostring(account) if t[2] == account then return true end return false end -- 更新本地禁止登录信息缓存 local function updateBanListCache(banTag, banTime) if banTime == 0 then all_ban_list[banTag] = nil else all_ban_list[banTag] = banTime end end -- 通过uuid踢人 local function kickPlayerByuuid(uuid) if ObjHuman.onlineUuid[uuid] then ObjHuman.doDisconnect(ObjHuman.onlineUuid[uuid], CommonDefine.DISCONNECT_BAN_ROLE) local Handler = require("scene.Handler") Handler.sendDisconnect(ObjHuman.onlineUuid[uuid].fd, CommonDefine.DISCONNECT_BAN_ROLE) end end -- 通过account踢人 local function kickPlayerByAccount(account) for uTag, h in pairs(ObjHuman.onlineNewUniqueTag) do if isSame(uTag, account) then ObjHuman.doDisconnect(h, CommonDefine.DISCONNECT_BANUSER) local Handler = require("scene.Handler") Handler.sendDisconnect(h.fd, CommonDefine.DISCONNECT_BANUSER) break end end end -- 向跨服请求封禁数据 function NS_Get_BanData() local tMsgData = InnerMsg.lw.LW_QUERY_BAN_INFO tMsgData.nSrcServerID = Config.SVR_INDEX InnerMsg.sendMsg(0, tMsgData) end -- 收到跨服推送的封禁数据 function NS_Init_BanData(banList) for k ,v in pairs(banList) do updateBanListCache(k, v) end end -- 通知跨服更新封禁数据 function Update_CrossServer_BanData(banTag, banTime, banLevel) local tMsgData = InnerMsg.lw.LW_UPDATE_BAN_INFO tMsgData.nSrcServerID = Config.SVR_INDEX tMsgData.banTag = banTag tMsgData.banTime = banTime tMsgData.banLevel = banLevel InnerMsg.sendMsg(0, tMsgData) end -- 收到跨服推送的要更新的封禁数据 function NS_Update_BanData(banTag, banTime, banLevel) updateBanListCache(banTag, banTime) --踢对应账号玩家下线 if banLevel == BAN_LEVEL2 then local tbl = Util.split(banTag, "|") kickPlayerByAccount(tbl[2]) end -- 根据设备踢人 -- if banLevel == BAN_LEVEL3 then -- end end -- web更新封号数据 function Update_Ban_Info(banStr) local banInfo = Json.decode(banStr) local banTag, banTime local banLevel = BAN_LEVEL1 -- 禁角色 if banInfo.roleBanInfo then banTime = banInfo.roleBanInfo.banTime -- local banTbl = {banInfo.roleBanInfo.channelTag, banInfo.roleBanInfo.serverTag, banInfo.roleBanInfo.roleTag} banTag = banInfo.roleBanInfo.roleTag --generateTag(banTbl) if banTime > 0 then kickPlayerByuuid(banInfo.roleBanInfo.roleTag) end end -- 禁账号 if banInfo.accountBanInfo then banTime = banInfo.roleBanInfo.banTime local banTbl = {banInfo.roleBanInfo.channelTag, banInfo.roleBanInfo.accountTag} banTag = generateTag(banTbl) banLevel = BAN_LEVEL2 if banTime > 0 then kickPlayerByAccount(banInfo.roleBanInfo.accountTag) end end -- 禁设备 if banInfo.appBanInfo then banTag = banInfo.appBanInfo.appId banTime = banInfo.roleBanInfo.banTime banLevel = BAN_LEVEL3 end if banTag and banTime then -- 更新本地缓存 updateBanListCache(banTag, banTime) -- 更新跨服 Update_CrossServer_BanData(banTag, banTime, banLevel) end end -- 是否被禁止登录 function CheckBan(uuid, channelId, account, appId) local now = os.time() if all_ban_list[uuid] and all_ban_list[uuid] > now then return true end local banTag = generateTag({channelId, account}) if all_ban_list[banTag] and all_ban_list[banTag] > now then return true end if all_ban_list[appId] and all_ban_list[appId] > now then return true end return false end ------------------------------------------------------------------------------------------- ------------------------------------------当前服是跨服的处理------------------------------------------ local function getBanData() return CommonDB.getValueByKey(CommonDB.KEY_BAN_DATA) end local function updateBanData(newData) CommonDB.UpdateBanData(CommonDB.KEY_BAN_DATA, newData) end -- 当前服为跨服, 收到普通服请求封禁数据 function CS_Get_BanData() local banData = getBanData() if banData then local tMsgData = InnerMsg.wl.WL_QUERY_BAN_INFO for k, v in pairs(banData) do tMsgData.banList[k] = v end local fd = MiddleManager.getFDBySvrIndex(msg.nSrcServerID) InnerMsg.sendMsg(fd, tMsgData) end end -- 当前服为跨服, 收到普通服请求更新封禁数据 function CS_Update_BanData(msg) local banTime = msg.banTime local banTag = msg.banTag local banLevel = msg.banLevel local banData = getBanData() banData = banData or {} banData[banTag] = banTime if banTime == 0 then banData[banTag] = nil end --更新数据库 updateBanData(banData) -- 广播给全部区服 if banLevel >= BAN_LEVEL2 then local tMsgData = InnerMsg.wl.WL_UPDATE_BAN_INFO tMsgData.banTag = banTag tMsgData.banTime = banTime tMsgData.banLevel = banLevel local fdList = MiddleManager.MiddleManager_GetAllFD() for _, fd in pairs(fdList) do pcall(InnerMsg.sendMsg, fd, tMsgData) end end end -------------------------------------------------------------------------------------------