#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package GM.Commands.GMT_CrossActServerIDChange  
 | 
#  
 | 
# @todo:¿ç·þ»î¶¯Çø·þIDÐÞ¸Ä  
 | 
# @author hxp  
 | 
# @date 2021-01-13  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: ¿ç·þ»î¶¯Çø·þIDÐÞ¸Ä  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#"""Version = 2021-01-13 17:00"""  
 | 
#-------------------------------------------------------------------------------  
 | 
  
 | 
import GameWorld  
 | 
import DataRecordPack  
 | 
import CrossActionControl  
 | 
import CrossRealmMsg  
 | 
import ShareDefine  
 | 
import GMCommon  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
## Ö´ÐÐÂß¼  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param gmCmdDict: ÃüÁî×Öµä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def OnExec(orderId, gmCmdDict):  
 | 
      
 | 
    GameWorld.Log("GMT_CrossActServerIDChange gmCmdDict=%s" % str(gmCmdDict))  
 | 
      
 | 
    if not GameWorld.IsCrossServer():  
 | 
        GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_IsNotCrossServer)  
 | 
        return  
 | 
      
 | 
    errInfo = ""  
 | 
    doChange = gmCmdDict.get("doChange")  
 | 
    if doChange:  
 | 
        errInfo = __DoChangeCrossActServerIDRangeList(gmCmdDict)  
 | 
          
 | 
    crossActInfoDict = CrossActionControl.GetCrossActInfoDict()  
 | 
    backMsg = {"crossActInfoDict":crossActInfoDict}  
 | 
    if errInfo:  
 | 
        backMsg["ErrorInfo"] = errInfo.decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding())  
 | 
        GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ParamErr, backMsg)  
 | 
        return  
 | 
      
 | 
    # ¼Ç¼Á÷Ïò  
 | 
    DataRecordPack.DR_ToolGMOperate(0, '', '', 'GMT_CrossActServerIDChange', str(gmCmdDict))  
 | 
    # »Ø¸´  
 | 
    GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_Success, backMsg)  
 | 
    return  
 | 
      
 | 
