#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package proiSpecialProcess # # @todo: gm¹¤¾ßdbÖ´ÐÐÎļþ # @author xmnathan # @date 2009-06-04 15:30 # @version 2.0 # # ÏêϸÃèÊö: # @change: "2012-06-14 18:00" wdb gm¹¤¾ßµ÷Õû # @change: "2012-06-19 15:00" wdb ³õʼ»¯funcName # @change: "2012-07-12 18:00" wdb Ôö¼Ó±àÂëÊôÐÔ # @change: "2012-07-30 11:30" wdb GM»Ø¸´Ï¸»¯£¬´úÂëÓÅ»¯ # @change: "2014-09-23 12:00" hxp ¸öÈ˲¹³¥ÃüÁîÐÅÏ¢Ôö¼Ó²éÑ¯Íæ¼ÒIDÐÅÏ¢ÍÆ¸øGameServer # @change: "2014-09-29 11:00" hxp ÐÞ¸´Ð޸ĸöÈ˲¹³¥ÃüÁî×ÖµäʱÖÐÎıàÂë´íÎóÎÊÌâ # @change: "2014-10-11 16:30" hxp »»ÐбàÂë´íÎó´¦Àí # @change: "2015-02-10 20:30" xmnathan Ôö¼ÓGameServer»Ø°ü´¦Àíº¯Êý # @change: "2015-10-28 14:00" hxp ·µ»Ø¸ñʽʹÓÃjson # @change: "2017-04-26 16:30" hxp ת»¯±àÂë¸ñʽ´¦Àíµ¥ÒýºÅ #------------------------------------------------------------------------------ #"""Version = 2017-04-26 16:30""" #------------------------------------------------------------------------------ from GMToolPyInterface import * from DBCommon import GlobalFunctions from Commands import GMCommon import Commands import copy import os import traceback import json from MangoDBCommon import fix_incomingText from Collections import DataServerPlayerData from Collections.CollectionDefine import * from Common import (CommFuncEx, mylog) from Protocol import (MMORPGPack, RecvPackProtocol, SendPackProtocol, MergeServerRecvProtocol, MergeServerSendProtocol) import PlayerOfflineSupport import PyGameData import GameWorld ################################################################## ####### pythonÂß¼­Èë¿Ú ####### ## µ¼ÈëGMÈ«²¿ÃüÁî # @param importDir ·¾¶Ãû # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ImportCommandAll(importDir): curPath = GlobalFunctions.getAppPath() for root, dirs, files in os.walk("%s\\%s"%(curPath, importDir)): for file in files: fileName = os.path.join(root, file) fileName = fileName.replace(curPath, "") fileName = fileName[1:len(fileName)] if fileName.find("__init__") >= 0: continue curFileList = fileName.split(".") fileName = curFileList[0] ext = curFileList[1] if ext not in ['pyc', 'py']: continue fileName = fileName.replace("\\",".") __import__(fileName) ImportCommandAll("GMToolLogicProcess\\Commands") # gmÃüÁî¹ÜÀí _GMCmdOrderMgr = None ################# #GMÃüÁî·Ö·¢´¦ÀíÈë¿Ú# ################# ## GMÃüÁî·Ö·¢´¦ÀíÈë¿Ú # @param None # @return None def OnGMToolCommand(pack): mylog.info('ProjSpecialProcess OnGMToolCommand IN') #GM¹¤¾ß½Ó¿ÚÃüÁî #¶ÁÈ¡·â°üÊý¾Ý recvPack = RecvPackProtocol.tagGMCommand() recvPack.ReadData(pack.getBuffer()) orderLen = recvPack.OrderLen orderId = recvPack.OrderId cmdLen = recvPack.CmdLen cmd = recvPack.Cmd uerDataLen = recvPack.UserDataLen userData = recvPack.UserData #----------------------- #ÏîÄ¿×é¸ù¾ÝÃüÁîÀàÐͽøÐд¦Àí #----------------------- mylog.info('GM Tool Cmd->%s,orderId->%s'%(cmd, orderId)) funcName = '' try: # »ñµÃgmÃüÁîÐÅÏ¢ gmCmdDict = eval(cmd) funcName = gmCmdDict.get(GMCommon.Def_GMKey_Type, '') if funcName == None: GMCommandResult(orderId, gmCmdDict, GMCommon.Def_GMCmdNone) return # ת»»±àÂë¸ñʽ cmdDict = ChangeEncodIng(gmCmdDict) if cmdDict == {}: GMCommandResult(orderId, gmCmdDict, GMCommon.Def_EncodeFail) return gmCmdManger = GMCmdManger() gmCmdManger.gmCmdDict = cmdDict gmCmdManger.funcName = funcName gmCmdManger.orderId = orderId gmCmdManger.userData = userData gmCmdManger.pack = copy.deepcopy(pack) gmCmdManger.gmCmdDictUnEncode = gmCmdDict # ÃüÁî¼ÓÈë¹ÜÀíÆ÷ GetGMOrderMgr().AddCmd(orderId, gmCmdManger) # Ö´ÐÐÃüÁî gmCmdManger.GMToolCommand() except BaseException: mylog.info('GM cmd error - > %s'%(traceback.format_exc())) # ɾ³ý¸ÄgmÃüÁî GetGMOrderMgr().PopCmd(orderId) GMCommandResult(orderId, funcName, GMCommon.Def_GMDBEntranceFail) return #----------------------- mylog.info('ProjSpecialProcess OnGMToolCommand Done') return def OnGMToolCommandResult(pack): #GM¹¤¾ß½Ó¿ÚÃüÁî #¶ÁÈ¡·â°üÊý¾Ý sendpack = SendPackProtocol.tagGMCommandResult() sendpack.ReadData(pack.GetBuffer()) #·µ»ØÐ޸ĺóµÄ°ü return pack ################################################################## 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ÕÒ²»µ½¾ÍÊDz»´æÔÚ¸ÃÍæ¼Ò 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ÃüÁîÖ´ÐÐ # # gmÃüÁîÖ´ÐÐ class GMCmdManger: ## ³õʼ»¯ # @param self # @return ·µ»ØÖµ def __init__(self): self.Clear() return ## ³õʼ»¯ # @param self # @return ·µ»ØÖµ def Clear(self): self.gmCmdDict = {} self.funcName = '' self.orderId = 0 self.userData = None self.pack = None self.gmCmdDictUnEncode = {} # δתÂëµÄcmd£¬¸Ä°üʱºòÓà return ## ÊÕµ½ÃüÁ¿ªÊ¼Ö´ÐÐ # @param self # @return None def GMToolCommand(self): callFunc = GetExecFunc(Commands, "%s.%s"%(self.funcName, "OnExec")) execType = GMCommon.Def_SendToGameServer execInfo = '' if callFunc != None: execType, execInfo = callFunc(self.gmCmdDict) GetGMOrderMgr().PopCmd(self.orderId) GMCommandResult(self.orderId, self.funcName, execType, execInfo) ## gmÃüÁî¹ÜÀí # # gmÃüÁî¹ÜÀí class GMCmdOrderMgr: ## ³õʼ # @param self # @return None def __init__(self): self.__CmdOrderdict={} #key:OrderID,Value:GMCmdManger return ## Ìí¼Ó # @param self # @param orderId:gm±êʶ # @param cmdManger:Ìí¼ÓµÄgmÃüÁî # @return None def AddCmd(self, orderId, cmdManger): if orderId in self.__CmdOrderdict.keys(): mylog.warning("orderId = %s already exists,New cmd = %d"%(orderId, cmdManger.funcName)) return False self.__CmdOrderdict[orderId] = cmdManger return True ##ɾ³ý # @param self # @param orderId:gm±êʶ # @return None def PopCmd(self, orderId): return self.__CmdOrderdict.pop(orderId, None) ##²éÕÒ # @param self # @param orderId:gm±êʶ # @return None def GetCmd(self, orderId): return self.__CmdOrderdict.get(orderId, None) ## gmÃüÁî¹ÜÀí # @param None # @return ÃüÁî¹ÜÀíÆ÷ def GetGMOrderMgr(): global _GMCmdOrderMgr if _GMCmdOrderMgr != None: return _GMCmdOrderMgr _GMCmdOrderMgr = GMCmdOrderMgr() return _GMCmdOrderMgr ## º¯Êýµ÷Óà # @param curCallObj ʵÀý£¨¿ÉÄÜÊÇij¸öÎļþÃû£© # @param callName ʵÀýµÄij¸öÊôÐÔ # @return ÊôÐÔ def ParseNameGetObj(curCallObj, callName): callList = callName.split(".") if len(callList) <= 1: return None for curCallName in callList: if hasattr(curCallObj, curCallName) != True: #ÎÞ´ËÊôÐÔ return None curCallObj = getattr(curCallObj, curCallName) return curCallObj ## Íⲿµ÷ÓõĻñÈ¡ÊôÐÔ£¬ÇÒÊÇ¿ÉÒÔcallµÄ # @param curCallObj ʵÀý£¨¿ÉÄÜÊÇij¸öÎļþÃû£© # @param callName ʵÀýµÄij¸öÊôÐÔ # @return ¿ÉÒÔcallµÄÊôÐÔ # @remarks º¯ÊýÏêϸ˵Ã÷. def GetExecFunc(curCallObj, callName): curCallObj = ParseNameGetObj(curCallObj, callName) if curCallObj == None: return None if callable(curCallObj) != True: #²»¿Éµ÷Óà return None return curCallObj ## »Ø¸´gm # @param db: dbGameUserÊý¾Ý # @param gmCmdDict: gmÃüÁîÊý¾Ý # @param resultType: ½á¹ûÀàÐÍ # @param strMsg: ½á¹ûÐÅÏ¢ # @param useData: # @return None def GMCommandResult(orderId, gmCmd, resultType, strMsg=None, useData=''): resultDcit = {GMCommon.Def_GMKey_Type:gmCmd, GMCommon.Def_GMKey_ResultType:resultType, GMCommon.Def_GMKey_ResultMsg:strMsg} resultMsg = json.dumps(resultDcit, ensure_ascii=False) mylog.info("gm result:%s"%resultMsg) SendToGMToolCommandResult(orderId, resultMsg) return ## ת»»±àÂë¸ñʽ # @param gmCmdDict: gmÃüÁîÊý¾Ý # @return None def ChangeEncodIng(gmCmdDict): cmdDict = {} coding = gmCmdDict.get('coding', '') if coding == '': return cmdDict for key, value in gmCmdDict.items(): if not isinstance(value, str): continue # Ôö¼Óu try: value = value.replace("\r\n", "`r") value = value.replace("\'", "\\'") translateStr = eval("u'%s'"%value) translateStr = translateStr.encode(coding) except: mylog.info('translateStr error! srcStr = %s '%repr(value)) return cmdDict cmdDict[key] = translateStr return cmdDict