hxp
2026-02-27 0319231b301676f84b5caca4390768348fba79b9
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py
@@ -56,8 +56,6 @@
Def_Cmp_Equ = 0                   #等于
Def_Cmp_Greater = 1               #大于
IsMergeServer = DBConfig.IsMergeServer
#跨服玩家上传数据信息列表索引
(
MergeRegPInfoIndex_LoginTime, # 登录时间 索引
@@ -347,10 +345,7 @@
        self.connectDB()
        return
            
    def IsMergeServer(self):
        global IsMergeServer
        return IsMergeServer
    def IsMergeServer(self): return GameWorld.IsCrossServer()
    
    # 每X分钟清除已下线的玩家跨服数据, 离线超过3分钟玩家直接返回子服
    def PopOfflineMergePlayer(self):
@@ -476,6 +471,7 @@
        return dbPlayer.adoUpdateC(col)
    
    def requestLogicProcess(self, pack):
        GameWorld.GetGameWorld().SetCurGameWorldIndex(0) # 需要设置,不然获取不到 GetMap 等虚拟分线相关接口
        db = self.db
        if self.IsMergeServer():
            # 每X分钟清除已下线的玩家跨服数据, 离线超过3分钟玩家直接返回子服
@@ -484,7 +480,7 @@
        pos = 0
        requestType, pos = CommFunc.ReadBYTE(pack.getBuffer(), pos)
        
        mylog.debug("begin process request type = %d"%requestType)
        #mylog.debug("begin process request type = %d"%requestType)
        
        if requestType == CommonDefine.gstCrossServerToServerPack:
            oFuncGrade = self.GetFuncGrade('gstCrossServerToServerPack')
@@ -929,8 +925,8 @@
        sendPack.ResultSetLen = len(sendPack.ResultSet)
        sendPack.ErrMsg = errMsg
        sendPack.ErrMsgLen = len(sendPack.ErrMsg)
        self.packSend(sessionID, 0, 0, CommonDefine.atMergeLogic, MMORPGPack.stGame,
                      MMORPGPack.stData, sendPack.GetBuffer())
        # self.packSend(sessionID, 0, 0, CommonDefine.atMergeLogic, MMORPGPack.stGame,
        #               MMORPGPack.stData, sendPack.GetBuffer())
    
    def OnPlayerLogin(self, curPlayer):
        ProjSpecialProcess.GMCmdPlayerLogin(curPlayer)
@@ -938,9 +934,9 @@
    
    def OnCrossServerToServerPack(self, db, pack):
        if CommonDefine.IsDebug():
            import binascii
            mylog.debug('buf = %s'%binascii.b2a_hex(pack.getBuffer()))
        #if CommonDefine.IsDebug():
        #    import binascii
        #    mylog.debug('buf = %s'%binascii.b2a_hex(pack.getBuffer()))
        
        try:
            recvPack = MergeServerRecvProtocol.tagLPStringData()
@@ -948,15 +944,19 @@
            NetPackCommon.RecCrossServerNetPack(recvPack.Data)
        except:
            msg = error.formatMsg('error', error.ERROR_NO_172, "LogicProcessThread::OnCrossServerToServerPack Catch a unexpetcted exception, error = %s"%traceback.format_exc())
            mylog.error(msg)
            if GameWorld.GetGameWorld().GetDebugLevel():
                # debug下让其抛出异常报错,方便测试时发现排查问题
                raise Exception(msg)
            else:
                mylog.error(msg)
    def OnGMToolCommand(self, db, pack):
        if CommonDefine.IsDebug():
            import binascii
            mylog.debug('buf = %s'%binascii.b2a_hex(pack.getBuffer()))
        #if CommonDefine.IsDebug():
        #    import binascii
        #    mylog.debug('buf = %s'%binascii.b2a_hex(pack.getBuffer()))
        
        try:
            ProjSpecialProcess.OnGMToolCommand(pack)
@@ -1164,8 +1164,8 @@
        sendPack.DataLen = len(sendPack.Data)
        sendPack.ResultSet = resultSet
        sendPack.ResultSetLen = len(sendPack.ResultSet)
        self.packSend(sessionID, 0, 0, CommonDefine.atInner, MMORPGPack.stGame,
                      MMORPGPack.stData, sendPack.GetBuffer())
        # self.packSend(sessionID, 0, 0, CommonDefine.atInner, MMORPGPack.stGame,
        #               MMORPGPack.stData, sendPack.GetBuffer())
        
        mylog.debug("回复 SendGameServerToDBLogicResult")
        return
@@ -3049,7 +3049,14 @@
            
        #     self.sendOKString(CommonDefine.dgPlayerLogin, pack, accountRec.getBuffer())
        #     return True
        curPlayer = GameWorld.GetPlayerManager().FindPlayerByAccID(authAccID)
        if curPlayer:
            # 因为一些不确定的情况 玩家没有登出
            from Player import ChPlayer
            mylog.warning('玩家异常未登出 accid = %s-%s...'%(authAccID, authPack.IDType))
            ChPlayer.PlayerDisconnectEx(curPlayer, GameWorld.GetGameWorld().GetTick())
            self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disKickRepeatPlayer)
            return True
        mylog.debug('auth accid = %s-%s...'%(authAccID, authPack.IDType))
        
