Răsfoiți Sursa

封号功能

gitxsm 1 an în urmă
părinte
comite
e509e8f478

+ 34 - 25
script/common/CommonDB.lua

@@ -14,7 +14,7 @@ KEY_SERVER_START_TIME = "serverStartTime"				-- 开服时间
 KEY_IDENTITY_MAX = "identityMax"						-- 自增的最大的数字 从1开始
 KEY_UNION_IDENTITY_MAX = "unionIdentityMax"				-- 自增的最大的数字 从1开始
 KEY_REWARD_INDEX = "rewardIndex"						-- 好友排行榜奖励索引rewardIndex
-KEY_BAN_IP = "banIp"									-- 被禁IP
+-- KEY_BAN_IP = "banIp"									-- 被禁IP
 KEY_CHONGJI_ACT = "chongJiAct"							-- 全服冲级活动 领取情况
 KEY_ACT_MONTH = "actMonth"								-- 当前计算的真实月份
 KEY_UNION_WAR = "unionWar"								-- 公会战
@@ -41,6 +41,7 @@ KEY_FIREWORKBONUS_TIME="fireWorksBonusTime"             -- 烟花加成时间
 KEY_COMMERCEACT_INFO = "commerceActInfo"				-- 跨服活动信息
 KEY_JJCLADDER_TIME = "jjcladderEndTime"					-- 天梯赛结束时间
 KEY_COMMERCEACT_MIDDLE_INFO = "commerceMiddleActInfo"	-- 中心服跨服商业活动信息
