| | |
| | | from Collections import DataServerPlayerData
|
| | | from Collections.CollectionDefine import *
|
| | | from Common import (CommFuncEx, mylog)
|
| | | from Protocol import MMORPGPack
|
| | |
|
| | | from Protocol import (MMORPGPack, RecvPackProtocol, SendPackProtocol, MergeServerRecvProtocol, MergeServerSendProtocol)
|
| | | import PlayerOfflineSupport
|
| | | import PyGameData
|
| | | import GameWorld
|
| | | import DBDataMgr
|
| | |
|
| | | ##################################################################
|
| | | ####### python逻辑入口 #######
|
| | |
| | | GMCommandResult(orderId, funcName, GMCommon.Def_GMDBEntranceFail)
|
| | | return
|
| | |
|
| | | |
| | | #test
|
| | | #转发所有数据库
|
| | | # SendDBRequest(CommonDefine.gstGMToolCmdSysDBRequest,OrderLen,OrderId,CmdLen,Cmd)
|
| | | # SendDBRequest(CommonDefine.gstGMToolCmdLogDBRequest,OrderLen,OrderId,CmdLen,Cmd)
|
| | | # SendDBRequest(CommonDefine.gstGMToolCmdUserDBRequest,OrderLen,OrderId,CmdLen,Cmd)
|
| | | # SendLogicProcessRequest(CommonDefine.gstGMToolCmdLogicProcessRequest,OrderLen,OrderId,CmdLen,Cmd)
|
| | | #转发GameServer
|
| | | #SendGMToolCommandToGameServer(pack)
|
| | | |
| | | #回复GM工具
|
| | | #SendToGMToolCommandResult(OrderLen,OrderId,CmdLen,Cmd,UserDataLen,UserData)
|
| | |
|
| | | #-----------------------
|
| | | mylog.info('ProjSpecialProcess OnGMToolCommand Done')
|
| | |
| | | #返回修改后的包
|
| | | return pack
|
| | |
|
| | | ################
|
| | | # Sys库请求处理 #
|
| | | ################
|
| | | ## Sys库请求处理
|
| | | # @param None |
| | | # @return None
|
| | | def OnGMToolCmdSysDBRequest(sysdb,pack):
|
| | | mylog.info('ProjSpecialProcess OnGMToolCmdSysDBRequest IN')
|
| | | #读取封包数据
|
| | | recvPack = RecvPackProtocol.tagGMCommandDBRequest()
|
| | | recvPack.ReadData(pack.getBuffer())
|
| | | OrderLen = recvPack.OrderLen
|
| | | OrderId = recvPack.OrderId
|
| | | DataLen = recvPack.DataLen
|
| | | Data = recvPack.Data
|
| | | #-----------------------
|
| | | #项目组对自定义请求进行处理
|
| | | #-----------------------
|
| | | |
| | | |
| | | |
| | | #-----------------------
|
| | | mylog.info('ProjSpecialProcess OnGMToolCmdSysDBRequest Done')
|
| | | return
|
| | |
|
| | |
|
| | | ################
|
| | | # Log库请求处理 #
|
| | | ################
|
| | | ## Log库请求处理
|
| | | # @param None |
| | | # @return None
|
| | | def OnGMToolCmdLogDBRequest(logdb,pack):
|
| | | mylog.info('ProjSpecialProcess OnGMToolCmdLogDBRequest IN')
|
| | | #读取封包数据
|
| | | recvPack = RecvPackProtocol.tagGMCommandDBRequest()
|
| | | recvPack.ReadData(pack.getBuffer())
|
| | | OrderLen = recvPack.OrderLen
|
| | | OrderId = recvPack.OrderId
|
| | | DataLen = recvPack.DataLen
|
| | | Data = recvPack.Data
|
| | | #-----------------------
|
| | | #项目组对自定义请求进行处理
|
| | | #-----------------------
|
| | | # 查询返回
|
| | | gmCmdOrderMgr = GetGMOrderMgr()
|
| | | cmdManger = gmCmdOrderMgr.GetCmd(OrderId)
|
| | | cmdManger.LogDBRequestResponse(logdb, Data)
|
| | | #-----------------------
|
| | | mylog.info('ProjSpecialProcess OnGMToolCmdLogDBRequest Done')
|
| | | return
|
| | |
|
| | |
|
| | | ################
|
| | | # User库请求处理 #
|
| | | ################
|
| | | ## User库请求处理
|
| | | # @param None |
| | | # @return None
|
| | | def OnGMToolCmdUserDBRequest(userdb,pack):
|
| | | mylog.info('ProjSpecialProcess OnGMToolCmdUserDBRequest IN')
|
| | | #读取封包数据
|
| | | recvPack = RecvPackProtocol.tagGMCommandDBRequest()
|
| | | recvPack.ReadData(pack.getBuffer())
|
| | | OrderLen = recvPack.OrderLen
|
| | | OrderId = recvPack.OrderId
|
| | | DataLen = recvPack.DataLen
|
| | | Data = recvPack.Data
|
| | | #-----------------------
|
| | | #项目组对自定义请求进行处理
|
| | | #-----------------------
|
| | | |
| | | # 查询返回
|
| | | gmCmdOrderMgr = GetGMOrderMgr()
|
| | | cmdManger = gmCmdOrderMgr.GetCmd(OrderId)
|
| | | execType, execInfo = UpdatePackData(userdb, cmdManger)
|
| | | # 如果是错误类型直接执行返回结果
|
| | | if execType < GMCommon.Def_ResultTypeMax:
|
| | | cmdManger.GMCmdExecuteResult(execType, execInfo)
|
| | | return
|
| | | cmdManger.UserDBRequestResponse(userdb, Data) |
| | | #-----------------------
|
| | | mylog.info('ProjSpecialProcess OnGMToolCmdUserDBRequest Done')
|
| | | return
|
| | |
|
| | | ## 更新包数据
|
| | | # @param None |
| | | # @return None
|
| | | def UpdatePackData(userdb, gmCmdManger):
|
| | | |
| | | # 个人补偿GM工具
|
| | | # 由于GameServer处理多个玩家补偿同一物品时只收一次命令包处理(只插入一条物品数据)
|
| | | # 故此处先查出多个玩家账号/昵称对应的playerID,更改命令字典信息后,压入包,再推给GameServer
|
| | | if gmCmdManger.funcName in ["GMT_AddPersonalCompensation", "GMT_CompensationQueryPersonal"]:
|
| | | gmCmdDict = gmCmdManger.gmCmdDict
|
| | | playerList = gmCmdDict.get("playerList", '')
|
| | | playerList = playerList.split(",")
|
| | | |
| | | if not playerList:
|
| | | return GMCommon.Def_ParamErr, ''
|
| | | |
| | | playerIDList = []
|
| | | queryType = gmCmdDict.get(GMCommon.Def_GMKey_QueryType, '')
|
| | | if queryType == GMCommon.Def_GMKey_FamilyID:
|
| | | # 根据家族ID的不处理,直接推
|
| | | return GMCommon.Def_SendToGameServer, ""
|
| | | |
| | | playerFind = gmCmdDict.get(GMCommon.Def_GMKey_PlayerFind, '')
|
| | | |
| | | for playerFind in playerList:
|
| | | playerAccID = ""
|
| | | # 玩家姓名
|
| | | if queryType == GMCommon.Def_GMKey_PlayerName:
|
| | | playerAccID = GMCommon.GetPlayerAccID(userdb, {'PlayerName':fix_incomingText(playerFind), 'IsDeleted':0})
|
| | | |
| | | elif queryType == GMCommon.Def_GMKey_PlayerAccID:
|
| | | playerAccID = GMCommon.GetPlayerAccID(userdb, {'AccID':fix_incomingText(playerFind), 'IsDeleted':0})
|
| | | |
| | | if playerAccID == '':
|
| | | return GMCommon.Def_NoTag, "%s can not found!" % str(playerFind)
|
| | | |
| | | collection = userdb[UCN_DBPlayer] |
| | | dbPlayer = DataServerPlayerData.tagDBPlayer()
|
| | | dbPlayer.IsDeleted = 0
|
| | | |
| | | loadOK = dbPlayer.adoLoadCEx(collection, {'AccID':fix_incomingText(playerAccID),
|
| | | 'IsDeleted':dbPlayer.IsDeleted}) |
| | | if not loadOK:
|
| | | return GMCommon.Def_NoTag, "%s can not found!" % str(playerFind)
|
| | | |
| | | playerIDList.append(dbPlayer.PlayerID)
|
| | | |
| | | gmCmdManger.gmCmdDictUnEncode["PlayerIDList"] = str(playerIDList)
|
| | | |
| | | updatePack = RecvPackProtocol.tagGMCommand()
|
| | | updatePack.OrderId = str(gmCmdManger.orderId)
|
| | | updatePack.OrderLen = len(updatePack.OrderId)
|
| | | updatePack.Cmd = str(gmCmdManger.gmCmdDictUnEncode)
|
| | | updatePack.CmdLen = len(updatePack.Cmd)
|
| | | updatePack.UserData = str(gmCmdManger.userData)
|
| | | updatePack.UserDataLen = len(updatePack.UserData)
|
| | | |
| | | # 更新pack数据
|
| | | # mmoRPGPack = MMORPGPack.MMORPGPacket()
|
| | | # mmoRPGPack.setBuffer(updatePack.GetBuffer())
|
| | | # gmCmdManger.pack = mmoRPGPack
|
| | | |
| | | return GMCommon.Def_SendToGameServer, ""
|
| | |
|
| | |
|
| | | ################
|
| | | #逻辑线程请求处理 #
|
| | | ################
|
| | | ## 逻辑线程请求处理
|
| | | # @param None |
| | | # @return None
|
| | | def OnGMToolCmdLogicProcessRequest(pack):
|
| | | mylog.info('ProjSpecialProcess OnGMToolCmdLogicProcessRequest IN')
|
| | | #读取封包数据
|
| | | recvPack = RecvPackProtocol.tagGMCommandDBRequest()
|
| | | recvPack.ReadData(pack.getBuffer())
|
| | | OrderLen = recvPack.OrderLen
|
| | | OrderId = recvPack.OrderId
|
| | | DataLen = recvPack.DataLen
|
| | | Data = recvPack.Data
|
| | | #-----------------------
|
| | | #项目组对自定义请求进行处理
|
| | | #-----------------------
|
| | | |
| | | #-----------------------
|
| | | mylog.info('ProjSpecialProcess OnGMToolCmdLogicProcessRequest Done')
|
| | | return
|
| | |
|
| | | ##################################################################
|
| | |
|
| | | def GMCmdPlayerListValidationID(gmCmdDict):
|
| | | '''后台GM工具玩家列表命令通用验证
|
| | | @param gmCmdDict: 命令参数字典
|
| | | @return: GMCommon.Def_xxx, idList or errorInfo
|
| | | 非 Def_Success 的错误类型 - 代表错误,可直接返回给后台
|
| | | Def_Success, playerIDList - 待处理的玩家ID列表
|
| | | '''
|
| | | playerList = gmCmdDict.get("playerList", '')
|
| | | playerList = playerList.split(",")
|
| | | if not playerList:
|
| | | return GMCommon.Def_ParamErr, ""
|
| | | |
| | | playerIDList = []
|
| | | queryType = gmCmdDict.get(GMCommon.Def_GMKey_QueryType, '') |
| | | if queryType in [GMCommon.Def_GMKey_PlayerName, GMCommon.Def_GMKey_PlayerAccID]:
|
| | | for playerFind in playerList:
|
| | | if queryType == GMCommon.Def_GMKey_PlayerName:
|
| | | rec = PyGameData.g_usrCtrlDB.findDBPlayerByName(playerFind)
|
| | | elif queryType == GMCommon.Def_GMKey_PlayerAccID:
|
| | | rec = PyGameData.g_usrCtrlDB.findDBPlayerByAccID(playerFind)
|
| | | else:
|
| | | continue
|
| | | |
| | | if not rec:
|
| | | # db找不到就是不存在该玩家
|
| | | return GMCommon.Def_NoTag, "%s can not found!" % str(playerFind)
|
| | | |
| | | playerID = rec.get(u'PlayerID', 0)
|
| | | playerIDList.append(playerID)
|
| | | |
| | | elif queryType == GMCommon.Def_GMKey_FamilyID:
|
| | | # 根据家族ID的直接返回
|
| | | familyMgr = DBDataMgr.GetFamilyMgr()
|
| | | for familyID in eval(playerList):
|
| | | familyID = GameWorld.ToIntDef(familyID)
|
| | | family = familyMgr.FindFamily(familyID)
|
| | | if not family:
|
| | | GameWorld.DebugLog(" not family %s" % familyID)
|
| | | continue
|
| | | memberIDList = family.GetMemberIDList()
|
| | | playerIDList += memberIDList
|
| | | |
| | | if not playerIDList:
|
| | | return GMCommon.Def_ParamErr, ""
|
| | | |
| | | return GMCommon.Def_Success, playerIDList
|
| | |
|
| | | def GMCmdPlayerValidationID(gmCmdDict):
|
| | | '''后台GM工具玩家命令通用验证
|
| | | @param gmCmdDict: 命令参数字典
|
| | | @return: GMCommon.Def_xxx, playerID
|
| | | 非 Def_Success 的错误类型 - 代表错误,可直接返回给后台
|
| | | Def_Success, playerID - 本服玩家ID
|
| | | '''
|
| | | |
| | | queryType = gmCmdDict.get(GMCommon.Def_GMKey_QueryType, '')
|
| | | playerFind = gmCmdDict.get(GMCommon.Def_GMKey_PlayerFind, '')
|
| | | |
| | | if len(playerFind) <= 0:
|
| | | return GMCommon.Def_ParamErr, None
|
| | | |
| | | # 玩家姓名
|
| | | if queryType == GMCommon.Def_GMKey_PlayerName:
|
| | | rec = PyGameData.g_usrCtrlDB.findDBPlayerByName(playerFind)
|
| | | elif queryType == GMCommon.Def_GMKey_PlayerAccID:
|
| | | rec = PyGameData.g_usrCtrlDB.findDBPlayerByAccID(playerFind)
|
| | | else:
|
| | | return GMCommon.Def_ParamErr, None
|
| | | |
| | | if not rec:
|
| | | # db找不到就是不存在该玩家
|
| | | return GMCommon.Def_NoTag, None
|
| | | |
| | | playerID = rec.get(u'PlayerID', 0)
|
| | | return GMCommon.Def_Success, playerID
|
| | |
|
| | | def GMCmdPlayerValidation(gmCmdDict, offlineSupport=True):
|
| | | '''后台GM工具玩家命令通用验证
|
| | | @param gmCmdDict: 命令参数字典
|
| | | @param offlineSupport: 离线玩家是否支持该命令,默认支持,当玩家离线时,会在上线后执行该命令
|
| | | @return: GMCommon.Def_xxx, curPlayer
|
| | | 非 Def_Success 的错误类型 - 代表错误,可直接返回给后台
|
| | | Def_Success, curPlayer - curPlayer为空时代表玩家离线状态
|
| | | '''
|
| | | |
| | | queryType = gmCmdDict.get(GMCommon.Def_GMKey_QueryType, '')
|
| | | playerFind = gmCmdDict.get(GMCommon.Def_GMKey_PlayerFind, '')
|
| | | |
| | | if len(playerFind) <= 0:
|
| | | return GMCommon.Def_ParamErr, None
|
| | | |
| | | # 玩家姓名
|
| | | if queryType == GMCommon.Def_GMKey_PlayerName:
|
| | | rec = PyGameData.g_usrCtrlDB.findDBPlayerByName(playerFind)
|
| | | elif queryType == GMCommon.Def_GMKey_PlayerAccID:
|
| | | rec = PyGameData.g_usrCtrlDB.findDBPlayerByAccID(playerFind)
|
| | | else:
|
| | | return GMCommon.Def_ParamErr, None
|
| | | |
| | | if not rec:
|
| | | # db找不到就是不存在该玩家
|
| | | return GMCommon.Def_NoTag, None
|
| | | |
| | | playerID = rec.get(u'PlayerID', 0)
|
| | | curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
| | | if not curPlayer or curPlayer.IsEmpty():
|
| | | # 离线处理
|
| | | if offlineSupport:
|
| | | PlayerOfflineSupport.AddOfflineUnprocessed(playerID, "GMToolCMD", gmCmdDict)
|
| | | return GMCommon.Def_Success, None
|
| | | return GMCommon.Def_PlayerOfLine, None
|
| | | |
| | | return GMCommon.Def_Success, curPlayer
|
| | |
|
| | | def GMCmdPlayerLogin(curPlayer):
|
| | | PlayerOfflineSupport.DoOfflineUnprocessed(curPlayer, "GMToolCMD", __doOfflineGMToolCMD)
|
| | | return
|
| | |
|
| | | def __doOfflineGMToolCMD(curPlayer, recData, eventName, eventData):
|
| | | gmCmdDict = eventData
|
| | | if not gmCmdDict or not isinstance(gmCmdDict, dict):
|
| | | return
|
| | | funcName = gmCmdDict.get(GMCommon.Def_GMKey_Type, '') |
| | | callFunc = GetExecFunc(Commands, "%s.%s" % (funcName, "OnExec"))
|
| | | if callFunc != None:
|
| | | callFunc(gmCmdDict)
|
| | | return
|
| | |
|
| | |
|
| | | ## gm命令执行
|
| | |
| | | def GMToolCommand(self):
|
| | | callFunc = GetExecFunc(Commands, "%s.%s"%(self.funcName, "OnExec"))
|
| | |
|
| | | execType = GMCommon.Def_SendToGameServer
|
| | | execType = GMCommon.Def_Unknow
|
| | | execInfo = ''
|
| | | if callFunc != None:
|
| | | execType, execInfo = callFunc(self.gmCmdDict)
|
| | | |
| | | # 执行结果处理
|
| | | self.GMCmdExecuteResult(execType, execInfo)
|
| | | |
| | | ## 查询logdb
|
| | | # @param self
|
| | | # @param logdb
|
| | | # @param data:自定义数据
|
| | | # @return None
|
| | | def LogDBRequestResponse(self, logdb, data): |
| | | callFunc = GetExecFunc(Commands, "%s.%s"%(self.funcName, "LogDBResponse"))
|
| | | |
| | | execType = GMCommon.Def_GMCmdNone
|
| | | execInfo = ''
|
| | | if callFunc != None:
|
| | | execType, execInfo = callFunc(logdb, data, self.gmCmdDict)
|
| | | |
| | | # 执行结果处理
|
| | | self.GMCmdExecuteResult(execType, execInfo)
|
| | | |
| | | ## 查询userdb
|
| | | # @param self
|
| | | # @param userdb
|
| | | # @param data:自定义数据
|
| | | # @return None
|
| | | def UserDBRequestResponse(self, userdb, data): |
| | | callFunc = GetExecFunc(Commands, "%s.%s"%(self.funcName, "UserDBResponse"))
|
| | | |
| | | execType = GMCommon.Def_GMCmdNone
|
| | | execInfo = ''
|
| | | if callFunc != None:
|
| | | execType, execInfo = callFunc(userdb, data, self.gmCmdDict)
|
| | | |
| | | # 执行结果处理
|
| | | self.GMCmdExecuteResult(execType, execInfo)
|
| | |
|
| | | ## 执行返回结果处理
|
| | | # @param self
|
| | | # @param execType:操作类型
|
| | | # @param execInfo:自定义数据
|
| | | # @return None
|
| | | def GMCmdExecuteResult(self, execType, execInfo):
|
| | | |
| | | if execType == GMCommon.Def_DoQueryLogDB:
|
| | | SendDBRequest(CommonDefine.gstGMToolCmdLogDBRequest,
|
| | | len(self.orderId), self.orderId, len(execInfo), execInfo)
|
| | | ret = callFunc(self.gmCmdDict)
|
| | | if isinstance(ret, int):
|
| | | execType = ret
|
| | | elif isinstance(ret, tuple):
|
| | | execType = ret[0]
|
| | | execInfo = ret[1]
|
| | |
|
| | | elif execType == GMCommon.Def_DoQueryUserDB:
|
| | | SendDBRequest(CommonDefine.gstGMToolCmdUserDBRequest,
|
| | | len(self.orderId), self.orderId, len(execInfo), execInfo)
|
| | | |
| | | elif execType == GMCommon.Def_SendToGameServer:
|
| | | SendGMToolCommandToGameServer(self.pack)
|
| | | # 删除改gm命令
|
| | | GetGMOrderMgr().PopCmd(self.orderId)
|
| | | GetGMOrderMgr().PopCmd(self.orderId)
|
| | | GMCommandResult(self.orderId, self.funcName, execType, execInfo)
|
| | | |
| | |
|
| | | else:
|
| | | #gm命令回复, 删除改gm命令
|
| | | GetGMOrderMgr().PopCmd(self.orderId)
|
| | | GMCommandResult(self.orderId, self.funcName, execType, execInfo)
|
| | | return |
| | |
|
| | | ## gm命令管理
|
| | | #
|
| | |
| | | resultMsg = json.dumps(resultDcit, ensure_ascii=False)
|
| | |
|
| | | mylog.info("gm result:%s"%resultMsg)
|
| | | SendToGMToolCommandResult(len(orderId), orderId, len(resultMsg), resultMsg, len(useData), useData)
|
| | | SendToGMToolCommandResult(orderId, resultMsg)
|
| | | return
|
| | |
|
| | |
|