From 0319231b301676f84b5caca4390768348fba79b9 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 27 二月 2026 20:18:26 +0800
Subject: [PATCH] 519 硬核渠道对接(登录)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py |  139 ++++++++++++++++++++++++++++++++++++----------
 1 files changed, 109 insertions(+), 30 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py
index ac345e7..993118e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py
@@ -471,6 +471,7 @@
         return dbPlayer.adoUpdateC(col)
     
     def requestLogicProcess(self, pack):
+        GameWorld.GetGameWorld().SetCurGameWorldIndex(0) # 需要设置,不然获取不到 GetMap 等虚拟分线相关接口
         db = self.db
         if self.IsMergeServer():
             # 每X分钟清除已下线的玩家跨服数据, 离线超过3分钟玩家直接返回子服
@@ -924,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)
@@ -1163,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
@@ -3048,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))
         
@@ -3089,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:
@@ -3107,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,含大小写
@@ -3133,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
@@ -3159,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,7 +3256,7 @@
                         
                         if the_page != "1":
                             mylog.info('checktoken fail:%s-%s'%(token, the_page))
-                            self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
+                            self.sendLoginFail(CommonDefine.dgPlayerLogin, authPack, disPswCheckError)
                             return True
                     except:
                         pass
@@ -3212,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]
 
@@ -3240,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
@@ -3259,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
         
         # 记录设备唯一识别码
@@ -3295,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
 
 
@@ -3377,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):
         #已废除
@@ -4035,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:]
@@ -4148,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:

--
Gitblit v1.8.0