#!/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)
|
|
##################################################################
|
####### 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
|
|
|
|
|
##################################################################
|
|
|
## 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
|
|
|