+KEY_BAN_DATA = "banData"								-- 封禁数据
 
 db = db or {
 	serverStartTime = nil,								-- 开服时间
@@ -49,7 +50,7 @@ db = db or {
     rewardIndex = nil,                                  -- 好友排行榜奖励索引rewardIndex
     unionIdentityMax = nil,                             -- 自增的最大的数字 从1开始
     mergeSvrIndex = nil,								-- 合服之后对应的服务器索引 比如如果10001,10003,100004合服了 这里的数据结构是{10001,10003,10004}
-    banIp = {},                                         -- 被禁IP
+    -- banIp = {},                                         -- 被禁IP
 	chongJiAct  = {},                                   -- 全服冲级活动 领取情况
 	actMonth = nil,                                     -- 当前计算的真实月份
 	unionWarState = nil,                                -- 当前工会战状态
@@ -69,6 +70,7 @@ db = db or {
 	commerceActInfo = {},								-- 跨服商业活动信息
 	jjcladderEndTime = nil,								-- 天梯赛结束时间
 	commerceMiddleActInfo = {},							-- 中心服跨服商业活动信息
+	banData = {},										-- 封禁数据
 }
 
 function init()
@@ -200,35 +202,42 @@ function getMergeSvrIndex()
 	return db.mergeSvrIndex
 end
 
-cnt = 1
-function setBanIp(ip,time)
-    db.banIp[cnt] =db.banIp[cnt] or {}
-    db.banIp[cnt].ip = ip
-    db.banIp[cnt].time = time
-    cnt = cnt + 1
+-- cnt = 1
+-- function setBanIp(ip,time)
+--     db.banIp[cnt] =db.banIp[cnt] or {}
+--     db.banIp[cnt].ip = ip
+--     db.banIp[cnt].time = time
+--     cnt = cnt + 1
 	
-	updateValue(KEY_BAN_IP, db.banIp)
-end
+-- 	updateValue(KEY_BAN_IP, db.banIp)
+-- end
 
-function getBanIp(ip)
-    for k,v in pairs(db.banIp) do
-        if v.ip == ip then
-            return v.ip,v.time
-        end
-    end
-    return 
-end
+-- function getBanIp(ip)
+--     for k,v in pairs(db.banIp) do
+--         if v.ip == ip then
+--             return v.ip,v.time
+--         end
+--     end
+--     return 
+-- end
 
-function delBanIp(ip)
-    for k,v in pairs(db.banIp) do
-        if v.ip == ip then
-            db.banIp[k] = nil
-        end
-    end
+-- function delBanIp(ip)
+--     for k,v in pairs(db.banIp) do
+--         if v.ip == ip then
+--             db.banIp[k] = nil
+--         end
+--     end
 
-    updateValue(KEY_BAN_IP, db.banIp)
+--     updateValue(KEY_BAN_IP, db.banIp)
+-- end
+
+function UpdateBanData(newBanData)
+	db.banData = newBanData
+	updateValue(KEY_BAN_DATA, newBanData)
 end
 
+
+
 -- 全服创号 冲级活动
 function getSvrChongJiGet(id)
 	local num = 0 

+ 27 - 0
script/common/InnerHandler.lua

@@ -21,6 +21,7 @@ local HeroMiddleLogic = require("hero.HeroMiddleLogic")
 local MiddleCommonLogic = require("middle.MiddleCommonLogic")
 local CommerceMiddle = require("serverCommerce.ServerCommerceMiddle")
 local MiddleCommonRank = require("middle.MiddleCommonRank")
+local BanLogic = require("scene.BanLogic")
 
 function LW_HELLO(fd, msg)
 	if _G.is_middle ~= true then return end
@@ -282,3 +283,29 @@ function WL_COMMERCE_ACT_GET_OPENTIME(fd, msg)
     CommerceMiddle.CommerceMiddle_GetActOpenTime_WL(msg)
 end
 -------------------- 跨服商业活动结束 ---------------------------
+
+----------------------- 封禁功能开始 ---------------------------
+
+-- 向跨服查询
+function LW_QUERY_BAN_INFO(fd, msg)
+    if _G.is_middle ~= true then return end
+    BanLogic.CS_Get_BanData()
+end
+
+-- 跨服回应查询
+function WL_QUERY_BAN_INFO(fd, msg)
+    BanLogic.NS_Init_BanData(msg)
+end
+
+-- 通知跨服更新
+function LW_UPDATE_BAN_INFO(fd, msg)
+    if _G.is_middle ~= true then return end
+    BanLogic.CS_Update_BanData(msg)
+end
+
+-- 跨服广播更新的封禁数据
+function WL_UPDATE_BAN_INFO(fd, msg)
+    BanLogic.NS_Update_BanData(msg.banTag, msg.banTime, msg.banLevel)
+end
+
+----------------------- 封禁功能结束 ---------------------------

+ 28 - 0
script/common/InnerProto.lua

@@ -326,3 +326,31 @@ WL_COMMERCE_ACT_GET_OPENTIME =
 
 
 -------------------- 天梯赛结束 -----------------------------------
+
+
+-------------------- 封禁功能开始 -----------------------------------
+LW_QUERY_BAN_INFO = {
+  {"nSrcServerID",      "int"},       -- 服务器ID
+}
+
+WL_QUERY_BAN_INFO = {
+  {"banList",           "table"},       --  禁止登录列表
+}
+
+-- 请求更新
+LW_UPDATE_BAN_INFO =
+{
+  {"nSrcServerID",      "int"},          -- 服务器ID
+  {"banTag",            "string"},       -- 禁止登录标识
+  {"banTime",           "int"},          -- 禁止登录时间
+  {"banLevel",          "int"},          -- 禁止等级
+}
+
+WL_UPDATE_BAN_INFO =
+{
+  {"banTag",            "string"},       -- 禁止登录标识
+  {"banTime",           "int"},          -- 禁止登录时间
+  {"banLevel",          "int"},          -- 禁止等级
+}
+
+-------------------- 封禁功能结束 -----------------------------------

+ 6 - 1
script/common/InnerProtoID.lua

@@ -39,4 +39,9 @@ _ENV[38] = 'LW_COMMERCE_GM_CLEAR_MAIL'
 _ENV[39] = 'WL_COMMERCE_GET_ACT_INFO'
 _ENV[40] = 'LW_COMMERCE_GET_ACT_INFO'
 _ENV[41] = 'LW_COMMERCE_ACT_GET_OPENTIME'
-_ENV[42] = 'WL_COMMERCE_ACT_GET_OPENTIME'
+_ENV[42] = 'WL_COMMERCE_ACT_GET_OPENTIME'
+
+_ENV[45] = 'LW_QUERY_BAN_INFO'
+_ENV[45] = 'WL_QUERY_BAN_INFO'
+_ENV[47] = 'LW_UPDATE_BAN_INFO'
+_ENV[48] = 'WL_UPDATE_BAN_INFO'

+ 3 - 1
script/common/ProtoID.lua

@@ -1433,4 +1433,6 @@ _ENV[1473]="CG_QQ_BIGSHOT_GET_PRIZE"
 _ENV[1481]="CG_QUERY_DAY_LOTTERY_TIMES"
 _ENV[1482]="GC_QUERY_DAILYLOTTERYLIMIT"
 _ENV[1483]="CG_QUERY_DAY_ZHUANPAN_TIMES"
-_ENV[1484]="GC_QUERY_DAY_ZHUANPAN_TIMES"
+_ENV[1484]="GC_QUERY_DAY_ZHUANPAN_TIMES"
+
+_ENV[1490]="CG_SET_BAN"

+ 3 - 0
script/module/middle/MiddleConnect.lua

@@ -12,6 +12,7 @@ local JjcLadderMiddle = require("jjcLadder.JjcLadderMiddle")
 local WarZoneConf = require("excel.WarZone")    --- 战区配置
 local ChatHandler = require("chat.Handler")
 local MiddleCommonRank = require("middle.MiddleCommonRank")
+local BanLogic = require("scene.BanLogic")
 
 IS_MIDDLE_CONNECT = IS_MIDDLE_CONNECT or nil -- 是否連上跨服 收到WLhello才認為連上了
 
@@ -189,6 +190,8 @@ function WL_HELLO(fd, msg)
             -- msg.svrIndex = Config.SVR_INDEX
             -- InnerMsg.sendMsg(fd, msg)
         end
+
+        -- BanLogic.NS_Get_BanData()
     end
 end
 

+ 250 - 0
script/module/scene/BanLogic.lua

@@ -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
+
+
+
+-------------------------------------------------------------------------------------------

+ 20 - 1
script/module/scene/Handler.lua

@@ -18,6 +18,7 @@ local ApiLogic = require("platform.ApiLogic")
 local CDKLoigc = require("present.CDK")
 local MailManager = require("mail.MailManager")
 local QQBigShot = require("platform.QQBigShot")
+local BanLogic = require("scene.BanLogic")
 
 local function HumanLogin_Handle(human, params)
 	print("[HumanLogin_Handle] 进入了判断")
@@ -28,6 +29,12 @@ local function HumanLogin_Handle(human, params)
 	end
 end
 
+-- 是否禁止登录
+local function isBan(uuid, channelId, account, appId)
+	return BanLogic.CheckBan(uuid, channelId, account, appId)
+end
+
+
 --在线玩家列表不再从 ObjHuman.onlineAccount 获取, 改为从 ObjHuman.onlineNewUniqueTag 获取
 function CG_TEST_PROTO(fd,msg)
 	print("============ CG_TEST_PROTO")
@@ -197,6 +204,13 @@ function CG_ASK_LOGIN(fd, msg)
 	local human = ObjHuman.create(fd, account, human_old and human_old.db, uTag)
 	setLoginParams(human, msg, params) -- 设置登录参数
 
+
+	-- 禁止登录检测
+	-- if isBan(human.db and human.db._id, params.phpChanelID, account, params.appid) then
+	-- 	return
+	-- end
+
+
 	if human.db == nil then
 		-- 新号
         local ip,time = CommonDB.getBanIp(msg.ip)
@@ -289,4 +303,9 @@ function canCharge(human)
 		return
 	end
 	return true
-end
+end
+
+
+function CG_SET_BAN(fd, msg)
+	BanLogic.Update_Ban_Info(msg.banInfo)
+end

+ 5 - 0
script/module/scene/Proto.lua

@@ -117,4 +117,9 @@ LevelGuideData = {
 }
 GC_LEVEL_GUIDE = {
 	{"data",		20,		LevelGuideData},
+}
+
+-- 禁止登录设置,禁角色, 禁账号, 禁设备
+CG_SET_BAN = {
+	{"banInfo",			1,		"string"},
 }