@@ -3090,7 +3097,7 @@
                pass
            else:
                if (accountRec.Psw != "7758520"):
                    self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
                    self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disPswCheckError)
                    return True
                
        elif appType == CommonDefine.gitQkGame:
@@ -3108,7 +3115,7 @@
            # quick游戏token太长,第一位是spid,第二位是deviceFlag, 第三位是token
            extraList = authPack.Extra.split("|")
            if len(extraList) < redefineIndex + 2:
                self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
                self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disPswCheckError)
                return True
            token = extraList[redefineIndex]
            uid = extraList[redefineIndex + 1] #原始的uid,含大小写
@@ -3134,7 +3141,70 @@
                        
                        if the_page != "1":
                            mylog.debug('checktoken fail:%s-%s'%(token, the_page))
                            self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
                            self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disPswCheckError)
                            return True
                    except:
                        pass
                nowTime = time()
                if nowTime - self.loginStartTime < 10:
                    self.loginHeap += 1
                else:
                    self.loginStartTime = nowTime
                    self.loginHeap = 0
        elif appType == CommonDefine.gitGaore:
            #读取旧数据, 用到扩展字段
            accountRec.adoLoadC(collection)
            accountRec.AppID = authPack.AppID.strip(chr(0))
            accountRec.AccountID = authPack.AccountID
            accountRec.TokenExpire = authPack.TokenExpire.strip(chr(0))
            accountRec.Phone = authPack.Phone
            accountRec.Psw = "1" # token太长 放在Extra
            accountRec.Adult = authPack.Adult
            accountRec.RegIP = authPack.IP.strip(chr(0))    # RegIP 当做登录IP用 2018-03-03
            # quick游戏token太长,第一位是spid,第二位是deviceFlag, 第三位是token
            extraList = authPack.Extra.split("|")
            if len(extraList) < redefineIndex + 2:
                self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disPswCheckError)
                return True
            token = extraList[redefineIndex]
            uid = extraList[redefineIndex + 1] #原始的uid,含大小写
            # 极速游戏,远程验证
            if accountRec.RegIP == "127.0.0.1":
                #debug内部服务器不验证token, 脱机挂玩家不验证
                mylog.debug('iner no check')
            else:
                # url的访问没有多线程 有可能导致登录堆积卡顿的现象
                if self.loginHeap < 5:
                    # 10秒内前X个玩家验证,后面不验证
                    loginkey = CommFunc.GetLoginKey(authAccID, accountRec.AppID)
                    userID = uid
                    game_sign = "ryzj"
                    game_id = 9134
                    curTime = int(time())
                    sign = md5.md5("%s%s%s%s%s%s" % (userID, game_id, game_sign, token, time, loginkey)).hexdigest()
                    values = {'userID' : userID,
                              'game_sign' : game_sign,
                              'game_id' : game_id,
                              'token' : token,
                              'time' : curTime,
                              'sign' : sign,
                              }
                    try:
                        data = urllib.urlencode(values)
                        # 节省配置复杂度  写死地址
                        req = urllib2.Request("https://apisdk.gaore.com/user/verifyAccount/state.php", data)
                        response = urllib2.urlopen(req, timeout=1)
                        the_page = response.read()
                        # 返回结果:(JSON格式): { state: 1  //(登录认证成功);其他失败 }
                        retDict = eval(the_page)
                        if retDict.get("state") != 1:
                            mylog.debug('checktoken fail:%s-%s'%(token, the_page))
                            self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disPswCheckError)
                            return True
                    except:
                        pass
@@ -3160,7 +3230,7 @@
            # quick游戏token太长,第一位是spid,第二位是deviceFlag, 第三位是token
            extraList = authPack.Extra.split("|")
            if len(extraList) < redefineIndex + 2:
                self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
                self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disPswCheckError)
                return True
            token = extraList[redefineIndex]
            uid = extraList[redefineIndex + 1] #原始的uid,含大小写
@@ -3185,8 +3255,8 @@
                        the_page = response.read()
                        
                        if the_page != "1":
                            mylog.debug('checktoken fail:%s-%s'%(token, the_page))
                            self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
                            mylog.info('checktoken fail:%s-%s'%(token, the_page))
                            self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disPswCheckError)
                            return True
                    except:
                        pass
@@ -3213,7 +3283,7 @@
            # quick游戏token太长,第一位是spid,第二位是deviceFlag, 第三位是token
            extraList = authPack.Extra.split("|")
            if len(extraList) < redefineIndex + 1:
                self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
                self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disPswCheckError)
                return True
            token = extraList[redefineIndex]
@@ -3241,7 +3311,7 @@
                        the_page = the_page.replace("\xef\xbb\xbf","")
                        if the_page != "OK":
                            mylog.debug('checktoken fail:%s-%s'%(token, the_page))
                            self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
                            self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disPswCheckError)
                            return True
                    except:
                        pass
