6211 【后端】【1.6】合服任务单(运营活动支持合服定制)
| | |
| | | struct tagActExpRate
|
| | | {
|
| | | DWORD _CfgID; //配置ID
|
| | | char ActMark; //活动组标记
|
| | | list PlatformList; //活动平台列表["平台A", "平台A", ...],配[]代表所有
|
| | | list ServerIDList; //服务器ID列表
|
| | | list ServerGroupIDList; //服务器组ID列表
|
| | | list ServerGroupIDListExcept; //排除的服务器组ID列表
|
| | | char StartDate; //开启日期
|
| | | char EndDate; //结束日期
|
| | | list StartTimeList; //开启时间列表, 支持多个时段
|
| | |
| | | struct tagActBossReborn
|
| | | {
|
| | | DWORD _CfgID; //配置ID
|
| | | char ActMark; //活动组标记
|
| | | list PlatformList; //活动平台列表["平台A", "平台A", ...],配[]代表所有
|
| | | list ServerIDList; //服务器ID列表
|
| | | list ServerGroupIDList; //服务器组ID列表
|
| | | list ServerGroupIDListExcept; //排除的服务器组ID列表
|
| | | char StartDate; //开启日期
|
| | | char EndDate; //结束日期
|
| | | BYTE ResetType; //重置类型,0-0点重置;1-5点重置
|
| | |
| | | struct tagActWishingWell
|
| | | {
|
| | | DWORD _CfgID; //配置ID
|
| | | char ActMark; //活动组标记
|
| | | list PlatformList; //活动平台列表["平台A", "平台A", ...],配[]代表所有
|
| | | list ServerIDList; //服务器ID列表
|
| | | list ServerGroupIDList; //服务器组ID列表
|
| | | list ServerGroupIDListExcept; //排除的服务器组ID列表
|
| | | char StartDate; //开启日期
|
| | | char EndDate; //结束日期
|
| | | BYTE IsDayReset; //是否每天重置
|
| | |
| | |
|
| | | 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):
|
| | |
| | |
|
| | | "ActExpRate":(
|
| | | ("DWORD", "CfgID", 1),
|
| | | ("char", "ActMark", 0),
|
| | | ("list", "PlatformList", 0),
|
| | | ("list", "ServerIDList", 0),
|
| | | ("list", "ServerGroupIDList", 0),
|
| | | ("list", "ServerGroupIDListExcept", 0),
|
| | | ("char", "StartDate", 0),
|
| | | ("char", "EndDate", 0),
|
| | | ("list", "StartTimeList", 0),
|
| | |
| | |
|
| | | "ActBossReborn":(
|
| | | ("DWORD", "CfgID", 1),
|
| | | ("char", "ActMark", 0),
|
| | | ("list", "PlatformList", 0),
|
| | | ("list", "ServerIDList", 0),
|
| | | ("list", "ServerGroupIDList", 0),
|
| | | ("list", "ServerGroupIDListExcept", 0),
|
| | | ("char", "StartDate", 0),
|
| | | ("char", "EndDate", 0),
|
| | | ("BYTE", "ResetType", 0),
|
| | |
| | |
|
| | | "ActWishingWell":(
|
| | | ("DWORD", "CfgID", 1),
|
| | | ("char", "ActMark", 0),
|
| | | ("list", "PlatformList", 0),
|
| | | ("list", "ServerIDList", 0),
|
| | | ("list", "ServerGroupIDList", 0),
|
| | | ("list", "ServerGroupIDListExcept", 0),
|
| | | ("char", "StartDate", 0),
|
| | | ("char", "EndDate", 0),
|
| | | ("BYTE", "IsDayReset", 0),
|
| | |
| | | |
| | | def __init__(self): |
| | | self.CfgID = 0
|
| | | self.ActMark = ""
|
| | | self.PlatformList = []
|
| | | self.ServerIDList = []
|
| | | self.ServerGroupIDList = []
|
| | | self.ServerGroupIDListExcept = []
|
| | | self.StartDate = ""
|
| | | self.EndDate = ""
|
| | | self.StartTimeList = []
|
| | |
| | | return |
| | | |
| | | def GetCfgID(self): return self.CfgID # 配置ID
|
| | | def GetActMark(self): return self.ActMark # 活动组标记
|
| | | def GetPlatformList(self): return self.PlatformList # 活动平台列表["平台A", "平台A", ...],配[]代表所有
|
| | | def GetServerIDList(self): return self.ServerIDList # 服务器ID列表
|
| | | def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器组ID列表
|
| | | def GetServerGroupIDListExcept(self): return self.ServerGroupIDListExcept # 排除的服务器组ID列表
|
| | | def GetStartDate(self): return self.StartDate # 开启日期
|
| | | def GetEndDate(self): return self.EndDate # 结束日期
|
| | | def GetStartTimeList(self): return self.StartTimeList # 开启时间列表, 支持多个时段
|
| | |
| | | |
| | | def __init__(self): |
| | | self.CfgID = 0
|
| | | self.ActMark = ""
|
| | | self.PlatformList = []
|
| | | self.ServerIDList = []
|
| | | self.ServerGroupIDList = []
|
| | | self.ServerGroupIDListExcept = []
|
| | | self.StartDate = ""
|
| | | self.EndDate = ""
|
| | | self.ResetType = 0
|
| | |
| | | return |
| | | |
| | | def GetCfgID(self): return self.CfgID # 配置ID
|
| | | def GetActMark(self): return self.ActMark # 活动组标记
|
| | | def GetPlatformList(self): return self.PlatformList # 活动平台列表["平台A", "平台A", ...],配[]代表所有
|
| | | def GetServerIDList(self): return self.ServerIDList # 服务器ID列表
|
| | | def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器组ID列表
|
| | | def GetServerGroupIDListExcept(self): return self.ServerGroupIDListExcept # 排除的服务器组ID列表
|
| | | def GetStartDate(self): return self.StartDate # 开启日期
|
| | | def GetEndDate(self): return self.EndDate # 结束日期
|
| | | def GetResetType(self): return self.ResetType # 重置类型,0-0点重置;1-5点重置
|
| | |
| | | |
| | | def __init__(self): |
| | | self.CfgID = 0
|
| | | self.ActMark = ""
|
| | | self.PlatformList = []
|
| | | self.ServerIDList = []
|
| | | self.ServerGroupIDList = []
|
| | | self.ServerGroupIDListExcept = []
|
| | | self.StartDate = ""
|
| | | self.EndDate = ""
|
| | | self.IsDayReset = 0
|
| | |
| | | return |
| | | |
| | | def GetCfgID(self): return self.CfgID # 配置ID
|
| | | def GetActMark(self): return self.ActMark # 活动组标记
|
| | | def GetPlatformList(self): return self.PlatformList # 活动平台列表["平台A", "平台A", ...],配[]代表所有
|
| | | def GetServerIDList(self): return self.ServerIDList # 服务器ID列表
|
| | | def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器组ID列表
|
| | | def GetServerGroupIDListExcept(self): return self.ServerGroupIDListExcept # 排除的服务器组ID列表
|
| | | def GetStartDate(self): return self.StartDate # 开启日期
|
| | | def GetEndDate(self): return self.EndDate # 结束日期
|
| | | def GetIsDayReset(self): return self.IsDayReset # 是否每天重置
|