#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
#
|
|
import os
|
import zlib
|
from time import *
|
import datetime
|
from binascii import *
|
import uuid
|
import md5
|
import pymongo
|
import PyGameData
|
import DBCommon.CommonDefine as CommonDefine
|
from MangoDBCommon import (getADOExceptionCount, getSIDErrorCnt, addADOExceptionCount, seq, fix_outgoingText, fix_incomingText)
|
from ServerClientShareDefine import *
|
import ConfigParser
|
import IpyGameDataPY
|
#import IPY_GameWorld
|
#from Config import (DBConfig,)
|
DBConfig = __import__('Config.DBConfig')
|
from ctypes import string_at
|
import traceback
|
import inspect
|
from Collections.CollectionDefine import *
|
import binascii
|
from GMToolLogicProcess import ProjSpecialProcess
|
from Common import (CommFunc, mylog, CommFuncEx)
|
import PegasusCollectorProxy
|
import shutil
|
import urllib
|
import urllib2
|
import json
|
import cPickle
|
import math
|
import sys
|
import hashlib
|
from Collections import (DataServerGameData, DataServerPlayerData)
|
import NetPackCommon
|
from DBCommon import (GlobalFunctions, DBController, error, DataDumper)
|
from Protocol import (MMORPGPack, RecvPackProtocol, SendPackProtocol, MergeServerRecvProtocol, MergeServerSendProtocol)
|
import DataRecordPack
|
import GameWorld
|
import CtrlDB
|
import base64
|
|
|
#-------------------------------------------------------------------------------
|
|
ATTR_CALL_TIME = ['weekday', 'year', 'month', 'day', 'hour', 'minute']
|
Def_Cmp_Lower = -1 #СÓÚ
|
Def_Cmp_Equ = 0 #µÈÓÚ
|
Def_Cmp_Greater = 1 #´óÓÚ
|
|
IsMergeServer = DBConfig.IsMergeServer
|
|
#¿ç·þÍæ¼ÒÉÏ´«Êý¾ÝÐÅÏ¢ÁбíË÷Òý
|
(
|
MergeRegPInfoIndex_LoginTime, # µÇ¼ʱ¼ä Ë÷Òý
|
MergeRegPInfoIndex_LogoutTime, # µÇ³öʱ¼ä Ë÷Òý
|
MergeRegPInfoIndex_PackData, # Íæ¼ÒÊý¾Ý Ë÷Òý
|
MergeRegPInfoIndex_GroupID, # ¿ç·þÍæ¼ÒËùÔÚ·Ö×éID Ë÷Òý
|
) = range(4)
|
|
#def fixMergedPlayerName(playerName):
|
# '''È¥³ýÃû×ÖÖеĺϷþÐÅÏ¢,¼´È¥µôÃû×ÖÖÐ'['ºóÃæµÄ²¿·Ö'''
|
# pos = playerName.find('[')
|
# if pos == -1:
|
# return playerName
|
# return playerName[:pos]
|
|
def CheckGameVersion():
|
## Æô¶¯ÑéÖ¤ÓÎÏ·ÄÚÈݰ汾£¬½öÆô¶¯ÑéÖ¤Ò»´Î
|
import socket
|
host = DBConfig.IDDispatchServerIP
|
port = DBConfig.IDDispatchServerPort
|
addr = (host, port)
|
BUF_SIZE = 1024
|
curVersion = ""
|
centerVersion = ""
|
try:
|
cfGameVer = ConfigParser.ConfigParser()
|
cfGameVer.read(os.path.join(GlobalFunctions.getServerConfigPath(), 'GameVersion.ini'))
|
|
gameID = cfGameVer.get("config", "GameID")
|
curVersion = cfGameVer.get("config", "Version")
|
groupID = DBConfig.GroupID
|
|
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
client.connect(addr)
|
data = "GameVersion:%s|%s|%s" % (gameID, groupID, curVersion)
|
#mylog.info("IDDispatch CheckGameVersion send:%s"%data)
|
client.send(data)
|
dataRecv = client.recv(BUF_SIZE)
|
mylog.info("IDDispatch CheckGameVersion recv:%s"%dataRecv)
|
resultDict = eval(dataRecv)
|
|
centerVersion = ""
|
if resultDict and resultDict['result']:
|
centerVersion = resultDict['version']
|
|
if curVersion != centerVersion:
|
PegasusCollectorProxy.ErrorReport("CheckGameVersion,gameID=%s,groupID=%s,curVersion=%s is not equal to centerVersion=%s"
|
% (gameID, groupID, curVersion, centerVersion))
|
else:
|
mylog.info("IDDispatch CheckGameVersion OK!")
|
|
client.close()
|
except Exception, e:
|
mylog.error("IDDispatch CheckGameVersion Connect Exception %s"%e)
|
except:
|
mylog.error("IDDispatch CheckGameVersion Connect unknown Exception")
|
|
return curVersion, centerVersion
|
|
import thread
|
lockPlayerID = thread.allocate_lock()
|
lockFamilyID = thread.allocate_lock()
|
def CallDispatchPlayerID(db,self):
|
global lockPlayerID
|
lockPlayerID.acquire()#¼ÓËø
|
self.isDispatchingPlayerID = True
|
mylog.info("IDDispatch CallDispatchPlayerID")
|
import socket
|
import time
|
host = DBConfig.IDDispatchServerIP
|
port = DBConfig.IDDispatchServerPort
|
addr = (host, port)
|
BUF_SIZE = 1024
|
try:
|
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
client.connect(addr)
|
data = "PID"
|
client.send(data)
|
dataRecv = client.recv(BUF_SIZE)
|
|
mylog.info("IDDispatch recv:%s"%dataRecv)
|
resultDict = eval(dataRecv)
|
if resultDict:
|
if resultDict['result']:
|
minID = resultDict['minID']
|
maxID = resultDict['maxID']
|
recs = []
|
for id in xrange(minID, maxID+1):
|
recs.append({'PlayerID':id})
|
collection = db[UCN_Dispatch_PlayerID]
|
collection.insert(recs)
|
client.close()
|
except Exception, e:
|
mylog.error("IDDispatch CallDispatchPlayerID Connect Exception %s"%e)
|
except:
|
mylog.error("IDDispatch CallDispatchPlayerID Connect unknown Exception")
|
self.isDispatchingPlayerID = False
|
lockPlayerID.release()#½âËø
|
return
|
|
def CallDispatchFamilyID(db, self):
|
global lockFamilyID
|
lockFamilyID.acquire()#¼ÓËø
|
self.isDispatchingFamilyID = True
|
mylog.info("IDDispatch CallDispatchFamilyID")
|
import socket
|
import time
|
host = DBConfig.IDDispatchServerIP
|
port = DBConfig.IDDispatchServerPort
|
addr = (host, port)
|
BUF_SIZE = 1024
|
try:
|
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
client.connect(addr)
|
data = "FID"
|
client.send(data)
|
dataRecv = client.recv(BUF_SIZE)
|
|
mylog.info("IDDispatch recv:%s"%dataRecv)
|
resultDict = eval(dataRecv)
|
if resultDict:
|
if resultDict['result']:
|
minID = resultDict['minID']
|
maxID = resultDict['maxID']
|
recs = []
|
for id in xrange(minID, maxID+1):
|
recs.append({'FamilyID':id})
|
collection = db[UCN_Dispatch_FamilyID]
|
collection.insert(recs)
|
|
for newID in xrange(minID, maxID+1):
|
if newID not in self.m_emptyFamilyIDList:
|
self.m_emptyFamilyIDList.append(newID)
|
mylog.info("m_emptyFamilyIDList len=%s"%len(self.m_emptyFamilyIDList))
|
client.close()
|
except Exception, e:
|
mylog.error("IDDispatch CallDispatchFamilyID Connect Exception %s"%e)
|
except:
|
mylog.error("IDDispatch CallDispatchFamilyID Connect unknown Exception")
|
|
self.isDispatchingFamilyID = False
|
lockFamilyID.release()#½âËø
|
return
|
|
## µ±Ç°Ê±¼äÓëÖ¸¶¨Ê±¼ä±È½Ï
|
# @param curTime µ±Ç°·þÎñÆ÷ʱ¼ä
|
# @param timeInfo Ö¸¶¨Ê±¼ä [[3,4(ÐÇÆÚ¼¸)], Ä꣬Ô£¬ÈÕ£¬Ê±£¬·Ö]
|
# @return ´óÓÚ·µ»Ø1£¬Ð¡ÓÚ·µ»Ø-1£¬Ïàͬ·µ»Ø0
|
# @remarks º¯ÊýÏêϸ˵Ã÷.Òì³£ºÍ²»³É±È½ÏÌõ¼þ(ÐÇÆÚ¼¸²»¶Ô)·µ»ØNone
|
def CompareActTime(curTime, timeInfo):
|
for index, callObj in enumerate(ATTR_CALL_TIME):
|
#È¥³ý²»±È½ÏµÄÔªËØ
|
if timeInfo[index] == '-':
|
continue
|
|
if hasattr(curTime, callObj) != True:
|
return
|
|
curCallObj = getattr(curTime, callObj)
|
|
#ÓÅÏÈÐÇÆÚ¼¸ÌØÊâÑéÖ¤
|
if type(curCallObj) != int:
|
wday = curCallObj() + 1
|
if wday not in timeInfo[index]:
|
return
|
|
continue
|
|
if curCallObj == timeInfo[index]:
|
continue
|
|
#µ±Ç°Ê±¼ä´óÓÚÖ¸¶¨Ê±¼ä
|
if curCallObj > timeInfo[index]:
|
return Def_Cmp_Greater
|
#СÓÚ
|
return Def_Cmp_Lower
|
#µÈÓÚ
|
return Def_Cmp_Equ
|
|
class UserCtrlDB(CtrlDB.CtrlDB):
|
def __init__(self):
|
CtrlDB.CtrlDB.__init__(self, 'UserCtrlDB')
|
# self.priorityQueueList[1][0] = (CommonDefine.gstUpdate,
|
# CommonDefine.gstSaveMapServerCrashData
|
# )
|
# self.priorityQueueList[2][0] = (CommonDefine.gstSaveGameServerData,
|
# CommonDefine.gstSavePlayerGMOPer)
|
# self.priorityQueueList[0][0] = (
|
|
# CommonDefine.gstGetGameData,
|
# CommonDefine.gstGetGameServerSysData,
|
# CommonDefine.gstQuerySysDBVersion,
|
# CommonDefine.gstGetServerLanguageVersion,
|
# CommonDefine.gstServerVersion,
|
# CommonDefine.gstGetServerVersions,
|
# CommonDefine.gstUpdateSysDB,
|
# CommonDefine.gstReloadGameData,
|
# CommonDefine.gstGMToolCmdSysDBRequest, #GM¹¤¾ß´¦ÀíÇëÇó
|
|
# CommonDefine.gstPlayerLogin,
|
# CommonDefine.gstPlayerDetail,
|
# CommonDefine.gstCreatePlayer,
|
# CommonDefine.gstCheckPlayerExist,
|
# CommonDefine.gstQueryCanSendMail,
|
# CommonDefine.gstGetPlayerMail,
|
# CommonDefine.gstGetMailDetail,
|
# CommonDefine.gstUpdateMail,
|
# CommonDefine.gstDeleteMail,
|
# CommonDefine.gstOnDay,
|
# CommonDefine.gstFamilyVS,
|
# CommonDefine.gstGetPlayerMailState,
|
# CommonDefine.gstGetCoin,
|
# CommonDefine.gstCoinChange,
|
# CommonDefine.gstPlayerBillboardLV,
|
# CommonDefine.gstAccIDSendPrize,
|
# CommonDefine.gstInsertAcc,
|
# CommonDefine.gstGMCommandListReq,
|
# CommonDefine.gstAddAccItem,
|
# CommonDefine.gstCheckItemPrize,
|
# CommonDefine.gstCheckLoadAcc,
|
# CommonDefine.gstUpdatePswLV2,
|
# CommonDefine.gstGetExpiationCount,
|
# CommonDefine.gstGetExpiation,
|
# CommonDefine.gstAddExpiation,
|
# CommonDefine.gstAddPlayerMailByAccID,
|
# CommonDefine.gstServerMergeDeleteRole,
|
# CommonDefine.gstServerMergeChangeName,
|
# CommonDefine.gstServerMergeUpdatePlayer,
|
# CommonDefine.gstQueryIsFamilyLeader,
|
# CommonDefine.gstServerMergeUpdateAccState,
|
# CommonDefine.gstMapServerInfo,
|
# # CommonDefine.gstServerVersion,
|
# CommonDefine.gstCreatePet,
|
# CommonDefine.gstSaveRunGataInfo,
|
# CommonDefine.gstPlayerIDMarkDeleted,
|
# CommonDefine.gstGetMapServerPlayerData,
|
# CommonDefine.gstGetGameServerPlayerData,
|
# CommonDefine.gstSaveGameServerPlayerSaveData,
|
# CommonDefine.gstSaveGameServerCrashData,
|
# CommonDefine.gstGetBillboardInfo,
|
# CommonDefine.gstGetGameServerPlayerLoginData,
|
# CommonDefine.gstUpdateServerDataVersionNO,
|
# # CommonDefine.gstGetServerLanguageVersion,
|
# # CommonDefine.gstGetServerVersions,
|
# CommonDefine.gstUpdateTelLockState,
|
# CommonDefine.gstGetPetExpiation,
|
# CommonDefine.gstGetPetExpiationCount,
|
# CommonDefine.gstAddPetExpiation,
|
# CommonDefine.gstUpdateTotalSavePoint,
|
# CommonDefine.gstSavePlayerInfo,
|
# CommonDefine.gstUpdateAccAdult,
|
# CommonDefine.gstCreateRoleServerRequestCreateRole,
|
# CommonDefine.gstCreateRoleServerCheckPlayerExist,
|
# CommonDefine.gstCreateRoleServerCheckIsHaveRole,
|
# CommonDefine.gstQueryNewGuyCardState,
|
# CommonDefine.gstUpdateNewGuyCardState,
|
# # CommonDefine.gstGMToolCommand, #GM¹¤¾ß½Ó¿ÚÃüÁî
|
# # CommonDefine.gstGMToolCommandResult,
|
# CommonDefine.gstGMToolCmdUserDBRequest, #GM¹¤¾ß´¦ÀíÇëÇó
|
# CommonDefine.gstMergeRegisterPlayer, #±¨Ãû¿ç·þÕ½
|
# CommonDefine.gstMergeQueryRegisterResult, #²éѯ±¨Ãû½á¹û
|
# CommonDefine.gstGeneralDBOper, #ͨÓÃÊý¾Ý¿â²Ù×÷°ü
|
# CommonDefine.gstDiapatchFamilyID, #·ÖÅä¼Ò×åID
|
# CommonDefine.gstMergerChildToCenter, #¿ç·þ×Ó·þ·¢ËÍ×Ô¶¨ÒåÏûÏ¢
|
# CommonDefine.gstPrepareCreateRole,
|
# CommonDefine.gstQueryRecharge, # ²éѯÊÇ·ñÓÐеijäÖµ¶©µ¥
|
# CommonDefine.gstFinishRecharge,
|
# CommonDefine.gstMergePlayerData,
|
# )
|
# self.__processRequestType = self.__userDBGameServerSaveRequestType + self.__userDBNormalRequestType
|
# + self.__userDBSaveRequestType
|
self.Connected = False #ÊÇ·ñÒÑÁ¬½ÓÊý¾Ý¿â, ¿ÉÓÃÓÚºóÐøÅжÏ×Ô¶¯ÖØÁ¬
|
self.db = None
|
if DBConfig.base64:
|
self.translator = DBController.Base64StringManipulator()
|
else:
|
self.translator = DBController.EncodeStringManipulator(DBConfig.encoding)
|
#ÊÇ·ñÕýÔÚÇëÇó·ÖÅäÐÂPlayerID³Ø
|
self.isDispatchingPlayerID = False
|
#ÊÇ·ñÕýÔÚÇëÇó·ÖÅäÐÂFamilyID³Ø
|
self.isDispatchingFamilyID = False
|
self.m_emptyFamilyIDList = [] # µ±Ç°¿ÉÓõÄÏÉÃËIDÁбí
|
self.loginHeap = 0
|
self.loginStartTime = time()
|
self.lastCleanMergePlayerTime = time()
|
|
self.connectDB()
|
return
|
|
def IsMergeServer(self):
|
global IsMergeServer
|
return IsMergeServer
|
|
|
# ÿX·ÖÖÓÇå³ýÒÑÏÂÏßµÄÍæ¼Ò¿ç·þÊý¾Ý, ÀëÏß³¬¹ý3·ÖÖÓÍæ¼ÒÖ±½Ó·µ»Ø×Ó·þ
|
def PopOfflineMergePlayer(self):
|
g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict
|
if not g_mergeRegisterPlayerDict:
|
return
|
|
curTime = time()
|
Def_CleanTime = 500
|
if curTime - self.lastCleanMergePlayerTime < Def_CleanTime:
|
return
|
self.lastCleanMergePlayerTime = curTime
|
|
for accID, packInfo in g_mergeRegisterPlayerDict.items():
|
if packInfo[MergeRegPInfoIndex_LogoutTime] < packInfo[MergeRegPInfoIndex_LoginTime]:
|
# δÀëÏß
|
continue
|
|
if curTime - packInfo[MergeRegPInfoIndex_LogoutTime] < Def_CleanTime:
|
# 䳬¹ýʱ¼ä
|
continue
|
g_mergeRegisterPlayerDict.pop(accID)
|
|
mylog.debug("PopOfflineMergePlayer hascnt = %s"%len(g_mergeRegisterPlayerDict))
|
return
|
|
def connectDB(self):
|
if not self.Connected:
|
mylog.info('!!!!!!!!!!!connect %s:%s'%(DBConfig.USER_DB_IP, DBConfig.USER_DB_PORT))
|
self.connection = pymongo.Connection(DBConfig.USER_DB_IP, DBConfig.USER_DB_PORT, auto_start_request=False)
|
if not GlobalFunctions.LoginMongoDB(DBConfig.userdb_user, DBConfig.userdb_pwd, connection = self.connection):
|
return
|
|
self.db = self.connection[DBConfig.USER_DB_NAME]
|
self.Connected = True
|
mylog.info('!!!!!!!!!!!connect %s:%s ok!'%(DBConfig.USER_DB_IP, DBConfig.USER_DB_PORT))
|
|
mylog.info('login on user db ok!')
|
self.onConnectedOK()
|
|
return
|
|
def disconnect(self):
|
self.Connected = False
|
|
def onConnectedOK(self):
|
if not PyGameData.g_UserCtrlDBFirstInit:
|
PyGameData.g_UserCtrlDBFirstInit = True
|
self.__PlayerBackupSave()
|
CheckGameVersion()
|
self.loadDBPlayerIDMap()
|
|
return
|
|
def loadDBPlayerIDMap(self):
|
## ¼ÓÔØ±¾·þÍæ¼ÒÓ³Éä¹ØÏµ
|
col = self.db[UCN_DBPlayer]
|
resultSet = col.find({}, {"PlayerID":1, "AccID":1, "_id":0})
|
if resultSet and resultSet.count():
|
for resultDict in resultSet:
|
PyGameData.g_dbPlayerIDMap[resultDict["PlayerID"]] = resultDict["AccID"]
|
GameWorld.Log("Æô¶¯·þÎñÆ÷¼ÓÔØDBPlayerÍæ¼ÒÕ˺ÅID¶ÔÓ¦¹ØÏµ! %s" % (len(PyGameData.g_dbPlayerIDMap)))
|
return
|
|
def findDBPlayer(self, playerID):
|
col = self.db[UCN_DBPlayer]
|
dbPlayer = DataServerPlayerData.tagDBPlayer()
|
dbPlayer.IsDeleted = 0
|
if not dbPlayer.adoLoadCEx(col, {"PlayerID":playerID}):
|
return
|
return dbPlayer
|
|
def requestLogicProcess(self, pack):
|
db = self.db
|
if self.IsMergeServer():
|
# ÿX·ÖÖÓÇå³ýÒÑÏÂÏßµÄÍæ¼Ò¿ç·þÊý¾Ý, ÀëÏß³¬¹ý3·ÖÖÓÍæ¼ÒÖ±½Ó·µ»Ø×Ó·þ
|
self.PopOfflineMergePlayer()
|
|
pos = 0
|
requestType, pos = CommFunc.ReadBYTE(pack.getBuffer(), pos)
|
|
mylog.debug("begin process request type = %d"%requestType)
|
|
if requestType == CommonDefine.gstGMToolCommand:
|
oFuncGrade = self.GetFuncGrade('gstGMToolCommand')
|
oFuncGrade.Start()
|
self.OnGMToolCommand(db, pack)
|
oFuncGrade.End()
|
return True
|
|
|
if requestType == CommonDefine.gstGeneralDBOper:
|
oFuncGrade = self.GetFuncGrade('gstGeneralDBOper')
|
oFuncGrade.Start()
|
self.OnGeneralDBOper(db, pack)
|
oFuncGrade.End()
|
return True
|
|
if requestType == CommonDefine.gstDBLogic:
|
oFuncGrade = self.GetFuncGrade('gstDBLogic')
|
oFuncGrade.Start()
|
self.OnGameServerToDBLogic(db, pack)
|
oFuncGrade.End()
|
return True
|
|
if requestType == CommonDefine.gstMergeQueryRegisterResult:
|
oFuncGrade = self.GetFuncGrade('gstMergeQueryRegisterResult')
|
oFuncGrade.Start()
|
self.OnMergeQueryRegisterResult(db, pack)
|
oFuncGrade.End()
|
return True
|
|
if requestType == CommonDefine.gstMergeRegisterPlayer:
|
oFuncGrade = self.GetFuncGrade('gstMergeRegisterPlayer')
|
oFuncGrade.Start()
|
self.OnMergeRegisterPlayerByCache(db, pack)
|
oFuncGrade.End()
|
return True
|
|
if requestType == CommonDefine.gstMergePlayerData:
|
oFuncGrade = self.GetFuncGrade('gstMergePlayerData')
|
oFuncGrade.Start()
|
self.OnMergeChildToCenterPlayerData(db, pack)
|
oFuncGrade.End()
|
return True
|
|
if requestType == CommonDefine.gstQueryNewGuyCardState:
|
oFuncGrade = self.GetFuncGrade("gstQueryNewGuyCardState")
|
oFuncGrade.Start()
|
self.OnQueryNewGuyCardState(db, pack)
|
oFuncGrade.End()
|
return True
|
|
if requestType == CommonDefine.gstQueryRecharge:
|
oFuncGrade = self.GetFuncGrade("gstQueryRecharge")
|
oFuncGrade.Start()
|
self.OnQueryRecharge(db, pack)
|
oFuncGrade.End()
|
return True
|
|
if requestType == CommonDefine.gstFinishRecharge:
|
oFuncGrade = self.GetFuncGrade("gstFinishRecharge")
|
oFuncGrade.Start()
|
self.OnFinishRecharge(db, pack)
|
oFuncGrade.End()
|
return True
|
|
if requestType == CommonDefine.gstUpdateNewGuyCardState:
|
oFuncGrade = self.GetFuncGrade("gstUpdateNewGuyCardState")
|
oFuncGrade.Start()
|
self.onCheckUpdateNewGuyCardState(db, pack)
|
oFuncGrade.End()
|
return True
|
|
#GameServer±£´æÊý¾Ý
|
#if requestType == CommonDefine.gstSaveGameServerData:
|
# oFuncGrade = self.GetFuncGrade("gstSaveGameServerData")
|
# oFuncGrade.Start()
|
# self.onSaveGameServerData(db, pack)
|
# oFuncGrade.End()
|
# return True
|
#GameServer¶ÁÈ¡Íæ¼ÒÊý¾Ý
|
#if requestType == CommonDefine.gstGetGameServerPlayerData:
|
# oFuncGrade = self.GetFuncGrade("gstGetGameServerPlayerData")
|
# oFuncGrade.Start()
|
# self.onGetGameServerPlayerData(db, pack)
|
# oFuncGrade.End()
|
# return True
|
#GameServer¶ÁÈ¡GMÃüÁîÁбí
|
if requestType == CommonDefine.gstGMCommandListReq:
|
oFuncGrade = self.GetFuncGrade("gstGMCommandListReq")
|
oFuncGrade.Start()
|
self.onGMCmdListReq(db, pack)
|
oFuncGrade.End()
|
return True
|
if requestType == CommonDefine.gstPlayerLogin:
|
oFuncGrade = self.GetFuncGrade("gstPlayerLogin")
|
oFuncGrade.Start()
|
self.onAuthentication(db, pack)
|
oFuncGrade.End()
|
return True
|
# if requestType == CommonDefine.gstPlayerDetail:
|
# oFuncGrade = self.GetFuncGrade("gstPlayerDetail")
|
# oFuncGrade.Start()
|
# if self.IsMergeServer():
|
# self.onGetMergePlayerDetail(db, pack)
|
# else:
|
# self.onGetPlayerDetail(db, pack)
|
# oFuncGrade.End()
|
# return True
|
# if requestType == CommonDefine.gstCreatePlayer:
|
# oFuncGrade = self.GetFuncGrade("gstCreatePlayer")
|
# oFuncGrade.Start()
|
# self.onCreatePlayer(db, pack)
|
# oFuncGrade.End()
|
# return True
|
# if requestType == CommonDefine.gstCreateRoleServerCheckIsHaveRole:
|
# oFuncGrade = self.GetFuncGrade("gstCreateRoleServerCheckIsHaveRole")
|
# oFuncGrade.Start()
|
# self.onCreateRoleServerCheckIsHaveRole(db, pack)
|
# oFuncGrade.End()
|
# return True
|
# if requestType == CommonDefine.gstCreateRoleServerCheckPlayerExist:
|
# oFuncGrade = self.GetFuncGrade("gstCreateRoleServerCheckPlayerExist")
|
# oFuncGrade.Start()
|
# self.onCreateRoleServerCheckPlayerExist(db, pack)
|
# oFuncGrade.End()
|
# return True
|
# if requestType == CommonDefine.gstCreateRoleServerRequestCreateRole:
|
# oFuncGrade = self.GetFuncGrade("gstCreateRoleServerRequestCreateRole")
|
# oFuncGrade.Start()
|
# self.onCreateRoleServerRequestCreateRole(db, pack)
|
# oFuncGrade.End()
|
# return True
|
|
if requestType == CommonDefine.gstGetGameServerPlayerLoginData:
|
#===================================================================
|
# oFuncGrade = self.GetFuncGrade("gstGetGameServerPlayerLoginData")
|
# oFuncGrade.Start()
|
# self.onGetGameServerPlayerLoginData(db, pack)
|
# oFuncGrade.End()
|
#===================================================================
|
return True
|
if requestType == CommonDefine.gstSaveGameServerPlayerSaveData:
|
oFuncGrade = self.GetFuncGrade("gstSaveGameServerPlayerSaveData")
|
oFuncGrade.Start()
|
self.onSaveGameServerPlayerSaveData(db, pack)
|
oFuncGrade.End()
|
return True
|
if requestType == CommonDefine.gstUpdate:
|
oFuncGrade = self.GetFuncGrade("gstUpdate")
|
oFuncGrade.Start()
|
if self.IsMergeServer():
|
self.onSaveMapServerPlayerDataMergeServer(db, pack)
|
else:
|
self.onSaveMapServerPlayerData(db, pack)
|
|
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.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
|
|
def OnFamilyIDInit(self, serverFamilyIDList):
|
## ÏÉÃËID³õʼ»¯
|
# @param serverFamilyIDList: ·þÎñÆ÷ÒѾ´´½¨µÄÏÉÃËIDÁбí
|
#³õʼ»¯ÇëÇó»ñÈ¡ÒÑ·ÖÅäµÄ¼Ò×åIDÁбí
|
db = self.db
|
collection = db[UCN_Dispatch_FamilyID]
|
result = collection.find()
|
if result:
|
idCnt = result.count()
|
mylog.debug('OnFamilyIDInit db[UCN_Dispatch_FamilyID] idCnt=%s' % idCnt)
|
for rec in result:
|
familyID = rec['FamilyID']
|
if familyID in serverFamilyIDList:
|
continue
|
if familyID in self.m_emptyFamilyIDList:
|
continue
|
self.m_emptyFamilyIDList.append(familyID)
|
mylog.debug('OnFamilyIDInit db[UCN_Dispatch_FamilyID] emptyIDCount=%s' % len(self.m_emptyFamilyIDList))
|
self.__checkDiapatchFamilyID()
|
return
|
|
def __checkDiapatchFamilyID(self):
|
if len(self.m_emptyFamilyIDList) >= 10:
|
return
|
if self.isDispatchingFamilyID:
|
return
|
import threading
|
t = threading.Thread(target = CallDispatchFamilyID, args =(self.db, self))
|
t.start()
|
return
|
|
def GetNewFamilyID(self):
|
## »ñȡһ¸öÐÂÏÉÃËID
|
self.__checkDiapatchFamilyID()
|
if self.m_emptyFamilyIDList:
|
newFamilyID = self.m_emptyFamilyIDList.pop(0)
|
#mylog.debug('pop newFamilyID=%s, emptyIDCount=%s' % (newFamilyID, len(self.m_emptyFamilyIDList)))
|
return newFamilyID
|
return 0
|
|
def FreeFamilyID(self, familyID):
|
## ÊÍ·Å¿ÉÓõÄÏÉÃËID£¬Ò»°ãÊÇɾ³ýÏÉÃËʱ·µ»¹
|
if familyID not in self.m_emptyFamilyIDList:
|
self.m_emptyFamilyIDList.insert(0, familyID)
|
#mylog.debug('free familyID=%s, emptyIDCount=%s, %s' % (familyID, len(self.m_emptyFamilyIDList), self.m_emptyFamilyIDList))
|
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 OnGMToolCommand(self, db, pack):
|
|
if CommonDefine.IsDebug():
|
import binascii
|
mylog.debug('buf = %s'%binascii.b2a_hex(pack.getBuffer()))
|
|
try:
|
ProjSpecialProcess.OnGMToolCommand(pack)
|
except:
|
msg = error.formatMsg('error', error.ERROR_NO_172, "LogicProcessThread::OnGMToolCommand Catch a unexpetcted exception, error = %s"%traceback.format_exc())
|
mylog.error(msg)
|
|
|
|
def OnGeneralDBOper(self, db, pack):
|
buf = pack.getBuffer()
|
recvPack = RecvPackProtocol.tagGDGameServerGeneralDBOper()
|
pos = 0
|
recvPack.ReadData(buf, pos)
|
mylog.debug('pack = %s'%(recvPack.OutputString()))
|
|
operDict = None
|
try:
|
operDict = cPickle.loads(recvPack.OperDict)
|
except Exception, e:
|
mylog.warning('cPickle.loads(\'%s\') failed!'%(recvPack.OperDict))
|
if recvPack.NeedReturn:
|
self.sendGameServerDBOperResult(pack.getSessionID(), 0, '', 'OperDict parse failed!')
|
return
|
if not isinstance(operDict, dict):
|
if recvPack.NeedReturn:
|
mylog.warning('%s is not a dict!'%(recvPack.OperDict))
|
self.sendGameServerDBOperResult(pack.getSessionID(), 0, '', 'OperDict parse failed!')
|
return
|
colName = operDict.get('collection')
|
if not colName:
|
mylog.warning('collection not specified!')
|
if recvPack.NeedReturn:
|
self.sendGameServerDBOperResult(pack.getSessionID(), 0, '', 'collection not specified!')
|
return
|
if not isinstance(colName, basestring):
|
mylog.warning('collection name:%s not valid!'%(colName))
|
if recvPack.NeedReturn:
|
self.sendGameServerDBOperResult(pack.getSessionID(), 0, '', 'collection name not valid!')
|
return
|
col = db[colName]
|
oper = operDict.get('oper')
|
if not oper:
|
mylog.warning('oper not specified!')
|
if recvPack.NeedReturn:
|
self.sendGameServerDBOperResult(pack.getSessionID(), 0, '', 'oper not specified!')
|
return
|
if not isinstance(oper, basestring):
|
mylog.warning('oper:%s not valid!'%(oper))
|
if recvPack.NeedReturn:
|
self.sendGameServerDBOperResult(pack.getSessionID(), 0, '', 'oper not valid!')
|
return
|
oper = oper.lower()
|
|
if oper == 'drop':
|
result = 1
|
errorMsg = ''
|
try:
|
col.drop()
|
except Exception, e:
|
mylog.warning('drop %s failed!error = %s'%(colName, e))
|
result = 0
|
errorMsg = str(e)
|
except:
|
mylog.warning('drop %s failed!unknown error!'%(colName))
|
result = 0
|
errorMsg = 'unknown exception!'
|
if recvPack.NeedReturn:
|
self.sendGameServerDBOperResult(pack.getSessionID(), result, '', errorMsg)
|
return
|
|
if oper == 'insert':
|
doc_or_docs = operDict.get('docs')
|
errorMsg = ''
|
result = 1
|
try:
|
col.insert(doc_or_docs, False, True)
|
except Exception, e:
|
mylog.warning('insert %s into %s failed!error = %s'%(doc_or_docs, colName, e))
|
result = 0
|
errorMsg = str(e)
|
except:
|
mylog.warning('insert %s into %s failed!unknown exception!'%(doc_or_docs, colName))
|
result = 0
|
errorMsg = 'unknown exception!'
|
if recvPack.NeedReturn:
|
self.sendGameServerDBOperResult(pack.getSessionID(), result, '', errorMsg)
|
return
|
|
if oper == 'update':
|
doc = operDict.get('docs')
|
spec = operDict.get('spec')
|
result = 1
|
errorMsg = ''
|
try:
|
col.update(spec, doc, False, False, True, True)
|
except Exception, e:
|
mylog.warning('update %s failed!spec = %s, doc = %s, error = %s'%(colName, spec, doc, e))
|
result = 0
|
errorMsg = str(e)
|
except:
|
mylog.warning('update %s failed!spec = %s, doc = %s,unknown exception occur!'%(colName, spec,
|
doc))
|
result = 0
|
errorMsg = 'unknown exception!'
|
if recvPack.NeedReturn:
|
self.sendGameServerDBOperResult(pack.getSessionID(), result, '', errorMsg)
|
return
|
|
if oper == 'remove':
|
spec_or_id = operDict.get('spec')
|
result = 1
|
errorMsg = ''
|
try:
|
col.remove(spec_or_id, True)
|
except Exception, e:
|
mylog.warning('remove from %s failed!spec = %s, error = %s'%(colName, spec_or_id, e))
|
result = 0
|
errorMsg = str(e)
|
except:
|
mylog.warning('remove from %s failed!spec = %s, unknown exception!'%(colName, spec_or_id))
|
result = 0
|
errorMsg = 'unknown exception!'
|
if recvPack.NeedReturn:
|
self.sendGameServerDBOperResult(pack.getSessionID(), result, '', errorMsg)
|
return
|
|
if oper == 'find':
|
spec = operDict.get('spec')
|
fields = operDict.get('fields', {})#Ö¸¶¨µÄ·µ»ØÖµ
|
result = 1
|
errorMsg = ''
|
resultSet = None
|
try:
|
if fields == {}:
|
resultSet = col.find(spec)
|
else:
|
resultSet = col.find(spec, fields)
|
except Exception, e:
|
mylog.warning('%s.find(%s) failed!'%(colName, spec))
|
result = 0
|
errorMsg = str(e)
|
except:
|
mylog.warning('%s.find(%s) failed!'%(colName, spec))
|
result = 0
|
errorMsg = 'unknown exception!'
|
|
if recvPack.NeedReturn:
|
if resultSet:
|
resultSet = str(list(resultSet))
|
self.sendGameServerDBOperResult(pack.getSessionID(), result, resultSet, errorMsg)
|
return
|
mylog.warning('oper %s not support!'%oper)
|
|
|
def OnGameServerToDBLogic(self, db, pack):
|
buf = pack.getBuffer()
|
recvPack = RecvPackProtocol.tagGDGameServerToDBLogic()
|
pos = 0
|
recvPack.ReadData(buf, pos)
|
queryType = recvPack.QueryType
|
mylog.debug('pack = %s'%(recvPack.OutputString()))
|
|
if queryType == CommonDefine.gstDBLogic_PlayerPackDataReq:
|
#ÇëÇóÍæ¼Ò´ò°üÊý¾Ý
|
playerID = recvPack.ID
|
packData = self.getPlayerPackData(playerID) # ÓÐÖ±½ÓÈ¡£¬Ã»ÓеϰÔÙ´ÓdbÕûºÏÊý¾Ý
|
if packData:
|
result = 1
|
mylog.debug("packData get from cache. playerID=%s" % playerID)
|
else:
|
result, playerData = self.GetPlayerDataByPlayerID(db, playerID)
|
mylog.debug("packData get from db. playerID=%s,result=%s" % (playerID, result))
|
if result:
|
packData = base64.b64encode(playerData)
|
self.updPlayerPackData(playerID, packData)
|
self.SendGameServerToDBLogicResult(pack.getSessionID(), result, recvPack, packData)
|
return
|
|
if queryType == CommonDefine.gstDBLogic_PlayerPackDataUpd:
|
#¸üÐÂÍæ¼Ò´ò°üÊý¾Ý£¬½ö×Ó·þÓ㬲»ÐèÒª»Ø¸´GameServer
|
playerID = recvPack.ID
|
packData = recvPack.Data
|
self.updPlayerPackData(playerID, packData)
|
return
|
|
if queryType == CommonDefine.gstDBLogic_GMCmd:
|
dbAnswerList = GMShell.DBGMCommand(recvPack.Data)
|
self.SendGameServerToDBLogicResult(pack.getSessionID(), 1, recvPack, str(dbAnswerList))
|
return
|
|
return
|
|
def SendGameServerToDBLogicResult(self, sessionID, result, recvPack, resultSet):
|
'''»Ø¸´GameServer·¢Ë͵ÄSendDBLogic£¬¿ÉÒÔ²»»Ø¸´£¬ÓɾßÌåÀàÐ;ö¶¨
|
@param result: ½á¹û£º1³É¹¦£¬0ʧ°Ü
|
@param recvPack: GameServer·¢À´µÄÊý¾Ý°ü£¬Data¿ÉÔÖµ·µ»Ø£¬Ò²¿ÉÐ޸ĺ󷵻أ¬ÓɾßÌåÀàÐ;ö¶¨
|
@param resultSet: »Ø¸´Êý¾Ý
|
'''
|
sendPack = SendPackProtocol.tagDGGameServerToDBLogicResult()
|
sendPack.Type = CommonDefine.dgDBGameServerToDBLogicResult
|
sendPack.Result = result
|
sendPack.ID = recvPack.ID
|
sendPack.QueryType = recvPack.QueryType
|
sendPack.Data = recvPack.Data
|
sendPack.DataLen = len(sendPack.Data)
|
sendPack.ResultSet = resultSet
|
sendPack.ResultSetLen = len(sendPack.ResultSet)
|
self.packSend(sessionID, 0, 0, CommonDefine.atInner, MMORPGPack.stGame,
|
MMORPGPack.stData, sendPack.GetBuffer())
|
|
mylog.debug("»Ø¸´ SendGameServerToDBLogicResult")
|
return
|
|
def GetPlayerDataByPlayerID(self, db, playerID):
|
dbPlayer = DataServerPlayerData.tagDBPlayer()
|
dbPlayer.PlayerID = playerID
|
collection = db[UCN_DBPlayer]
|
loadOK = dbPlayer.adoLoadCEx(collection, {'PlayerID':playerID})
|
if not loadOK:
|
mylog.warning('GetPlayerDataByPlayerID Exception playerID = %s'%(dbPlayer.PlayerID))
|
return 0, ''
|
|
#²âÊÔ
|
mylog.info("accid = %s"%(dbPlayer.AccID))
|
|
#¶ÁÈ¡ÎïÆ·µÈÆäËûÊý¾Ý
|
queryDict = {'PlayerID':dbPlayer.PlayerID}
|
collection = db[UCN_RoleItem]
|
itemData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleItem, True)
|
|
collection = db[UCN_RoleMission]
|
missionData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMission)
|
|
collection = db[UCN_RoleMissionDict]
|
roleMissionDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMissionDict)
|
|
collection = db[UCN_RoleSkill]
|
roleSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleSkill)
|
|
collection = db[UCN_RoleBuff]
|
roleBuffData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleBuff)
|
|
collection = db[UCN_RoleRepeatTime]
|
roleRepeatTimeData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleRepeatTime)
|
|
collection = db[UCN_PlayerHorseTable]
|
roleHorseData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerHorseTable)
|
|
collection = db[UCN_GMOper]
|
gmOperData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagGMOper)
|
|
collection = db[UCN_RolePet]
|
rolePetData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRolePet)
|
|
collection = db[UCN_PetSkill]
|
petSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPetSkill)
|
|
collection = db[UCN_RoleNomalDict]
|
roleNormalDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleNomalDict)
|
|
collection = db[UCN_PlayerDienstgrad]
|
roleDienstgradData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerDienstgrad)
|
|
collection = db[UCN_BattleFormation]
|
battleFormationData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagBattleFormation)
|
|
#¶ÁÈ¡½ûÖ¹IPÊý¾Ý
|
gmIP = DataServerPlayerData.tagDBGMIP()
|
gmIP.AccID = dbPlayer.AccID.lower()
|
collection = db[UCN_DBGMIP]
|
gmIPData = gmIP.adoQueryIndex(collection)
|
|
return 1, dbPlayer.getBuffer() + itemData + missionData + roleMissionDictData + roleSkillData + roleBuffData + roleRepeatTimeData + roleHorseData + gmOperData\
|
+ gmIPData + rolePetData + petSkillData + roleNormalDictData + roleDienstgradData+battleFormationData
|
|
|
|
# ²éѯ·µ»Ø0/1 ´ú±íÊÇ·ñ³É¹¦
|
def OnMergeQueryRegisterResult(self, db, pack):
|
g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict
|
buf = pack.getBuffer()
|
#len = pack.getLength()
|
recvPack = MergeServerRecvProtocol.tagLPQueryRegisterResult()
|
pos = 0
|
recvPack.ReadData(buf, pos)
|
accID = recvPack.AccID.strip(chr(0))
|
mylog.debug('accID = %s.'%(accID))
|
|
clientSessionID = pack.getSessionID()
|
client = MergeProxyClientMgr.getMergeProxyClientMgr().findClientBySessionID(clientSessionID)
|
if not client:
|
mylog.warning('client not found!sessionID = %s'%(clientSessionID))
|
return
|
|
|
sendPack = MergeServerSendProtocol.tagMPQueryRegisterResult()
|
sendPack.Type = CommonDefine.dgMergeQueryNewAccount
|
if g_mergeRegisterPlayerDict.get(accID, []):
|
sendPack.Result = 0
|
self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
|
MMORPGPack.stNoSense, sendPack.GetBuffer())
|
mylog.warning('query failed!spec = %s'%accID)
|
return
|
sendPack.Result = 1
|
sendPack.Account = accID
|
sendPack.AccountLen = len(accID)
|
sendPack.Pwd = ""
|
sendPack.PwdLen = 0
|
self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
|
MMORPGPack.stNoSense, sendPack.GetBuffer())
|
|
|
def OnMergeRegisterPlayerByCache(self, db, pack):
|
''' »º´æ¿ç·þÍæ¼ÒÉÏ´«Êý¾ÝÐÅÏ¢
|
ĿǰÕ˺š¢Íæ¼ÒID¡¢½ÇÉ«Ãû¾ùÒÑÈ·±£Î¨Ò»£¬¹ÊÎÞÐèÔÙÖØÐÂÉú³ÉеÄÕ˺ż°½ÇÉ«ÐÅÏ¢
|
Ö±½Ó½ÓÊÕ¸üлº´æ¼´¿É£¬Íæ¼ÒµÇ½¿ç·þ·þÎñÆ÷ʱֱ½Ó´Ó»º´æÊý¾ÝÖнâÎö½ÇÉ«Êý¾Ý£¬´Ó¶ø½ÚÊ¡db´æÈ¡²½Öè
|
'''
|
g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict
|
try:
|
buf = pack.getBuffer()
|
recvPack = MergeServerRecvProtocol.tagLPRegisterPlayer()
|
pos = 0
|
recvPack.ReadData(buf, pos)
|
#mylog.debug('pack = %s'%(binascii.b2a_hex(buf)))
|
|
loginResultPack = MergeServerSendProtocol.tagMPRegisterPlayerResult()
|
loginResultPack.Type = CommonDefine.dgMergeRegisterResult
|
|
#Íæ¼ÒµØÍ¼Êý¾Ý£¬ºÍÏÂÏß±£´æ°ü SavePlayerMapServerDataEx Ò»ÖÂ
|
playerData = recvPack.Data
|
playerRec = DataServerPlayerData.tagDBPlayer()
|
pos = 0
|
dbPlayerReadLen = playerRec.readData(playerData, pos, len(playerData))
|
if -1 == dbPlayerReadLen:
|
#Êý¾ÝÒì³££¬³¤¶È²»×ã
|
#»Ø¸´Ê§°Ü
|
loginResultPack.Result = 0
|
loginResultPack.ErrorMsg = 'Player data length not enough!'
|
loginResultPack.ErrorMsgLen = len(loginResultPack.ErrorMsg)
|
self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
|
MMORPGPack.stNoSense, loginResultPack.GetBuffer())
|
mylog.warning('player data too short!')
|
return
|
|
if playerRec.PlayerID == 0:
|
loginResultPack.Result = 0
|
loginResultPack.ErrorMsg = 'Player data error!'
|
loginResultPack.ErrorMsgLen = len(loginResultPack.ErrorMsg)
|
self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
|
MMORPGPack.stNoSense, loginResultPack.GetBuffer())
|
mylog.warning('player data error!')
|
return
|
|
clientSessionID = pack.getSessionID()
|
client = MergeProxyClientMgr.getMergeProxyClientMgr().findClientBySessionID(clientSessionID)
|
if not client:
|
mylog.warning('client not found!sessionID = %s'%(clientSessionID))
|
return
|
groupID = client.groupID
|
|
playerID = playerRec.PlayerID
|
accID = playerRec.AccID.lower().strip(chr(0))
|
|
playerName = playerRec.PlayerName.strip()
|
|
#³É¹¦£¬·µ»ØÐÂÕʺÅÃÜÂë
|
loginResultPack.Result = 1
|
loginResultPack.Account = accID
|
loginResultPack.AccountLen = len(accID)
|
loginResultPack.Pwd = ""
|
loginResultPack.PwdLen = 0
|
self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
|
MMORPGPack.stNoSense, loginResultPack.GetBuffer())
|
|
mylog.info('player %s accID=%s, playerID=%s, %s register PK ok!'%(groupID, accID, playerID, playerName))
|
g_mergeRegisterPlayerDict[accID] = [time(), 0, recvPack, groupID] # ¸üпç·þÍæ¼ÒÊý¾Ý»º´æ
|
except Exception, e:
|
msg = error.formatMsg('error', error.ERROR_NO_175, "OnMergeRegisterPlayer error %s!traceback = %s, pack = %s"%(e, traceback.format_exc(), binascii.b2a_hex(buf)))
|
mylog.error(msg)
|
except:
|
msg = error.formatMsg('error', error.ERROR_NO_176, "OnMergeRegisterPlayer error!traceback = %s, pack = %s"%(traceback.format_exc(), binascii.b2a_hex(buf)))
|
mylog.error(msg)
|
return
|
|
|
def OnFinishRecharge(self, db, pack):
|
# mapÍê³É¶Ò»»£¬¼ÙÉè´Ë´¦Ã»Óлظ´£¬Ôò´Ëµ¥±ä³É¶ªµ¥£¬ÔÝÓÉÈ˹¤Î¬»¤
|
# ÈôÕæÆµ·±·¢ÉúÔò¸ÄΪÉÏÏ߻ָ´
|
try:
|
buf = pack.getBuffer()
|
packLen = pack.getLength()
|
recvPack = RecvPackProtocol.tagMDFinishRecharge()
|
pos = 0
|
recvPack.ReadData(buf, pos)
|
orderID = recvPack.OrderID.strip(chr(0))
|
mylog.debug('OnFinishRecharge ...%s'%orderID)
|
|
col = db[UCN_PayInfo]
|
result = col.find({"OrderID":orderID})
|
|
if not result or result.count() == 0:
|
# ûÓгäÖµ¶©µ¥
|
return
|
|
curTime = datetime.datetime.today()
|
curTimeStr = str(curTime)
|
curTimeStr = curTimeStr.split(".")[0]
|
col.update({"OrderID":orderID}, {"$set":{"IsProcess":1, 'EndOrderTime':curTimeStr}})
|
|
mylog.debug('OnFinishRecharge OrderID = %s'%(orderID))
|
|
return
|
except Exception, e:
|
msg = error.formatMsg('error', error.ERROR_NO_170, "OnFinishRecharge error %s!pack = %s"%(e, binascii.b2a_hex(buf)))
|
mylog.error(msg)
|
except:
|
msg = error.formatMsg('error', error.ERROR_NO_170, "OnFinishRecharge error!pack = %s"%(binascii.b2a_hex(buf)))
|
mylog.error(msg)
|
return
|
|
|
def OnQueryRecharge(self, db, pack):
|
# map²éѯеijäÖµ¶©µ¥£¬ ²éѯ³äÖµ±í
|
try:
|
buf = pack.getBuffer()
|
packLen = pack.getLength()
|
recvPack = RecvPackProtocol.tagMDQueryRecharge()
|
pos = 0
|
recvPack.ReadData(buf, pos)
|
account = recvPack.Account.strip(chr(0))
|
mylog.debug('OnQueryRecharge ...%s'%account)
|
|
col = db[UCN_PayInfo]
|
result = col.find({'AccID':account, 'IsProcess':0, 'EndOrderTime':0})
|
|
if not result or result.count() == 0:
|
# ûÓгäÖµ¶©µ¥
|
return
|
|
# Ò»µ¥Ò»µ¥·¢
|
# ÏÈÉèÖÃIsProcessΪ1¶Ò»»ÖУ¬µÈ»Ø¸´½á¹ûÔÚÕæÕýÍê³É¶©µ¥
|
billInfo = result[0]
|
|
sendPack = SendPackProtocol.tagDMRechargePush()
|
sendPack.Type = CommonDefine.dgDBToMapServer
|
sendPack.SubType = CommonDefine.gmReChargePush
|
sendPack.OrderID = fix_outgoingText(billInfo['OrderID'])
|
sendPack.OrderIDLen = len(sendPack.OrderID)
|
sendPack.OrderInfo = fix_outgoingText(billInfo['OrderInfo'])
|
sendPack.OrderInfoLen = len(sendPack.OrderInfo)
|
sendPack.Money = int(billInfo['OrderAmount'])
|
sendPack.Extras = fix_outgoingText(billInfo['Extras'])
|
sendPack.ExtrasLen = len(sendPack.Extras)
|
|
col.update({"OrderID":sendPack.OrderID}, {"$set":{"IsProcess":1}})
|
|
self.sendString(pack, sendPack.GetBuffer())
|
mylog.debug('OnQueryRecharge OrderID = %s'%(sendPack.OrderID))
|
#mylog.debug('send %s'%sendPack.OutputString())
|
return
|
except Exception, e:
|
msg = error.formatMsg('error', error.ERROR_NO_170, "OnQueryRecharge error %s!pack = %s"%(e, binascii.b2a_hex(buf)))
|
mylog.error(msg)
|
except:
|
msg = error.formatMsg('error', error.ERROR_NO_170, "OnQueryRecharge error!pack = %s"%(binascii.b2a_hex(buf)))
|
mylog.error(msg)
|
|
return
|
|
def OnQueryNewGuyCardState(self, db, pack):
|
try:
|
buf = pack.getBuffer()
|
packLen = pack.getLength()
|
recvPack = RecvPackProtocol.tagMDIsMediaCardUsed()
|
pos = 0
|
recvPack.ReadData(buf, pos)
|
mylog.debug('OnQueryNewGuyCardState cardID = %s...'%recvPack.CardID)
|
|
sendPack = SendPackProtocol.tagDMIsMediaCardUsed()
|
sendPack.Type = CommonDefine.dgDBToMapServer
|
sendPack.SubType = CommonDefine.gmQueryNewGuyCardState
|
sendPack.CardIDLen = recvPack.CardIDLen
|
sendPack.CardID = recvPack.CardID
|
|
obj = DataServerPlayerData.tagDBNewGuyCardState()
|
obj.CardIDLen = recvPack.CardIDLen
|
obj.CardID = recvPack.CardID
|
col = db[UCN_DBNewGuyCardState]
|
lastExceptionCnt = getADOExceptionCount()
|
if not obj.adoLoad(col):
|
if lastExceptionCnt == getADOExceptionCount():
|
#ûÓÐÕâÕÅ¿¨µÄ¼Ç¼
|
sendPack.IsUsed = 0
|
sendPack.UserDataLen = 0
|
sendPack.UserData = ''
|
self.sendString(pack, sendPack.GetBuffer())
|
mylog.debug('OnQueryNewGuyCardState cardID = %s not found!'%recvPack.CardID)
|
return
|
#³ö´íÁË,µ±³ÉʹÓùý£¬·ÀË¢
|
sendPack.IsUsed = 1
|
sendPack.UserDataLen = 0
|
sendPack.UserData = ''
|
self.sendString(pack, sendPack.GetBuffer())
|
mylog.warning('OnQueryNewGuyCardState query error!cardID = %s'%recvPack.CardID)
|
return
|
#ÒÑÓÐÕâÕÅ¿¨£¬²é¿´¾ßÌå״̬
|
sendPack.IsUsed = obj.IsUsed
|
sendPack.UserDataLen = obj.UserDataLen
|
sendPack.UserData = obj.UserData
|
sendPack.CardType = obj.CardType
|
sendPack.ValidTime = obj.ValidTime
|
self.sendString(pack, sendPack.GetBuffer())
|
mylog.debug('OnQueryNewGuyCardState cardID = %s state:%s'%(recvPack.CardID, obj.outputString()))
|
#mylog.debug('send %s'%sendPack.OutputString())
|
return
|
except Exception, e:
|
msg = error.formatMsg('error', error.ERROR_NO_170, "OnQueryNewGuyCardState error %s!pack = %s"%(e, binascii.b2a_hex(buf)))
|
mylog.error(msg)
|
except:
|
msg = error.formatMsg('error', error.ERROR_NO_170, "OnQueryNewGuyCardState error!pack = %s"%(binascii.b2a_hex(buf)))
|
mylog.error(msg)
|
#Òì³£ÁË,µ±³ÉʹÓùý£¬·ÀË¢
|
sendPack.IsUsed = 1
|
sendPack.UserDataLen = 0
|
sendPack.UserData = ''
|
self.sendString(pack, sendPack.GetBuffer())
|
|
def onCheckUpdateNewGuyCardState(self, db, pack):
|
try:
|
buf = pack.getBuffer()
|
packLen = pack.getLength()
|
recvPack = RecvPackProtocol.tagMDCheckUpdateMediaCardState()
|
pos = 0
|
recvPack.ReadData(buf, pos)
|
|
sendPack = SendPackProtocol.tagDMCheckUpdateMediaCardResult()
|
sendPack.Type = CommonDefine.dgDBToMapServer
|
sendPack.SubType = CommonDefine.gmUpdateNewGuyCardState
|
sendPack.CardIDLen = recvPack.CardIDLen
|
sendPack.CardID = recvPack.CardID
|
|
mylog.debug('onCheckUpdateNewGuyCardState %s'%recvPack.OutputString())
|
obj = DataServerPlayerData.tagDBNewGuyCardState()
|
obj.CardIDLen = recvPack.CardIDLen
|
obj.CardID = recvPack.CardID
|
obj.IsUsed = recvPack.IsUsed
|
obj.UserDataLen = recvPack.UserDataLen
|
obj.UserData = recvPack.UserData
|
obj.CardType = recvPack.CardType
|
obj.ValidTime = recvPack.ValidTime
|
|
col = db[UCN_DBNewGuyCardState]
|
if not obj.adoCheckUpdate(col):
|
sendPack.Result = 0
|
self.sendString(pack, sendPack.GetBuffer())
|
mylog.debug('onCheckUpdateNewGuyCardState failed!cardID = %s'%recvPack.CardID)
|
return
|
sendPack.Result = 1
|
self.sendString(pack, sendPack.GetBuffer())
|
mylog.debug('onCheckUpdateNewGuyCardState success!cardID = %s'%recvPack.CardID)
|
except Exception, e:
|
msg = error.formatMsg('error', error.ERROR_NO_171, "onCheckUpdateNewGuyCardState error %s!pack = %s"%(e, binascii.b2a_hex(buf)))
|
mylog.error(msg)
|
except:
|
msg = error.formatMsg('error', error.ERROR_NO_171, "onCheckUpdateNewGuyCardState error!pack = %s"%(binascii.b2a_hex(buf)))
|
mylog.error(msg)
|
#Òì³£
|
sendPack.Result = 0
|
self.sendString(pack, sendPack.GetBuffer())
|
|
def OnSavePlayerInfo(self, db, pack):
|
'''±£´æÍæ¼ÒÐÅÏ¢'''
|
if self.IsMergeServer():
|
return
|
pos = 0
|
|
PlayerInfo = RecvPackProtocol.tagGDSavePlayerInfo()
|
pos = PlayerInfo.ReadData( pack.getBuffer(), pos)
|
|
if not PlayerInfo.GeTuiClientID:
|
# ûÓиöÍÆIDÕý³£ÊÇÍÑ»ú¹Ò·¢°ü£¬²»´¦Àí
|
return
|
|
col = db[UCN_DSAccount]
|
PlayerAcc = DataServerPlayerData.tagDSAccount()
|
PlayerAcc.ACCID = PlayerInfo.AccID.lower()
|
if not PlayerAcc.adoLoadC(col):
|
if PlayerAcc.ACCID:
|
msg = error.formatMsg('error', error.ERROR_NO_57, "load account failed, accid = %s"%PlayerAcc.ACCID)
|
mylog.error(msg)
|
else:
|
mylog.warning("OnSavePlayerInfo load account failed, accid = %s"%PlayerAcc.ACCID)
|
return
|
|
PlayerAcc.GeTuiClientID = PlayerInfo.GeTuiClientID
|
|
PlayerAcc.adoUpdateC(col)
|
|
def OnPrepareCreateRole(self, db, pack):
|
'''½øÈë´´½ÇÂñµã'''
|
pos = 0
|
|
PlayerInfo = RecvPackProtocol.tagLDPrepareCreateRole()
|
pos = PlayerInfo.ReadData( pack.getBuffer(), pos)
|
account = self.GetAccountFromTable(PlayerInfo.AccID, db)
|
PegasusCollectorProxy.EventReport(9001, "OperatorID=%s&Step=%s&AccountID=%s&Flag=1000&DeviceFlag=%s"%(
|
account.AppID, 2, CommFunc.GetPlatformAccID(PlayerInfo.AccID), account.DeviceFlag))
|
|
def __ReadPlayerID(self, db, saveData):
|
playerRec = DataServerPlayerData.tagDBPlayer()
|
pos = 0
|
dbPlayerReadLen = playerRec.readData(saveData, pos, len(saveData))
|
if -1 == dbPlayerReadLen:
|
return (False, 0, "")
|
pos += dbPlayerReadLen
|
playerID = playerRec.PlayerID
|
if playerID == 0:
|
return (False, 0, "")
|
mylog.info("__ReadPlayerID playerID = %s"%(playerID))
|
return (True, playerID, playerRec.AccID)
|
|
def onSaveMapServerPlayerDataMergeServer(self, db, pack):
|
g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict
|
'''Íæ¼ÒÏÂÏߣ¬¿ç·þ·þÎñÆ÷ÏÂÏß²»±£´æ'''
|
pos = 1 #Ìø¹ýgstUpdate
|
saveData, pos = CommFunc.ReadString(pack.getBuffer(), pos, pack.getLength() - pos)
|
|
|
# Óë²ß»®Ô¼¶¨ ÀëÏß³¬¹ý3·ÖÖÓÔò±ØÐë´Ó×Ó·þÔٴεǼ»ã±¨ÐÂÊý¾Ý
|
# ΪÁ˱ÜÃâ g_mergeRegisterPlayerDict Õ¼Óùý¶àÄڴ棬ÿ10·ÖÖÓÇå³ýÒ»´ÎÒÑÏÂÏßÊý¾Ý
|
result, playerID, accID = self.__ReadPlayerID(db, saveData)
|
|
# ±£´æ¿ç·þÊý¾ÝÖ÷ÒªÊÇΪÁ˱ÜÃâ¶Ìʱ¼ä¶ÏÏßÖØÁ¬Íæ¼ÒÊý¾Ý²»¶ÔÓ¦£¬Èç×ø±êÓֻص½ÁËÆðµã
|
if accID in g_mergeRegisterPlayerDict:
|
g_mergeRegisterPlayerDict[accID][MergeRegPInfoIndex_LogoutTime] = time()
|
g_mergeRegisterPlayerDict[accID][MergeRegPInfoIndex_PackData].Data = saveData
|
g_mergeRegisterPlayerDict[accID][MergeRegPInfoIndex_PackData].DataLen = len(saveData)
|
|
mylog.info("onSaveMapServerPlayerDataMergeServer result = %s, playerID = %s" % (result, playerID))
|
|
return (result, playerID)
|
|
def onSaveMapServerPlayerData(self, db, pack):
|
'''Íæ¼ÒÏÂÏߣ¬±£´æÍæ¼ÒÔÚMapServerµÄÊý¾Ý'''
|
pos = 1 #Ìø¹ýgstUpdate
|
saveData, pos = CommFunc.ReadString(pack.getBuffer(), pos, pack.getLength() - pos)
|
|
#Õý³£Çé¿ö
|
#±£´æÊý¾Ý
|
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:
|
#±£´æÊ§°Ü
|
msg = error.formatMsg('error', error.ERROR_NO_59, 'Player save data failed!playerID = %s'%playerID)
|
mylog.error(msg)
|
|
DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\SaveFailDump', '%s.mdat'%playerID, saveData)
|
|
|
# Íæ¼ÒÏÂÏ߻ָ´³äÖµ¶Ò»»ÖеĶ©µ¥,IsProceeΪ1,µ«endtimeΪ¿ÕµÄÇé¿ö
|
self.RevoverBillProcess(db, accID)
|
mylog.info("onSaveMapServerPlayerData result = %s, playerID = %s"%(result, playerID))
|
|
# ÏÂÏ߳ɹ¦Èë¿âºóͬ²½Òƶ¯Íæ¼Ò±¸µµ±¸·ÝÎļþ¼Ð
|
PlayerBakDir = os.path.join(DBConfig.PlayerBakRoot, str(playerID))
|
if os.path.exists(PlayerBakDir):
|
BakCopyDir = os.path.join(PlayerBakDir, "Backup")
|
for filename in os.listdir(PlayerBakDir):
|
if not filename.endswith(DBConfig.PlayerBakFileType):
|
continue
|
fullPath = os.path.join(PlayerBakDir, filename)
|
if not os.path.exists(os.path.join(BakCopyDir, filename)):
|
shutil.move(fullPath, BakCopyDir)
|
else:
|
os.remove(fullPath)
|
|
return (result, playerID)
|
|
def __PlayerBackupSave(self):
|
db = self.db
|
'''Íæ¼Ò±¸µµÈë¿â - ½öÔÚÆô¶¯dbÁ´½Ó³É¹¦ºó´¥·¢Ò»´Î
|
'''
|
if self.IsMergeServer():
|
return
|
|
if not DBConfig.PlayerBakRoot or not os.path.exists(DBConfig.PlayerBakRoot):
|
return
|
|
mylog.info("Íæ¼Ò±¸µµÂ·¾¶ DBConfig.PlayerBakRoot=%s" % DBConfig.PlayerBakRoot)
|
|
for parent, _, filenames in os.walk(DBConfig.PlayerBakRoot):
|
if parent.endswith("Backup"):
|
continue
|
for filename in filenames:
|
if not filename.endswith(DBConfig.PlayerBakFileType):
|
continue
|
if len(filenames) > 1:
|
mylog.fatal("Íæ¼Ò±¸µµ¸öÊýÒì³£: The number of backup files is greater than one. filenames=%s" % filenames)
|
return
|
|
try:
|
fullPath = os.path.join(parent, filename)
|
fileHandler = open(fullPath,'rb')
|
saveData = fileHandler.read()
|
fileHandler.close()
|
saveData = zlib.decompress(saveData)
|
except:
|
mylog.fatal("Íæ¼Ò±¸µµ´ò¿ªÊ§°Ü. %s" % fullPath)
|
return
|
|
if DBConfig.PackSave:
|
result, playerID, accID = self.SavePlayerMapServerDataEx(db, saveData)
|
else:
|
result, playerID, accID = self.SavePlayerMapServerData(db, saveData)
|
|
#±£´æÊ§°Ü
|
if not result:
|
mylog.fatal("Íæ¼Ò±¸µµÈë¿âʧ°Ü fail. %s" % fullPath)
|
return
|
|
BakCopyDir = os.path.join(DBConfig.PlayerBakRoot, str(playerID), "Backup")
|
if not os.path.exists(os.path.join(BakCopyDir, filename)):
|
shutil.move(fullPath, BakCopyDir)
|
mylog.info("Íæ¼Ò±¸µµÈë¿â³É¹¦: playerID=%s,accID=%s, move %s" % (playerID, accID, filename))
|
else:
|
os.remove(fullPath)
|
mylog.info("Íæ¼Ò±¸µµÈë¿â³É¹¦: playerID=%s,accID=%s, remove %s" % (playerID, accID, filename))
|
|
return
|
|
def SavePlayerDataByBackup(self, db, bakFileName):
|
mylog.info("===Ö´ÐÐÍæ¼ÒÖ¸¶¨±¸µµÈë¿â: %s" % bakFileName)
|
try:
|
playerID = int(bakFileName[:bakFileName.index(".")].split("_")[0])
|
except:
|
playerID = 0
|
|
fullPath = os.path.join(DBConfig.PlayerBakRoot, str(playerID), "Backup", bakFileName)
|
if not os.path.exists(fullPath):
|
msg = "²»´æÔÚ¸ÃÍæ¼Ò±¸µµÎļþ: %s" % fullPath
|
mylog.info(msg)
|
return
|
|
try:
|
fileHandler = open(fullPath,'rb')
|
saveData = fileHandler.read()
|
fileHandler.close()
|
saveData = zlib.decompress(saveData)
|
except:
|
msg = "Íæ¼ÒÖ¸¶¨±¸µµ´ò¿ªÊ§°Ü: %s" % fullPath
|
mylog.info(msg)
|
return
|
|
if DBConfig.PackSave:
|
result, playerID, accID = self.SavePlayerMapServerDataEx(db, saveData)
|
else:
|
result, playerID, accID = self.SavePlayerMapServerData(db, saveData)
|
|
if not result:
|
msg = "Íæ¼ÒÖ¸¶¨±¸µµÈë¿âʧ°Ü: %s" % bakFileName
|
mylog.info(msg)
|
return
|
|
msg = "Íæ¼ÒÖ¸¶¨±¸µµÈë¿â³É¹¦: playerID=%s,accID=%s, %s" % (playerID, accID, bakFileName)
|
mylog.info(msg)
|
return
|
|
# Íæ¼ÒÏÂÏ߻ָ´³äÖµ¶Ò»»ÖеĶ©µ¥,IsProceeΪ1,µ«endtimeΪ¿ÕµÄÇé¿ö
|
def RevoverBillProcess(self, db, accID):
|
try:
|
if not accID:
|
return
|
account = accID.strip(chr(0))
|
col = db[UCN_PayInfo]
|
result = col.find({'AccID':account, 'IsProcess':1, 'EndOrderTime':0})
|
|
if not result or result.count() == 0:
|
# ûÓгäÖµ¶©µ¥
|
return
|
|
# Ò»µ¥Ò»µ¥ »Ö¸´
|
billInfo = result[0]
|
orderID = billInfo['OrderID']
|
col.update({"OrderID":orderID}, {"$set":{"IsProcess":0}})
|
|
mylog.debug('RevoverBillProcess success...%s'%orderID)
|
except:
|
mylog.error("RevoverBillProcess error %s"%traceback.format_exc())
|
|
def SavePlayerMapServerData(self, db, saveData):
|
playerRec = DataServerPlayerData.tagDBPlayer()
|
pos = 0
|
dbPlayerReadLen = playerRec.readData(saveData, pos, len(saveData))
|
if -1 == dbPlayerReadLen:
|
#Êý¾ÝÒì³££¬³¤¶È²»×ã
|
# mylog.error('Player save data error:len = %s sessionID = %s'%len(saveData, sessionID))
|
# DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\Player_save', '%s.mdat'%sessionID, saveData)
|
return (False, 0, '')
|
pos += dbPlayerReadLen
|
mylog.info('Saving player data,playerID = %s....'%playerRec.PlayerID)
|
if playerRec.PlayerID == 0:
|
# mylog.error('playerID = %s'%playerRec.PlayerID)
|
return (False, 0, '')
|
#AccIDתСд
|
playerRec.AccID = playerRec.AccID.lower()
|
collection = db[UCN_DBPlayer]
|
|
oFuncGrade = self.GetFuncGrade("gstSaveMapServerCrashData_1_tagDBPlayer")
|
oFuncGrade.Start()
|
if not playerRec.adoUpdateC(collection):
|
# DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\Player_save', '%s.mdat'%sessionID, saveData)
|
# mylog.error('player save error:playerID = %s'%playerRec.PlayerID)
|
return (False, playerRec.PlayerID, '')
|
oFuncGrade.End()
|
#¼Ç¼ÏÂÏßÈÕÖ¾Á÷Ïò
|
self.recPlayerLogoff(playerRec)
|
#±£´æÎïÆ·µÈÆäËûÊý¾Ý
|
#²»ÔÙÖ§³Öµ¥±íģʽ
|
#²»ÔÙÖ§³ÖÎļþģʽ
|
#±£´æÎïÆ·
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleItem")
|
oFuncGrade.Start()
|
#¶Ô±È²âÊÔÓÃ
|
# if DBConfig.PackSave:
|
# pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleItem, DataServerPlayerData.tagRoleItem, saveData[pos:], True)
|
pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleItem, DataServerPlayerData.tagRoleItem, saveData[pos:], True)
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleMission")
|
oFuncGrade.Start()
|
pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleMission, DataServerPlayerData.tagRoleMission, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleMissionDict")
|
oFuncGrade.Start()
|
pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleMissionDict, DataServerPlayerData.tagRoleMissionDict, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleSkill")
|
oFuncGrade.Start()
|
pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleSkill, DataServerPlayerData.tagRoleSkill, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleBuff")
|
oFuncGrade.Start()
|
pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleBuff, DataServerPlayerData.tagRoleBuff, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleRepeatTime")
|
oFuncGrade.Start()
|
pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleRepeatTime, DataServerPlayerData.tagRoleRepeatTime, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagPlayerHorseTable")
|
oFuncGrade.Start()
|
pos += self.savePlayerData(playerRec.PlayerID, db, UCN_PlayerHorseTable, DataServerPlayerData.tagPlayerHorseTable, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_gmOperCheck")
|
oFuncGrade.Start()
|
#·âºÅ¼ì²é
|
self.gmOperCheck(playerRec.AccID, playerRec.PlayerID, saveData[pos:])
|
oFuncGrade.End()
|
|
pos += self.savePlayerData(playerRec.PlayerID, db, UCN_GMOper, DataServerPlayerData.tagGMOper, saveData[pos:])
|
#Ìø¹ýGM IP±í
|
gmIPCnt, pos = CommFunc.ReadDWORD(saveData, pos)
|
gmIPRec = DataServerPlayerData.tagDBGMIP()
|
for i in xrange(gmIPCnt):
|
#gmIPRec.clear()
|
pos += gmIPRec.readData(saveData, pos, len(saveData))
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRolePet")
|
oFuncGrade.Start()
|
pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RolePet, DataServerPlayerData.tagRolePet, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagPetSkill")
|
oFuncGrade.Start()
|
pos += self.savePlayerData(playerRec.PlayerID, db, UCN_PetSkill, DataServerPlayerData.tagPetSkill, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagRoleNomalDict")
|
oFuncGrade.Start()
|
pos += self.savePlayerData(playerRec.PlayerID, db, UCN_RoleNomalDict, DataServerPlayerData.tagRoleNomalDict, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagPlayerDienstgrad")
|
oFuncGrade.Start()
|
pos += self.savePlayerData(playerRec.PlayerID, db, UCN_PlayerDienstgrad, DataServerPlayerData.tagPlayerDienstgrad, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerData_1_tagBattleFormation")
|
oFuncGrade.Start()
|
pos += self.savePlayerData(playerRec.PlayerID, db, UCN_BattleFormation, DataServerPlayerData.tagBattleFormation, saveData[pos:])
|
oFuncGrade.End()
|
|
assert pos == len(saveData)
|
return (True, playerRec.PlayerID, playerRec.AccID)
|
|
def SavePlayerMapServerDataEx(self, db, saveData):
|
playerRec = DataServerPlayerData.tagDBPlayer()
|
pos = 0
|
dbPlayerReadLen = playerRec.readData(saveData, pos, len(saveData))
|
if -1 == dbPlayerReadLen:
|
#Êý¾ÝÒì³££¬³¤¶È²»×ã
|
# mylog.error('Player save data error:len = %s sessionID = %s'%len(saveData, sessionID))
|
# DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\Player_save', '%s.mdat'%sessionID, saveData)
|
return (False, 0, '')
|
pos += dbPlayerReadLen
|
mylog.info('Saving player data,playerID = %s....'%playerRec.PlayerID)
|
if playerRec.PlayerID == 0:
|
# mylog.error('playerID = %s'%playerRec.PlayerID)
|
return (False, 0, '')
|
#AccIDתСд
|
playerRec.AccID = playerRec.AccID.lower()
|
collection = db[UCN_DBPlayer]
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagDBPlayer")
|
oFuncGrade.Start()
|
if not playerRec.adoUpdateC(collection):
|
# DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\Player_save', '%s.mdat'%sessionID, saveData)
|
# mylog.error('player save error:playerID = %s'%playerRec.PlayerID)
|
return (False, playerRec.PlayerID, '')
|
oFuncGrade.End()
|
#¼Ç¼ÏÂÏßÈÕÖ¾Á÷Ïò
|
if playerRec.CountryLastWeekHornor == 0: # Ô¼¶¨ÎªÏÂÏß±êʶ
|
self.recPlayerLogoff(playerRec)
|
#±£´æÎïÆ·µÈÆäËûÊý¾Ý
|
#²»ÔÙÖ§³Öµ¥±íģʽ
|
#²»ÔÙÖ§³ÖÎļþģʽ
|
#±£´æÎïÆ·
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleItem")
|
oFuncGrade.Start()
|
#¶Ô±È²âÊÔÓÃ
|
# if DBConfig.PackSave:
|
# pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleItem, DataServerPlayerData.tagRoleItem, saveData[pos:], True)
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleItem, DataServerPlayerData.tagRoleItem, saveData[pos:], True)
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleMission")
|
oFuncGrade.Start()
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleMission, DataServerPlayerData.tagRoleMission, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleMissionDict")
|
oFuncGrade.Start()
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleMissionDict, DataServerPlayerData.tagRoleMissionDict, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleSkill")
|
oFuncGrade.Start()
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleSkill, DataServerPlayerData.tagRoleSkill, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleBuff")
|
oFuncGrade.Start()
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleBuff, DataServerPlayerData.tagRoleBuff, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleRepeatTime")
|
oFuncGrade.Start()
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleRepeatTime, DataServerPlayerData.tagRoleRepeatTime, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagPlayerHorseTable")
|
oFuncGrade.Start()
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_PlayerHorseTable, DataServerPlayerData.tagPlayerHorseTable, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_gmOperCheck")
|
oFuncGrade.Start()
|
#·âºÅ¼ì²é
|
self.gmOperCheck(playerRec.AccID, playerRec.PlayerID, saveData[pos:])
|
oFuncGrade.End()
|
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_GMOper, DataServerPlayerData.tagGMOper, saveData[pos:])
|
#Ìø¹ýGM IP±í
|
gmIPCnt, pos = CommFunc.ReadDWORD(saveData, pos)
|
gmIPRec = DataServerPlayerData.tagDBGMIP()
|
for i in xrange(gmIPCnt):
|
#gmIPRec.clear()
|
pos += gmIPRec.readData(saveData, pos, len(saveData))
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRolePet")
|
oFuncGrade.Start()
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RolePet, DataServerPlayerData.tagRolePet, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagPetSkill")
|
oFuncGrade.Start()
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_PetSkill, DataServerPlayerData.tagPetSkill, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagRoleNomalDict")
|
oFuncGrade.Start()
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleNomalDict, DataServerPlayerData.tagRoleNomalDict, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagPlayerDienstgrad")
|
oFuncGrade.Start()
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_PlayerDienstgrad, DataServerPlayerData.tagPlayerDienstgrad, saveData[pos:])
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("SavePlayerMapServerDataEx_1_tagBattleFormation")
|
oFuncGrade.Start()
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_BattleFormation, DataServerPlayerData.tagBattleFormation, saveData[pos:])
|
oFuncGrade.End()
|
|
assert pos == len(saveData)
|
return (True, playerRec.PlayerID, playerRec.AccID)
|
|
def gmOperCheck(self, accID, playerID, data):
|
pos = 0
|
length = len(data)
|
cnt, pos = CommFunc.ReadDWORD(data, pos)
|
length -= pos
|
gmOperRec = DataServerPlayerData.tagGMOper()
|
for i in xrange(cnt):
|
gmOperRec.clear()
|
readLen = gmOperRec.readData(data, pos, length)
|
pos += readLen
|
length -= readLen
|
|
if gmOperRec.Oper == CommonDefine.gmForbidAcc:
|
#¼Ç¼·âºÅÈÕÖ¾
|
self.onForbiddenUpdate(accID, playerID, True, CommFuncEx.TDateTime_Now(), (int)(gmOperRec.EndTime - CommFuncEx.TDateTime_Now()), gmOperRec.GMAccID,
|
'EndTime = %s.Reason = %s'%(CommFuncEx.TDateTimeToString(gmOperRec.EndTime), gmOperRec.Msg))
|
|
def savePlayerDataEx(self, playerID, db, collectionName, structName, data, checkSID = False):
|
'''±£´æÍæ¼ÒÎïÆ·µÈÊý¾Ý£¬ÓÅ»¯°æ'''
|
g_playerDataCntInfo = PyGameData.g_playerDataCntInfo
|
if playerID not in g_playerDataCntInfo:
|
g_playerDataCntInfo[playerID] = {}
|
oAllFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_All"%structName)
|
oAllFuncGrade.Start()
|
collection = db[collectionName]
|
#ɾ³ý¾ÉÊý¾Ý
|
oFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_remove"%structName)
|
oFuncGrade.Start()
|
#collection.remove({'PlayerID':playerID}) #ÕâÀïËäȻûÓÐ×öË÷Òý£¬µ«ÊÇËٶȺܿ죬ºöÂÔ
|
#·ÏÆú remove + insert ·½Ê½£¬¸ÄΪֱ½ÓʹÓà update
|
oFuncGrade.End()
|
|
#²åÈëÐÂÊý¾Ý
|
pos = 0
|
cnt, pos = CommFunc.ReadDWORD(data, pos)
|
mylog.info('saving %s data, playerID = %s, cnt = %s'%(collectionName, playerID, cnt))
|
rec = structName()
|
length = len(data)
|
#ÕâÀォÊý¾Ý´ò³ÉÒ»¸ö×ֵ䣬¼´Êý¾Ý¿âµÄÒ»Ìõ¼Ç¼´æ´¢£¬ÕâÑù»á±ÈÏÂÃæÄÇÖÖ·½Ê½¿ì
|
doc = {}
|
if cnt:
|
doc['PlayerID'] = playerID
|
doc['Count'] = cnt
|
doc['__PackSave'] = 1
|
|
for i in xrange(cnt):
|
oFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_clear"%structName)
|
oFuncGrade.Start()
|
rec.clear()
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_readData"%structName)
|
oFuncGrade.Start()
|
readLen = rec.readData(data, pos, length)
|
oFuncGrade.End()
|
if readLen == -1:
|
mylog.info('%s'%b2a_hex(data))
|
return
|
pos += readLen
|
|
if checkSID:
|
oFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_makeSID"%structName)
|
oFuncGrade.Start()
|
rec.makeSID()
|
oFuncGrade.End()
|
#ÐòºÅ×öKEY
|
doc['%s'%(i+1)] = rec.getRecord()
|
|
if doc:
|
trycnt = 0
|
while True:
|
try:
|
oFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_update"%structName)
|
oFuncGrade.Start()
|
#collection.insert(doc, False, True)
|
collection.update({'PlayerID':playerID}, doc, upsert=True) # ÉèÖà upsert Ϊ True£¬²»´æÔÚʱÔò²åÈëÐÂÊý¾Ý
|
oFuncGrade.End()
|
g_playerDataCntInfo[playerID][collectionName] = cnt
|
mylog.info('update end %s data, playerID = %s, cnt = %s, playerDataCntInfo=%s'%(collectionName, playerID, cnt, g_playerDataCntInfo[playerID]))
|
break
|
except pymongo.errors.OperationFailure, err:
|
if(DBConfig.TryCntOnWriteFail > trycnt):
|
trycnt += 1
|
continue
|
addADOExceptionCount()
|
mylog.info("%s.%s:docs = %s"%(self.__class__.__name__, inspect.stack()[0][3], doc))
|
mylog.error('update failed!docs = %s, error = %s, trycnt = %d'%(doc, err, trycnt))
|
break
|
else:
|
trycnt = 0
|
while True:
|
try:
|
oFuncGrade = self.GetFuncGrade("savePlayerDataEx_%s_remove"%structName)
|
oFuncGrade.Start()
|
collection.remove({'PlayerID':playerID})
|
oFuncGrade.End()
|
g_playerDataCntInfo[playerID][collectionName] = 0
|
mylog.info('remove end %s data, playerID = %s, cnt = %s, playerDataCntInfo=%s'%(collectionName, playerID, cnt, g_playerDataCntInfo[playerID]))
|
break
|
except pymongo.errors.OperationFailure, err:
|
if(DBConfig.TryCntOnWriteFail > trycnt):
|
trycnt += 1
|
continue
|
addADOExceptionCount()
|
mylog.error('remove failed!%s playerID = %s, error = %s, trycnt = %d'%(collectionName, playerID, err, trycnt))
|
break
|
|
oAllFuncGrade.End()
|
return pos
|
|
|
def savePlayerData(self, playerID, db, collectionName, structName, data, checkSID = False):
|
'''±£´æÍæ¼ÒÎïÆ·Êý¾Ý'''
|
g_playerDataCntInfo = PyGameData.g_playerDataCntInfo
|
if playerID not in g_playerDataCntInfo:
|
g_playerDataCntInfo[playerID] = {}
|
oAllFuncGrade = self.GetFuncGrade("savePlayerData_%s_All"%structName)
|
oAllFuncGrade.Start()
|
|
#ɾ³ý¾ÉÊý¾Ý
|
collection = db[collectionName]
|
oFuncGrade = self.GetFuncGrade("savePlayerData_%s_remove"%structName)
|
oFuncGrade.Start()
|
collection.remove({'PlayerID':playerID})
|
oFuncGrade.End()
|
|
#²åÈëÐÂÊý¾Ý
|
pos = 0
|
cnt, pos = CommFunc.ReadDWORD(data, pos)
|
mylog.debug('saving %s data for player playerID = %s cnt = %s, data = %s'%(structName, playerID, cnt, data))
|
rec = structName()
|
length = len(data)
|
docs = []
|
for i in xrange(cnt):
|
oFuncGrade = self.GetFuncGrade("savePlayerData_%s_clear"%structName)
|
oFuncGrade.Start()
|
rec.clear()
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("savePlayerData_%s_readData"%structName)
|
oFuncGrade.Start()
|
readLen = rec.readData(data, pos, length)
|
oFuncGrade.End()
|
if readLen == -1:
|
mylog.info('%s'%(b2a_hex(data)))
|
return
|
pos += readLen
|
# length -= readLen
|
|
if checkSID:
|
oFuncGrade = self.GetFuncGrade("savePlayerData_%s_makeSID"%structName)
|
oFuncGrade.Start()
|
rec.makeSID()
|
oFuncGrade.End()
|
# rec.adoInsertC(collection)
|
# else:
|
# rec.adoInsert(collection)
|
oFuncGrade = self.GetFuncGrade("savePlayerData_%s_getRecord"%structName)
|
oFuncGrade.Start()
|
doc = rec.getRecord()
|
oFuncGrade.End()
|
|
docs.append(doc)
|
if len(docs):
|
trycnt = 0
|
while True:
|
try:
|
oFuncGrade = self.GetFuncGrade("savePlayerData_%s_insert"%structName)
|
oFuncGrade.Start()
|
collection.insert(docs, False, True)
|
oFuncGrade.End()
|
g_playerDataCntInfo[playerID][collectionName] = cnt
|
break
|
except pymongo.errors.OperationFailure, err:
|
if(DBConfig.TryCntOnWriteFail > trycnt):
|
trycnt += 1
|
continue
|
addADOExceptionCount()
|
mylog.info("%s.%s:docs = %s"%(self.__class__.__name__, inspect.stack()[0][3], docs))
|
mylog.error('Insert failed!docs = %s, error = %s, trycnt = %d'%(docs, err, trycnt))
|
break
|
else:
|
g_playerDataCntInfo[playerID][collectionName] = 0
|
oAllFuncGrade.End()
|
return pos
|
|
def recPlayerLogoff(self, dbPlayer):
|
# req = DataServerLogData.tagDBPlayerLogInfoOnLogOff()
|
# req.AccID = dbPlayer.AccID
|
# req.PlayerName = dbPlayer.PlayerName
|
# req.AccState = dbPlayer.AccState
|
# req.LV = dbPlayer.LV
|
# req.Gold = dbPlayer.Gold
|
# req.GoldPaper = dbPlayer.GoldPaper
|
# req.Silver = dbPlayer.Silver
|
# req.SilverPaper = dbPlayer.SilverPaper
|
# req.GMLevel = dbPlayer.GMLevel
|
# req.Job = dbPlayer.Job
|
# req.TJGTime = dbPlayer.HappyPoint # ÍÑ»ú¹Òʱ¼ä
|
# req.TJGState = dbPlayer.State # 0Õý³£µÇ¼£¬1ÍÑ»úµÇ¼£¬2ÍÑ»úµÇ¼ËÀÍö
|
# req.LastLogoffTime = time()
|
# req.PlayerID = dbPlayer.PlayerID
|
# req.IsOnline = 0 #ĬÈÏ0Òò¹Ø·þʱûÊÕµ½loginserverÈ«²¿ÏÂÏß°ü
|
# sendBuf = ''
|
# sendBuf = CommFunc.WriteBYTE(sendBuf, CommonDefine.gstSavePlayerInfoLogOnLogOff)
|
# sendBuf = CommFunc.WriteString(sendBuf, req.getLength(), req.getBuffer())
|
# self.sendDBRequest(sendBuf)
|
return
|
|
|
def onSavePlayerDataCRCError(self, db, pack, saveDataWithCRC):
|
#dump Êý¾Ý
|
dumpFileName = str(uuid.uuid4()) #random uuid
|
msg = error.formatMsg('error', error.ERROR_NO_60, 'sessionID = 0x%x dump to file %s'%(pack.getPackHead().sessionID, dumpFileName))
|
mylog.error(msg)
|
DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs', dumpFileName, saveDataWithCRC)
|
|
playerRec = DataServerPlayerData.tagDBPlayer()
|
pos = 5 #Ìø¹ýCRC,ServerType
|
length = len(saveDataWithCRC)
|
if -1 == playerRec.readData(saveDataWithCRC, pos, length):
|
#Êý¾Ý³¤¶È²»×㣬ÎÞ·¨´¦Àí
|
pass
|
else:
|
#·âºÅ
|
if self.updatePlayerAccState(db, playerRec.PlayerID, CommonDefine.pysForbidden):
|
#·âºÅ³É¹¦£¬¼Ç¼·âºÅÈÕÖ¾
|
self.sendAccForbiddenLogReq(playerRec.AccID, 1)
|
# #»Ø±¨±£´æÊ§°Ü
|
# updateReturn = SendPackProtocol.tagDBUpdateReturn()
|
# updateReturn.CallType = CommonDefine.dgUpDate
|
# updateReturn.UpdateType = CommonDefine.gstPlayerDetail
|
# updateReturn.Result = 0
|
# self.sendString(pack, updateReturn.GetBuffer())
|
|
def sendAccForbiddenLogReq(self, accid, isForbidden):
|
return
|
# accForbiddenLogReq = DataServerLogData.tagDBPlayerInfoLogForbidden()
|
# accForbiddenLogReq.AccID = accid
|
# accForbiddenLogReq.IsForbidden = isForbidden
|
# accForbiddenLogReq.ForbiddenTime = time()
|
# accForbiddenLogReqPackBuf = ''
|
# accForbiddenLogReqPackBuf = CommFunc.WriteBYTE(accForbiddenLogReqPackBuf, CommonDefine.gstSavePlayerInfoLogOnForbidden)
|
# accForbiddenLogReqPackBuf = CommFunc.WriteString(accForbiddenLogReqPackBuf, accForbiddenLogReq.getLength(), accForbiddenLogReq.getBuffer())
|
# self.sendDBRequest(accForbiddenLogReqPackBuf)
|
|
def updatePlayerAccState(self, db, playerID, newState):
|
'''·âºÅ'''
|
collection = db[UCN_DBPlayer]
|
|
doc = DataServerPlayerData.tagDBPlayer()
|
doc.PlayerID = playerID
|
lastSIDErrorCnt = getSIDErrorCnt()
|
ret = doc.adoLoadC(collection)
|
if not ret:
|
if not (lastSIDErrorCnt == getSIDErrorCnt()):
|
#SID´íÎó
|
mylog.warning('%s.%s SID error found on reading data of playerID = %s!'%(self.__class__.__name__, inspect.stack()[0][3], playerID))
|
return False
|
#Î޴˽ÇÉ«
|
mylog.debug('%s.%s playerID = %s not found!'%(self.__class__.__name__, inspect.stack()[0][3], playerID))
|
return False
|
doc.AccState = newState
|
if not doc.adoUpdateC(collection):
|
return False
|
return True
|
|
def onSaveGameServerPlayerSaveData(self, db, pack):
|
'''Íæ¼ÒÏÂÏߣ¬±£´æÍæ¼ÒÔÚGameServerµÄÊý¾Ý'''
|
saveGameServerPlayerDataReq = RecvPackProtocol.tagGameServerToBalanceServerPlayerSaveData()
|
saveGameServerPlayerDataReq.ReadData(pack.getBuffer(), 0, pack.getLength())
|
|
#mylog.debug(saveGameServerPlayerDataReq.OutputString())
|
|
#playerDataReadPos = 0
|
#playerDataReadPos = self.saveGameServerPlayerData(saveGameServerPlayerDataReq.PlayerID, saveGameServerPlayerDataReq.Data, playerDataReadPos, 'tagPlayerEnemy', DataServerPlayerData.tagPlayerEnemy, db)
|
#playerDataReadPos = self.saveGameServerPlayerData(saveGameServerPlayerDataReq.PlayerID, saveGameServerPlayerDataReq.Data, playerDataReadPos, 'tagPlayerFriend', DataServerPlayerData.tagPlayerFriend, db)
|
if saveGameServerPlayerDataReq.NeedReturn == 2:
|
#ÏÂÏß´¥·¢
|
#αװ³ÉLoginServer·¢Ë͹ýÀ´µÄ£¬ÕâÑù»á»Ø°ü¸øLoginServer
|
pack.setSrcSvrType(MMORPGPack.stLogin)
|
self.sendOKString(CommonDefine.dgPlayerSaveGameServerData, pack, '')
|
return
|
|
def onGetGameServerPlayerLoginData(self, db, pack):
|
# ¸Ä³ÉPY´¦Àí
|
return
|
#========================================================================
|
# '''GameServer¶ÁÈ¡Íæ¼ÒµÇ¼Êý¾Ý'''
|
# getGameServerPlayerLoginDataPack = RecvPackProtocol.tagGBGetGameServerPlayerLoginData()
|
# getGameServerPlayerLoginDataPack.ReadData(pack.getBuffer(), 0, pack.getLength())
|
#
|
# playerEnemyRec = DataServerPlayerData.tagPlayerEnemy()
|
# playerEnemyRec.PlayerID = getGameServerPlayerLoginDataPack.PlayerID
|
# collection = db[UCN_PlayerEnemy]
|
# playerEnemyData = playerEnemyRec.adoQueryIndex(collection)
|
#
|
# playerFriendRec = DataServerPlayerData.tagPlayerFriend()
|
# playerFriendRec.PlayerID = getGameServerPlayerLoginDataPack.PlayerID
|
# collection = db[UCN_PlayerFriend]
|
# playerFriendData = playerFriendRec.adoQueryIndex(collection)
|
#
|
# allData = playerEnemyData + playerFriendData
|
# self.sendGameServerString(pack, CommonDefine.dgPlayerGameServerLoginData, allData)
|
# mylog.debug('send game server player login data ok!')
|
#
|
#========================================================================
|
|
def onCreateRoleServerCheckIsHaveRole(self, db, pack):
|
try:
|
recvPack = RecvPackProtocol.tagCSIsHaveRole()
|
recvPack.ReadData(pack.getBuffer())
|
|
sendPack = SendPackProtocol.tagDRequestResult()
|
sendPack.Type = CommonDefine.gstCreateRoleServerCheckIsHaveRole
|
sendPack.AccID = recvPack.AccID
|
|
Player = DataServerPlayerData.tagDBPlayer()
|
Player.AccID = recvPack.AccID.lower() #ÕʺÅͳһתСд
|
Player.IsDeleted = 0
|
collection = db[UCN_DBPlayer]
|
|
lastExceptionCnt = getADOExceptionCount()
|
lastSIDErrorCnt = getSIDErrorCnt()
|
|
#¼ì²é¸ÃÕʺÅÊÇ·ñÒÑÓÐÓÐЧ½ÇÉ«
|
if Player.adoLoadCEx(collection, {'AccID':fix_incomingText(Player.AccID), 'IsDeleted':Player.IsDeleted}):
|
mylog.info('player of accid = %s exists!'%Player.AccID)
|
sendPack.Result = 1
|
sendPack.ExAttr = 1
|
else: #disCreatePlayerError_PlayerExist
|
if not lastExceptionCnt == getADOExceptionCount():
|
#Êý¾Ý¿â¶ÁÈ¡³ö´í£¬µ«²»Ò»¶¨ÊÇUser¿â¶ÁÈ¡³ö´í
|
sendPack.Result = 0
|
sendPack.ExAttr = disDataBaseError
|
elif not lastSIDErrorCnt == getSIDErrorCnt():
|
if DBConfig.checkSID:
|
sendPack.Result = 0
|
sendPack.ExAttr = disAccStateError
|
else:
|
sendPack.Result = 1
|
sendPack.ExAttr = 1
|
else:
|
sendPack.Result = 1
|
sendPack.ExAttr = 0
|
|
self.sendString(pack, sendPack.GetBuffer())
|
mylog.debug('onCreateRoleServerCheckIsHaveRole ok, Accid = %s!'%recvPack.AccID)
|
except:
|
msg = error.formatMsg('error', error.ERROR_NO_62, "Catch a unexpetcted exception, error = %s"%traceback.format_exc())
|
mylog.error(msg)
|
|
def onCreateRoleServerCheckPlayerExist(self, db, pack):
|
try:
|
recvPack = RecvPackProtocol.tagCSCheckPlayerNameExist()
|
recvPack.ReadData(pack.getBuffer())
|
|
sendPack = SendPackProtocol.tagDRequestResult()
|
sendPack.Type = CommonDefine.gstCreateRoleServerCheckPlayerExist
|
sendPack.AccID = recvPack.AccID
|
sendPack.Result = 1
|
|
if self.hasPlayerByPlayerName(db, recvPack.PlayerName):
|
sendPack.ExAttr = 1
|
else:
|
sendPack.ExAttr = 0
|
|
self.sendString(pack, sendPack.GetBuffer())
|
mylog.debug('onCreateRoleServerCheckPlayerExist ok, Accid = %s!'%recvPack.AccID)
|
except:
|
msg = error.formatMsg('error', error.ERROR_NO_63, "Catch a unexpetcted exception, error = %s"%traceback.format_exc())
|
mylog.error(msg)
|
|
|
def onCreatePlayer(self, db, pack):
|
#αװ³ÉLoginServer·¢Ë͹ýÀ´µÄ
|
pack.setSrcSvrType(MMORPGPack.stLogin)
|
|
Suc, disCode, AccId, data = self.CreateRole(db, pack)
|
if Suc:
|
self.sendOKString(CommonDefine.dgCreatePlayer, pack, data)
|
mylog.debug('send created player info for accid = %s'%AccId)
|
|
else:
|
self.sendFailString(CommonDefine.dgCreatePlayer, pack, disCode)
|
|
def onCreateRoleServerRequestCreateRole(self, db, pack):
|
try:
|
Suc, disCode, AccId, data = self.CreateRole(db, pack)
|
sendPack = SendPackProtocol.tagDRequestResult()
|
sendPack.Type = CommonDefine.gstCreateRoleServerRequestCreateRole
|
sendPack.Result = Suc
|
sendPack.AccID = AccId
|
if Suc:
|
sendPack.ExAttr = 0
|
else:
|
sendPack.ExAttr = disCode
|
mylog.debug('send created player info for accid = %s'%AccId)
|
self.sendString(pack, sendPack.GetBuffer())
|
except:
|
msg = error.formatMsg('error', error.ERROR_NO_64, "Catch a unexpetcted exception, error = %s"%traceback.format_exc())
|
mylog.error(msg)
|
|
|
|
|
#¼ì²éÒÑ·ÖÅäID±íÖÐÊ£ÓàIDÊýÁ¿
|
def CheckEmptyPlayerIDCount(self, db):
|
mylog.debug("CheckEmptyPlayerIDCount start")
|
collection = db[UCN_Dispatch_PlayerID]
|
result = collection.find()
|
if not result:
|
if self.isDispatchingPlayerID:
|
try_count = 0
|
#´Ë´¦µÈ´ý±ØÒªÐÔ²»¸ß£¬Ö÷£¨µ¥£©Ïß³ÌÖ»Óе±»º´æÇøÓÃÍ꣬²¢ÇÒÐÂÏß³ÌÇëÇó¹ý
|
while try_count < 3 and self.isDispatchingPlayerID:
|
if not self.isDispatchingPlayerID:
|
return True
|
sleep(1)
|
try_count+=1
|
return False
|
|
CallDispatchPlayerID(db, self)
|
return True
|
emptyCnt = result.count()
|
|
#ÊýÁ¿×ã¹»ÎÞÐè·ÖÅä
|
if emptyCnt > DBConfig.IDDispatchPlayeIDLimit:
|
return True
|
|
if emptyCnt <= 0:
|
if self.isDispatchingPlayerID:
|
try_count = 0
|
#µÈ´ý3Ãë
|
while try_count < 3 and self.isDispatchingPlayerID:
|
if not self.isDispatchingPlayerID:
|
return True
|
sleep(1)
|
try_count+=1
|
return False
|
CallDispatchPlayerID(db, self)
|
return True
|
|
#¿ªÊ¼Ê¹Óûº³åÊý¾Ý¿ªÒ»¸öÐÂÏß³ÌÇëÇó·ÖÅäÐÂID³Ø
|
if self.isDispatchingPlayerID:
|
return True
|
|
import threading
|
t = threading.Thread(target = CallDispatchPlayerID, args =(db, self))
|
t.start()
|
|
return True
|
|
#´ÓÒÑ·ÖÅäID±íÖÐÈ¡³öÒ»¸ö¿ÕID¸øÍæ¼Ò
|
def PopEmptyPlayerID(self, db):
|
collection = db[UCN_Dispatch_PlayerID]
|
rec = collection.find_one()
|
if rec:
|
newID = rec['PlayerID']
|
collection.remove(rec)
|
return newID
|
return -1
|
|
#Éú³ÉplayerID
|
def DispatchNewPlayerID(self, db):
|
|
UseIDDispatchServer = DBConfig.UseIDDispatchServer
|
if not UseIDDispatchServer:
|
#¾ÉIDÉú³É¹æÔò£¬PLAYERID_FEED±í×ÔÔö
|
return seq(db, UCN_DBPlayer, 'PlayerID', DBConfig.PLAYERID_FEED, DBConfig.PLAYERID_STEP)
|
#ÐÂÉú³É¹æÔò ´ÓרÃŵÄID·ÖÅä·þÎñÆ÷»ñÈ¡
|
self.CheckEmptyPlayerIDCount(db)
|
return self.PopEmptyPlayerID(db)
|
|
# ´ÓÕ˺űíÖлñÈ¡
|
def GetAccountFromTable(self, accID, db):
|
accountData = DataServerPlayerData.tagDSAccount()
|
accountData.ACCID = accID
|
collection = db[UCN_DSAccount]
|
accountData.adoLoad(collection)
|
return accountData
|
|
def CreateRole(self, db, createPlayer):
|
# createPlayer = DataServerPlayerData.tagDBPlayer()
|
# createPlayer.readData(pack.getBuffer(), 1, pack.getLength() - 1) #Ìø¹ýrequestType
|
# createPlayer.IsDeleted = 0
|
# #ÕʺÅͳһתСд
|
# createPlayer.AccID = createPlayer.AccID.lower()
|
collection = db[UCN_DBPlayer]
|
#¼ì²é¸ÃÕʺÅÊÇ·ñÒÑÓÐÓÐЧ½ÇÉ«
|
if createPlayer.adoLoadCEx(collection, {'AccID':fix_incomingText(createPlayer.AccID), 'IsDeleted':createPlayer.IsDeleted}):
|
mylog.warning('player of accid = %s exists!'%createPlayer.AccID)
|
return 0, disCreatePlayerError_PlayerExist, createPlayer.AccID, ''
|
|
#¼ì²é½ÇÉ«ÃûÊÇ·ñÖØ¸´
|
if self.hasPlayerByPlayerName(db, createPlayer.PlayerName):
|
mylog.warning('player of playerName = %s exists!'%createPlayer.PlayerName)
|
return 0, disCreatePlayerError_PlayerNameConflict, createPlayer.AccID, ''
|
#¼Ç¼´´½¨Ê±¼ä
|
createPlayer.CreateRoleTime = CommFuncEx.TDateTimeToString(CommFuncEx.TDateTime_Now())
|
#Éú³É×ÔÔö³¤µÄplayerID
|
#createPlayer.PlayerID = seq(db, UCN_DBPlayer, 'PlayerID', DBConfig.PLAYERID_FEED, DBConfig.PLAYERID_STEP)
|
newPlayerID = self.DispatchNewPlayerID(db)
|
if newPlayerID == -1:
|
#ID·ÖÅäʧ°Ü
|
msg = error.formatMsg('error', error.ERROR_NO_65, 'PlayerID Dispatch failed!accid = %s'%createPlayer.AccID)
|
mylog.error(msg)
|
return 0, disDataBaseError, createPlayer.AccID, ''
|
nameFormat = IpyGameDataPY.GetFuncCfg("CreateRole", 1)
|
createPlayer.PlayerID = newPlayerID
|
createPlayer.PlayerName = (nameFormat % newPlayerID).decode('gbk').encode(DBConfig.encoding)
|
#УÑéͨ¹ý£¬ÍùÊý¾Ý¿âÖвåÈë½ÇÉ«
|
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))
|
PyGameData.g_dbPlayerIDMap[newPlayerID] = createPlayer.AccID
|
mylog.debug('PyGameData.g_dbPlayerIDMap = %s'%(len(PyGameData.g_dbPlayerIDMap)))
|
|
#¹¹ÔìÆäËû½ÇÉ«³õʼÊý¾Ý
|
itemData = ''
|
itemData = CommFunc.WriteDWORD(itemData, 0)
|
missionData = itemData
|
missionDictData = itemData
|
skillData = itemData
|
bufData = itemData
|
repeatTimeData = itemData
|
horseData = itemData
|
gmOperData = itemData
|
gmPermitData = itemData
|
petData = itemData
|
petSkillData = itemData
|
normalDictData = itemData
|
dienstgradData = itemData
|
battleFormationData = itemData
|
allData = createPlayer.getBuffer() + itemData + missionData + missionDictData + skillData + bufData + repeatTimeData + horseData\
|
+ gmOperData + gmPermitData + petData + petSkillData + normalDictData + dienstgradData+battleFormationData
|
#¼ÆËãCRC
|
crc = crc32(allData)
|
dataCrc = ''
|
dataCrc = CommFunc.WriteDWORD(dataCrc, crc)
|
dataCrc = CommFunc.WriteBYTE(dataCrc, 0) #ServerType
|
dataWithCrc = dataCrc + allData
|
mylog.debug('send created player info for accid = %s'%createPlayer.AccID)
|
result = 1, 0, createPlayer.AccID, dataWithCrc
|
|
|
account = self.GetAccountFromTable(createPlayer.AccID, db)
|
#ÐÂÍæ¼Òµ¼Èë - ´´½Ç³É¹¦²½Öèʼþ
|
PegasusCollectorProxy.EventReport(9001, "OperatorID=%s&Step=%s&AccountID=%s&Flag=1000&DeviceFlag=%s"%(
|
account.AppID, 3, CommFunc.GetPlatformAccID(createPlayer.AccID), account.DeviceFlag))
|
|
#UTF8 ÐèҪת³Éurl±àÂë²Å¿ÉÓÃ
|
playerInfo = urllib.urlencode({"OperatorID": account.AppID,
|
"RoleID": createPlayer.PlayerName,
|
"AccountID": CommFunc.GetPlatformAccID(createPlayer.AccID),
|
"Job": createPlayer.Job,
|
"DeviceFlag": account.DeviceFlag,
|
})
|
|
PegasusCollectorProxy.EventReport(1103, playerInfo)
|
DataRecordPack.DR_CreateRole(createPlayer)
|
return result
|
|
def hasPlayerByPlayerName(self, db, playerName):
|
collection = db[UCN_DBPlayer]
|
#¿ªÆôBASE64±àÂëºó£¬ÎÞ·¨½øÐдóСд²»Ãô¸ÐÆ¥Å䣬¼´´óСд²»Ò»ÖµĽÇÉ«ÃûÊÇÔÊÐíµÄÁË
|
resultCollection = collection.find({'PlayerName':fix_incomingText(playerName), 'IsDeleted':0})
|
return (resultCollection.count() != 0)
|
|
def readPlayerPackSaveData(self, col, query, structName, checkSID = False):
|
buf = ''
|
docs = col.find(query).limit(1)
|
if not docs.count():
|
buf = CommFunc.WriteDWORD(buf, docs.count())
|
return buf
|
obj = structName()
|
doc = list(docs)[0]
|
#ÓÐÊý¾Ý
|
if doc.has_key('__PackSave'):
|
#ÒÔ´ò°ü·½Ê½´æ´¢µÄ
|
docCnt = doc['Count']
|
result = ''
|
result = CommFunc.WriteDWORD(result, docCnt)
|
mylog.debug('####reading %s of player %s,cnt = %s'%(structName, query, docCnt))
|
for i in xrange(docCnt):
|
obj.readRecord(doc['%s'%(i+1)])
|
result += obj.getBuffer()
|
return result
|
else:
|
#ÒÔ·Ç´ò°ü·½Ê½´æ´¢µÄ
|
if checkSID:
|
return obj.adoQueryCustomC(col, query)
|
else:
|
return obj.adoQueryCustom(col, query)
|
|
def getMergePlayerDataBuffer(self, newPlayerID, structName, data, checkSID = False):
|
''' »ñÈ¡¿ç·þÍæ¼Òͬ²½Êý¾Ý»º´æbuffer '''
|
oAllFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_%s_All"%structName)
|
oAllFuncGrade.Start()
|
|
pos = 0
|
cnt, pos = CommFunc.ReadDWORD(data, pos)
|
mylog.debug('getMergePlayerDataBuffer %s data, playerID = %s, cnt = %s'%(structName, newPlayerID, cnt))
|
rec = structName()
|
length = len(data)
|
|
result = ''
|
result = CommFunc.WriteDWORD(result, cnt)
|
|
for i in xrange(cnt):
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_%s_clear"%structName)
|
oFuncGrade.Start()
|
rec.clear()
|
oFuncGrade.End()
|
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_%s_readData"%structName)
|
oFuncGrade.Start()
|
readLen = rec.readData(data, pos, length)
|
oFuncGrade.End()
|
if readLen == -1:
|
mylog.warning('%s'%b2a_hex(data))
|
return 0, ""
|
pos += readLen
|
|
#¸üÐÂPlayerID
|
orgPlayerID = 0
|
if CommFuncEx.hasField(rec, 'PlayerID'):
|
orgPlayerID = rec.PlayerID
|
rec.PlayerID = newPlayerID
|
|
#¸üÐÂPetID×Ö¶Î
|
if CommFuncEx.hasField(rec, 'PetID'):
|
if orgPlayerID:
|
oldPetID = rec.PetID
|
petIndex = rec.PetID % orgPlayerID - 1
|
rec.PetID = CommonDefine.makePetID(newPlayerID, petIndex)
|
|
#¸üÐÂTruckID×Ö¶Î
|
if CommFuncEx.hasField(rec, 'TruckID'):
|
rec.TructID = CommonDefine.makeTruckID(newPlayerID)
|
|
#¸üÐÂOwnerID×Ö¶Î
|
if CommFuncEx.hasField(rec, 'OwnerID'):
|
if orgPlayerID:
|
oldOwnerID = rec.OwnerID
|
if orgPlayerID != rec.OwnerID:
|
#ÊdzèÎïID£¬ÖØÐ¼ÆËã
|
petIndex = rec.OwnerID % orgPlayerID - 1
|
rec.OwnerID = CommonDefine.makePetID(newPlayerID, petIndex)
|
else:
|
rec.OwnerID = newPlayerID
|
|
if checkSID:
|
oFuncGrade = self.GetFuncGrade("getMergePlayerDataBuffer_%s_makeSID"%structName)
|
oFuncGrade.Start()
|
rec.makeSID()
|
oFuncGrade.End()
|
|
result += rec.getBuffer()
|
|
oAllFuncGrade.End()
|
return pos, result
|
|
def onGetMergePlayerDetail(self, db, authPack):
|
''' »ñÈ¡¿ç·þÍæ¼ÒÏêϸÐÅÏ¢ '''
|
g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict
|
queryAccid = authPack.AccID
|
mylog.debug('getting mergePlayer detail for accid = %s'%queryAccid)
|
if queryAccid not in g_mergeRegisterPlayerDict:
|
# ²»ÔÚ¿ç·þ»º´æÖеĴӿâÖÐÈ¡
|
return self.onGetPlayerDetail(db, authPack)
|
|
#recvPack = MergeServerRecvProtocol.tagLPRegisterPlayer()
|
regPlayerInfo = g_mergeRegisterPlayerDict[queryAccid]
|
recvPack = regPlayerInfo[MergeRegPInfoIndex_PackData]
|
|
# #¼ÓÉÏCRC
|
# crc = crc32(recvPack.Data)
|
# dataCrc = ''
|
# dataCrc = CommFunc.WriteDWORD(dataCrc, crc)
|
# dataCrc = CommFunc.WriteBYTE(dataCrc, 0) #ServerType
|
# dataWithCrc = dataCrc + recvPack.Data
|
# self.sendOKString(CommonDefine.dgPlayerInit, pack, dataWithCrc)
|
# mylog.debug('onGetMergePlayerDetail OK! accID=%s'%queryAccid)
|
return
|
|
#===============================================================================
|
# def __GetMergePlayerName(self, operator, serverID, playerName):
|
# # »ñÈ¡Íæ¼Ò¿ç·þ·þÎñÆ÷ÉϵÄÃû×Ö
|
# # ͨ¹ýÓÎÏ·Õ˺ÅÖÐµÄÆ½Ì¨±êÖ¾»ñÈ¡Ãû³Æ£¬Ä¿Ç°Îªspid
|
# if not DBConfig.NameFormat:
|
# return playerName
|
#
|
# key = ("OpName_%s" % operator).lower()
|
# opName = getattr(DBConfig, key) if hasattr(DBConfig, key) else ""
|
#
|
# return (DBConfig.NameFormat%{"opname":opName, "sid":serverID}).decode('gbk').encode(DBConfig.encoding) + playerName
|
#===============================================================================
|
|
|
def onGetPlayerDetail(self, db, authPack):
|
g_playerDataCntInfo = PyGameData.g_playerDataCntInfo
|
|
queryAccid = authPack.AccID
|
mylog.info('getting player detail for accid = %s'%queryAccid)
|
|
#Åж¨ÊÇ·ñÔںϷþÖ®ÖÐ
|
# try:
|
# playerList = self.queryMergePlayerList(db, queryAccid)
|
# except:
|
# #³öÁËÒì³££¬»Ø¸´Êý¾Ý¿â·±Ã¦
|
# self.sendFailString(CommonDefine.dgPlayerInit, pack, disDataBaseError)
|
# msg = error.formatMsg('error', error.ERROR_NO_67, 'kick accid = %s reason = %s, error :\n %s'%(queryAccid, disDataBaseError, traceback.format_exc()))
|
# mylog.error(msg)
|
# return
|
#if len(playerList) > 0:
|
if False:
|
#ºÏ·þ´¦Àí
|
# sendPack = SendPackProtocol.tagServerMergeInfo()
|
# sendPack.PlayerCount = len(playerList)
|
# for playerDict in playerList:
|
# try:
|
# singlePlayer = SendPackProtocol.tagServerMergePlayer()
|
# leaderFamilyInfo = []
|
# try:
|
# #²éÑ¯Íæ¼ÒÊÇ·ñ¼Ò×峤
|
# leaderFamilyInfo = self.getFamilyLeaderFamilyID(db, playerDict['PlayerID'])
|
# except:
|
# self.sendFailString(CommonDefine.dgPlayerInit, pack, disDataBaseError)
|
# msg = error.formatMsg('error', error.ERROR_NO_68, 'kick accid = %s reason = %s'%(queryAccid, disDataBaseError))
|
# mylog.error(msg)
|
# return
|
# if len(leaderFamilyInfo) > 0:
|
# #¼Ò×峤
|
# if len(leaderFamilyInfo) > 1:
|
# #´ËÈËÖÁÉÙÊÇÁ½¸ö¼Ò×åµÄ¼Ò×峤£¬ÕâÂß¼Éϲ»¿ÉÄÜ
|
# self.sendFailString(CommonDefine.dgPlayerInit, pack, disDataBaseError)
|
# msg = error.formatMsg('error', error.ERROR_NO_69, 'kick accid = %s reason = %s'%(queryAccid, disDataBaseError))
|
# mylog.error(msg)
|
# return
|
# singlePlayer.LeaderFamilyID = leaderFamilyInfo[0]['ID']
|
# else:
|
# #·Ç¼Ò×峤
|
# singlePlayer.LeaderFamilyID = 0
|
# singlePlayer.PlayerID = playerDict['PlayerID']
|
# singlePlayer.Name = playerDict['PlayerName']
|
# singlePlayer.Job = playerDict['Job']
|
# singlePlayer.Sex = playerDict['Sex']
|
# singlePlayer.LV = playerDict['LV']
|
# singlePlayer.TotalSTR = playerDict['STR']
|
# singlePlayer.TotalPNE = playerDict['PNE']
|
# singlePlayer.TotalPHY = playerDict['PHY']
|
# singlePlayer.TotalCON = playerDict['CON']
|
# singlePlayer.Gold = playerDict['Gold']
|
# singlePlayer.GoldPaper = playerDict['GoldPaper']
|
# singlePlayer.Silver = playerDict['Silver']
|
# singlePlayer.SilverPaper = playerDict['SilverPaper']
|
# singlePlayer.WarehouseGold = playerDict['WarehouseGold']
|
# singlePlayer.WarehouseSilver = playerDict['WarehouseSilver']
|
# singlePlayer.FightPower = playerDict['FightPower']
|
|
# sendPack.Players.append(singlePlayer)
|
# except KeyError, why:
|
# self.sendFailString(CommonDefine.dgPlayerInit, pack, disDataBaseError)
|
# msg = error.formatMsg('error', error.ERROR_NO_70, 'exception = %s:kick accid = %s reason = %s'%(why, queryAccid, disDataBaseError))
|
# mylog.error(msg)
|
# return
|
# self.sendOKString(CommonDefine.dgServerMerge, pack, sendPack.GetBuffer())
|
return
|
else:
|
#·ÇºÏ·þ
|
#¶ÁÈ¡½ÇÉ«»ù±¾ÐÅÏ¢
|
dbPlayer = DataServerPlayerData.tagDBPlayer()
|
dbPlayer.AccID = queryAccid
|
dbPlayer.IsDeleted = 0
|
collection = db[UCN_DBPlayer]
|
lastExceptionCnt = getADOExceptionCount()
|
lastSIDErrorCnt = getSIDErrorCnt()
|
loadOK = dbPlayer.adoLoadCEx(collection, {'AccID':fix_incomingText(dbPlayer.AccID), 'IsDeleted':dbPlayer.IsDeleted})
|
if not lastExceptionCnt == getADOExceptionCount():
|
#Êý¾Ý¿â¶ÁÈ¡³ö´í£¬µ«²»Ò»¶¨ÊÇUser¿â¶ÁÈ¡³ö´í
|
self.sendFailString(CommonDefine.dgPlayerInit, pack, disDataBaseError)
|
return
|
playerDataCntInfo = g_playerDataCntInfo.get(dbPlayer.PlayerID, {})
|
#mylog.info('accid = %s,playerID = %s, playerDataCntInfo=%s'%(queryAccid, dbPlayer.PlayerID, playerDataCntInfo))
|
|
#UTF8 ÐèҪת³Éurl±àÂë²Å¿ÉÓÃ
|
#===================================================================
|
# playerInfo = urllib.urlencode({"RoleID": fix_outgoingText(dbPlayer.PlayerName),
|
# "AccountID": CommFunc.GetPlatformAccID(dbPlayer.AccID),
|
# "IP":getPlayerDetailReq.IP.strip(chr(0)),
|
# "SessionID":PegasusCollectorProxy.GetSessionID(db, dbPlayer.AccID),
|
# "Level":dbPlayer.LV,
|
# "Job":dbPlayer.Job
|
# })
|
#
|
# #µÇ¼Ê¼þ
|
# PegasusCollectorProxy.EventReport(1100, playerInfo)
|
#===================================================================
|
if not lastSIDErrorCnt == getSIDErrorCnt():
|
#SIDУÑé³ö´í£¬·âºÅ
|
if not CommonDefine.isAccStateForbidden(dbPlayer.AccState):
|
if DBConfig.checkSID:
|
#·âºÅ
|
dbPlayer.AccState = CommonDefine.pysSIDCheckErrorForbidden
|
dbPlayer.adoUpdateC(collection)
|
mylog.debug('AccID = %s check SID failed!'%queryAccid)
|
#¼Ç¼Á÷Ïò
|
#===========================================================================
|
# dbServerLogRec = RecvPackProtocol.tagDBServerLogRec()
|
# dbServerLogRec.Type = CommonDefine.gstSavePlayerLog
|
# dbServerLogRec.Oper = 119 #·âºÅÁ÷Ïò
|
# dbServerLogRec.Time = time()
|
# dbServerLogRec.MapID = 0
|
# dbServerLogRec.PlayerID = dbPlayer.PlayerID
|
# dbServerLogRec.Msg = 'ADO SID Check Error !'
|
# dbServerLogRec.MsgLen = len(dbServerLogRec.Msg)
|
# self.sendDBRequest(dbServerLogRec.GetBuffer())
|
#===========================================================================
|
#ÁíÍ⣬¶ÀÁ¢¼ÇÂ¼Íæ¼Ò·âºÅÈÕÖ¾
|
# dbPlayerInfoLogForbidden = RecvPackProtocol.tagDBPlayerInfoLogForbidden()
|
# dbPlayerInfoLogForbidden.AccID = dbPlayer.AccID
|
# dbPlayerInfoLogForbidden.IsForbidden = True
|
# dbPlayerInfoLogForbidden.ForbiddenTime = time()
|
# sendPackBuf = ''
|
# sendPackBuf = CommFunc.WriteBYTE(sendPackBuf, CommonDefine.gstSavePlayerInfoLogOnForbidden)
|
# sendPackBuf = CommFunc.WriteString(sendPackBuf, dbPlayerInfoLogForbidden.GetLength(), dbPlayerInfoLogForbidden.GetBuffer())
|
# self.ctrlDBManager.sendDBRequest(sendPackBuf)
|
self.sendAccForbiddenLogReq(dbPlayer.AccID, 1)
|
#ÐÞ¸ÄÀ´C++ÔÀ´µÄÂß¼
|
#»Ø¸´LoginServer
|
if DBConfig.checkSID:
|
self.sendFailString(CommonDefine.dgPlayerInit, pack, disAccStateError)
|
return
|
|
cntError = False
|
#¶ÁÈ¡ÎïÆ·µÈÆäËûÊý¾Ý
|
#Èç¹ûûÓбØÒª£¬¾Í²»Ö§³Öµ¥±íģʽÁË
|
#¶ÁÈ¡ÎïÆ·
|
queryDict = {'PlayerID':dbPlayer.PlayerID}
|
|
collectionName = UCN_RoleItem
|
collection = db[collectionName]
|
itemData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleItem, True)
|
|
itemCnt = CommFunc.ReadDWORD(itemData, 0)
|
lastCnt = playerDataCntInfo.get(collectionName)
|
cntError = cntError or (lastCnt != None and itemCnt[0] != lastCnt)
|
mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, itemCnt[0], lastCnt))
|
#¶ÁÈ¡ºÍ´æ´¢Ê±½«Êý¾ÝDUMP³öÀ´£¬·½±ã²éÖ¤´ÜºÅÎÊÌâ
|
|
collectionName = UCN_RoleMission
|
collection = db[collectionName]
|
missionData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMission)
|
|
missionCnt = CommFunc.ReadDWORD(missionData, 0)
|
lastCnt = playerDataCntInfo.get(collectionName)
|
cntError = cntError or (lastCnt != None and missionCnt[0] != lastCnt)
|
mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, missionCnt[0], lastCnt))
|
#¶ÁÈ¡ºÍ´æ´¢Ê±½«Êý¾ÝDUMP³öÀ´£¬·½±ã²éÖ¤´ÜºÅÎÊÌâ
|
|
collectionName = UCN_RoleMissionDict
|
collection = db[collectionName]
|
roleMissionDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMissionDict)
|
|
missonDictCnt = CommFunc.ReadDWORD(roleMissionDictData, 0)
|
lastCnt = playerDataCntInfo.get(collectionName)
|
cntError = cntError or (lastCnt != None and missonDictCnt[0] != lastCnt)
|
mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, missonDictCnt[0], lastCnt))
|
|
collectionName = UCN_RoleSkill
|
collection = db[collectionName]
|
roleSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleSkill)
|
|
skillCnt = CommFunc.ReadDWORD(roleSkillData, 0)
|
lastCnt = playerDataCntInfo.get(collectionName)
|
cntError = cntError or (lastCnt != None and skillCnt[0] != lastCnt)
|
mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, skillCnt[0], lastCnt))
|
|
collectionName = UCN_RoleBuff
|
collection = db[collectionName]
|
roleBuffData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleBuff)
|
|
bufCnt = CommFunc.ReadDWORD(roleBuffData, 0)
|
lastCnt = playerDataCntInfo.get(collectionName)
|
cntError = cntError or (lastCnt != None and bufCnt[0] != lastCnt)
|
mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, bufCnt[0], lastCnt))
|
|
collectionName = UCN_RoleRepeatTime
|
collection = db[collectionName]
|
roleRepeatTimeData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleRepeatTime)
|
|
repeatTimeCnt = CommFunc.ReadDWORD(roleRepeatTimeData, 0)
|
lastCnt = playerDataCntInfo.get(collectionName)
|
cntError = cntError or (lastCnt != None and repeatTimeCnt[0] != lastCnt)
|
mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, repeatTimeCnt[0], lastCnt))
|
|
collectionName = UCN_PlayerHorseTable
|
collection = db[collectionName]
|
roleHorseData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerHorseTable)
|
|
horseCnt = CommFunc.ReadDWORD(roleHorseData, 0)
|
lastCnt = playerDataCntInfo.get(collectionName)
|
cntError = cntError or (lastCnt != None and horseCnt[0] != lastCnt)
|
mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, horseCnt[0], lastCnt))
|
|
collectionName = UCN_GMOper
|
collection = db[collectionName]
|
gmOperData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagGMOper)
|
|
gmOperCnt = CommFunc.ReadDWORD(gmOperData, 0)
|
lastCnt = playerDataCntInfo.get(collectionName)
|
cntError = cntError or (lastCnt != None and gmOperCnt[0] != lastCnt)
|
mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, gmOperCnt[0], lastCnt))
|
|
collectionName = UCN_RolePet
|
collection = db[collectionName]
|
rolePetData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRolePet)
|
|
petCnt = CommFunc.ReadDWORD(rolePetData, 0)
|
lastCnt = playerDataCntInfo.get(collectionName)
|
cntError = cntError or (lastCnt != None and petCnt[0] != lastCnt)
|
mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, petCnt[0], lastCnt))
|
|
collectionName = UCN_PetSkill
|
collection = db[collectionName]
|
petSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPetSkill)
|
|
petSkillCnt = CommFunc.ReadDWORD(petSkillData, 0)
|
lastCnt = playerDataCntInfo.get(collectionName)
|
cntError = cntError or (lastCnt != None and petSkillCnt[0] != lastCnt)
|
mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, petSkillCnt[0], lastCnt))
|
|
collectionName = UCN_RoleNomalDict
|
collection = db[collectionName]
|
roleNormalDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleNomalDict)
|
|
dictCnt = CommFunc.ReadDWORD(roleNormalDictData, 0)
|
lastCnt = playerDataCntInfo.get(collectionName)
|
cntError = cntError or (lastCnt != None and dictCnt[0] != lastCnt)
|
mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, dictCnt[0], lastCnt))
|
|
collectionName = UCN_PlayerDienstgrad
|
collection = db[collectionName]
|
roleDienstgradData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerDienstgrad)
|
|
roleDienstgradCnt = CommFunc.ReadDWORD(roleDienstgradData, 0)
|
lastCnt = playerDataCntInfo.get(collectionName)
|
cntError = cntError or (lastCnt != None and roleDienstgradCnt[0] != lastCnt)
|
mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, roleDienstgradCnt[0], lastCnt))
|
|
collectionName = UCN_BattleFormation
|
collection = db[collectionName]
|
battleFormationData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagBattleFormation)
|
|
battleFormationCnt = CommFunc.ReadDWORD(battleFormationData, 0)
|
lastCnt = playerDataCntInfo.get(collectionName)
|
cntError = cntError or (lastCnt != None and battleFormationCnt[0] != lastCnt)
|
mylog.info('%s cnt = %s, lastCnt=%s' % (collectionName, battleFormationCnt[0], lastCnt))
|
|
if cntError:
|
mylog.info("###dgPlayerInit cntError accid = %s" % queryAccid)
|
PegasusCollectorProxy.ErrorReport("login data cntError accid=%s" % queryAccid)
|
dbIni = ConfigParser.ConfigParser() # ÿ´ÎÖØÐ¼ÓÔØ£¬È·±£ËæÊ±ÐÞ¸ÄÓÐЧ
|
dbIni.read(os.path.join(GlobalFunctions.getServerConfigPath(), 'PyMongoDataServer.ini'))
|
DataCntErrorKick = dbIni.has_option("dataset", "DataCntErrorKick") and (dbIni.getint("dataset", "DataCntErrorKick") == 1) # Êý¾Ý´æÈ¡ÌõÊýÒ쳣ʱÊÇ·ñ½ûÖ¹µÇ¼
|
if DataCntErrorKick:
|
self.sendFailString(CommonDefine.dgPlayerInit, pack, disAccStateError)
|
return
|
|
#·âÍ£¼ì²é
|
if dbPlayer.AccState == CommonDefine.pysForbidden:
|
#GM·âºÅ
|
gmOperRec = self.extractGMOper(queryAccid, CommonDefine.gmForbidAcc, gmOperData)
|
if gmOperRec:
|
#ÕÒµ½·âºÅ²Ù×÷
|
if gmOperRec.EndTime > CommFuncEx.TDateTime_Now():
|
#·âºÅÉÐδ½áÊø,Ìßµô
|
self.sendFailString(CommonDefine.dgPlayerInit, pack, disAccStateError)
|
return
|
else:
|
#·âºÅʱ¼äÒѵ½£¬½â·â
|
msg = 'Time past.EndTime = %s.Reason = %s'%(CommFuncEx.TDateTimeToString(gmOperRec.EndTime), gmOperRec.Msg)
|
self.unFobbidenAcc(db, dbPlayer, gmOperRec.GMAccID, msg)
|
mylog.info('auto unforbidden accid = %s msg = %s'%(queryAccid, msg))
|
else:
|
#δÕÒµ½ÁË·âºÅ¼Ç¼,½â·â
|
msg = 'No forbidden oper found!'
|
self.unFobbidenAcc(db, dbPlayer, '', msg)
|
mylog.info('auto unforbidden accid = %s msg = %s'%(queryAccid, msg))
|
elif dbPlayer.AccState == CommonDefine.pysSIDCheckErrorForbidden:
|
#Êý¾ÝÒì³£·âÍ£
|
self.sendFailString(CommonDefine.dgPlayerInit, pack, disAccStateError)
|
return
|
|
#¶ÁÈ¡½ûÖ¹IPÊý¾Ý
|
gmIP = DataServerPlayerData.tagDBGMIP()
|
gmIP.AccID = queryAccid.lower()
|
collection = db[UCN_DBGMIP]
|
gmIPData = gmIP.adoQueryIndex(collection)
|
|
gmIPCnt = CommFunc.ReadDWORD(gmIPData, 0)
|
mylog.info('gmIP cnt = %s'%gmIPCnt[0])
|
|
allData = dbPlayer.getBuffer() + itemData + missionData + roleMissionDictData + roleSkillData + roleBuffData + roleRepeatTimeData + roleHorseData + gmOperData\
|
+ gmIPData + rolePetData + petSkillData + roleNormalDictData + roleDienstgradData+battleFormationData
|
#¼ÓÉÏCRC
|
crc = crc32(allData)
|
dataCrc = ''
|
dataCrc = CommFunc.WriteDWORD(dataCrc, crc)
|
dataCrc = CommFunc.WriteBYTE(dataCrc, 0) #ServerType
|
dataWithCrc = dataCrc + allData
|
#self.sendOKString(CommonDefine.dgPlayerInit, pack, dataWithCrc)
|
sendPack = SendPackProtocol.tagMapServerPlayerLogin()
|
sendPack.Type = CommonDefine.dgPlayerInit
|
sendPack.ServerRoleIndex = authPack.ServerRoleIndex
|
sendPack.SessionID = authPack.SessionID
|
sendPack.ClientIP = authPack.IP
|
sendPack.PlayerInfoPack = dataWithCrc
|
sendPack.PlayerInfoPackLen = len(dataWithCrc)
|
|
col = db[UCN_DSAccount]
|
dbDoc = DataServerPlayerData.tagDSAccount()
|
dbDoc.AccID = queryAccid
|
dbDoc.adoLoadC(col)
|
sendPack.PlayerAccountInfo = dbDoc.getBuffer()
|
sendPack.PlayerAccountInfoLen = dbDoc.getLength()
|
sendPack.MapID = GameWorld.GetGameWorld().GetMapID()
|
NetPackCommon.SendPyPackToMapServerSelf(sendPack.GetBuffer(), sendPack.GetLength())
|
mylog.info('gstPlayerDetail Send accid = %s playerID = %s'%(queryAccid, dbPlayer.PlayerID))
|
|
def unFobbidenAcc(self, db, dbPlayer, gmAccid, msg):
|
# dbPlayer = DataServerPlayerData.tagDBPlayer()
|
# dbPlayer.AccID = accid.lower()
|
dbPlayer.AccState = CommonDefine.pysNormal
|
collection = db[UCN_DBPlayer]
|
dbPlayer.adoUpdateExC(collection, {"AccID":fix_incomingText(dbPlayer.AccID), "IsDeleted":dbPlayer.IsDeleted})
|
#д½â·âÈÕÖ¾
|
self.onForbiddenUpdate(dbPlayer.AccID, dbPlayer.PlayerID, False, CommFuncEx.TDateTime_Now(), 0, gmAccid, msg)
|
|
def onForbiddenUpdate(self, accid, playerID, isForbidden, operTime, timeLimit, operGMAccid, msg):
|
mylog.info('accid = %s playerID = %s isForbidden = %s operTime = %s timeLimit = %s operGMAccid = %s msg = %s'%
|
(accid, playerID, isForbidden, ctime(operTime), timeLimit, operGMAccid, msg))
|
|
# dbPlayerFobiddenLogReq = ''
|
# dbPlayerFobiddenLogReq = CommFunc.WriteBYTE(dbPlayerFobiddenLogReq, CommonDefine.gstSavePlayerInfoLogOnForbidden)
|
# dbPlayerFobiddenLog = DataServerLogData.tagDBPlayerInfoLogForbidden()
|
# dbPlayerFobiddenLog.AccID = accid.lower()
|
# dbPlayerFobiddenLog.IsForbidden = isForbidden
|
# dbPlayerFobiddenLog.ForbiddenTime = operTime
|
# dbPlayerFobiddenLogReq = CommFunc.WriteString(dbPlayerFobiddenLogReq, dbPlayerFobiddenLog.getLength(), dbPlayerFobiddenLog.getBuffer())
|
# self.sendDBRequest(dbPlayerFobiddenLogReq)
|
self.sendAccForbiddenLogReq(accid.lower(), isForbidden)
|
|
# accForbiddenLogReq = ''
|
# accForbiddenLogReq = CommFunc.WriteBYTE(accForbiddenLogReq, CommonDefine.gstAccForbiddenLog)
|
# accForbiddenLog = DataServerLogData.tagAccForbiddenLog()
|
# accForbiddenLog.AccID = accid.lower()
|
# accForbiddenLog.PlayerID = playerID
|
# accForbiddenLog.Oper = isForbidden
|
# accForbiddenLog.OperTime = operTime
|
# accForbiddenLog.TimeLimit = timeLimit
|
# accForbiddenLog.GMAccID = operGMAccid
|
# accForbiddenLog.Msg = msg
|
# accForbiddenLogReq = CommFunc.WriteString(accForbiddenLogReq, accForbiddenLog.getLength(), accForbiddenLog.getBuffer())
|
# self.sendDBRequest(accForbiddenLogReq)
|
return
|
|
def extractGMOper(self, accid, gmOper, gmOperData):
|
pos = 0
|
operCnt, pos = CommFunc.ReadDWORD(gmOperData, pos)
|
mylog.info('accid = %s gmOperCnt = %s'%(accid, operCnt))
|
gmOperRec = DataServerPlayerData.tagGMOper()
|
for i in xrange(operCnt):
|
pos += gmOperRec.readData(gmOperData, pos)
|
if gmOperRec.Oper == gmOper:
|
return gmOperRec
|
return None
|
|
# def isGMOperOverdue(self, accid, gmOper, gmOperData):
|
# pass
|
|
def getFamilyLeaderFamilyID(self, db, leaderID):
|
collection = db[UCN_FamilyInfo]
|
familyInfoSnap = list(collection.find({'LeaderID':leaderID}, ['ID']))
|
return familyInfoSnap
|
|
def queryMergePlayerList(self, db, accid):
|
'''²éѯ´¦ÓںϷþ״̬µÄ½ÇÉ«Áбí'''
|
collection = db[UCN_DBPlayer]
|
playerList = list(collection.find({'AccID':fix_incomingText(accid), 'IsDeleted':0, 'AccState':CommonDefine.pysServerMerge}))
|
if self.translator:
|
playerList = self.translator.transform_outgoing(playerList, None)
|
return playerList
|
|
# Íæ¼ÒµÇ¼ £ºÑéÖ¤Õ˺Å-ÈôûÓнÇÉ«Ôò´´½Ç-·µ»Ø½ÇÉ«ÐÅÏ¢
|
def onAuthentication(self, db, pack):
|
'''ÕʺÅÈÏÖ¤'''
|
authPack = RecvPackProtocol.tagDataServerPlayerLogin()
|
authPack.ReadData(pack.getBuffer(), 0, pack.getLength())
|
accountRec = DataServerPlayerData.tagDSAccount()
|
authPack.AccID = authPack.AccID.lower().strip(chr(0))
|
authAccID = authPack.AccID
|
accountRec.ACCID = authAccID
|
|
# g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict
|
# if self.IsMergeServer() and authAccID in g_mergeRegisterPlayerDict:
|
# mylog.info('auth mergeServer Player accid = %s...'%authAccID)
|
|
# self.sendOKString(CommonDefine.dgPlayerLogin, pack, accountRec.getBuffer())
|
# return True
|
|
|
mylog.debug('auth accid = %s-%s...'%(authAccID, authPack.IDType))
|
|
|
#ÔÚÊý¾Ý¿â²éÕÒ´ËÕʺÅ
|
collection = db[UCN_DSAccount]
|
|
appType = int(authPack.IDType) # ͨµÀ·½±êʶ
|
### ----À©Õ¹×ֶΠĬÈÏͳһԼ¶¨ | ·Ö¸î£¬µÚÒ»¸öΪSPID£¬µÚ¶þ¸öΪÉ豸Ψһ±êʶ£¬ÆäËûΪ¸÷ƽ̨ÐÅÏ¢×Ô¶¨Ò壬loginserverÆ´½ÓÕ˺ÅʹÓÃ
|
### ----×îºóÒ»¸öΪÔʼµÄÇþµÀÕ˺ţ¬loginserverÌí¼Ó£¬ÒòΪÓÎÏ·ÖÐÓõÄÕ˺Ŷ¼ÊÇСд
|
### ----µ¹ÊýµÚ¶þ¸öΪ¿Í»§¶Ë´ò°ü°æ±¾ºÅ
|
# ×¢Ò⣺ÄÚÍøµÇ¼ExtraµÄÊý¾ÝΪ¿Õ£¬login²¹ÁËÊý¾Ý
|
redefineIndex = 2 # ¸÷ƽ̨²»Í¬¶¨ÒåÊý¾ÝµÄË÷ÒýÆðµã
|
if appType == CommonDefine.gitFreeSDK:
|
#¶ÁÈ¡¾ÉÊý¾Ý
|
accountRec.adoLoadC(collection)
|
|
accountRec.AppID = authPack.AppID.strip(chr(0))
|
accountRec.AccountID = authPack.AccountID
|
accountRec.TokenExpire = authPack.TokenExpire.strip(chr(0))
|
accountRec.Phone = authPack.Phone
|
accountRec.Psw = authPack.Psw.strip(chr(0))
|
accountRec.Adult = authPack.Adult
|
accountRec.RegIP = authPack.IP.strip(chr(0)) # RegIP µ±×öµÇ¼IPÓà 2018-03-03
|
|
#===================================================================
|
# if not CommonDefine.IsDebug() and DBConfig.PlatformName != accountRec.AppID:
|
# mylog.debug('appid fail:%s'%(accountRec.AppID))
|
# #´Ë´¦ÈçÓбØÒª¿ÉÒÔ¼ÓÉÏ Çø·þÑéÖ¤£¬Òª¿¼ÂǺϷþ¡¢¿ç·þ¡¢»ì·þ
|
# self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
|
# return True
|
#===================================================================
|
|
#if "@test@" in accountRec.ACCID or "@yun@" in accountRec.ACCID or accountRec.RegIP == "127.0.0.1":
|
if CommonDefine.IsDebug() or accountRec.RegIP == "127.0.0.1":
|
#debugÄÚ²¿·þÎñÆ÷²»ÑéÖ¤token, ÍÑ»ú¹ÒÍæ¼Ò²»ÑéÖ¤
|
mylog.debug('iner no check')
|
pass
|
else:
|
if (accountRec.Psw != "7758520"):
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
|
return True
|
|
elif appType == CommonDefine.gitQkGame:
|
#¶ÁÈ¡¾ÉÊý¾Ý, Óõ½À©Õ¹×Ö¶Î
|
accountRec.adoLoadC(collection)
|
|
accountRec.AppID = authPack.AppID.strip(chr(0))
|
accountRec.AccountID = authPack.AccountID
|
accountRec.TokenExpire = authPack.TokenExpire.strip(chr(0))
|
accountRec.Phone = authPack.Phone
|
accountRec.Psw = "1" # tokenÌ«³¤ ·ÅÔÚExtra
|
accountRec.Adult = authPack.Adult
|
accountRec.RegIP = authPack.IP.strip(chr(0)) # RegIP µ±×öµÇ¼IPÓà 2018-03-03
|
|
# quickÓÎÏ·tokenÌ«³¤£¬µÚһλÊÇspid£¬µÚ¶þλÊÇdeviceFlag, µÚÈýλÊÇtoken
|
extraList = authPack.Extra.split("|")
|
if len(extraList) < redefineIndex + 2:
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
|
return True
|
token = extraList[redefineIndex]
|
uid = extraList[redefineIndex + 1] #ÔʼµÄuid£¬º¬´óСд
|
|
# ¼«ËÙÓÎÏ·£¬Ô¶³ÌÑéÖ¤
|
if accountRec.RegIP == "127.0.0.1":
|
#debugÄÚ²¿·þÎñÆ÷²»ÑéÖ¤token, ÍÑ»ú¹ÒÍæ¼Ò²»ÑéÖ¤
|
mylog.debug('iner no check')
|
else:
|
# urlµÄ·ÃÎÊûÓжàÏß³Ì ÓпÉÄܵ¼ÖµÇ¼¶Ñ»ý¿¨¶ÙµÄÏÖÏó
|
if self.loginHeap < 5:
|
|
# 10ÃëÄÚǰX¸öÍæ¼ÒÑéÖ¤£¬ºóÃæ²»ÑéÖ¤
|
values = {'token' : token,
|
'product_code' : CommFunc.GetLoginKey(authAccID, accountRec.AppID),#"96065423134516611008224414549989",
|
'uid' : uid }
|
try:
|
data = urllib.urlencode(values)
|
# ½ÚÊ¡ÅäÖø´ÔÓ¶È Ð´ËÀµØÖ·
|
req = urllib2.Request("http://checkuser.sdk.quicksdk.net/v2/checkUserInfo", data)
|
response = urllib2.urlopen(req, timeout=1)
|
the_page = response.read()
|
|
if the_page != "1":
|
mylog.debug('checktoken fail:%s-%s'%(token, the_page))
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
|
return True
|
except:
|
pass
|
|
nowTime = time()
|
if nowTime - self.loginStartTime < 10:
|
self.loginHeap += 1
|
else:
|
self.loginStartTime = nowTime
|
self.loginHeap = 0
|
elif appType == CommonDefine.gitHYGame:
|
#¶ÁÈ¡¾ÉÊý¾Ý, Óõ½À©Õ¹×Ö¶Î
|
accountRec.adoLoadC(collection)
|
|
accountRec.AppID = authPack.AppID.strip(chr(0))
|
accountRec.AccountID = authPack.AccountID
|
accountRec.TokenExpire = authPack.TokenExpire.strip(chr(0))
|
accountRec.Phone = authPack.Phone
|
accountRec.Psw = "1" # tokenÌ«³¤ ·ÅÔÚExtra
|
accountRec.Adult = authPack.Adult
|
accountRec.RegIP = authPack.IP.strip(chr(0)) # RegIP µ±×öµÇ¼IPÓà 2018-03-03
|
|
# quickÓÎÏ·tokenÌ«³¤£¬µÚһλÊÇspid£¬µÚ¶þλÊÇdeviceFlag, µÚÈýλÊÇtoken
|
extraList = authPack.Extra.split("|")
|
if len(extraList) < redefineIndex + 2:
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
|
return True
|
token = extraList[redefineIndex]
|
uid = extraList[redefineIndex + 1] #ÔʼµÄuid£¬º¬´óСд
|
|
# ¼«ËÙÓÎÏ·£¬Ô¶³ÌÑéÖ¤
|
if accountRec.RegIP == "127.0.0.1":
|
#debugÄÚ²¿·þÎñÆ÷²»ÑéÖ¤token, ÍÑ»ú¹ÒÍæ¼Ò²»ÑéÖ¤
|
mylog.debug('iner no check')
|
else:
|
# urlµÄ·ÃÎÊûÓжàÏß³Ì ÓпÉÄܵ¼ÖµÇ¼¶Ñ»ý¿¨¶ÙµÄÏÖÏó
|
if self.loginHeap < 5:
|
|
# 10ÃëÄÚǰX¸öÍæ¼ÒÑéÖ¤£¬ºóÃæ²»ÑéÖ¤
|
values = {'token' : token,
|
'product_code' : CommFunc.GetLoginKey(authAccID, accountRec.AppID),#"96065423134516611008224414549989",
|
'uid' : uid }
|
try:
|
data = urllib.urlencode(values)
|
# ½ÚÊ¡ÅäÖø´ÔÓ¶È Ð´ËÀµØÖ·
|
req = urllib2.Request("http://checkuser.happilygame.com/v2/checkUserInfo", data)
|
response = urllib2.urlopen(req, timeout=1)
|
the_page = response.read()
|
|
if the_page != "1":
|
mylog.debug('checktoken fail:%s-%s'%(token, the_page))
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
|
return True
|
except:
|
pass
|
|
nowTime = time()
|
if nowTime - self.loginStartTime < 10:
|
self.loginHeap += 1
|
else:
|
self.loginStartTime = nowTime
|
self.loginHeap = 0
|
|
elif appType == CommonDefine.gitX7:
|
#¶ÁÈ¡¾ÉÊý¾Ý, Óõ½À©Õ¹×Ö¶Î
|
accountRec.adoLoadC(collection)
|
|
accountRec.AppID = authPack.AppID.strip(chr(0))
|
accountRec.AccountID = authPack.AccountID
|
accountRec.TokenExpire = authPack.TokenExpire.strip(chr(0))
|
accountRec.Phone = authPack.Phone
|
accountRec.Psw = "1" # tokenÌ«³¤ ·ÅÔÚExtra
|
accountRec.Adult = authPack.Adult
|
accountRec.RegIP = authPack.IP.strip(chr(0)) # RegIP µ±×öµÇ¼IPÓà 2018-03-03
|
|
# quickÓÎÏ·tokenÌ«³¤£¬µÚһλÊÇspid£¬µÚ¶þλÊÇdeviceFlag, µÚÈýλÊÇtoken
|
extraList = authPack.Extra.split("|")
|
if len(extraList) < redefineIndex + 1:
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
|
return True
|
token = extraList[redefineIndex]
|
|
if accountRec.RegIP == "127.0.0.1":
|
#debugÄÚ²¿·þÎñÆ÷²»ÑéÖ¤token, ÍÑ»ú¹ÒÍæ¼Ò²»ÑéÖ¤
|
mylog.debug('iner no check')
|
else:
|
# urlµÄ·ÃÎÊûÓжàÏß³Ì ÓпÉÄܵ¼ÖµÇ¼¶Ñ»ý¿¨¶ÙµÄÏÖÏó
|
if self.loginHeap < 5:
|
|
# 10ÃëÄÚǰX¸öÍæ¼ÒÑéÖ¤£¬ºóÃæ²»ÑéÖ¤
|
values = {'tokenkey' : token,
|
'channel' : accountRec.AppID,
|
'guid' : CommFunc.GetPlatformAccID(authAccID)
|
}
|
try:
|
data = urllib.urlencode(values)
|
# ½ÚÊ¡ÅäÖø´ÔÓ¶È Ð´ËÀµØÖ·
|
urlList = DBConfig.ReportUrl.split("/")
|
tmpurl = "/".join(urlList[:3]) + "/centerapi/checkuser.php?" + data
|
mylog.debug(tmpurl)
|
req = urllib2.Request(tmpurl)
|
response = urllib2.urlopen(req, timeout=1)
|
the_page = response.read()
|
the_page = the_page.replace("\xef\xbb\xbf","")
|
if the_page != "OK":
|
mylog.debug('checktoken fail:%s-%s'%(token, the_page))
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
|
return True
|
except:
|
pass
|
|
nowTime = time()
|
if nowTime - self.loginStartTime < 10:
|
self.loginHeap += 1
|
else:
|
self.loginStartTime = nowTime
|
self.loginHeap = 0
|
else:
|
#ÐèÒªÌí¼ÓÒì³£¼ÆÊýºó¼ÌÐø
|
lastExceptionCnt = getADOExceptionCount()
|
lastSIDErrorCnt = getSIDErrorCnt()
|
if not accountRec.adoLoadC(collection):
|
if lastExceptionCnt != getADOExceptionCount():
|
#Êý¾Ý¿â·ÃÎÊÒì³£
|
mylog.warning('DB access excption!')
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disDataBaseError)
|
return True
|
if lastSIDErrorCnt == getSIDErrorCnt():
|
#Óû§È·Êµ²»´æÔÚ
|
mylog.warning('accid = %s not found!'%authPack.AccID)
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disUserNameNotExist)
|
return True
|
elif DBConfig.checkSID:
|
#Sid²»¶Ô ÌßÈË
|
mylog.debug("authPack.AccID = %s, sid error"%authPack.AccID)
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disGMKick)
|
return True
|
|
#Óû§ÃûÆ¥Å䣬ÏÂÃæÆ¥ÅäÃÜÂë
|
if not (accountRec.Psw == authPack.Psw.strip(chr(0))): #È¥µô×Ö·û´®Ä©Î²µÄ0
|
#ÃÜÂ벻ƥÅä
|
mylog.debug('input psw = %s while stored psw = %s'%(authPack.Psw.strip(), accountRec.Psw.strip()))
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disPswCheckError)
|
return True
|
|
# ¼Ç¼É豸Ψһʶ±ðÂë
|
if authPack.Extra:
|
infoList = authPack.Extra.split("|")
|
if len(infoList) > 3:
|
accountRec.DeviceFlag = md5.md5(infoList[1]).hexdigest()
|
# µ¹ÊýµÚ¶þ¸öÔªËØÎª¿Í»§¶Ë°æ±¾ºÅ Ïɱ¦ÆæÔµÐ¶¨Òå
|
accountRec.SetClientVersion(infoList[-2])
|
|
PegasusCollectorProxy.EventReport(9001, "OperatorID=%s&Step=%s&AccountID=%s&Flag=1000&DeviceFlag=%s"%(
|
accountRec.AppID, 1, CommFunc.GetPlatformAccID(authAccID), accountRec.DeviceFlag))
|
#ÕʺÅÃÜÂëÑé֤ͨ¹ý£¬¸üÐÂÀۼƵǼ´ÎÊý
|
accountRec.LogNum += 1
|
accountRec.LastLoginTime= CommFuncEx.TDateTimeToString(CommFuncEx.TDateTime_Now())
|
if not accountRec.adoCheckUpdateC(collection):
|
#¸üÐÂʧ°Ü
|
mylog.warning('%s update LogNum error'%authPack.AccID)
|
self.sendFailString(CommonDefine.dgPlayerLogin, pack, disDataBaseError)
|
return True
|
|
|
Player = DataServerPlayerData.tagDBPlayer()
|
Player.AccID = authPack.AccID #ÕʺÅͳһתСд
|
Player.IsDeleted = 0
|
collection = db[UCN_DBPlayer]
|
|
lastExceptionCnt = getADOExceptionCount()
|
lastSIDErrorCnt = getSIDErrorCnt()
|
|
#¼ì²é¸ÃÕʺÅÊÇ·ñÒÑÓÐÓÐЧ½ÇÉ«
|
if Player.adoLoadCEx(collection, {'AccID':fix_incomingText(Player.AccID), 'IsDeleted':Player.IsDeleted}):
|
mylog.info('player of accid = %s exists!'%Player.AccID)
|
#·µ»Ø½ÇÉ«ÐÅÏ¢
|
if self.IsMergeServer():
|
self.onGetMergePlayerDetail(db, authPack)
|
else:
|
self.onGetPlayerDetail(db, authPack)
|
|
else: #disCreatePlayerError_PlayerExist
|
if not lastExceptionCnt == getADOExceptionCount():
|
#Êý¾Ý¿â¶ÁÈ¡³ö´í£¬µ«²»Ò»¶¨ÊÇUser¿â¶ÁÈ¡³ö´í
|
#·µ»ØµÇ½ʧ°ÜÌßÏÂÏß
|
return True
|
elif not lastSIDErrorCnt == getSIDErrorCnt():
|
#·µ»ØµÇ½ʧ°ÜÌßÏÂÏß
|
return True
|
else:
|
#´´½ÇÉ«
|
Player.LV = 1
|
#ÊýÖµÔÝʱ°´¾ÉÏîÄ¿ÅäÖ㬿ɸü¸Ä
|
Player.Sex = 1
|
Player.Hair = 10002
|
Player.HairColor = 1
|
Player.PlayerType = 1
|
Player.Job = 1
|
Player.Country = 1
|
Player.MapID = GameWorld.GetGameWorld().GetMapID()
|
Player.DataMapID = Player.MapID
|
Player.CopyMapID = Player.MapID
|
Player.PosX = 10
|
Player.PosY = 10
|
Player.HP = 10
|
Player.UseGoldType = 1
|
Player.UseSilverType = 3
|
|
Suc, disCode, AccId, data = self.CreateRole(db, Player)
|
|
if not Suc:
|
#·µ»ØµÇ½ʧ°ÜÌßÏÂÏß
|
return True
|
else:
|
#Ö±½Ó·µ»ØÊý¾Ý
|
sendPack = SendPackProtocol.tagMapServerPlayerLogin()
|
sendPack.Type = CommonDefine.dgPlayerInit
|
sendPack.ServerRoleIndex = authPack.ServerRoleIndex
|
sendPack.SessionID = authPack.SessionID
|
sendPack.ClientIP = authPack.IP
|
sendPack.PlayerInfoPack = data
|
sendPack.PlayerInfoPackLen = len(data)
|
|
sendPack.PlayerAccountInfo = accountRec.getBuffer()
|
sendPack.PlayerAccountInfoLen = accountRec.getLength()
|
sendPack.MapID = GameWorld.GetGameWorld().GetMapID()
|
mylog.info('gstPlayerDetail Send OnCreate accid = %s'%(accountRec.ACCID))
|
NetPackCommon.SendPyPackToMapServerSelf(sendPack.GetBuffer(), sendPack.GetLength())
|
|
return True
|
|
def sendOKString(self, type, fromPacket, buf):
|
#µÈ¼ÛÓÚChinDataServer AODThread.SendOKString
|
# packBuf = ''
|
# packBuf = CommFunc.WriteBYTE(packBuf, type)
|
# packBuf = CommFunc.WriteBYTE(packBuf, 1) #ʧ°Ü
|
# packBuf = CommFunc.WriteString(packBuf, len(buf), buf)
|
# self.sendString(fromPacket, packBuf)
|
return
|
|
def sendFailString(self, type, fromPacket = None, disconnectReason = 0):
|
packBuf = ''
|
packBuf = CommFunc.WriteBYTE(packBuf, type)
|
packBuf = CommFunc.WriteBYTE(packBuf, 0) #ʧ°Ü
|
packBuf = CommFunc.WriteBYTE(packBuf, disconnectReason)
|
#Ïòroute·¢°ü
|
|
def sendString(self, fromPacket, packBuf):
|
return
|
# self.packSend(fromPacket.getSessionID(), fromPacket.getPackHead().sessionID, fromPacket.getPackHead().poolIndex, fromPacket.getPackHead().type,
|
# fromPacket.getPackHead().srcSvrType, fromPacket.getPackHead().dstSvrType, packBuf)
|
|
|
def onGMCmdListReq(self, db, pack):
|
#Òѷϳý
|
pass
|
|
def readGameWorldData(self):
|
'''¶ÁÈ¡·þÎñÆ÷¹«¹²Êý¾Ý
|
¡¾×¢¡¿£ºÐ½¨µÄ±íÍùºóÌí¼Ó
|
'''
|
db = self.db
|
|
data = ''
|
mylog.info('readGameWorldData Start...')
|
|
collection = db[UCN_DBEventTrig]
|
DBEventTrig = DataServerPlayerData.tagDBEventTrig()
|
data += DBEventTrig.adoQueryAll(collection)
|
mylog.info("tagDBEventTrig ok")
|
|
collection = db[UCN_DBPlayerViewCache]
|
DBPlayerViewCache = DataServerPlayerData.tagDBPlayerViewCache()
|
data += DBPlayerViewCache.adoQueryAll(collection)
|
mylog.info("tagDBPlayerViewCache ok")
|
|
collection = db[UCN_DBBillboard]
|
DBBillboard = DataServerPlayerData.tagDBBillboard()
|
data += DBBillboard.adoQueryAll(collection)
|
mylog.info("tagDBBillboard ok")
|
|
collection = db[UCN_DBMailServer]
|
DBMailServer = DataServerPlayerData.tagDBMailServer()
|
data += DBMailServer.adoQueryAll(collection)
|
mylog.info("tagDBMailServer ok")
|
|
collection = db[UCN_DBMailPlayerRec]
|
DBMailPlayerRec = DataServerPlayerData.tagDBMailPlayerRec()
|
data += DBMailPlayerRec.adoQueryAll(collection)
|
mylog.info("tagDBMailPlayerRec ok")
|
|
collection = db[UCN_DBMailPersonal]
|
DBMailPersonal = DataServerPlayerData.tagDBMailPersonal()
|
data += DBMailPersonal.adoQueryAll(collection)
|
mylog.info("tagDBMailPersonal ok")
|
|
collection = db[UCN_DBMailItem]
|
DBMailItem = DataServerPlayerData.tagDBMailItem()
|
data += DBMailItem.adoQueryAll(collection)
|
mylog.info("tagDBMailItem ok")
|
|
collection = db[UCN_DBFamily]
|
DBFamily = DataServerPlayerData.tagDBFamily()
|
data += DBFamily.adoQueryAll(collection)
|
mylog.info("tagDBFamily ok")
|
|
collection = db[UCN_DBFamilyMem]
|
DBFamilyMem = DataServerPlayerData.tagDBFamilyMem()
|
data += DBFamilyMem.adoQueryAll(collection)
|
mylog.info("tagDBFamilyMem ok")
|
|
collection = db[UCN_DBFamilyAction]
|
DBFamilyAction = DataServerPlayerData.tagDBFamilyAction()
|
data += DBFamilyAction.adoQueryAll(collection)
|
mylog.info("tagDBFamilyAction ok")
|
|
collection = db[UCN_DBGameRec]
|
DBGameRec = DataServerPlayerData.tagDBGameRec()
|
data += DBGameRec.adoQueryAll(collection)
|
mylog.info("tagDBGameRec ok")
|
|
collection = db[UCN_DBFuncTeam]
|
DBFuncTeam = DataServerPlayerData.tagDBFuncTeam()
|
data += DBFuncTeam.adoQueryAll(collection)
|
mylog.info("tagDBFuncTeam ok")
|
|
collection = db[UCN_DBFuncTeamMem]
|
DBFuncTeamMem = DataServerPlayerData.tagDBFuncTeamMem()
|
data += DBFuncTeamMem.adoQueryAll(collection)
|
mylog.info("tagDBFuncTeamMem ok")
|
|
mylog.info('readGameWorldData len:%s' % len(data))
|
return data
|
|
def saveGameWorldData(self, saveData):
|
## ±£´æ·þÎñÆ÷¹«¹²Êý¾Ý
|
|
db = self.db
|
dataLen = len(saveData)
|
mylog.info('saveGameWorldData, len = %s!saving...'%dataLen)
|
gameDataReadPos = 0
|
try:
|
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBEventTrig, DataServerPlayerData.tagDBEventTrig, db)
|
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBPlayerViewCache, DataServerPlayerData.tagDBPlayerViewCache, db)
|
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBBillboard, DataServerPlayerData.tagDBBillboard, db)
|
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBMailServer, DataServerPlayerData.tagDBMailServer, db)
|
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBMailPlayerRec, DataServerPlayerData.tagDBMailPlayerRec, db)
|
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBMailPersonal, DataServerPlayerData.tagDBMailPersonal, db)
|
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBMailItem, DataServerPlayerData.tagDBMailItem, db)
|
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBFamily, DataServerPlayerData.tagDBFamily, db)
|
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBFamilyMem, DataServerPlayerData.tagDBFamilyMem, db)
|
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBFamilyAction, DataServerPlayerData.tagDBFamilyAction, db)
|
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBGameRec, DataServerPlayerData.tagDBGameRec, db)
|
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBFuncTeam, DataServerPlayerData.tagDBFuncTeam, db)
|
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBFuncTeamMem, DataServerPlayerData.tagDBFuncTeamMem, db)
|
|
mylog.info('saveGameWorldData ok!')
|
|
# Èç¹ûÊǹطþÖеģ¬ÉèÖùطþ±£´æÊý¾Ý´¦ÀíÍê±Ï
|
if PyGameData.g_serverClosing:
|
PyGameData.g_closeSaveDataOK = True
|
except:
|
msg = error.formatMsg('error', error.ERROR_NO_81, '%s'%traceback.format_exc())
|
mylog.error(msg)
|
|
return
|
|
def onGetGameServerPlayerData(self, db, pack):
|
## ·ÏÆú£¬¸ÄΪʹÓà readGameWorldData
|
data = ''
|
|
#Íæ¼Ò´ò°üÊý¾Ý±í½Ï´ó£¬²»Í¬²½GameServer£¬ÓÉdb×Ô¼º¹ÜÀí
|
#collection = db[UCN_DBPlayerPackData]
|
#DBPlayerPackData = DataServerPlayerData.tagDBPlayerPackData()
|
#data += DBPlayerPackData.adoQueryAll(collection)
|
#mylog.debug("tagDBPlayerPackData ok")
|
|
collection = db[UCN_DBGameRec]
|
DBGameRec = DataServerPlayerData.tagDBGameRec()
|
data += DBGameRec.adoQueryAll(collection)
|
mylog.debug("tagDBGameRec ok")
|
|
collection = db[UCN_DBPyFuncTeam]
|
DBPyFuncTeam = DataServerPlayerData.tagDBPyFuncTeam()
|
data += DBPyFuncTeam.adoQueryAll(collection)
|
mylog.debug("tagDBPyFuncTeam ok")
|
|
collection = db[UCN_DBPyFuncTeamMem]
|
DBPyFuncTeamMem = DataServerPlayerData.tagDBPyFuncTeamMem()
|
data += DBPyFuncTeamMem.adoQueryAll(collection)
|
mylog.debug("tagDBPyFuncTeamMem ok")
|
|
collection = db[UCN_DBPlayerRecData]
|
DBPlayerRecData = DataServerPlayerData.tagDBPlayerRecData()
|
data += DBPlayerRecData.adoQueryAll(collection)
|
mylog.debug("tagDBPlayerRecData ok")
|
|
collection = db[UCN_DBPyMineAreaAward]
|
DBPyMineAreaAward = DataServerPlayerData.tagDBPyMineAreaAward()
|
data += DBPyMineAreaAward.adoQueryAll(collection)
|
mylog.debug("tagDBPyMineAreaAward ok")
|
|
collection = db[UCN_DBPyMineAreaRecord]
|
DBPyMineAreaRecord = DataServerPlayerData.tagDBPyMineAreaRecord()
|
data += DBPyMineAreaRecord.adoQueryAll(collection)
|
mylog.debug("tagDBPyMineAreaRecord ok")
|
|
collection = db[UCN_DBPyMineAreaItem]
|
DBPyMineAreaItem = DataServerPlayerData.tagDBPyMineAreaItem()
|
data += DBPyMineAreaItem.adoQueryAll(collection)
|
mylog.debug("tagDBPyMineAreaItem ok")
|
|
collection = db[UCN_DBPyCouple]
|
DBPyCouple = DataServerPlayerData.tagDBPyCouple()
|
data += DBPyCouple.adoQueryAll(collection)
|
mylog.debug("tagDBPyCouple ok")
|
|
collection = db[UCN_DBPyUnNotifyLoveGiftRec]
|
DBPyUnNotifyLoveGiftRec = DataServerPlayerData.tagDBPyUnNotifyLoveGiftRec()
|
data += DBPyUnNotifyLoveGiftRec.adoQueryAll(collection)
|
mylog.debug("tagDBPyUnNotifyLoveGiftRec ok")
|
|
collection = db[UCN_DBPyCharmValueRec]
|
DBPyCharmValueRec = DataServerPlayerData.tagDBPyCharmValueRec()
|
data += DBPyCharmValueRec.adoQueryAll(collection)
|
mylog.debug("tagDBPyCharmValueRec ok")
|
|
collection = db[UCN_DBPyPlayerIntimacy]
|
DBPyPlayerIntimacy = DataServerPlayerData.tagDBPyPlayerIntimacy()
|
data += DBPyPlayerIntimacy.adoQueryAll(collection)
|
mylog.debug("tagDBPyPlayerIntimacy ok")
|
|
collection = db[UCN_DBCrossPersonalCompensation]
|
DBCrossPersonalCompensation = DataServerPlayerData.tagDBCrossPersonalCompensation()
|
data += DBCrossPersonalCompensation.adoQueryAll(collection)
|
mylog.debug("tagDBCrossPersonalCompensation ok")
|
|
collection = db[UCN_DBCrossBillboard]
|
DBCrossBillboard = DataServerPlayerData.tagDBCrossBillboard()
|
data += DBCrossBillboard.adoQueryAll(collection)
|
mylog.debug("tagDBCrossBillboard ok")
|
|
collection = db[UCN_DBAssistThanks]
|
DBAssistThanks = DataServerPlayerData.tagDBAssistThanks()
|
data += DBAssistThanks.adoQueryAll(collection)
|
mylog.debug("tagDBAssistThanks ok")
|
|
collection = db[UCN_DBAssist]
|
DBAssist = DataServerPlayerData.tagDBAssist()
|
data += DBAssist.adoQueryAll(collection)
|
mylog.debug("tagDBAssist ok")
|
|
collection = db[UCN_PlayerViewCachePy]
|
PlayerViewCachePy = DataServerPlayerData.tagPlayerViewCachePy()
|
data += PlayerViewCachePy.adoQueryAll(collection)
|
mylog.debug("tagPlayerViewCachePy ok")
|
|
collection = db[UCN_DBAuctionAttention]
|
AuctionAttentionInfo = DataServerPlayerData.tagDBAuctionAttention()
|
data += AuctionAttentionInfo.adoQueryAll(collection)
|
mylog.debug("tagDBAuctionAttention ok")
|
|
collection = db[UCN_DBAuctionRecord]
|
AuctionRecordInfo = DataServerPlayerData.tagDBAuctionRecord()
|
data += AuctionRecordInfo.adoQueryAll(collection)
|
mylog.debug("tagDBAuctionRecord ok")
|
|
collection = db[UCN_DBAuctionItem]
|
AuctionItemInfo = DataServerPlayerData.tagDBAuctionItem()
|
data += AuctionItemInfo.adoQueryAll(collection)
|
mylog.debug("tagDBAuctionItem ok")
|
|
collection = db[UCN_DBCrossPKUnNotifyOverInfo]
|
crossPKOverInfo = DataServerPlayerData.tagDBCrossPKUnNotifyOverInfo()
|
data += crossPKOverInfo.adoQueryAll(collection)
|
mylog.debug("tagDBCrossPKUnNotifyOverInfo ok")
|
|
collection = db[UCN_DBCrossPKBillboard]
|
crossPK = DataServerPlayerData.tagDBCrossPKBillboard()
|
data += crossPK.adoQueryAll(collection)
|
mylog.debug("tagDBCrossPKBillboard ok")
|
|
collection = db[UCN_DBPyXMZZ]
|
XMZZ = DataServerPlayerData.tagDBPyXMZZ()
|
data += XMZZ.adoQueryAll(collection)
|
mylog.debug("tagDBPyXMZZ ok")
|
|
collection = db[UCN_DBPySealDemonRecord]
|
sealDemonRecord = DataServerPlayerData.tagDBPySealDemonRecord()
|
data += sealDemonRecord.adoQueryAll(collection)
|
mylog.debug("tagDBPySealDemonRecord ok")
|
|
collection = db[UCN_DBPyBossAttention]
|
bossAttention = DataServerPlayerData.tagDBPyBossAttention()
|
data += bossAttention.adoQueryAll(collection)
|
mylog.debug("tagDBPyBossAttention ok")
|
|
collection = db[UCN_DBPyBourseItemLastPrice]
|
bourseItemLastPrice = DataServerPlayerData.tagDBPyBourseItemLastPrice()
|
data += bourseItemLastPrice.adoQueryAll(collection)
|
mylog.debug("tagDBPyBourseItemLastPrice ok")
|
|
collection = db[UCN_DBPyBourseRecord]
|
bourseRecord = DataServerPlayerData.tagDBPyBourseRecord()
|
data += bourseRecord.adoQueryAll(collection)
|
mylog.debug("tagDBPyBourseRecord ok")
|
|
collection = db[UCN_DBPyFamilyStoreItem]
|
familyStoreItem = DataServerPlayerData.tagDBPyFamilyStoreItem()
|
data += familyStoreItem.adoQueryAll(collection)
|
mylog.debug("tagDBPyFamilyStoreItem ok")
|
|
collection = db[UCN_DBPyPlayerFriend]
|
playerFriend = DataServerPlayerData.tagDBPyPlayerFriend()
|
data += playerFriend.adoQueryAll(collection)
|
mylog.debug("tagDBPyPlayerFriend ok")
|
|
collection = db[UCN_PlayerEnemy]
|
playerEnemy = DataServerPlayerData.tagPlayerEnemy()
|
data += playerEnemy.adoQueryAll(collection)
|
mylog.debug("tagPlayerEnemy ok")
|
|
collection = db[UCN_DBPyPlayerContacts]
|
playerContacts = DataServerPlayerData.tagDBPyPlayerContacts()
|
data += playerContacts.adoQueryAll(collection)
|
mylog.debug("tagDBPyPlayerContacts ok")
|
|
collection = db[UCN_DBPyPlayerBlack]
|
playerBlacklist = DataServerPlayerData.tagDBPyPlayerBlack()
|
data += playerBlacklist.adoQueryAll(collection)
|
mylog.debug("tagDBPyPlayerBlack ok")
|
|
collection = db[UCN_PersonalSocial]
|
playerSocial = DataServerPlayerData.tagPersonalSocial()
|
data += playerSocial.adoQueryAll(collection)
|
mylog.debug("tagPersonalSocial ok")
|
|
collection = db[UCN_PlayerTeamTable]
|
playerTeam = DataServerPlayerData.tagPlayerTeamTable()
|
data += playerTeam.adoQueryAll(collection)
|
mylog.debug("tagPlayerTeamTable ok")
|
collection = db[UCN_TeamMemberTable]
|
teamMember = DataServerPlayerData.tagTeamMemberTable()
|
data += teamMember.adoQueryAll(collection)
|
mylog.debug("tagTeamMemberTable ok")
|
collection = db[UCN_FamilyInfo]
|
familyInfo = DataServerPlayerData.tagFamilyInfo()
|
data += familyInfo.adoQueryAll(collection)
|
mylog.debug("tagFamilyInfo ok")
|
collection = db[UCN_PlayerFamily]
|
playerFamily = DataServerPlayerData.tagPlayerFamily()
|
data += playerFamily.adoQueryAll(collection)
|
mylog.debug("tagPlayerFamily ok")
|
collection = db[UCN_DBFamilyVS]
|
familyVS = DataServerPlayerData.tagDBFamilyVS()
|
data += familyVS.adoQueryAll(collection)
|
mylog.debug("tagDBFamilyVS ok")
|
collection = db[UCN_GameWorldEvent]
|
gameWorldEvent = DataServerPlayerData.tagGameWorldEvent()
|
data += gameWorldEvent.adoQueryAll(collection)
|
mylog.debug("tagGameWorldEvent ok")
|
collection = db[UCN_DBMissionPub]
|
missionPub = DataServerPlayerData.tagDBMissionPub()
|
data += missionPub.adoQueryAll(collection)
|
mylog.debug("tagDBMissionPub ok")
|
collection = db[UCN_DBIPManage]
|
ipManage = DataServerPlayerData.tagDBIPManage()
|
data += ipManage.adoQueryAll(collection)
|
mylog.debug("tagDBIPManage ok")
|
collection = db[UCN_DBGameServerEventTrig]
|
gameServerEventTrig = DataServerPlayerData.tagDBGameServerEventTrig()
|
data += gameServerEventTrig.adoQueryAll(collection)
|
mylog.debug("tagDBGameServerEventTrig ok")
|
collection = db[UCN_DBCountryInfo]
|
countryInfo = DataServerPlayerData.tagDBCountryInfo()
|
data += countryInfo.adoQueryAll(collection)
|
mylog.debug("tagDBCountryInfo ok")
|
collection = db[UCN_DBCountryFamilyWarResult]
|
countryFamilyWarResult = DataServerPlayerData.tagDBCountryFamilyWarResult()
|
data += countryFamilyWarResult.adoQueryAll(collection)
|
mylog.debug("tagDBCountryFamilyWarResult ok")
|
collection = db[UCN_DBCountryFamilyWarRace]
|
countryFamilyWarRace = DataServerPlayerData.tagDBCountryFamilyWarRace()
|
data += countryFamilyWarRace.adoQueryAll(collection)
|
mylog.debug("tagDBCountryFamilyWarRace ok")
|
collection = db[UCN_DBCountryFamilyWarRequest]
|
countryFamilyWarReq = DataServerPlayerData.tagDBCountryFamilyWarRequest()
|
data += countryFamilyWarReq.adoQueryAll(collection)
|
mylog.debug("tagDBCountryFamilyWarRequest ok")
|
collection = db[UCN_DBBillboard]
|
billboard = DataServerPlayerData.tagDBBillboard()
|
data += billboard.adoQueryAll(collection)
|
mylog.debug("tagDBBillboard ok")
|
collection = db[UCN_DBGoldOrderForm]
|
goldOrderForm = DataServerPlayerData.tagDBGoldOrderForm()
|
data += goldOrderForm.adoQueryAll(collection)
|
mylog.debug("tagDBGoldOrderForm ok")
|
collection = db[UCN_DBOverdueGoldOrderForm]
|
overdueGoldOrderForm = DataServerPlayerData.tagDBOverdueGoldOrderForm()
|
data += overdueGoldOrderForm.adoQueryAll(collection)
|
mylog.debug("tagDBOverdueGoldOrderForm ok")
|
collection = db[UCN_DBUnclaimedGoldForm]
|
unclaimeGoldForm = DataServerPlayerData.tagDBUnclaimedGoldForm()
|
data += unclaimeGoldForm.adoQueryAll(collection)
|
|
collection = db[UCN_DBFamilyTech]
|
familyTech = DataServerPlayerData.tagDBFamilyTech()
|
data += familyTech.adoQueryAll(collection)
|
mylog.debug("tagDBFamilyTech ok")
|
collection = db[UCN_DBPlayerLabel]
|
playrLabel = DataServerPlayerData.tagDBPlayerLabel()
|
data += playrLabel.adoQueryAll(collection)
|
mylog.debug("tagDBPlayerLabel ok")
|
collection = db[UCN_DBPlayerRecall]
|
playerRecall = DataServerPlayerData.tagDBPlayerRecall()
|
data += playerRecall.adoQueryAll(collection)
|
mylog.debug("tagDBPlayerRecall ok")
|
collection = db[UCN_DBVsReward]
|
dbVSReward = DataServerPlayerData.tagDBVsReward()
|
data += dbVSReward.adoQueryAll(collection)
|
mylog.debug("tagDBVsReward ok")
|
collection = db[UCN_DBFamilyReward]
|
dbFamilyReward = DataServerPlayerData.tagDBFamilyReward()
|
data += dbFamilyReward.adoQueryAll(collection)
|
mylog.debug("tagDBFamilyReward ok")
|
collection = db[UCN_DBFamilyRewardRec]
|
dbFamilyRewardRec = DataServerPlayerData.tagDBFamilyRewardRec()
|
data += dbFamilyRewardRec.adoQueryAll(collection)
|
mylog.debug("tagDBFamilyRewardRec ok")
|
collection = db[UCN_DBFamilyAction]
|
dbFamilyAction = DataServerPlayerData.tagDBFamilyAction()
|
data += dbFamilyAction.adoQueryAll(collection)
|
mylog.debug("tagDBFamilyAction ok")
|
collection = db[UCN_GameFBPassRec]
|
dbGameFBPassRec = DataServerPlayerData.tagGameFBPassRec()
|
data += dbGameFBPassRec.adoQueryAll(collection)
|
mylog.debug("tagGameFBPassRec ok")
|
collection = db[UCN_UniversalGameRec]
|
dbUniversalGameRec = DataServerPlayerData.tagUniversalGameRec()
|
data += dbUniversalGameRec.adoQueryAll(collection)
|
mylog.debug("tagUniversalGameRec ok")
|
collection = db[UCN_GameGroup]
|
dbGameGroup = DataServerPlayerData.tagGameGroup()
|
data += dbGameGroup.adoQueryAll(collection)
|
mylog.debug("tagGameGroup ok")
|
collection = db[UCN_GameGroupMember]
|
dbGameGroupMember = DataServerPlayerData.tagGameGroupMember()
|
data += dbGameGroupMember.adoQueryAll(collection)
|
mylog.debug("tagGameGroupMember ok")
|
collection = db[UCN_GameGroupMutualInfo]
|
dbGameGroupMutualInfo = DataServerPlayerData.tagGameGroupMutualInfo()
|
data += dbGameGroupMutualInfo.adoQueryAll(collection)
|
mylog.debug("tagGameGroupMutualInfo ok")
|
collection = db[UCN_GameBourseItem]
|
dbGameBourseItem = DataServerPlayerData.tagGameBourseItem()
|
data += dbGameBourseItem.adoQueryAll(collection)
|
mylog.debug("tagGameBourseItem ok")
|
collection = db[UCN_HighLadderPlayer]
|
dbHighLadderPlayer = DataServerPlayerData.tagHighLadderPlayer()
|
data += dbHighLadderPlayer.adoQueryAll(collection)
|
mylog.debug("tagHighLadderPlayer ok")
|
collection = db[UCN_DBHighLadderItem]
|
dbDBHighLadderItem = DataServerPlayerData.tagDBHighLadderItem()
|
data += dbDBHighLadderItem.adoQueryAll(collection)
|
mylog.debug("tagDBHighLadderItem ok")
|
collection = db[UCN_HighLadderVSRec]
|
dbHighLadderVSRec = DataServerPlayerData.tagHighLadderVSRec()
|
data += dbHighLadderVSRec.adoQueryAll(collection)
|
mylog.debug("tagHighLadderVSRec ok")
|
|
collection = db[UCN_DBCompensationItem]
|
dbDBCompensationItem = DataServerPlayerData.tagDBCompensationItem()
|
data += dbDBCompensationItem.adoQueryAll(collection)
|
mylog.debug("tagDBCompensationItem ok")
|
|
collection = db[UCN_DBPersonalCompensation]
|
dbDBPersonalCompensation = DataServerPlayerData.tagDBPersonalCompensation()
|
data += dbDBPersonalCompensation.adoQueryAll(collection)
|
mylog.debug("tagDBPersonalCompensation ok")
|
|
collection = db[UCN_DBEntireCompensationRequire]
|
dbDBEntireCompensationRequire = DataServerPlayerData.tagDBEntireCompensationRequire()
|
data += dbDBEntireCompensationRequire.adoQueryAll(collection)
|
mylog.debug("tagDBEntireCompensationRequire ok")
|
|
collection = db[UCN_CompensationPlayerRec]
|
dbCompensationPlayerRec = DataServerPlayerData.tagCompensationPlayerRec()
|
data += dbCompensationPlayerRec.adoQueryAll(collection)
|
mylog.debug("tagCompensationPlayerRec ok")
|
|
collection = db[UCN_PlayerViewCache]
|
dbPlayerViewCache = DataServerPlayerData.tagPlayerViewCache()
|
data += dbPlayerViewCache.adoQueryAll(collection)
|
mylog.debug("tagPlayerViewCache ok")
|
|
|
|
#ѹËõ
|
try:
|
#mylog.debug("unzip data = %s, len = %d"%(binascii.b2a_hex(data), len(data)))
|
compressData = zlib.compress(data, 9) #×î´óѹËõ
|
except:
|
msg = error.formatMsg('fatal', error.ERROR_NO_75, 'Compress game server player data failed!error =\n%s'%traceback.format_exc())
|
mylog.fatal(msg)
|
return
|
#·¢ËÍǰ´òÉϰ汾ºÅ
|
SendData =''
|
SendData = CommFunc.WriteDWORD(SendData,VersionNoDefine.GAMESERVER_GAMEWORLD_DATA_VERSION_NO)
|
|
SendData+=compressData
|
self.sendGameServerString(pack, CommonDefine.dgGameServerData, SendData)
|
mylog.info('Game server player data send ok! len = %d'%(len(data)))
|
|
def onSaveGameServerData(self, db, pack):
|
#//Êý¾Ý¿â±£´ægamedata#tagGDGameServerGameData
|
#
|
#struct tagGDPlayerGameData
|
#{
|
# DWORD PlayerID;
|
# DWORD DataLen;
|
# char Data[DataLen]; //size = DataLen
|
#};
|
#
|
#struct tagGBGameServerBackUpData
|
#{
|
# DWORD GameDataLen;
|
# char GameData[GameDataLen]; //size = GameDataLen
|
# WORD PlayerGameDataCount;
|
# tagGDPlayerGameData PlayerGameData[PlayerGameDataCount]; //size = PlayerGameDataCount
|
#};
|
#
|
#struct tagGDGameServerGameData
|
#{
|
# WORD Mark;
|
# WORD VersionNO; //°æ±¾ºÅ
|
# DWORD CRC;
|
# tagGBGameServerBackUpData GameServerBackUpData;
|
#};
|
# //GameServer±£´æÊý¾Ý#tagGameServerToBalanceServerSaveData
|
#struct tagGameServerToBalanceServerSaveData
|
#{
|
# BYTE PackDir;
|
# BYTE PackType;
|
# BYTE NeedReturn;
|
# BYTE Type;
|
# String Data;
|
#};
|
#Õâ¸ö·â°üÌØÊ⣬ÎÞ·¨×Ô¶¯Éú³É´úÂë
|
pos = 1 #Ìø¹ýgstSaveGameServerData
|
#tagGameServerToBalanceServerSaveData
|
needReturn, pos = CommFunc.ReadBYTE(pack.getBuffer(), pos)
|
type, pos = CommFunc.ReadBYTE(pack.getBuffer(), pos)
|
self.saveGameServerGameData(db, pack, pack.getBuffer(), pos, type, needReturn)
|
|
def saveGameServerGameData(self, db, pack, data, pos, saveType, needReturn):
|
##·ÏÆú£¬¸ÄΪʹÓà saveGameWorldData
|
if saveType == CommonDefine.dgGameServerCrashData:
|
#FileLog.getLogger('GameServerDataRestoreLog').info('½âÎö±ÀÀ£Êý¾ÝÖС£¡£¡£')
|
#tagGDGameServerGameData
|
mark, pos = CommFunc.ReadWORD(data, pos)
|
versionNO, pos = CommFunc.ReadWORD(data, pos)
|
crc, pos = CommFunc.ReadDWORD(data, pos)
|
#tagGBGameServerBackUpData
|
gameDataLen, pos = CommFunc.ReadDWORD(data, pos)
|
gameData, pos = CommFunc.ReadString(data, pos, gameDataLen)
|
|
#===================================================================
|
# #ÔÝÎÞGameServer¸öÈËÐÅÏ¢
|
# playerGameDataCount, pos = CommFunc.ReadWORD(data, pos)
|
# playerSaveDataList = []
|
# for recIndex in xrange(playerGameDataCount):
|
# #tagGDPlayerGameData
|
# playerID, pos = CommFunc.ReadDWORD(data, pos)
|
# playerDataLen, pos = CommFunc.ReadDWORD(data, pos)
|
# playerData, pos = CommFunc.ReadString(data, pos, playerDataLen)
|
#
|
# SinglePlayerSaveData = (playerID, playerData)
|
# playerSaveDataList.append(SinglePlayerSaveData)
|
#===================================================================
|
#Êý¾Ý°æ±¾Ð£Ñé
|
if gameDataLen:
|
if not versionNO == VersionNoDefine.GAMESERVER_GAMEWORLD_DATA_VERSION_NO:
|
msg = error.formatMsg('fatal', error.ERROR_NO_76, 'Save game server crash data error:data version conflict!versionNO = %s, db version = %s'%(versionNO, VersionNoDefine.GAMESERVER_GAMEWORLD_DATA_VERSION_NO))
|
mylog.fatal(msg)
|
#FileLog.getLogger('GameServerDataRestoreLog').fatal('±ÀÀ£Êý¾Ý°æ±¾ºÅУÑéʧ°Ü(Èç¹ûÊǸüа汾£¬ÇëÆô¶¯¾É°æ±¾·þÎñÆ÷µ¼Èë±ÀÀ£Êý¾ÝÊÔÊÔ)')
|
#Êý¾ÝÊÇѹËõÊý¾Ý
|
DataDumper.DumpData(os.path.join(GlobalFunctions.getAppPath(), CommonDefine.DUMP_PATH), 'tagGDGameServerGameData', '0.mdat', data)
|
return True
|
#УÑéͨ¹ý£¬´æµ½Êý¾Ý¿â
|
#´æ´¢ÊÀ½çÊý¾Ý
|
try:
|
#mylog.debug("Compress GameData = %s"%b2a_hex(gameData))
|
decompressGameData = zlib.decompress(gameData)
|
pyDataLen, pyDataHex = decompressGameData.split('|', 1)
|
pyDataLen = int(pyDataLen)
|
mylog.debug("disCompresspydata len %s, GameData = %s"%(pyDataLen, pyDataHex[:pyDataLen]))
|
decompressGameData = binascii.a2b_hex(pyDataHex[:pyDataLen]) + pyDataHex[pyDataLen:]
|
except:
|
msg = error.formatMsg('error', error.ERROR_NO_77, 'Decompress game server world data failed!error = \n%s'%traceback.format_exc())
|
mylog.error(msg)
|
#FileLog.getLogger('GameServerDataRestoreLog').fatal('±ÀÀ£Êý¾Ý½âѹʧ°Ü£¬¿ÉÄÜÊÇÊý¾ÝËð»µ.')
|
else:
|
#³É¹¦½âѹ£¬´æµ½Êý¾Ý¿â
|
#FileLog.getLogger('GameServerDataRestoreLog').info('±ÀÀ£Êý¾Ý½âѹ³É¹¦!¿ªÊ¼±£´æ¡£¡£¡£')
|
mylog.info('Decompress game server world data success, len = %d!saving...'%len(decompressGameData))
|
#mylog.debug("GameData = %s"%b2a_hex(decompressGameData))
|
gameDataReadPos = 0
|
try:
|
#gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerPackData, DataServerPlayerData.tagDBPlayerPackData, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGameRec, DataServerPlayerData.tagDBGameRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFuncTeam, DataServerPlayerData.tagDBPyFuncTeam, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFuncTeamMem, DataServerPlayerData.tagDBPyFuncTeamMem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerRecData, DataServerPlayerData.tagDBPlayerRecData, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaAward, DataServerPlayerData.tagDBPyMineAreaAward, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaRecord, DataServerPlayerData.tagDBPyMineAreaRecord, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaItem, DataServerPlayerData.tagDBPyMineAreaItem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyCouple, DataServerPlayerData.tagDBPyCouple, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyUnNotifyLoveGiftRec, DataServerPlayerData.tagDBPyUnNotifyLoveGiftRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyCharmValueRec, DataServerPlayerData.tagDBPyCharmValueRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerIntimacy, DataServerPlayerData.tagDBPyPlayerIntimacy, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossPersonalCompensation, DataServerPlayerData.tagDBCrossPersonalCompensation, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossBillboard, DataServerPlayerData.tagDBCrossBillboard, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAssistThanks, DataServerPlayerData.tagDBAssistThanks, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAssist, DataServerPlayerData.tagDBAssist, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerViewCachePy, DataServerPlayerData.tagPlayerViewCachePy, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAuctionAttention, DataServerPlayerData.tagDBAuctionAttention, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAuctionRecord, DataServerPlayerData.tagDBAuctionRecord, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAuctionItem, DataServerPlayerData.tagDBAuctionItem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossPKUnNotifyOverInfo, DataServerPlayerData.tagDBCrossPKUnNotifyOverInfo, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossPKBillboard, DataServerPlayerData.tagDBCrossPKBillboard, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyXMZZ, DataServerPlayerData.tagDBPyXMZZ, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPySealDemonRecord, DataServerPlayerData.tagDBPySealDemonRecord, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyBossAttention, DataServerPlayerData.tagDBPyBossAttention, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyBourseItemLastPrice, DataServerPlayerData.tagDBPyBourseItemLastPrice, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyBourseRecord, DataServerPlayerData.tagDBPyBourseRecord, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFamilyStoreItem, DataServerPlayerData.tagDBPyFamilyStoreItem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerFriend, DataServerPlayerData.tagDBPyPlayerFriend, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerEnemy, DataServerPlayerData.tagPlayerEnemy, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerContacts, DataServerPlayerData.tagDBPyPlayerContacts, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerBlack, DataServerPlayerData.tagDBPyPlayerBlack, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PersonalSocial, DataServerPlayerData.tagPersonalSocial, db)
|
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerTeamTable, DataServerPlayerData.tagPlayerTeamTable, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_TeamMemberTable, DataServerPlayerData.tagTeamMemberTable, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_FamilyInfo, DataServerPlayerData.tagFamilyInfo, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerFamily, DataServerPlayerData.tagPlayerFamily, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyVS, DataServerPlayerData.tagDBFamilyVS, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameWorldEvent, DataServerPlayerData.tagGameWorldEvent, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBMissionPub, DataServerPlayerData.tagDBMissionPub, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBIPManage, DataServerPlayerData.tagDBIPManage, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGameServerEventTrig, DataServerPlayerData.tagDBGameServerEventTrig, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryInfo, DataServerPlayerData.tagDBCountryInfo, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryFamilyWarResult, DataServerPlayerData.tagDBCountryFamilyWarResult, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryFamilyWarRace, DataServerPlayerData.tagDBCountryFamilyWarRace, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryFamilyWarRequest, DataServerPlayerData.tagDBCountryFamilyWarRequest, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBBillboard, DataServerPlayerData.tagDBBillboard, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGoldOrderForm, DataServerPlayerData.tagDBGoldOrderForm, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBOverdueGoldOrderForm, DataServerPlayerData.tagDBOverdueGoldOrderForm, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBUnclaimedGoldForm, DataServerPlayerData.tagDBUnclaimedGoldForm, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyTech, DataServerPlayerData.tagDBFamilyTech, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerLabel, DataServerPlayerData.tagDBPlayerLabel, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerRecall, DataServerPlayerData.tagDBPlayerRecall, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBVsReward, DataServerPlayerData.tagDBVsReward, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyReward, DataServerPlayerData.tagDBFamilyReward, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyRewardRec, DataServerPlayerData.tagDBFamilyRewardRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyAction, DataServerPlayerData.tagDBFamilyAction, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameFBPassRec, DataServerPlayerData.tagGameFBPassRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_UniversalGameRec, DataServerPlayerData.tagUniversalGameRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameGroup, DataServerPlayerData.tagGameGroup, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameGroupMember, DataServerPlayerData.tagGameGroupMember, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameGroupMutualInfo, DataServerPlayerData.tagGameGroupMutualInfo, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameBourseItem, DataServerPlayerData.tagGameBourseItem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_HighLadderPlayer, DataServerPlayerData.tagHighLadderPlayer, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBHighLadderItem, DataServerPlayerData.tagDBHighLadderItem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_HighLadderVSRec, DataServerPlayerData.tagHighLadderVSRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCompensationItem, DataServerPlayerData.tagDBCompensationItem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPersonalCompensation, DataServerPlayerData.tagDBPersonalCompensation, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBEntireCompensationRequire, DataServerPlayerData.tagDBEntireCompensationRequire, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_CompensationPlayerRec, DataServerPlayerData.tagCompensationPlayerRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerViewCache, DataServerPlayerData.tagPlayerViewCache, db)
|
|
|
#gameDataReadPos = self.savePlayerDeleteFriendData(decompressGameData, gameDataReadPos, RecvPackProtocol.tagDeleteFriendKey, UCN_PlayerFriend, db)
|
mylog.info('Save game server world data ok!')
|
#FileLog.getLogger('GameServerDataRestoreLog').info('ϵͳ±ÀÀ£Êý¾Ý±£´æ³É¹¦!')
|
except CommonDefine.ShortBuf:
|
msg = error.formatMsg('error', error.ERROR_NO_78, 'Short data buf, ignore...')
|
mylog.error(msg)
|
#FileLog.getLogger('GameServerDataRestoreLog').fatal('±ÀÀ£Êý¾Ý¿ÉÄܲ»ÍêÕû')
|
#===========================================================
|
# FileLog.getLogger('GameServerDataRestoreLog').info('±¾´ÎGameServer±ÀÀ£Êý¾Ý°üº¬ÒÔÏÂ%s¸öÍæ¼ÒÊý¾Ý'%len(playerSaveDataList))
|
# mylog.info('Saving game server player data,playerCnt = %s'%len(playerSaveDataList))
|
# #´æ´¢Íæ¼ÒÊý¾Ý
|
# for rec in playerSaveDataList:
|
# playerID, playerSaveData = rec
|
# playerDataReadPos = 0
|
# try:
|
# playerDataReadPos = self.saveGameServerPlayerData(playerID, playerSaveData, playerDataReadPos, 'tagPlayerEnemy', DataServerPlayerData.tagPlayerEnemy, db)
|
# playerDataReadPos = self.saveGameServerPlayerData(playerID, playerSaveData, playerDataReadPos, 'tagPlayerFriend', DataServerPlayerData.tagPlayerFriend, db)
|
# except CommonDefine.ShortBuf:
|
# msg = error.formatMsg('error', error.ERROR_NO_79, 'Not completed player data found!PlayerID = %s data = %s'%(playerID, playerSaveData))
|
# mylog.error(msg)
|
# FileLog.getLogger('GameServerDataRestoreLog').fatal('±¾´ÎGameServer±ÀÀ£Êý¾ÝµÄÍæ¼ÒºÃÓѺͳðÈËÊý¾Ý¿ÉÄܲ»ÍêÕû£¡')
|
# continue
|
# FileLog.getLogger('GameServerDataRestoreLog').info('PlayerID = %s'%(playerID))
|
#===========================================================
|
#FileLog.getLogger('GameServerDataRestoreLog').info('±¾´ÎGameServer±ÀÀ£Êý¾Ý±£´æ³É¹¦£¡')
|
mylog.info('Save game server player data ok!')
|
else:
|
mylog.info('Empty crash data,ignore...')
|
#FileLog.getLogger('GameServerDataRestoreLog').info('ÎÞ±ÀÀ£Êý¾Ý...')
|
#»Ø±¨
|
sendPack = SendPackProtocol.tagDBUpdateReturn()
|
sendPack.CallType = CommonDefine.dgUpDate
|
sendPack.UpdateType = CommonDefine.gstSaveGameServerCrashData
|
sendPack.Result = 1
|
self.packSend(pack.getSessionID(), pack.getPackHead().sessionID,
|
pack.getPackHead().poolIndex, pack.getPackHead().type,
|
pack.getPackHead().srcSvrType, pack.getPackHead().dstSvrType,
|
sendPack.GetBuffer())
|
elif saveType == 0:
|
#tagGameServerToBalanceServerSaveData
|
gameData = data[pos:]
|
decompressGameDataLen = 0
|
if gameData:
|
#´æ´¢ÊÀ½çÊý¾Ý
|
try:
|
#mylog.debug("Compress len %s, GameData = %s"%(len(gameData), b2a_hex(gameData)))
|
decompressGameData = zlib.decompress(gameData)
|
pyDataLen, pyDataHex = decompressGameData.split('|', 1)
|
pyDataLen = int(pyDataLen)
|
mylog.debug("disCompresspydata len %s, GameData = %s"%(pyDataLen, pyDataHex[:pyDataLen]))
|
decompressGameData = binascii.a2b_hex(pyDataHex[:pyDataLen]) + pyDataHex[pyDataLen:]
|
|
except:
|
msg = error.formatMsg('error', error.ERROR_NO_80, 'Decompress game server world data failed! error = \n%s'%traceback.format_exc())
|
mylog.error(msg)
|
else:
|
#³É¹¦½âѹ£¬´æµ½Êý¾Ý¿â
|
decompressGameDataLen = len(decompressGameData)
|
mylog.info('Decompress game server world data success, len = %s!saving...'%decompressGameDataLen)
|
#mylog.debug("GameData = %s"%b2a_hex(decompressGameData))
|
gameDataReadPos = 0
|
try:
|
#gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerPackData, DataServerPlayerData.tagDBPlayerPackData, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGameRec, DataServerPlayerData.tagDBGameRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFuncTeam, DataServerPlayerData.tagDBPyFuncTeam, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFuncTeamMem, DataServerPlayerData.tagDBPyFuncTeamMem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerRecData, DataServerPlayerData.tagDBPlayerRecData, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaAward, DataServerPlayerData.tagDBPyMineAreaAward, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaRecord, DataServerPlayerData.tagDBPyMineAreaRecord, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaItem, DataServerPlayerData.tagDBPyMineAreaItem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyCouple, DataServerPlayerData.tagDBPyCouple, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyUnNotifyLoveGiftRec, DataServerPlayerData.tagDBPyUnNotifyLoveGiftRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyCharmValueRec, DataServerPlayerData.tagDBPyCharmValueRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerIntimacy, DataServerPlayerData.tagDBPyPlayerIntimacy, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossPersonalCompensation, DataServerPlayerData.tagDBCrossPersonalCompensation, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossBillboard, DataServerPlayerData.tagDBCrossBillboard, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAssistThanks, DataServerPlayerData.tagDBAssistThanks, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAssist, DataServerPlayerData.tagDBAssist, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerViewCachePy, DataServerPlayerData.tagPlayerViewCachePy, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAuctionAttention, DataServerPlayerData.tagDBAuctionAttention, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAuctionRecord, DataServerPlayerData.tagDBAuctionRecord, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBAuctionItem, DataServerPlayerData.tagDBAuctionItem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossPKUnNotifyOverInfo, DataServerPlayerData.tagDBCrossPKUnNotifyOverInfo, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCrossPKBillboard, DataServerPlayerData.tagDBCrossPKBillboard, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyXMZZ, DataServerPlayerData.tagDBPyXMZZ, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPySealDemonRecord, DataServerPlayerData.tagDBPySealDemonRecord, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyBossAttention, DataServerPlayerData.tagDBPyBossAttention, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyBourseItemLastPrice, DataServerPlayerData.tagDBPyBourseItemLastPrice, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyBourseRecord, DataServerPlayerData.tagDBPyBourseRecord, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFamilyStoreItem, DataServerPlayerData.tagDBPyFamilyStoreItem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerFriend, DataServerPlayerData.tagDBPyPlayerFriend, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerEnemy, DataServerPlayerData.tagPlayerEnemy, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerContacts, DataServerPlayerData.tagDBPyPlayerContacts, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyPlayerBlack, DataServerPlayerData.tagDBPyPlayerBlack, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PersonalSocial, DataServerPlayerData.tagPersonalSocial, db)
|
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerTeamTable, DataServerPlayerData.tagPlayerTeamTable, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_TeamMemberTable, DataServerPlayerData.tagTeamMemberTable, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_FamilyInfo, DataServerPlayerData.tagFamilyInfo, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerFamily, DataServerPlayerData.tagPlayerFamily, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyVS, DataServerPlayerData.tagDBFamilyVS, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameWorldEvent, DataServerPlayerData.tagGameWorldEvent, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBMissionPub, DataServerPlayerData.tagDBMissionPub, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBIPManage, DataServerPlayerData.tagDBIPManage, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGameServerEventTrig, DataServerPlayerData.tagDBGameServerEventTrig, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryInfo, DataServerPlayerData.tagDBCountryInfo, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryFamilyWarResult, DataServerPlayerData.tagDBCountryFamilyWarResult, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryFamilyWarRace, DataServerPlayerData.tagDBCountryFamilyWarRace, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCountryFamilyWarRequest, DataServerPlayerData.tagDBCountryFamilyWarRequest, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBBillboard, DataServerPlayerData.tagDBBillboard, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGoldOrderForm, DataServerPlayerData.tagDBGoldOrderForm, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBOverdueGoldOrderForm, DataServerPlayerData.tagDBOverdueGoldOrderForm, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBUnclaimedGoldForm, DataServerPlayerData.tagDBUnclaimedGoldForm, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyTech, DataServerPlayerData.tagDBFamilyTech, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerLabel, DataServerPlayerData.tagDBPlayerLabel, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerRecall, DataServerPlayerData.tagDBPlayerRecall, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBVsReward, DataServerPlayerData.tagDBVsReward, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyReward, DataServerPlayerData.tagDBFamilyReward, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyRewardRec, DataServerPlayerData.tagDBFamilyRewardRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBFamilyAction, DataServerPlayerData.tagDBFamilyAction, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameFBPassRec, DataServerPlayerData.tagGameFBPassRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_UniversalGameRec, DataServerPlayerData.tagUniversalGameRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameGroup, DataServerPlayerData.tagGameGroup, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameGroupMember, DataServerPlayerData.tagGameGroupMember, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameGroupMutualInfo, DataServerPlayerData.tagGameGroupMutualInfo, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_GameBourseItem, DataServerPlayerData.tagGameBourseItem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_HighLadderPlayer, DataServerPlayerData.tagHighLadderPlayer, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBHighLadderItem, DataServerPlayerData.tagDBHighLadderItem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_HighLadderVSRec, DataServerPlayerData.tagHighLadderVSRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBCompensationItem, DataServerPlayerData.tagDBCompensationItem, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPersonalCompensation, DataServerPlayerData.tagDBPersonalCompensation, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBEntireCompensationRequire, DataServerPlayerData.tagDBEntireCompensationRequire, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_CompensationPlayerRec, DataServerPlayerData.tagCompensationPlayerRec, db)
|
gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_PlayerViewCache, DataServerPlayerData.tagPlayerViewCache, db)
|
|
|
#gameDataReadPos = self.savePlayerDeleteFriendData(decompressGameData, gameDataReadPos, RecvPackProtocol.tagDeleteFriendKey, UCN_PlayerFriend, db)
|
mylog.info('Save game server world data ok!')
|
except CommonDefine.ShortBuf:
|
msg = error.formatMsg('error', error.ERROR_NO_81, 'Short data buf, ignore...')
|
mylog.error(msg)
|
|
else:
|
mylog.info('Empty crash data,ignore...')
|
#»Ø±¨
|
if needReturn == 1:
|
sendPack = SendPackProtocol.tagDBUpdateReturn()
|
sendPack.CallType = CommonDefine.dgUpDate
|
sendPack.UpdateType = CommonDefine.gstSaveGameServerData
|
sendPack.Result = 1
|
self.packSend(pack.getSessionID(), pack.getPackHead().sessionID,
|
pack.getPackHead().poolIndex, pack.getPackHead().type,
|
pack.getPackHead().srcSvrType, pack.getPackHead().dstSvrType,
|
sendPack.GetBuffer())
|
mylog.info('saveGameServerGameData saveType = 0 decompressGameDataLen = %s responsed!'%decompressGameDataLen)
|
|
elif saveType == CommonDefine.dgPlayerMailList:
|
self.savePlayerMailData(data[pos:], "tagDBMailList", DataServerPlayerData.tagDBMailList, db)
|
elif saveType == CommonDefine.dgPlayerMailItemList:
|
self.savePlayerMailData(data[pos:], "tagDBMailItemList", DataServerPlayerData.tagDBMailItemList, db)
|
else:
|
mylog.warning('saveType = %s not processed!'%saveType)
|
|
def saveGameServerPlayerData(self, playerID, data, pos, collectionName, structName, db):
|
if pos >= len(data):
|
raise CommonDefine.ShortBuf(collectionName)
|
recCnt, pos = CommFunc.ReadDWORD(data, pos)
|
mylog.info('Saving %s cnt = %s playerID = %s'%(collectionName, recCnt, playerID))
|
#ɾ³ý¾ÉÊý¾Ý
|
collection = db[collectionName]
|
rec = structName()
|
rec.PlayerID = playerID
|
rec.adoDeleteByIndex(collection)
|
#²åÈëÐÂÊý¾Ý
|
docs = []
|
for i in xrange(0, recCnt):
|
rec.clear()
|
readLen = rec.readData(data, pos, len(data))
|
if readLen == -1:
|
raise CommonDefine.ShortBuf(collectionName)
|
pos += readLen
|
docs.append(rec.getRecord())
|
|
if not docs:
|
return pos
|
|
trycnt = 0
|
while(True):
|
try:
|
collection.insert(docs, False, True)
|
break
|
except pymongo.errors.PyMongoError, err:
|
|
if(DBConfig.TryCntOnWriteFail > trycnt):
|
trycnt += 1
|
continue
|
|
addADOExceptionCount()
|
mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
|
msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(playerID, err, trycnt))
|
mylog.error(msg)
|
|
return pos
|
|
return pos
|
|
def savegameServerWorldData(self, data, pos, collectionName, structName, db):
|
if pos >= len(data):
|
mylog.info('!!!Saving Error %s cnt = %s'%(collectionName, pos))
|
raise CommonDefine.ShortBuf(collectionName)
|
recCnt, pos = CommFunc.ReadDWORD(data, pos)
|
mylog.info('Saving %s cnt = %s'%(collectionName, recCnt))
|
|
# structNameParts = structName.split('.')
|
# collectionnName = structNameParts[len(structNameParts) - 1]
|
collection = db[collectionName]
|
db.drop_collection(collection)
|
|
docs = []
|
rec = structName()
|
for i in xrange(0, recCnt):
|
rec.clear()
|
readLen = rec.readData(data, pos, len(data))
|
rec.dumpString()
|
if -1 == readLen:
|
mylog.error('%s.%s readData failed, index = %s'%(self.__class__.__name_, inspect.stack()[0][3], i) )
|
raise CommonDefine.ShortBuf(collectionName) #Èç¹û¶ÁÈ¡³ö´í£¬ºóÃæÈ«´íÁË
|
pos += readLen
|
# rec.adoInsert(collection)
|
#ÓÅ»¯£¬¸Ä³ÉÅú²åÈë
|
docs.append(rec.getRecord())
|
|
if not docs:
|
return pos
|
|
trycnt = 0
|
while True:
|
try:
|
max_size = 1024 * 1024 * 16
|
docsStrLen = len(str(docs))
|
if docsStrLen <= max_size:
|
collection.insert(docs, False, True)
|
else:
|
insertTimes = int(math.ceil(docsStrLen / float(max_size))) # ·ÖÅú²åÈë´ÎÊý
|
perTimeCount = len(docs) / insertTimes # ÿ´Î²åÈëÌõÊý
|
mylog.info(' insertTimes=%s,perTimeCount=%s' % (insertTimes, perTimeCount))
|
for i in range(insertTimes):
|
start = i * perTimeCount
|
if i == insertTimes - 1:
|
insDocs = docs[start:]
|
else:
|
insDocs = docs[start:start + perTimeCount]
|
collection.insert(insDocs, False, True)
|
break
|
except pymongo.errors.OperationFailure, err:
|
if(DBConfig.TryCntOnWriteFail > trycnt):
|
trycnt += 1
|
continue
|
addADOExceptionCount()
|
mylog.info("%s.%s save %s failed!"%(self.__class__.__name__, inspect.stack()[0][3], docs))
|
mylog.error('%s.%s, error = %s, trycnt = %s'%(self.__class__.__name__, inspect.stack()[0][3], err, trycnt))
|
return pos
|
|
return pos
|
|
def savePlayerDeleteFriendData(self, data, pos, packStruct, collectionName, db):
|
if pos >= len(data):
|
raise CommonDefine.ShortBuf(collectionName)
|
recCnt, pos = CommFunc.ReadDWORD(data, pos)
|
mylog.info('Saving PlayerDeleteFriend data Cnt = %s'%recCnt)
|
|
collection = db[collectionName]
|
rec = packStruct()
|
#playerFriend = structName()
|
for i in xrange(0, recCnt):
|
readLen = rec.ReadData(data, pos, len(data))
|
if -1 == readLen:
|
raise CommonDefine.ShortBuf(collectionName)
|
pos += readLen
|
#ɾ³ýºÃÓÑ
|
#playerFriend.PlayerID = rec.PlayerID
|
#playerFriend.FriendID = rec.FriendID
|
trycnt = 0
|
while True:
|
try:
|
collection.remove({'PlayerID':rec.PlayerID, 'FriendID':rec.FriendID})
|
collection.remove({'PlayerID':rec.FriendID, 'FriendID':rec.PlayerID})
|
break
|
except pymongo.errors.OperationFailure, err:
|
if(DBConfig.TryCntOnWriteFail > trycnt):
|
trycnt += 1
|
continue
|
addADOExceptionCount()
|
mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec.PlayerID))
|
mylog.error('delete failure!PlayerID = %s, error = %s, trycnt = %d'%(rec.PlayerID, err, trycnt))
|
return pos
|
return pos
|
|
def savePlayerMailData(self, data, collectionName, structName, db):
|
if data:
|
if len(data) < 4:
|
msg = error.formatMsg('error', error.ERROR_NO_82, "invalid player mail data, collectionName = %s", collectionName)
|
mylog.error(msg)
|
return
|
|
pos = 0
|
recCnt, pos = CommFunc.ReadDWORD(data, pos)
|
mylog.info('Saving %s cnt = %s'%(collectionName, recCnt))
|
|
# structNameParts = structName.split('.')
|
# collectionnName = structNameParts[len(structNameParts) - 1]
|
collection = db[collectionName]
|
# db.drop_collection(collection)
|
|
rec = structName()
|
datalen = len(data)
|
for i in xrange(recCnt):
|
rec.clear()
|
readLen = rec.readData(data, pos, datalen)
|
if -1 == readLen:
|
raise CommonDefine.ShortBuf(collectionName) #Èç¹û¶ÁÈ¡³ö´í£¬ºóÃæÈ«´íÁË
|
pos += readLen
|
rec.adoInsert(collection)
|
else:
|
mylog.info("empty player mail list data, collectionName = %s", collectionName)
|
|
# loginserver·¢À´µÄ ÕʺÅ×ʼֻÔÚÔËÓªÉÌÄ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 OnMergerChildToCenter(self,db, pack):
|
mylog.debug('OnMergerChildToCenter in')
|
# #αװÀ´Ô´£¬±ãÓڻذü
|
# pack.getPackHead().srcSvrType = MMORPGPack.stGame
|
# pack.getPackHead().type = CommonDefine.dgMergerChildToCenter
|
#»ñÈ¡·¢°ü²ÎÊý
|
ServerMgr = MongoDBServer.getServerMgr()
|
sendViaSessionID = ServerMgr.getClientSessionIDByName("CenterGate",0)
|
SessionID = 0
|
PoolIndex = -1
|
|
#¶ÁÈ¡Êý¾Ý
|
buf = pack.getBuffer()
|
recvPack = MergeServerRecvProtocol.tagLPStringData()
|
pos = 0
|
recvPack.ReadData(buf, pos)
|
#ת·¢Êý¾Ýµ½GameServer
|
sendPack = SendPackProtocol.tagDGMergerChildToGameStringData()
|
sendPack.Type = CommonDefine.dgMergerChildToCenter
|
sendPack.DataLen = recvPack.DataLen
|
sendPack.Data = recvPack.Data
|
|
ServerMgr.packSendBySessionID(sendViaSessionID, SessionID, PoolIndex,
|
CommonDefine.atInner,
|
MMORPGPack.stGame, MMORPGPack.stData,
|
sendPack.GetBuffer())
|
mylog.debug('OnMergerChildToCenter sendString toGameServer %s'%recvPack.Data)
|
return True
|
|
|
def OnMergeChildToCenterPlayerData(self,db, pack):
|
mylog.debug('OnMergeChildToCenterPlayerData in')
|
#αװÀ´Ô´£¬±ãÓڻذü
|
#»ñÈ¡·¢°ü²ÎÊý
|
ServerMgr = MongoDBServer.getServerMgr()
|
sendViaSessionID = ServerMgr.getClientSessionIDByName("CenterGate",0)
|
SessionID = 0
|
PoolIndex = -1
|
|
#¶ÁÈ¡Êý¾Ý
|
buf = pack.getBuffer()
|
recvPack = MergeServerRecvProtocol.tagLPPlayerData()
|
pos = 0
|
recvPack.ReadData(buf, pos)
|
#ת·¢Êý¾Ýµ½MapServer
|
sendPack = SendPackProtocol.tagDMMergePlayerData()
|
sendPack.Type = CommonDefine.dgDBToMapServer
|
sendPack.SubType = CommonDefine.gmMergePlayerData
|
sendPack.DataLen = recvPack.DataLen
|
sendPack.Data = recvPack.Data
|
sendPack.PlayerID = recvPack.PlayerID
|
|
ServerMgr.packSendBySessionID(sendViaSessionID, SessionID, PoolIndex,
|
CommonDefine.atInner,
|
MMORPGPack.stRoute, MMORPGPack.stData,
|
sendPack.GetBuffer())
|
mylog.debug('OnMergeChildToCenterPlayerData sendString toMapServer %s'%([recvPack.PlayerID, sendPack.DataLen,]))
|
return True
|
|
|
#µ¼³öµ¥Íæ¼ÒÊý¾Ý
|
def DumpSinglePlayerDataByAcc(self,db,account):
|
|
mylog.info('DumpSinglePlayerDataByAcc accid = %s'%account)
|
#·ÇºÏ·þ
|
#¶ÁÈ¡½ÇÉ«»ù±¾ÐÅÏ¢
|
dbPlayer = DataServerPlayerData.tagDBPlayer()
|
dbPlayer.AccID = account
|
dbPlayer.IsDeleted = 0
|
collection = db[UCN_DBPlayer]
|
lastExceptionCnt = getADOExceptionCount()
|
lastSIDErrorCnt = getSIDErrorCnt()
|
loadOK = dbPlayer.adoLoadCEx(collection, {'AccID':fix_incomingText(dbPlayer.AccID), 'IsDeleted':dbPlayer.IsDeleted})
|
if not lastExceptionCnt == getADOExceptionCount():
|
#Êý¾Ý¿â¶ÁÈ¡³ö´í£¬µ«²»Ò»¶¨ÊÇUser¿â¶ÁÈ¡³ö´í
|
mylog.info('DumpSinglePlayerDataByAcc Exception accid = %s,playerID = %s'%(queryAccid, dbPlayer.PlayerID))
|
return
|
|
|
#¶ÁÈ¡ÎïÆ·µÈÆäËûÊý¾Ý
|
#Èç¹ûûÓбØÒª£¬¾Í²»Ö§³Öµ¥±íģʽÁË
|
#¶ÁÈ¡ÎïÆ·
|
queryDict = {'PlayerID':dbPlayer.PlayerID}
|
collection = db[UCN_RoleItem]
|
itemData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleItem, True)
|
|
itemCnt = CommFunc.ReadDWORD(itemData, 0)
|
|
collection = db[UCN_RoleMission]
|
missionData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMission)
|
|
missionCnt = CommFunc.ReadDWORD(missionData, 0)
|
|
collection = db[UCN_RoleMissionDict]
|
roleMissionDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMissionDict)
|
|
missonDictCnt = CommFunc.ReadDWORD(roleMissionDictData, 0)
|
|
collection = db[UCN_RoleSkill]
|
roleSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleSkill)
|
|
skillCnt = CommFunc.ReadDWORD(roleSkillData, 0)
|
|
collection = db[UCN_RoleBuff]
|
roleBuffData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleBuff)
|
|
bufCnt = CommFunc.ReadDWORD(roleBuffData, 0)
|
|
collection = db[UCN_RoleRepeatTime]
|
roleRepeatTimeData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleRepeatTime)
|
|
repeatTimeCnt = CommFunc.ReadDWORD(roleRepeatTimeData, 0)
|
|
collection = db[UCN_PlayerHorseTable]
|
roleHorseData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerHorseTable)
|
|
horseCnt = CommFunc.ReadDWORD(roleHorseData, 0)
|
|
collection = db[UCN_GMOper]
|
gmOperData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagGMOper)
|
|
gmOperCnt = CommFunc.ReadDWORD(gmOperData, 0)
|
|
collection = db[UCN_RolePet]
|
rolePetData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRolePet)
|
|
petCnt = CommFunc.ReadDWORD(rolePetData, 0)
|
|
collection = db[UCN_PetSkill]
|
petSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPetSkill)
|
|
petSkillCnt = CommFunc.ReadDWORD(petSkillData, 0)
|
|
collection = db[UCN_RoleNomalDict]
|
roleNormalDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleNomalDict)
|
|
dictCnt = CommFunc.ReadDWORD(roleNormalDictData, 0)
|
|
collection = db[UCN_PlayerDienstgrad]
|
roleDienstgradData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerDienstgrad)
|
|
roleDienstgradCnt = CommFunc.ReadDWORD(roleDienstgradData, 0)
|
|
collection = db[UCN_BattleFormation]
|
battleFormationData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagBattleFormation)
|
|
battleFormationCnt = CommFunc.ReadDWORD(battleFormationData, 0)
|
|
#¶ÁÈ¡½ûÖ¹IPÊý¾Ý
|
gmIP = DataServerPlayerData.tagDBGMIP()
|
gmIP.AccID = account.lower()
|
collection = db[UCN_DBGMIP]
|
gmIPData = gmIP.adoQueryIndex(collection)
|
|
gmIPCnt = CommFunc.ReadDWORD(gmIPData, 0)
|
mylog.debug('gmIP cnt = %s'%gmIPCnt[0])
|
|
allData = dbPlayer.getBuffer() + itemData + missionData + roleMissionDictData + roleSkillData + roleBuffData + roleRepeatTimeData + roleHorseData + gmOperData\
|
+ gmIPData + rolePetData + petSkillData + roleNormalDictData + roleDienstgradData+battleFormationData
|
#
|
DumpDir = os.path.join(GlobalFunctions.getAppPath(),"DumpPlayerData")
|
if not os.path.exists(DumpDir):
|
os.mkdir(DumpDir)
|
|
fileHandler = open(os.path.join(DumpDir,"%s.pdsave"%account),'wb')
|
import struct
|
fileHandler.write(allData)
|
fileHandler.flush()
|
fileHandler.close()
|
|
def SaveSinglePlayerDataFromDumpFile(self, db, account):
|
#
|
DumpDir = os.path.join(GlobalFunctions.getAppPath(),"DumpPlayerData")
|
if not os.path.exists(DumpDir):
|
os.mkdir(DumpDir)
|
return (False, 0)
|
FileDir = os.path.join(DumpDir,"%s.pdsave"%account)
|
saveData = ""
|
try:
|
fileHandler = open(FileDir,'rb')
|
saveData = fileHandler.read()
|
fileHandler.close()
|
except:
|
return (False, 0)
|
|
|
playerRec = DataServerPlayerData.tagDBPlayer()
|
pos = 0
|
dbPlayerReadLen = playerRec.readData(saveData, pos, len(saveData))
|
if -1 == dbPlayerReadLen:
|
return (False, 0)
|
pos += dbPlayerReadLen
|
mylog.info('Saving player data,playerID = %s....'%playerRec.PlayerID)
|
if playerRec.PlayerID == 0:
|
return (False, 0)
|
#AccIDתСд
|
playerRec.AccID = playerRec.AccID.lower()
|
collection = db[UCN_DBPlayer]
|
|
if not playerRec.adoCheckUpdateC(collection):
|
# DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\Player_save', '%s.mdat'%sessionID, saveData)
|
# mylog.error('player save error:playerID = %s'%playerRec.PlayerID)
|
return (False, playerRec.PlayerID)
|
#±£´æÎïÆ·µÈÆäËûÊý¾Ý
|
#²»ÔÙÖ§³Öµ¥±íģʽ
|
#²»ÔÙÖ§³ÖÎļþģʽ
|
#±£´æÎïÆ·
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleItem, DataServerPlayerData.tagRoleItem, saveData[pos:], True)
|
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleMission, DataServerPlayerData.tagRoleMission, saveData[pos:])
|
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleMissionDict, DataServerPlayerData.tagRoleMissionDict, saveData[pos:])
|
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleSkill, DataServerPlayerData.tagRoleSkill, saveData[pos:])
|
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleBuff, DataServerPlayerData.tagRoleBuff, saveData[pos:])
|
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleRepeatTime, DataServerPlayerData.tagRoleRepeatTime, saveData[pos:])
|
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_PlayerHorseTable, DataServerPlayerData.tagPlayerHorseTable, saveData[pos:])
|
|
#·âºÅ¼ì²é
|
self.gmOperCheck(playerRec.AccID, playerRec.PlayerID, saveData[pos:])
|
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_GMOper, DataServerPlayerData.tagGMOper, saveData[pos:])
|
#Ìø¹ýGM IP±í
|
gmIPCnt, pos = CommFunc.ReadDWORD(saveData, pos)
|
gmIPRec = DataServerPlayerData.tagDBGMIP()
|
for i in xrange(gmIPCnt):
|
#gmIPRec.clear()
|
pos += gmIPRec.readData(saveData, pos, len(saveData))
|
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RolePet, DataServerPlayerData.tagRolePet, saveData[pos:])
|
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_PetSkill, DataServerPlayerData.tagPetSkill, saveData[pos:])
|
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_RoleNomalDict, DataServerPlayerData.tagRoleNomalDict, saveData[pos:])
|
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_PlayerDienstgrad, DataServerPlayerData.tagPlayerDienstgrad, saveData[pos:])
|
|
pos += self.savePlayerDataEx(playerRec.PlayerID, db, UCN_BattleFormation, DataServerPlayerData.tagBattleFormation, saveData[pos:])
|
|
assert pos == len(saveData)
|
return (True, playerRec.PlayerID)
|
|
|
|