def __DoChangeCrossActServerIDRangeList(gmCmdDict):  
 | 
      
 | 
    crossActInfoDict = CrossActionControl.GetCrossActInfoDict()  
 | 
    changeInfoDict = {} # {actName:{cfgID:ServerIDList, ...}, ...}  
 | 
    for k, v in gmCmdDict.items():  
 | 
        if not k.endswith("_ServerIDRangeList"):  
 | 
            continue  
 | 
        kspList = k.split("_")  
 | 
        if len(kspList) != 3:  
 | 
            continue  
 | 
        actName, cfgID, _ = kspList  
 | 
        if actName not in ShareDefine.CrossActLockServerGroupIDList:  
 | 
            errInfo = "%s ²»ÔÊÐíÐ޸ģ¬¿ÉÒÔÖ±½ÓÐ޸ĻÅäÖÃ±í½øÐÐÈȸü£¡" % actName  
 | 
            return errInfo  
 | 
        try:  
 | 
            cfgID = int(cfgID)  
 | 
            changeServerIDList = eval(v)  
 | 
            # ¼ì²éÐ޸ĸñʽÊÇ·ñÕýÈ·  
 | 
            for changeList in changeServerIDList:  
 | 
                if not (isinstance(changeList, list)   
 | 
                        and len(changeList) == 2   
 | 
                        and isinstance(changeList[0], int)   
 | 
                        and isinstance(changeList[1], int)  
 | 
                        ):  
 | 
                    errInfo = "%s CfgID(%s) error serverIDList(%s)" % (actName, cfgID, changeList)  
 | 
                    return errInfo  
 | 
        except:  
 | 
            errInfo = "%s CfgID(%s) error %s" % (actName, cfgID, v)  
 | 
            return errInfo  
 | 
          
 | 
        if actName not in changeInfoDict:  
 | 
            changeInfoDict[actName] = {}  
 | 
        changeInfoDict[actName][cfgID] = changeServerIDList  
 | 
          
 | 
    GameWorld.Log("    crossActInfoDict=%s" % crossActInfoDict)  
 | 
    GameWorld.Log("    changeInfoDict=%s" % changeInfoDict)  
 | 
    if not changeInfoDict:  
 | 
        errInfo = "no change info!"  
 | 
        return errInfo  
 | 
      
 | 
    # ¼ì²éÐ޸ĺóÊÇ·ñÓн»²æ  
 | 
    checkGroupInfo = {} # {actName:{actGroupName:[cfgID, ...], ...}} # ÏÈ·Ö×é  
 | 
    for actName, actInfoDict in crossActInfoDict.items():  
 | 
        if actName not in changeInfoDict:  
 | 
            # Ã»ÓÐÐ޸ĵĻ²»ÐèÒª¼ì²é  
 | 
            continue  
 | 
        if actName not in checkGroupInfo:  
 | 
            checkGroupInfo[actName] = {}  
 | 
        actGroupListDict = checkGroupInfo[actName]  
 | 
        for cfgID, actInfo in actInfoDict.items():  
 | 
            actGroupName = actInfo[ShareDefine.ActKey_IpyDataInfo]["ActGroupName"]  
 | 
            if actGroupName not in actGroupListDict:  
 | 
                actGroupListDict[actGroupName] = []  
 | 
            cfgIDList = actGroupListDict[actGroupName]  
 | 
            cfgIDList.append(cfgID)  
 | 
              
 | 
    GameWorld.Log("    checkGroupInfo: %s" % checkGroupInfo)  
 | 
      
 | 
    for actName, actGroupListDict in checkGroupInfo.items():  
 | 
        actInfoDict = crossActInfoDict[actName]  
 | 
        changeInfo = changeInfoDict.get(actName, {})  
 | 
        for actGroupName, cfgIDList in actGroupListDict.items():  
 | 
            allServerIDRangeList = []  
 | 
            for cfgID in cfgIDList:  
 | 
                befActInfo = actInfoDict[cfgID]  
 | 
                if cfgID in changeInfo:  
 | 
                    allServerIDRangeList.extend(changeInfo[cfgID])  
 | 
                else:  
 | 
                    befServerIDList = befActInfo[ShareDefine.ActKey_ServerIDRangeList]  
 | 
                    allServerIDRangeList.extend(befServerIDList)  
 | 
                      
 | 
            GameWorld.Log("    actName=%s,actGroupName=%s,cfgIDList=%s" % (actName, actGroupName, cfgIDList))  
 | 
            GameWorld.Log("        allServerIDRangeList=%s" % (allServerIDRangeList))  
 | 
            errorServerIDList = []  
 | 
            for i in xrange(len(allServerIDRangeList)):  
 | 
                checkIDA, checkIDB = allServerIDRangeList[i]  
 | 
                for j in xrange(i):  
 | 
                    serverIDA, serverIDB = allServerIDRangeList[j]  
 | 
                    if serverIDA <= checkIDA <= serverIDB:  
 | 
                        errorServerIDList.append(checkIDA)  
 | 
                          
 | 
                    if serverIDA <= checkIDB <= serverIDB:  
 | 
                        errorServerIDList.append(checkIDB)  
 | 
                          
 | 
            GameWorld.Log("        errorServerIDList=%s" % (errorServerIDList))  
 | 
            if errorServerIDList:  
 | 
                return "%s exist errorServerIDList=%s in actGroupName(%s)" % (actName, errorServerIDList, actGroupName)  
 | 
              
 | 
    # ¼ì²éͨ¹ýºó½øÐÐÐÞ¸Ä  
 | 
    sysnCrossActInfoDict = {}  
 | 
    GameWorld.Log("    do change...")  
 | 
    for actName, changInfo in changeInfoDict.items():  
 | 
        for cfgID, changeServerIDRangeList in changInfo.items():  
 | 
            if actName not in crossActInfoDict:  
 | 
                continue  
 | 
            if cfgID not in crossActInfoDict[actName]:  
 | 
                continue  
 | 
            actInfoDict = crossActInfoDict[actName][cfgID]  
 | 
            beforeServerIDRangeList = actInfoDict[ShareDefine.ActKey_ServerIDRangeList]  
 | 
            # Ö±½Ó¸²¸ÇÌæ»»  
 | 
            actInfoDict[ShareDefine.ActKey_ServerIDRangeList] = changeServerIDRangeList  
 | 
                          
 | 
            GameWorld.Log("        actName=%s,cfgID=%s,beforeServerIDRangeList=%s -> %s"   
 | 
                          % (actName, cfgID, beforeServerIDRangeList, changeServerIDRangeList))  
 | 
              
 | 
            if actName not in sysnCrossActInfoDict:  
 | 
                sysnCrossActInfoDict[actName] = {}  
 | 
            sysnCrossActInfoDict[actName][cfgID] = actInfoDict  
 | 
              
 | 
    GameWorld.Log("    changeOK! crossActInfoDict=%s" % crossActInfoDict)  
 | 
      
 | 
    # Í¬²½×Ó·þÎñÆ÷  
 | 
    serverGroupIDList = []  
 | 
    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossActInfo, sysnCrossActInfoDict, serverGroupIDList)  
 | 
    return ""  
 | 
  
 |