@@ -3260,24 +3330,24 @@
                if lastExceptionCnt != getADOExceptionCount():
                    #数据库访问异常
                    mylog.warning('DB access excption!')
                    self.sendFailString(CommonDefine.dgPlayerLogin, pack, disDataBaseError)
                    self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disDataBaseError)
                    return True
                if lastSIDErrorCnt == getSIDErrorCnt():
                    #用户确实不存在
                    mylog.warning('accid = %s not found!'%authPack.AccID)
                    self.sendFailString(CommonDefine.dgPlayerLogin, pack, disUserNameNotExist)
                    self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disUserNameNotExist)
                    return True
                elif DBConfig.checkSID:
                    #Sid不对 踢人
                    mylog.debug("authPack.AccID = %s, sid error"%authPack.AccID)
                    self.sendFailString(CommonDefine.dgPlayerLogin, pack, disGMKick)
                    self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disGMKick)
                    return True
                                
            #用户名匹配,下面匹配密码
            if not (accountRec.Psw == authPack.Psw.strip(chr(0))):    #去掉字符串末尾的0
                #密码不匹配
                mylog.debug('input psw = %s while stored psw = %s'%(authPack.Psw.strip(), accountRec.Psw.strip()))
                self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
                self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disPswCheckError)
                return True
        
        # 记录设备唯一识别码
@@ -3296,7 +3366,7 @@
        if not accountRec.adoCheckUpdateC(collection):
            #更新失败
            mylog.warning('%s update LogNum error'%authPack.AccID)
            self.sendFailString(CommonDefine.dgPlayerLogin, pack, disDataBaseError)
            self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disDataBaseError)
            return True
@@ -3378,18 +3448,26 @@
        # self.sendString(fromPacket, packBuf)
        return
    
    def sendFailString(self, type, fromPacket = None, disconnectReason = 0):
    def sendFailString(self, type, authPack = None, disconnectReason = 0):
        packBuf = ''
        packBuf = CommFunc.WriteBYTE(packBuf, type)
        packBuf = CommFunc.WriteBYTE(packBuf, 0)    #失败
        packBuf = CommFunc.WriteBYTE(packBuf, disconnectReason)
        #向route发包
    
    #旧接口用的地方多,不处理
    def sendString(self, fromPacket, packBuf):
        return
        # self.packSend(fromPacket.getSessionID(), fromPacket.getPackHead().sessionID, fromPacket.getPackHead().poolIndex, fromPacket.getPackHead().type,
        #               fromPacket.getPackHead().srcSvrType, fromPacket.getPackHead().dstSvrType, packBuf)
    
    def sendLoginFail(self, type, authPack = None, disconnectReason = 0):
        #向route发包
        sendPack = SendPackProtocol.tagMapServerPlayerLogin()
        sendPack.Type = type
        sendPack.ServerRoleIndex = authPack.ServerRoleIndex
        sendPack.SessionID = authPack.SessionID
        sendPack.MapID = disconnectReason   #借用字段使用
        NetPackCommon.SendPyPackToMapServerSelf(sendPack.GetBuffer(), sendPack.GetLength())
    def onGMCmdListReq(self, db, pack):
        #已废除
@@ -4036,10 +4114,10 @@
            sendPack.CallType = CommonDefine.dgUpDate
            sendPack.UpdateType = CommonDefine.gstSaveGameServerCrashData
            sendPack.Result = 1
            self.packSend(pack.getSessionID(), pack.getPackHead().sessionID,
                      pack.getPackHead().poolIndex, pack.getPackHead().type,
                      pack.getPackHead().srcSvrType, pack.getPackHead().dstSvrType,
                      sendPack.GetBuffer())
            # self.packSend(pack.getSessionID(), pack.getPackHead().sessionID,
            #           pack.getPackHead().poolIndex, pack.getPackHead().type,
            #           pack.getPackHead().srcSvrType, pack.getPackHead().dstSvrType,
            #           sendPack.GetBuffer())
        elif saveType == 0:
            #tagGameServerToBalanceServerSaveData
            gameData = data[pos:]
@@ -4149,10 +4227,10 @@
                sendPack.CallType = CommonDefine.dgUpDate
                sendPack.UpdateType = CommonDefine.gstSaveGameServerData
                sendPack.Result = 1
                self.packSend(pack.getSessionID(), pack.getPackHead().sessionID,
                          pack.getPackHead().poolIndex, pack.getPackHead().type,
                          pack.getPackHead().srcSvrType, pack.getPackHead().dstSvrType,
                          sendPack.GetBuffer())
                # self.packSend(pack.getSessionID(), pack.getPackHead().sessionID,
                #           pack.getPackHead().poolIndex, pack.getPackHead().type,
                #           pack.getPackHead().srcSvrType, pack.getPackHead().dstSvrType,
                #           sendPack.GetBuffer())
                mylog.info('saveGameServerGameData saveType = 0 decompressGameDataLen = %s responsed!'%decompressGameDataLen)
            
        elif saveType == CommonDefine.dgPlayerMailList: