PGRData/Script/matrix/xmanager/XActivityManager.lua

425 lines
No EOL
18 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

XActivityManagerCreator = function()
local pairs = pairs
local ipairs = ipairs
local tostring = tostring
local tonumber = tonumber
local tableSort = table.sort
local tableInsert = table.insert
local stringSplit = string.Split
local ParseToTimestamp = XTime.ParseToTimestamp
local CSUnityEnginePlayerPrefs = CS.UnityEngine.PlayerPrefs
local CSXTextManagerGetText = CS.XTextManager.GetText
local SortedActivityGroupInfos = {}
local HaveReadActivityIds = {}
local SavedTimeDataDic = {}
local METHOD_NAME = {
LinkTaskFinished = "DoClientTaskEventRequest"
}
local XActivityManager = {}
function XActivityManager.Init()
XEventManager.AddEventListener(XEventId.EVENT_LOGIN_SUCCESS, XActivityManager.ReadCookie)
XEventManager.AddEventListener(XEventId.EVENT_REGRESSION_TASK_SCHEDULE_UPDATE, XActivityManager.ReadCookie)
XEventManager.AddEventListener(XEventId.EVENT_LOGIN_SUCCESS, XActivityManager.ReadTime)
-- XEventManager.AddEventListener(XEventId.EVENT_TASK_SYNC, XActivityManager.OnTaskDataChanged)
XActivityManager.InitSortedActivityGroupInfos()
end
--构建活动组-活动配置索引表并分别根据SortId排序
function XActivityManager.InitSortedActivityGroupInfos()
local sortFunc = function(l, r)
return l.SortId < r.SortId
end
local activityGroupTemplates = XActivityConfigs.GetActivityGroupTemplates()
for groupId, template in pairs(activityGroupTemplates) do
SortedActivityGroupInfos[groupId] = {
SortId = template.SortId,
ActivityGroupCfg = template,
ActivityCfgs = {}
}
end
local activityTemplates = XActivityConfigs.GetActivityTemplates()
for _, template in pairs(activityTemplates) do
local groupId = template.GroupId
local activityGroupCfg = SortedActivityGroupInfos[groupId]
if not activityGroupCfg then
XLog.ErrorTableDataNotFound("XActivityManager.InitSortedActivityGroupInfos",
"activityGroupCfg", "Client/Activity/ActivityGroup.tab", "GroupId", tostring(groupId))
return
end
local activityCfgs = activityGroupCfg.ActivityCfgs
tableInsert(activityCfgs, template)
end
for _, activityGroupInfo in pairs(SortedActivityGroupInfos) do
tableSort(activityGroupInfo.ActivityCfgs, sortFunc)
end
tableSort(SortedActivityGroupInfos, sortFunc)
end
function XActivityManager.PuzzleActIdToActId(subId)
local activityTemplates = XActivityConfigs.GetActivityTemplates()
for _, activityCfg in pairs(activityTemplates) do
if activityCfg.ActivityType == XActivityConfigs.ActivityType.JigsawPuzzle and activityCfg.Params[1] == subId then
return activityCfg.Id
end
end
return
end
function XActivityManager.IsActivityOpen(activityId)
if not activityId then return false end
local activityCfg = XActivityConfigs.GetActivityTemplate(activityId)
if not activityCfg then return false end
if activityCfg.ConditionId ~= 0 then
local result, _ = XConditionManager.CheckCondition(activityCfg.ConditionId)
if not result then
return false
end
end
local now = XTime.GetServerNowTimestamp()
local activityType = activityCfg.ActivityType
if activityType == XActivityConfigs.ActivityType.Task then
local taskGroupId = activityCfg.Params[1]
return XTaskConfig.IsTimeLimitTaskInTime(taskGroupId)
elseif activityType == XActivityConfigs.ActivityType.SendInvitation or activityType == XActivityConfigs.ActivityType.AcceptInvitation then
if XDataCenter.RegressionManager.IsActivityOpenInUiActivityBase(activityType) then
local regressionId = activityCfg.Params[1]
if XDataCenter.RegressionManager.GetInvitationActivityId() == regressionId then
return true
end
end
return false
elseif activityType == XActivityConfigs.ActivityType.Link then
local openTime = XDataCenter.TaskManager.GetLinkTimeTaskOpenTime(activityCfg.Params[2])
if not openTime then
return false
end
local timeLimitCfg = XTaskConfig.GetTimeLimitTaskCfg(activityCfg.Params[2])
local durationTime = timeLimitCfg.Duration
local tempTime = openTime + durationTime
local endTime = tempTime
local nowTime = XTime.GetServerNowTimestamp()
if nowTime > openTime and nowTime < endTime then
return true
end
return false
end
return XFunctionManager.CheckInTimeByTimeId(activityCfg.TimeId)
end
function XActivityManager.GetActivityGroupInfos()
local groupInfos = {}
for _, activityGroupInfo in ipairs(SortedActivityGroupInfos) do
local groupInfo = {}
for _, activityCfg in ipairs(activityGroupInfo.ActivityCfgs) do
if XActivityManager.IsActivityOpen(activityCfg.Id) then
groupInfo.ActivityGroupCfg = groupInfo.ActivityGroupCfg or activityGroupInfo.ActivityGroupCfg
groupInfo.ActivityCfgs = groupInfo.ActivityCfgs or {}
tableInsert(groupInfo.ActivityCfgs, activityCfg)
end
end
if next(groupInfo) then
tableInsert(groupInfos, groupInfo)
end
end
return groupInfos
end
function XActivityManager.GetActivityTaskData(activityId)
local activityCfg = XActivityConfigs.GetActivityTemplate(activityId)
if activityCfg.ActivityType ~= XActivityConfigs.ActivityType.Task and activityCfg.ActivityType ~= XActivityConfigs.ActivityType.ConsumeReward then
return {}
end
local taskGroupId = activityCfg.Params[1]
return XDataCenter.TaskManager.GetTimeLimitTaskListByGroupId(taskGroupId)
end
function XActivityManager.CheckRedPoint()
local activityTemplates = XActivityConfigs.GetActivityTemplates()
for activityId in pairs(activityTemplates) do
if XActivityManager.CheckRedPointByActivityId(activityId) then
return true
end
end
return false
end
function XActivityManager.CheckRedPointByActivityId(activityId)
if not XActivityManager.IsActivityOpen(activityId) then
return false
end
--任务类型特殊加入已完成小红点逻辑
local activityCfg = XActivityConfigs.GetActivityTemplate(activityId)
if activityCfg.ActivityType == XActivityConfigs.ActivityType.Task or activityCfg.ActivityType == XActivityConfigs.ActivityType.ConsumeReward then -- 累计消费活动使用task类型红点判断
local achieved = XDataCenter.TaskManager.TaskState.Achieved
local taskDatas = XActivityManager.GetActivityTaskData(activityId)
for _, taskData in pairs(taskDatas) do
if taskData.State == achieved then
return true
end
end
if activityCfg.Params[2] and activityCfg.Params[2] ~= 0 then -- 存在可跳转的任务面板
return XActivityManager.CheckTaskSkipRedPoint(activityCfg.Params[2])
end
-- 拼图活动有自己的红点判断
elseif activityCfg.ActivityType == XActivityConfigs.ActivityType.JigsawPuzzle then
-- Params[1] 为拼图活动ID
local id = XActivityConfigs.GetActivityTemplate(activityId).Params[1]
return XDataCenter.PuzzleActivityManager.IsHaveRedPointById(id)
--发送邀请活动有自己的红点判断
elseif activityCfg.ActivityType == XActivityConfigs.ActivityType.SendInvitation then
return XDataCenter.RegressionManager.IsSendInvitationHaveRedPoint()
--接受邀请活动有自己的红点判断
elseif activityCfg.ActivityType == XActivityConfigs.ActivityType.AcceptInvitation then
return XDataCenter.RegressionManager.IsAcceptInvitationHaveRedPoint()
elseif activityCfg.ActivityType == XActivityConfigs.ActivityType.Link then
--取得链接公告对应的链接内容
local linkCfg = XActivityConfigs.GetActivityLinkCfg(activityCfg.Params[1])
--如果已经领取过了,那么就不会再显示红点了
local TaskData = XDataCenter.TaskManager.GetTimeLimitTaskListByGroupId(activityCfg.Params[2])
if not TaskData or not TaskData[1] then
return false
end
if TaskData[1].State == XDataCenter.TaskManager.TaskState.Achieved then
return true
end
if XDataCenter.TaskManager.IsTaskFinished(TaskData[1].Id) then
return false
end
if linkCfg.RedPointType == 1 then
return not HaveReadActivityIds[activityId]
end
if linkCfg.RedPointType == 2 then
if SavedTimeDataDic[activityId] == 0 then
return true
end
local currentTime = XTime.GetSeverTodayFreshTime()
return currentTime ~= SavedTimeDataDic[activityId]
end
-- 跳转活动需要特殊红点显示时
elseif activityCfg.ActivityType == XActivityConfigs.ActivityType.Skip then
local redPointCondition = XActivityBriefConfigs.GetRedPointConditionsBySkipId(activityCfg.Params[1])
if redPointCondition then
for _, red in pairs(redPointCondition) do
if XRedPointConditions[red]:Check() then
return true
end
end
end
end
--当活动类型ActivityType为Shop或Skip时红点通过本地记录来判断是否显示
return not HaveReadActivityIds[activityId]
end
function XActivityManager.GetCookieKeyStr()
return string.format("%s%s", tostring(XPlayer.Id), "_ActivityReadInfoCookieKey")
end
function XActivityManager.GetTodayTimeKeyStr()
return string.format("%s%s", tostring(XPlayer.Id), "_TodayFrieTime")
end
function XActivityManager.ReadCookie()
if not CSUnityEnginePlayerPrefs.HasKey(XActivityManager.GetCookieKeyStr()) then
return
end
local dataStr = CSUnityEnginePlayerPrefs.GetString(XActivityManager.GetCookieKeyStr())
local msgTab = stringSplit(dataStr, '\t')
if not msgTab or #msgTab <= 0 then
return
end
for _, activityIdStr in ipairs(msgTab) do
local activityId = tonumber(activityIdStr)
if activityId then
local activityCfg = XActivityConfigs.GetActivityTemplate(activityId)
if XActivityManager.IsActivityOpen(activityId) or (activityCfg and activityCfg.ActivityType == XActivityConfigs.ActivityType.Link) then
HaveReadActivityIds[activityId] = true
else
HaveReadActivityIds[activityId] = nil
end
end
end
end
--读取注册表保存的内容
function XActivityManager.ReadTime()
if not CSUnityEnginePlayerPrefs.HasKey(XActivityManager.GetTodayTimeKeyStr()) then
return
end
local dataStr = CSUnityEnginePlayerPrefs.GetString(XActivityManager.GetTodayTimeKeyStr())
local msgTab = stringSplit(dataStr, '\t')
if not msgTab or #msgTab <= 0 then
return
end
for _, timeStr in ipairs(msgTab) do
local timeCfg = stringSplit(timeStr, '|')
local activityId = tonumber(timeCfg[1])
local time = tonumber(timeCfg[2])
if activityId then
SavedTimeDataDic[activityId] = time
end
end
end
function XActivityManager.OnTaskDataChanged()
if XLuaUiManager.IsUiShow("UiDialog") then
return
end
if not XLuaUiManager.IsUiShow("UiShop") and not XLuaUiManager.IsUiShow("UiPurchase") then
return
end
if XDataCenter.TaskManager.CheckConsumeTaskHaveReward() then
XUiManager.DialogTip(CSXTextManagerGetText("ActivityConsumeRewardDialogTipTitle"), CSXTextManagerGetText("ActivityConsumeRewardDialogTipContent"), XUiManager.DialogType.OnlySure)
end
end
function XActivityManager.SaveInGameNoticeReadList(activityId)
if not XActivityManager.IsActivityOpen(activityId) then return end
HaveReadActivityIds[activityId] = true
local saveContent = ""
for id in pairs(HaveReadActivityIds) do
saveContent = saveContent .. id .. '\t'
end
CSUnityEnginePlayerPrefs.SetString(XActivityManager.GetCookieKeyStr(), saveContent)
CSUnityEnginePlayerPrefs.Save()
XEventManager.DispatchEvent(XEventId.EVENT_ACTIVITY_ACTIVITIES_READ_CHANGE)
end
function XActivityManager.CheckTaskSkipRedPoint(skipType)
if not XFunctionManager.IsCanSkip(skipType) then
return false
end
if skipType == XActivityConfigs.TaskPanelSkipType.CanZhangHeMing_Qu
or skipType == XActivityConfigs.TaskPanelSkipType.CanZhangHeMing_LuNa
or skipType == XActivityConfigs.TaskPanelSkipType.CanZhangHeMing_SP
then
return XRedPointConditionFuBenDragPuzzleGameRed.Check()
elseif skipType == XActivityConfigs.TaskPanelSkipType.ChrismasTree_Dress then
return XRedPointConditionChristmasTree.Check()
elseif skipType == XActivityConfigs.TaskPanelSkipType.Couplet_Game then
return XRedPointConditionCoupletGameRed.Check()
elseif skipType == XActivityConfigs.TaskPanelSkipType.InvertCard_Game then
return XRedPointConditionInvertCardGameRed.Check()
elseif skipType == XActivityConfigs.TaskPanelSkipType.LivWarmPop_Game then
return XRedPointConditionLivWarmActivity.Check()
elseif skipType == XActivityConfigs.TaskPanelSkipType.DiceGame then
return XRedPointConditionDiceGameRed.Check()
elseif skipType == XActivityConfigs.TaskPanelSkipType.BodyCombineGame then
return XRedPointBodyCombineGameMain.Check()
elseif skipType == XActivityConfigs.TaskPanelSkipType.InvertCardGame2 then
return XRedPointConditionInvertCardGameRed.Check()
end
end
--链接类型的公告红点需要特殊处理 存在两种类型1.只显示一次的类型 2.每天都显示一次的类型
function XActivityManager.HandleLinkActivityRedPoint(activityId)
if not XActivityManager.IsActivityOpen(activityId) then
return
end
local activityCfg = XActivityConfigs.GetActivityTemplate(activityId)
local linkCfg = XActivityConfigs.GetActivityLinkCfg(activityCfg.Params[1])
--只显示一次的类型,按照以前的方式处理
if linkCfg.RedPointType == 1 then
HaveReadActivityIds[activityId] = true
local saveContent = ""
for id in pairs(HaveReadActivityIds) do
saveContent = saveContent .. id .. '\t'
end
CSUnityEnginePlayerPrefs.SetString(XActivityManager.GetCookieKeyStr(), saveContent)
CSUnityEnginePlayerPrefs.Save()
XEventManager.DispatchEvent(XEventId.EVENT_ACTIVITY_ACTIVITIES_READ_CHANGE)
end
--每天都显示一次的类型保存每天5点的时间戳然后用这个做比较
if linkCfg.RedPointType == 2 then
local todayTime = XTime.GetSeverTodayFreshTime()
SavedTimeDataDic[activityId] = todayTime
local saveContent = ""
for id, time in pairs(SavedTimeDataDic) do
saveContent = string.format("%s%d%s%d%s", saveContent, id, '|', time, '\t')
end
CSUnityEnginePlayerPrefs.SetString(XActivityManager.GetTodayTimeKeyStr(), saveContent)
CSUnityEnginePlayerPrefs.Save()
XEventManager.DispatchEvent(XEventId.EVENT_ACTIVITY_ACTIVITIES_READ_CHANGE)
end
end
--点击链接的时候通知后端任务已经完成
function XActivityManager.TellFinishLinkTask(taskId, cb)
local req = { ClientTaskType = taskId }
XNetwork.Call(METHOD_NAME.LinkTaskFinished, req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
if cb then
cb()
end
end)
end
-- [ 海外新增(Rooot活动)
XActivityManager.RoootData = {
Token = nil,
StartTime = nil,
ExchangeEndTime = nil,
}
function XActivityManager.OpenRoootUrl(hostUrl)
if not hostUrl or hostUrl == "" then
XUiManager.TipText("RoootActivityUrlError")
return
end
if XActivityManager.RoootData.Token and XActivityManager.RoootData.StartTime and XActivityManager.RoootData.ExchangeEndTime then
local nowTime = XTime.GetServerNowTimestamp()
if nowTime < XActivityManager.RoootData.StartTime or nowTime > XActivityManager.RoootData.ExchangeEndTime then
XUiManager.TipText("RoootActivityNotInTime")
end
local fullUrl = hostUrl.."?associate_token="..XActivityManager.RoootData.Token
CS.UnityEngine.Application.OpenURL(fullUrl)
else
XNetwork.Call("RoootAuthRequest", {}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XActivityManager.RoootData.Token = res.Token
XActivityManager.RoootData.StartTime = res.StartTime
XActivityManager.RoootData.ExchangeEndTime = res.ExchangeEndTime
local fullUrl = hostUrl.."?associate_token="..XActivityManager.RoootData.Token
CS.UnityEngine.Application.OpenURL(fullUrl)
end)
end
end
-- ]
XActivityManager.Init()
return XActivityManager
end