#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#  
 | 
##@package E:/GameSVN/U3DGame/ProjectSServer/ServerPython/CoreServerGroup/GameServer/Script/GM/GMShell.py  
 | 
# @todo:   
 | 
#  
 | 
# @author: Alee  
 | 
# @date 2017-9-8 ÉÏÎç11:28:31  
 | 
# @version 1.0  
 | 
#  
 | 
# @note:   
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
# @change: "2017-04-26 16:30" hxp ×ª»¯±àÂë¸ñʽ´¦Àíµ¥ÒýºÅ  
 | 
#---------------------------------------------------------------------  
 | 
#"""Version = 2017-04-26 16:30"""  
 | 
#---------------------------------------------------------------------  
 | 
import ChConfig  
 | 
import GameWorld  
 | 
import Commands  
 | 
import IPY_GameServer  
 | 
import CrossRealmMsg  
 | 
import PyGameData  
 | 
import traceback  
 | 
import GMCommon  
 | 
import ShareDefine  
 | 
import os  
 | 
#---------------------------------------------------------------------  
 | 
g_broadCastList = []  
 | 
  
 | 
## µ¼ÈëGMÈ«²¿ÃüÁî  
 | 
#  @param importDir Â·¾¶Ãû  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def ImportCommandAll(importDir):  
 | 
    curPath = ChConfig.GetAppPath() + "Script\\GM"  
 | 
    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 ChConfig.TYPE_Load_Module_Ext:  
 | 
                continue  
 | 
              
 | 
            fileName = fileName.replace("\\",".")  
 | 
            __import__(fileName)  
 | 
  
 | 
ImportCommandAll("Commands")  
 | 
  
 | 
## Ö´ÐÐGMÃüÁî  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def MapServer_RecvGMCMD(index,tick):  
 | 
    GameWorld.GetPsycoFunc(__Func_MapServer_RecvGMCMD)(index, tick)  
 | 
    return  
 | 
  
 | 
## Ö´ÐÐGMÃüÁî  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __Func_MapServer_RecvGMCMD(index, tick):  
 | 
    try:  
 | 
        gmCmd = IPY_GameServer.IPY_GGMCmd()  
 | 
        inputStr = gmCmd.GetMsg()  
 | 
        alist = inputStr.split()  
 | 
        if len(alist) == 0:  
 | 
            return   
 | 
          
 | 
        curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
          
 | 
        callFunName = alist[0]  
 | 
        # ÌØÊâµÄÃüÁî²»ÑéÖ¤GMµÈ¼¶£¬ÔÚMapServerÒÑÑéÖ¤Õ˺Š 
 | 
        if callFunName.startswith("@"):  
 | 
            callFunName = "GMS_%s" % (callFunName[1:].capitalize())  
 | 
              
 | 
        #ÅжÏÍæ¼ÒÊÇ·ñΪGM  
 | 
        elif curPlayer.GetGMLevel() == 0:  
 | 
            GameWorld.Log("###ʹÓÃGMÃüÁî = %s´íÎó,Íæ¼Ò²»ÊÇGM"%(callFunName), curPlayer.GetPlayerID())  
 | 
            return  
 | 
          
 | 
        #°ÑÊ£Óà²ÎÊýת»»ÎªÕûÐÍ  
 | 
        for i in range(0, len(alist)):  
 | 
            if i == 0:  
 | 
                continue  
 | 
            value = GameWorld.ToIntDef(alist[i], None)  
 | 
            if value == None:  
 | 
                #GameWorld.DebugAnswer(curPlayer, "²ÎÊý´íÎó, ²ÎÊý%s±ØÐëΪ´¿Êý×Ö!" % (i + 1))  
 | 
                continue  
 | 
            alist[i] = value  
 | 
              
 | 
        #·Ç¿ç·þ·þÎñÆ÷ÏÂʹÓÿç·þGMÃüÁÔò·¢Ë͵½¿ç·þ  
 | 
        if not GameWorld.IsCrossServer():  
 | 
            callFunc = GameWorld.GetExecFunc(Commands, "%s.%s"%(callFunName, "OnGetMergeParam"))  
 | 
            if callFunc != None:  
 | 
                extendParamList = callFunc(curPlayer)  
 | 
                CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_GMCMD, alist + extendParamList)  
 | 
                  
 | 
        callFunc = GameWorld.GetExecFunc(Commands, "%s.%s"%(callFunName, "OnExec"))  
 | 
        if callFunc == None:  
 | 
            #ûÓдËÃüÁî  
 | 
            GameWorld.Log("###ʹÓÃGMÃüÁî = %s, Ã»ÓиÃÃüÁî!" % callFunName, curPlayer.GetPlayerID())  
 | 
            GameWorld.DebugAnswer(curPlayer, 'no cmd !!!')  
 | 
            return  
 | 
          
 | 
        callFunc(curPlayer, alist[1:])  
 | 
          
 | 
    except BaseException:  
 | 
        GameWorld.DebugAnswer(curPlayer, "Ö´ÐÐGMÃüÁî´íÎó, Çë²é¿´GameServerÈÕÖ¾!")  
 | 
        errorMsg = str(traceback.format_exc())  
 | 
        GameWorld.ErrLog('GMÃüÁî´íÎó - > %s'%(errorMsg) , curPlayer.GetPlayerID())  
 | 
        #=======================================================================  
 | 
        # if GameWorld.GetGameWorld().GetDebugLevel():  
 | 
        #    raise BaseException(errorMsg)  
 | 
        #=======================================================================  
 | 
        return  
 | 
#---------------------------------------------------------------------  
 | 
#===============================================================================  
 | 
#DBGMCommon      
 | 
#    int      GetCmdIndex()   #ÐòÁкŠ 
 | 
#    int      GetPostTime()   #Ìύʱ¼ä  
 | 
#    char *      GetGMAcc()   #GMÕʺŠ 
 | 
#    int      GetCMDLen()     #GMÃüÁ¶È  
 | 
#    char *      GetCMD()     #»ñȡִÐеÄGMÃüÁî  
 | 
#===============================================================================  
 | 
## Ö´ÐÐÊý¾Ý¿âÖеÄGMÃüÁî  
 | 
#  @param dBGMCommon  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def DoLogic_DBGMCommon(dBGMCommon):  
 | 
#    callList = dBGMCommon.GetCMD()  
 | 
#    callList = callList.split()  
 | 
#    #cmd²ÎÊýË÷Òý  
 | 
#    cmdIndex = dBGMCommon.GetCmdIndex()  
 | 
#      
 | 
#    try:  
 | 
#        callName = callList[0]  
 | 
#    except BaseException:  
 | 
#        GameWorld.Log( '###¶ÁÈ¡Êý¾Ý¿âGMÃüÁîʧ°Ü,¸ñʽ´íÎó = %s'%(callList) )  
 | 
#        GMCommon.Send_DataServer_GMCommandResult( cmdIndex, ChConfig.Def_GMTool_Fail )  
 | 
#        return  
 | 
#          
 | 
#    callFunc = GameWorld.GetExecFunc(Commands, "%s.%s"%(callName, "OnExec"))  
 | 
#    if not callFunc:  
 | 
#        GameWorld.Log( '###¶ÁÈ¡Êý¾Ý¿âGMÃüÁîÒì³££¬ÎÞ´ËGMÃüÁî = %s'%(callName) )  
 | 
#        GMCommon.Send_DataServer_GMCommandResult( cmdIndex, ChConfig.Def_GMTool_Fail )  
 | 
#        return  
 | 
#      
 | 
#    del callList[0]  
 | 
#      
 | 
#    sameList = [ cmdIndex , dBGMCommon.GetGMAcc() ]  
 | 
#    callList = sameList + callList  
 | 
#      
 | 
#    #²ÎÊý0:cmdIndex,²ÎÊý1:GMAcc,²ÎÊý2..:GMÃüÁîÐèÒªµÄ²ÎÊý  
 | 
#    try:  
 | 
#        callFunc(None, callList)  
 | 
#    except BaseException , e:  
 | 
#        GameWorld.Log( '###¶ÁÈ¡Êý¾Ý¿âGMÃüÁî´íÎó, = %s , %s'%(e , callList) )  
 | 
#        GMCommon.Send_DataServer_GMCommandResult( cmdIndex, ChConfig.Def_GMTool_Fail )  
 | 
#      
 | 
    return  
 | 
  
 | 
  
 | 
## Ö´ÐÐGM¹¤¾ßÃüÁî  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def GMTool_RecvCMD(index, tick):  
 | 
  
 | 
    gmToolCMD = IPY_GameServer.IPY_GGMToolCommand()  
 | 
    cmd = gmToolCMD.GetCmd()  
 | 
    orderId = gmToolCMD.GetOrderId()  
 | 
      
 | 
    try:  
 | 
        # »ñµÃgmÃüÁîÐÅÏ¢  
 | 
        gmCmdDict = eval(cmd)            
 | 
        gmType = gmCmdDict.get(GMCommon.Def_GMKey_Type, '')    
 | 
  
 | 
        if gmType == None:                          
 | 
            GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_GMCmdNone)  
 | 
            return   
 | 
          
 | 
        callFunc = GameWorld.GetExecFunc(Commands, "%s.%s"%(gmType, "OnExec"))  
 | 
        if callFunc == None:  
 | 
            #gmÃüÁî²»¿ÉʹÓà  
 | 
  
 | 
            GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_GMCmdNone)  
 | 
            return   
 | 
  
 | 
        # ×ª»»±àÂë¸ñʽ  
 | 
        cmdDict = ChangeEncodIng(gmCmdDict)   
 | 
        if cmdDict == {}:  
 | 
            GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_EncodeFail)  
 | 
            return  
 | 
          
 | 
        callFunc(orderId, cmdDict)  
 | 
          
 | 
    except BaseException:  
 | 
        GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_GMGSEntranceFail)  
 | 
        GameWorld.RaiseException('GMÃüÁî´íÎó\r\n%s'%(traceback.format_exc()))  
 | 
        return   
 | 
  
 | 
    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:  
 | 
            GameWorld.Log('translateStr error! srcStr = %s '%repr(value))  
 | 
            return {}  
 | 
          
 | 
        cmdDict[key] = translateStr  
 | 
          
 | 
    return cmdDict  
 | 
  
 | 
