|
|
@@ -0,0 +1,250 @@
|
|
|
+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
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+-------------------------------------------------------------------------------------------
|