#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # import os import zlib from time import * import datetime from binascii import * import uuid import md5 import pymongo import PyGameData import DBCommon.CommonDefine as CommonDefine from MangoDBCommon import (getADOExceptionCount, getSIDErrorCnt, addADOExceptionCount, seq, fix_outgoingText, fix_incomingText) from ServerClientShareDefine import * import ConfigParser #import IPY_GameWorld #from Config import (DBConfig,) DBConfig = __import__('Config.DBConfig') from ctypes import string_at import traceback import inspect from Collections.CollectionDefine import * import binascii # from GMToolLogicProcess import ProjSpecialProcess from Common import (CommFunc, mylog, CommFuncEx) import PegasusCollectorProxy import shutil import urllib import urllib2 import json import cPickle import math import sys import hashlib from Collections import (DataServerGameData, DataServerPlayerData) import NetPackCommon from DBCommon import (GlobalFunctions, DBController, error, DataDumper) from Protocol import (MMORPGPack, RecvPackProtocol, SendPackProtocol, MergeServerRecvProtocol, MergeServerSendProtocol) import DataRecordPack import GameWorld import CtrlDB import base64 #------------------------------------------------------------------------------- ATTR_CALL_TIME = ['weekday', 'year', 'month', 'day', 'hour', 'minute'] Def_Cmp_Lower = -1 #СÓÚ Def_Cmp_Equ = 0 #µÈÓÚ Def_Cmp_Greater = 1 #´óÓÚ IsMergeServer = DBConfig.IsMergeServer #¿ç·þÍæ¼ÒÉÏ´«Êý¾ÝÐÅÏ¢ÁбíË÷Òý ( MergeRegPInfoIndex_LoginTime, # µÇ¼ʱ¼ä Ë÷Òý MergeRegPInfoIndex_LogoutTime, # µÇ³öʱ¼ä Ë÷Òý MergeRegPInfoIndex_PackData, # Íæ¼ÒÊý¾Ý Ë÷Òý MergeRegPInfoIndex_GroupID, # ¿ç·þÍæ¼ÒËùÔÚ·Ö×éID Ë÷Òý ) = range(4) #def fixMergedPlayerName(playerName): # '''È¥³ýÃû×ÖÖеĺϷþÐÅÏ¢,¼´È¥µôÃû×ÖÖÐ'['ºóÃæµÄ²¿·Ö''' # pos = playerName.find('[') # if pos == -1: # return playerName # return playerName[:pos] def CheckGameVersion(): ## Æô¶¯ÑéÖ¤ÓÎÏ·ÄÚÈݰ汾£¬½öÆô¶¯ÑéÖ¤Ò»´Î import socket host = DBConfig.IDDispatchServerIP port = DBConfig.IDDispatchServerPort addr = (host, port) BUF_SIZE = 1024 curVersion = "" centerVersion = "" try: cfGameVer = ConfigParser.ConfigParser() cfGameVer.read(os.path.join(GlobalFunctions.getAppPath(), 'GameVersion.ini')) gameID = cfGameVer.get("config", "GameID") curVersion = cfGameVer.get("config", "Version") groupID = DBConfig.GroupID client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(addr) data = "GameVersion:%s|%s|%s" % (gameID, groupID, curVersion) #mylog.info("IDDispatch CheckGameVersion send:%s"%data) client.send(data) dataRecv = client.recv(BUF_SIZE) mylog.info("IDDispatch CheckGameVersion recv:%s"%dataRecv) resultDict = eval(dataRecv) centerVersion = "" if resultDict and resultDict['result']: centerVersion = resultDict['version'] if curVersion != centerVersion: PegasusCollectorProxy.ErrorReport("CheckGameVersion,gameID=%s,groupID=%s,curVersion=%s is not equal to centerVersion=%s" % (gameID, groupID, curVersion, centerVersion)) else: mylog.info("IDDispatch CheckGameVersion OK!") client.close() except Exception, e: mylog.error("IDDispatch CheckGameVersion Connect Exception %s"%e) except: mylog.error("IDDispatch CheckGameVersion Connect unknown Exception") return curVersion, centerVersion import thread lockPlayerID = thread.allocate_lock() lockFamilyID = thread.allocate_lock() def CallDispatchPlayerID(db,self): global lockPlayerID lockPlayerID.acquire()#¼ÓËø self.isDispatchingPlayerID = True mylog.info("IDDispatch CallDispatchPlayerID") import socket import time host = DBConfig.IDDispatchServerIP port = DBConfig.IDDispatchServerPort addr = (host, port) BUF_SIZE = 1024 try: client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(addr) data = "PID" client.send(data) dataRecv = client.recv(BUF_SIZE) mylog.info("IDDispatch recv:%s"%dataRecv) resultDict = eval(dataRecv) if resultDict: if resultDict['result']: minID = resultDict['minID'] maxID = resultDict['maxID'] recs = [] for id in xrange(minID, maxID+1): recs.append({'PlayerID':id}) collection = db[UCN_Dispatch_PlayerID] collection.insert(recs) client.close() except Exception, e: mylog.error("IDDispatch CallDispatchPlayerID Connect Exception %s"%e) except: mylog.error("IDDispatch CallDispatchPlayerID Connect unknown Exception") self.isDispatchingPlayerID = False lockPlayerID.release()#½âËø return def CallDispatchFamilyID(db, fromPack, type, self): global lockFamilyID lockFamilyID.acquire()#¼ÓËø self.isDispatchingFamilyID = True mylog.info("IDDispatch CallDispatchFamilyID") import socket import time host = DBConfig.IDDispatchServerIP port = DBConfig.IDDispatchServerPort addr = (host, port) BUF_SIZE = 1024 try: client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(addr) data = "FID" client.send(data) dataRecv = client.recv(BUF_SIZE) mylog.info("IDDispatch recv:%s"%dataRecv) resultDict = eval(dataRecv) if resultDict: if resultDict['result']: minID = resultDict['minID'] maxID = resultDict['maxID'] recs = [] for id in xrange(minID, maxID+1): recs.append({'FamilyID':id}) collection = db[UCN_Dispatch_FamilyID] collection.insert(recs) #зÖÅ䣬֪ͨGameServer self.CallBackToSendFamilyIDPack(fromPack, type, minID, maxID) client.close() except Exception, e: mylog.error("IDDispatch CallDispatchFamilyID Connect Exception %s"%e) except: mylog.error("IDDispatch CallDispatchFamilyID Connect unknown Exception") self.isDispatchingFamilyID = False lockFamilyID.release()#½âËø return ## µ±Ç°Ê±¼äÓëÖ¸¶¨Ê±¼ä±È½Ï # @param curTime µ±Ç°·þÎñÆ÷ʱ¼ä # @param timeInfo Ö¸¶¨Ê±¼ä [[3,4(ÐÇÆÚ¼¸)], Ä꣬Ô£¬ÈÕ£¬Ê±£¬·Ö] # @return ´óÓÚ·µ»Ø1£¬Ð¡ÓÚ·µ»Ø-1£¬Ïàͬ·µ»Ø0 # @remarks º¯ÊýÏêϸ˵Ã÷.Òì³£ºÍ²»³É±È½ÏÌõ¼þ(ÐÇÆÚ¼¸²»¶Ô)·µ»ØNone def CompareActTime(curTime, timeInfo): for index, callObj in enumerate(ATTR_CALL_TIME): #È¥³ý²»±È½ÏµÄÔªËØ if timeInfo[index] == '-': continue if hasattr(curTime, callObj) != True: return curCallObj = getattr(curTime, callObj) #ÓÅÏÈÐÇÆÚ¼¸ÌØÊâÑéÖ¤ if type(curCallObj) != int: wday = curCallObj() + 1 if wday not in timeInfo[index]: return continue if curCallObj == timeInfo[index]: continue #µ±Ç°Ê±¼ä´óÓÚÖ¸¶¨Ê±¼ä if curCallObj > timeInfo[index]: return Def_Cmp_Greater #СÓÚ return Def_Cmp_Lower #µÈÓÚ return Def_Cmp_Equ class UserCtrlDB(CtrlDB.CtrlDB): def __init__(self): CtrlDB.CtrlDB.__init__(self, 'UserCtrlDB') # self.priorityQueueList[1][0] = (CommonDefine.gstUpdate, # CommonDefine.gstSaveMapServerCrashData # ) # self.priorityQueueList[2][0] = (CommonDefine.gstSaveGameServerData, # CommonDefine.gstSavePlayerGMOPer) # self.priorityQueueList[0][0] = ( # CommonDefine.gstGetGameData, # CommonDefine.gstGetGameServerSysData, # CommonDefine.gstQuerySysDBVersion, # CommonDefine.gstGetServerLanguageVersion, # CommonDefine.gstServerVersion, # CommonDefine.gstGetServerVersions, # CommonDefine.gstUpdateSysDB, # CommonDefine.gstReloadGameData, # CommonDefine.gstGMToolCmdSysDBRequest, #GM¹¤¾ß´¦ÀíÇëÇó # CommonDefine.gstPlayerLogin, # CommonDefine.gstPlayerDetail, # CommonDefine.gstCreatePlayer, # CommonDefine.gstCheckPlayerExist, # CommonDefine.gstQueryCanSendMail, # CommonDefine.gstGetPlayerMail, # CommonDefine.gstGetMailDetail, # CommonDefine.gstUpdateMail, # CommonDefine.gstDeleteMail, # CommonDefine.gstOnDay, # CommonDefine.gstFamilyVS, # CommonDefine.gstGetPlayerMailState, # CommonDefine.gstGetCoin, # CommonDefine.gstCoinChange, # CommonDefine.gstPlayerBillboardLV, # CommonDefine.gstAccIDSendPrize, # CommonDefine.gstInsertAcc, # CommonDefine.gstGMCommandListReq, # CommonDefine.gstAddAccItem, # CommonDefine.gstCheckItemPrize, # CommonDefine.gstCheckLoadAcc, # CommonDefine.gstUpdatePswLV2, # CommonDefine.gstGetExpiationCount, # CommonDefine.gstGetExpiation, # CommonDefine.gstAddExpiation, # CommonDefine.gstAddPlayerMailByAccID, # CommonDefine.gstServerMergeDeleteRole, # CommonDefine.gstServerMergeChangeName, # CommonDefine.gstServerMergeUpdatePlayer, # CommonDefine.gstQueryIsFamilyLeader, # CommonDefine.gstServerMergeUpdateAccState, # CommonDefine.gstMapServerInfo, # # CommonDefine.gstServerVersion, # CommonDefine.gstCreatePet, # CommonDefine.gstSaveRunGataInfo, # CommonDefine.gstPlayerIDMarkDeleted, # CommonDefine.gstGetMapServerPlayerData, # CommonDefine.gstGetGameServerPlayerData, # CommonDefine.gstSaveGameServerPlayerSaveData, # CommonDefine.gstSaveGameServerCrashData, # CommonDefine.gstGetBillboardInfo, # CommonDefine.gstGetGameServerPlayerLoginData, # CommonDefine.gstUpdateServerDataVersionNO, # # CommonDefine.gstGetServerLanguageVersion, # # CommonDefine.gstGetServerVersions, # CommonDefine.gstUpdateTelLockState, # CommonDefine.gstGetPetExpiation, # CommonDefine.gstGetPetExpiationCount, # CommonDefine.gstAddPetExpiation, # CommonDefine.gstUpdateTotalSavePoint, # CommonDefine.gstSavePlayerInfo, # CommonDefine.gstUpdateAccAdult, # CommonDefine.gstCreateRoleServerRequestCreateRole, # CommonDefine.gstCreateRoleServerCheckPlayerExist, # CommonDefine.gstCreateRoleServerCheckIsHaveRole, # CommonDefine.gstQueryNewGuyCardState, # CommonDefine.gstUpdateNewGuyCardState, # # CommonDefine.gstGMToolCommand, #GM¹¤¾ß½Ó¿ÚÃüÁî # # CommonDefine.gstGMToolCommandResult, # CommonDefine.gstGMToolCmdUserDBRequest, #GM¹¤¾ß´¦ÀíÇëÇó # CommonDefine.gstMergeRegisterPlayer, #±¨Ãû¿ç·þÕ½ # CommonDefine.gstMergeQueryRegisterResult, #²éѯ±¨Ãû½á¹û # CommonDefine.gstGeneralDBOper, #ͨÓÃÊý¾Ý¿â²Ù×÷°ü # CommonDefine.gstDiapatchFamilyID, #·ÖÅä¼Ò×åID # CommonDefine.gstMergerChildToCenter, #¿ç·þ×Ó·þ·¢ËÍ×Ô¶¨ÒåÏûÏ¢ # CommonDefine.gstPrepareCreateRole, # CommonDefine.gstQueryRecharge, # ²éѯÊÇ·ñÓÐеijäÖµ¶©µ¥ # CommonDefine.gstFinishRecharge, # CommonDefine.gstMergePlayerData, # ) # self.__processRequestType = self.__userDBGameServerSaveRequestType + self.__userDBNormalRequestType # + self.__userDBSaveRequestType self.Connected = False #ÊÇ·ñÒÑÁ¬½ÓÊý¾Ý¿â, ¿ÉÓÃÓÚºóÐøÅжÏ×Ô¶¯ÖØÁ¬ self.db = None if DBConfig.base64: self.translator = DBController.Base64StringManipulator() else: self.translator = DBController.EncodeStringManipulator(DBConfig.encoding) #ÊÇ·ñÕýÔÚÇëÇó·ÖÅäÐÂPlayerID³Ø self.isDispatchingPlayerID = False #ÊÇ·ñÕýÔÚÇëÇó·ÖÅäÐÂPlayerID³Ø self.isDispatchingFamilyID = False self.loginHeap = 0 self.loginStartTime = time() self.lastCleanMergePlayerTime = time() self.connectDB() return def IsMergeServer(self): global IsMergeServer return IsMergeServer # ÿX·ÖÖÓÇå³ýÒÑÏÂÏßµÄÍæ¼Ò¿ç·þÊý¾Ý, ÀëÏß³¬¹ý3·ÖÖÓÍæ¼ÒÖ±½Ó·µ»Ø×Ó·þ def PopOfflineMergePlayer(self): g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict if not g_mergeRegisterPlayerDict: return curTime = time() Def_CleanTime = 500 if curTime - self.lastCleanMergePlayerTime < Def_CleanTime: return self.lastCleanMergePlayerTime = curTime for accID, packInfo in g_mergeRegisterPlayerDict.items(): if packInfo[MergeRegPInfoIndex_LogoutTime] < packInfo[MergeRegPInfoIndex_LoginTime]: # δÀëÏß continue if curTime - packInfo[MergeRegPInfoIndex_LogoutTime] < Def_CleanTime: # 䳬¹ýʱ¼ä continue g_mergeRegisterPlayerDict.pop(accID) mylog.debug("PopOfflineMergePlayer hascnt = %s"%len(g_mergeRegisterPlayerDict)) return def connectDB(self): if not self.Connected: mylog.info('!!!!!!!!!!!connect %s:%s'%(DBConfig.USER_DB_IP, DBConfig.USER_DB_PORT)) self.connection = pymongo.Connection(DBConfig.USER_DB_IP, DBConfig.USER_DB_PORT, auto_start_request=False) if not GlobalFunctions.LoginMongoDB(DBConfig.userdb_user, DBConfig.userdb_pwd, connection = self.connection): return self.db = self.connection[DBConfig.USER_DB_NAME] self.Connected = True mylog.info('!!!!!!!!!!!connect %s:%s ok!'%(DBConfig.USER_DB_IP, DBConfig.USER_DB_PORT)) mylog.info('login on user db ok!') self.onConnectedOK() return def disconnect(self): self.Connected = False def onConnectedOK(self): if not PyGameData.g_UserCtrlDBFirstInit: PyGameData.g_UserCtrlDBFirstInit = True self.__PlayerBackupSave() CheckGameVersion() #ºóÐøÒ²ÒªÔö¼Ó¹«¹²Êý¾Ý±£´æÈç¼Ò×åµÈ£¬¿¼ÂDZ£´æÊ§°Ü¿ÉÒÔÖ±½Ó¹Ø±ÕµØÍ¼ return def requestLogicProcess(self, pack): db = self.db if self.IsMergeServer(): # ÿX·ÖÖÓÇå³ýÒÑÏÂÏßµÄÍæ¼Ò¿ç·þÊý¾Ý, ÀëÏß³¬¹ý3·ÖÖÓÍæ¼ÒÖ±½Ó·µ»Ø×Ó·þ self.PopOfflineMergePlayer() pos = 0 requestType, pos = CommFunc.ReadBYTE(pack.getBuffer(), pos) mylog.debug("begin process request type = %d"%requestType) if requestType == CommonDefine.gstDiapatchFamilyID: oFuncGrade = self.GetFuncGrade('gstDiapatchFamilyID') oFuncGrade.Start() self.OnDiapatchFamilyID(db, pack) oFuncGrade.End() if requestType == CommonDefine.gstGeneralDBOper: oFuncGrade = self.GetFuncGrade('gstGeneralDBOper') oFuncGrade.Start() self.OnGeneralDBOper(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstDBLogic: oFuncGrade = self.GetFuncGrade('gstDBLogic') oFuncGrade.Start() self.OnGameServerToDBLogic(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstMergeQueryRegisterResult: oFuncGrade = self.GetFuncGrade('gstMergeQueryRegisterResult') oFuncGrade.Start() self.OnMergeQueryRegisterResult(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstMergeRegisterPlayer: oFuncGrade = self.GetFuncGrade('gstMergeRegisterPlayer') oFuncGrade.Start() self.OnMergeRegisterPlayerByCache(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstMergePlayerData: oFuncGrade = self.GetFuncGrade('gstMergePlayerData') oFuncGrade.Start() self.OnMergeChildToCenterPlayerData(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstQueryNewGuyCardState: oFuncGrade = self.GetFuncGrade("gstQueryNewGuyCardState") oFuncGrade.Start() self.OnQueryNewGuyCardState(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstQueryRecharge: oFuncGrade = self.GetFuncGrade("gstQueryRecharge") oFuncGrade.Start() self.OnQueryRecharge(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstFinishRecharge: oFuncGrade = self.GetFuncGrade("gstFinishRecharge") oFuncGrade.Start() self.OnFinishRecharge(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstUpdateNewGuyCardState: oFuncGrade = self.GetFuncGrade("gstUpdateNewGuyCardState") oFuncGrade.Start() self.onCheckUpdateNewGuyCardState(db, pack) oFuncGrade.End() return True #GameServer±£´æÊý¾Ý if requestType == CommonDefine.gstSaveGameServerData: oFuncGrade = self.GetFuncGrade("gstSaveGameServerData") oFuncGrade.Start() self.onSaveGameServerData(db, pack) oFuncGrade.End() return True #GameServer¶ÁÈ¡Íæ¼ÒÊý¾Ý if requestType == CommonDefine.gstGetGameServerPlayerData: oFuncGrade = self.GetFuncGrade("gstGetGameServerPlayerData") oFuncGrade.Start() self.onGetGameServerPlayerData(db, pack) oFuncGrade.End() return True #GameServer¶ÁÈ¡GMÃüÁîÁбí if requestType == CommonDefine.gstGMCommandListReq: oFuncGrade = self.GetFuncGrade("gstGMCommandListReq") oFuncGrade.Start() self.onGMCmdListReq(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstPlayerLogin: oFuncGrade = self.GetFuncGrade("gstPlayerLogin") oFuncGrade.Start() self.onAuthentication(db, pack) oFuncGrade.End() return True # if requestType == CommonDefine.gstPlayerDetail: # oFuncGrade = self.GetFuncGrade("gstPlayerDetail") # oFuncGrade.Start() # if self.IsMergeServer(): # self.onGetMergePlayerDetail(db, pack) # else: # self.onGetPlayerDetail(db, pack) # oFuncGrade.End() # return True # if requestType == CommonDefine.gstCreatePlayer: # oFuncGrade = self.GetFuncGrade("gstCreatePlayer") # oFuncGrade.Start() # self.onCreatePlayer(db, pack) # oFuncGrade.End() # return True # if requestType == CommonDefine.gstCreateRoleServerCheckIsHaveRole: # oFuncGrade = self.GetFuncGrade("gstCreateRoleServerCheckIsHaveRole") # oFuncGrade.Start() # self.onCreateRoleServerCheckIsHaveRole(db, pack) # oFuncGrade.End() # return True # if requestType == CommonDefine.gstCreateRoleServerCheckPlayerExist: # oFuncGrade = self.GetFuncGrade("gstCreateRoleServerCheckPlayerExist") # oFuncGrade.Start() # self.onCreateRoleServerCheckPlayerExist(db, pack) # oFuncGrade.End() # return True # if requestType == CommonDefine.gstCreateRoleServerRequestCreateRole: # oFuncGrade = self.GetFuncGrade("gstCreateRoleServerRequestCreateRole") # oFuncGrade.Start() # self.onCreateRoleServerRequestCreateRole(db, pack) # oFuncGrade.End() # return True if requestType == CommonDefine.gstGetGameServerPlayerLoginData: #=================================================================== # oFuncGrade = self.GetFuncGrade("gstGetGameServerPlayerLoginData") # oFuncGrade.Start() # self.onGetGameServerPlayerLoginData(db, pack) # oFuncGrade.End() #=================================================================== return True if requestType == CommonDefine.gstSaveGameServerPlayerSaveData: oFuncGrade = self.GetFuncGrade("gstSaveGameServerPlayerSaveData") oFuncGrade.Start() self.onSaveGameServerPlayerSaveData(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstUpdate: if DBConfig.IsOpenDbSaveServer: msg = error.formatMsg('DeployError', error.ERROR_NO_56, "DbSaveServer is open, type = %d request should be send to PyMongoDBSaveServer"%CommonDefine.gstUpdate) mylog.DeployError(msg, True) return False oFuncGrade = self.GetFuncGrade("gstUpdate") oFuncGrade.Start() if self.IsMergeServer(): if not self.onSaveMapServerPlayerDataMergeServer(db, pack): mylog.error("onSaveMapServerPlayerDataMergeServer failed!sessionID = 0x%X", pack.getPackHead().sessionID) else: if not self.onSaveMapServerPlayerData(db, pack): mylog.error("onSaveMapServerPlayerData failed!sessionID = 0x%X", pack.getPackHead().sessionID) oFuncGrade.End() return True if requestType == CommonDefine.gstSavePlayerInfo: oFuncGrade = self.GetFuncGrade("gstSavePlayerInfo") oFuncGrade.Start() self.OnSavePlayerInfo(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstInsertAcc: oFuncGrade = self.GetFuncGrade("gstInsertAcc") oFuncGrade.Start() self.OnInsertAcc(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstPlayerIDMarkDeleted: oFuncGrade = self.GetFuncGrade("gstPlayerIDMarkDeleted") oFuncGrade.Start() self.OnPlayerIDMarkDeleted(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstGetCoin: oFuncGrade = self.GetFuncGrade("gstGetCoin") oFuncGrade.Start() self.OnGetCoin(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstCoinChange: oFuncGrade = self.GetFuncGrade("gstCoinChange") oFuncGrade.Start() self.OnCoinChange(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstCheckPlayerExist: oFuncGrade = self.GetFuncGrade("gstCheckPlayerExist") oFuncGrade.Start() self.OnCheckPlayerExist(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstOnDay: oFuncGrade = self.GetFuncGrade("gstOnDay") oFuncGrade.Start() self.OnDay(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstSavePlayerGMOPer: oFuncGrade = self.GetFuncGrade("gstSavePlayerGMOPer") oFuncGrade.Start() self.OnSavePlayerGMOPer(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstGetExpiationCount: oFuncGrade = self.GetFuncGrade("gstGetExpiationCount") oFuncGrade.Start() self.OnGetExpiationCount(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstGetPetExpiationCount: oFuncGrade = self.GetFuncGrade("gstGetPetExpiationCount") oFuncGrade.Start() self.OnGetPetExpiationCount(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstGetExpiation: oFuncGrade = self.GetFuncGrade("gstGetExpiation") oFuncGrade.Start() self.OnGetExpiation(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstGetPetExpiation: oFuncGrade = self.GetFuncGrade("gstGetPetExpiation") oFuncGrade.Start() self.OnGetPetExpiation(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstUpdateServerDataVersionNO: oFuncGrade = self.GetFuncGrade("gstUpdateServerDataVersionNO") oFuncGrade.Start() self.OnUpdateServerDataVersionNO(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstMapServerInfo: oFuncGrade = self.GetFuncGrade("gstMapServerInfo") oFuncGrade.Start() self.OnMapServerInfo(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstUpdateTotalSavePoint: oFuncGrade = self.GetFuncGrade("gstUpdateTotalSavePoint") oFuncGrade.Start() self.OnUpdateTotalSavePoint(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstGetPlayerMailState: oFuncGrade = self.GetFuncGrade("gstGetPlayerMailState") oFuncGrade.Start() self.OnGetPlayerMailState(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstGetMailDetail: oFuncGrade = self.GetFuncGrade("gstGetMailDetail") oFuncGrade.Start() self.OnGetMailDetail(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstGetPlayerMail: oFuncGrade = self.GetFuncGrade("gstGetPlayerMail") oFuncGrade.Start() self.OnGetPlayerMail(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstAddPlayerMailByAccID: oFuncGrade = self.GetFuncGrade("gstAddPlayerMailByAccID") oFuncGrade.Start() self.OnAddPlayerMailByAccID(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstDeleteMail: oFuncGrade = self.GetFuncGrade("gstDeleteMail") oFuncGrade.Start() self.OnDeleteMail(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstUpdateMail: oFuncGrade = self.GetFuncGrade("gstUpdateMail") oFuncGrade.Start() self.OnUpdateMail(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstQueryCanSendMail: oFuncGrade = self.GetFuncGrade("gstQueryCanSendMail") oFuncGrade.Start() self.OnQueryCanSendMail(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstAccIDSendPrize: oFuncGrade = self.GetFuncGrade("gstAccIDSendPrize") oFuncGrade.Start() self.OnAccIDSendPrize(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstCheckItemPrize: oFuncGrade = self.GetFuncGrade("gstCheckItemPrize") oFuncGrade.Start() self.OnCheckItemPrize(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstCheckLoadAcc: oFuncGrade = self.GetFuncGrade("gstCheckLoadAcc") oFuncGrade.Start() self.OnCheckLoadAcc(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstAddAccItem: oFuncGrade = self.GetFuncGrade("gstAddAccItem") oFuncGrade.Start() self.OnAddAccItem(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstUpdateTelLockState: oFuncGrade = self.GetFuncGrade("gstUpdateTelLockState") oFuncGrade.Start() self.OnUpdateTelLockState(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstUpdateAccAdult: oFuncGrade = self.GetFuncGrade("gstUpdateAccAdult") oFuncGrade.Start() self.OnUpdateAccAdult(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstAddExpiation: oFuncGrade = self.GetFuncGrade("gstAddExpiation") oFuncGrade.Start() self.OnAddExpiation(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstAddPetExpiation: oFuncGrade = self.GetFuncGrade("gstAddPetExpiation") oFuncGrade.Start() self.OnAddPetExpiation(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstServerMergeDeleteRole: oFuncGrade = self.GetFuncGrade("gstServerMergeDeleteRole") oFuncGrade.Start() self.OnServerMergeDeleteRole(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstServerMergeUpdateAccState: oFuncGrade = self.GetFuncGrade("gstServerMergeUpdateAccState") oFuncGrade.Start() self.OnServerMergeUpdateAccState(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstServerMergeChangeName: oFuncGrade = self.GetFuncGrade("gstServerMergeChangeName") oFuncGrade.Start() self.OnServerMergeChangeName(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstInsertImpeach: oFuncGrade = self.GetFuncGrade("gstInsertImpeach") oFuncGrade.Start() self.OnInsertImpeach(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstGMToolCmdUserDBRequest: oFuncGrade = self.GetFuncGrade("gstGMToolCmdUserDBRequest") oFuncGrade.Start() self.OnGMToolCmdUserDBRequest(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstMergerChildToCenter: oFuncGrade = self.GetFuncGrade("gstMergerChildToCenter") oFuncGrade.Start() self.OnMergerChildToCenter(db, pack) oFuncGrade.End() return True if requestType == CommonDefine.gstPrepareCreateRole: oFuncGrade = self.GetFuncGrade("gstPrepareCreateRole") oFuncGrade.Start() self.OnPrepareCreateRole(db, pack) oFuncGrade.End() return True mylog.warning('%s not processed!'%pack.outputString()) return True #·¢ËÍ֪ͨGameServer¿ÉÓõļÒ×åIDÁбí#tagDGCanUseFamilyIDList·â°ü def CallBackToSendFamilyIDPack(self, fromPack, UpdateType, minID, maxID): sendPack = SendPackProtocol.tagDGCanUseFamilyIDList() sendPack.Type = CommonDefine.dgDiapatchFamilyID sendPack.UpdateType = UpdateType for id in range(minID, maxID + 1): sendPack.FamilyIDList.append(id) sendPack.Count = len(sendPack.FamilyIDList) self.sendString(fromPack, sendPack.GetBuffer()) return def OnDiapatchFamilyID(self,db, pack): buf = pack.getBuffer() recvPack = RecvPackProtocol.tagGDRequestCanUseFamilyIDList() pos = 0 recvPack.ReadData(buf, pos) mylog.debug('OnDiapatchFamilyID pack = %s'%(recvPack.OutputString())) if recvPack.CallType == 0: #³õʼ»¯ÇëÇó»ñÈ¡ÒÑ·ÖÅäµÄ¼Ò×åIDÁбí collection = db[UCN_Dispatch_FamilyID] result = collection.find() mylog.debug('OnDiapatchFamilyID db[UCN_Dispatch_FamilyID] result = %s'%result) if not result or result.count() == 0: #δ·ÖÅä¹ý ÐèÒªÁ¢¼´·ÖÅä if self.isDispatchingFamilyID: return import threading t = threading.Thread(target = CallDispatchFamilyID, args =(db, pack, recvPack.CallType, self)) t.start() mylog.debug('CallType 0 need dispatch') else: sendPack = SendPackProtocol.tagDGCanUseFamilyIDList() sendPack.Type = CommonDefine.dgDiapatchFamilyID sendPack.UpdateType = recvPack.CallType for rec in result: sendPack.FamilyIDList.append(rec['FamilyID']) sendPack.Count = len(sendPack.FamilyIDList) self.sendString(pack, sendPack.GetBuffer()) mylog.debug('CallType 0 sendPack.FamilyIDList %s'%sendPack.OutputString()) else: #ÇëÇóÌí¼ÓеļÒ×åID if self.isDispatchingFamilyID: return import threading t = threading.Thread(target = CallDispatchFamilyID, args =(db, pack, recvPack.CallType, self)) t.start() mylog.debug('CallType 1 need dispatch') return def sendGameServerDBOperResult(self, sessionID, result, resultSet, errMsg): sendPack = SendPackProtocol.tagDGGeneralDBOperResult() sendPack.Type = CommonDefine.dgDBOperResult sendPack.Result = result sendPack.ResultSet = resultSet 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()) def OnGeneralDBOper(self, db, pack): buf = pack.getBuffer() recvPack = RecvPackProtocol.tagGDGameServerGeneralDBOper() pos = 0 recvPack.ReadData(buf, pos) mylog.debug('pack = %s'%(recvPack.OutputString())) operDict = None try: operDict = cPickle.loads(recvPack.OperDict) except Exception, e: mylog.warning('cPickle.loads(\'%s\') failed!'%(recvPack.OperDict)) if recvPack.NeedReturn: self.sendGameServerDBOperResult(pack.getSessionID(), 0, '', 'OperDict parse failed!') return if not isinstance(operDict, dict): if recvPack.NeedReturn: mylog.warning('%s is not a dict!'%(recvPack.OperDict)) self.sendGameServerDBOperResult(pack.getSessionID(), 0, '', 'OperDict parse failed!') return colName = operDict.get('collection') if not colName: mylog.warning('collection not specified!') if recvPack.NeedReturn: self.sendGameServerDBOperResult(pack.getSessionID(), 0, '', 'collection not specified!') return if not isinstance(colName, basestring): mylog.warning('collection name:%s not valid!'%(colName)) if recvPack.NeedReturn: self.sendGameServerDBOperResult(pack.getSessionID(), 0, '', 'collection name not valid!') return col = db[colName] oper = operDict.get('oper') if not oper: mylog.warning('oper not specified!') if recvPack.NeedReturn: self.sendGameServerDBOperResult(pack.getSessionID(), 0, '', 'oper not specified!') return if not isinstance(oper, basestring): mylog.warning('oper:%s not valid!'%(oper)) if recvPack.NeedReturn: self.sendGameServerDBOperResult(pack.getSessionID(), 0, '', 'oper not valid!') return oper = oper.lower() if oper == 'drop': result = 1 errorMsg = '' try: col.drop() except Exception, e: mylog.warning('drop %s failed!error = %s'%(colName, e)) result = 0 errorMsg = str(e) except: mylog.warning('drop %s failed!unknown error!'%(colName)) result = 0 errorMsg = 'unknown exception!' if recvPack.NeedReturn: self.sendGameServerDBOperResult(pack.getSessionID(), result, '', errorMsg) return if oper == 'insert': doc_or_docs = operDict.get('docs') errorMsg = '' result = 1 try: col.insert(doc_or_docs, False, True) except Exception, e: mylog.warning('insert %s into %s failed!error = %s'%(doc_or_docs, colName, e)) result = 0 errorMsg = str(e) except: mylog.warning('insert %s into %s failed!unknown exception!'%(doc_or_docs, colName)) result = 0 errorMsg = 'unknown exception!' if recvPack.NeedReturn: self.sendGameServerDBOperResult(pack.getSessionID(), result, '', errorMsg) return if oper == 'update': doc = operDict.get('docs') spec = operDict.get('spec') result = 1 errorMsg = '' try: col.update(spec, doc, False, False, True, True) except Exception, e: mylog.warning('update %s failed!spec = %s, doc = %s, error = %s'%(colName, spec, doc, e)) result = 0 errorMsg = str(e) except: mylog.warning('update %s failed!spec = %s, doc = %s,unknown exception occur!'%(colName, spec, doc)) result = 0 errorMsg = 'unknown exception!' if recvPack.NeedReturn: self.sendGameServerDBOperResult(pack.getSessionID(), result, '', errorMsg) return if oper == 'remove': spec_or_id = operDict.get('spec') result = 1 errorMsg = '' try: col.remove(spec_or_id, True) except Exception, e: mylog.warning('remove from %s failed!spec = %s, error = %s'%(colName, spec_or_id, e)) result = 0 errorMsg = str(e) except: mylog.warning('remove from %s failed!spec = %s, unknown exception!'%(colName, spec_or_id)) result = 0 errorMsg = 'unknown exception!' if recvPack.NeedReturn: self.sendGameServerDBOperResult(pack.getSessionID(), result, '', errorMsg) return if oper == 'find': spec = operDict.get('spec') fields = operDict.get('fields', {})#Ö¸¶¨µÄ·µ»ØÖµ result = 1 errorMsg = '' resultSet = None try: if fields == {}: resultSet = col.find(spec) else: resultSet = col.find(spec, fields) except Exception, e: mylog.warning('%s.find(%s) failed!'%(colName, spec)) result = 0 errorMsg = str(e) except: mylog.warning('%s.find(%s) failed!'%(colName, spec)) result = 0 errorMsg = 'unknown exception!' if recvPack.NeedReturn: if resultSet: resultSet = str(list(resultSet)) self.sendGameServerDBOperResult(pack.getSessionID(), result, resultSet, errorMsg) return mylog.warning('oper %s not support!'%oper) def OnGameServerToDBLogic(self, db, pack): buf = pack.getBuffer() recvPack = RecvPackProtocol.tagGDGameServerToDBLogic() pos = 0 recvPack.ReadData(buf, pos) queryType = recvPack.QueryType mylog.debug('pack = %s'%(recvPack.OutputString())) if queryType == CommonDefine.gstDBLogic_PlayerPackDataReq: #ÇëÇóÍæ¼Ò´ò°üÊý¾Ý playerID = recvPack.ID packData = self.getPlayerPackData(playerID) # ÓÐÖ±½ÓÈ¡£¬Ã»ÓеϰÔÙ´ÓdbÕûºÏÊý¾Ý if packData: result = 1 mylog.debug("packData get from cache. playerID=%s" % playerID) else: result, playerData = self.GetPlayerDataByPlayerID(db, playerID) mylog.debug("packData get from db. playerID=%s,result=%s" % (playerID, result)) if result: packData = base64.b64encode(playerData) self.updPlayerPackData(playerID, packData) self.SendGameServerToDBLogicResult(pack.getSessionID(), result, recvPack, packData) return if queryType == CommonDefine.gstDBLogic_PlayerPackDataUpd: #¸üÐÂÍæ¼Ò´ò°üÊý¾Ý£¬½ö×Ó·þÓ㬲»ÐèÒª»Ø¸´GameServer playerID = recvPack.ID packData = recvPack.Data self.updPlayerPackData(playerID, packData) return if queryType == CommonDefine.gstDBLogic_GMCmd: dbAnswerList = GMShell.DBGMCommand(recvPack.Data) self.SendGameServerToDBLogicResult(pack.getSessionID(), 1, recvPack, str(dbAnswerList)) return return def SendGameServerToDBLogicResult(self, sessionID, result, recvPack, resultSet): '''»Ø¸´GameServer·¢Ë͵ÄSendDBLogic£¬¿ÉÒÔ²»»Ø¸´£¬ÓɾßÌåÀàÐ;ö¶¨ @param result: ½á¹û£º1³É¹¦£¬0ʧ°Ü @param recvPack: GameServer·¢À´µÄÊý¾Ý°ü£¬Data¿ÉÔ­Öµ·µ»Ø£¬Ò²¿ÉÐ޸ĺ󷵻أ¬ÓɾßÌåÀàÐ;ö¶¨ @param resultSet: »Ø¸´Êý¾Ý ''' sendPack = SendPackProtocol.tagDGGameServerToDBLogicResult() sendPack.Type = CommonDefine.dgDBGameServerToDBLogicResult sendPack.Result = result sendPack.ID = recvPack.ID sendPack.QueryType = recvPack.QueryType sendPack.Data = recvPack.Data 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()) mylog.debug("»Ø¸´ SendGameServerToDBLogicResult") return def GetPlayerDataByPlayerID(self, db, playerID): dbPlayer = DataServerPlayerData.tagDBPlayer() dbPlayer.PlayerID = playerID collection = db[UCN_DBPlayer] loadOK = dbPlayer.adoLoadCEx(collection, {'PlayerID':playerID}) if not loadOK: mylog.warning('GetPlayerDataByPlayerID Exception playerID = %s'%(dbPlayer.PlayerID)) return 0, '' #²âÊÔ mylog.info("accid = %s"%(dbPlayer.AccID)) #¶ÁÈ¡ÎïÆ·µÈÆäËûÊý¾Ý queryDict = {'PlayerID':dbPlayer.PlayerID} collection = db[UCN_RoleItem] itemData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleItem, True) collection = db[UCN_RoleMission] missionData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMission) collection = db[UCN_RoleMissionDict] roleMissionDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMissionDict) collection = db[UCN_RoleSkill] roleSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleSkill) collection = db[UCN_RoleBuff] roleBuffData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleBuff) collection = db[UCN_RoleRepeatTime] roleRepeatTimeData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleRepeatTime) collection = db[UCN_PlayerHorseTable] roleHorseData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerHorseTable) collection = db[UCN_GMOper] gmOperData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagGMOper) collection = db[UCN_RolePet] rolePetData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRolePet) collection = db[UCN_PetSkill] petSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPetSkill) collection = db[UCN_RoleNomalDict] roleNormalDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleNomalDict) collection = db[UCN_PlayerDienstgrad] roleDienstgradData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerDienstgrad) collection = db[UCN_BattleFormation] battleFormationData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagBattleFormation) #¶ÁÈ¡½ûÖ¹IPÊý¾Ý gmIP = DataServerPlayerData.tagDBGMIP() gmIP.AccID = dbPlayer.AccID.lower() collection = db[UCN_DBGMIP] gmIPData = gmIP.adoQueryIndex(collection) return 1, dbPlayer.getBuffer() + itemData + missionData + roleMissionDictData + roleSkillData + roleBuffData + roleRepeatTimeData + roleHorseData + gmOperData\ + gmIPData + rolePetData + petSkillData + roleNormalDictData + roleDienstgradData+battleFormationData # ²éѯ·µ»Ø0/1 ´ú±íÊÇ·ñ³É¹¦ def OnMergeQueryRegisterResult(self, db, pack): g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict buf = pack.getBuffer() #len = pack.getLength() recvPack = MergeServerRecvProtocol.tagLPQueryRegisterResult() pos = 0 recvPack.ReadData(buf, pos) accID = recvPack.AccID.strip(chr(0)) mylog.debug('accID = %s.'%(accID)) clientSessionID = pack.getSessionID() client = MergeProxyClientMgr.getMergeProxyClientMgr().findClientBySessionID(clientSessionID) if not client: mylog.warning('client not found!sessionID = %s'%(clientSessionID)) return sendPack = MergeServerSendProtocol.tagMPQueryRegisterResult() sendPack.Type = CommonDefine.dgMergeQueryNewAccount if g_mergeRegisterPlayerDict.get(accID, []): sendPack.Result = 0 self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense, MMORPGPack.stNoSense, sendPack.GetBuffer()) mylog.warning('query failed!spec = %s'%accID) return sendPack.Result = 1 sendPack.Account = accID sendPack.AccountLen = len(accID) sendPack.Pwd = "" sendPack.PwdLen = 0 self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense, MMORPGPack.stNoSense, sendPack.GetBuffer()) def OnMergeRegisterPlayerByCache(self, db, pack): ''' »º´æ¿ç·þÍæ¼ÒÉÏ´«Êý¾ÝÐÅÏ¢ ĿǰÕ˺š¢Íæ¼ÒID¡¢½ÇÉ«Ãû¾ùÒÑÈ·±£Î¨Ò»£¬¹ÊÎÞÐèÔÙÖØÐÂÉú³ÉеÄÕ˺ż°½ÇÉ«ÐÅÏ¢ Ö±½Ó½ÓÊÕ¸üлº´æ¼´¿É£¬Íæ¼ÒµÇ½¿ç·þ·þÎñÆ÷ʱֱ½Ó´Ó»º´æÊý¾ÝÖнâÎö½ÇÉ«Êý¾Ý£¬´Ó¶ø½ÚÊ¡db´æÈ¡²½Öè ''' g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict try: buf = pack.getBuffer() recvPack = MergeServerRecvProtocol.tagLPRegisterPlayer() pos = 0 recvPack.ReadData(buf, pos) #mylog.debug('pack = %s'%(binascii.b2a_hex(buf))) loginResultPack = MergeServerSendProtocol.tagMPRegisterPlayerResult() loginResultPack.Type = CommonDefine.dgMergeRegisterResult #Íæ¼ÒµØÍ¼Êý¾Ý£¬ºÍÏÂÏß±£´æ°ü SavePlayerMapServerDataEx Ò»Ö playerData = recvPack.Data playerRec = DataServerPlayerData.tagDBPlayer() pos = 0 dbPlayerReadLen = playerRec.readData(playerData, pos, len(playerData)) if -1 == dbPlayerReadLen: #Êý¾ÝÒì³££¬³¤¶È²»×ã #»Ø¸´Ê§°Ü loginResultPack.Result = 0 loginResultPack.ErrorMsg = 'Player data length not enough!' loginResultPack.ErrorMsgLen = len(loginResultPack.ErrorMsg) self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense, MMORPGPack.stNoSense, loginResultPack.GetBuffer()) mylog.warning('player data too short!') return if playerRec.PlayerID == 0: loginResultPack.Result = 0 loginResultPack.ErrorMsg = 'Player data error!' loginResultPack.ErrorMsgLen = len(loginResultPack.ErrorMsg) self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense, MMORPGPack.stNoSense, loginResultPack.GetBuffer()) mylog.warning('player data error!') return clientSessionID = pack.getSessionID() client = MergeProxyClientMgr.getMergeProxyClientMgr().findClientBySessionID(clientSessionID) if not client: mylog.warning('client not found!sessionID = %s'%(clientSessionID)) return groupID = client.groupID playerID = playerRec.PlayerID accID = playerRec.AccID.lower().strip(chr(0)) playerName = playerRec.PlayerName.strip() #³É¹¦£¬·µ»ØÐÂÕʺÅÃÜÂë loginResultPack.Result = 1 loginResultPack.Account = accID loginResultPack.AccountLen = len(accID) loginResultPack.Pwd = "" loginResultPack.PwdLen = 0 self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense, MMORPGPack.stNoSense, loginResultPack.GetBuffer()) mylog.info('player %s accID=%s, playerID=%s, %s register PK ok!'%(groupID, accID, playerID, playerName)) g_mergeRegisterPlayerDict[accID] = [time(), 0, recvPack, groupID] # ¸üпç·þÍæ¼ÒÊý¾Ý»º´æ except Exception, e: msg = error.formatMsg('error', error.ERROR_NO_175, "OnMergeRegisterPlayer error %s!traceback = %s, pack = %s"%(e, traceback.format_exc(), binascii.b2a_hex(buf))) mylog.error(msg) except: msg = error.formatMsg('error', error.ERROR_NO_176, "OnMergeRegisterPlayer error!traceback = %s, pack = %s"%(traceback.format_exc(), binascii.b2a_hex(buf))) mylog.error(msg) return def OnFinishRecharge(self, db, pack): # mapÍê³É¶Ò»»£¬¼ÙÉè´Ë´¦Ã»Óлظ´£¬Ôò´Ëµ¥±ä³É¶ªµ¥£¬ÔÝÓÉÈ˹¤Î¬»¤ # ÈôÕæÆµ·±·¢ÉúÔò¸ÄΪÉÏÏ߻ָ´ try: buf = pack.getBuffer() packLen = pack.getLength() recvPack = RecvPackProtocol.tagMDFinishRecharge() pos = 0 recvPack.ReadData(buf, pos) orderID = recvPack.OrderID.strip(chr(0)) mylog.debug('OnFinishRecharge ...%s'%orderID) col = db[UCN_PayInfo] result = col.find({"OrderID":orderID}) if not result or result.count() == 0: # ûÓгäÖµ¶©µ¥ return curTime = datetime.datetime.today() curTimeStr = str(curTime) curTimeStr = curTimeStr.split(".")[0] col.update({"OrderID":orderID}, {"$set":{"IsProcess":1, 'EndOrderTime':curTimeStr}}) mylog.debug('OnFinishRecharge OrderID = %s'%(orderID)) return except Exception, e: msg = error.formatMsg('error', error.ERROR_NO_170, "OnFinishRecharge error %s!pack = %s"%(e, binascii.b2a_hex(buf))) mylog.error(msg) except: msg = error.formatMsg('error', error.ERROR_NO_170, "OnFinishRecharge error!pack = %s"%(binascii.b2a_hex(buf))) mylog.error(msg) return def OnQueryRecharge(self, db, pack): # map²éѯеijäÖµ¶©µ¥£¬ ²éѯ³äÖµ±í try: buf = pack.getBuffer() packLen = pack.getLength() recvPack = RecvPackProtocol.tagMDQueryRecharge() pos = 0 recvPack.ReadData(buf, pos) account = recvPack.Account.strip(chr(0)) mylog.debug('OnQueryRecharge ...%s'%account) col = db[UCN_PayInfo] result = col.find({'AccID':account, 'IsProcess':0, 'EndOrderTime':0}) if not result or result.count() == 0: # ûÓгäÖµ¶©µ¥ return # Ò»µ¥Ò»µ¥·¢ # ÏÈÉèÖÃIsProcessΪ1¶Ò»»ÖУ¬µÈ»Ø¸´½á¹ûÔÚÕæÕýÍê³É¶©µ¥ billInfo = result[0] sendPack = SendPackProtocol.tagDMRechargePush() sendPack.Type = CommonDefine.dgDBToMapServer sendPack.SubType = CommonDefine.gmReChargePush sendPack.OrderID = fix_outgoingText(billInfo['OrderID']) sendPack.OrderIDLen = len(sendPack.OrderID) sendPack.OrderInfo = fix_outgoingText(billInfo['OrderInfo']) sendPack.OrderInfoLen = len(sendPack.OrderInfo) sendPack.Money = int(billInfo['OrderAmount']) sendPack.Extras = fix_outgoingText(billInfo['Extras']) sendPack.ExtrasLen = len(sendPack.Extras) col.update({"OrderID":sendPack.OrderID}, {"$set":{"IsProcess":1}}) self.sendString(pack, sendPack.GetBuffer()) mylog.debug('OnQueryRecharge OrderID = %s'%(sendPack.OrderID)) #mylog.debug('send %s'%sendPack.OutputString()) return except Exception, e: msg = error.formatMsg('error', error.ERROR_NO_170, "OnQueryRecharge error %s!pack = %s"%(e, binascii.b2a_hex(buf))) mylog.error(msg) except: msg = error.formatMsg('error', error.ERROR_NO_170, "OnQueryRecharge error!pack = %s"%(binascii.b2a_hex(buf))) mylog.error(msg) return def OnQueryNewGuyCardState(self, db, pack): try: buf = pack.getBuffer() packLen = pack.getLength() recvPack = RecvPackProtocol.tagMDIsMediaCardUsed() pos = 0 recvPack.ReadData(buf, pos) mylog.debug('OnQueryNewGuyCardState cardID = %s...'%recvPack.CardID) sendPack = SendPackProtocol.tagDMIsMediaCardUsed() sendPack.Type = CommonDefine.dgDBToMapServer sendPack.SubType = CommonDefine.gmQueryNewGuyCardState sendPack.CardIDLen = recvPack.CardIDLen sendPack.CardID = recvPack.CardID obj = DataServerPlayerData.tagDBNewGuyCardState() obj.CardIDLen = recvPack.CardIDLen obj.CardID = recvPack.CardID col = db[UCN_DBNewGuyCardState] lastExceptionCnt = getADOExceptionCount() if not obj.adoLoad(col): if lastExceptionCnt == getADOExceptionCount(): #ûÓÐÕâÕÅ¿¨µÄ¼Ç¼ sendPack.IsUsed = 0 sendPack.UserDataLen = 0 sendPack.UserData = '' self.sendString(pack, sendPack.GetBuffer()) mylog.debug('OnQueryNewGuyCardState cardID = %s not found!'%recvPack.CardID) return #³ö´íÁË,µ±³ÉʹÓùý£¬·ÀË¢ sendPack.IsUsed = 1 sendPack.UserDataLen = 0 sendPack.UserData = '' self.sendString(pack, sendPack.GetBuffer()) mylog.warning('OnQueryNewGuyCardState query error!cardID = %s'%recvPack.CardID) return #ÒÑÓÐÕâÕÅ¿¨£¬²é¿´¾ßÌå״̬ sendPack.IsUsed = obj.IsUsed sendPack.UserDataLen = obj.UserDataLen sendPack.UserData = obj.UserData sendPack.CardType = obj.CardType sendPack.ValidTime = obj.ValidTime self.sendString(pack, sendPack.GetBuffer()) mylog.debug('OnQueryNewGuyCardState cardID = %s state:%s'%(recvPack.CardID, obj.outputString())) #mylog.debug('send %s'%sendPack.OutputString()) return except Exception, e: msg = error.formatMsg('error', error.ERROR_NO_170, "OnQueryNewGuyCardState error %s!pack = %s"%(e, binascii.b2a_hex(buf))) mylog.error(msg) except: msg = error.formatMsg('error', error.ERROR_NO_170, "OnQueryNewGuyCardState error!pack = %s"%(binascii.b2a_hex(buf))) mylog.error(msg) #Òì³£ÁË,µ±³ÉʹÓùý£¬·ÀË¢ sendPack.IsUsed = 1 sendPack.UserDataLen = 0 sendPack.UserData = '' self.sendString(pack, sendPack.GetBuffer()) def onCheckUpdateNewGuyCardState(self, db, pack): try: buf = pack.getBuffer() packLen = pack.getLength() recvPack = RecvPackProtocol.tagMDCheckUpdateMediaCardState() pos = 0 recvPack.ReadData(buf, pos) sendPack = SendPackProtocol.tagDMCheckUpdateMediaCardResult() sendPack.Type = CommonDefine.dgDBToMapServer sendPack.SubType = CommonDefine.gmUpdateNewGuyCardState sendPack.CardIDLen = recvPack.CardIDLen sendPack.CardID = recvPack.CardID mylog.debug('onCheckUpdateNewGuyCardState %s'%recvPack.OutputString()) obj = DataServerPlayerData.tagDBNewGuyCardState() obj.CardIDLen = recvPack.CardIDLen obj.CardID = recvPack.CardID obj.IsUsed = recvPack.IsUsed obj.UserDataLen = recvPack.UserDataLen obj.UserData = recvPack.UserData obj.CardType = recvPack.CardType obj.ValidTime = recvPack.ValidTime col = db[UCN_DBNewGuyCardState] if not obj.adoCheckUpdate(col): sendPack.Result = 0 self.sendString(pack, sendPack.GetBuffer()) mylog.debug('onCheckUpdateNewGuyCardState failed!cardID = %s'%recvPack.CardID) return sendPack.Result = 1 self.sendString(pack, sendPack.GetBuffer()) mylog.debug('onCheckUpdateNewGuyCardState success!cardID = %s'%recvPack.CardID) except Exception, e: msg = error.formatMsg('error', error.ERROR_NO_171, "onCheckUpdateNewGuyCardState error %s!pack = %s"%(e, binascii.b2a_hex(buf))) mylog.error(msg) except: msg = error.formatMsg('error', error.ERROR_NO_171, "onCheckUpdateNewGuyCardState error!pack = %s"%(binascii.b2a_hex(buf))) mylog.error(msg) #Òì³£ sendPack.Result = 0 self.sendString(pack, sendPack.GetBuffer()) def OnSavePlayerInfo(self, db, pack): '''±£´æÍæ¼ÒÐÅÏ¢''' if self.IsMergeServer(): return pos = 0 PlayerInfo = RecvPackProtocol.tagGDSavePlayerInfo() pos = PlayerInfo.ReadData( pack.getBuffer(), pos) if not PlayerInfo.GeTuiClientID: # ûÓиöÍÆIDÕý³£ÊÇÍÑ»ú¹Ò·¢°ü£¬²»´¦Àí return col = db[UCN_DSAccount] PlayerAcc = DataServerPlayerData.tagDSAccount() PlayerAcc.ACCID = PlayerInfo.AccID.lower() if not PlayerAcc.adoLoadC(col): if PlayerAcc.ACCID: msg = error.formatMsg('error', error.ERROR_NO_57, "load account failed, accid = %s"%PlayerAcc.ACCID) mylog.error(msg) else: mylog.warning("OnSavePlayerInfo load account failed, accid = %s"%PlayerAcc.ACCID) return PlayerAcc.GeTuiClientID = PlayerInfo.GeTuiClientID PlayerAcc.adoUpdateC(col) def OnPrepareCreateRole(self, db, pack): '''½øÈë´´½ÇÂñµã''' pos = 0 PlayerInfo = RecvPackProtocol.tagLDPrepareCreateRole() pos = PlayerInfo.ReadData( pack.getBuffer(), pos) account = self.GetAccountFromTable(PlayerInfo.AccID, db) PegasusCollectorProxy.EventReport(9001, "OperatorID=%s&Step=%s&AccountID=%s&Flag=1000&DeviceFlag=%s"%( account.AppID, 2, CommFunc.GetPlatformAccID(PlayerInfo.AccID), account.DeviceFlag)) def __ReadPlayerID(self, db, saveData): playerRec = DataServerPlayerData.tagDBPlayer() pos = 0 dbPlayerReadLen = playerRec.readData(saveData, pos, len(saveData)) if -1 == dbPlayerReadLen: return (False, 0, "") pos += dbPlayerReadLen playerID = playerRec.PlayerID if playerID == 0: return (False, 0, "") mylog.info("__ReadPlayerID playerID = %s"%(playerID)) return (True, playerID, playerRec.AccID) def onSaveMapServerPlayerDataMergeServer(self, db, pack): g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict '''Íæ¼ÒÏÂÏߣ¬¿ç·þ·þÎñÆ÷ÏÂÏß²»±£´æ''' pos = 1 #Ìø¹ýgstUpdate buf = pack.getBuffer() length = pack.getLength() type, pos = CommFunc.ReadBYTE(buf, pos) if type == CommonDefine.gstPlayerDetail: needReturn, pos = CommFunc.ReadBYTE(buf, pos) packCrcPos = pos packCrc, pos = CommFunc.ReadDWORD(buf, pos) serverTypePos = pos serverType, pos = CommFunc.ReadBYTE(buf, pos) if serverType == MMORPGPack.stMin: #ÆäËû·þÎñÆ÷δ·¢ÏÖÒì³££¬¼ì²éCRC saveData, pos = CommFunc.ReadString(buf, pos, length - pos) calcCrc = CommFunc.ToDWORD(crc32(saveData)) if not packCrc == calcCrc: #CRCУÑé´íÎó serverTypeData = chr(MMORPGPack.stData) buf = buf[:serverTypePos] + serverTypeData+ buf[(serverTypePos + 1):] self.onSavePlayerDataCRCError(db, pack, buf[packCrcPos:]) return (False, 0) else: pass #Õý³£Çé¿ö else: self.onSavePlayerDataCRCError(db, pack, buf[packCrcPos:]) return (False,0) # Óë²ß»®Ô¼¶¨ ÀëÏß³¬¹ý3·ÖÖÓÔò±ØÐë´Ó×Ó·þÔٴεǼ»ã±¨ÐÂÊý¾Ý # ΪÁ˱ÜÃâ g_mergeRegisterPlayerDict Õ¼Óùý¶àÄڴ棬ÿ10·ÖÖÓÇå³ýÒ»´ÎÒÑÏÂÏßÊý¾Ý result, playerID, accID = self.__ReadPlayerID(db, saveData) # ±£´æ¿ç·þÊý¾ÝÖ÷ÒªÊÇΪÁ˱ÜÃâ¶Ìʱ¼ä¶ÏÏßÖØÁ¬Íæ¼ÒÊý¾Ý²»¶ÔÓ¦£¬Èç×ø±êÓֻص½ÁËÆðµã if accID in g_mergeRegisterPlayerDict: g_mergeRegisterPlayerDict[accID][MergeRegPInfoIndex_LogoutTime] = time() g_mergeRegisterPlayerDict[accID][MergeRegPInfoIndex_PackData].Data = saveData g_mergeRegisterPlayerDict[accID][MergeRegPInfoIndex_PackData].DataLen = len(saveData) mylog.info("onSaveMapServerPlayerDataMergeServer result = %s, playerID = %s, sessionID = 0x%X" % (result, playerID, pack.getPackHead().sessionID)) #»Ø±¨ if needReturn: updateReturn = SendPackProtocol.tagDBUpdateReturn() updateReturn.CallType = CommonDefine.dgUpDate updateReturn.UpdateType = CommonDefine.gstPlayerDetail updateReturn.Result = result updateReturn.PlayerID = playerID self.sendString(pack, updateReturn.GetBuffer()) return (result, playerID) def onSaveMapServerPlayerData(self, db, pack): '''Íæ¼ÒÏÂÏߣ¬±£´æÍæ¼ÒÔÚMapServerµÄÊý¾Ý''' pos = 1 #Ìø¹ýgstUpdate buf = pack.getBuffer() length = pack.getLength() type, pos = CommFunc.ReadBYTE(buf, pos) if type == CommonDefine.gstPlayerDetail: needReturn, pos = CommFunc.ReadBYTE(buf, pos) packCrcPos = pos packCrc, pos = CommFunc.ReadDWORD(buf, pos) serverTypePos = pos serverType, pos = CommFunc.ReadBYTE(buf, pos) if serverType == MMORPGPack.stMin: #ÆäËû·þÎñÆ÷δ·¢ÏÖÒì³££¬¼ì²éCRC saveData, pos = CommFunc.ReadString(buf, pos, length - pos) calcCrc = CommFunc.ToDWORD(crc32(saveData)) if not packCrc == calcCrc: #CRCУÑé´íÎó serverTypeData = chr(MMORPGPack.stData) buf = buf[:serverTypePos] + serverTypeData+ buf[(serverTypePos + 1):] self.onSavePlayerDataCRCError(db, pack, buf[packCrcPos:]) return (False, 0) else: pass #Õý³£Çé¿ö else: self.onSavePlayerDataCRCError(db, pack, buf[packCrcPos:]) return (False,0) #Õý³£Çé¿ö #±£´æÊý¾Ý result = False playerID = 0 if DBConfig.PackSave: result, playerID, accID = self.SavePlayerMapServerDataEx(db, saveData) else: result, playerID, accID = self.SavePlayerMapServerData(db, saveData) if not result: #±£´æÊ§°Ü sessionID = pack.getPackHead().sessionID msg = error.formatMsg('error', error.ERROR_NO_59, 'Player save data failed!sessionID = %s'%sessionID) mylog.error(msg) DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\SaveFailDump', '%s.mdat'%sessionID, buf[pos:]) # self.sendString(pack, updateReturn.GetBuffer()) # return #»Ø±¨ if needReturn: updateReturn = SendPackProtocol.tagDBUpdateReturn() updateReturn.CallType = CommonDefine.dgUpDate updateReturn.UpdateType = CommonDefine.gstPlayerDetail updateReturn.Result = result updateReturn.PlayerID = playerID self.sendString(pack, updateReturn.GetBuffer()) # Íæ¼ÒÏÂÏ߻ָ´³äÖµ¶Ò»»ÖеĶ©µ¥,IsProceeΪ1,µ«endtimeΪ¿ÕµÄÇé¿ö self.RevoverBillProcess(db, accID) mylog.info("onSaveMapServerPlayerData result = %s, playerID = %s, sessionID = 0x%X"%(result, playerID, pack.getPackHead().sessionID)) # ÏÂÏ߳ɹ¦Èë¿âºóͬ²½Òƶ¯Íæ¼Ò±¸µµ±¸·ÝÎļþ¼Ð PlayerBakDir = os.path.join(DBConfig.PlayerBakRoot, str(playerID)) if os.path.exists(PlayerBakDir): BakCopyDir = os.path.join(PlayerBakDir, "Backup") for filename in os.listdir(PlayerBakDir): if not filename.endswith(DBConfig.PlayerBakFileType): continue fullPath = os.path.join(PlayerBakDir, filename) if not os.path.exists(os.path.join(BakCopyDir, filename)): shutil.move(fullPath, BakCopyDir) else: os.remove(fullPath) return (result, playerID) def __PlayerBackupSave(self): db = self.db '''Íæ¼Ò±¸µµÈë¿â - ½öÔÚÆô¶¯dbÁ´½Ó³É¹¦ºó´¥·¢Ò»´Î ''' if self.IsMergeServer(): return if not DBConfig.PlayerBakRoot or not os.path.exists(DBConfig.PlayerBakRoot): return mylog.info("Íæ¼Ò±¸µµÂ·¾¶ DBConfig.PlayerBakRoot=%s" % DBConfig.PlayerBakRoot) for parent, _, filenames in os.walk(DBConfig.PlayerBakRoot): if parent.endswith("Backup"): continue for filename in filenames: if not filename.endswith(DBConfig.PlayerBakFileType): continue if len(filenames) > 1: mylog.fatal("Íæ¼Ò±¸µµ¸öÊýÒì³£: The number of backup files is greater than one. filenames=%s" % filenames) return try: fullPath = os.path.join(parent, filename) fileHandler = open(fullPath,'rb') saveData = fileHandler.read() fileHandler.close() saveData = zlib.decompress(saveData) except: mylog.fatal("Íæ¼Ò±¸µµ´ò¿ªÊ§°Ü. %s" % fullPath) return if DBConfig.PackSave: result, playerID, accID = self.SavePlayerMapServerDataEx(db, saveData) else: result, playerID, accID = self.SavePlayerMapServerData(db, saveData) #±£´æÊ§°Ü if not result: mylog.fatal("Íæ¼Ò±¸µµÈë¿âʧ°Ü fail. %s" % fullPath) return BakCopyDir = os.path.join(DBConfig.PlayerBakRoot, str(playerID), "Backup") if not os.path.exists(os.path.join(BakCopyDir, filename)): shutil.move(fullPath, BakCopyDir) mylog.info("Íæ¼Ò±¸µµÈë¿â³É¹¦: playerID=%s,accID=%s, move %s" % (playerID, accID, filename)) else: os.remove(fullPath) mylog.info("Íæ¼Ò±¸µµÈë¿â³É¹¦: playerID=%s,accID=%s, remove %s" % (playerID, accID, filename)) return def SavePlayerDataByBackup(self, db, bakFileName): mylog.info("===Ö´ÐÐÍæ¼ÒÖ¸¶¨±¸µµÈë¿â: %s" % bakFileName) try: playerID = int(bakFileName[:bakFileName.index(".")].split("_")[0]) except: playerID = 0 fullPath = os.path.join(DBConfig.PlayerBakRoot, str(playerID), "Backup", bakFileName) if not os.path.exists(fullPath): msg = "²»´æÔÚ¸ÃÍæ¼Ò±¸µµÎļþ: %s" % fullPath mylog.info(msg) return try: fileHandler = open(fullPath,'rb') saveData = fileHandler.read() fileHandler.close() saveData = zlib.decompress(saveData) except: msg = "Íæ¼ÒÖ¸¶¨±¸µµ´ò¿ªÊ§°Ü: %s" % fullPath mylog.info(msg) return if DBConfig.PackSave: result, playerID, accID = self.SavePlayerMapServerDataEx(db, saveData) else: result, playerID, accID = self.SavePlayerMapServerData(db, saveData) if not result: msg = "Íæ¼ÒÖ¸¶¨±¸µµÈë¿âʧ°Ü: %s" % bakFileName mylog.info(msg) return msg = "Íæ¼ÒÖ¸¶¨±¸µµÈë¿â³É¹¦: playerID=%s,accID=%s, %s" % (playerID, accID, bakFileName) mylog.info(msg) return # Íæ¼ÒÏÂÏ߻ָ´³äÖµ¶Ò»»ÖеĶ©µ¥,IsProceeΪ1,µ«endtimeΪ¿ÕµÄÇé¿ö def RevoverBillProcess(self, db, accID): try: if not accID: return account = accID.strip(chr(0)) col = db[UCN_PayInfo] result = col.find({'AccID':account, 'IsProcess':1, 'EndOrderTime':0}) if not result or result.count() == 0: # ûÓгäÖµ¶©µ¥ return # Ò»µ¥Ò»µ¥ »Ö¸´ billInfo = result[0] orderID = billInfo['OrderID'] col.update({"OrderID":orderID}, {"$set":{"IsProcess":0}}) mylog.debug('RevoverBillProcess success...%s'%orderID) except: mylog.error("RevoverBillProcess error %s"%orderID) def SavePlayerMapServerData(self, db, saveData): playerRec = DataServerPlayerData.tagDBPlayer() pos = 0 dbPlayerReadLen = playerRec.readData(saveData, pos, len(saveData)) if -1 == dbPlayerReadLen: #Êý¾ÝÒì³££¬³¤¶È²»×ã # mylog.error('Player save data error:len = %s sessionID = %s'%len(saveData, sessionID)) # DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\Player_save', '%s.mdat'%sessionID, saveData) return (False, 0, '') pos += dbPlayerReadLen mylog.info('Saving player data,playerID = %s....'%playerRec.PlayerID) if playerRec.PlayerID == 0: # mylog.error('playerID = %s'%playerRec.PlayerID) return (False, 0, '') #AccIDתСд playerRec.AccID = playerRec.AccID.lower() collection = db[UCN_DBPlayer] oFuncGrade = self.GetFuncGrade("gstSaveMapServerCrashData_1_tagDBPlayer") oFuncGrade.Start() if not playerRec.adoUpdateC(collection): # DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\Player_save', '%s.mdat'%sessionID, saveData) # mylog.error('player save error:playerID = %s'%playerRec.PlayerID) return (False, playerRec.PlayerID, '') oFuncGrade.End() #¼Ç¼ÏÂÏßÈÕÖ¾Á÷Ïò self.recPlayerLogoff(playerRec) #±£´æÎïÆ·µÈÆäËûÊý¾Ý #²»ÔÙÖ§³Öµ¥±íģʽ #²»ÔÙÖ§³ÖÎļþģʽ #±£´æÎïÆ· oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleItem") oFuncGrade.Start() #¶Ô±È²âÊÔÓà # if DBConfig.PackSave: # pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleItem, DataServerPlayerData.tagRoleItem, saveData[pos:], True) pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleItem, DataServerPlayerData.tagRoleItem, saveData[pos:], True) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleMission") oFuncGrade.Start() pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleMission, DataServerPlayerData.tagRoleMission, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleMissionDict") oFuncGrade.Start() pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleMissionDict, DataServerPlayerData.tagRoleMissionDict, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleSkill") oFuncGrade.Start() pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleSkill, DataServerPlayerData.tagRoleSkill, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleBuff") oFuncGrade.Start() pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleBuff, DataServerPlayerData.tagRoleBuff, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleRepeatTime") oFuncGrade.Start() pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleRepeatTime, DataServerPlayerData.tagRoleRepeatTime, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagPlayerHorseTable") oFuncGrade.Start() pos += self.savePlayerData(playerRec.PlayerID, db, UCN_PlayerHorseTable, DataServerPlayerData.tagPlayerHorseTable, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_gmOperCheck") oFuncGrade.Start() #·âºÅ¼ì²é self.gmOperCheck(playerRec.AccID, playerRec.PlayerID, saveData[pos:]) oFuncGrade.End() pos += self.savePlayerData(playerRec.PlayerID, db, UCN_GMOper, DataServerPlayerData.tagGMOper, saveData[pos:]) #Ìø¹ýGM IP±í gmIPCnt, pos = CommFunc.ReadDWORD(saveData, pos) gmIPRec = DataServerPlayerData.tagDBGMIP() for i in xrange(gmIPCnt): #gmIPRec.clear() pos += gmIPRec.readData(saveData, pos, len(saveData)) oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRolePet") oFuncGrade.Start() pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RolePet, DataServerPlayerData.tagRolePet, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagPetSkill") oFuncGrade.Start() pos += self.savePlayerData(playerRec.PlayerID, db, UCN_PetSkill, DataServerPlayerData.tagPetSkill, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleNomalDict") oFuncGrade.Start() pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleNomalDict, DataServerPlayerData.tagRoleNomalDict, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagPlayerDienstgrad") oFuncGrade.Start() pos += self.savePlayerData(playerRec.PlayerID, db, UCN_PlayerDienstgrad, DataServerPlayerData.tagPlayerDienstgrad, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagBattleFormation") oFuncGrade.Start() pos += self.savePlayerData(playerRec.PlayerID, db, UCN_BattleFormation, DataServerPlayerData.tagBattleFormation, saveData[pos:]) oFuncGrade.End() assert pos == len(saveData) return (True, playerRec.PlayerID, playerRec.AccID) def SavePlayerMapServerDataEx(self, db, saveData): playerRec = DataServerPlayerData.tagDBPlayer() pos = 0 dbPlayerReadLen = playerRec.readData(saveData, pos, len(saveData)) if -1 == dbPlayerReadLen: #Êý¾ÝÒì³££¬³¤¶È²»×ã # mylog.error('Player save data error:len = %s sessionID = %s'%len(saveData, sessionID)) # DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\Player_save', '%s.mdat'%sessionID, saveData) return (False, 0, '') pos += dbPlayerReadLen mylog.info('Saving player data,playerID = %s....'%playerRec.PlayerID) if playerRec.PlayerID == 0: # mylog.error('playerID = %s'%playerRec.PlayerID) return (False, 0, '') #AccIDתСд playerRec.AccID = playerRec.AccID.lower() collection = db[UCN_DBPlayer] oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagDBPlayer") oFuncGrade.Start() if not playerRec.adoUpdateC(collection): # DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\Player_save', '%s.mdat'%sessionID, saveData) # mylog.error('player save error:playerID = %s'%playerRec.PlayerID) return (False, playerRec.PlayerID, '') oFuncGrade.End() #¼Ç¼ÏÂÏßÈÕÖ¾Á÷Ïò if playerRec.CountryLastWeekHornor == 0: # Ô¼¶¨ÎªÏÂÏß±êʶ self.recPlayerLogoff(playerRec) #±£´æÎïÆ·µÈÆäËûÊý¾Ý #²»ÔÙÖ§³Öµ¥±íģʽ #²»ÔÙÖ§³ÖÎļþģʽ #±£´æÎïÆ· oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleItem") oFuncGrade.Start() #¶Ô±È²âÊÔÓà # if DBConfig.PackSave: # pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleItem, DataServerPlayerData.tagRoleItem, saveData[pos:], True) pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleItem, DataServerPlayerData.tagRoleItem, saveData[pos:], True) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleMission") oFuncGrade.Start() pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleMission, DataServerPlayerData.tagRoleMission, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleMissionDict") oFuncGrade.Start() pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleMissionDict, DataServerPlayerData.tagRoleMissionDict, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleSkill") oFuncGrade.Start() pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleSkill, DataServerPlayerData.tagRoleSkill, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleBuff") oFuncGrade.Start() pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleBuff, DataServerPlayerData.tagRoleBuff, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleRepeatTime") oFuncGrade.Start() pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleRepeatTime, DataServerPlayerData.tagRoleRepeatTime, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagPlayerHorseTable") oFuncGrade.Start() pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_PlayerHorseTable, DataServerPlayerData.tagPlayerHorseTable, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_gmOperCheck") oFuncGrade.Start() #·âºÅ¼ì²é self.gmOperCheck(playerRec.AccID, playerRec.PlayerID, saveData[pos:]) oFuncGrade.End() pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_GMOper, DataServerPlayerData.tagGMOper, saveData[pos:]) #Ìø¹ýGM IP±í gmIPCnt, pos = CommFunc.ReadDWORD(saveData, pos) gmIPRec = DataServerPlayerData.tagDBGMIP() for i in xrange(gmIPCnt): #gmIPRec.clear() pos += gmIPRec.readData(saveData, pos, len(saveData)) oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRolePet") oFuncGrade.Start() pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RolePet, DataServerPlayerData.tagRolePet, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagPetSkill") oFuncGrade.Start() pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_PetSkill, DataServerPlayerData.tagPetSkill, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleNomalDict") oFuncGrade.Start() pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleNomalDict, DataServerPlayerData.tagRoleNomalDict, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagPlayerDienstgrad") oFuncGrade.Start() pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_PlayerDienstgrad, DataServerPlayerData.tagPlayerDienstgrad, saveData[pos:]) oFuncGrade.End() oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagBattleFormation") oFuncGrade.Start() pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_BattleFormation, DataServerPlayerData.tagBattleFormation, saveData[pos:]) oFuncGrade.End() assert pos == len(saveData) return (True, playerRec.PlayerID, playerRec.AccID) def gmOperCheck(self, accID, playerID, data): pos = 0 length = len(data) cnt, pos = CommFunc.ReadDWORD(data, pos) length -= pos gmOperRec = DataServerPlayerData.tagGMOper() for i in xrange(cnt): gmOperRec.clear() readLen = gmOperRec.readData(data, pos, length) pos += readLen length -= readLen if gmOperRec.Oper == CommonDefine.gmForbidAcc: #¼Ç¼·âºÅÈÕÖ¾ self.onForbiddenUpdate(accID, playerID, True, CommFuncEx.TDateTime_Now(), (int)(gmOperRec.EndTime - CommFuncEx.TDateTime_Now()), gmOperRec.GMAccID, 'EndTime = %s.Reason = %s'%(CommFuncEx.TDateTimeToString(gmOperRec.EndTime), gmOperRec.Msg)) def savePlayerDataEx(self, playerID, db, collectionName, structName, data, checkSID = False): '''±£´æÍæ¼ÒÎïÆ·µÈÊý¾Ý£¬ÓÅ»¯°æ''' g_playerDataCntInfo = PyGameData.g_playerDataCntInfo if playerID not in g_playerDataCntInfo: g_playerDataCntInfo[playerID] = {} oAllFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_All"%structName) oAllFuncGrade.Start() collection = db[collectionName] #ɾ³ý¾ÉÊý¾Ý oFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_remove"%structName) oFuncGrade.Start() #collection.remove({'PlayerID':playerID}) #ÕâÀïËäȻûÓÐ×öË÷Òý£¬µ«ÊÇËٶȺܿ죬ºöÂÔ #·ÏÆú remove + insert ·½Ê½£¬¸ÄΪֱ½ÓʹÓà update oFuncGrade.End() #²åÈëÐÂÊý¾Ý pos = 0 cnt, pos = CommFunc.ReadDWORD(data, pos) mylog.info('saving %s data, playerID = %s, cnt = %s'%(collectionName, playerID, cnt)) rec = structName() length = len(data) #ÕâÀォÊý¾Ý´ò³ÉÒ»¸ö×ֵ䣬¼´Êý¾Ý¿âµÄÒ»Ìõ¼Ç¼´æ´¢£¬ÕâÑù»á±ÈÏÂÃæÄÇÖÖ·½Ê½¿ì doc = {} if cnt: doc['PlayerID'] = playerID doc['Count'] = cnt doc['__PackSave'] = 1 for i in xrange(cnt): oFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_clear"%structName) oFuncGrade.Start() rec.clear() oFuncGrade.End() oFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_readData"%structName) oFuncGrade.Start() readLen = rec.readData(data, pos, length) oFuncGrade.End() if readLen == -1: mylog.info('%s'%b2a_hex(data)) return pos += readLen if checkSID: oFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_makeSID"%structName) oFuncGrade.Start() rec.makeSID() oFuncGrade.End() #ÐòºÅ×öKEY doc['%s'%(i+1)] = rec.getRecord() if doc: trycnt = 0 while True: try: oFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_update"%structName) oFuncGrade.Start() #collection.insert(doc, False, True) collection.update({'PlayerID':playerID}, doc, upsert=True) # ÉèÖà upsert Ϊ True£¬²»´æÔÚʱÔò²åÈëÐÂÊý¾Ý oFuncGrade.End() g_playerDataCntInfo[playerID][collectionName] = cnt mylog.info('update end %s data, playerID = %s, cnt = %s, playerDataCntInfo=%s'%(collectionName, playerID, cnt, g_playerDataCntInfo[playerID])) break except pymongo.errors.OperationFailure, err: if(DBConfig.TryCntOnWriteFail > trycnt): trycnt += 1 continue addADOExceptionCount() mylog.info("%s.%s:docs = %s"%(self.__class__.__name__, inspect.stack()[0][3], doc)) mylog.error('update failed!docs = %s, error = %s, trycnt = %d'%(doc, err, trycnt)) break else: trycnt = 0 while True: try: oFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_remove"%structName) oFuncGrade.Start() collection.remove({'PlayerID':playerID}) oFuncGrade.End() g_playerDataCntInfo[playerID][collectionName] = 0 mylog.info('remove end %s data, playerID = %s, cnt = %s, playerDataCntInfo=%s'%(collectionName, playerID, cnt, g_playerDataCntInfo[playerID])) break except pymongo.errors.OperationFailure, err: if(DBConfig.TryCntOnWriteFail > trycnt): trycnt += 1 continue addADOExceptionCount() mylog.error('remove failed!%s playerID = %s, error = %s, trycnt = %d'%(collectionName, playerID, err, trycnt)) break oAllFuncGrade.End() return pos def savePlayerData(self, playerID, db, collectionName, structName, data, checkSID = False): '''±£´æÍæ¼ÒÎïÆ·Êý¾Ý''' g_playerDataCntInfo = PyGameData.g_playerDataCntInfo if playerID not in g_playerDataCntInfo: g_playerDataCntInfo[playerID] = {} oAllFuncGrade = self.GetFuncGrade("savePlayerData_%s_All"%structName) oAllFuncGrade.Start() #ɾ³ý¾ÉÊý¾Ý collection = db[collectionName] oFuncGrade = self.GetFuncGrade("savePlayerData_%s_remove"%structName) oFuncGrade.Start() collection.remove({'PlayerID':playerID}) oFuncGrade.End() #²åÈëÐÂÊý¾Ý pos = 0 cnt, pos = CommFunc.ReadDWORD(data, pos) mylog.debug('saving %s data for player playerID = %s cnt = %s, data = %s'%(structName, playerID, cnt, data)) rec = structName() length = len(data) docs = [] for i in xrange(cnt): oFuncGrade = self.GetFuncGrade("savePlayerData_%s_clear"%structName) oFuncGrade.Start() rec.clear() oFuncGrade.End() oFuncGrade = self.GetFuncGrade("savePlayerData_%s_readData"%structName) oFuncGrade.Start() readLen = rec.readData(data, pos, length) oFuncGrade.End() if readLen == -1: mylog.info('%s'%(b2a_hex(data))) return pos += readLen # length -= readLen if checkSID: oFuncGrade = self.GetFuncGrade("savePlayerData_%s_makeSID"%structName) oFuncGrade.Start() rec.makeSID() oFuncGrade.End() # rec.adoInsertC(collection) # else: # rec.adoInsert(collection) oFuncGrade = self.GetFuncGrade("savePlayerData_%s_getRecord"%structName) oFuncGrade.Start() doc = rec.getRecord() oFuncGrade.End() docs.append(doc) if len(docs): trycnt = 0 while True: try: oFuncGrade = self.GetFuncGrade("savePlayerData_%s_insert"%structName) oFuncGrade.Start() collection.insert(docs, False, True) oFuncGrade.End() g_playerDataCntInfo[playerID][collectionName] = cnt break except pymongo.errors.OperationFailure, err: if(DBConfig.TryCntOnWriteFail > trycnt): trycnt += 1 continue addADOExceptionCount() mylog.info("%s.%s:docs = %s"%(self.__class__.__name__, inspect.stack()[0][3], docs)) mylog.error('Insert failed!docs = %s, error = %s, trycnt = %d'%(docs, err, trycnt)) break else: g_playerDataCntInfo[playerID][collectionName] = 0 oAllFuncGrade.End() return pos def recPlayerLogoff(self, dbPlayer): req = DataServerLogData.tagDBPlayerLogInfoOnLogOff() req.AccID = dbPlayer.AccID req.PlayerName = dbPlayer.PlayerName req.AccState = dbPlayer.AccState req.LV = dbPlayer.LV req.Gold = dbPlayer.Gold req.GoldPaper = dbPlayer.GoldPaper req.Silver = dbPlayer.Silver req.SilverPaper = dbPlayer.SilverPaper req.GMLevel = dbPlayer.GMLevel req.Job = dbPlayer.Job req.TJGTime = dbPlayer.HappyPoint # ÍÑ»ú¹Òʱ¼ä req.TJGState = dbPlayer.State # 0Õý³£µÇ¼£¬1ÍÑ»úµÇ¼£¬2ÍÑ»úµÇ¼ËÀÍö req.LastLogoffTime = time() req.PlayerID = dbPlayer.PlayerID req.IsOnline = 0 #ĬÈÏ0Òò¹Ø·þʱûÊÕµ½loginserverÈ«²¿ÏÂÏß°ü sendBuf = '' sendBuf = CommFunc.WriteBYTE(sendBuf, CommonDefine.gstSavePlayerInfoLogOnLogOff) sendBuf = CommFunc.WriteString(sendBuf, req.getLength(), req.getBuffer()) self.sendDBRequest(sendBuf) def onSavePlayerDataCRCError(self, db, pack, saveDataWithCRC): #dump Êý¾Ý dumpFileName = str(uuid.uuid4()) #random uuid msg = error.formatMsg('error', error.ERROR_NO_60, 'sessionID = 0x%x dump to file %s'%(pack.getPackHead().sessionID, dumpFileName)) mylog.error(msg) DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs', dumpFileName, saveDataWithCRC) playerRec = DataServerPlayerData.tagDBPlayer() pos = 5 #Ìø¹ýCRC,ServerType length = len(saveDataWithCRC) if -1 == playerRec.readData(saveDataWithCRC, pos, length): #Êý¾Ý³¤¶È²»×㣬ÎÞ·¨´¦Àí pass else: #·âºÅ if self.updatePlayerAccState(db, playerRec.PlayerID, CommonDefine.pysForbidden): #·âºÅ³É¹¦£¬¼Ç¼·âºÅÈÕÖ¾ self.sendAccForbiddenLogReq(playerRec.AccID, 1) #»Ø±¨±£´æÊ§°Ü updateReturn = SendPackProtocol.tagDBUpdateReturn() updateReturn.CallType = CommonDefine.dgUpDate updateReturn.UpdateType = CommonDefine.gstPlayerDetail updateReturn.Result = 0 self.sendString(pack, updateReturn.GetBuffer()) def sendAccForbiddenLogReq(self, accid, isForbidden): return # accForbiddenLogReq = DataServerLogData.tagDBPlayerInfoLogForbidden() # accForbiddenLogReq.AccID = accid # accForbiddenLogReq.IsForbidden = isForbidden # accForbiddenLogReq.ForbiddenTime = time() # accForbiddenLogReqPackBuf = '' # accForbiddenLogReqPackBuf = CommFunc.WriteBYTE(accForbiddenLogReqPackBuf, CommonDefine.gstSavePlayerInfoLogOnForbidden) # accForbiddenLogReqPackBuf = CommFunc.WriteString(accForbiddenLogReqPackBuf, accForbiddenLogReq.getLength(), accForbiddenLogReq.getBuffer()) # self.sendDBRequest(accForbiddenLogReqPackBuf) def updatePlayerAccState(self, db, playerID, newState): '''·âºÅ''' collection = db[UCN_DBPlayer] doc = DataServerPlayerData.tagDBPlayer() doc.PlayerID = playerID lastSIDErrorCnt = getSIDErrorCnt() ret = doc.adoLoadC(collection) if not ret: if not (lastSIDErrorCnt == getSIDErrorCnt()): #SID´íÎó mylog.warning('%s.%s SID error found on reading data of playerID = %s!'%(self.__class__.__name__, inspect.stack()[0][3], playerID)) return False #Î޴˽ÇÉ« mylog.debug('%s.%s playerID = %s not found!'%(self.__class__.__name__, inspect.stack()[0][3], playerID)) return False doc.AccState = newState if not doc.adoUpdateC(collection): return False return True def onSaveGameServerPlayerSaveData(self, db, pack): '''Íæ¼ÒÏÂÏߣ¬±£´æÍæ¼ÒÔÚGameServerµÄÊý¾Ý''' saveGameServerPlayerDataReq = RecvPackProtocol.tagGameServerToBalanceServerPlayerSaveData() saveGameServerPlayerDataReq.ReadData(pack.getBuffer(), 0, pack.getLength()) #mylog.debug(saveGameServerPlayerDataReq.OutputString()) #playerDataReadPos = 0 #playerDataReadPos = self.saveGameServerPlayerData(saveGameServerPlayerDataReq.PlayerID, saveGameServerPlayerDataReq.Data, playerDataReadPos, 'tagPlayerEnemy', DataServerPlayerData.tagPlayerEnemy, db) #playerDataReadPos = self.saveGameServerPlayerData(saveGameServerPlayerDataReq.PlayerID, saveGameServerPlayerDataReq.Data, playerDataReadPos, 'tagPlayerFriend', DataServerPlayerData.tagPlayerFriend, db) if saveGameServerPlayerDataReq.NeedReturn == 2: #ÏÂÏß´¥·¢ #αװ³ÉLoginServer·¢Ë͹ýÀ´µÄ£¬ÕâÑù»á»Ø°ü¸øLoginServer pack.setSrcSvrType(MMORPGPack.stLogin) self.sendOKString(CommonDefine.dgPlayerSaveGameServerData, pack, '') return def onGetGameServerPlayerLoginData(self, db, pack): # ¸Ä³ÉPY´¦Àí return #======================================================================== # '''GameServer¶ÁÈ¡Íæ¼ÒµÇ¼Êý¾Ý''' # getGameServerPlayerLoginDataPack = RecvPackProtocol.tagGBGetGameServerPlayerLoginData() # getGameServerPlayerLoginDataPack.ReadData(pack.getBuffer(), 0, pack.getLength()) # # playerEnemyRec = DataServerPlayerData.tagPlayerEnemy() # playerEnemyRec.PlayerID = getGameServerPlayerLoginDataPack.PlayerID # collection = db[UCN_PlayerEnemy] # playerEnemyData = playerEnemyRec.adoQueryIndex(collection) # # playerFriendRec = DataServerPlayerData.tagPlayerFriend() # playerFriendRec.PlayerID = getGameServerPlayerLoginDataPack.PlayerID # collection = db[UCN_PlayerFriend] # playerFriendData = playerFriendRec.adoQueryIndex(collection) # # allData = playerEnemyData + playerFriendData # self.sendGameServerString(pack, CommonDefine.dgPlayerGameServerLoginData, allData) # mylog.debug('send game server player login data ok!') # #======================================================================== def onCreateRoleServerCheckIsHaveRole(self, db, pack): try: recvPack = RecvPackProtocol.tagCSIsHaveRole() recvPack.ReadData(pack.getBuffer()) sendPack = SendPackProtocol.tagDRequestResult() sendPack.Type = CommonDefine.gstCreateRoleServerCheckIsHaveRole sendPack.AccID = recvPack.AccID Player = DataServerPlayerData.tagDBPlayer() Player.AccID = recvPack.AccID.lower() #ÕʺÅͳһתСд Player.IsDeleted = 0 collection = db[UCN_DBPlayer] lastExceptionCnt = getADOExceptionCount() lastSIDErrorCnt = getSIDErrorCnt() #¼ì²é¸ÃÕʺÅÊÇ·ñÒÑÓÐÓÐЧ½ÇÉ« if Player.adoLoadCEx(collection, {'AccID':fix_incomingText(Player.AccID), 'IsDeleted':Player.IsDeleted}): mylog.info('player of accid = %s exists!'%Player.AccID) sendPack.Result = 1 sendPack.ExAttr = 1 else: #disCreatePlayerError_PlayerExist if not lastExceptionCnt == getADOExceptionCount(): #Êý¾Ý¿â¶ÁÈ¡³ö´í£¬µ«²»Ò»¶¨ÊÇUser¿â¶ÁÈ¡³ö´í sendPack.Result = 0 sendPack.ExAttr = disDataBaseError elif not lastSIDErrorCnt == getSIDErrorCnt(): if DBConfig.checkSID: sendPack.Result = 0 sendPack.ExAttr = disAccStateError else: sendPack.Result = 1 sendPack.ExAttr = 1 else: sendPack.Result = 1 sendPack.ExAttr = 0 self.sendString(pack, sendPack.GetBuffer()) mylog.debug('onCreateRoleServerCheckIsHaveRole ok, Accid = %s!'%recvPack.AccID) except: msg = error.formatMsg('error', error.ERROR_NO_62, "Catch a unexpetcted exception, error = %s"%traceback.format_exc()) mylog.error(msg) def onCreateRoleServerCheckPlayerExist(self, db, pack): try: recvPack = RecvPackProtocol.tagCSCheckPlayerNameExist() recvPack.ReadData(pack.getBuffer()) sendPack = SendPackProtocol.tagDRequestResult() sendPack.Type = CommonDefine.gstCreateRoleServerCheckPlayerExist sendPack.AccID = recvPack.AccID sendPack.Result = 1 if self.hasPlayerByPlayerName(db, recvPack.PlayerName): sendPack.ExAttr = 1 else: sendPack.ExAttr = 0 self.sendString(pack, sendPack.GetBuffer()) mylog.debug('onCreateRoleServerCheckPlayerExist ok, Accid = %s!'%recvPack.AccID) except: msg = error.formatMsg('error', error.ERROR_NO_63, "Catch a unexpetcted exception, error = %s"%traceback.format_exc()) mylog.error(msg) def onCreatePlayer(self, db, pack): #αװ³ÉLoginServer·¢Ë͹ýÀ´µÄ pack.setSrcSvrType(MMORPGPack.stLogin) Suc, disCode, AccId, data = self.CreateRole(db, pack) if Suc: self.sendOKString(CommonDefine.dgCreatePlayer, pack, data) mylog.debug('send created player info for accid = %s'%AccId) else: self.sendFailString(CommonDefine.dgCreatePlayer, pack, disCode) def onCreateRoleServerRequestCreateRole(self, db, pack): try: Suc, disCode, AccId, data = self.CreateRole(db, pack) sendPack = SendPackProtocol.tagDRequestResult() sendPack.Type = CommonDefine.gstCreateRoleServerRequestCreateRole sendPack.Result = Suc sendPack.AccID = AccId if Suc: sendPack.ExAttr = 0 else: sendPack.ExAttr = disCode mylog.debug('send created player info for accid = %s'%AccId) self.sendString(pack, sendPack.GetBuffer()) except: msg = error.formatMsg('error', error.ERROR_NO_64, "Catch a unexpetcted exception, error = %s"%traceback.format_exc()) mylog.error(msg) #¼ì²éÒÑ·ÖÅäID±íÖÐÊ£ÓàIDÊýÁ¿ def CheckEmptyPlayerIDCount(self, db): mylog.debug("CheckEmptyPlayerIDCount start") collection = db[UCN_Dispatch_PlayerID] result = collection.find() if not result: if self.isDispatchingPlayerID: try_count = 0 #´Ë´¦µÈ´ý±ØÒªÐÔ²»¸ß£¬Ö÷£¨µ¥£©Ïß³ÌÖ»Óе±»º´æÇøÓÃÍ꣬²¢ÇÒÐÂÏß³ÌÇëÇó¹ý while try_count < 3 and self.isDispatchingPlayerID: if not self.isDispatchingPlayerID: return True sleep(1) try_count+=1 return False CallDispatchPlayerID(db, self) return True emptyCnt = result.count() #ÊýÁ¿×ã¹»ÎÞÐè·ÖÅä if emptyCnt > DBConfig.IDDispatchPlayeIDLimit: return True if emptyCnt <= 0: if self.isDispatchingPlayerID: try_count = 0 #µÈ´ý3Ãë while try_count < 3 and self.isDispatchingPlayerID: if not self.isDispatchingPlayerID: return True sleep(1) try_count+=1 return False CallDispatchPlayerID(db, self) return True #¿ªÊ¼Ê¹Óûº³åÊý¾Ý¿ªÒ»¸öÐÂÏß³ÌÇëÇó·ÖÅäÐÂID³Ø if self.isDispatchingPlayerID: return True import threading t = threading.Thread(target = CallDispatchPlayerID, args =(db, self)) t.start() return True #´ÓÒÑ·ÖÅäID±íÖÐÈ¡³öÒ»¸ö¿ÕID¸øÍæ¼Ò def PopEmptyPlayerID(self, db): collection = db[UCN_Dispatch_PlayerID] rec = collection.find_one() if rec: newID = rec['PlayerID'] collection.remove(rec) return newID return -1 #Éú³ÉplayerID def DispatchNewPlayerID(self, db): UseIDDispatchServer = DBConfig.UseIDDispatchServer if not UseIDDispatchServer: #¾ÉIDÉú³É¹æÔò£¬PLAYERID_FEED±í×ÔÔö return seq(db, UCN_DBPlayer, 'PlayerID', DBConfig.PLAYERID_FEED, DBConfig.PLAYERID_STEP) #ÐÂÉú³É¹æÔò ´ÓרÃŵÄID·ÖÅä·þÎñÆ÷»ñÈ¡ self.CheckEmptyPlayerIDCount(db) return self.PopEmptyPlayerID(db) # ´ÓÕ˺űíÖлñÈ¡ def GetAccountFromTable(self, accID, db): accountData = DataServerPlayerData.tagDSAccount() accountData.ACCID = accID collection = db[UCN_DSAccount] accountData.adoLoad(collection) return accountData def CreateRole(self, db, createPlayer): # createPlayer = DataServerPlayerData.tagDBPlayer() # createPlayer.readData(pack.getBuffer(), 1, pack.getLength() - 1) #Ìø¹ýrequestType # createPlayer.IsDeleted = 0 # #ÕʺÅͳһתСд # createPlayer.AccID = createPlayer.AccID.lower() collection = db[UCN_DBPlayer] #¼ì²é¸ÃÕʺÅÊÇ·ñÒÑÓÐÓÐЧ½ÇÉ« if createPlayer.adoLoadCEx(collection, {'AccID':fix_incomingText(createPlayer.AccID), 'IsDeleted':createPlayer.IsDeleted}): mylog.warning('player of accid = %s exists!'%createPlayer.AccID) return 0, disCreatePlayerError_PlayerExist, createPlayer.AccID, '' #¼ì²é½ÇÉ«ÃûÊÇ·ñÖØ¸´ if self.hasPlayerByPlayerName(db, createPlayer.PlayerName): mylog.warning('player of playerName = %s exists!'%createPlayer.PlayerName) return 0, disCreatePlayerError_PlayerNameConflict, createPlayer.AccID, '' #¼Ç¼´´½¨Ê±¼ä createPlayer.CreateRoleTime = CommFuncEx.TDateTimeToString(CommFuncEx.TDateTime_Now()) #Éú³É×ÔÔö³¤µÄplayerID #createPlayer.PlayerID = seq(db, UCN_DBPlayer, 'PlayerID', DBConfig.PLAYERID_FEED, DBConfig.PLAYERID_STEP) newPlayerID = self.DispatchNewPlayerID(db) if newPlayerID == -1: #ID·ÖÅäʧ°Ü msg = error.formatMsg('error', error.ERROR_NO_65, 'PlayerID Dispatch failed!accid = %s'%createPlayer.AccID) mylog.error(msg) return 0, disDataBaseError, createPlayer.AccID, '' createPlayer.PlayerID = newPlayerID createPlayer.PlayerName = "role" + str(newPlayerID) #УÑéͨ¹ý£¬ÍùÊý¾Ý¿âÖвåÈë½ÇÉ« mylog.debug('Before insert role!accid = %s, PlayerName = %s'%(createPlayer.AccID, createPlayer.PlayerName)) if not createPlayer.adoInsertC(collection): msg = error.formatMsg('error', error.ERROR_NO_65, 'insert player failed!accid = %s'%createPlayer.AccID) mylog.error(msg) return 0, disDataBaseError, createPlayer.AccID, '' #²åÈë½ÇÉ«³É¹¦ #¶ÁÈ¡½ÇÉ«ID if not createPlayer.adoLoad(collection): msg = error.formatMsg('error', error.ERROR_NO_66, 'insert player failed!accid = %s'%createPlayer.AccID) mylog.error(msg) return 0, disDataBaseError, createPlayer.AccID, '' mylog.debug('insert role ok!accid = %s, PlayerName = %s'%(createPlayer.AccID, createPlayer.PlayerName)) #¹¹ÔìÆäËû½ÇÉ«³õʼÊý¾Ý itemData = '' itemData = CommFunc.WriteDWORD(itemData, 0) missionData = itemData missionDictData = itemData skillData = itemData bufData = itemData repeatTimeData = itemData horseData = itemData gmOperData = itemData gmPermitData = itemData petData = itemData petSkillData = itemData normalDictData = itemData dienstgradData = itemData battleFormationData = itemData allData = createPlayer.getBuffer() + itemData + missionData + missionDictData + skillData + bufData + repeatTimeData + horseData\ + gmOperData + gmPermitData + petData + petSkillData + normalDictData + dienstgradData+battleFormationData #¼ÆËãCRC crc = crc32(allData) dataCrc = '' dataCrc = CommFunc.WriteDWORD(dataCrc, crc) dataCrc = CommFunc.WriteBYTE(dataCrc, 0) #ServerType dataWithCrc = dataCrc + allData mylog.debug('send created player info for accid = %s'%createPlayer.AccID) result = 1, 0, createPlayer.AccID, dataWithCrc account = self.GetAccountFromTable(createPlayer.AccID, db) #ÐÂÍæ¼Òµ¼Èë - ´´½Ç³É¹¦²½Öèʼþ PegasusCollectorProxy.EventReport(9001, "OperatorID=%s&Step=%s&AccountID=%s&Flag=1000&DeviceFlag=%s"%( account.AppID, 3, CommFunc.GetPlatformAccID(createPlayer.AccID), account.DeviceFlag)) #UTF8 ÐèҪת³Éurl±àÂë²Å¿ÉÓà playerInfo = urllib.urlencode({"OperatorID": account.AppID, "RoleID": createPlayer.PlayerName, "AccountID": CommFunc.GetPlatformAccID(createPlayer.AccID), "Job": createPlayer.Job, "DeviceFlag": account.DeviceFlag, }) PegasusCollectorProxy.EventReport(1103, playerInfo) DataRecordPack.DR_CreateRole(createPlayer) return result def hasPlayerByPlayerName(self, db, playerName): collection = db[UCN_DBPlayer] #¿ªÆôBASE64±àÂëºó£¬ÎÞ·¨½øÐдóСд²»Ãô¸ÐÆ¥Å䣬¼´´óСд²»Ò»ÖµĽÇÉ«ÃûÊÇÔÊÐíµÄÁË resultCollection = collection.find({'PlayerName':fix_incomingText(playerName), 'IsDeleted':0}) return (resultCollection.count() != 0) def readPlayerPackSaveData(self, col, query, structName, checkSID = False): buf = '' docs = col.find(query).limit(1) if not docs.count(): buf = CommFunc.WriteDWORD(buf, docs.count()) return buf obj = structName() doc = list(docs)[0] #ÓÐÊý¾Ý if doc.has_key('__PackSave'): #ÒÔ´ò°ü·½Ê½´æ´¢µÄ docCnt = doc['Count'] result = '' result = CommFunc.WriteDWORD(result, docCnt) mylog.debug('####reading %s of player %s,cnt = %s'%(structName, query, docCnt)) for i in xrange(docCnt): obj.readRecord(doc['%s'%(i+1)]) result += obj.getBuffer() return result else: #ÒÔ·Ç´ò°ü·½Ê½´æ´¢µÄ if checkSID: return obj.adoQueryCustomC(col, query) else: return obj.adoQueryCustom(col, query) def getMergePlayerDataBuffer(self, newPlayerID, structName, data, checkSID = False): ''' »ñÈ¡¿ç·þÍæ¼Òͬ²½Êý¾Ý»º´æbuffer ''' oAllFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_%s_All"%structName) oAllFuncGrade.Start() pos = 0 cnt, pos = CommFunc.ReadDWORD(data, pos) mylog.debug('getMergePlayerDataBuffer %s data, playerID = %s, cnt = %s'%(structName, newPlayerID, cnt)) rec = structName() length = len(data) result = '' result = CommFunc.WriteDWORD(result, cnt) for i in xrange(cnt): oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_%s_clear"%structName) oFuncGrade.Start() rec.clear() oFuncGrade.End() oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_%s_readData"%structName) oFuncGrade.Start() readLen = rec.readData(data, pos, length) oFuncGrade.End() if readLen == -1: mylog.warning('%s'%b2a_hex(data)) return 0, "" pos += readLen #¸üÐÂPlayerID orgPlayerID = 0 if CommFuncEx.hasField(rec, 'PlayerID'): orgPlayerID = rec.PlayerID rec.PlayerID = newPlayerID #¸üÐÂPetID×Ö¶Î if CommFuncEx.hasField(rec, 'PetID'): if orgPlayerID: oldPetID = rec.PetID petIndex = rec.PetID % orgPlayerID - 1 rec.PetID = CommonDefine.makePetID(newPlayerID, petIndex) #¸üÐÂTruckID×Ö¶Î if CommFuncEx.hasField(rec, 'TruckID'): rec.TructID = CommonDefine.makeTruckID(newPlayerID) #¸üÐÂOwnerID×Ö¶Î if CommFuncEx.hasField(rec, 'OwnerID'): if orgPlayerID: oldOwnerID = rec.OwnerID if orgPlayerID != rec.OwnerID: #ÊdzèÎïID£¬ÖØÐ¼ÆËã petIndex = rec.OwnerID % orgPlayerID - 1 rec.OwnerID = CommonDefine.makePetID(newPlayerID, petIndex) else: rec.OwnerID = newPlayerID if checkSID: oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_%s_makeSID"%structName) oFuncGrade.Start() rec.makeSID() oFuncGrade.End() result += rec.getBuffer() oAllFuncGrade.End() return pos, result def onGetMergePlayerDetail(self, db, authPack): ''' »ñÈ¡¿ç·þÍæ¼ÒÏêϸÐÅÏ¢ ''' g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict queryAccid = authPack.AccID mylog.debug('getting mergePlayer detail for accid = %s'%queryAccid) if queryAccid not in g_mergeRegisterPlayerDict: # ²»ÔÚ¿ç·þ»º´æÖеĴӿâÖÐÈ¡ return self.onGetPlayerDetail(db, authPack) #recvPack = MergeServerRecvProtocol.tagLPRegisterPlayer() regPlayerInfo = g_mergeRegisterPlayerDict[queryAccid] recvPack = regPlayerInfo[MergeRegPInfoIndex_PackData] # #¼ÓÉÏCRC # crc = crc32(recvPack.Data) # dataCrc = '' # dataCrc = CommFunc.WriteDWORD(dataCrc, crc) # dataCrc = CommFunc.WriteBYTE(dataCrc, 0) #ServerType # dataWithCrc = dataCrc + recvPack.Data # self.sendOKString(CommonDefine.dgPlayerInit, pack, dataWithCrc) # mylog.debug('onGetMergePlayerDetail OK! accID=%s'%queryAccid) return #=============================================================================== # def __GetMergePlayerName(self, operator, serverID, playerName): # # »ñÈ¡Íæ¼Ò¿ç·þ·þÎñÆ÷ÉϵÄÃû×Ö # # ͨ¹ýÓÎÏ·Õ˺ÅÖÐµÄÆ½Ì¨±êÖ¾»ñÈ¡Ãû³Æ£¬Ä¿Ç°Îªspid # if not DBConfig.NameFormat: # return playerName # # key = ("OpName_%s" % operator).lower() # opName = getattr(DBConfig, key) if hasattr(DBConfig, key) else "" # # return (DBConfig.NameFormat%{"opname":opName, "sid":serverID}).decode('gbk').encode(DBConfig.encoding) + playerName #=============================================================================== def onGetPlayerDetail(self, db, authPack): g_playerDataCntInfo = PyGameData.g_playerDataCntInfo queryAccid = authPack.AccID mylog.info('getting player detail for accid = %s'%queryAccid) #Åж¨ÊÇ·ñÔںϷþÖ®ÖÐ # try: # playerList = self.queryMergePlayerList(db, queryAccid) # except: # #³öÁËÒì³££¬»Ø¸´Êý¾Ý¿â·±Ã¦ # self.sendFailString(CommonDefine.dgPlayerInit, pack, disDataBaseError) # msg = error.formatMsg('error', error.ERROR_NO_67, 'kick accid = %s reason = %s, error :\n %s'%(queryAccid, disDataBaseError, traceback.format_exc())) # mylog.error(msg) # return #if len(playerList) > 0: if False: #ºÏ·þ´¦Àí # sendPack = SendPackProtocol.tagServerMergeInfo() # sendPack.PlayerCount = len(playerList) # for playerDict in playerList: # try: # singlePlayer = SendPackProtocol.tagServerMergePlayer() # leaderFamilyInfo = [] # try: # #²éÑ¯Íæ¼ÒÊÇ·ñ¼Ò×峤 # leaderFamilyInfo = self.getFamilyLeaderFamilyID(db, playerDict['PlayerID']) # except: # self.sendFailString(CommonDefine.dgPlayerInit, pack, disDataBaseError) # msg = error.formatMsg('error', error.ERROR_NO_68, 'kick accid = %s reason = %s'%(queryAccid, disDataBaseError)) # mylog.error(msg) # return # if len(leaderFamilyInfo) > 0: # #¼Ò×峤 # if len(leaderFamilyInfo) > 1: # #´ËÈËÖÁÉÙÊÇÁ½¸ö¼Ò×åµÄ¼Ò×峤£¬ÕâÂß¼­Éϲ»¿ÉÄÜ # self.sendFailString(CommonDefine.dgPlayerInit, pack, disDataBaseError) # msg = error.formatMsg('error', error.ERROR_NO_69, 'kick accid = %s reason = %s'%(queryAccid, disDataBaseError)) # mylog.error(msg) # return # singlePlayer.LeaderFamilyID = leaderFamilyInfo[0]['ID'] # else: # #·Ç¼Ò×峤 # singlePlayer.LeaderFamilyID = 0 # singlePlayer.PlayerID = playerDict['PlayerID'] # singlePlayer.Name = playerDict['PlayerName'] # singlePlayer.Job = playerDict['Job'] # singlePlayer.Sex = playerDict['Sex'] # singlePlayer.LV = playerDict['LV'] # singlePlayer.TotalSTR = playerDict['STR'] # singlePlayer.TotalPNE = playerDict['PNE'] # singlePlayer.TotalPHY = playerDict['PHY'] # singlePlayer.TotalCON = playerDict['CON'] # singlePlayer.Gold = playerDict['Gold'] # singlePlayer.GoldPaper = playerDict['GoldPaper'] # singlePlayer.Silver = playerDict['Silver'] # singlePlayer.SilverPaper = playerDict['SilverPaper'] # singlePlayer.WarehouseGold = playerDict['WarehouseGold'] # singlePlayer.WarehouseSilver = playerDict['WarehouseSilver'] # singlePlayer.FightPower = playerDict['FightPower'] # sendPack.Players.append(singlePlayer) # except KeyError, why: # self.sendFailString(CommonDefine.dgPlayerInit, pack, disDataBaseError) # msg = error.formatMsg('error', error.ERROR_NO_70, 'exception = %s:kick accid = %s reason = %s'%(why, queryAccid, disDataBaseError)) # mylog.error(msg) # return # self.sendOKString(CommonDefine.dgServerMerge, pack, sendPack.GetBuffer()) return else: #·ÇºÏ·þ #¶ÁÈ¡½ÇÉ«»ù±¾ÐÅÏ¢ dbPlayer = DataServerPlayerData.tagDBPlayer() dbPlayer.AccID = queryAccid dbPlayer.IsDeleted = 0 collection = db[UCN_DBPlayer] lastExceptionCnt = getADOExceptionCount() lastSIDErrorCnt = getSIDErrorCnt() loadOK = dbPlayer.adoLoadCEx(collection, {'AccID':fix_incomingText(dbPlayer.AccID), 'IsDeleted':dbPlayer.IsDeleted}) if not lastExceptionCnt == getADOExceptionCount(): #Êý¾Ý¿â¶ÁÈ¡³ö´í£¬µ«²»Ò»¶¨ÊÇUser¿â¶ÁÈ¡³ö´í self.sendFailString(CommonDefine.dgPlayerInit, pack, disDataBaseError) return playerDataCntInfo = g_playerDataCntInfo.get(dbPlayer.PlayerID, {}) #mylog.info('accid = %s,playerID = %s, playerDataCntInfo=%s'%(queryAccid, dbPlayer.PlayerID, playerDataCntInfo)) #UTF8 ÐèҪת³Éurl±àÂë²Å¿ÉÓà #=================================================================== # playerInfo = urllib.urlencode({"RoleID": fix_outgoingText(dbPlayer.PlayerName), # "AccountID": CommFunc.GetPlatformAccID(dbPlayer.AccID), # "IP":getPlayerDetailReq.IP.strip(chr(0)), # "SessionID":PegasusCollectorProxy.GetSessionID(db, dbPlayer.AccID), # "Level":dbPlayer.LV, # "Job":dbPlayer.Job # }) # # #µÇ¼Ê¼þ # PegasusCollectorProxy.EventReport(1100, playerInfo) #=================================================================== if not lastSIDErrorCnt == getSIDErrorCnt(): #SIDУÑé³ö´í£¬·âºÅ if not CommonDefine.isAccStateForbidden(dbPlayer.AccState): if DBConfig.checkSID: #·âºÅ dbPlayer.AccState = CommonDefine.pysSIDCheckErrorForbidden dbPlayer.adoUpdateC(collection) mylog.debug('AccID = %s check SID failed!'%queryAccid) #¼Ç¼Á÷Ïò #=========================================================================== # dbServerLogRec = RecvPackProtocol.tagDBServerLogRec() # dbServerLogRec.Type = CommonDefine.gstSavePlayerLog # dbServerLogRec.Oper = 119 #·âºÅÁ÷Ïò # dbServerLogRec.Time = time() # dbServerLogRec.MapID = 0 # dbServerLogRec.PlayerID = dbPlayer.PlayerID # dbServerLogRec.Msg = 'ADO SID Check Error !' # dbServerLogRec.MsgLen = len(dbServerLogRec.Msg) # self.sendDBRequest(dbServerLogRec.GetBuffer()) #=========================================================================== #ÁíÍ⣬¶ÀÁ¢¼ÇÂ¼Íæ¼Ò·âºÅÈÕÖ¾ # dbPlayerInfoLogForbidden = RecvPackProtocol.tagDBPlayerInfoLogForbidden() # dbPlayerInfoLogForbidden.AccID = dbPlayer.AccID # dbPlayerInfoLogForbidden.IsForbidden = True # dbPlayerInfoLogForbidden.ForbiddenTime = time() # sendPackBuf = '' # sendPackBuf = CommFunc.WriteBYTE(sendPackBuf, CommonDefine.gstSavePlayerInfoLogOnForbidden) # sendPackBuf = CommFunc.WriteString(sendPackBuf, dbPlayerInfoLogForbidden.GetLength(), dbPlayerInfoLogForbidden.GetBuffer()) # self.ctrlDBManager.sendDBRequest(sendPackBuf) self.sendAccForbiddenLogReq(dbPlayer.AccID, 1) #ÐÞ¸ÄÀ´C++Ô­À´µÄÂß¼­ #»Ø¸´LoginServer if DBConfig.checkSID: self.sendFailString(CommonDefine.dgPlayerInit, pack, disAccStateError) return cntError = False #¶ÁÈ¡ÎïÆ·µÈÆäËûÊý¾Ý #Èç¹ûûÓбØÒª£¬¾Í²»Ö§³Öµ¥±íģʽÁË #¶ÁÈ¡ÎïÆ· queryDict = {'PlayerID':dbPlayer.PlayerID} collectionName = UCN_RoleItem collection = db[collectionName] itemData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleItem, True) itemCnt = CommFunc.ReadDWORD(itemData, 0) lastCnt = playerDataCntInfo.get(collectionName) cntError = cntError or (lastCnt != None and itemCnt[0] != lastCnt) mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, itemCnt[0], lastCnt)) #¶ÁÈ¡ºÍ´æ´¢Ê±½«Êý¾ÝDUMP³öÀ´£¬·½±ã²éÖ¤´ÜºÅÎÊÌâ collectionName = UCN_RoleMission collection = db[collectionName] missionData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMission) missionCnt = CommFunc.ReadDWORD(missionData, 0) lastCnt = playerDataCntInfo.get(collectionName) cntError = cntError or (lastCnt != None and missionCnt[0] != lastCnt) mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, missionCnt[0], lastCnt)) #¶ÁÈ¡ºÍ´æ´¢Ê±½«Êý¾ÝDUMP³öÀ´£¬·½±ã²éÖ¤´ÜºÅÎÊÌâ collectionName = UCN_RoleMissionDict collection = db[collectionName] roleMissionDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMissionDict) missonDictCnt = CommFunc.ReadDWORD(roleMissionDictData, 0) lastCnt = playerDataCntInfo.get(collectionName) cntError = cntError or (lastCnt != None and missonDictCnt[0] != lastCnt) mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, missonDictCnt[0], lastCnt)) collectionName = UCN_RoleSkill collection = db[collectionName] roleSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleSkill) skillCnt = CommFunc.ReadDWORD(roleSkillData, 0) lastCnt = playerDataCntInfo.get(collectionName) cntError = cntError or (lastCnt != None and skillCnt[0] != lastCnt) mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, skillCnt[0], lastCnt)) collectionName = UCN_RoleBuff collection = db[collectionName] roleBuffData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleBuff) bufCnt = CommFunc.ReadDWORD(roleBuffData, 0) lastCnt = playerDataCntInfo.get(collectionName) cntError = cntError or (lastCnt != None and bufCnt[0] != lastCnt) mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, bufCnt[0], lastCnt)) collectionName = UCN_RoleRepeatTime collection = db[collectionName] roleRepeatTimeData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleRepeatTime) repeatTimeCnt = CommFunc.ReadDWORD(roleRepeatTimeData, 0) lastCnt = playerDataCntInfo.get(collectionName) cntError = cntError or (lastCnt != None and repeatTimeCnt[0] != lastCnt) mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, repeatTimeCnt[0], lastCnt)) collectionName = UCN_PlayerHorseTable collection = db[collectionName] roleHorseData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerHorseTable) horseCnt = CommFunc.ReadDWORD(roleHorseData, 0) lastCnt = playerDataCntInfo.get(collectionName) cntError = cntError or (lastCnt != None and horseCnt[0] != lastCnt) mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, horseCnt[0], lastCnt)) collectionName = UCN_GMOper collection = db[collectionName] gmOperData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagGMOper) gmOperCnt = CommFunc.ReadDWORD(gmOperData, 0) lastCnt = playerDataCntInfo.get(collectionName) cntError = cntError or (lastCnt != None and gmOperCnt[0] != lastCnt) mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, gmOperCnt[0], lastCnt)) collectionName = UCN_RolePet collection = db[collectionName] rolePetData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRolePet) petCnt = CommFunc.ReadDWORD(rolePetData, 0) lastCnt = playerDataCntInfo.get(collectionName) cntError = cntError or (lastCnt != None and petCnt[0] != lastCnt) mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, petCnt[0], lastCnt)) collectionName = UCN_PetSkill collection = db[collectionName] petSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPetSkill) petSkillCnt = CommFunc.ReadDWORD(petSkillData, 0) lastCnt = playerDataCntInfo.get(collectionName) cntError = cntError or (lastCnt != None and petSkillCnt[0] != lastCnt) mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, petSkillCnt[0], lastCnt)) collectionName = UCN_RoleNomalDict collection = db[collectionName] roleNormalDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleNomalDict) dictCnt = CommFunc.ReadDWORD(roleNormalDictData, 0) lastCnt = playerDataCntInfo.get(collectionName) cntError = cntError or (lastCnt != None and dictCnt[0] != lastCnt) mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, dictCnt[0], lastCnt)) collectionName = UCN_PlayerDienstgrad collection = db[collectionName] roleDienstgradData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerDienstgrad) roleDienstgradCnt = CommFunc.ReadDWORD(roleDienstgradData, 0) lastCnt = playerDataCntInfo.get(collectionName) cntError = cntError or (lastCnt != None and roleDienstgradCnt[0] != lastCnt) mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, roleDienstgradCnt[0], lastCnt)) collectionName = UCN_BattleFormation collection = db[collectionName] battleFormationData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagBattleFormation) battleFormationCnt = CommFunc.ReadDWORD(battleFormationData, 0) lastCnt = playerDataCntInfo.get(collectionName) cntError = cntError or (lastCnt != None and battleFormationCnt[0] != lastCnt) mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, battleFormationCnt[0], lastCnt)) if cntError: mylog.info("###dgPlayerInit cntError accid = %s" % queryAccid) PegasusCollectorProxy.ErrorReport("login data cntError accid=%s" % queryAccid) dbIni = ConfigParser.ConfigParser() # ÿ´ÎÖØÐ¼ÓÔØ£¬È·±£ËæÊ±ÐÞ¸ÄÓÐЧ dbIni.read(os.path.join(GlobalFunctions.getAppPath(), 'PyMongoDataServer.ini')) DataCntErrorKick = dbIni.has_option("dataset", "DataCntErrorKick") and (dbIni.getint("dataset", "DataCntErrorKick") == 1) # Êý¾Ý´æÈ¡ÌõÊýÒ쳣ʱÊÇ·ñ½ûÖ¹µÇ¼ if DataCntErrorKick: self.sendFailString(CommonDefine.dgPlayerInit, pack, disAccStateError) return #·âÍ£¼ì²é if dbPlayer.AccState == CommonDefine.pysForbidden: #GM·âºÅ gmOperRec = self.extractGMOper(queryAccid, CommonDefine.gmForbidAcc, gmOperData) if gmOperRec: #ÕÒµ½·âºÅ²Ù×÷ if gmOperRec.EndTime > CommFuncEx.TDateTime_Now(): #·âºÅÉÐδ½áÊø,Ìßµô self.sendFailString(CommonDefine.dgPlayerInit, pack, disAccStateError) return else: #·âºÅʱ¼äÒѵ½£¬½â·â msg = 'Time past.EndTime = %s.Reason = %s'%(CommFuncEx.TDateTimeToString(gmOperRec.EndTime), gmOperRec.Msg) self.unFobbidenAcc(db, dbPlayer, gmOperRec.GMAccID, msg) mylog.info('auto unforbidden accid = %s msg = %s'%(queryAccid, msg)) else: #δÕÒµ½ÁË·âºÅ¼Ç¼,½â·â msg = 'No forbidden oper found!' self.unFobbidenAcc(db, dbPlayer, '', msg) mylog.info('auto unforbidden accid = %s msg = %s'%(queryAccid, msg)) elif dbPlayer.AccState == CommonDefine.pysSIDCheckErrorForbidden: #Êý¾ÝÒì³£·âÍ£ self.sendFailString(CommonDefine.dgPlayerInit, pack, disAccStateError) return #¶ÁÈ¡½ûÖ¹IPÊý¾Ý gmIP = DataServerPlayerData.tagDBGMIP() gmIP.AccID = queryAccid.lower() collection = db[UCN_DBGMIP] gmIPData = gmIP.adoQueryIndex(collection) gmIPCnt = CommFunc.ReadDWORD(gmIPData, 0) mylog.info('gmIP cnt = %s'%gmIPCnt[0]) allData = dbPlayer.getBuffer() + itemData + missionData + roleMissionDictData + roleSkillData + roleBuffData + roleRepeatTimeData + roleHorseData + gmOperData\ + gmIPData + rolePetData + petSkillData + roleNormalDictData + roleDienstgradData+battleFormationData #¼ÓÉÏCRC crc = crc32(allData) dataCrc = '' dataCrc = CommFunc.WriteDWORD(dataCrc, crc) dataCrc = CommFunc.WriteBYTE(dataCrc, 0) #ServerType dataWithCrc = dataCrc + allData #self.sendOKString(CommonDefine.dgPlayerInit, pack, dataWithCrc) sendPack = SendPackProtocol.tagMapServerPlayerLogin() sendPack.Type = CommonDefine.dgPlayerInit sendPack.ServerRoleIndex = authPack.ServerRoleIndex sendPack.SessionID = authPack.SessionID sendPack.ClientIP = authPack.IP sendPack.PlayerInfoPack = dataWithCrc sendPack.PlayerInfoPackLen = len(dataWithCrc) col = db[UCN_DSAccount] dbDoc = DataServerPlayerData.tagDSAccount() dbDoc.AccID = queryAccid dbDoc.adoLoadC(col) sendPack.PlayerAccountInfo = dbDoc.getBuffer() sendPack.PlayerAccountInfoLen = dbDoc.getLength() sendPack.MapID = GameWorld.GetGameWorld().GetMapID() NetPackCommon.SendPyPackToMapServerSelf(sendPack.GetBuffer(), sendPack.GetLength()) mylog.info('gstPlayerDetail Send accid = %s playerID = %s'%(queryAccid, dbPlayer.PlayerID)) def unFobbidenAcc(self, db, dbPlayer, gmAccid, msg): # dbPlayer = DataServerPlayerData.tagDBPlayer() # dbPlayer.AccID = accid.lower() dbPlayer.AccState = CommonDefine.pysNormal collection = db[UCN_DBPlayer] dbPlayer.adoUpdateExC(collection, {"AccID":fix_incomingText(dbPlayer.AccID), "IsDeleted":dbPlayer.IsDeleted}) #д½â·âÈÕÖ¾ self.onForbiddenUpdate(dbPlayer.AccID, dbPlayer.PlayerID, False, CommFuncEx.TDateTime_Now(), 0, gmAccid, msg) def onForbiddenUpdate(self, accid, playerID, isForbidden, operTime, timeLimit, operGMAccid, msg): mylog.info('accid = %s playerID = %s isForbidden = %s operTime = %s timeLimit = %s operGMAccid = %s msg = %s'% (accid, playerID, isForbidden, ctime(operTime), timeLimit, operGMAccid, msg)) # dbPlayerFobiddenLogReq = '' # dbPlayerFobiddenLogReq = CommFunc.WriteBYTE(dbPlayerFobiddenLogReq, CommonDefine.gstSavePlayerInfoLogOnForbidden) # dbPlayerFobiddenLog = DataServerLogData.tagDBPlayerInfoLogForbidden() # dbPlayerFobiddenLog.AccID = accid.lower() # dbPlayerFobiddenLog.IsForbidden = isForbidden # dbPlayerFobiddenLog.ForbiddenTime = operTime # dbPlayerFobiddenLogReq = CommFunc.WriteString(dbPlayerFobiddenLogReq, dbPlayerFobiddenLog.getLength(), dbPlayerFobiddenLog.getBuffer()) # self.sendDBRequest(dbPlayerFobiddenLogReq) self.sendAccForbiddenLogReq(accid.lower(), isForbidden) accForbiddenLogReq = '' accForbiddenLogReq = CommFunc.WriteBYTE(accForbiddenLogReq, CommonDefine.gstAccForbiddenLog) accForbiddenLog = DataServerLogData.tagAccForbiddenLog() accForbiddenLog.AccID = accid.lower() accForbiddenLog.PlayerID = playerID accForbiddenLog.Oper = isForbidden accForbiddenLog.OperTime = operTime accForbiddenLog.TimeLimit = timeLimit accForbiddenLog.GMAccID = operGMAccid accForbiddenLog.Msg = msg accForbiddenLogReq = CommFunc.WriteString(accForbiddenLogReq, accForbiddenLog.getLength(), accForbiddenLog.getBuffer()) self.sendDBRequest(accForbiddenLogReq) def extractGMOper(self, accid, gmOper, gmOperData): pos = 0 operCnt, pos = CommFunc.ReadDWORD(gmOperData, pos) mylog.info('accid = %s gmOperCnt = %s'%(accid, operCnt)) gmOperRec = DataServerPlayerData.tagGMOper() for i in xrange(operCnt): pos += gmOperRec.readData(gmOperData, pos) if gmOperRec.Oper == gmOper: return gmOperRec return None # def isGMOperOverdue(self, accid, gmOper, gmOperData): # pass def getFamilyLeaderFamilyID(self, db, leaderID): collection = db[UCN_FamilyInfo] familyInfoSnap = list(collection.find({'LeaderID':leaderID}, ['ID'])) return familyInfoSnap def queryMergePlayerList(self, db, accid): '''²éѯ´¦ÓںϷþ״̬µÄ½ÇÉ«Áбí''' collection = db[UCN_DBPlayer] playerList = list(collection.find({'AccID':fix_incomingText(accid), 'IsDeleted':0, 'AccState':CommonDefine.pysServerMerge})) if self.translator: playerList = self.translator.transform_outgoing(playerList, None) return playerList # Íæ¼ÒµÇ¼ £ºÑéÖ¤Õ˺Å-ÈôûÓнÇÉ«Ôò´´½Ç-·µ»Ø½ÇÉ«ÐÅÏ¢ def onAuthentication(self, db, pack): '''ÕʺÅÈÏÖ¤''' authPack = RecvPackProtocol.tagDataServerPlayerLogin() authPack.ReadData(pack.getBuffer(), 0, pack.getLength()) accountRec = DataServerPlayerData.tagDSAccount() authPack.AccID = authPack.AccID.lower().strip(chr(0)) authAccID = authPack.AccID accountRec.ACCID = authAccID # g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict # if self.IsMergeServer() and authAccID in g_mergeRegisterPlayerDict: # mylog.info('auth mergeServer Player accid = %s...'%authAccID) # self.sendOKString(CommonDefine.dgPlayerLogin, pack, accountRec.getBuffer()) # return True mylog.debug('auth accid = %s-%s...'%(authAccID, authPack.IDType)) #ÔÚÊý¾Ý¿â²éÕÒ´ËÕʺŠcollection = db[UCN_DSAccount] appType = int(authPack.IDType) # ͨµÀ·½±êʶ ### ----À©Õ¹×ֶΠĬÈÏͳһԼ¶¨ | ·Ö¸î£¬µÚÒ»¸öΪSPID£¬µÚ¶þ¸öΪÉ豸Ψһ±êʶ£¬ÆäËûΪ¸÷ƽ̨ÐÅÏ¢×Ô¶¨Ò壬loginserverÆ´½ÓÕ˺ÅʹÓà ### ----×îºóÒ»¸öΪԭʼµÄÇþµÀÕ˺ţ¬loginserverÌí¼Ó£¬ÒòΪÓÎÏ·ÖÐÓõÄÕ˺Ŷ¼ÊÇСд ### ----µ¹ÊýµÚ¶þ¸öΪ¿Í»§¶Ë´ò°ü°æ±¾ºÅ # ×¢Ò⣺ÄÚÍøµÇ¼ExtraµÄÊý¾ÝΪ¿Õ£¬login²¹ÁËÊý¾Ý redefineIndex = 2 # ¸÷ƽ̨²»Í¬¶¨ÒåÊý¾ÝµÄË÷ÒýÆðµã if appType == CommonDefine.gitFreeSDK: #¶ÁÈ¡¾ÉÊý¾Ý 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 = authPack.Psw.strip(chr(0)) accountRec.Adult = authPack.Adult accountRec.RegIP = authPack.IP.strip(chr(0)) # RegIP µ±×öµÇ¼IPÓà 2018-03-03 #=================================================================== # if not CommonDefine.IsDebug() and DBConfig.PlatformName != accountRec.AppID: # mylog.debug('appid fail:%s'%(accountRec.AppID)) # #´Ë´¦ÈçÓбØÒª¿ÉÒÔ¼ÓÉÏ Çø·þÑéÖ¤£¬Òª¿¼ÂǺϷþ¡¢¿ç·þ¡¢»ì·þ # self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError) # return True #=================================================================== #if "@test@" in accountRec.ACCID or "@yun@" in accountRec.ACCID or accountRec.RegIP == "127.0.0.1": if CommonDefine.IsDebug() or accountRec.RegIP == "127.0.0.1": #debugÄÚ²¿·þÎñÆ÷²»ÑéÖ¤token, ÍÑ»ú¹ÒÍæ¼Ò²»ÑéÖ¤ mylog.debug('iner no check') pass else: if (accountRec.Psw != "7758520"): self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError) return True elif appType == CommonDefine.gitQkGame: #¶ÁÈ¡¾ÉÊý¾Ý, Óõ½À©Õ¹×Ö¶Î 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.sendFailString(CommonDefine.dgPlayerLogin, pack, 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¸öÍæ¼ÒÑéÖ¤£¬ºóÃæ²»ÑéÖ¤ values = {'token' : token, 'product_code' : CommFunc.GetLoginKey(authAccID, accountRec.AppID),#"96065423134516611008224414549989", 'uid' : uid } try: data = urllib.urlencode(values) # ½ÚÊ¡ÅäÖø´ÔÓ¶È Ð´ËÀµØÖ· req = urllib2.Request("http://checkuser.sdk.quicksdk.net/v2/checkUserInfo", data) response = urllib2.urlopen(req, timeout=1) the_page = response.read() if the_page != "1": mylog.debug('checktoken fail:%s-%s'%(token, the_page)) self.sendFailString(CommonDefine.dgPlayerLogin, pack, 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.gitHYGame: #¶ÁÈ¡¾ÉÊý¾Ý, Óõ½À©Õ¹×Ö¶Î 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.sendFailString(CommonDefine.dgPlayerLogin, pack, 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¸öÍæ¼ÒÑéÖ¤£¬ºóÃæ²»ÑéÖ¤ values = {'token' : token, 'product_code' : CommFunc.GetLoginKey(authAccID, accountRec.AppID),#"96065423134516611008224414549989", 'uid' : uid } try: data = urllib.urlencode(values) # ½ÚÊ¡ÅäÖø´ÔÓ¶È Ð´ËÀµØÖ· req = urllib2.Request("http://checkuser.happilygame.com/v2/checkUserInfo", data) response = urllib2.urlopen(req, timeout=1) the_page = response.read() if the_page != "1": mylog.debug('checktoken fail:%s-%s'%(token, the_page)) self.sendFailString(CommonDefine.dgPlayerLogin, pack, 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.gitX7: #¶ÁÈ¡¾ÉÊý¾Ý, Óõ½À©Õ¹×Ö¶Î 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 + 1: self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError) return True token = extraList[redefineIndex] if accountRec.RegIP == "127.0.0.1": #debugÄÚ²¿·þÎñÆ÷²»ÑéÖ¤token, ÍÑ»ú¹ÒÍæ¼Ò²»ÑéÖ¤ mylog.debug('iner no check') else: # urlµÄ·ÃÎÊûÓжàÏß³Ì ÓпÉÄܵ¼ÖµÇ¼¶Ñ»ý¿¨¶ÙµÄÏÖÏó if self.loginHeap < 5: # 10ÃëÄÚǰX¸öÍæ¼ÒÑéÖ¤£¬ºóÃæ²»ÑéÖ¤ values = {'tokenkey' : token, 'channel' : accountRec.AppID, 'guid' : CommFunc.GetPlatformAccID(authAccID) } try: data = urllib.urlencode(values) # ½ÚÊ¡ÅäÖø´ÔÓ¶È Ð´ËÀµØÖ· urlList = DBConfig.ReportUrl.split("/") tmpurl = "/".join(urlList[:3]) + "/centerapi/checkuser.php?" + data mylog.debug(tmpurl) req = urllib2.Request(tmpurl) response = urllib2.urlopen(req, timeout=1) the_page = response.read() 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) return True except: pass nowTime = time() if nowTime - self.loginStartTime < 10: self.loginHeap += 1 else: self.loginStartTime = nowTime self.loginHeap = 0 else: #ÐèÒªÌí¼ÓÒì³£¼ÆÊýºó¼ÌÐø lastExceptionCnt = getADOExceptionCount() lastSIDErrorCnt = getSIDErrorCnt() if not accountRec.adoLoadC(collection): if lastExceptionCnt != getADOExceptionCount(): #Êý¾Ý¿â·ÃÎÊÒì³£ mylog.warning('DB access excption!') self.sendFailString(CommonDefine.dgPlayerLogin, pack, disDataBaseError) return True if lastSIDErrorCnt == getSIDErrorCnt(): #Óû§È·Êµ²»´æÔÚ mylog.warning('accid = %s not found!'%authPack.AccID) self.sendFailString(CommonDefine.dgPlayerLogin, pack, disUserNameNotExist) return True elif DBConfig.checkSID: #Sid²»¶Ô ÌßÈË mylog.debug("authPack.AccID = %s, sid error"%authPack.AccID) self.sendFailString(CommonDefine.dgPlayerLogin, pack, 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) return True # ¼Ç¼É豸Ψһʶ±ðÂë if authPack.Extra: infoList = authPack.Extra.split("|") if len(infoList) > 3: accountRec.DeviceFlag = md5.md5(infoList[1]).hexdigest() # µ¹ÊýµÚ¶þ¸öÔªËØÎª¿Í»§¶Ë°æ±¾ºÅ Ïɱ¦ÆæÔµÐ¶¨Òå accountRec.SetClientVersion(infoList[-2]) PegasusCollectorProxy.EventReport(9001, "OperatorID=%s&Step=%s&AccountID=%s&Flag=1000&DeviceFlag=%s"%( accountRec.AppID, 1, CommFunc.GetPlatformAccID(authAccID), accountRec.DeviceFlag)) #ÕʺÅÃÜÂëÑé֤ͨ¹ý£¬¸üÐÂÀۼƵǼ´ÎÊý accountRec.LogNum += 1 accountRec.LastLoginTime= CommFuncEx.TDateTimeToString(CommFuncEx.TDateTime_Now()) if not accountRec.adoCheckUpdateC(collection): #¸üÐÂʧ°Ü mylog.warning('%s update LogNum error'%authPack.AccID) self.sendFailString(CommonDefine.dgPlayerLogin, pack, disDataBaseError) return True Player = DataServerPlayerData.tagDBPlayer() Player.AccID = authPack.AccID #ÕʺÅͳһתСд Player.IsDeleted = 0 collection = db[UCN_DBPlayer] lastExceptionCnt = getADOExceptionCount() lastSIDErrorCnt = getSIDErrorCnt() #¼ì²é¸ÃÕʺÅÊÇ·ñÒÑÓÐÓÐЧ½ÇÉ« if Player.adoLoadCEx(collection, {'AccID':fix_incomingText(Player.AccID), 'IsDeleted':Player.IsDeleted}): mylog.info('player of accid = %s exists!'%Player.AccID) #·µ»Ø½ÇÉ«ÐÅÏ¢ if self.IsMergeServer(): self.onGetMergePlayerDetail(db, authPack) else: self.onGetPlayerDetail(db, authPack) else: #disCreatePlayerError_PlayerExist if not lastExceptionCnt == getADOExceptionCount(): #Êý¾Ý¿â¶ÁÈ¡³ö´í£¬µ«²»Ò»¶¨ÊÇUser¿â¶ÁÈ¡³ö´í #·µ»ØµÇ½ʧ°ÜÌßÏÂÏß return True elif not lastSIDErrorCnt == getSIDErrorCnt(): #·µ»ØµÇ½ʧ°ÜÌßÏÂÏß return True else: #´´½ÇÉ« Player.LV = 1 #ÊýÖµÔÝʱ°´¾ÉÏîÄ¿ÅäÖ㬿ɸü¸Ä Player.Sex = 1 Player.Hair = 10002 Player.HairColor = 1 Player.PlayerType = 1 Player.Job = 1 Player.Country = 1 Player.MapID = GameWorld.GetGameWorld().GetMapID() Player.DataMapID = Player.MapID Player.CopyMapID = Player.MapID Player.PosX = 10 Player.PosY = 10 Player.HP = 10 Player.UseGoldType = 1 Player.UseSilverType = 3 Suc, disCode, AccId, data = self.CreateRole(db, Player) if not Suc: #·µ»ØµÇ½ʧ°ÜÌßÏÂÏß return True else: #Ö±½Ó·µ»ØÊý¾Ý sendPack = SendPackProtocol.tagMapServerPlayerLogin() sendPack.Type = CommonDefine.dgPlayerInit sendPack.ServerRoleIndex = authPack.ServerRoleIndex sendPack.SessionID = authPack.SessionID sendPack.ClientIP = authPack.IP sendPack.PlayerInfoPack = data sendPack.PlayerInfoPackLen = len(data) sendPack.PlayerAccountInfo = accountRec.getBuffer() sendPack.PlayerAccountInfoLen = accountRec.getLength() sendPack.MapID = GameWorld.GetGameWorld().GetMapID() mylog.info('gstPlayerDetail Send OnCreate accid = %s'%(accountRec.ACCID)) NetPackCommon.SendPyPackToMapServerSelf(sendPack.GetBuffer(), sendPack.GetLength()) return True def sendOKString(self, type, fromPacket, buf): #µÈ¼ÛÓÚChinDataServer AODThread.SendOKString # packBuf = '' # packBuf = CommFunc.WriteBYTE(packBuf, type) # packBuf = CommFunc.WriteBYTE(packBuf, 1) #ʧ°Ü # packBuf = CommFunc.WriteString(packBuf, len(buf), buf) # self.sendString(fromPacket, packBuf) return def sendFailString(self, type, fromPacket = 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 onGMCmdListReq(self, db, pack): #Òѷϳý pass def onGetGameServerPlayerData(self, db, pack): data = '' #Íæ¼Ò´ò°üÊý¾Ý±í½Ï´ó£¬²»Í¬²½GameServer£¬ÓÉdb×Ô¼º¹ÜÀí #collection = db[UCN_DBPlayerPackData] #DBPlayerPackData = DataServerPlayerData.tagDBPlayerPackData() #data += DBPlayerPackData.adoQueryAll(collection) #mylog.debug("tagDBPlayerPackData ok") collection = db[UCN_DBGameRec] DBGameRec = DataServerPlayerData.tagDBGameRec() data += DBGameRec.adoQueryAll(collection) mylog.debug("tagDBGameRec ok") collection = db[UCN_DBPyFuncTeam] DBPyFuncTeam = DataServerPlayerData.tagDBPyFuncTeam() data += DBPyFuncTeam.adoQueryAll(collection) mylog.debug("tagDBPyFuncTeam ok") collection = db[UCN_DBPyFuncTeamMem] DBPyFuncTeamMem = DataServerPlayerData.tagDBPyFuncTeamMem() data += DBPyFuncTeamMem.adoQueryAll(collection) mylog.debug("tagDBPyFuncTeamMem ok") collection = db[UCN_DBPlayerRecData] DBPlayerRecData = DataServerPlayerData.tagDBPlayerRecData() data += DBPlayerRecData.adoQueryAll(collection) mylog.debug("tagDBPlayerRecData ok") collection = db[UCN_DBPyMineAreaAward] DBPyMineAreaAward = DataServerPlayerData.tagDBPyMineAreaAward() data += DBPyMineAreaAward.adoQueryAll(collection) mylog.debug("tagDBPyMineAreaAward ok") collection = db[UCN_DBPyMineAreaRecord] DBPyMineAreaRecord = DataServerPlayerData.tagDBPyMineAreaRecord() data += DBPyMineAreaRecord.adoQueryAll(collection) mylog.debug("tagDBPyMineAreaRecord ok") collection = db[UCN_DBPyMineAreaItem] DBPyMineAreaItem = DataServerPlayerData.tagDBPyMineAreaItem() data += DBPyMineAreaItem.adoQueryAll(collection) mylog.debug("tagDBPyMineAreaItem ok") collection = db[UCN_DBPyCouple] DBPyCouple = DataServerPlayerData.tagDBPyCouple() data += DBPyCouple.adoQueryAll(collection) mylog.debug("tagDBPyCouple ok") collection = db[UCN_DBPyUnNotifyLoveGiftRec] DBPyUnNotifyLoveGiftRec = DataServerPlayerData.tagDBPyUnNotifyLoveGiftRec() data += DBPyUnNotifyLoveGiftRec.adoQueryAll(collection) mylog.debug("tagDBPyUnNotifyLoveGiftRec ok") collection = db[UCN_DBPyCharmValueRec] DBPyCharmValueRec = DataServerPlayerData.tagDBPyCharmValueRec() data += DBPyCharmValueRec.adoQueryAll(collection) mylog.debug("tagDBPyCharmValueRec ok") collection = db[UCN_DBPyPlayerIntimacy] DBPyPlayerIntimacy = DataServerPlayerData.tagDBPyPlayerIntimacy() data += DBPyPlayerIntimacy.adoQueryAll(collection) mylog.debug("tagDBPyPlayerIntimacy ok") collection = db[UCN_DBCrossPersonalCompensation] DBCrossPersonalCompensation = DataServerPlayerData.tagDBCrossPersonalCompensation() data += DBCrossPersonalCompensation.adoQueryAll(collection) mylog.debug("tagDBCrossPersonalCompensation ok") collection = db[UCN_DBCrossBillboard] DBCrossBillboard = DataServerPlayerData.tagDBCrossBillboard() data += DBCrossBillboard.adoQueryAll(collection) mylog.debug("tagDBCrossBillboard ok") collection = db[UCN_DBAssistThanks] DBAssistThanks = DataServerPlayerData.tagDBAssistThanks() data += DBAssistThanks.adoQueryAll(collection) mylog.debug("tagDBAssistThanks ok") collection = db[UCN_DBAssist] DBAssist = DataServerPlayerData.tagDBAssist() data += DBAssist.adoQueryAll(collection) mylog.debug("tagDBAssist ok") collection = db[UCN_PlayerViewCachePy] PlayerViewCachePy = DataServerPlayerData.tagPlayerViewCachePy() data += PlayerViewCachePy.adoQueryAll(collection) mylog.debug("tagPlayerViewCachePy ok") collection = db[UCN_DBAuctionAttention] AuctionAttentionInfo = DataServerPlayerData.tagDBAuctionAttention() data += AuctionAttentionInfo.adoQueryAll(collection) mylog.debug("tagDBAuctionAttention ok") collection = db[UCN_DBAuctionRecord] AuctionRecordInfo = DataServerPlayerData.tagDBAuctionRecord() data += AuctionRecordInfo.adoQueryAll(collection) mylog.debug("tagDBAuctionRecord ok") collection = db[UCN_DBAuctionItem] AuctionItemInfo = DataServerPlayerData.tagDBAuctionItem() data += AuctionItemInfo.adoQueryAll(collection) mylog.debug("tagDBAuctionItem ok") collection = db[UCN_DBCrossPKUnNotifyOverInfo] crossPKOverInfo = DataServerPlayerData.tagDBCrossPKUnNotifyOverInfo() data += crossPKOverInfo.adoQueryAll(collection) mylog.debug("tagDBCrossPKUnNotifyOverInfo ok") collection = db[UCN_DBCrossPKBillboard] crossPK = DataServerPlayerData.tagDBCrossPKBillboard() data += crossPK.adoQueryAll(collection) mylog.debug("tagDBCrossPKBillboard ok") collection = db[UCN_DBPyXMZZ] XMZZ = DataServerPlayerData.tagDBPyXMZZ() data += XMZZ.adoQueryAll(collection) mylog.debug("tagDBPyXMZZ ok") collection = db[UCN_DBPySealDemonRecord] sealDemonRecord = DataServerPlayerData.tagDBPySealDemonRecord() data += sealDemonRecord.adoQueryAll(collection) mylog.debug("tagDBPySealDemonRecord ok") collection = db[UCN_DBPyBossAttention] bossAttention = DataServerPlayerData.tagDBPyBossAttention() data += bossAttention.adoQueryAll(collection) mylog.debug("tagDBPyBossAttention ok") collection = db[UCN_DBPyBourseItemLastPrice] bourseItemLastPrice = DataServerPlayerData.tagDBPyBourseItemLastPrice() data += bourseItemLastPrice.adoQueryAll(collection) mylog.debug("tagDBPyBourseItemLastPrice ok") collection = db[UCN_DBPyBourseRecord] bourseRecord = DataServerPlayerData.tagDBPyBourseRecord() data += bourseRecord.adoQueryAll(collection) mylog.debug("tagDBPyBourseRecord ok") collection = db[UCN_DBPyFamilyStoreItem] familyStoreItem = DataServerPlayerData.tagDBPyFamilyStoreItem() data += familyStoreItem.adoQueryAll(collection) mylog.debug("tagDBPyFamilyStoreItem ok") collection = db[UCN_DBPyPlayerFriend] playerFriend = DataServerPlayerData.tagDBPyPlayerFriend() data += playerFriend.adoQueryAll(collection) mylog.debug("tagDBPyPlayerFriend ok") collection = db[UCN_PlayerEnemy] playerEnemy = DataServerPlayerData.tagPlayerEnemy() data += playerEnemy.adoQueryAll(collection) mylog.debug("tagPlayerEnemy ok") collection = db[UCN_DBPyPlayerContacts] playerContacts = DataServerPlayerData.tagDBPyPlayerContacts() data += playerContacts.adoQueryAll(collection) mylog.debug("tagDBPyPlayerContacts ok") collection = db[UCN_DBPyPlayerBlack] playerBlacklist = DataServerPlayerData.tagDBPyPlayerBlack() data += playerBlacklist.adoQueryAll(collection) mylog.debug("tagDBPyPlayerBlack ok") collection = db[UCN_PersonalSocial] playerSocial = DataServerPlayerData.tagPersonalSocial() data += playerSocial.adoQueryAll(collection) mylog.debug("tagPersonalSocial ok") collection = db[UCN_PlayerTeamTable] playerTeam = DataServerPlayerData.tagPlayerTeamTable() data += playerTeam.adoQueryAll(collection) mylog.debug("tagPlayerTeamTable ok") collection = db[UCN_TeamMemberTable] teamMember = DataServerPlayerData.tagTeamMemberTable() data += teamMember.adoQueryAll(collection) mylog.debug("tagTeamMemberTable ok") collection = db[UCN_FamilyInfo] familyInfo = DataServerPlayerData.tagFamilyInfo() data += familyInfo.adoQueryAll(collection) mylog.debug("tagFamilyInfo ok") collection = db[UCN_PlayerFamily] playerFamily = DataServerPlayerData.tagPlayerFamily() data += playerFamily.adoQueryAll(collection) mylog.debug("tagPlayerFamily ok") collection = db[UCN_DBFamilyVS] familyVS = DataServerPlayerData.tagDBFamilyVS() data += familyVS.adoQueryAll(collection) mylog.debug("tagDBFamilyVS ok") collection = db[UCN_GameWorldEvent] gameWorldEvent = DataServerPlayerData.tagGameWorldEvent() data += gameWorldEvent.adoQueryAll(collection) mylog.debug("tagGameWorldEvent ok") collection = db[UCN_DBMissionPub] missionPub = DataServerPlayerData.tagDBMissionPub() data += missionPub.adoQueryAll(collection) mylog.debug("tagDBMissionPub ok") collection = db[UCN_DBIPManage] ipManage = DataServerPlayerData.tagDBIPManage() data += ipManage.adoQueryAll(collection) mylog.debug("tagDBIPManage ok") collection = db[UCN_DBGameServerEventTrig] gameServerEventTrig = DataServerPlayerData.tagDBGameServerEventTrig() data += gameServerEventTrig.adoQueryAll(collection) mylog.debug("tagDBGameServerEventTrig ok") collection = db[UCN_DBCountryInfo] countryInfo = DataServerPlayerData.tagDBCountryInfo() data += countryInfo.adoQueryAll(collection) mylog.debug("tagDBCountryInfo ok") collection = db[UCN_DBCountryFamilyWarResult] countryFamilyWarResult = DataServerPlayerData.tagDBCountryFamilyWarResult() data += countryFamilyWarResult.adoQueryAll(collection) mylog.debug("tagDBCountryFamilyWarResult ok") collection = db[UCN_DBCountryFamilyWarRace] countryFamilyWarRace = DataServerPlayerData.tagDBCountryFamilyWarRace() data += countryFamilyWarRace.adoQueryAll(collection) mylog.debug("tagDBCountryFamilyWarRace ok") collection = db[UCN_DBCountryFamilyWarRequest] countryFamilyWarReq = DataServerPlayerData.tagDBCountryFamilyWarRequest() data += countryFamilyWarReq.adoQueryAll(collection) mylog.debug("tagDBCountryFamilyWarRequest ok") collection = db[UCN_DBBillboard] billboard = DataServerPlayerData.tagDBBillboard() data += billboard.adoQueryAll(collection) mylog.debug("tagDBBillboard ok") collection = db[UCN_DBGoldOrderForm] goldOrderForm = DataServerPlayerData.tagDBGoldOrderForm() data += goldOrderForm.adoQueryAll(collection) mylog.debug("tagDBGoldOrderForm ok") collection = db[UCN_DBOverdueGoldOrderForm] overdueGoldOrderForm = DataServerPlayerData.tagDBOverdueGoldOrderForm() data += overdueGoldOrderForm.adoQueryAll(collection) mylog.debug("tagDBOverdueGoldOrderForm ok") collection = db[UCN_DBUnclaimedGoldForm] unclaimeGoldForm = DataServerPlayerData.tagDBUnclaimedGoldForm() data += unclaimeGoldForm.adoQueryAll(collection) collection = db[UCN_DBFamilyTech] familyTech = DataServerPlayerData.tagDBFamilyTech() data += familyTech.adoQueryAll(collection) mylog.debug("tagDBFamilyTech ok") collection = db[UCN_DBPlayerLabel] playrLabel = DataServerPlayerData.tagDBPlayerLabel() data += playrLabel.adoQueryAll(collection) mylog.debug("tagDBPlayerLabel ok") collection = db[UCN_DBPlayerRecall] playerRecall = DataServerPlayerData.tagDBPlayerRecall() data += playerRecall.adoQueryAll(collection) mylog.debug("tagDBPlayerRecall ok") collection = db[UCN_DBVsReward] dbVSReward = DataServerPlayerData.tagDBVsReward() data += dbVSReward.adoQueryAll(collection) mylog.debug("tagDBVsReward ok") collection = db[UCN_DBFamilyReward] dbFamilyReward = DataServerPlayerData.tagDBFamilyReward() data += dbFamilyReward.adoQueryAll(collection) mylog.debug("tagDBFamilyReward ok") collection = db[UCN_DBFamilyRewardRec] dbFamilyRewardRec = DataServerPlayerData.tagDBFamilyRewardRec() data += dbFamilyRewardRec.adoQueryAll(collection) mylog.debug("tagDBFamilyRewardRec ok") collection = db[UCN_DBFamilyAction] dbFamilyAction = DataServerPlayerData.tagDBFamilyAction() data += dbFamilyAction.adoQueryAll(collection) mylog.debug("tagDBFamilyAction ok") collection = db[UCN_GameFBPassRec] dbGameFBPassRec = DataServerPlayerData.tagGameFBPassRec() data += dbGameFBPassRec.adoQueryAll(collection) mylog.debug("tagGameFBPassRec ok") collection = db[UCN_UniversalGameRec] dbUniversalGameRec = DataServerPlayerData.tagUniversalGameRec() data += dbUniversalGameRec.adoQueryAll(collection) mylog.debug("tagUniversalGameRec ok") collection = db[UCN_GameGroup] dbGameGroup = DataServerPlayerData.tagGameGroup() data += dbGameGroup.adoQueryAll(collection) mylog.debug("tagGameGroup ok") collection = db[UCN_GameGroupMember] dbGameGroupMember = DataServerPlayerData.tagGameGroupMember() data += dbGameGroupMember.adoQueryAll(collection) mylog.debug("tagGameGroupMember ok") collection = db[UCN_GameGroupMutualInfo] dbGameGroupMutualInfo = DataServerPlayerData.tagGameGroupMutualInfo() data += dbGameGroupMutualInfo.adoQueryAll(collection) mylog.debug("tagGameGroupMutualInfo ok") collection = db[UCN_GameBourseItem] dbGameBourseItem = DataServerPlayerData.tagGameBourseItem() data += dbGameBourseItem.adoQueryAll(collection) mylog.debug("tagGameBourseItem ok") collection = db[UCN_HighLadderPlayer] dbHighLadderPlayer = DataServerPlayerData.tagHighLadderPlayer() data += dbHighLadderPlayer.adoQueryAll(collection) mylog.debug("tagHighLadderPlayer ok") collection = db[UCN_DBHighLadderItem] dbDBHighLadderItem = DataServerPlayerData.tagDBHighLadderItem() data += dbDBHighLadderItem.adoQueryAll(collection) mylog.debug("tagDBHighLadderItem ok") collection = db[UCN_HighLadderVSRec] dbHighLadderVSRec = DataServerPlayerData.tagHighLadderVSRec() data += dbHighLadderVSRec.adoQueryAll(collection) mylog.debug("tagHighLadderVSRec ok") collection = db[UCN_DBCompensationItem] dbDBCompensationItem = DataServerPlayerData.tagDBCompensationItem() data += dbDBCompensationItem.adoQueryAll(collection) mylog.debug("tagDBCompensationItem ok") collection = db[UCN_DBPersonalCompensation] dbDBPersonalCompensation = DataServerPlayerData.tagDBPersonalCompensation() data += dbDBPersonalCompensation.adoQueryAll(collection) mylog.debug("tagDBPersonalCompensation ok") collection = db[UCN_DBEntireCompensationRequire] dbDBEntireCompensationRequire = DataServerPlayerData.tagDBEntireCompensationRequire() data += dbDBEntireCompensationRequire.adoQueryAll(collection) mylog.debug("tagDBEntireCompensationRequire ok") collection = db[UCN_CompensationPlayerRec] dbCompensationPlayerRec = DataServerPlayerData.tagCompensationPlayerRec() data += dbCompensationPlayerRec.adoQueryAll(collection) mylog.debug("tagCompensationPlayerRec ok") collection = db[UCN_PlayerViewCache] dbPlayerViewCache = DataServerPlayerData.tagPlayerViewCache() data += dbPlayerViewCache.adoQueryAll(collection) mylog.debug("tagPlayerViewCache ok") #ѹËõ try: #mylog.debug("unzip data = %s, len = %d"%(binascii.b2a_hex(data), len(data))) compressData = zlib.compress(data, 9) #×î´óѹËõ except: msg = error.formatMsg('fatal', error.ERROR_NO_75, 'Compress game server player data failed!error =\n%s'%traceback.format_exc()) mylog.fatal(msg) return #·¢ËÍǰ´òÉϰ汾ºÅ SendData ='' SendData = CommFunc.WriteDWORD(SendData,VersionNoDefine.GAMESERVER_GAMEWORLD_DATA_VERSION_NO) SendData+=compressData self.sendGameServerString(pack, CommonDefine.dgGameServerData, SendData) mylog.info('Game server player data send ok! len = %d'%(len(data))) def onSaveGameServerData(self, db, pack): #//Êý¾Ý¿â±£´ægamedata#tagGDGameServerGameData # #struct tagGDPlayerGameData #{ # DWORD PlayerID; # DWORD DataLen; # char Data[DataLen]; //size = DataLen #}; # #struct tagGBGameServerBackUpData #{ # DWORD GameDataLen; # char GameData[GameDataLen]; //size = GameDataLen # WORD PlayerGameDataCount; # tagGDPlayerGameData PlayerGameData[PlayerGameDataCount]; //size = PlayerGameDataCount #}; # #struct tagGDGameServerGameData #{ # WORD Mark; # WORD VersionNO; //°æ±¾ºÅ # DWORD CRC; # tagGBGameServerBackUpData GameServerBackUpData; #}; # //GameServer±£´æÊý¾Ý#tagGameServerToBalanceServerSaveData #struct tagGameServerToBalanceServerSaveData #{ # BYTE PackDir; # BYTE PackType; # BYTE NeedReturn; # BYTE Type; # String Data; #}; #Õâ¸ö·â°üÌØÊ⣬ÎÞ·¨×Ô¶¯Éú³É´úÂë pos = 1 #Ìø¹ýgstSaveGameServerData #tagGameServerToBalanceServerSaveData needReturn, pos = CommFunc.ReadBYTE(pack.getBuffer(), pos) type, pos = CommFunc.ReadBYTE(pack.getBuffer(), pos) self.saveGameServerGameData(db, pack, pack.getBuffer(), pos, type, needReturn) def saveGameServerGameData(self, db, pack, data, pos, saveType, needReturn): if saveType == CommonDefine.dgGameServerCrashData: #FileLog.getLogger('GameServerDataRestoreLog').info('½âÎö±ÀÀ£Êý¾ÝÖС£¡£¡£') #tagGDGameServerGameData mark, pos = CommFunc.ReadWORD(data, pos) versionNO, pos = CommFunc.ReadWORD(data, pos) crc, pos = CommFunc.ReadDWORD(data, pos) #tagGBGameServerBackUpData gameDataLen, pos = CommFunc.ReadDWORD(data, pos) gameData, pos = CommFunc.ReadString(data, pos, gameDataLen) #=================================================================== # #ÔÝÎÞGameServer¸öÈËÐÅÏ¢ # playerGameDataCount, pos = CommFunc.ReadWORD(data, pos) # playerSaveDataList = [] # for recIndex in xrange(playerGameDataCount): # #tagGDPlayerGameData # playerID, pos = CommFunc.ReadDWORD(data, pos) # playerDataLen, pos = CommFunc.ReadDWORD(data, pos) # playerData, pos = CommFunc.ReadString(data, pos, playerDataLen) # # SinglePlayerSaveData = (playerID, playerData) # playerSaveDataList.append(SinglePlayerSaveData) #=================================================================== #Êý¾Ý°æ±¾Ð£Ñé if gameDataLen: if not versionNO == VersionNoDefine.GAMESERVER_GAMEWORLD_DATA_VERSION_NO: msg = error.formatMsg('fatal', error.ERROR_NO_76, 'Save game server crash data error:data version conflict!versionNO = %s, db version = %s'%(versionNO, VersionNoDefine.GAMESERVER_GAMEWORLD_DATA_VERSION_NO)) mylog.fatal(msg) #FileLog.getLogger('GameServerDataRestoreLog').fatal('±ÀÀ£Êý¾Ý°æ±¾ºÅУÑéʧ°Ü(Èç¹ûÊǸüа汾£¬ÇëÆô¶¯¾É°æ±¾·þÎñÆ÷µ¼Èë±ÀÀ£Êý¾ÝÊÔÊÔ)') #Êý¾ÝÊÇѹËõÊý¾Ý DataDumper.DumpData(os.path.join(GlobalFunctions.getAppPath(), CommonDefine.DUMP_PATH), 'tagGDGameServerGameData', '0.mdat', data) return True #УÑéͨ¹ý£¬´æµ½Êý¾Ý¿â #´æ´¢ÊÀ½çÊý¾Ý try: #mylog.debug("Compress GameData = %s"%b2a_hex(gameData)) decompressGameData = zlib.decompress(gameData) pyDataLen, pyDataHex = decompressGameData.split('|', 1) pyDataLen = int(pyDataLen) mylog.debug("disCompresspydata len %s, GameData = %s"%(pyDataLen, pyDataHex[:pyDataLen])) decompressGameData = binascii.a2b_hex(pyDataHex[:pyDataLen]) + pyDataHex[pyDataLen:] except: msg = error.formatMsg('error', error.ERROR_NO_77, 'Decompress game server world data failed!error = \n%s'%traceback.format_exc()) mylog.error(msg) #FileLog.getLogger('GameServerDataRestoreLog').fatal('±ÀÀ£Êý¾Ý½âѹʧ°Ü£¬¿ÉÄÜÊÇÊý¾ÝËð»µ.') else: #³É¹¦½âѹ£¬´æµ½Êý¾Ý¿â #FileLog.getLogger('GameServerDataRestoreLog').info('±ÀÀ£Êý¾Ý½âѹ³É¹¦!¿ªÊ¼±£´æ¡£¡£¡£') mylog.info('Decompress game server world data success, len = %d!saving...'%len(decompressGameData)) #mylog.debug("GameData = %s"%b2a_hex(decompressGameData)) gameDataReadPos = 0 try: #gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerPackData, DataServerPlayerData.tagDBPlayerPackData, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGameRec, DataServerPlayerData.tagDBGameRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFuncTeam, DataServerPlayerData.tagDBPyFuncTeam, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFuncTeamMem, DataServerPlayerData.tagDBPyFuncTeamMem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerRecData, DataServerPlayerData.tagDBPlayerRecData, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaAward, DataServerPlayerData.tagDBPyMineAreaAward, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaRecord, DataServerPlayerData.tagDBPyMineAreaRecord, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaItem, DataServerPlayerData.tagDBPyMineAreaItem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyCouple, DataServerPlayerData.tagDBPyCouple, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyUnNotifyLoveGiftRec, DataServerPlayerData.tagDBPyUnNotifyLoveGiftRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyCharmValueRec, DataServerPlayerData.tagDBPyCharmValueRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerIntimacy, DataServerPlayerData.tagDBPyPlayerIntimacy, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossPersonalCompensation, DataServerPlayerData.tagDBCrossPersonalCompensation, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossBillboard, DataServerPlayerData.tagDBCrossBillboard, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAssistThanks, DataServerPlayerData.tagDBAssistThanks, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAssist, DataServerPlayerData.tagDBAssist, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerViewCachePy, DataServerPlayerData.tagPlayerViewCachePy, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAuctionAttention, DataServerPlayerData.tagDBAuctionAttention, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAuctionRecord, DataServerPlayerData.tagDBAuctionRecord, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAuctionItem, DataServerPlayerData.tagDBAuctionItem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossPKUnNotifyOverInfo, DataServerPlayerData.tagDBCrossPKUnNotifyOverInfo, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossPKBillboard, DataServerPlayerData.tagDBCrossPKBillboard, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyXMZZ, DataServerPlayerData.tagDBPyXMZZ, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPySealDemonRecord, DataServerPlayerData.tagDBPySealDemonRecord, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyBossAttention, DataServerPlayerData.tagDBPyBossAttention, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyBourseItemLastPrice, DataServerPlayerData.tagDBPyBourseItemLastPrice, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyBourseRecord, DataServerPlayerData.tagDBPyBourseRecord, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFamilyStoreItem, DataServerPlayerData.tagDBPyFamilyStoreItem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerFriend, DataServerPlayerData.tagDBPyPlayerFriend, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerEnemy, DataServerPlayerData.tagPlayerEnemy, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerContacts, DataServerPlayerData.tagDBPyPlayerContacts, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerBlack, DataServerPlayerData.tagDBPyPlayerBlack, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PersonalSocial, DataServerPlayerData.tagPersonalSocial, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerTeamTable, DataServerPlayerData.tagPlayerTeamTable, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_TeamMemberTable, DataServerPlayerData.tagTeamMemberTable, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_FamilyInfo, DataServerPlayerData.tagFamilyInfo, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerFamily, DataServerPlayerData.tagPlayerFamily, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyVS, DataServerPlayerData.tagDBFamilyVS, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameWorldEvent, DataServerPlayerData.tagGameWorldEvent, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBMissionPub, DataServerPlayerData.tagDBMissionPub, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBIPManage, DataServerPlayerData.tagDBIPManage, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGameServerEventTrig, DataServerPlayerData.tagDBGameServerEventTrig, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryInfo, DataServerPlayerData.tagDBCountryInfo, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryFamilyWarResult, DataServerPlayerData.tagDBCountryFamilyWarResult, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryFamilyWarRace, DataServerPlayerData.tagDBCountryFamilyWarRace, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryFamilyWarRequest, DataServerPlayerData.tagDBCountryFamilyWarRequest, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBBillboard, DataServerPlayerData.tagDBBillboard, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGoldOrderForm, DataServerPlayerData.tagDBGoldOrderForm, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBOverdueGoldOrderForm, DataServerPlayerData.tagDBOverdueGoldOrderForm, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBUnclaimedGoldForm, DataServerPlayerData.tagDBUnclaimedGoldForm, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyTech, DataServerPlayerData.tagDBFamilyTech, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerLabel, DataServerPlayerData.tagDBPlayerLabel, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerRecall, DataServerPlayerData.tagDBPlayerRecall, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBVsReward, DataServerPlayerData.tagDBVsReward, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyReward, DataServerPlayerData.tagDBFamilyReward, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyRewardRec, DataServerPlayerData.tagDBFamilyRewardRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyAction, DataServerPlayerData.tagDBFamilyAction, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameFBPassRec, DataServerPlayerData.tagGameFBPassRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_UniversalGameRec, DataServerPlayerData.tagUniversalGameRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameGroup, DataServerPlayerData.tagGameGroup, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameGroupMember, DataServerPlayerData.tagGameGroupMember, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameGroupMutualInfo, DataServerPlayerData.tagGameGroupMutualInfo, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameBourseItem, DataServerPlayerData.tagGameBourseItem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_HighLadderPlayer, DataServerPlayerData.tagHighLadderPlayer, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBHighLadderItem, DataServerPlayerData.tagDBHighLadderItem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_HighLadderVSRec, DataServerPlayerData.tagHighLadderVSRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCompensationItem, DataServerPlayerData.tagDBCompensationItem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPersonalCompensation, DataServerPlayerData.tagDBPersonalCompensation, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBEntireCompensationRequire, DataServerPlayerData.tagDBEntireCompensationRequire, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_CompensationPlayerRec, DataServerPlayerData.tagCompensationPlayerRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerViewCache, DataServerPlayerData.tagPlayerViewCache, db) #gameDataReadPos = self.savePlayerDeleteFriendData(decompressGameData, gameDataReadPos, RecvPackProtocol.tagDeleteFriendKey, UCN_PlayerFriend, db) mylog.info('Save game server world data ok!') #FileLog.getLogger('GameServerDataRestoreLog').info('ϵͳ±ÀÀ£Êý¾Ý±£´æ³É¹¦!') except CommonDefine.ShortBuf: msg = error.formatMsg('error', error.ERROR_NO_78, 'Short data buf, ignore...') mylog.error(msg) #FileLog.getLogger('GameServerDataRestoreLog').fatal('±ÀÀ£Êý¾Ý¿ÉÄܲ»ÍêÕû') #=========================================================== # FileLog.getLogger('GameServerDataRestoreLog').info('±¾´ÎGameServer±ÀÀ£Êý¾Ý°üº¬ÒÔÏÂ%s¸öÍæ¼ÒÊý¾Ý'%len(playerSaveDataList)) # mylog.info('Saving game server player data,playerCnt = %s'%len(playerSaveDataList)) # #´æ´¢Íæ¼ÒÊý¾Ý # for rec in playerSaveDataList: # playerID, playerSaveData = rec # playerDataReadPos = 0 # try: # playerDataReadPos = self.saveGameServerPlayerData(playerID, playerSaveData, playerDataReadPos, 'tagPlayerEnemy', DataServerPlayerData.tagPlayerEnemy, db) # playerDataReadPos = self.saveGameServerPlayerData(playerID, playerSaveData, playerDataReadPos, 'tagPlayerFriend', DataServerPlayerData.tagPlayerFriend, db) # except CommonDefine.ShortBuf: # msg = error.formatMsg('error', error.ERROR_NO_79, 'Not completed player data found!PlayerID = %s data = %s'%(playerID, playerSaveData)) # mylog.error(msg) # FileLog.getLogger('GameServerDataRestoreLog').fatal('±¾´ÎGameServer±ÀÀ£Êý¾ÝµÄÍæ¼ÒºÃÓѺͳðÈËÊý¾Ý¿ÉÄܲ»ÍêÕû£¡') # continue # FileLog.getLogger('GameServerDataRestoreLog').info('PlayerID = %s'%(playerID)) #=========================================================== #FileLog.getLogger('GameServerDataRestoreLog').info('±¾´ÎGameServer±ÀÀ£Êý¾Ý±£´æ³É¹¦£¡') mylog.info('Save game server player data ok!') else: mylog.info('Empty crash data,ignore...') #FileLog.getLogger('GameServerDataRestoreLog').info('ÎÞ±ÀÀ£Êý¾Ý...') #»Ø±¨ sendPack = SendPackProtocol.tagDBUpdateReturn() 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()) elif saveType == 0: #tagGameServerToBalanceServerSaveData gameData = data[pos:] decompressGameDataLen = 0 if gameData: #´æ´¢ÊÀ½çÊý¾Ý try: #mylog.debug("Compress len %s, GameData = %s"%(len(gameData), b2a_hex(gameData))) decompressGameData = zlib.decompress(gameData) pyDataLen, pyDataHex = decompressGameData.split('|', 1) pyDataLen = int(pyDataLen) mylog.debug("disCompresspydata len %s, GameData = %s"%(pyDataLen, pyDataHex[:pyDataLen])) decompressGameData = binascii.a2b_hex(pyDataHex[:pyDataLen]) + pyDataHex[pyDataLen:] except: msg = error.formatMsg('error', error.ERROR_NO_80, 'Decompress game server world data failed! error = \n%s'%traceback.format_exc()) mylog.error(msg) else: #³É¹¦½âѹ£¬´æµ½Êý¾Ý¿â decompressGameDataLen = len(decompressGameData) mylog.info('Decompress game server world data success, len = %s!saving...'%decompressGameDataLen) #mylog.debug("GameData = %s"%b2a_hex(decompressGameData)) gameDataReadPos = 0 try: #gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerPackData, DataServerPlayerData.tagDBPlayerPackData, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGameRec, DataServerPlayerData.tagDBGameRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFuncTeam, DataServerPlayerData.tagDBPyFuncTeam, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFuncTeamMem, DataServerPlayerData.tagDBPyFuncTeamMem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerRecData, DataServerPlayerData.tagDBPlayerRecData, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaAward, DataServerPlayerData.tagDBPyMineAreaAward, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaRecord, DataServerPlayerData.tagDBPyMineAreaRecord, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaItem, DataServerPlayerData.tagDBPyMineAreaItem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyCouple, DataServerPlayerData.tagDBPyCouple, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyUnNotifyLoveGiftRec, DataServerPlayerData.tagDBPyUnNotifyLoveGiftRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyCharmValueRec, DataServerPlayerData.tagDBPyCharmValueRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerIntimacy, DataServerPlayerData.tagDBPyPlayerIntimacy, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossPersonalCompensation, DataServerPlayerData.tagDBCrossPersonalCompensation, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossBillboard, DataServerPlayerData.tagDBCrossBillboard, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAssistThanks, DataServerPlayerData.tagDBAssistThanks, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAssist, DataServerPlayerData.tagDBAssist, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerViewCachePy, DataServerPlayerData.tagPlayerViewCachePy, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAuctionAttention, DataServerPlayerData.tagDBAuctionAttention, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAuctionRecord, DataServerPlayerData.tagDBAuctionRecord, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAuctionItem, DataServerPlayerData.tagDBAuctionItem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossPKUnNotifyOverInfo, DataServerPlayerData.tagDBCrossPKUnNotifyOverInfo, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossPKBillboard, DataServerPlayerData.tagDBCrossPKBillboard, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyXMZZ, DataServerPlayerData.tagDBPyXMZZ, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPySealDemonRecord, DataServerPlayerData.tagDBPySealDemonRecord, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyBossAttention, DataServerPlayerData.tagDBPyBossAttention, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyBourseItemLastPrice, DataServerPlayerData.tagDBPyBourseItemLastPrice, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyBourseRecord, DataServerPlayerData.tagDBPyBourseRecord, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFamilyStoreItem, DataServerPlayerData.tagDBPyFamilyStoreItem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerFriend, DataServerPlayerData.tagDBPyPlayerFriend, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerEnemy, DataServerPlayerData.tagPlayerEnemy, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerContacts, DataServerPlayerData.tagDBPyPlayerContacts, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerBlack, DataServerPlayerData.tagDBPyPlayerBlack, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PersonalSocial, DataServerPlayerData.tagPersonalSocial, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerTeamTable, DataServerPlayerData.tagPlayerTeamTable, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_TeamMemberTable, DataServerPlayerData.tagTeamMemberTable, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_FamilyInfo, DataServerPlayerData.tagFamilyInfo, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerFamily, DataServerPlayerData.tagPlayerFamily, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyVS, DataServerPlayerData.tagDBFamilyVS, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameWorldEvent, DataServerPlayerData.tagGameWorldEvent, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBMissionPub, DataServerPlayerData.tagDBMissionPub, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBIPManage, DataServerPlayerData.tagDBIPManage, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGameServerEventTrig, DataServerPlayerData.tagDBGameServerEventTrig, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryInfo, DataServerPlayerData.tagDBCountryInfo, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryFamilyWarResult, DataServerPlayerData.tagDBCountryFamilyWarResult, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryFamilyWarRace, DataServerPlayerData.tagDBCountryFamilyWarRace, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryFamilyWarRequest, DataServerPlayerData.tagDBCountryFamilyWarRequest, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBBillboard, DataServerPlayerData.tagDBBillboard, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGoldOrderForm, DataServerPlayerData.tagDBGoldOrderForm, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBOverdueGoldOrderForm, DataServerPlayerData.tagDBOverdueGoldOrderForm, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBUnclaimedGoldForm, DataServerPlayerData.tagDBUnclaimedGoldForm, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyTech, DataServerPlayerData.tagDBFamilyTech, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerLabel, DataServerPlayerData.tagDBPlayerLabel, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerRecall, DataServerPlayerData.tagDBPlayerRecall, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBVsReward, DataServerPlayerData.tagDBVsReward, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyReward, DataServerPlayerData.tagDBFamilyReward, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyRewardRec, DataServerPlayerData.tagDBFamilyRewardRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyAction, DataServerPlayerData.tagDBFamilyAction, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameFBPassRec, DataServerPlayerData.tagGameFBPassRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_UniversalGameRec, DataServerPlayerData.tagUniversalGameRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameGroup, DataServerPlayerData.tagGameGroup, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameGroupMember, DataServerPlayerData.tagGameGroupMember, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameGroupMutualInfo, DataServerPlayerData.tagGameGroupMutualInfo, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameBourseItem, DataServerPlayerData.tagGameBourseItem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_HighLadderPlayer, DataServerPlayerData.tagHighLadderPlayer, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBHighLadderItem, DataServerPlayerData.tagDBHighLadderItem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_HighLadderVSRec, DataServerPlayerData.tagHighLadderVSRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCompensationItem, DataServerPlayerData.tagDBCompensationItem, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPersonalCompensation, DataServerPlayerData.tagDBPersonalCompensation, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBEntireCompensationRequire, DataServerPlayerData.tagDBEntireCompensationRequire, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_CompensationPlayerRec, DataServerPlayerData.tagCompensationPlayerRec, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerViewCache, DataServerPlayerData.tagPlayerViewCache, db) #gameDataReadPos = self.savePlayerDeleteFriendData(decompressGameData, gameDataReadPos, RecvPackProtocol.tagDeleteFriendKey, UCN_PlayerFriend, db) mylog.info('Save game server world data ok!') except CommonDefine.ShortBuf: msg = error.formatMsg('error', error.ERROR_NO_81, 'Short data buf, ignore...') mylog.error(msg) else: mylog.info('Empty crash data,ignore...') #»Ø±¨ if needReturn == 1: sendPack = SendPackProtocol.tagDBUpdateReturn() 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()) mylog.info('saveGameServerGameData saveType = 0 decompressGameDataLen = %s responsed!'%decompressGameDataLen) elif saveType == CommonDefine.dgPlayerMailList: self.savePlayerMailData(data[pos:], "tagDBMailList", DataServerPlayerData.tagDBMailList, db) elif saveType == CommonDefine.dgPlayerMailItemList: self.savePlayerMailData(data[pos:], "tagDBMailItemList", DataServerPlayerData.tagDBMailItemList, db) else: mylog.warning('saveType = %s not processed!'%saveType) def saveGameServerPlayerData(self, playerID, data, pos, collectionName, structName, db): if pos >= len(data): raise CommonDefine.ShortBuf(collectionName) recCnt, pos = CommFunc.ReadDWORD(data, pos) mylog.info('Saving %s cnt = %s playerID = %s'%(collectionName, recCnt, playerID)) #ɾ³ý¾ÉÊý¾Ý collection = db[collectionName] rec = structName() rec.PlayerID = playerID rec.adoDeleteByIndex(collection) #²åÈëÐÂÊý¾Ý docs = [] for i in xrange(0, recCnt): rec.clear() readLen = rec.readData(data, pos, len(data)) if readLen == -1: raise CommonDefine.ShortBuf(collectionName) pos += readLen docs.append(rec.getRecord()) if not docs: return pos trycnt = 0 while(True): try: collection.insert(docs, False, True) break except pymongo.errors.PyMongoError, err: if(DBConfig.TryCntOnWriteFail > trycnt): trycnt += 1 continue addADOExceptionCount() mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec)) msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(playerID, err, trycnt)) mylog.error(msg) return pos return pos def savegameServerWorldData(self, data, pos, collectionName, structName, db): if pos >= len(data): mylog.info('!!!Saving Error %s cnt = %s'%(collectionName, pos)) raise CommonDefine.ShortBuf(collectionName) recCnt, pos = CommFunc.ReadDWORD(data, pos) mylog.info('Saving %s cnt = %s'%(collectionName, recCnt)) # structNameParts = structName.split('.') # collectionnName = structNameParts[len(structNameParts) - 1] collection = db[collectionName] db.drop_collection(collection) docs = [] rec = structName() for i in xrange(0, recCnt): rec.clear() readLen = rec.readData(data, pos, len(data)) rec.dumpString() if -1 == readLen: mylog.error('%s.%s readData failed, index = %s'%(self.__class__.__name_, inspect.stack()[0][3], i) ) raise CommonDefine.ShortBuf(collectionName) #Èç¹û¶ÁÈ¡³ö´í£¬ºóÃæÈ«´íÁË pos += readLen # rec.adoInsert(collection) #ÓÅ»¯£¬¸Ä³ÉÅú²åÈë docs.append(rec.getRecord()) if not docs: return pos trycnt = 0 while True: try: max_size = 1024 * 1024 * 16 docsStrLen = len(str(docs)) if docsStrLen <= max_size: collection.insert(docs, False, True) else: insertTimes = int(math.ceil(docsStrLen / float(max_size))) # ·ÖÅú²åÈë´ÎÊý perTimeCount = len(docs) / insertTimes # ÿ´Î²åÈëÌõÊý mylog.info(' insertTimes=%s,perTimeCount=%s' % (insertTimes, perTimeCount)) for i in range(insertTimes): start = i * perTimeCount if i == insertTimes - 1: insDocs = docs[start:] else: insDocs = docs[start:start + perTimeCount] collection.insert(insDocs, False, True) break except pymongo.errors.OperationFailure, err: if(DBConfig.TryCntOnWriteFail > trycnt): trycnt += 1 continue addADOExceptionCount() mylog.info("%s.%s save %s failed!"%(self.__class__.__name__, inspect.stack()[0][3], docs)) mylog.error('%s.%s, error = %s, trycnt = %s'%(self.__class__.__name__, inspect.stack()[0][3], err, trycnt)) return pos return pos def savePlayerDeleteFriendData(self, data, pos, packStruct, collectionName, db): if pos >= len(data): raise CommonDefine.ShortBuf(collectionName) recCnt, pos = CommFunc.ReadDWORD(data, pos) mylog.info('Saving PlayerDeleteFriend data Cnt = %s'%recCnt) collection = db[collectionName] rec = packStruct() #playerFriend = structName() for i in xrange(0, recCnt): readLen = rec.ReadData(data, pos, len(data)) if -1 == readLen: raise CommonDefine.ShortBuf(collectionName) pos += readLen #ɾ³ýºÃÓÑ #playerFriend.PlayerID = rec.PlayerID #playerFriend.FriendID = rec.FriendID trycnt = 0 while True: try: collection.remove({'PlayerID':rec.PlayerID, 'FriendID':rec.FriendID}) collection.remove({'PlayerID':rec.FriendID, 'FriendID':rec.PlayerID}) break except pymongo.errors.OperationFailure, err: if(DBConfig.TryCntOnWriteFail > trycnt): trycnt += 1 continue addADOExceptionCount() mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec.PlayerID)) mylog.error('delete failure!PlayerID = %s, error = %s, trycnt = %d'%(rec.PlayerID, err, trycnt)) return pos return pos def savePlayerMailData(self, data, collectionName, structName, db): if data: if len(data) < 4: msg = error.formatMsg('error', error.ERROR_NO_82, "invalid player mail data, collectionName = %s", collectionName) mylog.error(msg) return pos = 0 recCnt, pos = CommFunc.ReadDWORD(data, pos) mylog.info('Saving %s cnt = %s'%(collectionName, recCnt)) # structNameParts = structName.split('.') # collectionnName = structNameParts[len(structNameParts) - 1] collection = db[collectionName] # db.drop_collection(collection) rec = structName() datalen = len(data) for i in xrange(recCnt): rec.clear() readLen = rec.readData(data, pos, datalen) if -1 == readLen: raise CommonDefine.ShortBuf(collectionName) #Èç¹û¶ÁÈ¡³ö´í£¬ºóÃæÈ«´íÁË pos += readLen rec.adoInsert(collection) else: mylog.info("empty player mail list data, collectionName = %s", collectionName) # loginserver·¢À´µÄ ÕʺÅ×ʼֻÔÚÔËÓªÉÌÄÇ±ß def OnInsertAcc(self, db, pack): data = pack.getBuffer() pos = 0 datalen = len(data) try: oTypeSend = RecvPackProtocol.tagBDStringTypeSend() pos = oTypeSend.ReadData(data, pos, datalen) Acc = DataServerPlayerData.tagDSAccount() Acc.readData(oTypeSend.Data, 0, oTypeSend.DataLen) Acc.RegisterTime= CommFuncEx.TDateTimeToString(CommFuncEx.TDateTime_Now()) collection = db[UCN_DSAccount] if not Acc.adoInsertC(collection): self.sendFailString(CommonDefine.dgInsertAcc, pack, 0) return False self.sendOKString(CommonDefine.dgInsertAcc, pack, "") return True except: msg = error.formatMsg('error', error.ERROR_NO_83, "Insert Acc failed, accid = %s, error = \n%s"%(Acc.ACCID, traceback.format_exc())) mylog.error(msg) return False def OnPlayerIDMarkDeleted(self, db, pack): data = pack.getBuffer() datalen = len(data) pos = 0 try: oMarkPlayerDeleted = RecvPackProtocol.tagMarkPlayerDeleted() pos = oMarkPlayerDeleted.ReadData(data, pos, datalen) col = db[UCN_DBPlayer] oPlayer = DataServerPlayerData.tagDBPlayer() oPlayer.PlayerID = oMarkPlayerDeleted.PlayerID SidErrorCnt = getSIDErrorCnt() if not oPlayer.adoLoadC(col): if SidErrorCnt == getSIDErrorCnt(): return False if DBConfig.checkSID: return False oPlayer.IsDeleted = 1 if not oPlayer.adoUpdateExC(col, {'AccID':fix_incomingText(oPlayer.AccID), 'PlayerID':oPlayer.PlayerID}): return False #======================================================================================= # oDBServerLogRec = RecvPackProtocol.tagDBServerLogRec() # oDBServerLogRec.Type = CommonDefine.gstSavePlayerLog # oDBServerLogRec.Oper = 81 # oDBServerLogRec.Time = time() # oDBServerLogRec.MapID = 1 # oDBServerLogRec.PlayerID = oMarkPlayerDeleted.PlayerID # # self.sendDBRequest(oDBServerLogRec.GetBuffer()) #======================================================================================= return True except: msg = error.formatMsg('error', error.ERROR_NO_84, "OnPlayerIDMarkDeleted failed! Playerid = %d, exception = %s"%(oMarkPlayerDeleted.PlayerID, traceback.format_exc())) mylog.error(msg) return False def OnGetCoin(self, db, pack): try: oDGetValueByAcc = RecvPackProtocol.tagDGetValueByAcc() oDGetValueByAcc.ReadData(pack.getBuffer()) col = db[UCN_AccCoins] oAccCoins = DataServerPlayerData.tagAccCoins() oAccCoins.AccID = oDGetValueByAcc.Acc if not oAccCoins.adoLoad(col): mylog.info("gstGetCoin, not found match record") return False mylog.info("Type = %d, AccId = %s, GoldCoins = %d"%(CommonDefine.gstGetCoin, oDGetValueByAcc.Acc, oAccCoins.GoldCoins)) #·µ»ØµãȯÊýÄ¿ oSvrValue = SendPackProtocol.tagDServerValueType() oSvrValue.Type = CommonDefine.dgCoin oSvrValue.Value = oAccCoins.GoldCoins self.sendString(pack, oSvrValue.GetBuffer()) mylog.info("process gstGetCoin ok") return True except: msg = error.formatMsg('error', error.ERROR_NO_85, "OnGetCoin catch excepption, error = \n%s"%traceback.format_exc()) mylog.error(msg) return False def OnCoinChange(self, db, pack): try: oCoinChangeReq = RecvPackProtocol.tagMDCoinChangeReq() oCoinChangeReq.ReadData(pack.getBuffer()) mylog.info("gstCoinChange, AccId = %s, PlayerID = %d, coin = %d"%(oCoinChangeReq.Acc, oCoinChangeReq.PlayerID, oCoinChangeReq.Coin)) col = db[UCN_AccCoins] oAccCoins = DataServerPlayerData.tagAccCoins() oAccCoins.AccID = oCoinChangeReq.Acc retPack = SendPackProtocol.tagDServerValueType() retPack.Type = CommonDefine.dgCoinChangeResult if not oAccCoins.adoLoad(col): mylog.info("gstGetCoin, not found match record") self.sendString(pack, retPack.GetBuffer()) return False mylog.info("Type = %d, AccId = %s, PlayerID = %d, Before exchange GoldCoins = %d"%(CommonDefine.gstCoinChange, oCoinChangeReq.Acc, oCoinChangeReq.PlayerID, oAccCoins.GoldCoins)) if oCoinChangeReq.Coin > oAccCoins.GoldCoins: mylog.info("not enough coin to exchange") self.sendString(pack, retPack.GetBuffer()) return False oAccCoins.GoldCoins -= oCoinChangeReq.Coin oAccCoins.UseGoldCoins += oCoinChangeReq.Coin if not oAccCoins.adoUpdate(col): self.sendString(pack, retPack.GetBuffer()) msg = error.formatMsg('error', error.ERROR_NO_87, "Type = %d, AccId = %s, PlayerID = %d, update exchange GoldCoins fail"%(CommonDefine.gstCoinChange, oCoinChangeReq.Acc, oCoinChangeReq.PlayerID)) mylog.error(msg) return False #¶Ò»»³É¹¦ retPack.Value = oCoinChangeReq.Coin self.sendString(pack, retPack.GetBuffer()) #ˢеãȯ retPack.Type = CommonDefine.dgCoin retPack.Value = oAccCoins.GoldCoins self.sendString(pack, retPack.GetBuffer()) #¼ÇÂ¼Íæ¼Ò²Ù×÷ÈÕÖ¾ #======================================================================================= # oDBServerLogRec = RecvPackProtocol.tagDBServerLogRec() # oDBServerLogRec.Type = CommonDefine.gstSavePlayerLog # oDBServerLogRec.Oper = 135 #135 ´ÓÉ̳Ƕһ»µÄµãȯ # oDBServerLogRec.Time = time() # oDBServerLogRec.MapID = 1 # oDBServerLogRec.PlayerID = oCoinChangeReq.PlayerID # oDBServerLogRec.Msg = "AccID = %s, coin = %d"%(oCoinChangeReq.Acc, oCoinChangeReq.Coin) # oDBServerLogRec.MsgLen = len(oDBServerLogRec.Msg) # self.sendDBRequest(oDBServerLogRec.GetBuffer()) #======================================================================================= # ¼ÇÂ¼Íæ¼Òµãȯ±ä»¯ÈÕÖ¾ oDBPlayerLogInfoOnCoinChange = DataServerLogData.tagDBPlayerLogInfoOnCoinChange() oDBPlayerLogInfoOnCoinChange.AccID = oCoinChangeReq.Acc oDBPlayerLogInfoOnCoinChange.Coin = oCoinChangeReq.Coin self.sendDBRequest(chr(CommonDefine.gstSavePlayerInfoLogOnOnCoinChange) + oDBPlayerLogInfoOnCoinChange.getBuffer()) except: msg = error.formatMsg('error', error.ERROR_NO_88, "OnCoinChange throw exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnCheckPlayerExist(self, db, pack): try: curPack = RecvPackProtocol.tagBDCheckNameExist() curPack.ReadData(pack.getBuffer()) retPack = SendPackProtocol.tagDBPlayerNameIsExist() oPlayer = DataServerPlayerData.tagDBPlayer() oPlayer.PlayerName = curPack.Name oPlayer.IsDeleted = 0 col = db[UCN_DBPlayer] retPack.CallType = CommonDefine.dgCheckPlayerExist retPack.Name = curPack.Name retPack.NameLen = len(retPack.Name) retPack.Result = oPlayer.adoLoadCEx(col, {'PlayerName':fix_incomingText(oPlayer.PlayerName), 'IsDeleted':oPlayer.IsDeleted}) retPack.PlayerID = oPlayer.PlayerID self.sendString(pack, retPack.GetBuffer()) except: msg = error.formatMsg('error', error.ERROR_NO_89, "OnCheckPlayerExist catch exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnDay(self, db, pack): mylog.warning("process gstOnDay in the future!") #´¥·¢µ÷ÓÃEventShellʼþ # if DBConfig.EventShellEnable: # try: # #EventProcess.OnDayProcess(db) # except: # msg = error.formatMsg('error', error.ERROR_NO_161, "OnDay EventProcess.OnDayProcess catch exception\n%s"%traceback.format_exc()) # mylog.error(msg) # return def OnSavePlayerGMOPer(self, db, pack): data = pack.getBuffer() pos = 1 PlayerId, pos = CommFunc.ReadDWORD(data, pos) if -1 == self.savePlayerData(PlayerId, db, "tagGMOper", DataServerPlayerData.tagGMOper, data[pos:]): msg = error.formatMsg('error', error.ERROR_NO_90, "Save Player GM Oper failed, playerid = %d"%PlayerId) mylog.error(msg) return False return True def OnGetExpiationCount(self, db, pack): curPack = RecvPackProtocol.tagDGetValueByAcc() curPack.ReadData(pack.getBuffer()) col = db[UCN_Expiation] # col.ensure_index('AccID') recCount = col.find({'AccID':fix_incomingText(curPack.Acc)}).count() retPack = SendPackProtocol.tagDServerValueType() retPack.Type = CommonDefine.dgGetExpiationCount retPack.Value = recCount self.sendString(pack, retPack.GetBuffer()) return True def OnGetPetExpiationCount(self, db, pack): curPack = RecvPackProtocol.tagDGetValueByAcc() curPack.ReadData(pack.getBuffer()) col = db[UCN_PetExpiation] # col.ensure_index('AccID') recCount = col.find({'AccID':fix_incomingText(curPack.Acc)}).count() retPack = SendPackProtocol.tagDServerValueType() retPack.Type = CommonDefine.dgGetPetExpiationCount retPack.Value = recCount self.sendString(pack, retPack.GetBuffer()) return True def OnGetExpiation(self, db, pack): curPack = RecvPackProtocol.tagMDGetExpiationEx() curPack.ReadData(pack.getBuffer()) needCount = curPack.Count #Ò»´ÎÏ£Íû»ñÈ¡µÄ²¹³¥¸öÊý #´´½¨»Ø°ü sendPack = SendPackProtocol.tagDMGetExpiationExResult() sendPack.Type = CommonDefine.dgGetExpiation sendPack.Count = 0 #²éѯÓà collection = db[UCN_Expiation] # collection.ensure_index('AccID') expiations = collection.find({"AccID":fix_incomingText(curPack.Acc)}) #ɾ³ýÓà colDel = db[UCN_Expiation] for curData in expiations: if sendPack.Count >= needCount: break expiation = SendPackProtocol.tagExpiation() expiation.ExpiationIndex = curData["ExpiationIndex"] expiation.AccID = fix_outgoingText(curData["AccID"]) expiation.ExpiationTime = curData["ExpiationTime"] expiation.Gold = curData["Gold"] expiation.GoldPaper = curData["GoldPaper"] expiation.Silver = curData["Silver"] expiation.SilverPaper = curData["SilverPaper"] expiation.ItemTypeID = curData["ItemTypeID"] expiation.Count = curData["Count"] expiation.IsLocked = curData["IsLocked"] expiation.ItemPlaceType = curData["ItemPlaceType"] expiation.ItemPlaceIndex = curData["ItemPlaceIndex"] expiation.IsBind = curData["IsBind"] expiation.ItemStarLV = curData["ItemStarLV"] expiation.IdentifyPar = curData["IdentifyPar"] expiation.CurDurg = curData["CurDurg"] expiation.MaxDurg = curData["MaxDurg"] expiation.CanPlaceStoneCount = curData["CanPlaceStoneCount"] expiation.ItemProperty = curData["ItemProperty"] expiation.SoulProperty = curData["SoulProperty"] expiation.Maker = curData["Maker"] expiation.MakerName = fix_outgoingText(curData["MakerName"]) expiation.Stone1 = curData["Stone1"] expiation.Stone2 = curData["Stone2"] expiation.Stone3 = curData["Stone3"] expiation.Stone4 = curData["Stone4"] expiation.Stone5 = curData["Stone5"] expiation.Stone6 = curData["Stone6"] expiation.Stone7 = curData["Stone7"] expiation.Stone8 = curData["Stone8"] expiation.Stone9 = curData["Stone9"] expiation.RemainHour = curData["RemainHour"] expiation.CreateTime = fix_outgoingText(curData["CreateTime"]) expiation.ElementEffect = curData["ElementEffect"] expiation.IsSuite = curData["IsSuite"] expiation.FitLV = curData["FitLV"] expiation.EquipAddSkillCnt = curData["EquipAddSkillCnt"] expiation.ExpireTime = curData["ExpireTime"] expiation.BaseAtkPlus = curData["BaseAtkPlus"] expiation.BaseDefPlus = curData["BaseDefPlus"] expiation.AddSkillData = fix_outgoingText(curData["AddSkillData"]) expiation.BaseHP = curData["BaseHP"] expiation.BaseMagicDef = curData["BaseMagicDef"] expiation.EquipMinAtkValue = curData["EquipMinAtkValue"] expiation.Proficiency = curData["Proficiency"] expiation.RelMaxAddSkillCnt = curData["RelMaxAddSkillCnt"] expiation.FamilyActiveValue = curData["FamilyActiveValue"] expiation.UserDataLen = curData["UserDataLen"] expiation.UserData = fix_outgoingText(curData["UserData"]) sendPack.Datas.append(expiation)#ËùÓÐÊôÐÔ¸³ÖµºóѹÈëÁбí #ExpiationIndexÊÇ×ÔÔö³¤µÄ£¬Î¨Ò»µÄ colDel.remove({'ExpiationIndex':expiation.ExpiationIndex}) sendPack.Count+=1 if sendPack.Count == 0: return False self.sendString(pack, sendPack.GetBuffer()) #֪ͨд²¹³¥ÈÕÖ¾ for i in xrange(sendPack.Count): dbData = sendPack.Datas[i] saveLog = DataServerLogData.tagExpiationLog() saveLog.ReceiveDate = time() saveLog.ExpiationIndex = dbData.ExpiationIndex; saveLog.AccID = dbData.AccID saveLog.MakerName = dbData.MakerName saveLog.CreateTime = dbData.CreateTime saveLog.ExpiationTime = dbData.ExpiationTime; saveLog.Gold = dbData.Gold; saveLog.GoldPaper = dbData.GoldPaper; saveLog.Silver = dbData.Silver; saveLog.SilverPaper = dbData.SilverPaper; saveLog.ItemTypeID = dbData.ItemTypeID; saveLog.Count = dbData.Count; saveLog.IsLocked = dbData.IsLocked; saveLog.ItemPlaceType = dbData.ItemPlaceType; saveLog.ItemPlaceIndex = dbData.ItemPlaceIndex; saveLog.IsBind = dbData.IsBind; saveLog.ItemStarLV = dbData.ItemStarLV; saveLog.IdentifyPar = dbData.IdentifyPar; saveLog.CurDurg = dbData.CurDurg; saveLog.MaxDurg = dbData.MaxDurg; saveLog.CanPlaceStoneCount = dbData.CanPlaceStoneCount; saveLog.ItemProperty = dbData.ItemProperty; saveLog.SoulProperty = dbData.SoulProperty; saveLog.Maker = dbData.Maker; saveLog.Stone1 = dbData.Stone1; saveLog.Stone2 = dbData.Stone2; saveLog.Stone3 = dbData.Stone3; saveLog.Stone4 = dbData.Stone4; saveLog.Stone5 = dbData.Stone5; saveLog.Stone6 = dbData.Stone6; saveLog.Stone7 = dbData.Stone7; saveLog.Stone8 = dbData.Stone8; saveLog.Stone9 = dbData.Stone9; saveLog.RemainHour = dbData.RemainHour; saveLog.ElementEffect = dbData.ElementEffect; saveLog.IsSuite = dbData.IsSuite; saveLog.FitLV = dbData.FitLV; saveLog.EquipAddSkillCnt = dbData.EquipAddSkillCnt; saveLog.ExpireTime = dbData.ExpireTime; saveLog.BaseAtkPlus = dbData.BaseAtkPlus; saveLog.BaseDefPlus = dbData.BaseDefPlus; saveLog.AddSkillData = dbData.AddSkillData saveLog.BaseHP = dbData.BaseHP; saveLog.BaseMagicDef = dbData.BaseMagicDef; saveLog.EquipMinAtkValue = dbData.EquipMinAtkValue; saveLog.Proficiency = dbData.Proficiency; saveLog.RelMaxAddSkillCnt = dbData.RelMaxAddSkillCnt; saveLog.FamilyActiveValue = dbData.FamilyActiveValue; self.sendDBRequest(chr(CommonDefine.gstGetExpiationLog) + saveLog.getBuffer()) return True # curPack = RecvPackProtocol.tagDGetValueByAcc() # curPack.ReadData(pack.getBuffer()) # # col = db.tagExpiation # dbData = DataServerPlayerData.tagExpiation() # dbData.AccID = curPack.Acc # result = dbData.adoLoad(col) # # #»Ø±¨¿Í»§¶Ë # sendPack = RecvPackProtocol.tagBDStringTypeSend() # sendPack.Type = CommonDefine.dgGetExpiation # sendPack.Data = dbData.getBuffer() # sendPack.DataLen = sendPack.data # self.sendString(pack, sendPack.GetBuffer()) # # #ûÓÐÁìÈ¡µ½Êý¾Ý, ·µ»ØÊ§°Ü # if not result: # return False # colDel = db.tagExpiation # colDel.remove({'ExpiationIndex':dbData.ExpiationIndex,"AccID":dbData.AccID}) # #±£´æÈÕÖ¾ # saveLog = DataServerLogData.tagExpiationLog() # saveLog.ReceiveDate = time() # saveLog.ExpiationIndex = dbData.ExpiationIndex; # saveLog.AccID = dbData.AccID # saveLog.MakerName = dbData.MakerName # saveLog.CreateTime = dbData.CreateTime # saveLog.ExpiationTime = dbData.ExpiationTime; # saveLog.Gold = dbData.Gold; # saveLog.GoldPaper = dbData.GoldPaper; # saveLog.Silver = dbData.Silver; # saveLog.SilverPaper = dbData.SilverPaper; # saveLog.ItemTypeID = dbData.ItemTypeID; # saveLog.Count = dbData.Count; # saveLog.IsLocked = dbData.IsLocked; # saveLog.ItemPlaceType = dbData.ItemPlaceType; # saveLog.ItemPlaceIndex = dbData.ItemPlaceIndex; # saveLog.IsBind = dbData.IsBind; # saveLog.ItemStarLV = dbData.ItemStarLV; # saveLog.IdentifyPar = dbData.IdentifyPar; # saveLog.CurDurg = dbData.CurDurg; # saveLog.MaxDurg = dbData.MaxDurg; # saveLog.CanPlaceStoneCount = dbData.CanPlaceStoneCount; # saveLog.ItemProperty = dbData.ItemProperty; # saveLog.SoulProperty = dbData.SoulProperty; # saveLog.Maker = dbData.Maker; # saveLog.Stone1 = dbData.Stone1; # saveLog.Stone2 = dbData.Stone2; # saveLog.Stone3 = dbData.Stone3; # saveLog.Stone4 = dbData.Stone4; # saveLog.Stone5 = dbData.Stone5; # saveLog.Stone6 = dbData.Stone6; # saveLog.Stone7 = dbData.Stone7; # saveLog.Stone8 = dbData.Stone8; # saveLog.Stone9 = dbData.Stone9; # saveLog.RemainHour = dbData.RemainHour; # saveLog.ElementEffect = dbData.ElementEffect; # saveLog.IsSuite = dbData.IsSuite; # saveLog.FitLV = dbData.FitLV; # saveLog.EquipAddSkillCnt = dbData.EquipAddSkillCnt; # saveLog.ExpireTime = dbData.ExpireTime; # saveLog.BaseAtkPlus = dbData.BaseAtkPlus; # saveLog.BaseDefPlus = dbData.BaseDefPlus; # saveLog.AddSkillData = dbData.AddSkillData # saveLog.BaseHP = dbData.BaseHP; # saveLog.BaseMagicDef = dbData.BaseMagicDef; # saveLog.EquipMinAtkValue = dbData.EquipMinAtkValue; # saveLog.Proficiency = dbData.Proficiency; # saveLog.RelMaxAddSkillCnt = dbData.RelMaxAddSkillCnt; # saveLog.FamilyActiveValue = dbData.FamilyActiveValue; # # self.sendDBRequest(chr(CommonDefine.gstGetExpiationLog) + saveLog.getBuffer()) # return True def OnGetPetExpiation(self, db, pack): curPack = RecvPackProtocol.tagDGetValueByAcc() curPack.ReadData(pack.getBuffer()) col = db[UCN_PetExpiation] dbData = DataServerPlayerData.tagPetExpiation() dbData.AccID = curPack.Acc result = dbData.adoLoad(col) #»Ø±¨¿Í»§¶Ë sendPack = RecvPackProtocol.tagBDStringTypeSend() sendPack.Type = CommonDefine.dgGetPetExpiation sendPack.Data = dbData.getBuffer() sendPack.DataLen = dbData.getLength() self.sendString(pack, sendPack.GetBuffer()) #ûÓÐÁìÈ¡µ½Êý¾Ý, ·µ»ØÊ§°Ü if not result: return False #´æÈÕÖ¾ saveLog = DataServerLogData.tagPetExpiationLog() saveLog.ReceiveDate = time(); saveLog.ExpiationIndex = dbData.ExpiationIndex; saveLog.AccID = dbData.AccID saveLog.ExpiationTime = dbData.ExpiationTime; saveLog.NPCID = dbData.NPCID; saveLog.Lv = dbData.Lv; saveLog.Exp = dbData.Exp; saveLog.BindType = dbData.BindType; saveLog.UseCreatorDrugCnt = dbData.UseCreatorDrugCnt; saveLog.Friendliness = dbData.Friendliness; saveLog.SkillIDList = dbData.SkillIDList saveLog.HPTalent = dbData.HPTalent; saveLog.PhysicAtkTalent = dbData.PhysicAtkTalent; saveLog.MagicAtkTalent = dbData.MagicAtkTalent; saveLog.PhysicDefTalent = dbData.PhysicDefTalent; saveLog.MagicDefTalent = dbData.MagicDefTalent; self.sendDBRequest(chr(CommonDefine.gstGetPetExpiationLog) + saveLog.getBuffer(), pack) return True def gstUpdateServerDataVersionNO(self, db, pack): '''·þÎñÆ÷Êý¾Ý¿â°æ±¾Ë¢ÐÂ''' dbRecv = DataServerPlayerData.tagServerDataVersionNO() if -1 == dbRecv.readData(pack.getBuffer()): msg = error.formatMsg('error', error.ERROR_NO_91, "tagServerDataVersionNO:%S"%"lack of pack data") mylog.error(msg) return False #ɾ³ýÔ­À´µÄÊý¾Ý col = db[UCN_ServerDataVersionNO] col.drop() #²åÈëа汾 if not dbRecv.adoInsert(col): msg = error.formatMsg('error', error.ERROR_NO_92, "insert tagServerDataVersionNO data failed!") mylog.error(msg) return False return True def OnMapServerInfo(self, db, pack): recvPack = RecvPackProtocol.tagBDStringTypeSend() recvPack.ReadData(pack.getBuffer()) dbData = DataServerPlayerData.tagDBMapServerInfo() if -1 == dbData.readData(recvPack.Data): msg = error.formatMsg('error', error.ERROR_NO_93, "tagDBMapServerInfo:lack of pack data") mylog.error(msg) return False dbData.Time = time() dbData.LogIndex = seq(db, 'tagDBMapServerInfo', 'LogIndex', DBConfig.LOGINDEX_FEED, DBConfig.LOGINDEX_STEP) col = db[UCN_DBMapServerInfo] if not dbData.adoCheckUpdateEx(col, {"LogID":dbData.LogID, "Msg":fix_incomingText(dbData.Msg)}): msg = error.formatMsg('error', error.ERROR_NO_94, 'OnMapServerInfo failed:LogID = %s, LogIndex = %s, Msg = %s'%(self.LogID, self.LogIndex, self.Msg)) mylog.error(msg) return False return True def OnUpdateTotalSavePoint(self, db, pack): try: mylog.info("begin process gstUpdateTotalSavePoint") recvPack = RecvPackProtocol.tagBDStringTypeSend() recvPack.ReadData(pack.getBuffer()) dbData = DataServerLogData.tagDBPlayerSaveCoinLog() if -1 == dbData.readData(recvPack.Data): msg = error.formatMsg('error', error.ERROR_NO_95, "tagDBPlayerSaveCoinLog:lack of pack data:data = %s,datalen = %d"%(b2a_hex(recvPack.Data), len(recvPack.Data))) mylog.error(msg) return False col = db[UCN_DSAccount] dbDoc = DataServerPlayerData.tagDSAccount() dbDoc.AccID = recvPack.AccID ret = dbDoc.adoLoadC(col) if ret: dbDoc.TotalSavePoint += dbData.Coin else: dbDoc.TotalSavePoint = 0 if not dbDoc.adoCheckUpdateC(col): msg = error.formatMsg('error', error.ERROR_NO_86, "UpdateTotalSavePoint failed,data = %s,datalen = %d"%(b2a_hex(recvPack.Data), len(recvPack.Data))) mylog.error(msg) return False except: msg = error.formatMsg('error', error.ERROR_NO_96, "OnUpdateTotalSavePoint throw a exception, packdata = %s, packdata len = %d\n%s"(b2a_hex(pack.getBuffer()), len(pack.getBuffer()), traceback.format_exc())) mylog.error(msg) return False mylog.info("end process gstUpdateTotalSavePoint") return True def OnGetPlayerMailState(self, db, pack): try: recvPack = RecvPackProtocol.tagDBGetMailListReq() recvPack.ReadData(pack.getBuffer()) col = db[UCN_DBMailList] docCount = col.find({"ReceverID":recvPack.PlayerID, "$ne":{"MailType":CommonDefine.wmtSave}}).count() if docCount >= CommonDefine.MAX_PLAYER_MAIL_COUNT: state = CommonDefine.pmiFull else: docCount = col.find({"ReceverID":recvPack.PlayerID, "MailType":CommonDefine.wmtUnReaded}).count() if docCount > 0 : state = CommonDefine.pmiNewLetter else: state = CommonDefine.pmiNull sendPack = SendPackProtocol.tagPlayerMailInfo() sendPack.InfoType = state #RouteServerºÍGameServer¶¼»á·¢´Ë²éѯ°ü£¬µ«ËùÓлذü¶¼¾­RouteServerת·¢¸ø¿Í»§¶Ë #Èç¹û·â°üÀ´×ÔGameServer,¾Íαװ³ÉÀ´×ÔRouteServer if pack.getPackHead().srcSvrType == MMORPGPack.stGame: pack.getPackHead().srcSvrType = MMORPGPack.stRoute pack.getPackHead().poolIndex = recvPack.RouteServerIndex self.sendGameServerString(pack, CommonDefine.dgPlayerMailState, sendPack.GetBuffer()) except: msg = error.formatMsg('error', error.ERROR_NO_97, "OnGetPlayerMailState throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnGetMailDetail(self, db, pack): '''È¡µÃÍæ¼ÒÓʼþÏêÇé''' try: recvPack = RecvPackProtocol.tagDBGetMailDetailReq() recvPack.ReadData(pack.getBuffer()) col = db[UCN_DBMailItemList] dbMailItemList = DataServerPlayerData.tagDBMailItemList() dbMailItemList.MailID = recvPack.MailID itemData = dbMailItemList.adoQueryIndex(col) col = db[UCN_DBMailList] dbMailList = DataServerPlayerData.tagDBMailList() dbMailList.MailID = recvPack.MailID if not dbMailList.adoLoad(col): mylog.warning("mail list not exist! mailid = %s"%recvPack.MailID) return False sendPack = SendPackProtocol.tagDBMailDetailView() sendPack.Type = CommonDefine.dgMailDetail sendPack.MailDetailData = dbMailList.getBuffer() sendPack.MailDetailDataLen = len(sendPack.MailDetailData) sendPack.MailItemData = itemData sendPack.MailItemDataLen = len(itemData) self.sendString(pack, sendPack.GetBuffer()) except: msg = error.formatMsg('error', error.ERROR_NO_98, "OnGetMailDetail throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnGetPlayerMail(self, db, pack): try: recvPack = RecvPackProtocol.tagDBGetMailListReq() recvPack.ReadData(pack.getBuffer()) sendPack = SendPackProtocol.tagDBGetPlayerMail() sendPack.Type = CommonDefine.dgMailList col = db[UCN_DBMailList] docs = col.find({"ReceverID":recvPack.PlayerID, "ExistTime":{"$lt":CommonDefine.MailExistTime}}) for doc in docs: mainInfo = SendPackProtocol.tagDBMailInfo() mainInfo.MailID = fix_outgoingText(doc['MailID']) mainInfo.MailType = doc['MailType'] mainInfo.SenderName = fix_outgoingText(doc['SenderName']) mainInfo.Title = fix_outgoingText(doc['Title']) mainInfo.LetterType = doc['LetterType'] mainInfo.ExistTime = doc['ExistTime'] mainInfo.TitleUseSysMessage = doc['TitleUseSysMessage'] sendPack.Mail.append(mainInfo) sendPack.MailCount = len(sendPack.Mail) self.sendString(pack, sendPack.GetBuffer()) except: msg = error.formatMsg('error', error.ERROR_NO_99, "OnGetPlayerMail throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnAddPlayerMailByAccID(self, db, pack): result = False sendPack = RecvPackProtocol.tagBDStringTypeSend() try: recvPack = RecvPackProtocol.tagBDStringTypeSend() recvPack.ReadData(pack.getBuffer()) #ÕâÀïʵ¼ÊÏ£Íû½«ADOResult·µ»Ø»ØÈ¥£¬Êµ¼ÊÉÏGetBuffer²»»á´ò°üADOResult sendPack.Data = recvPack.Data sendPack.DataLen = recvPack.DataLen while(True): curMail = DataServerPlayerData.tagDBMailList_SaveSysMail() if -1 == curMail.readData(recvPack.Data): msg = error.formatMsg('error', error.ERROR_NO_100, "tagDBMailList_SaveSysMail lack of pack data") mylog.error(msg) break col = db[UCN_DBPlayer] docs = col.find({"AccID":fix_incomingText(recvPack.AccID), "IsDeleted":0}) if docs.count() <= 0: mylog.info("not exist player role , accid = %s"%recvPack.AccID) break col = db[UCN_DBMailList] if col.find({"MailID":curMail.MailID}).count() > 0: msg = error.formatMsg('error', error.ERROR_NO_101, "OnAddPlayerMailByAccID: exist a same mailid") mylog.error(msg) break doc = DataServerPlayerData.tagDBMailList() doc.SenderID = curMail.SenderID doc.ReceverID = docs[0]["PlayerID"] doc.MailID = curMail.MailID doc.MailType = curMail.MailType doc.SenderName = curMail.SenderName doc.Title = curMail.Title doc.Money = curMail.Money doc.LetterType = curMail.LetterType doc.ExistTime = curMail.ExistTime doc.Content = curMail.Content doc.ContentLen = len(doc.Content) doc.TitleUseSysMessage = curMail.TitleUseSysMessage doc.ContentUseSysMessage = curMail.ContentUseSysMessage if doc.adoInsert(col): result = True break except: msg = error.formatMsg('error', error.ERROR_NO_102, "OnAddPlayerMailByAccID throw a exception\n\s"%traceback.format_exc()) mylog.error(msg) sendPack.Type = CommonDefine.dgAddPlayerMailByAccID self.sendString(pack, sendPack.GetBuffer()) return result def OnDeleteMail(self, db, pack): try: recvPack = RecvPackProtocol.tagDBDeleteMail() recvPack.ReadData(pack.getBuffer()) # ɾ³ýÓʼþ col = db[UCN_DBMailList] doc = DataServerPlayerData.tagDBMailList() doc.MailID = recvPack.MailID if not doc.adoDeleteByIndex(col): msg = error.formatMsg('error', error.ERROR_NO_103, "DeleteMail fail:data = %s"%b2a_hex(pack.getBuffer())) mylog.error(msg) return False # ɾ³ýÎïÆ· col = db[UCN_DBMailItemList] doc = DataServerPlayerData.tagDBMailItemList() doc.MailID = recvPack.MailID if not doc.adoDeleteByIndex(col): msg = error.formatMsg('error', error.ERROR_NO_104, "DeleteMail fail:data = %s"%b2a_hex(pack.getBuffer())) mylog.error(msg) return False except: msg = error.formatMsg('error', error.ERROR_NO_105, "OnDeleteMail throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True #¸üÐÂÓʼþ(gstUpdateMail) def OnUpdateMail(self, db, pack): try: recvPack = RecvPackProtocol.tagDBUpdateMail() recvPack.ReadData(pack.getBuffer()) col = db[UCN_DBMailList] doc = DataServerPlayerData.tagDBMailList() doc.MailID = recvPack.MailID if not doc.adoLoad(col): DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\UpdateMailFailDump', '%d_%s.mdat'%(pack.getPackHead().sessionID, recvPack.MailID), pack.getBuffer()) msg = error.formatMsg('error', error.ERROR_NO_106, "update mail fail, load tagDBMailList fail, session = %d, mailid = %s"%(pack.getPackHead().sessionID, recvPack.MailID)) mylog.error(msg) return False if recvPack.UpdateMailType: doc.MailType = recvPack.MailType if recvPack.UpdateLetterType: doc.LetterType = recvPack.LetterType if recvPack.GetAllMoney: doc.Money = 0 if recvPack.ReturnMail: doc.ReceverID = doc.SenderID doc.SenderID = 0 doc.LetterType = 0 doc.ExistTime = 0 doc.Money = 0 if not doc.adoUpdate(col): DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\UpdateMailFailDump', '%d_%s.mdat'%(pack.getPackHead().sessionID, recvPack.MailID), b2a_hex(pack.getBuffer())) msg = error.formatMsg('error', error.ERROR_NO_107, "update mail fail, maiid = %s, sessionid = %d"%(recvPack.MailID, pack.getPackHead().sessionID)) mylog.error(msg) return False if recvPack.GetAllItem: col = db[UCN_DBMailItemList] doc.MailID = recvPack.MailID if not doc.adoDeleteByIndex(col): DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\UpdateMailFailDump', '%d_%s.mdat'%(pack.getPackHead().sessionID, recvPack.MailID), b2a_hex(pack.getBuffer())) msg = error.formatMsg('error', error.ERROR_NO_108, "update mail fail, maiid = %s, sessionid = %d"%(recvPack.MailID, pack.getPackHead().sessionID)) mylog.error(msg) return False except: msg = error.formatMsg('error', error.ERROR_NO_109, "OnUpdateMail throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True #¼ì²éÍæ¼ÒÊÇ·ñÄܹ»·¢ËÍÓʼþ¸ø¶Ô·½(gstQueryCanSendMail) def OnQueryCanSendMail(self, db, pack): try: recvPack = RecvPackProtocol.tagBDCheckNameExist() recvPack.ReadData(pack.getBuffer()) sendPack = SendPackProtocol.tagDBPlayerNameIsExist() sendPack.CallType = CommonDefine.dgQueryCanSendMail sendPack.Name = recvPack.Name sendPack.NameLen = len(sendPack.Name) col = db[UCN_DBPlayer] # name = "^%s$"%recvPack.Name # docs = col.find({"AccID":{"$regex":name, "$options":"i"}, "IsDeleted":0}) docs = col.find({"AccID":fix_incomingText(recvPack.Name), "IsDeleted":0}) if not docs.count(): sendPack.PlayerID = 0 sendPack.Result = 0 else: sendPack.PlayerID = docs[0]["PlayerID"] col = db[UCN_DBMailList] count = col.find({"ReceverID":sendPack.PlayerID, "MailType":{"$ne":CommonDefine.wmtSave}}).count() if count > CommonDefine.MAX_PLAYER_MAIL_COUNT: sendPack.Result = 0 else: sendPack.Result = 1 self.sendString(pack, sendPack.GetBuffer()) except: msg = error.formatMsg('error', error.ERROR_NO_110, "OnQueryCanSendMail throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnAccIDSendPrize(self, db, pack): sendPack = SendPackProtocol.tagDPlayerGetItem() sendPack.Type = CommonDefine.dgAccIDSendPrize ret = True while(True): try: recvPack = RecvPackProtocol.tagDGetValueByAcc() recvPack.ReadData(pack.getBuffer()) col = db[UCN_AccIDSendPrize] trycnt = 0 while(True): try: col.update({"ExpiredTime":{"$lt":time()}, "AccID":fix_incomingText(recvPack.Acc), "IsAccept":0}, {'$set':{"IsAccept":2}}, False, False, True, True) break except pymongo.errors.OperationFailure: if(DBConfig.TryCntOnWriteFail > trycnt): trycnt += 1 continue ret = False addADOExceptionCount() msg = error.formatMsg('error', error.ERROR_NO_111, 'OnAccIDSendPrize!Update failed!AccID = %s, trycnt = %d'%(recvPack.Acc, trycnt)) mylog.error(msg) break if not ret: break docs = col.find({"AccID":fix_incomingText(recvPack.Acc), "IsAccept":0}).limit(1) #top 1 if docs.count(): doc = docs[0] CheckValue = doc['CheckValue'] sendPack.ItemID = doc['PrizeID'] sendPack.Count = doc['PrizeNum'] sendPack.IsBind = doc['IsBind'] trycnt = 0 while(True): try: col.update({"CheckValue":CheckValue}, {'$set':{"IsAccept":1}}, False, False, True, True) break except pymongo.errors.OperationFailure: if(DBConfig.TryCntOnWriteFail > trycnt): trycnt += 1 continue ret = False addADOExceptionCount() msg = error.formatMsg('error', error.ERROR_NO_112, 'OnAccIDSendPrize!Update failed!AccID = %s, trycnt = %d'%(recvPack.Acc, trycnt)) mylog.error(msg) break if not ret: break sendPack.RemainItemCount = col.find({"AccID":fix_incomingText(recvPack.Acc), "IsAccept":0}).count() except: msg = error.formatMsg('error', error.ERROR_NO_113, "OnAccIDSendPrize throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) ret = False break self.sendString(pack, sendPack.GetBuffer()) return ret def OnCheckItemPrize(self, db, pack): try: recvPack = RecvPackProtocol.tagDGetValueByAcc() recvPack.ReadData(pack.getBuffer()) #ÁÙʱ´úÂ룬Õâ¸öÇëÇóµÄ´¦ÀíºÜÂý£¬»³ÒÉÊÇÊý¾Ý¿âÂý£¬Ö¤ÊµÏ import timeit startTick = timeit.default_timer() col = db[UCN_AccIDSendPrize] PrizeCnt = col.find({"AccID":fix_incomingText(recvPack.Acc), "IsAccept":0}).count() processTime = timeit.default_timer() - startTick if processTime > DBConfig.ProfileThreshold / 1000.0: mylog.warning('OnCheckItemPrize db process time = %s, PrizeCnt = %s'%(processTime, PrizeCnt)) startTick = timeit.default_timer() sendPack = SendPackProtocol.tagDServerValueType(); sendPack.Type = CommonDefine.dgCheckItemPrizeResult sendPack.Value = PrizeCnt self.sendString(pack, sendPack.GetBuffer()) processTime = timeit.default_timer() - startTick if processTime > DBConfig.ProfileThreshold / 1000.0: mylog.warning('sendString process time = %s'%(processTime)) except: msg = error.formatMsg('error', error.ERROR_NO_114, "OnCheckItemPrize throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnCheckLoadAcc(self, db, pack): try: recvPack = RecvPackProtocol.tagDGetValueByAcc() recvPack.ReadData(pack.getBuffer()) col = db[UCN_DSAccount] doc = DataServerPlayerData.tagDSAccount() doc.ACCID = recvPack.Acc # LastSIDErrorCnt = getSIDErrorCnt() strNow = CommFuncEx.TDateTimeToString(CommFuncEx.TDateTime_Now()) if not doc.adoLoadC(col): # if LastSIDErrorCnt != getSIDErrorCnt(): # if DBConfig.checkSID: # self.sendFailString(CommonDefine.dgPlayerLogin, pack) # mylog.info("%s Update Error !doc.LogNum = %d"%recvPack.Acc, doc.LogNum) # return doc.LogNum = 0 doc.RegisterTime = strNow if not doc.adoInsertC(col): self.sendFailString(CommonDefine.dgPlayerLogin, pack) mylog.info("%s Update Error !doc.LogNum = %d"%(recvPack.Acc, doc.LogNum)) return False doc.LogNum += 1 doc.LastLoginTime = strNow if not doc.adoUpdateC(col): self.sendFailString(CommonDefine.dgPlayerLogin, pack) mylog.info("%s Update Error !doc.LogNum = %d"%(recvPack.Acc, doc.LogNum)) return False self.sendOKString(CommonDefine.dgPlayerAccLoad, pack, doc.getBuffer()) except: msg = error.formatMsg('error', error.ERROR_NO_115, "OnCheckLoadAcc throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnAddAccItem(self, db, pack): try: recvPack = RecvPackProtocol.tagBDStringTypeSend() recvPack.ReadData(pack.getBuffer()) recvData = RecvPackProtocol.tagIRAddItem() recvData.ReadData(recvPack.Data) mylog.warning("Type == gstAddAccItem, accid = %s, itemID = %d, itemCnt = %d"%(recvData.Acc, recvData.ItemID, recvData.ItemCnt)); col = db[UCN_AccIDSendPrize] doc = DataServerPlayerData.tagAccIDSendPrize() doc.CheckValue = GlobalFunctions.GetTransactionIDStr(32) doc.AccID = recvData.Acc doc.PrizeID = recvData.ItemID; doc.PrizeNum = recvData.ItemCnt doc.ExpiredTime = time() + 365*18*24*60*60 #¹ýÆÚʱ¼äΪÏÖÔÚÖ®ºóµÄ18Äê doc.PrizeReason = "gstAddAccItem" doc.IsAccept = 0 doc.SendPrizeTime = time() doc.IsBind = recvData.IsBind sendPack = SendPackProtocol.tagIAddItemResult(); if not doc.adoInsert(col): mylog.warning("Type == gstAddAccItem, transactionIDStr = %s, accid = %s, itemID = %d, itemCnt = %d, Insert Error!"%(doc.CheckValue, recvData.Acc, recvData.ItemID, recvData.ItemCnt)); # »Ø±¨BalanceServer²åÈë³É¹¦ # dgAddAccItemOK sendPack.Acc = recvData.Acc; sendPack.AccLen = sendPack.Acc.Length(); sendPack.ItemID = recvData.ItemID; sendPack.Count = recvData.ItemCnt; sendPack.Result = 0; self.sendString(pack, chr(CommonDefine.dgAddAccItemOK) + sendPack.GetBuffer); return False; #²åÈëChinLog±í¼Ç¼ curLog = DataServerLogData.tagAccTransactionLog() curLog.TransactionID = doc.CheckValue curLog.AccID = recvData.Acc curLog.OperReason = "gstAddAccItem" curLog.ProcessTime = time(); curLog.ItemID = recvData.ItemID; curLog.ItemCount = recvData.ItemCnt; self.sendDBRequest(chr(CommonDefine.gstItemTransactionLog) + curLog.getBuffer()) #»Ø±¨BalanceServer²åÈë³É¹¦ #dgAddAccItemOK sendPack.Acc = recvData.Acc; sendPack.AccLen = sendPack.Acc.Length(); sendPack.ItemID = recvData.ItemID; sendPack.Count = recvData.ItemCnt; sendPack.Result = 1; self.sendString(pack, chr(CommonDefine.dgAddAccItemOK) + sendPack.GetBuffer); except: msg = error.formatMsg('error', error.ERROR_NO_116, "OnAddAccItem throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnUpdateTelLockState(self, db, pack): try: recvPack = RecvPackProtocol.tagBDStringTypeSend() recvPack.ReadData(pack.getBuffer()) recvData = DataServerPlayerData.tagDSAccount_UpdateTelLockState() recvData.readData(recvPack.Data) col = db[UCN_DSAccount] doc = DataServerPlayerData.tagDSAccount() doc.ACCID = recvData.AccID ret = doc.adoLoadC(col) doc.TelLockState = recvData.TelLockState if not doc.adoCheckUpdateC(col): msg = error.formatMsg('error', error.ERROR_NO_117, 'OnUpdateTelLockState!Update failed!ACCID = %s,TelLockState = %s'%(recvData.AccID,recvData.TelLockState)) mylog.error(msg) return False # trycnt = 0 # while(True): # try: # col.update({"ACCID":fix_incomingText(recvData.AccID)}, {"$set":{"TelLockState":recvData.TelLockState}}, False, False, True) # # break # except pymongo.errors.OperationFailure: # if(DBConfig.TryCntOnWriteFail > trycnt): # trycnt += 1 # continue # msg = error.formatMsg('error', error.ERROR_NO_117, 'OnUpdateTelLockState!Update failed!ACCID = %s, trycnt = %d\n%s'%(recvData.AccID, trycnt, traceback.format_exc())) # mylog.error(msg) # return False except: msg = error.formatMsg('error', error.ERROR_NO_118, "OnUpdateTelLockState ACCID = %s, TelLockState = %s, throw a exception\n%s"%(recvData.AccID,recvData.TelLockState,traceback.format_exc())) mylog.error(msg) return False return True def OnUpdateAccAdult(self, db, pack): try: recvPack = RecvPackProtocol.tagBDStringTypeSend() recvPack.ReadData(pack.getBuffer()) recvData = DataServerPlayerData.tagDSAccount_UpdateAdult() recvData.readData(recvPack.Data) col = db[UCN_DSAccount] doc = DataServerPlayerData.tagDSAccount() doc.ACCID = recvData.AccID ret = doc.adoLoadC(col) doc.Adult = recvData.Adult if not doc.adoCheckUpdateC(col): msg = error.formatMsg('error', error.ERROR_NO_121, 'OnUpdateAccAdult!Update failed!ACCID = %s,Adult = %s'%(recvData.AccID,recvData.Adult)) mylog.error(msg) return False # trycnt = 0 # while(True): # try: # col.update({"ACCID":fix_incomingText(recvData.AccID)}, {"$set":{"Adult":recvData.Adult}}, False, False, True) # break # except pymongo.errors.OperationFailure: # if(DBConfig.TryCntOnWriteFail > trycnt): # trycnt += 1 # continue # msg = error.formatMsg('error', error.ERROR_NO_121, 'OnUpdateAccAdult!Update failed!ACCID = %s, trycnt = %d'%(recvData.AccID, trycnt)) # mylog.error(msg) # return False except: msg = error.formatMsg('error', error.ERROR_NO_122, "OnUpdateAccAdult throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnAddExpiation(self, db, pack): try: recvPack = RecvPackProtocol.tagBDStringTypeSend() recvPack.ReadData(pack.getBuffer()) col = db[UCN_Expiation] doc = DataServerPlayerData.tagExpiation() doc.readData(recvPack.Data); doc.ExpiationIndex = seq(db, 'tagExpiation', 'ExpiationIndex', DBConfig.tagExpiation_ExpiationIndex_FEED, DBConfig.tagExpiation_ExpiationIndex_STEP) if doc.adoInsert(col): #³É¹¦ doc.ADOResult = 1 else: #ʧ°Ü doc.ADOResult = 0 sendPack = RecvPackProtocol.tagBDStringTypeSend(); sendPack.Type = CommonDefine.dgAddExpiationOK; sendPack.Data = doc.getBuffer() sendPack.DataLen = len(sendPack.Data) self.sendString(pack, sendPack.GetBuffer()) except: msg = error.formatMsg('error', error.ERROR_NO_123, "OnAddExpiation throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnAddPetExpiation(self, db, pack): try: recvPack = RecvPackProtocol.tagBDStringTypeSend() recvPack.ReadData(pack.getBuffer()) col = db[UCN_PetExpiation] doc = DataServerPlayerData.tagPetExpiation() doc.readData(recvPack.Data); doc.ExpiationIndex = seq(db, 'tagPetExpiation', 'ExpiationIndex', DBConfig.tagPetExpiation_ExpiationIndex_FEED, DBConfig.tagPetExpiation_ExpiationIndex_STEP) if doc.adoInsert(col): #³É¹¦ doc.ADOResult = 1 else: #ʧ°Ü doc.ADOResult = 0 sendPack = RecvPackProtocol.tagBDStringTypeSend(); sendPack.Type = CommonDefine.dgAddPetExpiationOK; sendPack.Data = doc.getBuffer() sendPack.DataLen = len(sendPack.Data) self.sendString(pack, sendPack.GetBuffer()) except: msg = error.formatMsg('error', error.ERROR_NO_124, "OnAddPetExpiation throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnServerMergeDeleteRole(self, db, pack): try: recvPack = RecvPackProtocol.tagBDStringTypeSend() recvPack.ReadData(pack.getBuffer()) recvData = DataServerPlayerData.tagDBPlayer_DeleteRoleUpdateRole() if -1 == recvData.readData(recvPack.Data): self.sendFailString(CommonDefine.dgServerMergeDeleteRole, pack) msg = error.formatMsg('error', error.ERROR_NO_125, "tagDBPlayer_DeleteRoleUpdateRole:lack of pack data") mylog.error(msg) return False trycnt = 0 while(True): try: col = db[UCN_DBPlayer] # col.update({'PlayerID':recvData.DeletePlayerID}, {'$set':{"IsDeleted":1}}, False, False, True, True) # rec = {"Gold":recvData.Gold, "GoldPaper":recvData.GoldPaper, "Silver":recvData.Silver, "SilverPaper":recvData.SilverPaper, "WarehouseGold":recvData.WarehouseGold, "WarehouseSilver":recvData.WarehouseSilver} # col.update({'PlayerID':recvData.UpdatePlayerID}, {'$set':rec}, False, False, True, True) doc = DataServerPlayerData.tagDBPlayer() #ɾ³ýµÄ½ÇÉ«¸Ä±ä״̬ doc.PlayerID = recvData.DeletePlayerID Ret = doc.adoLoadC(col) doc.IsDeleted = 1 doc.adoUpdateC(col) #±£ÁôµÄ½ÇÉ«ÐÅÏ¢¸üРupdatedoc = DataServerPlayerData.tagDBPlayer() updatedoc.PlayerID = recvData.UpdatePlayerID Ret = updatedoc.adoLoadC(col) updatedoc.Gold = recvData.Gold updatedoc.GoldPaper = recvData.GoldPaper updatedoc.Silver = recvData.Silver updatedoc.SilverPaper = recvData.SilverPaper updatedoc.WarehouseGold = recvData.WarehouseGold updatedoc.WarehouseSilver = recvData.WarehouseSilver updatedoc.adoUpdateC(col) break except pymongo.errors.OperationFailure: if(DBConfig.TryCntOnWriteFail > trycnt): trycnt += 1 continue msg = error.formatMsg('error', error.ERROR_NO_126, 'OnServerMergeDeleteRole!Update failed!DeletePlayerID = %s, UpdatePlayerID = %s, trycnt = %d'%(recvData.DeletePlayerID, recvData.UpdatePlayerID, trycnt)) mylog.error(msg) self.sendFailString(CommonDefine.dgServerMergeDeleteRole, pack) return False #155 . ÒòºÏ·þ¶øÉ¾³ý½ÇÉ« #======================================================================================= # sendPack = RecvPackProtocol.tagDBServerLogRec() # sendPack.Type = CommonDefine.gstSavePlayerLog # sendPack.Oper = 155 # sendPack.Time = time() # sendPack.MapID = 0 # sendPack.PlayerID = recvData.DeletePlayerID # self.sendDBRequest(sendPack.GetBuffer()) #======================================================================================= self.sendOKString(CommonDefine.dgServerMergeDeleteRole, pack, "") except: msg = error.formatMsg('error', error.ERROR_NO_127, "OnServerMergeDeleteRole throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnServerMergeUpdateAccState(self, db, pack): try: recvPack = RecvPackProtocol.tagBDStringTypeSend() recvPack.ReadData(pack.getBuffer()) recvData = DataServerPlayerData.tagDBPlayer_ChangeAccState() recvData.readData(recvPack.Data) trycnt = 0 while(True): try: col = db[UCN_DBPlayer] doc = DataServerPlayerData.tagDBPlayer() doc.PlayerID = recvData.PlayerID Ret = doc.adoLoadC(col) doc.AccState = recvData.AccState doc.adoUpdateC(col) # col.update({'PlayerID':recvData.PlayerID}, {'$set':{"AccState":recvData.AccState}}, False, False, True, True) break except pymongo.errors.OperationFailure: if(DBConfig.TryCntOnWriteFail > trycnt): trycnt += 1 continue msg = error.formatMsg('error', error.ERROR_NO_128, 'OnServerMergeUpdateAccState!Update failed!PlayerID = %s, trycnt = %d'%(recvData.PlayerID, trycnt)) mylog.error(msg) self.sendFailString(CommonDefine.dgServerMergeUpdateAccState, pack) return False self.sendOKString(CommonDefine.dgServerMergeUpdateAccState, pack, "") except: msg = error.formatMsg('error', error.ERROR_NO_129, "OnServerMergeUpdateAccState throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnServerMergeChangeName(self, db, pack): try: recvPack = RecvPackProtocol.tagBDStringTypeSend() recvPack.ReadData(pack.getBuffer()) recvData = DataServerPlayerData.tagDBPlayer_ChangeName() recvData.readData(recvPack.Data) mylog.info('OnServerMergeChangeName playerID = %s, newName = %s...'%(recvData.PlayerID, recvData.PlayerName)) trycnt = 0 while(True): try: col = db[UCN_DBPlayer] if col.find({"PlayerName":fix_incomingText(recvData.PlayerName)}).count(): recvData.ADOResult = 0 else: # ´¿¼Ç¼ ÔÝʱ¹Ø±Õ #======================================================= # col = db[UCN_DBPlayerChangeNameLog] # if not col.find({"PlayerID":recvData.PlayerID}).count(): # trycnt1 = 0 # while(True): # try: # col.insert({"PlayerID":recvData.PlayerID, "SrcPlayerID":recvData.PlayerID, "OldPlayerName":fix_incomingText(recvData.PlayerName)}, False, True) # break # except pymongo.errors.OperationFailure: # if(DBConfig.TryCntOnWriteFail > trycnt1): # trycnt1 += 1 # continue # msg = error.formatMsg('error', error.ERROR_NO_130, 'OnServerMergeUpdateAccState!insert tagDBPlayerChangeNameLog failed!PlayerID = %s, trycnt = %d'%(recvData.PlayerID, trycnt1)) # mylog.error(msg) # break #======================================================= # ÏÂÏß±£´æ ´Ë´¦ÐÞ¸ÄÎÞÒâÒ壬Íⲿ¸ÄÃû֪ͨGameServer #======================================================= # col = db[UCN_DBMailList] # col.update({'SenderID':recvData.PlayerID}, {'$set':{"SenderName":fix_incomingText(recvData.PlayerName)}}, False, False, True, True) # mylog.info("OnServerMergeChangeName!update tagDBMailList ok.") # # col = db[UCN_DBPlayer] # doc = DataServerPlayerData.tagDBPlayer() # doc.PlayerID = recvData.PlayerID # Ret = doc.adoLoadC(col) # doc.AccState = 1 # doc.PlayerName = recvData.PlayerName # doc.adoUpdateC(col) # #col.update({'PlayerID':recvData.PlayerID}, {'$set':{"AccState":1, "PlayerName":fix_incomingText(recvData.PlayerName)}}, False, False, True, True) # mylog.info("OnServerMergeChangeName!update tagDBPlayer ok.") # # col = db[UCN_PlayerEnemy] # col.update({'EnemyID':recvData.PlayerID}, {'$set':{"EnemyName":fix_incomingText(recvData.PlayerName)}}, False, False, True, True) # mylog.info("OnServerMergeChangeName!update tagPlayerEnemy ok.") # # col = db[UCN_PlayerFriend] # col.update({'FriendID':recvData.PlayerID}, {'$set':{"FriendName":fix_incomingText(recvData.PlayerName)}}, False, False, True, True) # mylog.info("OnServerMergeChangeName!update tagPlayerFriend ok.") #======================================================= recvData.ADOResult = 1 sendPack = RecvPackProtocol.tagBDStringTypeSend() sendPack.Type = CommonDefine.dgServerMergeChangeName; sendPack.Data = recvData.getBuffer() sendPack.DataLen = len(sendPack.Data) self.sendString(pack, sendPack.GetBuffer()) break except pymongo.errors.OperationFailure: if(DBConfig.TryCntOnWriteFail > trycnt): trycnt += 1 continue msg = error.formatMsg('error', error.ERROR_NO_131, 'OnServerMergeChangeName!Update failed!PlayerID = %s, trycnt = %d'%(recvData.PlayerID, trycnt)) mylog.error(msg) return False except: msg = error.formatMsg('error', error.ERROR_NO_132, "OnServerMergeChangeName throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False mylog.info('OnServerMergeChangeName playerID = %s, newName = %s ok!'%(recvData.PlayerID, recvData.PlayerName)) return True def OnInsertImpeach(self, db, pack): try: recvPack = RecvPackProtocol.tagBDStringTypeSend() recvPack.ReadData(pack.getBuffer()) doc = DataServerPlayerData.tagDBImpeach() doc.ReadData(recvPack.Data) doc.ImpeachIndex = seq(db, 'tagDBImpeach', 'ImpeachIndex', DBConfig.tagDBImpeach_ImpeachIndex_FEED, DBConfig.tagDBImpeach_ImpeachIndex_STEP) col = db[UCN_DBImpeach] if not doc.adoInsert(col): msg = error.formatMsg('error', error.ERROR_NO_133, "OnInsertImpeach!insert tagDBImpeach failed!") mylog.error(msg) return False except: msg = error.formatMsg('error', error.ERROR_NO_134, "OnServerMergeChangeName throw a exception\n%s"%traceback.format_exc()) mylog.error(msg) return False return True def OnGMToolCmdUserDBRequest(self,db, pack): # try: # ProjSpecialProcess.OnGMToolCmdUserDBRequest(db,pack) # except: # msg = error.formatMsg('error', error.ERROR_NO_172, "OnGMToolCmdUserDBRequest Catch a unexpetcted exception, error = %s"%traceback.format_exc()) # mylog.error(msg) # return False return True def OnMergerChildToCenter(self,db, pack): mylog.debug('OnMergerChildToCenter in') # #αװÀ´Ô´£¬±ãÓڻذü # pack.getPackHead().srcSvrType = MMORPGPack.stGame # pack.getPackHead().type = CommonDefine.dgMergerChildToCenter #»ñÈ¡·¢°ü²ÎÊý ServerMgr = MongoDBServer.getServerMgr() sendViaSessionID = ServerMgr.getClientSessionIDByName("CenterGate",0) SessionID = 0 PoolIndex = -1 #¶ÁÈ¡Êý¾Ý buf = pack.getBuffer() recvPack = MergeServerRecvProtocol.tagLPStringData() pos = 0 recvPack.ReadData(buf, pos) #ת·¢Êý¾Ýµ½GameServer sendPack = SendPackProtocol.tagDGMergerChildToGameStringData() sendPack.Type = CommonDefine.dgMergerChildToCenter sendPack.DataLen = recvPack.DataLen sendPack.Data = recvPack.Data ServerMgr.packSendBySessionID(sendViaSessionID, SessionID, PoolIndex, CommonDefine.atInner, MMORPGPack.stGame, MMORPGPack.stData, sendPack.GetBuffer()) mylog.debug('OnMergerChildToCenter sendString toGameServer %s'%recvPack.Data) return True def OnMergeChildToCenterPlayerData(self,db, pack): mylog.debug('OnMergeChildToCenterPlayerData in') #αװÀ´Ô´£¬±ãÓڻذü #»ñÈ¡·¢°ü²ÎÊý ServerMgr = MongoDBServer.getServerMgr() sendViaSessionID = ServerMgr.getClientSessionIDByName("CenterGate",0) SessionID = 0 PoolIndex = -1 #¶ÁÈ¡Êý¾Ý buf = pack.getBuffer() recvPack = MergeServerRecvProtocol.tagLPPlayerData() pos = 0 recvPack.ReadData(buf, pos) #ת·¢Êý¾Ýµ½MapServer sendPack = SendPackProtocol.tagDMMergePlayerData() sendPack.Type = CommonDefine.dgDBToMapServer sendPack.SubType = CommonDefine.gmMergePlayerData sendPack.DataLen = recvPack.DataLen sendPack.Data = recvPack.Data sendPack.PlayerID = recvPack.PlayerID ServerMgr.packSendBySessionID(sendViaSessionID, SessionID, PoolIndex, CommonDefine.atInner, MMORPGPack.stRoute, MMORPGPack.stData, sendPack.GetBuffer()) mylog.debug('OnMergeChildToCenterPlayerData sendString toMapServer %s'%([recvPack.PlayerID, sendPack.DataLen,])) return True #µ¼³öµ¥Íæ¼ÒÊý¾Ý def DumpSinglePlayerDataByAcc(self,db,account): mylog.info('DumpSinglePlayerDataByAcc accid = %s'%account) #·ÇºÏ·þ #¶ÁÈ¡½ÇÉ«»ù±¾ÐÅÏ¢ dbPlayer = DataServerPlayerData.tagDBPlayer() dbPlayer.AccID = account dbPlayer.IsDeleted = 0 collection = db[UCN_DBPlayer] lastExceptionCnt = getADOExceptionCount() lastSIDErrorCnt = getSIDErrorCnt() loadOK = dbPlayer.adoLoadCEx(collection, {'AccID':fix_incomingText(dbPlayer.AccID), 'IsDeleted':dbPlayer.IsDeleted}) if not lastExceptionCnt == getADOExceptionCount(): #Êý¾Ý¿â¶ÁÈ¡³ö´í£¬µ«²»Ò»¶¨ÊÇUser¿â¶ÁÈ¡³ö´í mylog.info('DumpSinglePlayerDataByAcc Exception accid = %s,playerID = %s'%(queryAccid, dbPlayer.PlayerID)) return #¶ÁÈ¡ÎïÆ·µÈÆäËûÊý¾Ý #Èç¹ûûÓбØÒª£¬¾Í²»Ö§³Öµ¥±íģʽÁË #¶ÁÈ¡ÎïÆ· queryDict = {'PlayerID':dbPlayer.PlayerID} collection = db[UCN_RoleItem] itemData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleItem, True) itemCnt = CommFunc.ReadDWORD(itemData, 0) collection = db[UCN_RoleMission] missionData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMission) missionCnt = CommFunc.ReadDWORD(missionData, 0) collection = db[UCN_RoleMissionDict] roleMissionDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMissionDict) missonDictCnt = CommFunc.ReadDWORD(roleMissionDictData, 0) collection = db[UCN_RoleSkill] roleSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleSkill) skillCnt = CommFunc.ReadDWORD(roleSkillData, 0) collection = db[UCN_RoleBuff] roleBuffData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleBuff) bufCnt = CommFunc.ReadDWORD(roleBuffData, 0) collection = db[UCN_RoleRepeatTime] roleRepeatTimeData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleRepeatTime) repeatTimeCnt = CommFunc.ReadDWORD(roleRepeatTimeData, 0) collection = db[UCN_PlayerHorseTable] roleHorseData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerHorseTable) horseCnt = CommFunc.ReadDWORD(roleHorseData, 0) collection = db[UCN_GMOper] gmOperData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagGMOper) gmOperCnt = CommFunc.ReadDWORD(gmOperData, 0) collection = db[UCN_RolePet] rolePetData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRolePet) petCnt = CommFunc.ReadDWORD(rolePetData, 0) collection = db[UCN_PetSkill] petSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPetSkill) petSkillCnt = CommFunc.ReadDWORD(petSkillData, 0) collection = db[UCN_RoleNomalDict] roleNormalDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleNomalDict) dictCnt = CommFunc.ReadDWORD(roleNormalDictData, 0) collection = db[UCN_PlayerDienstgrad] roleDienstgradData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerDienstgrad) roleDienstgradCnt = CommFunc.ReadDWORD(roleDienstgradData, 0) collection = db[UCN_BattleFormation] battleFormationData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagBattleFormation) battleFormationCnt = CommFunc.ReadDWORD(battleFormationData, 0) #¶ÁÈ¡½ûÖ¹IPÊý¾Ý gmIP = DataServerPlayerData.tagDBGMIP() gmIP.AccID = account.lower() collection = db[UCN_DBGMIP] gmIPData = gmIP.adoQueryIndex(collection) gmIPCnt = CommFunc.ReadDWORD(gmIPData, 0) mylog.debug('gmIP cnt = %s'%gmIPCnt[0]) allData = dbPlayer.getBuffer() + itemData + missionData + roleMissionDictData + roleSkillData + roleBuffData + roleRepeatTimeData + roleHorseData + gmOperData\ + gmIPData + rolePetData + petSkillData + roleNormalDictData + roleDienstgradData+battleFormationData # DumpDir = os.path.join(GlobalFunctions.getAppPath(),"DumpPlayerData") if not os.path.exists(DumpDir): os.mkdir(DumpDir) fileHandler = open(os.path.join(DumpDir,"%s.pdsave"%account),'wb') import struct fileHandler.write(allData) fileHandler.flush() fileHandler.close() def SaveSinglePlayerDataFromDumpFile(self, db, account): # DumpDir = os.path.join(GlobalFunctions.getAppPath(),"DumpPlayerData") if not os.path.exists(DumpDir): os.mkdir(DumpDir) return (False, 0) FileDir = os.path.join(DumpDir,"%s.pdsave"%account) saveData = "" try: fileHandler = open(FileDir,'rb') saveData = fileHandler.read() fileHandler.close() except: return (False, 0) playerRec = DataServerPlayerData.tagDBPlayer() pos = 0 dbPlayerReadLen = playerRec.readData(saveData, pos, len(saveData)) if -1 == dbPlayerReadLen: return (False, 0) pos += dbPlayerReadLen mylog.info('Saving player data,playerID = %s....'%playerRec.PlayerID) if playerRec.PlayerID == 0: return (False, 0) #AccIDתСд playerRec.AccID = playerRec.AccID.lower() collection = db[UCN_DBPlayer] if not playerRec.adoCheckUpdateC(collection): # DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\Player_save', '%s.mdat'%sessionID, saveData) # mylog.error('player save error:playerID = %s'%playerRec.PlayerID) return (False, playerRec.PlayerID) #±£´æÎïÆ·µÈÆäËûÊý¾Ý #²»ÔÙÖ§³Öµ¥±íģʽ #²»ÔÙÖ§³ÖÎļþģʽ #±£´æÎïÆ· pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleItem, DataServerPlayerData.tagRoleItem, saveData[pos:], True) pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleMission, DataServerPlayerData.tagRoleMission, saveData[pos:]) pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleMissionDict, DataServerPlayerData.tagRoleMissionDict, saveData[pos:]) pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleSkill, DataServerPlayerData.tagRoleSkill, saveData[pos:]) pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleBuff, DataServerPlayerData.tagRoleBuff, saveData[pos:]) pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleRepeatTime, DataServerPlayerData.tagRoleRepeatTime, saveData[pos:]) pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_PlayerHorseTable, DataServerPlayerData.tagPlayerHorseTable, saveData[pos:]) #·âºÅ¼ì²é self.gmOperCheck(playerRec.AccID, playerRec.PlayerID, saveData[pos:]) pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_GMOper, DataServerPlayerData.tagGMOper, saveData[pos:]) #Ìø¹ýGM IP±í gmIPCnt, pos = CommFunc.ReadDWORD(saveData, pos) gmIPRec = DataServerPlayerData.tagDBGMIP() for i in xrange(gmIPCnt): #gmIPRec.clear() pos += gmIPRec.readData(saveData, pos, len(saveData)) pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RolePet, DataServerPlayerData.tagRolePet, saveData[pos:]) pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_PetSkill, DataServerPlayerData.tagPetSkill, saveData[pos:]) pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleNomalDict, DataServerPlayerData.tagRoleNomalDict, saveData[pos:]) pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_PlayerDienstgrad, DataServerPlayerData.tagPlayerDienstgrad, saveData[pos:]) pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_BattleFormation, DataServerPlayerData.tagBattleFormation, saveData[pos:]) assert pos == len(saveData) return (True, playerRec.PlayerID) #¶ÁÈ¡¾²Ì¬±í£¬ÓëÊý¾Ý¿âÎÞ¹Ø def OnGetGameData(self): sysData = DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinNPC, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagChinNPC.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagNPCRefresh, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagNPCRefresh.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinSkill, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagChinSkill.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinExp, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagChinExp.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinItem, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagChinItem.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagTransportRefresh, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagTransportRefresh.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinShopItem, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagChinShopItem.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagBornRefresh, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagBornRefresh.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinMixItem, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagChinMixItem.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagBuildEquip, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagBuildEquip.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagSuiteActivation, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagSuiteActivation.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagSuiteEffect, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagSuiteEffect.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagRepeatEvent, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagRepeatEvent.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagEffectRefresh, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagEffectRefresh.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinMap, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagChinMap.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagDBStoreItem, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagDBStoreItem.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagOnMissionDelete, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagOnMissionDelete.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagPet, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagPet.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagPetGrade, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagPetGrade.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagPetFriendliness, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagPetFriendliness.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagPetExp, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagPetExp.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagNPC_Item_Pet, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagNPC_Item_Pet.txt')) sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagFlyObjBaseInfo, os.path.join(GlobalFunctions.getAppPath(), CommonDefine.SYSDB_PATH, 'tagFlyObjBaseInfo.txt')) #ѹËõ try: compressSysData = zlib.compress(sysData, 9) #×î´óѹËõ #»Ø·¢µØÍ¼ data = '' data = CommFunc.WriteBYTE(data, CommonDefine.dgGameData) #1 data = CommFunc.WriteString(data, len(compressSysData), compressSysData) mylog.info('Load game sys data for len = %s - %s ok!'%(len(compressSysData), len(data))) NetPackCommon.SendPyPackToMapServerSelf(data, len(data)) except: msg = error.formatMsg('fatal', error.ERROR_NO_53, 'Compress game sys data failed!error = \n%s'%traceback.format_exc()) mylog.fatal(msg)