## ÊÕµ½×Ó·þÎñÆ÷·¢Ë͵ÄGMÃüÁî  
 | 
def ClientServerMsg_GMCMD(cmdMsgList, tick):  
 | 
    if len(cmdMsgList) == 0:  
 | 
        return   
 | 
      
 | 
    callName = "%s.%s" % (cmdMsgList[0], "OnMergeServerExec")  
 | 
    callFunc = GameWorld.GetExecFunc(Commands, callName)  
 | 
    if callFunc == None:  
 | 
        GameWorld.ErrLog("ÕÒ²»µ½´ËGMÃüÁî´¦Àíº¯Êý%s" % callName)  
 | 
        return  
 | 
      
 | 
    GameWorld.Log("Ö´ÐÐ×Ó·þÇëÇóµÄGMÃüÁ%s" % str(cmdMsgList))  
 | 
    #Ö»½«Êµ¼Ê²ÎÊý´«Èë  
 | 
    callFunc(cmdMsgList[1:], tick)  
 | 
    return  
 | 
  
 | 
def AddOfflinePlayerGMTInfo(orderId, queryType, playerFind, gmCmdDict):  
 | 
    # Íæ¼Ò²»ÔÚÏߣ¬ÏȼǼ£¬µÈÍæ¼ÒÉÏÏߺó´¦Àí£¬¿ª¹Ø·þºóÎÞЧ  
 | 
    key = (queryType, playerFind)  
 | 
    ctgInfoList = PyGameData.g_gmtOfflinePlayerInfo.get(key, [])  
 | 
    ctgInfoList.append(gmCmdDict)  
 | 
    PyGameData.g_gmtOfflinePlayerInfo[key] = ctgInfoList  
 | 
    GameWorld.Log("ÀëÏßÍæ¼ÒÌí¼ÓGMT: g_gmtOfflinePlayerInfo=%s" % str(PyGameData.g_gmtOfflinePlayerInfo))  
 | 
    GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_Success, "Player is off line.")  
 | 
    return  
 | 
  
 | 
def OnPlayerLogin(curPlayer):  
 | 
    gmtList = []  
 | 
    nameKey = (ChConfig.queryType_sqtPlayerByName, curPlayer.GetName())  
 | 
    if nameKey in PyGameData.g_gmtOfflinePlayerInfo:  
 | 
        gmtList += PyGameData.g_gmtOfflinePlayerInfo.pop(nameKey)  
 | 
          
 | 
    accIDKey = (ChConfig.queryType_sqtPlayerByAccID, curPlayer.GetAccID())  
 | 
    if accIDKey in PyGameData.g_gmtOfflinePlayerInfo:  
 | 
        gmtList += PyGameData.g_gmtOfflinePlayerInfo.pop(accIDKey)  
 | 
          
 | 
    if not gmtList:  
 | 
        return  
 | 
      
 | 
    tagMapID = curPlayer.GetRealMapID()  
 | 
    GameWorld.Log("ÀëÏßÍæ¼ÒÉÏÏßGMT: tagMapID=%s, %s" % (tagMapID, gmtList), curPlayer.GetPlayerID())  
 | 
    if not tagMapID:  
 | 
        return  
 | 
      
 | 
    for gmCmdDict in gmtList:  
 | 
        pack_type = gmCmdDict.get("pack_type")  
 | 
        if not pack_type:  
 | 
            continue  
 | 
          
 | 
        callFunc = GameWorld.GetExecFunc(Commands, "%s.%s"%(pack_type, "OnOfflineCTGInfo"))  
 | 
        if callFunc:  
 | 
            GameWorld.Log("Íæ¼ÒÉÏÏßÖ´ÐÐGMT: %s, tagMapID=%s, %s" % (pack_type, tagMapID, gmCmdDict), curPlayer.GetPlayerID())  
 | 
            callFunc(curPlayer, tagMapID, gmCmdDict)  
 | 
              
 | 
    return  
 | 
  
 |