| | |
| | |
|
| | | key = "OperationActionInfo"
|
| | | openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
|
| | | isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer)
|
| | | mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1
|
| | | OperationActionInfo = IpyGameDataPY.GetConfigEx(key)
|
| | | serverTime = GameWorld.GetServerTime()
|
| | | curHour = serverTime.hour
|
| | | reloadSignHour = 0 if curHour < 5 else 5
|
| | | reloadSign = "%s_%s" % (openServerDay, reloadSignHour)
|
| | | reloadSign = [openServerDay, isMixServer, mixServerDay, reloadSignHour]
|
| | | if OperationActionInfo and OperationActionInfo[OperationAction_ReloadSign] == reloadSign:
|
| | | #GameWorld.DebugLog("已经加载过本日运营活动处理信息!openServerDay=%s" % openServerDay)
|
| | | return False, OperationActionInfo
|
| | |
| | | curDateTime = datetime.datetime.strptime(curDateTimeStr, ChConfig.TYPE_Time_Format)
|
| | |
|
| | | customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) # 定制运营活动最大开服天
|
| | | maxCustomServerDayMix = IpyGameDataPY.GetFuncCfg("MixServer", 1) # 定制运营活动最大合服天
|
| | | operationActionDict = {}
|
| | | mapServerOperationActionDict = {}
|
| | | serverID = GameWorld.GetServerID()
|
| | | serverGroupID = GameWorld.GetServerGroupID()
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | |
|
| | | GameWorld.Log("===== 加载本日运营活动信息: %s, serverID=%s,openServerDay=%s,customMaxServerDay=%s,reloadSign=%s =====" |
| | | % (curDateTime, serverID, openServerDay, customMaxServerDay, reloadSign))
|
| | | GameWorld.Log("===== 加载本日运营活动信息: %s, serverGroupID=%s,openServerDay=%s,customMaxServerDay=%s,isMixServer=%s,mixServerDay=%s,maxCustomServerDayMix=%s,reloadSign=%s =====" |
| | | % (curDateTime, serverGroupID, openServerDay, customMaxServerDay, isMixServer, mixServerDay, maxCustomServerDayMix, reloadSign))
|
| | |
|
| | | for actName in ShareDefine.OperationActionNameList:
|
| | |
|
| | | # 取出本活动所属本服ID的所有配置
|
| | | curServerActIpyDataList = __GetOperationActionServerIpyDataList(ipyDataMgr, serverID, actName)
|
| | | GameWorld.Log("加载运营活动: actName=%s,可处理条数=%s" % (actName, len(curServerActIpyDataList)))
|
| | | GameWorld.Log("加载运营活动: actName=%s" % (actName))
|
| | | curServerActIpyDataList = __GetOperationActionServerIpyDataList(ipyDataMgr, serverGroupID, actName)
|
| | | GameWorld.Log(" 可处理条数=%s" % (len(curServerActIpyDataList)))
|
| | | needStartList = [] # [startDateTime, ...]
|
| | | needEndList = [] # [endDateTime, ...]
|
| | | needNotifyDict = {} # {notifyDateTime:[notifyKey, [参数]], ...}
|
| | |
| | | # 注意:每个活动配置会有多个活动时间点,但是有且只能生效一条活动配置,换句话说就是每个活动配置时间不允许交叉
|
| | | for ipyData in curServerActIpyDataList:
|
| | |
|
| | | serverGroupIDList = [] if not hasattr(ipyData, "ServerGroupIDList") else ipyData.GetServerGroupIDList()
|
| | | serverGroupIDListExcept = [] if not hasattr(ipyData, "ServerGroupIDListExcept") else ipyData.GetServerGroupIDListExcept()
|
| | | cfgID = ipyData.GetCfgID()
|
| | | startDateStr = ipyData.GetStartDate()
|
| | | endDateStr = ipyData.GetEndDate()
|
| | | GameWorld.Log(" cfgID=%s,mark=%s,serverIDList=%s,startDateStr=%s,endDateStr=%s,openServerDay=%s,curDateTime=%s" |
| | | % (cfgID, ipyData.GetActMark(), ipyData.GetServerIDList(), startDateStr, endDateStr, openServerDay, curDateTime))
|
| | | GameWorld.Log(" cfgID=%s,serverGroupIDList=%s,Except=%s,startDateStr=%s,endDateStr=%s,openServerDay=%s,isMixServer=%s,mixServerDay=%s,maxCustomServerDayMix=%s,curDateTime=%s" |
| | | % (cfgID, serverGroupIDList, serverGroupIDListExcept, startDateStr, endDateStr, openServerDay, isMixServer, mixServerDay, maxCustomServerDayMix, curDateTime))
|
| | | # 按开服天开的
|
| | | if startDateStr.isdigit() and endDateStr.isdigit():
|
| | | startServerDay, endServerDay = int(startDateStr), int(endDateStr)
|
| | |
| | | startDateStr = "%d-%d-%d" % (openServerDateTime.year, openServerDateTime.month, openServerDateTime.day)
|
| | | endDateStr = "%d-%d-%d" % (endServerDateTime.year, endServerDateTime.month, endServerDateTime.day)
|
| | | GameWorld.Log(" 开服天转化为日期: %s ~ %s" % (startDateStr, endDateStr))
|
| | | elif startDateStr.startswith("Mix") and endDateStr.startswith("Mix"):
|
| | | if not isMixServer:
|
| | | GameWorld.Log(" 非合服服务器,不处理! cfgID=%s,%s ~ %s" % (cfgID, startDateStr, endDateStr))
|
| | | continue
|
| | | startMixServerDay, endMixServerDay = int(startDateStr[3:]), int(endDateStr[3:])
|
| | | #结束日可能还需要处理广播之类,所以这里需要+1
|
| | | if mixServerDay > endMixServerDay + 1:
|
| | | GameWorld.Log(" 当前合服天超过活动结束合服天,不处理! cfgID=%s,%s ~ %s < mixServerDay(%s)" % (cfgID, startDateStr, endDateStr, mixServerDay))
|
| | | continue
|
| | | openServerDateTime = curDateTime + datetime.timedelta(days=(startMixServerDay-mixServerDay))
|
| | | endServerDateTime = curDateTime + datetime.timedelta(days=(endMixServerDay-mixServerDay))
|
| | | startDateStr = "%d-%d-%d" % (openServerDateTime.year, openServerDateTime.month, openServerDateTime.day)
|
| | | endDateStr = "%d-%d-%d" % (endServerDateTime.year, endServerDateTime.month, endServerDateTime.day)
|
| | | GameWorld.Log(" 合服天转化为日期: %s ~ %s" % (startDateStr, endDateStr))
|
| | | elif actName not in ShareDefine.FeastOperationActionNameList:
|
| | | if openServerDay <= customMaxServerDay:
|
| | | GameWorld.Log(" 按日期开的在开服定制限制天内,不处理! cfgID=%s,%s ~ %s,openServerDay=%s" % (cfgID, startDateStr, endDateStr, openServerDay))
|
| | |
| | | GameWorld.Log(" 按日期开的开始日期在开服定制限制天内,不处理! cfgID=%s,curStartDateTime=%s,customMaxServerDateTime=%s" % (cfgID, curStartDateTime, customMaxServerDateTime))
|
| | | continue
|
| | |
|
| | | if isMixServer:
|
| | | if mixServerDay <= maxCustomServerDayMix:
|
| | | GameWorld.Log(" 按日期开的在合服定制限制天内,不处理! cfgID=%s,%s ~ %s,mixServerDay=%s" % (cfgID, startDateStr, endDateStr, mixServerDay))
|
| | | continue
|
| | | mixStartServerDateTime = curDateTime + datetime.timedelta(days=(1-mixServerDay)) # 合服第一天的日期
|
| | | customMaxServerDateTime = curDateTime + datetime.timedelta(days=(maxCustomServerDayMix-mixServerDay))
|
| | | curStartDateTime = datetime.datetime.strptime("%s %02d:%02d:%02d" % (startDateStr, customMaxServerDateTime.hour, customMaxServerDateTime.minute, |
| | | customMaxServerDateTime.second), ChConfig.TYPE_Time_Format)
|
| | | if mixStartServerDateTime <= curStartDateTime <= customMaxServerDateTime:
|
| | | GameWorld.Log(" 按日期开的开始日期在合服定制限制天内,不处理! cfgID=%s,mixStartServerDateTime=%s,curStartDateTime=%s,customMaxServerDateTime=%s" % (cfgID, mixStartServerDateTime, curStartDateTime, customMaxServerDateTime))
|
| | | continue
|
| | | |
| | | if hasattr(ipyData, "GetStartTimeList") and hasattr(ipyData, "GetEndTimeList"):
|
| | | startHMStrList = ipyData.GetStartTimeList()
|
| | | endHMStrList = ipyData.GetEndTimeList()
|
| | |
| | |
|
| | | return True, OperationActionInfo
|
| | |
|
| | | def __GetOperationActionServerIpyDataList(ipyDataMgr, serverID, actName):
|
| | | def __GetOperationActionServerIpyDataList(ipyDataMgr, serverGroupID, actName):
|
| | | ## 获取运营活动本服务器对应的配置数据列表
|
| | |
|
| | | if not hasattr(ipyDataMgr, "Get%sCount" % actName):
|
| | | GameWorld.ErrLog("没有该运营活动类型对应活动时间表! actName=%s" % actName)
|
| | | return []
|
| | |
|
| | | # 所有配置先按活动标识归组
|
| | | platform = GameWorld.GetPlatform()
|
| | | actGroupDict = {} # {ActMark:{ServerIDTuple:[ipyData, ...], ...}, ...}
|
| | | curServerActIpyDataList = []
|
| | | actCfgCount = getattr(ipyDataMgr, "Get%sCount" % actName)()
|
| | | for cfgIndex in xrange(actCfgCount):
|
| | | ipyData = getattr(ipyDataMgr, "Get%sByIndex" % actName)(cfgIndex)
|
| | | actMark = ipyData.GetActMark()
|
| | | platformList = [] if not hasattr(ipyData, "GetPlatformList") else ipyData.GetPlatformList()
|
| | | if platformList and platform not in platformList:
|
| | | GameWorld.Log("非本平台活动,不取!platform=%s,platformList=%s,actName=%s,cfgID=%s" % (platform, platformList, actName, ipyData.GetCfgID()))
|
| | | continue
|
| | | serverIDTuple = tuple(ipyData.GetServerIDList())
|
| | | ipyData = getattr(ipyDataMgr, "Get%sByIndex" % actName)(cfgIndex) |
| | | serverGroupIDList = [] if not hasattr(ipyData, "ServerGroupIDList") else ipyData.GetServerGroupIDList()
|
| | | serverGroupIDListExcept = [] if not hasattr(ipyData, "ServerGroupIDListExcept") else ipyData.GetServerGroupIDListExcept()
|
| | |
|
| | | serverIpyDataDict = actGroupDict.get(actMark, {})
|
| | | ipyDataList = serverIpyDataDict.get(serverIDTuple, [])
|
| | | ipyDataList.append(ipyData)
|
| | | serverIpyDataDict[serverIDTuple] = ipyDataList
|
| | | actGroupDict[actMark] = serverIpyDataDict
|
| | | |
| | | # 取出所属本服ID的所有配置
|
| | | curServerActIpyDataList = []
|
| | | for actMark, serverIpyDataDict in actGroupDict.items():
|
| | | generalIpyDataList = []
|
| | | isGeneral = True
|
| | | for serverIDTuple, ipyDataList in serverIpyDataDict.items():
|
| | | if not serverIDTuple:
|
| | | generalIpyDataList = ipyDataList
|
| | | continue
|
| | | for serverIDInfo in serverIDTuple:
|
| | | if (isinstance(serverIDInfo, int) and serverIDInfo == serverID) \
|
| | | or ((isinstance(serverIDInfo, list) or isinstance(serverIDInfo, tuple)) \
|
| | | and len(serverIDInfo) == 2 and serverIDInfo[0] <= serverID <= serverIDInfo[1]):
|
| | | curServerActIpyDataList += ipyDataList
|
| | | isGeneral = False
|
| | | # 排除的服务器组ID列表
|
| | | if serverGroupIDListExcept:
|
| | | isExcept = False
|
| | | for serverGroupIDInfo in serverGroupIDListExcept:
|
| | | if (isinstance(serverGroupIDInfo, int) and serverGroupIDInfo == serverGroupID) \
|
| | | or ((isinstance(serverGroupIDInfo, list) or isinstance(serverGroupIDInfo, tuple)) \
|
| | | and len(serverGroupIDInfo) == 2 and serverGroupIDInfo[0] <= serverGroupID <= serverGroupIDInfo[1]):
|
| | | isExcept = True
|
| | | break
|
| | | if isGeneral:
|
| | | curServerActIpyDataList += generalIpyDataList
|
| | | if isExcept:
|
| | | continue
|
| | | |
| | | if not serverGroupIDList:
|
| | | curServerActIpyDataList.append(ipyData)
|
| | | else:
|
| | | for serverGroupIDInfo in serverGroupIDList:
|
| | | if (isinstance(serverGroupIDInfo, int) and serverGroupIDInfo == serverGroupID) \
|
| | | or ((isinstance(serverGroupIDInfo, list) or isinstance(serverGroupIDInfo, tuple)) \
|
| | | and len(serverGroupIDInfo) == 2 and serverGroupIDInfo[0] <= serverGroupID <= serverGroupIDInfo[1]):
|
| | | curServerActIpyDataList.append(ipyData)
|
| | | break
|
| | | |
| | | return curServerActIpyDataList
|
| | |
|
| | | def Dispose_OperationActionState(reloadRefresh=False):
|
| | |
| | | GameWorld.Log(" 本周定制的开服日常活动ID列表: %s" % (customDailyIDList))
|
| | | GameWorld.Log(" 今天定制的开服日常表ID列表=%s" % (todayCustomIDList))
|
| | | elif isMixServer and mixServerDay <= maxCustomServerDayMix:
|
| | | customIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("DailyActionCustomMix", mixServerDay)
|
| | | if not customIpyDataList:
|
| | | customIpyDataList = []
|
| | | GameWorld.Log(" 今天定制的合服日常活动条数: %s" % len(customIpyDataList))
|
| | | for customIpyData in customIpyDataList:
|
| | | todayCustomIDList = [] # 今天定制的数据表ID
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for i in xrange(ipyDataMgr.GetDailyActionCustomMixCount()):
|
| | | customIpyData = ipyDataMgr.GetDailyActionCustomMixByIndex(i)
|
| | | dataID = customIpyData.GetID()
|
| | | dailyID = customIpyData.GetDailyID()
|
| | | if dailyID not in customDailyIDList:
|
| | | customDailyIDList.append(dailyID)
|
| | | customType = 2
|
| | | dailyTimeInfoList.append([customType, customIpyData.GetOpenTimeList(), customIpyData])
|
| | | GameWorld.Log(" 增加本日合服日常活动信息: customType=%s,dailyID=%s,dataID=%s" % (customType, dailyID, dataID))
|
| | | GameWorld.Log(" 今天定制的合服日常活动ID列表: %s" % (customDailyIDList))
|
| | | if customIpyData.GetMixServerDay() == mixServerDay:
|
| | | todayCustomIDList.append(dataID)
|
| | | customType = 2
|
| | | dailyTimeInfoList.append([customType, customIpyData.GetOpenTimeList(), customIpyData])
|
| | | GameWorld.Log(" 增加本日合服日常活动信息: customType=%s,dailyID=%s,dataID=%s" % (customType, dailyID, dataID))
|
| | | GameWorld.Log(" 定制的合服日常活动ID列表: %s" % (customDailyIDList))
|
| | | GameWorld.Log(" 今天定制的合服日常表ID列表=%s" % (todayCustomIDList))
|
| | | else:
|
| | | GameWorld.Log(" 超过最大定制开服天,不定制,走常规日常配置!")
|
| | |
|
| | |
| | | GameWorld.Log(" 本周定制的开服副本地图列表: %s" % (customMapIDList))
|
| | | GameWorld.Log(" 今天定制的开服副本表ID列表=%s" % (todayCustomIDList))
|
| | | elif isMixServer and mixServerDay <= maxCustomServerDayMix:
|
| | | customIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("FBStateTimeCustomMix", mixServerDay)
|
| | | if not customIpyDataList:
|
| | | customIpyDataList = []
|
| | | GameWorld.Log(" 本日定制的合服副本活动条数: %s" % len(customIpyDataList))
|
| | | for customIpyData in customIpyDataList:
|
| | | todayCustomIDList = [] # 今天定制的数据表ID
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for i in xrange(ipyDataMgr.GetFBStateTimeCustomMixCount()):
|
| | | customIpyData = ipyDataMgr.GetFBStateTimeCustomMixByIndex(i)
|
| | | dataID = customIpyData.GetID()
|
| | | dataMapID = customIpyData.GetDataMapID()
|
| | | if dataMapID not in customMapIDList:
|
| | | customMapIDList.append(dataMapID)
|
| | | customType, startWeekDay, endWeekDay = 2, curWeekDay, curWeekDay
|
| | | fbStateTimeInfoList.append([customType, startWeekDay, endWeekDay, customIpyData])
|
| | | GameWorld.Log(" 今天要处理的合服副本状态配置: customType=%s,dataID=%s" % (customType, dataID))
|
| | | GameWorld.Log(" 本日定制的合服副本地图列表: %s" % (customMapIDList))
|
| | | if customIpyData.GetMixServerDay() == mixServerDay:
|
| | | todayCustomIDList.append(dataID)
|
| | | customType, startWeekDay, endWeekDay = 2, curWeekDay, curWeekDay
|
| | | fbStateTimeInfoList.append([customType, startWeekDay, endWeekDay, customIpyData])
|
| | | GameWorld.Log(" 今天要处理的合服副本状态配置: customType=%s,dataID=%s" % (customType, dataID))
|
| | | GameWorld.Log(" 定制的合服副本地图列表: %s" % (customMapIDList))
|
| | | GameWorld.Log(" 今天定制的合服副本表ID列表=%s" % (todayCustomIDList))
|
| | | else:
|
| | | GameWorld.Log(" 超过最大定制开服天,不定制,走常规副本状态时间!")
|
| | |
|