#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
#
|
|
import os
|
import zlib
|
from time import *
|
import datetime
|
from binascii import *
|
import uuid
|
import md5
|
import pymongo
|
import CtrlDB
|
from DBCommon import (CommonDefine, SingletonObject, DataDumper, GlobalFunctions, VersionNoDefine, error, DBController)
|
from Common import (CommFunc,CommFuncEx, mylog, RandowPswGenerator)
|
from Protocol import (RecvPackProtocol, SendPackProtocol, MergeServerRecvProtocol, MergeServerSendProtocol)
|
from Collections import (DataServerPlayerData, DataServerLogData)
|
from MangoDBCommon import (getADOExceptionCount, getSIDErrorCnt, addADOExceptionCount, seq, fix_outgoingText, fix_incomingText)
|
from ServerClientShareDefine import *
|
from Protocol import MMORPGPack
|
import ConfigParser
|
#import IPY_GameWorld
|
#from Config import (DBConfig,)
|
DBConfig = __import__('Config.DBConfig')
|
from ctypes import string_at
|
import traceback
|
from EventShell import (EventProcess, EventReport)
|
import inspect
|
from Collections.CollectionDefine import *
|
import binascii
|
from Net import (MongoDBServer, )
|
from GMToolLogicProcess import ProjSpecialProcess
|
from Common import (FileLog,)
|
import MergeProxyClientMgr
|
from Config import PyObjConfig
|
import PegasusCollectorProxy
|
import urllib
|
import urllib2
|
#-------------------------------------------------------------------------------
|
|
MERGE_POS_CONFIG_FILE = 'Config\\PosConfig.txt'
|
MergePlayerNameFormat_CONFIG_FILE = 'Config\\MergePlayerNameFormat.txt'
|
ATTR_CALL_TIME = ['weekday', 'year', 'month', 'day', 'hour', 'minute']
|
Def_Cmp_Lower = -1 #СÓÚ
|
Def_Cmp_Equ = 0 #µÈÓÚ
|
Def_Cmp_Greater = 1 #´óÓÚ
|
|
IsMergeServer = None
|
#g_mergeRegisterDateDict = {} # ¿ç·þÍæ¼ÒÍêÕû×¢²áÊý¾ÝÈÕÆÚ{newAccid:"ÈÕÆÚ", ...}
|
g_mergeRegisterPlayerDict = {} # ¿ç·þÍæ¼ÒÊý¾Ý»º´æ {accID:[pwd, encodedPsw, recvPack, ƽ̨±êʶ, serverID], ...}
|
(
|
MergeRegPInfoIndex_Pwd, # ¿ç·þÍæ¼ÒÉÏ´«Êý¾ÝÐÅÏ¢ÁбíË÷Òý - ÃÜÂë
|
MergeRegPInfoIndex_EncodedPsw, # ¿ç·þÍæ¼ÒÉÏ´«Êý¾ÝÐÅÏ¢ÁбíË÷Òý - ¼ÓÃܺóÃÜÂë
|
MergeRegPInfoIndex_PackData, # ¿ç·þÍæ¼ÒÉÏ´«Êý¾ÝÐÅÏ¢ÁбíË÷Òý - ÉÏ´«°üÊý¾Ý
|
MergeRegPInfoIndex_Operator, # ¿ç·þÍæ¼ÒÉÏ´«Êý¾ÝÐÅÏ¢ÁбíË÷Òý - ƽ̨±êʶ
|
MergeRegPInfoIndex_ServerID, # ¿ç·þÍæ¼ÒÉÏ´«Êý¾ÝÐÅÏ¢ÁбíË÷Òý - ·þÎñÆ÷ID
|
) = range(5)
|
|
#def fixMergedPlayerName(playerName):
|
# '''È¥³ýÃû×ÖÖеĺϷþÐÅÏ¢,¼´È¥µôÃû×ÖÖÐ'['ºóÃæµÄ²¿·Ö'''
|
# pos = playerName.find('[')
|
# if pos == -1:
|
# return playerName
|
# return playerName[:pos]
|
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)
|
#print "Dispatch>>>>> recv %s"%dataRecv
|
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)
|
#print "Dispatch>>>>> recv %s"%dataRecv
|
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, ctrlDBMgr):
|
CtrlDB.CtrlDB.__init__(self, 'UserCtrlDB', 3, ctrlDBMgr)
|
self.priorityQueueList[1][0] = (CommonDefine.gstUpdate,
|
CommonDefine.gstSaveMapServerCrashData
|
)
|
self.priorityQueueList[2][0] = (CommonDefine.gstSaveGameServerData,
|
CommonDefine.gstSavePlayerGMOPer)
|
self.priorityQueueList[0][0] = (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,
|
)
|
# self.__processRequestType = self.__userDBGameServerSaveRequestType + self.__userDBNormalRequestType
|
# + self.__userDBSaveRequestType
|
|
self.setServer(DBConfig.USER_DB_IP, DBConfig.USER_DB_PORT)
|
self.setDataBase(DBConfig.USER_DB_NAME, DBConfig.userdb_user, DBConfig.userdb_pwd)
|
self.loadMultiServerWarCfg()
|
#self.__LoadIntactUpLoadTimeCfg()
|
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()
|
|
def loadMultiServerWarCfg(self):
|
fileName = os.path.join(GlobalFunctions.getAppPath(), MERGE_POS_CONFIG_FILE)
|
if os.path.isfile(fileName):
|
self.__PosConfig = PyObjConfig.PyObjConfig(fileName)
|
|
self.__MergePlayerNameFormatConfig = None
|
fileName = os.path.join(GlobalFunctions.getAppPath(), MergePlayerNameFormat_CONFIG_FILE)
|
if os.path.isfile(fileName):
|
self.__MergePlayerNameFormatConfig = PyObjConfig.PyObjConfig(fileName)
|
|
# def __LoadIntactUpLoadTimeCfg(self):
|
# self.__IntactUpLoadTimeCfg = None
|
# fileName = os.path.join(GlobalFunctions.getAppPath(), "Config\\IntactUploadTime.txt")
|
# if os.path.isfile(fileName):
|
# self.__IntactUpLoadTimeCfg = PyObjConfig.PyObjConfig(fileName)
|
# mylog.info('__LoadIntactUpLoadTimeCfg OK')
|
# return
|
|
def IsMergeServer(self):
|
global IsMergeServer
|
|
if IsMergeServer != None:
|
return IsMergeServer
|
|
appPath = GlobalFunctions.getAppPath()
|
mylog.debug("appPath = %s" % (appPath))
|
rootPath = appPath.replace("db\PyMongoDataServer", "")
|
mylog.debug("rootPath=%s" % (rootPath))
|
fileName = os.path.join(rootPath, 'CoreServerGroup\\GameServer\\Config.ini')
|
|
if not os.path.isfile(fileName):
|
mylog.debug("can not find file %s" % fileName)
|
return False
|
|
mergeServerIni = ConfigParser.ConfigParser()
|
mergeServerIni.read(fileName)
|
|
section, option = "config", "IsMergeWarServe"
|
if not mergeServerIni.has_option(section, option):
|
mylog.info("%s ÕÒ²»µ½ÅäÖÃ: section=%s,option=%s" % (fileName, section, option))
|
return False
|
|
try:
|
IsMergeServer = int(mergeServerIni.get(section, option))
|
return IsMergeServer
|
except ValueError:
|
return False
|
|
def requestLogicProcess(self, db, pack):
|
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('gstMergeGeneralReturn')
|
oFuncGrade.Start()
|
self.OnGeneralDBOper(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.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
|
|
#µØÍ¼·þÎñÆ÷±£´æ±ÀÀ£Êý¾Ý
|
if requestType == CommonDefine.gstSaveMapServerCrashData:
|
#±£´æ±ÀÀ£Êý¾Ý£¬Ö®ºó¿ÉÄܲ»ÐèÒª
|
mylog.info("recv map server crash data!")
|
oFuncGrade = self.GetFuncGrade("gstSaveMapServerCrashData")
|
oFuncGrade.Start()
|
self.onSaveMapServerCrashData(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 = eval(recvPack.OperDict)
|
except Exception, e:
|
mylog.warning('eval(\'%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 OnMergeQueryRegisterResult(self, db, pack):
|
buf = pack.getBuffer()
|
#len = pack.getLength()
|
recvPack = MergeServerRecvProtocol.tagLPQueryRegisterResult()
|
pos = 0
|
recvPack.ReadData(buf, pos)
|
mylog.debug('pack = %s'%(binascii.b2a_hex(buf)))
|
|
clientSessionID = pack.getSessionID()
|
client = MergeProxyClientMgr.getMergeProxyClientMgr().findClientBySessionID(clientSessionID)
|
if not client:
|
mylog.warning('client not found!sessionID = %s'%(clientSessionID))
|
return
|
operator = client.operator
|
serverID = client.serverID
|
|
registerMap = DataServerPlayerData.tagMergeRegisterPlayerMap()
|
registerMap.SetOperator(operator)
|
registerMap.ServerID = serverID
|
registerMap.SetOrgAccID(recvPack.AccID)
|
col = db[UCN_MergeRegisterPlayerMap]
|
sendPack = MergeServerSendProtocol.tagMPQueryRegisterResult()
|
sendPack.Type = CommonDefine.dgMergeQueryNewAccount
|
if not registerMap.adoLoad(col):
|
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-%s].%s'%(registerMap.Operator, registerMap.ServerID,
|
registerMap.OrgAccID))
|
return
|
sendPack.Result = 1
|
sendPack.Account = registerMap.NewAccID
|
sendPack.AccountLen = len(sendPack.Account)
|
sendPack.Pwd = registerMap.NewPsw
|
sendPack.PwdLen = len(sendPack.Pwd)
|
self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
|
MMORPGPack.stNoSense, sendPack.GetBuffer())
|
mylog.info('query [%s-%s].%s ok!'%(operator, serverID, recvPack.AccID))
|
|
def OnMergeRegisterPlayerByCache(self, db, pack):
|
''' »º´æ¿ç·þÍæ¼ÒÉÏ´«Êý¾ÝÐÅÏ¢
|
ĿǰÕ˺š¢Íæ¼ÒID¡¢½ÇÉ«Ãû¾ùÒÑÈ·±£Î¨Ò»£¬¹ÊÎÞÐèÔÙÖØÐÂÉú³ÉеÄÕ˺ż°½ÇÉ«ÐÅÏ¢
|
Ö±½Ó½ÓÊÕ¸üлº´æ¼´¿É£¬Íæ¼ÒµÇ½¿ç·þ·þÎñÆ÷ʱֱ½Ó´Ó»º´æÊý¾ÝÖнâÎö½ÇÉ«Êý¾Ý£¬´Ó¶ø½ÚÊ¡db´æÈ¡²½Öè
|
'''
|
global 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
|
operator = client.operator
|
serverID = client.serverID
|
|
playerID = playerRec.PlayerID
|
accID = playerRec.AccID.lower().strip(chr(0))
|
|
if accID in g_mergeRegisterPlayerDict:
|
regPlayerInfo = g_mergeRegisterPlayerDict[accID]
|
pwd = regPlayerInfo[MergeRegPInfoIndex_Pwd]
|
encodedPsw = regPlayerInfo[MergeRegPInfoIndex_EncodedPsw]
|
else:
|
pwd = RandowPswGenerator.GeneratePsw(DBConfig.randPswLen, DBConfig.randPswHasDigit, DBConfig.randPswHasLowLetter,
|
DBConfig.randPswHasUpperLetter, DBConfig.randPswHasSpecialChar)
|
#¼ÓÃÜÃÜÂë
|
encoder = md5.new()
|
encoder.update(pwd)
|
encodedPsw = encoder.hexdigest()
|
encoder = md5.new()
|
encoder.update(encodedPsw)
|
encodedPsw = encoder.hexdigest()
|
mylog.debug('new pwd = %s,encodedPsw = %s' % (pwd, encodedPsw))
|
|
playerName = playerRec.PlayerName.strip()
|
|
#³É¹¦£¬·µ»ØÐÂÕʺÅÃÜÂë
|
loginResultPack.Result = 1
|
loginResultPack.Account = accID
|
loginResultPack.AccountLen = len(loginResultPack.Account)
|
loginResultPack.Pwd = pwd
|
loginResultPack.PwdLen = len(loginResultPack.Pwd)
|
self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
|
MMORPGPack.stNoSense, loginResultPack.GetBuffer())
|
|
mylog.info('player [%s-%s]accID=%s, playerID=%s, %s register PK ok!'%(operator.strip(chr(0)), serverID, accID, playerID, playerName))
|
g_mergeRegisterPlayerDict[accID] = [pwd, encodedPsw, recvPack, operator, serverID] # ¸üпç·þÍæ¼ÒÊý¾Ý»º´æ
|
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 OnMergeRegisterPlayer(self, db, pack):
|
# global g_mergeRegisterDateDict
|
# try:
|
# buf = pack.getBuffer()
|
## length = pack.getLength()
|
# 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
|
# pos += dbPlayerReadLen
|
# 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
|
# operator = client.operator
|
# serverID = client.serverID
|
# accid = playerRec.AccID.lower()
|
# #УÑéͨ¹ý£¬ÒÔÏ¿ªÊ¼ºÏ·þ
|
# #Ïȸù¾Ýoperator.serverID.accidÈ·¶¨ÊÇ·ñÒѱ¨Ãû¹ý
|
# registerMap = DataServerPlayerData.tagMergeRegisterPlayerMap()
|
# registerMap.SetOperator(operator)
|
# registerMap.ServerID = serverID
|
# registerMap.SetOrgAccID(accid)
|
# col = db[UCN_MergeRegisterPlayerMap]
|
# newPlayerID = 0
|
# newAccID = ''
|
# newPsw = ''
|
# firstRegister = False
|
# if registerMap.adoLoad(col):
|
# #Òѱ¨Ãû¹ý,¶ÁÈ¡
|
# newPlayerID = registerMap.NewPlayerID
|
# newAccID = registerMap.NewAccID
|
# newPsw = registerMap.NewPsw
|
# mylog.info('already register before!')
|
# else:
|
# firstRegister = True
|
# #䱨Ãû¹ý£¬Éú³É
|
# #ͬһÔËÓªÉ̵ÄÏàͬÕʺţ¬·µ»ØÊ§°Ü/ÊÓΪ2¸öÕʺÅ[Ôݲ»´¦Àí]
|
# newPlayerID = seq(db, UCN_DBPlayer, 'PlayerID', DBConfig.PLAYERID_FEED, DBConfig.PLAYERID_STEP)
|
# newAccID = '%s'%newPlayerID #ÒÔPlayerIDµÄ×Ö·û´®ÐÎʽ×÷ΪÐÂÕʺÅ
|
# newPsw = RandowPswGenerator.GeneratePsw(DBConfig.randPswLen, DBConfig.randPswHasDigit, DBConfig.randPswHasLowLetter,
|
# DBConfig.randPswHasUpperLetter, DBConfig.randPswHasSpecialChar)
|
# mylog.info('make new playerID = %s'%newPlayerID)
|
# #¼ÓÃÜÃÜÂë
|
# encoder = md5.new()
|
# encoder.update(newPsw)
|
# encodedPsw = encoder.hexdigest()
|
# encoder = md5.new()
|
# encoder.update(encodedPsw)
|
# encodedPsw = encoder.hexdigest()
|
# mylog.debug('new psw = %s,encodedPsw = %s'%(newPsw, encodedPsw))
|
#
|
# newAccid = newAccID.lower() #ÕʺŲ»Çø·Ö´óСд
|
# #Ìí¼Óµ½Õʺűí
|
# if firstRegister:
|
# newAccount = DataServerPlayerData.tagDSAccount()
|
# newAccount.SetACCID(newAccid)
|
# newAccount.SetPsw(encodedPsw)
|
# newAccount.Adult = 1 #Ç¿ÖÆÒѳÉÄê
|
# newAccount.SetOperator(operator)
|
# newAccount.AreaID = serverID #·þÎñÆ÷±àºÅ
|
# newAccount.ApplyingAdult = 0
|
# newAccount.SetRegisterTime(datetime.datetime.now().isoformat())
|
# colAccout = db[UCN_DSAccount]
|
# if not newAccount.adoInsertC(colAccout):
|
# loginResultPack.Result = 0
|
# loginResultPack.ErrorMsg = 'Insert account failed!!'
|
# loginResultPack.ErrorMsgLen = len(loginResultPack.ErrorMsg)
|
# self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
|
# MMORPGPack.stNoSense, loginResultPack.GetBuffer())
|
# mylog.warning('Insert account %s failed!'%(newAccid))
|
# return
|
# mylog.info('Insert account = %s ok!'%newAccount.ACCID)
|
#
|
# #¸üÐÂtagDBPlayer±íµÄÕʺÅ×Ö¶Î
|
# playerRec.SetAccID(newAccid)
|
# playerRec.PlayerID = newPlayerID
|
# #¼Ç¼×Ó·þƽ̨¡¢Çø·þÐÅÏ¢µ½tagDBPlayer
|
# playerRec.SetOperate(operator)
|
# playerRec.ServerID = serverID
|
# #¸ÄÃû
|
## orgPlayerName = fixMergedPlayerName(playerRec.PlayerName.strip(chr(0)))
|
# orgPlayerName = playerRec.PlayerName.strip()
|
# #playerRec.SetPlayerName('%s[%s-%s]'%(orgPlayerName, operator.strip(chr(0)), serverID))
|
#
|
# #È¡Õʺźó׺×÷ÎªÇø·þ±êʶ
|
# parserList = accid.split('@')
|
# serverSign = ""
|
# if len(parserList) >= 2:
|
# serverSign = parserList[-1]
|
#
|
# parserList2 = orgPlayerName.split('-')
|
# orgNameServerSign = ""
|
# if len(parserList2) >= 2:
|
# orgNameServerSign = parserList2[-1]
|
# if orgNameServerSign and orgNameServerSign == serverSign:
|
# #Ãû³Æºó׺ÒѾºÍÕʺźó׺һÖ£¬ÎÞÐë¸ÄÃû
|
# pass
|
# else:
|
# if serverSign:
|
# newName = "%s-%s"%(orgPlayerName, serverSign)
|
# playerRec.SetPlayerName(newName)
|
# else:
|
# playerRec.SetPlayerName('%s[%s-%s]'%(orgPlayerName, operator.strip(chr(0)), serverID))
|
#
|
# mylog.debug('new player name = %s ok!'%playerRec.PlayerName)
|
## #É趨ËùÔÚµØÍ¼ºÍ×ø±ê
|
## posConfigKey = '%s-%s'%(operator.strip(chr(0)), serverID)
|
## resetPos = self.__PosConfig.config.get(posConfigKey)
|
## if not resetPos:
|
## #³¢ÊÔÖØ¶Á
|
## self.loadMultiServerWarCfg()
|
## resetPos = self.__PosConfig.config.get(posConfigKey)
|
## if not resetPos:
|
## mylog.error('MultiServerWarConfig error!key = %s not found!'%(posConfigKey))
|
## return
|
## mapid, posX, posY = resetPos
|
##
|
## playerRec.MapID = mapid
|
## playerRec.DataMapID = mapid
|
## playerRec.CopyMapID = mapid
|
## playerRec.PosX = posX
|
## playerRec.PosY = posY
|
##
|
## playerRec.FromDataMapID = mapid
|
## playerRec.FromMapID = mapid
|
## playerRec.FromCopyMapID = mapid
|
## playerRec.FromPosX = posX
|
## playerRec.FromPosY = posY
|
##
|
## playerRec.RebornMapID = mapid
|
## playerRec.RebornPosX = posX
|
## playerRec.RebornPosY = posY
|
#
|
# playerRec.MapID = recvPack.SelectMapID
|
# playerRec.DataMapID = recvPack.SelectDataMapID
|
# playerRec.CopyMapID = recvPack.SelectCopyMapID
|
# playerRec.PosX = recvPack.SelectPosX
|
# playerRec.PosY = recvPack.SelectPosY
|
#
|
# playerRec.FromDataMapID = recvPack.SelectDataMapID
|
# playerRec.FromMapID = recvPack.SelectMapID
|
# playerRec.FromCopyMapID = recvPack.SelectCopyMapID
|
# playerRec.FromPosX = recvPack.SelectPosX
|
# playerRec.FromPosY = recvPack.SelectPosY
|
#
|
# playerRec.RebornMapID = recvPack.SelectMapID
|
# playerRec.RebornPosX = recvPack.SelectPosX
|
# playerRec.RebornPosY = recvPack.SelectPosY
|
#
|
#
|
# #¸üÐÂtagDBPlayer
|
# col = db[UCN_DBPlayer]
|
# if not playerRec.adoCheckUpdateC(col):
|
# loginResultPack.Result = 0
|
# loginResultPack.ErrorMsg = 'CheckUpdate role failed!'
|
# loginResultPack.ErrorMsgLen = len(loginResultPack.ErrorMsg)
|
# self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
|
# MMORPGPack.stNoSense, loginResultPack.GetBuffer())
|
# mylog.warning('CheckUpdate player %s.%s failed!'%(playerRec.AccID, playerRec.PlayerID))
|
# return
|
# mylog.info('CheckUpdate player %s %s %s ok!'%(playerRec.AccID, playerRec.PlayerID, playerRec.PlayerName))
|
#
|
# isIntactUpload = self.__GetIsIntactUpLoad()
|
#
|
# # ÿÌìÖ»ÍêÕû¸üÐÂÒ»´Î
|
# saveDateStr = g_mergeRegisterDateDict.get(newAccid, "")
|
# curDateStr = strftime("%Y-%m-%d", localtime())
|
# mylog.info('Check updatePlayerIDAndSavePlayerMapServerDataEx saveDateStr=%s,curDateStr=%s,isIntactUpload=%s'
|
# % (saveDateStr, curDateStr, isIntactUpload))
|
#
|
# # Ê×´ÎÉÏ´« »ò ·ÇÊ×´ÎÉÏ´«ÇÒ·ÇͬһÌì
|
# if saveDateStr != curDateStr or isIntactUpload:
|
# #ͬ²½PlayerID¡¢PetID¡¢OwnerID¡¢TruckID
|
# self.updatePlayerIDAndSavePlayerMapServerDataEx(db, playerData[pos:], newPlayerID)
|
# mylog.info(' updatePlayerIDAndSavePlayerMapServerDataEx OK! firstRegister=%s' % firstRegister)
|
# g_mergeRegisterDateDict[newAccid] = curDateStr
|
#
|
# #¼Ç¼µ½Ó³Éä±í
|
# if firstRegister:
|
# registerMap.SetNewAccID(newAccid)
|
# registerMap.SetNewPsw(newPsw)
|
# registerMap.NewPlayerID = newPlayerID
|
# col = db[UCN_MergeRegisterPlayerMap]
|
# if not registerMap.adoCheckUpdate(col):
|
# loginResultPack.Result = 0
|
# loginResultPack.ErrorMsg = 'update map table failed!'
|
# loginResultPack.ErrorMsgLen = len(loginResultPack.ErrorMsg)
|
# self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
|
# MMORPGPack.stNoSense, loginResultPack.GetBuffer())
|
# mylog.warning('update map table failed!%s-%s-%s'%(registerMap.Operator, registerMap.ServerID,
|
# registerMap.OrgAccID))
|
# return
|
#
|
# #³É¹¦£¬·µ»ØÐÂÕʺÅÃÜÂë
|
# loginResultPack.Result = 1
|
# loginResultPack.Account = newAccid
|
# loginResultPack.AccountLen = len(loginResultPack.Account)
|
# loginResultPack.Pwd = newPsw
|
# loginResultPack.PwdLen = len(loginResultPack.Pwd)
|
# self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
|
# MMORPGPack.stNoSense, loginResultPack.GetBuffer())
|
# mylog.info('player [%s-%s].%s->%s.%s register PK ok!'%(registerMap.Operator, registerMap.ServerID,
|
# registerMap.OrgAccID, registerMap.NewAccID,
|
# registerMap.NewPlayerID))
|
# 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)
|
#
|
# ## »ñÈ¡ÊÇ·ñÍêÕûÉÏ´«Êý¾Ý
|
# def __GetIsIntactUpLoad(self):
|
#
|
# #mylog.info('__GetIsIntactUpLoad...')
|
#
|
# if self.__IntactUpLoadTimeCfg == None:
|
# mylog.info(' ûÓÐÍêÕûÉÏ´«Êý¾Ýʱ¼äÅäÖã¬ÖØÐ¼ÓÔØ£¡')
|
# self.__LoadIntactUpLoadTimeCfg()
|
# return False
|
#
|
# timeList = self.__IntactUpLoadTimeCfg.config
|
#
|
# curTime = datetime.datetime.today()
|
# curTimeStr = str(curTime)
|
# curTimeStr = curTimeStr.split(".")[0]
|
#
|
# #mylog.info(' curTimeStr=%s,timeList=%s' % (curTimeStr, str(timeList)))
|
#
|
# for timeInfo in timeList:
|
#
|
# #mylog.info(' check timeInfo=%s' % (str(timeInfo)))
|
# # ÅжÏÈÕÆÚ
|
# dateTimeInfo = timeInfo[0]
|
# startTime = dateTimeInfo[0]
|
# endTime = dateTimeInfo[1]
|
# if curTimeStr < startTime or curTimeStr > endTime:
|
# #mylog.info(' ·ÇÍêÕûÉÏ´«Ê±¼ä¶Î!')
|
# continue
|
#
|
# beginTime = timeInfo[1]
|
# endTime = timeInfo[2]
|
#
|
# if CompareActTime(curTime, beginTime) in [Def_Cmp_Greater, Def_Cmp_Equ] \
|
# and CompareActTime(curTime, endTime) in [Def_Cmp_Lower, Def_Cmp_Equ]:
|
# #mylog.info(' µ±Ç°ÊÇÍêÕûÉÏ´«Ê±¼ä!')
|
# return True
|
#
|
# #mylog.info(' ·ÇÍêÕûÉÏ´«Ê±¼ä!')
|
#
|
# #mylog.info(' ËùÓÐʱ¼ä¼ì²éÍê±Ï£¬µ±Ç°·ÇÍêÕûÉÏ´«Ê±¼ä!')
|
# return False
|
|
# # @param saveData: ÎïÆ·Êý¾Ý¿ªÍ·
|
# # @param newPlayerID: ÐÂPlayerID
|
# def updatePlayerIDAndSavePlayerMapServerDataEx(self, db, saveData, newPlayerID):
|
# pos = 0
|
# #±£´æÎïÆ·µÈÆäËûÊý¾Ý
|
# #²»ÔÙÖ§³Öµ¥±íģʽ
|
# #²»ÔÙÖ§³ÖÎļþģʽ
|
# #±£´æÎïÆ·
|
# oFuncGrade = self.GetFuncGrade("UpdatePlayerIDAndSavePlayerMapServerDataEx_1_tagRoleItem")
|
# oFuncGrade.Start()
|
# pos += self.updatePlayerIDAndSavePlayerDataEx(newPlayerID, db, UCN_RoleItem, DataServerPlayerData.tagRoleItem, saveData[pos:], True)
|
# oFuncGrade.End()
|
#
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerMapServerDataEx_1_tagRoleMission")
|
# oFuncGrade.Start()
|
# pos += self.updatePlayerIDAndSavePlayerDataEx(newPlayerID, db, UCN_RoleMission, DataServerPlayerData.tagRoleMission, saveData[pos:])
|
# oFuncGrade.End()
|
#
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerMapServerDataEx_1_tagRoleMissionDict")
|
# oFuncGrade.Start()
|
# pos += self.updatePlayerIDAndSavePlayerDataEx(newPlayerID, db, UCN_RoleMissionDict, DataServerPlayerData.tagRoleMissionDict, saveData[pos:])
|
# oFuncGrade.End()
|
#
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerMapServerDataEx_1_tagRoleSkill")
|
# oFuncGrade.Start()
|
# pos += self.updatePlayerIDAndSavePlayerDataEx(newPlayerID, db, UCN_RoleSkill, DataServerPlayerData.tagRoleSkill, saveData[pos:])
|
# oFuncGrade.End()
|
#
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerMapServerDataEx_1_tagRoleBuff")
|
# oFuncGrade.Start()
|
# pos += self.updatePlayerIDAndSavePlayerDataEx(newPlayerID, db, UCN_RoleBuff, DataServerPlayerData.tagRoleBuff, saveData[pos:])
|
# oFuncGrade.End()
|
#
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerMapServerDataEx_1_tagRoleRepeatTime")
|
# oFuncGrade.Start()
|
# pos += self.updatePlayerIDAndSavePlayerDataEx(newPlayerID, db, UCN_RoleRepeatTime, DataServerPlayerData.tagRoleRepeatTime, saveData[pos:])
|
# oFuncGrade.End()
|
#
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerMapServerDataEx_1_tagPlayerHorseTable")
|
# oFuncGrade.Start()
|
# pos += self.updatePlayerIDAndSavePlayerDataEx(newPlayerID, db, UCN_PlayerHorseTable, DataServerPlayerData.tagPlayerHorseTable, saveData[pos:])
|
# oFuncGrade.End()
|
#
|
# #Ìø¹ýgmOperCheckÊý¾Ý
|
# pos += self.updatePlayerIDAndSavePlayerDataEx(newPlayerID, db, UCN_GMOper, DataServerPlayerData.tagGMOper, saveData[pos:])
|
# #Ìø¹ýGM IP±í
|
# gmIPCnt, pos = CommFunc.ReadDWORD(saveData, pos)
|
# gmIPRec = DataServerPlayerData.tagDBGMIP()
|
# for i in xrange(gmIPCnt):
|
# pos += gmIPRec.readData(saveData, pos, len(saveData))
|
#
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerMapServerDataEx_1_tagRolePet")
|
# oFuncGrade.Start()
|
# pos += self.updatePlayerIDAndSavePlayerDataEx(newPlayerID, db, UCN_RolePet, DataServerPlayerData.tagRolePet, saveData[pos:])
|
# oFuncGrade.End()
|
#
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerMapServerDataEx_1_tagPetSkill")
|
# oFuncGrade.Start()
|
# pos += self.updatePlayerIDAndSavePlayerDataEx(newPlayerID, db, UCN_PetSkill, DataServerPlayerData.tagPetSkill, saveData[pos:])
|
# oFuncGrade.End()
|
#
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerMapServerDataEx_1_tagRoleNomalDict")
|
# oFuncGrade.Start()
|
# pos += self.updatePlayerIDAndSavePlayerDataEx(newPlayerID, db, UCN_RoleNomalDict, DataServerPlayerData.tagRoleNomalDict, saveData[pos:])
|
# oFuncGrade.End()
|
#
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerMapServerDataEx_1_tagPlayerDienstgrad")
|
# oFuncGrade.Start()
|
# pos += self.updatePlayerIDAndSavePlayerDataEx(newPlayerID, db, UCN_PlayerDienstgrad, DataServerPlayerData.tagPlayerDienstgrad, saveData[pos:])
|
# oFuncGrade.End()
|
#
|
#
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerMapServerDataEx_1_tagBattleFormation")
|
# oFuncGrade.Start()
|
# pos += self.updatePlayerIDAndSavePlayerDataEx(newPlayerID, db, UCN_BattleFormation, DataServerPlayerData.tagBattleFormation, saveData[pos:])
|
# oFuncGrade.End()
|
#
|
# assert pos == len(saveData)
|
# return (True, newPlayerID)
|
#
|
# def updatePlayerIDAndSavePlayerDataEx(self, newPlayerID, db, collectionName, structName, data, checkSID = False):
|
# '''±£´æÍæ¼ÒÎïÆ·µÈÊý¾Ý£¬ÓÅ»¯°æ'''
|
# oAllFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerDataEx_%s_All"%structName)
|
# oAllFuncGrade.Start()
|
# collection = db[collectionName]
|
#
|
# collection.remove({'PlayerID':newPlayerID})
|
#
|
# #²åÈëÐÂÊý¾Ý
|
# pos = 0
|
# cnt, pos = CommFunc.ReadDWORD(data, pos)
|
# mylog.debug('updatePlayerIDAndSavePlayerDataEx %s data, playerID = %s, cnt = %s'%(structName, newPlayerID, cnt))
|
# rec = structName()
|
# length = len(data)
|
# #ÕâÀォÊý¾Ý´ò³ÉÒ»¸ö×ֵ䣬¼´Êý¾Ý¿âµÄÒ»Ìõ¼Ç¼´æ´¢£¬ÕâÑù»á±ÈÏÂÃæÄÇÖÖ·½Ê½¿ì
|
# doc = {}
|
# if cnt:
|
# doc['PlayerID'] = newPlayerID
|
# doc['Count'] = cnt
|
# doc['__PackSave'] = 1
|
#
|
# for i in xrange(cnt):
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerDataEx_%s_clear"%structName)
|
# oFuncGrade.Start()
|
# rec.clear()
|
# oFuncGrade.End()
|
#
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerDataEx_%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
|
# #mylog.info('update %s.PlayerID %s->%s'%(rec.__class__.__name__, orgPlayerID, newPlayerID))
|
# #¸üÐÂPetID×Ö¶Î
|
# if CommFuncEx.hasField(rec, 'PetID'):
|
# if orgPlayerID:
|
# oldPetID = rec.PetID
|
# petIndex = rec.PetID % orgPlayerID - 1
|
# rec.PetID = CommonDefine.makePetID(newPlayerID, petIndex)
|
# #mylog.info('update %s.PetID %s[%s]->%s[%s]'%(rec.__class__.__name__, oldPetID, orgPlayerID,
|
# # rec.PetID, newPlayerID))
|
# #¸üÐÂTruckID×Ö¶Î
|
# if CommFuncEx.hasField(rec, 'TruckID'):
|
# rec.TructID = CommonDefine.makeTruckID(newPlayerID)
|
# #mylog.info('update %s.TructID %s[%s]'%(rec.__class__.__name__, rec.TructID, 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
|
# #mylog.info('update %s.OwnerID %s[%s]->%s[%s]'%(rec.__class__.__name__, oldOwnerID, orgPlayerID, rec.OwnerID, newPlayerID))
|
#
|
# if checkSID:
|
# oFuncGrade = self.GetFuncGrade("updatePlayerIDAndSavePlayerDataEx_%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("updatePlayerIDAndSavePlayerDataEx_%s_insert"%structName)
|
# oFuncGrade.Start()
|
# collection.insert(doc, False, True)
|
# oFuncGrade.End()
|
# break
|
# except pymongo.errors.OperationFailure, err:
|
# if(DBConfig.TryCntOnWriteFail > trycnt):
|
# trycnt += 1
|
# continue
|
# addADOExceptionCount()
|
# mylog.info("docs = %s"%(doc))
|
# mylog.error('Insert failed!docs = %s, error = %s, trycnt = %d'%(doc, err, trycnt))
|
# break
|
# oAllFuncGrade.End()
|
# return pos
|
|
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'])
|
|
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):
|
'''±£´æÍæ¼ÒÐÅÏ¢'''
|
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):
|
msg = error.formatMsg('error', error.ERROR_NO_57, "load account failed, accid = %s"%PlayerAcc.ACCID)
|
mylog.error(msg)
|
return
|
|
PlayerAcc.GeTuiClientID = PlayerInfo.GeTuiClientID
|
|
PlayerAcc.adoUpdateC(col)
|
|
def OnPrepareCreateRole(self, db, pack):
|
'''½øÈë´´½ÇÂñµã'''
|
pos = 0
|
|
PlayerInfo = RecvPackProtocol.tagLDPrepareCreateRole()
|
pos = PlayerInfo.ReadData( pack.getBuffer(), pos)
|
|
PegasusCollectorProxy.EventReport(9001, "OperatorID=%s&Step=%s&AccountID=%s&Flag=1000"%(
|
CommFunc.GetPlayerPlatform(PlayerInfo.AccID), 2, CommFunc.GetPlatformAccID(PlayerInfo.AccID)))
|
|
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)
|
|
def onSaveMapServerPlayerDataMergeServer(self, db, pack):
|
'''Íæ¼ÒÏÂÏߣ¬¿ç·þ·þÎñÆ÷ÏÂÏß²»±£´æ'''
|
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, playerID = self.__ReadPlayerID(db, 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
|
mylog.info("onSaveMapServerPlayerData 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())
|
|
# Íæ¼ÒÏÂÏ߻ָ´³äÖµ¶Ò»»ÖеĶ©µ¥,IsProceeΪ1,µ«endtimeΪ¿ÕµÄÇé¿ö
|
self.RevoverBillProcess(db, accID)
|
return (result, playerID)
|
|
# Íæ¼ÒÏÂÏ߻ָ´³äÖµ¶Ò»»ÖеĶ©µ¥,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:
|
maylog.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.FacePic == 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):
|
'''±£´æÍæ¼ÒÎïÆ·µÈÊý¾Ý£¬ÓÅ»¯°æ'''
|
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}) #ÕâÀïËäȻûÓÐ×öË÷Òý£¬µ«ÊÇËٶȺܿ죬ºöÂÔ
|
oFuncGrade.End()
|
|
#²åÈëÐÂÊý¾Ý
|
pos = 0
|
cnt, pos = CommFunc.ReadDWORD(data, pos)
|
mylog.debug('saving %s data, playerID = %s, cnt = %s'%(structName, 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_insert"%structName)
|
oFuncGrade.Start()
|
collection.insert(doc, False, True)
|
oFuncGrade.End()
|
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('Insert failed!docs = %s, error = %s, trycnt = %d'%(doc, err, trycnt))
|
break
|
oAllFuncGrade.End()
|
return pos
|
|
|
def savePlayerData(self, playerID, db, collectionName, structName, data, checkSID = False):
|
'''±£´æÍæ¼ÒÎïÆ·Êý¾Ý'''
|
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()
|
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
|
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):
|
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()
|
print result
|
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·ÖÅä·þÎñÆ÷»ñÈ¡
|
import thread
|
self.CheckEmptyPlayerIDCount(db)
|
print "CheckEmptyPlayerIDCount OK"
|
return self.PopEmptyPlayerID(db)
|
|
def CreateRole(self, db, pack):
|
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
|
#УÑéͨ¹ý£¬ÍùÊý¾Ý¿âÖвåÈë½ÇÉ«
|
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
|
|
#´´½ÇÁ÷Ïò
|
dbServerLogRec = RecvPackProtocol.tagDBServerLogRec()
|
dbServerLogRec.Type = CommonDefine.gstSavePlayerLog
|
dbServerLogRec.Oper = 80 #´´½ÇÁ÷Ïò
|
dbServerLogRec.Time = time()
|
dbServerLogRec.MapID = 1
|
dbServerLogRec.PlayerID = createPlayer.PlayerID
|
dbServerLogRec.Msg = "AccID=%s&Name=%s&Sex=%s&Job=%s"%(createPlayer.AccID,
|
createPlayer.PlayerName,
|
createPlayer.Sex,
|
createPlayer.Job)
|
dbServerLogRec.MsgLen = len(dbServerLogRec.Msg)
|
self.sendDBRequest(dbServerLogRec.GetBuffer())
|
#ÈÕÖ¾Íæ¼Ò_´´½¨½ÇÉ«¸üÐÂ#tagDBPlayerInfoLogCreateRole
|
createRoleLog = DataServerLogData.tagDBPlayerInfoLogCreateRole()
|
createRoleLog.AccID = createPlayer.AccID
|
createRoleLog.PlayerName = createPlayer.PlayerName
|
createRoleLog.Sex = createPlayer.Sex
|
createRoleLog.Face = createPlayer.Face
|
createRoleLog.PlayerRegisterTime = time()
|
createRoleLog.PlayerID = createPlayer.PlayerID
|
sendBuf = ''
|
sendBuf = CommFunc.WriteBYTE(sendBuf, CommonDefine.gstSavePlayerInfoLogOnCreate)
|
sendBuf = CommFunc.WriteString(sendBuf, createRoleLog.getLength(), createRoleLog.getBuffer())
|
self.sendDBRequest(sendBuf)
|
|
#ÐÂÍæ¼Òµ¼Èë - ´´½Ç³É¹¦²½Öèʼþ
|
PegasusCollectorProxy.EventReport(9001, "OperatorID=%s&Step=%s&AccountID=%s&Flag=1000"%(
|
CommFunc.GetPlayerPlatform(createPlayer.AccID), 3, CommFunc.GetPlatformAccID(createPlayer.AccID)))
|
|
#UTF8 ÐèҪת³Éurl±àÂë²Å¿ÉÓÃ
|
playerInfo = urllib.urlencode({"OperatorID": CommFunc.GetPlayerPlatform(createPlayer.AccID),
|
"RoleID": createPlayer.PlayerName,
|
"AccountID": CommFunc.GetPlatformAccID(createPlayer.AccID),
|
"Job": createPlayer.Job})
|
|
PegasusCollectorProxy.EventReport(1103, playerInfo)
|
#=======================================================================
|
# entryEvent = EventReport.entry()
|
# entryEvent.SetEventAgentInfo(CommFunc.GetPlayerPlatform(createPlayer.AccID))
|
# entryEvent.account_id = CommFunc.GetPlatformAccID(createPlayer.AccID)
|
# entryEvent.step = entryEvent.Def_EntryStep_CreatRole
|
# entryEvent.ip = createPlayer.LoginIP
|
# entryEvent.account_name = entryEvent.account_id
|
# EventReport.WriteEvent(entryEvent)
|
#=======================================================================
|
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, pack):
|
''' »ñÈ¡¿ç·þÍæ¼ÒÏêϸÐÅÏ¢ '''
|
global g_mergeRegisterPlayerDict
|
getPlayerDetailReq = RecvPackProtocol.tagPlayerDetailReq()
|
getPlayerDetailReq.ReadData(pack.getBuffer(), 0, pack.getLength())
|
mylog.debug('getting mergePlayer detail for accid = %s'%getPlayerDetailReq.AccID)
|
queryAccid = getPlayerDetailReq.AccID.lower().strip(chr(0))
|
if queryAccid not in g_mergeRegisterPlayerDict:
|
# ²»ÔÚ¿ç·þ»º´æÖеĴӿâÖÐÈ¡
|
return self.onGetPlayerDetail(db, pack)
|
|
#recvPack = MergeServerRecvProtocol.tagLPRegisterPlayer()
|
regPlayerInfo = g_mergeRegisterPlayerDict[queryAccid]
|
recvPack = regPlayerInfo[MergeRegPInfoIndex_PackData]
|
#operator = regPlayerInfo[MergeRegPInfoIndex_Operator].strip(chr(0)) # ƽ̨¸ÄΪֱ½ÓÈ¥´ÓÕ˺ÅÖÐÈ¡£¬Ö§³Ö»ì·þ
|
#serverID = regPlayerInfo[MergeRegPInfoIndex_ServerID]
|
playerData = recvPack.Data
|
dbPlayer = DataServerPlayerData.tagDBPlayer()
|
pos = 0
|
dbPlayerReadLen = dbPlayer.readData(playerData, pos, len(playerData))
|
playerID = dbPlayer.PlayerID
|
pos += dbPlayerReadLen
|
dbPlayer.MapID = recvPack.SelectMapID
|
dbPlayer.DataMapID = recvPack.SelectDataMapID
|
dbPlayer.CopyMapID = recvPack.SelectCopyMapID
|
dbPlayer.PosX = recvPack.SelectPosX
|
dbPlayer.PosY = recvPack.SelectPosY
|
|
dbPlayer.FromDataMapID = recvPack.SelectDataMapID
|
dbPlayer.FromMapID = recvPack.SelectMapID
|
dbPlayer.FromCopyMapID = recvPack.SelectCopyMapID
|
dbPlayer.FromPosX = recvPack.SelectPosX
|
dbPlayer.FromPosY = recvPack.SelectPosY
|
|
dbPlayer.RebornMapID = recvPack.SelectMapID
|
dbPlayer.RebornPosX = recvPack.SelectPosX
|
dbPlayer.RebornPosY = recvPack.SelectPosY
|
|
playerName = dbPlayer.PlayerName.strip()
|
accID = dbPlayer.AccID.lower().strip(chr(0))
|
operator = CommFunc.GetPlayerPlatform(accID)
|
serverID = CommFunc.GetPlayerServerID(accID)
|
newPlayerName = self.__GetMergePlayerName(operator, serverID, playerName)
|
if playerName != newPlayerName:
|
dbPlayer.SetPlayerName(newPlayerName)
|
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_1_tagRoleItem")
|
oFuncGrade.Start()
|
p, itemData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagRoleItem, playerData[pos:], True)
|
pos += p
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_1_tagRoleMission")
|
oFuncGrade.Start()
|
p, missionData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagRoleMission, playerData[pos:])
|
pos += p
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_1_tagRoleMissionDict")
|
oFuncGrade.Start()
|
p, roleMissionDictData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagRoleMissionDict, playerData[pos:])
|
pos += p
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_1_tagRoleSkill")
|
oFuncGrade.Start()
|
p, roleSkillData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagRoleSkill, playerData[pos:])
|
pos += p
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_1_tagRoleBuff")
|
oFuncGrade.Start()
|
p, roleBuffData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagRoleBuff, playerData[pos:])
|
pos += p
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_1_tagRoleRepeatTime")
|
oFuncGrade.Start()
|
p, roleRepeatTimeData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagRoleRepeatTime, playerData[pos:])
|
pos += p
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_1_tagPlayerHorseTable")
|
oFuncGrade.Start()
|
p, roleHorseData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagPlayerHorseTable, playerData[pos:])
|
pos += p
|
oFuncGrade.End()
|
|
#Ìø¹ýgmOperCheckÊý¾Ý
|
p, gmOperData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagGMOper, playerData[pos:])
|
pos += p
|
#Ìø¹ýGM IP±í
|
p, gmIPData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagDBGMIP, playerData[pos:])
|
pos += p
|
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_1_tagRolePet")
|
oFuncGrade.Start()
|
p, rolePetData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagRolePet, playerData[pos:])
|
pos += p
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_1_tagPetSkill")
|
oFuncGrade.Start()
|
p, petSkillData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagPetSkill, playerData[pos:])
|
pos += p
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_1_tagRoleNomalDict")
|
oFuncGrade.Start()
|
p, roleNormalDictData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagRoleNomalDict, playerData[pos:])
|
pos += p
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_1_tagPlayerDienstgrad")
|
oFuncGrade.Start()
|
p, roleDienstgradData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagPlayerDienstgrad, playerData[pos:])
|
pos += p
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_1_tagBattleFormation")
|
oFuncGrade.Start()
|
p, battleFormationData = self.getMergePlayerDataBuffer(playerID, DataServerPlayerData.tagBattleFormation, playerData[pos:])
|
pos += p
|
oFuncGrade.End()
|
|
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)
|
mylog.debug('gstPlayerDetail Send operator=%s,serverID=%s, accid = %s playerID = %s playerName = %s newPlayerName=%s'
|
%(operator, serverID, queryAccid, dbPlayer.PlayerID, playerName, newPlayerName))
|
return
|
|
def __GetMergePlayerName(self, operator, serverID, playerName):
|
# »ñÈ¡Íæ¼Ò¿ç·þ·þÎñÆ÷ÉϵÄÃû×Ö
|
if not self.__MergePlayerNameFormatConfig:
|
return playerName
|
try:
|
splitSign, withServerFormat, withoutServerFormat = self.__MergePlayerNameFormatConfig.config
|
curFormat, curParam = withServerFormat if splitSign in playerName else withoutServerFormat
|
curParam = eval(str(curParam).replace("operator", operator).replace("serverID", str(serverID)).replace("playerName", playerName))
|
return curFormat % curParam
|
except:
|
mylog.error("__GetMergePlayerName error! operator=%s, serverID=%s, playerName=%s" % (operator, serverID, playerName))
|
return playerName
|
|
def onGetPlayerDetail(self, db, pack):
|
getPlayerDetailReq = RecvPackProtocol.tagPlayerDetailReq()
|
getPlayerDetailReq.ReadData(pack.getBuffer(), 0, pack.getLength())
|
mylog.debug('getting player detail for accid = %s'%getPlayerDetailReq.AccID)
|
queryAccid = getPlayerDetailReq.AccID.lower().strip(chr(0))
|
#Åж¨ÊÇ·ñÔںϷþÖ®ÖÐ
|
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:
|
#ºÏ·þ´¦Àí
|
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 = getPlayerDetailReq.AccID
|
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
|
mylog.info('accid = %s,playerID = %s'%(queryAccid, dbPlayer.PlayerID))
|
|
#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
|
|
#¶ÁÈ¡ÎïÆ·µÈÆäËûÊý¾Ý
|
#Èç¹ûûÓбØÒª£¬¾Í²»Ö§³Öµ¥±íģʽÁË
|
#¶ÁÈ¡ÎïÆ·
|
queryDict = {'PlayerID':dbPlayer.PlayerID}
|
collection = db[UCN_RoleItem]
|
itemData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleItem, True)
|
|
itemCnt = CommFunc.ReadDWORD(itemData, 0)
|
mylog.debug('roleItem cnt = %s'%itemCnt[0])
|
#¶ÁÈ¡ºÍ´æ´¢Ê±½«Êý¾ÝDUMP³öÀ´£¬·½±ã²éÖ¤´ÜºÅÎÊÌâ
|
|
collection = db[UCN_RoleMission]
|
missionData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMission)
|
|
missionCnt = CommFunc.ReadDWORD(missionData, 0)
|
mylog.debug('roleMission cnt = %s'%missionCnt[0])
|
#¶ÁÈ¡ºÍ´æ´¢Ê±½«Êý¾ÝDUMP³öÀ´£¬·½±ã²éÖ¤´ÜºÅÎÊÌâ
|
|
collection = db[UCN_RoleMissionDict]
|
roleMissionDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMissionDict)
|
|
missonDictCnt = CommFunc.ReadDWORD(roleMissionDictData, 0)
|
mylog.debug('roleMissionDict cnt = %s'%missonDictCnt[0])
|
|
collection = db[UCN_RoleSkill]
|
roleSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleSkill)
|
|
skillCnt = CommFunc.ReadDWORD(roleSkillData, 0)
|
mylog.debug('roleSkill cnt = %s'%skillCnt[0])
|
|
collection = db[UCN_RoleBuff]
|
roleBuffData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleBuff)
|
|
bufCnt = CommFunc.ReadDWORD(roleBuffData, 0)
|
mylog.debug('roleBuff cnt = %s'%bufCnt[0])
|
|
collection = db[UCN_RoleRepeatTime]
|
roleRepeatTimeData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleRepeatTime)
|
|
repeatTimeCnt = CommFunc.ReadDWORD(roleRepeatTimeData, 0)
|
mylog.debug('roleRepeatTime cnt = %s'%repeatTimeCnt[0])
|
|
collection = db[UCN_PlayerHorseTable]
|
roleHorseData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerHorseTable)
|
|
horseCnt = CommFunc.ReadDWORD(roleHorseData, 0)
|
mylog.debug('roleHorse cnt = %s'%horseCnt[0])
|
|
collection = db[UCN_GMOper]
|
gmOperData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagGMOper)
|
|
gmOperCnt = CommFunc.ReadDWORD(gmOperData, 0)
|
mylog.debug('gmOper cnt = %s'%gmOperCnt[0])
|
|
collection = db[UCN_RolePet]
|
rolePetData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRolePet)
|
|
petCnt = CommFunc.ReadDWORD(rolePetData, 0)
|
mylog.debug('rolePet cnt = %s'%petCnt[0])
|
|
collection = db[UCN_PetSkill]
|
petSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPetSkill)
|
|
petSkillCnt = CommFunc.ReadDWORD(petSkillData, 0)
|
mylog.debug('petSkill cnt = %s'%petSkillCnt[0])
|
|
collection = db[UCN_RoleNomalDict]
|
roleNormalDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleNomalDict)
|
|
dictCnt = CommFunc.ReadDWORD(roleNormalDictData, 0)
|
mylog.debug('roleNormalDict cnt = %s'%dictCnt[0])
|
|
collection = db[UCN_PlayerDienstgrad]
|
roleDienstgradData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerDienstgrad)
|
|
roleDienstgradCnt = CommFunc.ReadDWORD(roleDienstgradData, 0)
|
mylog.debug('roleDienstgrad cnt = %s'%roleDienstgradCnt[0])
|
|
|
|
collection = db[UCN_BattleFormation]
|
battleFormationData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagBattleFormation)
|
|
battleFormationCnt = CommFunc.ReadDWORD(battleFormationData, 0)
|
mylog.debug('battleFormationcnt = %s'%battleFormationCnt[0])
|
|
|
#·âÍ£¼ì²é
|
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.debug('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)
|
mylog.debug('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):
|
'''ÕʺÅÈÏÖ¤'''
|
global g_mergeRegisterPlayerDict
|
|
authPack = RecvPackProtocol.tagDataServerPlayerLogin()
|
authPack.ReadData(pack.getBuffer(), 0, pack.getLength())
|
accountRec = DataServerPlayerData.tagDSAccount()
|
authAccID = authPack.AccID.lower().strip(chr(0))
|
accountRec.ACCID = authAccID
|
|
# ¿ç·þ»º´æÖеÄ
|
if authAccID in g_mergeRegisterPlayerDict:
|
mylog.debug('auth mergeServer Player accid = %s...'%authAccID)
|
mergePlayerInfo = g_mergeRegisterPlayerDict[authAccID]
|
psw = mergePlayerInfo[MergeRegPInfoIndex_Pwd]
|
encodedpsw = mergePlayerInfo[MergeRegPInfoIndex_EncodedPsw]
|
# Æ¥ÅäÃÜÂë
|
if encodedpsw != authPack.Psw.strip(chr(0)): #È¥µô×Ö·û´®Ä©Î²µÄ0
|
#ÃÜÂ벻ƥÅä
|
mylog.debug('input psw = %s is incorrect, encodedpsw=%s, psw = %s'%(authPack.Psw.strip(), encodedpsw, psw))
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
|
return True
|
self.sendOKString(CommonDefine.dgPlayerLogin, pack, accountRec.getBuffer())
|
return True
|
mylog.debug('auth accid = %s-%s...'%(authPack.AccID, authPack.IDType))
|
|
#ÔÚÊý¾Ý¿â²éÕÒ´ËÕʺÅ
|
collection = db[UCN_DSAccount]
|
|
if int(authPack.IDType) == 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:
|
# urlµÄ·ÃÎÊûÓжàÏß³Ì ÓпÉÄܵ¼ÖµÇ¼¶Ñ»ý¿¨¶ÙµÄÏÖÏó
|
if self.loginHeap < 7:
|
# 10ÃëÄÚǰX¸öÍæ¼ÒÑéÖ¤£¬ºóÃæ²»ÑéÖ¤
|
values = {'token' : accountRec.Psw,
|
'account' : CommFunc.GetPlatformAccID(accountRec.ACCID),
|
'appid' : accountRec.AppID }
|
try:
|
data = urllib.urlencode(values)
|
req = urllib2.Request(DBConfig.CheckTokenUrl, data)
|
response = urllib2.urlopen(req, timeout=1)
|
the_page = response.read()
|
if '"0"' in the_page:
|
mylog.debug('checktoken fail:%s'%(accountRec.Psw))
|
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 int(authPack.IDType) == CommonDefine.gitMRGame:
|
#¶ÁÈ¡¾ÉÊý¾Ý
|
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
|
|
# ´Ë´¦ÓзçÏÕûÓÐÑéÖ¤token
|
|
elif int(authPack.IDType) == CommonDefine.gitSPGame:
|
# ˼è±ÓÎÏ· ÓóäÖµkeyÑéÖ¤
|
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
|
extra = authPack.Extra
|
if accountRec.RegIP == "127.0.0.1":
|
#debugÄÚ²¿·þÎñÆ÷²»ÑéÖ¤token, ÍÑ»ú¹ÒÍæ¼Ò²»ÑéÖ¤
|
mylog.debug('iner no check')
|
else:
|
if CommFunc.GetPlatformAccID(authAccID) not in authPack.Extra:
|
#session_id ÖдæÓÐÕʺÅÃû£¬Î»ÖÃÔÚÒÔ|·Ö¸ôµÄµÚ¶þ¸ö²ÎÊýÀï
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
|
mylog.debug('spgame session error')
|
return True
|
if md5.md5(authPack.Extra + accountRec.TokenExpire + CommFunc.GetLoginKey(authAccID)).hexdigest().lower() != accountRec.Psw.lower():
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
|
mylog.debug('spgame token error--%s-%s'%([authPack.Extra, accountRec.TokenExpire, authAccID], CommFunc.GetLoginKey(authAccID)))
|
return True
|
|
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
|
|
PegasusCollectorProxy.EventReport(9001, "OperatorID=%s&Step=%s&AccountID=%s&Flag=1000"%(
|
CommFunc.GetPlayerPlatform(authAccID), 1, CommFunc.GetPlatformAccID(authAccID)))
|
#ÕʺÅÃÜÂëÑé֤ͨ¹ý£¬¸üÐÂÀۼƵǼ´ÎÊý
|
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
|
#¸üÐÂÀۼƵǼ´ÎÊý³É¹¦,ÈÏÖ¤Íê³É
|
self.sendOKString(CommonDefine.dgPlayerLogin, pack, accountRec.getBuffer())
|
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)
|
|
def sendFailString(self, type, fromPacket, disconnectReason = 0):
|
#µÈ¼ÛÓÚChinDataServer AODThread.SendFailString
|
packBuf = ''
|
packBuf = CommFunc.WriteBYTE(packBuf, type)
|
packBuf = CommFunc.WriteBYTE(packBuf, 0) #ʧ°Ü
|
packBuf = CommFunc.WriteBYTE(packBuf, disconnectReason)
|
self.sendString(fromPacket, packBuf)
|
|
def sendString(self, fromPacket, packBuf):
|
self.packSend(fromPacket.getSessionID(), fromPacket.getPackHead().sessionID, fromPacket.getPackHead().poolIndex, fromPacket.getPackHead().type,
|
fromPacket.getPackHead().srcSvrType, fromPacket.getPackHead().dstSvrType, packBuf)
|
|
def onSaveMapServerCrashData(self, db, pack):
|
crashData = RecvPackProtocol.tagMDSaveMapServerCrashData()
|
buf = pack.getBuffer()
|
pos = 0
|
length = len(buf)
|
crashData.readData(buf, pos, length)
|
|
if crashData.SaveStream.StreamData.Count:
|
FileLog.getLogger('MapServerRestoreLog').info('±£´æMapServer±ÀÀ£Êý¾Ý,Íæ¼ÒÊýÁ¿ÊÇ: %s'%(crashData.SaveStream.StreamData.Count))
|
mylog.info("Saving MapServer Crash Data, count = %d, poolIndex = %d"%(crashData.SaveStream.StreamData.Count, pack.getPackHead().poolIndex));
|
if crashData.VersionNO != VersionNoDefine.SERVER_DATA_VERSION_NO:
|
msg = error.formatMsg('fatal', error.ERROR_NO_71, "Saving MapServer Crash Data Error! count = %d version(%d)!=currentVersion(%d)"%(crashData.SaveStream.StreamData.Count, crashData.VersionNO, VersionNoDefine.SERVER_DATA_VERSION_NO))
|
mylog.fatal(msg)
|
FileLog.getLogger('MapServerRestoreLog').fatal('±ÀÀ£Êý¾Ý°æ±¾Ð£Ñéʧ°Ü£¡Èç¹ûÊǰ汾Éý¼¶£¬ÇëÏÈÓþɰ汾½øÐбÀÀ£Êý¾Ýµ¼È룡')
|
DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\SaveFailDump', 'tagMDSaveMapServerCrashData_%d.mdat'%crashData.MapID, buf)
|
return;
|
|
if crashData.SaveStream.CRCCheckErrorServerType == MMORPGPack.stMin:
|
if CommonDefine.DUMPPACKET:
|
debugdata = crashData.SaveStream.StreamData.getBuffer()
|
mylog.debug("crashData.SaveStream.StreamData.getBuffer() = %s, len = %d"%(b2a_hex(debugdata), len(debugdata)))
|
mylog.debug("CommonDefine.DATASAVE_MARK = %d"%CommonDefine.DATASAVE_MARK)
|
# ¼ì²éCRC
|
CalcCRC = CommFunc.ToDWORD(crc32(crashData.SaveStream.StreamData.getBuffer(), CommonDefine.DATASAVE_MARK))
|
if CalcCRC != crashData.SaveStream.CRC:
|
msg = error.formatMsg('error', error.ERROR_NO_72, "Saving MapServer Crash Data CRC Error! CalcCRC = %0x, PackCRC = %0x"%(CalcCRC, crashData.SaveStream.CRC))
|
mylog.error(msg)
|
FileLog.getLogger('MapServerRestoreLog').fatal('±ÀÀ£Êý¾ÝCRCУÑéʧ°Ü£¡')
|
DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\SaveFailDump', 'tagMDSaveMapServerCrashData_%d.mdat'%crashData.MapID, buf)
|
# ²»»ØÓ¦£¬µØÍ¼ÎÞ·¨×¼±¸¾ÍÐ÷£¬ËùÓÐÍæ¼ÒÎÞ·¨µÇ½
|
return
|
else:
|
|
#ÔÚÆäËû·þÎñÆ÷ÒѾ²é³öCRC´íÎó
|
msg = error.formatMsg('error', error.ERROR_NO_73, "Saving MapServer Crash Data CRC Error! PackCRC = %0x"%crashData.SaveStream.CRC)
|
mylog.error(msg);
|
FileLog.getLogger('MapServerRestoreLog').fatal('±ÀÀ£Êý¾ÝCRCÔÚÆäËû·þÎñÒÑУÑéʧ°Ü£¡¾ßÌå¿É²é¿´Ö÷ÈÕÖ¾')
|
DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\SaveFailDump', 'tagMDSaveMapServerCrashData_%d.mdat'%crashData.MapID, buf)
|
return;
|
else:
|
FileLog.getLogger('MapServerRestoreLog').info('ÎÞ±ÀÀ£Êý¾Ý!')
|
mylog.info("hvae processed mapserver empty crash data")
|
|
for i in xrange(crashData.SaveStream.StreamData.Count):
|
PlayerData = crashData.SaveStream.StreamData.AllPlayerStream[i]
|
pack.setBuffer(string_at(PlayerData.Data, PlayerData.Len))
|
result, playerID = self.onSaveMapServerPlayerData(db, pack)
|
if result:
|
FileLog.getLogger('MapServerRestoreLog').info('µÚ%s¸öÍæ¼Ò,PlayerID = %s'%(i+1, playerID))
|
|
if crashData.SaveStream.StreamData.Count:
|
FileLog.getLogger('MapServerRestoreLog').info('±ÀÀ£Êý¾Ý±£´æ³É¹¦£¡')
|
mylog.info("Saving MapServer Crash Data OK! count = %d, poolIndex = %d"%(crashData.SaveStream.StreamData.Count, pack.getPackHead().poolIndex));
|
|
sendPack = SendPackProtocol.tagDBUpdateReturn()
|
sendPack.CallType = CommonDefine.dgUpdateMapServerCrashData
|
sendPack.Result = 1
|
sendPack.MapID = crashData.MapID
|
self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, pack.getPackHead().poolIndex, pack.getPackHead().type,
|
pack.getPackHead().srcSvrType, pack.getPackHead().dstSvrType, sendPack.GetBuffer())
|
|
def onGMCmdListReq(self, db, pack):
|
#Òѷϳý
|
pass
|
|
def onGetGameServerPlayerData(self, db, pack):
|
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_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_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:
|
collection.insert(docs, 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·¢À´µÄ ÕʺÅ×ʼֻÔÚÔËÓªÉÌÄDZß
|
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.info('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.info('OnMergerChildToCenter sendString toGameServer %s'%recvPack.Data)
|
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 test():
|
import os
|
os.system('pause')
|
|
if __name__ == '__main__':
|
test()
|
|