2023-07-14 19:35:33 +00:00
|
|
|
|
local tableInsert = table.insert
|
|
|
|
|
|
|
|
|
|
XNoticeManagerCreator = function()
|
|
|
|
|
local Json = require("XCommon/Json")
|
|
|
|
|
local pcall = pcall
|
|
|
|
|
local XNoticeManager = {}
|
|
|
|
|
|
|
|
|
|
local NoticePicList = {}
|
|
|
|
|
|
|
|
|
|
local NowTextNotice = nil
|
|
|
|
|
local NowPicNotice = nil
|
|
|
|
|
|
|
|
|
|
local InGameNoticeReadList = {}
|
|
|
|
|
local InGameNoticeMap = {}
|
|
|
|
|
local InGameNoticeReadKey = "_InGameNoticeReadKey"
|
2024-09-01 20:49:41 +00:00
|
|
|
|
local InGameAutoPopupMap
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
local SubMenuNoticeReadList = {}
|
|
|
|
|
local SubMenuNoticeMap = {}
|
|
|
|
|
local SubMenuNoticeReadKey = "_SubMenuNoticeReadKey"
|
|
|
|
|
|
|
|
|
|
local ScrollCountList = {}
|
|
|
|
|
local ScrollCountSaveKey = "_NoticeScrollCountList"
|
|
|
|
|
|
|
|
|
|
local LoginNotice = nil
|
|
|
|
|
local LoginNoticeTimeInfo = {}
|
|
|
|
|
local LoginNoticeCacheKey = "LoginNotice"
|
|
|
|
|
|
|
|
|
|
local TextNoticeHideCache = {}
|
|
|
|
|
local TextNoticeHideCacheKey = "_TextNotice"
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
local LoginNoticAutoOpenKey = "_LoginNoticeNotOpenKey"
|
2023-07-14 19:35:33 +00:00
|
|
|
|
------------------------------------------------------
|
|
|
|
|
local NoticeRequestTimer = nil
|
|
|
|
|
-- 向服务端请求数据的最小间隔周期(秒)
|
|
|
|
|
local NoticeRequestTimerInterval = 10
|
|
|
|
|
local NoticeRequestTimeOut = 30
|
|
|
|
|
local DefaultTextScrollInterval = 10
|
|
|
|
|
|
|
|
|
|
local ScreenShotFlag = false
|
|
|
|
|
local DisableFunction = false --功能屏蔽标记(调试模式时使用)
|
|
|
|
|
|
|
|
|
|
local XNoticeType = {
|
|
|
|
|
-- 顶部文字滚动公告
|
|
|
|
|
ScrollText = 0,
|
|
|
|
|
-- 主界面广告图
|
|
|
|
|
ScrollPic = 1,
|
|
|
|
|
-- 游戏内公告
|
|
|
|
|
InGame = 2,
|
|
|
|
|
-- 登陆公告
|
|
|
|
|
Login = 3,
|
|
|
|
|
-- 主界面二级菜单
|
|
|
|
|
SubMenu = 4,
|
|
|
|
|
}
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
XNoticeManager.NoticeType = XNoticeType
|
|
|
|
|
|
|
|
|
|
--游戏内公告类型
|
|
|
|
|
local InGameNoticeType = {
|
|
|
|
|
--活动
|
|
|
|
|
Activity = 0,
|
|
|
|
|
--游戏
|
|
|
|
|
Game = 1,
|
|
|
|
|
--外部链接
|
|
|
|
|
Link = 2
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
XNoticeManager.GameNoticeType = InGameNoticeType
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
-- 自动向服务端请求数据的间隔周期(秒)
|
|
|
|
|
local RequestInterval = {
|
|
|
|
|
[XNoticeType.ScrollText] = 30,
|
|
|
|
|
[XNoticeType.ScrollPic] = 60,
|
|
|
|
|
[XNoticeType.InGame] = 120,
|
|
|
|
|
[XNoticeType.Login] = 0,
|
|
|
|
|
[XNoticeType.SubMenu] = 120,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
local LastRequestTime = {
|
|
|
|
|
[XNoticeType.ScrollText] = 0,
|
|
|
|
|
[XNoticeType.ScrollPic] = 0,
|
|
|
|
|
[XNoticeType.InGame] = 0,
|
|
|
|
|
[XNoticeType.SubMenu] = 0,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
local NoticeRequestHandler = {
|
2024-09-01 20:49:41 +00:00
|
|
|
|
[XNoticeType.ScrollText] = function(notice)
|
|
|
|
|
XNoticeManager.HandleRequestScrollTextNotice(notice)
|
|
|
|
|
end,
|
|
|
|
|
[XNoticeType.ScrollPic] = function(notice)
|
|
|
|
|
XNoticeManager.HandleRequestScrollPicNotice(notice)
|
|
|
|
|
end,
|
|
|
|
|
[XNoticeType.InGame] = function(notice)
|
|
|
|
|
XNoticeManager.HandleRequestInGameNotice(notice)
|
|
|
|
|
end,
|
|
|
|
|
[XNoticeType.SubMenu] = function(notice)
|
|
|
|
|
XNoticeManager.HandleRequestSubMenuNotice(notice)
|
|
|
|
|
end,
|
2023-07-14 19:35:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
local NoticeRequestFailHandler = {
|
2024-09-01 20:49:41 +00:00
|
|
|
|
[XNoticeType.ScrollText] = function()
|
|
|
|
|
XNoticeManager.HandleRequestScrollTextNotice()
|
|
|
|
|
end,
|
|
|
|
|
[XNoticeType.ScrollPic] = function()
|
|
|
|
|
XNoticeManager.HandleRequestScrollPicNoticeFail()
|
|
|
|
|
end,
|
|
|
|
|
[XNoticeType.InGame] = function()
|
|
|
|
|
XNoticeManager.HandleRequestInGameNotice()
|
|
|
|
|
end,
|
|
|
|
|
[XNoticeType.SubMenu] = function()
|
|
|
|
|
XNoticeManager.HandleRequestSubMenuNotice()
|
|
|
|
|
end,
|
2023-07-14 19:35:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
----------------------------------初始化公告cdn路径 beg----------------------------------
|
|
|
|
|
local NoticeCdnUrl = {}
|
|
|
|
|
local NoticeFileName = {
|
|
|
|
|
[XNoticeType.ScrollText] = "ScrollTextNotice.json",
|
|
|
|
|
[XNoticeType.ScrollPic] = "ScrollPicNotice.json",
|
|
|
|
|
[XNoticeType.InGame] = "GameNotice.json",
|
|
|
|
|
[XNoticeType.Login] = "LoginNotice.json",
|
|
|
|
|
[XNoticeType.SubMenu] = "SecondMenuNotice.json",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetNoticeUrl(noticeType)
|
|
|
|
|
return NoticeCdnUrl[noticeType]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.InitNoticeCdnUrl()
|
|
|
|
|
local noticePathPrefix = CS.XGame.ClientConfig:GetString("NoticePathPrefix")
|
|
|
|
|
for k, v in pairs(NoticeFileName) do
|
|
|
|
|
NoticeCdnUrl[k] = noticePathPrefix .. CS.XInfo.Identifier .. "/" .. CS.XRemoteConfig.ApplicationVersion .. "/" .. v
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
----------------------------------初始化公告cdn路径 end----------------------------------
|
|
|
|
|
----------------------------------获取公网ip地址 beg----------------------------------
|
|
|
|
|
local Ip = ""
|
|
|
|
|
local IpUrlIndex = 0
|
|
|
|
|
local IpUrls = {
|
|
|
|
|
"https://ipv4.icanhazip.com/",
|
|
|
|
|
"https://api.ipify.org/"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.RequestIp()
|
|
|
|
|
IpUrlIndex = IpUrlIndex + 1
|
|
|
|
|
if IpUrlIndex > #IpUrls then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local request = CS.UnityEngine.Networking.UnityWebRequest.Get(IpUrls[IpUrlIndex])
|
|
|
|
|
local requestEnd = function()
|
|
|
|
|
if request.isNetworkError or request.isHttpError then
|
|
|
|
|
XNoticeManager.RequestIp()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
Ip = request.downloadHandler.text
|
|
|
|
|
|
|
|
|
|
request:Dispose()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
CS.XTool.WaitNativeCoroutine(request:SendWebRequest(), requestEnd)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetIp()
|
|
|
|
|
return Ip
|
|
|
|
|
end
|
|
|
|
|
----------------------------------获取公网ip地址 end----------------------------------
|
|
|
|
|
--------------------------cache beg--------------------------
|
|
|
|
|
function XNoticeManager.ReadTextNoticeHideCache()
|
|
|
|
|
local cache = CS.UnityEngine.PlayerPrefs.GetString(tostring(XPlayer.Id) .. TextNoticeHideCacheKey)
|
|
|
|
|
if string.IsNilOrEmpty(cache) then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
TextNoticeHideCache = Json.decode(cache)
|
|
|
|
|
|
|
|
|
|
for k, v in pairs(TextNoticeHideCache) do
|
|
|
|
|
if XTime.GetServerNowTimestamp() > v.EndTime then
|
|
|
|
|
TextNoticeHideCache[k] = nil
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.SaveTextNoticeHideCache()
|
|
|
|
|
if not TextNoticeHideCache then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
CS.UnityEngine.PlayerPrefs.SetString(tostring(XPlayer.Id) .. TextNoticeHideCacheKey, Json.encode(TextNoticeHideCache))
|
|
|
|
|
CS.UnityEngine.PlayerPrefs.Save()
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
function XNoticeManager.GetInGameNoticeReadKey()
|
2024-09-01 20:49:41 +00:00
|
|
|
|
local key = XPlayer.Id and XPlayer.Id or "NotLoggedIn"
|
|
|
|
|
return key .. InGameNoticeReadKey
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.SaveInGameNoticeReadList()
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if not InGameNoticeReadList then
|
|
|
|
|
return
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
local saveContent = ""
|
|
|
|
|
local splitMark = "\n"
|
|
|
|
|
for _, v in pairs(InGameNoticeReadList) do
|
|
|
|
|
local list = {}
|
|
|
|
|
tableInsert(list, v.Id)
|
|
|
|
|
tableInsert(list, v.Index)
|
|
|
|
|
tableInsert(list, (v.IsRead and 1 or 0))
|
|
|
|
|
tableInsert(list, v.EndTime)
|
|
|
|
|
tableInsert(list, v.ModifyTime)
|
|
|
|
|
|
|
|
|
|
local tempStr = table.concat(list, "\t")
|
|
|
|
|
saveContent = string.format("%s%s%s", tempStr, splitMark, saveContent)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
CS.UnityEngine.PlayerPrefs.SetString(XNoticeManager.GetInGameNoticeReadKey(), saveContent)
|
|
|
|
|
CS.UnityEngine.PlayerPrefs.Save()
|
|
|
|
|
|
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_ACTIVITY_NOTICE_READ_CHANGE)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.ReadInGameNoticeReadList()
|
|
|
|
|
InGameNoticeReadList = {}
|
|
|
|
|
if not CS.UnityEngine.PlayerPrefs.HasKey(XNoticeManager.GetInGameNoticeReadKey()) then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local dataStr = CS.UnityEngine.PlayerPrefs.GetString(XNoticeManager.GetInGameNoticeReadKey())
|
|
|
|
|
|
|
|
|
|
local msgTab = string.Split(dataStr, '\n')
|
|
|
|
|
if not msgTab or #msgTab <= 0 then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, content in ipairs(msgTab) do
|
|
|
|
|
if (not string.IsNilOrEmpty(content)) then
|
|
|
|
|
local tab = string.Split(content, '\t')
|
|
|
|
|
if tab then
|
|
|
|
|
local readInfo = {
|
|
|
|
|
Id = tostring(tab[1]),
|
|
|
|
|
Index = tonumber(tab[2]),
|
|
|
|
|
IsRead = tonumber(tab[3]) > 0,
|
|
|
|
|
EndTime = tonumber(tab[4]),
|
|
|
|
|
ModifyTime = tonumber(tab[5]),
|
|
|
|
|
}
|
|
|
|
|
if readInfo.ModifyTime and readInfo.EndTime and readInfo.EndTime > XTime.GetServerNowTimestamp() then
|
|
|
|
|
local dataKey = XNoticeManager.GetGameNoticeReadDataKey(readInfo, readInfo.Index)
|
|
|
|
|
InGameNoticeReadList[dataKey] = readInfo
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetInGameNoticeAutoPopupKey(noticeId, modifyTime)
|
|
|
|
|
return string.format("%s_%s", noticeId, tostring(modifyTime))
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetInGameNoticeAutoMap()
|
|
|
|
|
if not InGameAutoPopupMap then
|
|
|
|
|
local key = "XNoticeManager.GetInGameNoticeAutoMap_InGameNoticeAutoMap"
|
|
|
|
|
InGameAutoPopupMap = XSaveTool.GetData(key) or {}
|
|
|
|
|
end
|
|
|
|
|
return InGameAutoPopupMap
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.MarkInGameNoticeAutoMap(noticeId, modifyTime)
|
|
|
|
|
InGameAutoPopupMap = XNoticeManager.GetInGameNoticeAutoMap()
|
|
|
|
|
local noticeKey = XNoticeManager.GetInGameNoticeAutoPopupKey(noticeId, modifyTime)
|
|
|
|
|
InGameAutoPopupMap[noticeKey] = true
|
|
|
|
|
|
|
|
|
|
local key = "XNoticeManager.GetInGameNoticeAutoMap_InGameNoticeAutoMap"
|
|
|
|
|
XSaveTool.SaveData(key, InGameAutoPopupMap)
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetSubMenuNoticeReadKey()
|
|
|
|
|
return tostring(XPlayer.Id) .. SubMenuNoticeReadKey
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.SaveSubMenuNoticeReadList()
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if not SubMenuNoticeReadList then
|
|
|
|
|
return
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
local saveContent = ""
|
|
|
|
|
local splitMark = "\n"
|
|
|
|
|
for _, v in pairs(SubMenuNoticeReadList) do
|
|
|
|
|
local list = {}
|
|
|
|
|
tableInsert(list, v.Id)
|
|
|
|
|
tableInsert(list, v.EndTime)
|
|
|
|
|
tableInsert(list, v.TipResetTime)
|
|
|
|
|
tableInsert(list, v.LastReadTime)
|
|
|
|
|
|
|
|
|
|
local tempStr = table.concat(list, "\t")
|
|
|
|
|
saveContent = string.format("%s%s%s", tempStr, splitMark, saveContent)
|
|
|
|
|
end
|
|
|
|
|
-- XLog.Warning("save",saveContent)
|
|
|
|
|
CS.UnityEngine.PlayerPrefs.SetString(XNoticeManager.GetSubMenuNoticeReadKey(), saveContent)
|
|
|
|
|
CS.UnityEngine.PlayerPrefs.Save()
|
|
|
|
|
|
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_ACTIVITY_SUBMENU_READ_CHANGE)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.ReadSubMenuNoticeReadList()
|
|
|
|
|
SubMenuNoticeReadList = {}
|
|
|
|
|
if not CS.UnityEngine.PlayerPrefs.HasKey(XNoticeManager.GetSubMenuNoticeReadKey()) then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local dataStr = CS.UnityEngine.PlayerPrefs.GetString(XNoticeManager.GetSubMenuNoticeReadKey())
|
|
|
|
|
|
|
|
|
|
local msgTab = string.Split(dataStr, '\n')
|
|
|
|
|
if not msgTab or #msgTab <= 0 then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, content in ipairs(msgTab) do
|
|
|
|
|
if (not string.IsNilOrEmpty(content)) then
|
|
|
|
|
local tab = string.Split(content, '\t')
|
|
|
|
|
if tab then
|
|
|
|
|
local readInfo = {
|
|
|
|
|
Id = tostring(tab[1]),
|
|
|
|
|
EndTime = tonumber(tab[2]),
|
|
|
|
|
TipResetTime = tonumber(tab[3]),
|
|
|
|
|
LastReadTime = tonumber(tab[4]),
|
|
|
|
|
}
|
|
|
|
|
if readInfo.EndTime and readInfo.EndTime > XTime.GetServerNowTimestamp() then
|
|
|
|
|
SubMenuNoticeReadList[readInfo.Id] = readInfo
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
--XLog.Warning("ReadSubMenuNoticeReadList",SubMenuNoticeReadList)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetScrollCountSaveKey()
|
|
|
|
|
return tostring(XPlayer.Id) .. ScrollCountSaveKey
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.SaveScrollCountList()
|
|
|
|
|
if not ScrollCountList then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local saveContent = ''
|
|
|
|
|
for _, v in pairs(ScrollCountList) do
|
|
|
|
|
saveContent = saveContent .. v.id .. '\t'
|
|
|
|
|
saveContent = saveContent .. v.maxCount .. '\t'
|
|
|
|
|
saveContent = saveContent .. v.nowCount .. '\t'
|
|
|
|
|
saveContent = saveContent .. v.overTime .. '\n'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
CS.UnityEngine.PlayerPrefs.SetString(XNoticeManager.GetScrollCountSaveKey(), saveContent)
|
|
|
|
|
CS.UnityEngine.PlayerPrefs.Save()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.ReadScrollCountList()
|
|
|
|
|
ScrollCountList = {}
|
|
|
|
|
if not CS.UnityEngine.PlayerPrefs.HasKey(XNoticeManager.GetScrollCountSaveKey()) then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local dataStr = CS.UnityEngine.PlayerPrefs.GetString(XNoticeManager.GetScrollCountSaveKey())
|
|
|
|
|
local msgTab = string.Split(dataStr, '\n')
|
|
|
|
|
if not msgTab or #msgTab <= 0 then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, content in ipairs(msgTab) do
|
|
|
|
|
if (not string.IsNilOrEmpty(content)) then
|
|
|
|
|
local tab = string.Split(content, '\t')
|
|
|
|
|
if tab then
|
|
|
|
|
local countInfo = {
|
|
|
|
|
id = tostring(tab[1]),
|
|
|
|
|
maxCount = tonumber(tab[2]),
|
|
|
|
|
nowCount = tonumber(tab[3]),
|
|
|
|
|
overTime = tonumber(tab[4]),
|
|
|
|
|
}
|
|
|
|
|
if countInfo.overTime and countInfo.overTime > XTime.GetServerNowTimestamp() then
|
|
|
|
|
ScrollCountList[countInfo.id] = countInfo
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
--------------------------cache end--------------------------
|
|
|
|
|
--------------------------text beg--------------------------
|
|
|
|
|
function XNoticeManager.HandleRequestScrollTextNotice(notice)
|
|
|
|
|
-- XLog.Warning("new text notice",notice)
|
|
|
|
|
NowTextNotice = notice
|
|
|
|
|
|
|
|
|
|
if not XNoticeManager.CheckTextNoticeValid(notice) then
|
|
|
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_NOTICE_CLOSE_TEXT_NOTICE)
|
|
|
|
|
else
|
|
|
|
|
XLuaUiManager.Open("UiNoticeTips")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if NowTextNotice then
|
|
|
|
|
local key = XNoticeManager.GetTextNoticeKey(NowTextNotice)
|
|
|
|
|
if not ScrollCountList or not ScrollCountList[key] then
|
|
|
|
|
XNoticeManager.CreateDefaultScrollCountData(NowTextNotice)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetTextNoticeKey(notice)
|
|
|
|
|
return notice.Id .. "_" .. notice.ModifyTime
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.CreateDefaultScrollCountData(notice)
|
|
|
|
|
local key = XNoticeManager.GetTextNoticeKey(notice)
|
|
|
|
|
local countInfo = {
|
|
|
|
|
id = key,
|
|
|
|
|
maxCount = notice.ScrollTimes,
|
|
|
|
|
nowCount = 0,
|
|
|
|
|
overTime = notice.EndTime,
|
|
|
|
|
}
|
|
|
|
|
ScrollCountList[key] = countInfo
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.CheckTextNoticeValid(notice)
|
|
|
|
|
notice = notice or NowTextNotice
|
|
|
|
|
|
|
|
|
|
if not XNoticeManager.CheckNoticeValid(notice) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not XNoticeManager.CheckTextNoticeHideCache(notice) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if notice.ShowInFight < 1 and not CS.XFight.IsOutFight then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if notice.ShowInPhotograph < 1 and ScreenShotFlag then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local key = XNoticeManager.GetTextNoticeKey(notice)
|
|
|
|
|
if ScrollCountList[key]
|
2024-09-01 20:49:41 +00:00
|
|
|
|
and ScrollCountList[key].nowCount > ScrollCountList[key].maxCount then
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetTextNoticeContent()
|
|
|
|
|
if not NowTextNotice then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
return NowTextNotice.Content
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.AddTextNoticeCount()
|
|
|
|
|
if not NowTextNotice then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local key = XNoticeManager.GetTextNoticeKey(NowTextNotice)
|
|
|
|
|
|
|
|
|
|
if not ScrollCountList[key] then
|
|
|
|
|
XNoticeManager.CreateDefaultScrollCountData(NowTextNotice)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
ScrollCountList[key].nowCount = ScrollCountList[key].nowCount + 1
|
|
|
|
|
|
|
|
|
|
XNoticeManager.SaveScrollCountList()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetTextNoticeScrollInterval()
|
|
|
|
|
if not NowTextNotice then
|
|
|
|
|
return DefaultTextScrollInterval
|
|
|
|
|
end
|
|
|
|
|
return tonumber(NowTextNotice.ScrollInterval) or DefaultTextScrollInterval
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.ChangeTextNoticeHideCache(notice)
|
|
|
|
|
notice = notice or NowTextNotice
|
|
|
|
|
if not notice then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local key = XNoticeManager.GetTextNoticeKey(notice)
|
|
|
|
|
if not TextNoticeHideCache[key] then
|
|
|
|
|
TextNoticeHideCache[key] = {
|
|
|
|
|
Id = key,
|
|
|
|
|
IsHide = 1,
|
|
|
|
|
EndTime = notice.EndTime
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
TextNoticeHideCache[key].IsHide = not TextNoticeHideCache[key].IsHide
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XNoticeManager.SaveTextNoticeHideCache()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.CheckTextNoticeHideCache(notice)
|
|
|
|
|
notice = notice or NowTextNotice
|
|
|
|
|
if not notice then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local key = XNoticeManager.GetTextNoticeKey(notice)
|
|
|
|
|
if not TextNoticeHideCache[key] then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return TextNoticeHideCache[key].IsHide < 0
|
|
|
|
|
end
|
|
|
|
|
--------------------------text end--------------------------
|
|
|
|
|
----------------------Scroll Pic beg----------------------
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.HandleRequestScrollPicNoticeFail()
|
|
|
|
|
if not NowPicNotice then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
NowPicNotice = nil
|
|
|
|
|
|
|
|
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_NOTICE_PIC_CHANGE)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.HandleRequestScrollPicNotice(notice)
|
|
|
|
|
if not notice then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if NowPicNotice and NowPicNotice.Id == notice.Id and NowPicNotice.ModifyTime == notice.ModifyTime then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
NowPicNotice = notice
|
|
|
|
|
|
|
|
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_NOTICE_PIC_CHANGE)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetScrollPicList()
|
|
|
|
|
XNoticeManager.RequestNoticeByType(XNoticeType.ScrollPic, true)
|
|
|
|
|
if not NowPicNotice then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local scrollPicList = {}
|
|
|
|
|
for _, v in ipairs(NowPicNotice.Content) do
|
|
|
|
|
local isOpen = true
|
|
|
|
|
|
|
|
|
|
if not v.BeginTime or not v.EndTime or not v.AppearanceDay or not v.AppearanceTime
|
|
|
|
|
or not v.DisappearanceCondition or not v.AppearanceCondition then
|
|
|
|
|
isOpen = false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
isOpen = false
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if XTime.GetServerNowTimestamp() >= tonumber(v.BeginTime) and XTime.GetServerNowTimestamp() < tonumber(v.EndTime) then
|
|
|
|
|
--是否在开放区间内(日期)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
isOpen = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
isOpen = false
|
|
|
|
|
if #v.AppearanceDay > 0 then
|
|
|
|
|
for _, day in ipairs(v.AppearanceDay) do
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if day == XDataCenter.FubenDailyManager.GetNowDayOfWeekByRefreshTime() then
|
|
|
|
|
--是否位于可以显示的周目
|
2023-07-14 19:35:33 +00:00
|
|
|
|
isOpen = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
isOpen = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
isOpen = false
|
|
|
|
|
if #v.AppearanceTime > 0 then
|
|
|
|
|
for _, time in ipairs(v.AppearanceTime) do
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if XTime.GetServerNowTimestamp() - XTime.GetTodayTime(0, 0, 0) >= time[1] and XTime.GetServerNowTimestamp() - XTime.GetTodayTime(0, 0, 0) < time[2] then
|
|
|
|
|
--是否位于可以显示的时间段
|
2023-07-14 19:35:33 +00:00
|
|
|
|
isOpen = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
isOpen = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
if #v.DisappearanceCondition > 0 then
|
2024-09-01 20:49:41 +00:00
|
|
|
|
for _, condition in ipairs(v.DisappearanceCondition) do
|
|
|
|
|
--是否符合不显示的条件
|
2023-07-14 19:35:33 +00:00
|
|
|
|
if XConditionManager.CheckCondition(condition) then
|
|
|
|
|
isOpen = false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
if #v.AppearanceCondition > 0 then
|
|
|
|
|
for _, condition in ipairs(v.AppearanceCondition) do
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if not XConditionManager.CheckCondition(condition) then
|
|
|
|
|
--是否不符合显示条件
|
2023-07-14 19:35:33 +00:00
|
|
|
|
isOpen = false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
if not XNoticeManager.IsWhiteIp(v.WhiteLists) then
|
|
|
|
|
isOpen = false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
v.Interval = tonumber(v.Interval)
|
|
|
|
|
table.insert(scrollPicList, v)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return scrollPicList
|
|
|
|
|
end
|
|
|
|
|
----------------------Scroll Pic end----------------------
|
|
|
|
|
----------------------InGame Notice beg----------------------
|
|
|
|
|
function XNoticeManager.HandleRequestInGameNotice(notice)
|
|
|
|
|
InGameNoticeMap = {}
|
|
|
|
|
if not notice then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if type(notice) ~= "table" then
|
|
|
|
|
XLog.Error("InGame notice invalid format: " .. tostring(notice))
|
|
|
|
|
return
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
local timeOfNow = XLoginManager.IsLogin() and XTime.GetServerNowTimestamp() or os.time()
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
for _, v in ipairs(notice) do
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if XNoticeManager.CheckNoticeValid(v, timeOfNow) then
|
2023-07-14 19:35:33 +00:00
|
|
|
|
if not InGameNoticeMap[v.Type] then
|
|
|
|
|
InGameNoticeMap[v.Type] = {}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local content = {}
|
|
|
|
|
for _, item in ipairs(v.Content) do
|
|
|
|
|
if XNoticeManager.IsWhiteIp(item.WhiteLists) then
|
|
|
|
|
table.insert(content, item)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if #content > 0 then
|
|
|
|
|
v.Content = content
|
|
|
|
|
table.insert(InGameNoticeMap[v.Type], v)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, v in pairs(InGameNoticeMap) do
|
|
|
|
|
XNoticeManager.InitInGameReadList(v)
|
|
|
|
|
|
|
|
|
|
local sortFunc = function(l, r)
|
|
|
|
|
return l.Order > r.Order
|
|
|
|
|
end
|
|
|
|
|
table.sort(v, sortFunc)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetInGameNoticeMap(type)
|
|
|
|
|
return InGameNoticeMap[type]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.CheckHaveNotice(type)
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if type == InGameNoticeType.Link then
|
|
|
|
|
return true
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
XNoticeManager.RequestNoticeByType(XNoticeType.InGame, true)
|
|
|
|
|
if not InGameNoticeMap then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not InGameNoticeMap[type] or not next(InGameNoticeMap[type]) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return true
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
function XNoticeManager.CheckInGameNoticeRedPoint(type)
|
|
|
|
|
if not InGameNoticeMap or not InGameNoticeMap[type] then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, notice in pairs(InGameNoticeMap[type]) do
|
|
|
|
|
for i, _ in ipairs(notice.Content) do
|
|
|
|
|
if XNoticeManager.CheckInGameNoticeRedPointIndividual(notice, i) then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.InitInGameReadList(noticeList)
|
|
|
|
|
if not noticeList then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not InGameNoticeReadList then
|
|
|
|
|
InGameNoticeReadList = {}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, noticeData in pairs(noticeList) do
|
|
|
|
|
for i, _ in pairs(noticeData.Content) do
|
|
|
|
|
local dataKey = XNoticeManager.GetGameNoticeReadDataKey(noticeData, i)
|
|
|
|
|
if not InGameNoticeReadList[dataKey] then
|
|
|
|
|
InGameNoticeReadList[dataKey] = {}
|
|
|
|
|
InGameNoticeReadList[dataKey].Id = noticeData.Id
|
|
|
|
|
InGameNoticeReadList[dataKey].EndTime = noticeData.EndTime
|
|
|
|
|
InGameNoticeReadList[dataKey].Index = i
|
|
|
|
|
InGameNoticeReadList[dataKey].IsRead = false
|
|
|
|
|
InGameNoticeReadList[dataKey].ModifyTime = noticeData.ModifyTime
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_ACTIVITY_NOTICE_READ_CHANGE)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetGameNoticeReadDataKey(noticeData, index)
|
|
|
|
|
return noticeData.Id .. "_" .. noticeData.ModifyTime .. "_" .. index
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.CheckInGameNoticeRedPointIndividual(notice, index)
|
|
|
|
|
if not InGameNoticeReadList then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local redPointKey = XNoticeManager.GetGameNoticeReadDataKey(notice, index)
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
if not InGameNoticeReadList[redPointKey] then
|
|
|
|
|
return false
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
return (not InGameNoticeReadList[redPointKey].IsRead and notice.BluePoint == 1)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.ChangeInGameNoticeReadStatus(dataKey, isRead)
|
|
|
|
|
if not InGameNoticeReadList then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
InGameNoticeReadList[dataKey].IsRead = isRead
|
|
|
|
|
XNoticeManager.SaveInGameNoticeReadList()
|
|
|
|
|
end
|
|
|
|
|
----------------------InGame Notice end----------------------
|
|
|
|
|
-------------------------Sub Menu beg------------------------
|
|
|
|
|
--[[ 二级菜单配置 json数据格式
|
|
|
|
|
{"Id":每次生成配置时的唯一标识,
|
|
|
|
|
"ModifyTime":配置最后修改时间,
|
|
|
|
|
"Content":配置具体内容,可以包含多个按钮 [
|
|
|
|
|
"Id":唯一按钮Id,
|
|
|
|
|
"Title":按钮名称,
|
|
|
|
|
"SubTitle":按钮描述(显示在第二行),
|
|
|
|
|
"JumpType":1表示网址,2表示游戏内跳转,
|
|
|
|
|
"JumpAddr":跳转地址,
|
|
|
|
|
"BeginTime":开始显示时间,
|
|
|
|
|
"EndTime":结束显示时间,
|
|
|
|
|
"AppearanceDay":一周内出现的日子,不填则为全部出现,
|
|
|
|
|
"AppearanceTime":每天出现的时间段,不填则为全天出现,
|
|
|
|
|
"TipResetTime":红点重置时间,
|
|
|
|
|
"ModifyTime":最后修改时间 ] * N }
|
|
|
|
|
--]]
|
2024-09-01 20:49:41 +00:00
|
|
|
|
function XNoticeManager.HandleRequestSubMenuNotice(notice)
|
|
|
|
|
SubMenuNoticeMap = {}
|
|
|
|
|
if not notice then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if type(notice) ~= "table" then
|
|
|
|
|
XLog.Error("SubMenu notice invalid format: " .. tostring(notice))
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, v in ipairs(notice.Content) do
|
|
|
|
|
if XNoticeManager.CheckNoticeValid(v) then
|
|
|
|
|
table.insert(SubMenuNoticeMap, v)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XNoticeManager.InitSubMenuReadList(notice)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetMainUiSubMenu()
|
|
|
|
|
XNoticeManager.RequestNoticeByType(XNoticeType.SubMenu, true)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
if not SubMenuNoticeMap then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--XLog.Warning("start",SubMenuNoticeMap)
|
|
|
|
|
|
|
|
|
|
local subMenuList = {}
|
|
|
|
|
for _, v in ipairs(SubMenuNoticeMap) do
|
|
|
|
|
local isOpen = true
|
|
|
|
|
|
|
|
|
|
if not v.BeginTime or not v.EndTime or not v.AppearanceDay or not v.AppearanceTime then
|
|
|
|
|
isOpen = false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
isOpen = false
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if XTime.GetServerNowTimestamp() >= tonumber(v.BeginTime) and XTime.GetServerNowTimestamp() < tonumber(v.EndTime) then
|
|
|
|
|
--是否在开放区间内(日期)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
isOpen = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
isOpen = false
|
|
|
|
|
if #v.AppearanceDay > 0 then
|
|
|
|
|
for _, day in ipairs(v.AppearanceDay) do
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if day == XDataCenter.FubenDailyManager.GetNowDayOfWeekByRefreshTime() then
|
|
|
|
|
--是否位于可以显示的周目
|
2023-07-14 19:35:33 +00:00
|
|
|
|
isOpen = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
isOpen = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
isOpen = false
|
|
|
|
|
if #v.AppearanceTime > 0 then
|
|
|
|
|
for _, time in ipairs(v.AppearanceTime) do
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if XTime.GetServerNowTimestamp() - XTime.GetTodayTime(0, 0, 0) >= time[1] and XTime.GetServerNowTimestamp() - XTime.GetTodayTime(0, 0, 0) < time[2] then
|
|
|
|
|
--是否位于可以显示的时间段
|
2023-07-14 19:35:33 +00:00
|
|
|
|
isOpen = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
isOpen = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
if v.DisappearanceCondition and #v.DisappearanceCondition > 0 then
|
2024-09-01 20:49:41 +00:00
|
|
|
|
for _, condition in ipairs(v.DisappearanceCondition) do
|
|
|
|
|
--是否符合不显示的条件
|
2023-07-14 19:35:33 +00:00
|
|
|
|
if XConditionManager.CheckCondition(condition) then
|
|
|
|
|
isOpen = false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
if v.AppearanceCondition and #v.AppearanceCondition > 0 then
|
|
|
|
|
for _, condition in ipairs(v.AppearanceCondition) do
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if not XConditionManager.CheckCondition(condition) then
|
|
|
|
|
--是否不符合显示条件
|
2023-07-14 19:35:33 +00:00
|
|
|
|
isOpen = false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
if not XNoticeManager.IsWhiteIp(v.WhiteLists) then
|
|
|
|
|
isOpen = false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if isOpen then
|
|
|
|
|
table.insert(subMenuList, v)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return subMenuList
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
function XNoticeManager.CheckSubMenuRedPoint()
|
|
|
|
|
if not SubMenuNoticeMap then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, data in pairs(SubMenuNoticeMap) do
|
|
|
|
|
if XNoticeManager.CheckSubMenuRedPointIndividual(data.Id) then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.InitSubMenuReadList(notice)
|
|
|
|
|
if not notice then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not SubMenuNoticeReadList then
|
|
|
|
|
SubMenuNoticeReadList = {}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, noticeData in pairs(notice.Content) do
|
|
|
|
|
local dataKey = noticeData.Id
|
|
|
|
|
if not SubMenuNoticeReadList[dataKey] then
|
|
|
|
|
SubMenuNoticeReadList[dataKey] = {}
|
|
|
|
|
SubMenuNoticeReadList[dataKey].Id = noticeData.Id
|
|
|
|
|
SubMenuNoticeReadList[dataKey].LastReadTime = 0
|
|
|
|
|
end
|
|
|
|
|
SubMenuNoticeReadList[dataKey].EndTime = noticeData.EndTime
|
|
|
|
|
SubMenuNoticeReadList[dataKey].TipResetTime = noticeData.TipResetTime or 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_ACTIVITY_SUBMENU_READ_CHANGE)
|
|
|
|
|
-- CsXGameEventManager.Instance:Notify(XEventId.EVENT_ACTIVITY_SUBMENU_READ_CHANGE)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.CheckSubMenuRedPointIndividual(id)
|
|
|
|
|
if not SubMenuNoticeReadList then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local data = SubMenuNoticeReadList[id]
|
|
|
|
|
if not data then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if data.TipResetTime > XTime.GetServerNowTimestamp() then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
return data.LastReadTime < data.TipResetTime
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.ChangeSubMenuReadStatus(dataKey, time)
|
|
|
|
|
if not SubMenuNoticeReadList then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
SubMenuNoticeReadList[dataKey].LastReadTime = time or XTime.GetServerNowTimestamp()
|
|
|
|
|
--XLog.Warning("ChangeSubMenuReadStatus",SubMenuNoticeReadList)
|
|
|
|
|
XNoticeManager.SaveSubMenuNoticeReadList()
|
|
|
|
|
end
|
|
|
|
|
-------------------------Sub Menu end------------------------
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
----------------------------------------login beg----------------------------------------
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
function XNoticeManager.RequestLoginNotice(cb, ...)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
local requestCb = function(notice)
|
|
|
|
|
local valid = XNoticeManager.CheckNoticeValid(notice, os.time())
|
|
|
|
|
if not valid then
|
|
|
|
|
if cb then
|
|
|
|
|
cb(valid)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local msgtab = {}
|
|
|
|
|
msgtab.error = valid
|
|
|
|
|
CS.XRecord.Record(msgtab, "24000", "RequestLoginNoticeError")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if LoginNotice and LoginNotice.Id == notice.Id and LoginNotice.ModifyTime == notice.ModifyTime then
|
|
|
|
|
if cb then
|
|
|
|
|
cb(valid)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local msgtab = {}
|
|
|
|
|
msgtab.error = valid
|
|
|
|
|
CS.XRecord.Record(msgtab, "24006", "RequestLoginNoticeError")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
LoginNotice = notice
|
|
|
|
|
local openNotice = false
|
|
|
|
|
if XNoticeManager.CheckLoginNoticeDailyAutoShow(LoginNotice) then
|
|
|
|
|
openNotice = true
|
|
|
|
|
end
|
|
|
|
|
CS.XRecord.Record("24005", "RequestLoginNoticeEnd")
|
|
|
|
|
if cb then
|
|
|
|
|
cb(valid, openNotice)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
CS.XRecord.Record("24004", "RequestLoginNoticeStart")
|
|
|
|
|
XNoticeManager.RequestNotice(XNoticeType.Login, requestCb, requestCb, RequestInterval[XNoticeType.Login])
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
function XNoticeManager.AutoOpenLoginNotice()
|
|
|
|
|
if XNoticeManager.CheckLoginNoticeDailyAutoShow(LoginNotice) then
|
|
|
|
|
if not XNoticeManager.CheckNoticeValid(LoginNotice, os.time()) then
|
2024-09-01 20:49:41 +00:00
|
|
|
|
return false
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
XLuaUiManager.Open("UiLoginNotice", LoginNotice, true)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
XNoticeManager.RefreshLoginNoticeTime()
|
2024-09-01 20:49:41 +00:00
|
|
|
|
return true
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.CheckHasOpenLoginNotice()
|
|
|
|
|
local isSelect = XSaveTool.GetData(LoginNoticAutoOpenKey)
|
|
|
|
|
|
|
|
|
|
return isSelect or false
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
function XNoticeManager.SaveOpenLoginNoticeValue(value)
|
|
|
|
|
XSaveTool.SaveData(LoginNoticAutoOpenKey, value)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.OpenLoginNotice()
|
|
|
|
|
if not LoginNotice then
|
|
|
|
|
XNoticeManager.RequestLoginNotice(function(isValid)
|
|
|
|
|
if isValid then
|
|
|
|
|
XLuaUiManager.Open("UiLoginNotice", LoginNotice, true)
|
|
|
|
|
XNoticeManager.RefreshLoginNoticeTime()
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
else
|
|
|
|
|
if not XNoticeManager.CheckNoticeValid(LoginNotice, os.time()) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XLuaUiManager.Open("UiLoginNotice", LoginNotice, true)
|
|
|
|
|
XNoticeManager.RefreshLoginNoticeTime()
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.ReadLoginNoticeTime()
|
|
|
|
|
local cache = CS.UnityEngine.PlayerPrefs.GetString(LoginNoticeCacheKey)
|
|
|
|
|
if string.IsNilOrEmpty(cache) then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
LoginNoticeTimeInfo = Json.decode(cache)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.CheckLoginNoticeDailyAutoShow(notice)
|
|
|
|
|
if not notice then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local id = notice.Id .. notice.ModifyTime
|
|
|
|
|
local resetTime = CS.XReset.GetNextDailyResetTime() - CS.XDateUtil.ONE_DAY_SECOND
|
|
|
|
|
if LoginNoticeTimeInfo[id] and LoginNoticeTimeInfo[id].Time > resetTime then
|
|
|
|
|
return not XNoticeManager.CheckHasOpenLoginNotice()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.RefreshLoginNoticeTime()
|
|
|
|
|
if not LoginNotice then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local id = LoginNotice.Id .. LoginNotice.ModifyTime
|
|
|
|
|
LoginNoticeTimeInfo[id] = {
|
|
|
|
|
Id = id,
|
|
|
|
|
-- 此处有可能无法获取到真实时间(尚未与服务端同步时间)
|
|
|
|
|
--Time = XTime.GetServerNowTimestamp()
|
|
|
|
|
|
|
|
|
|
-- 既然如此, 用本地时间就好了
|
|
|
|
|
Time = XTime.GetLocalNowTimestamp()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CS.UnityEngine.PlayerPrefs.SetString(LoginNoticeCacheKey, Json.encode(LoginNoticeTimeInfo))
|
|
|
|
|
CS.UnityEngine.PlayerPrefs.Save()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.CheckLoginNoticeValid(time)
|
|
|
|
|
return XNoticeManager.CheckNoticeValid(LoginNotice, time)
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
----------------------------------------login end----------------------------------------
|
2024-09-01 20:49:41 +00:00
|
|
|
|
--region ------------------游戏公告 start-------------------
|
|
|
|
|
|
|
|
|
|
---@desc 打开公告界面,公告类型可能为空,只要有公告就打开界面
|
|
|
|
|
---@param announcementType 游戏内公告类型
|
|
|
|
|
function XNoticeManager.OpenGameNotice(announcementType, defaultId)
|
|
|
|
|
local empty = true
|
|
|
|
|
for _, noticeType in pairs(InGameNoticeType) do
|
|
|
|
|
local hasNotice = XNoticeManager.CheckHaveNotice(noticeType)
|
|
|
|
|
if hasNotice then
|
|
|
|
|
empty = false
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if empty then
|
|
|
|
|
XUiManager.TipText("NoInGameNotice")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local _, infoList = XNoticeManager.GetAutoOpenNoticeInfos()
|
|
|
|
|
--将所有需要弹出的公告标记为已弹出
|
|
|
|
|
for _, info in ipairs(infoList) do
|
|
|
|
|
XNoticeManager.MarkInGameNoticeAutoMap(info.Id, info.ModifyTime)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XLuaUiManager.Open("UiAnnouncement", announcementType, defaultId)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
---@desc 获取游戏内需要展示的公告下标
|
|
|
|
|
---@param noticeType 公告类型
|
|
|
|
|
---@return number
|
|
|
|
|
function XNoticeManager.GetShowNoticeIndex(noticeType)
|
|
|
|
|
local noticeInfo = XDataCenter.NoticeManager.GetInGameNoticeMap(noticeType)
|
|
|
|
|
if not noticeInfo then
|
|
|
|
|
XLog.Warning("XNoticeManager.GetShowNoticeIndex: not exist notice info!, noticeType = " .. noticeType)
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local index = 1
|
|
|
|
|
--再判断红点
|
|
|
|
|
for idx, info in pairs(noticeInfo) do
|
|
|
|
|
for i, _ in ipairs(info.Content) do
|
|
|
|
|
if XNoticeManager.CheckInGameNoticeRedPointIndividual(info, i) then
|
|
|
|
|
return idx
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return index
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- 登陆界面请求游戏内公告
|
|
|
|
|
---@param cb 回调
|
|
|
|
|
---@param timeStamp 判断时间戳
|
|
|
|
|
---@return nil
|
|
|
|
|
--------------------------
|
|
|
|
|
function XNoticeManager.RequestInGameNotice(cb, timeStamp)
|
|
|
|
|
|
|
|
|
|
--如果未登陆到游戏服,无法获取服务器时间
|
|
|
|
|
local timeOfNow = timeStamp and timeStamp or XTime.GetServerNowTimestamp()
|
|
|
|
|
|
|
|
|
|
local checkCb = function()
|
|
|
|
|
local valid, _ = XNoticeManager.GetAutoOpenNoticeInfos()
|
|
|
|
|
if cb then cb(valid) end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local handler = function(notice)
|
|
|
|
|
InGameNoticeMap = {}
|
|
|
|
|
notice = notice or {}
|
|
|
|
|
|
|
|
|
|
for _, v in ipairs(notice) do
|
|
|
|
|
if not XNoticeManager.CheckNoticeValid(v, timeOfNow) then
|
|
|
|
|
goto continue
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not InGameNoticeMap[v.Type] then
|
|
|
|
|
InGameNoticeMap[v.Type] = {}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local content = {}
|
|
|
|
|
for _, item in ipairs(v.Content) do
|
|
|
|
|
if XNoticeManager.IsWhiteIp(item.WhiteLists) then
|
|
|
|
|
table.insert(content, item)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if #content > 0 then
|
|
|
|
|
v.Content = content
|
|
|
|
|
table.insert(InGameNoticeMap[v.Type], v)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
::continue::
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, v in pairs(InGameNoticeMap) do
|
|
|
|
|
XNoticeManager.InitInGameReadList(v)
|
|
|
|
|
|
|
|
|
|
local sortFunc = function(l, r)
|
|
|
|
|
return l.Order > r.Order
|
|
|
|
|
end
|
|
|
|
|
table.sort(v, sortFunc)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
checkCb()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XNoticeManager.RequestNotice(XNoticeType.InGame, handler, handler, NoticeRequestTimerInterval, checkCb)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetAutoOpenNoticeInfos()
|
|
|
|
|
if XTool.IsTableEmpty(InGameNoticeMap) then
|
|
|
|
|
return false, {}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local infoList = {}
|
|
|
|
|
local autoMap = XNoticeManager.GetInGameNoticeAutoMap()
|
|
|
|
|
for _, type in pairs(InGameNoticeType) do
|
|
|
|
|
local noticeInfo = XDataCenter.NoticeManager.GetInGameNoticeMap(type)
|
|
|
|
|
if noticeInfo then
|
|
|
|
|
for _, info in pairs(noticeInfo) do
|
|
|
|
|
local autoKey = XNoticeManager.GetInGameNoticeAutoPopupKey(info.Id, info.ModifyTime)
|
|
|
|
|
if info.LoginEject and info.LoginEject == 1 and not autoMap[autoKey] then
|
|
|
|
|
tableInsert(infoList, info)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if XTool.IsTableEmpty(infoList) then
|
|
|
|
|
return false, {}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local count = #infoList
|
|
|
|
|
if count > 1 then
|
|
|
|
|
table.sort(infoList, function(a, b)
|
|
|
|
|
local timeA = a.BeginTime
|
|
|
|
|
local timeB = b.BeginTime
|
|
|
|
|
return timeA > timeB
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return true, infoList
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- 自动打开公告界面,并选中对应公告。自动弹出时会将所有需要弹出公告标记为已弹出
|
|
|
|
|
--------------------------
|
|
|
|
|
function XNoticeManager.AutoOpenInGameNotice()
|
|
|
|
|
local valid, infoList = XNoticeManager.GetAutoOpenNoticeInfos()
|
|
|
|
|
if not valid then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--将所有需要弹出的公告标记为已弹出
|
|
|
|
|
for _, info in ipairs(infoList) do
|
|
|
|
|
XNoticeManager.MarkInGameNoticeAutoMap(info.Id, info.ModifyTime)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local selectInfo = infoList[1]
|
|
|
|
|
XNoticeManager.OpenGameNotice(selectInfo.Type, selectInfo.Id)
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
--endregion------------------游戏公告 finish------------------
|
2023-07-14 19:35:33 +00:00
|
|
|
|
----------------------------image process beg----------------------------
|
|
|
|
|
function XNoticeManager.LoadPicFromLocal(url, successCb)
|
|
|
|
|
if NoticePicList and NoticePicList[url] then
|
|
|
|
|
if successCb then
|
|
|
|
|
successCb(NoticePicList[url])
|
|
|
|
|
end
|
|
|
|
|
return NoticePicList[url]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local fileName = XNoticeManager.GetImgNameByUrl(url)
|
|
|
|
|
CS.XTool.LoadLocalNoticeImg(fileName, function(texture)
|
|
|
|
|
if not texture then
|
|
|
|
|
XNoticeManager.LoadPic(url, successCb)
|
|
|
|
|
else
|
|
|
|
|
NoticePicList[url] = texture
|
|
|
|
|
if successCb then
|
|
|
|
|
successCb(texture)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.LoadPic(url, successCb)
|
|
|
|
|
local request = CS.XUriPrefixRequest.Get(url, function()
|
|
|
|
|
return CS.UnityEngine.Networking.DownloadHandlerTexture(true)
|
|
|
|
|
end, NoticeRequestTimeOut, false)
|
|
|
|
|
|
|
|
|
|
CS.XTool.WaitCoroutine(request:SendWebRequest(), function()
|
|
|
|
|
if request.isNetworkError or request.isHttpError then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local texture = request.downloadHandler.texture;
|
|
|
|
|
if not texture then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local fileName = XNoticeManager.GetImgNameByUrl(url)
|
|
|
|
|
CS.XTool.SaveNoticeImg(fileName, texture)
|
|
|
|
|
|
|
|
|
|
NoticePicList[url] = texture
|
|
|
|
|
if successCb then
|
|
|
|
|
successCb(texture)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
request:Dispose()
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.GetImgNameByUrl(url)
|
|
|
|
|
local _, _, _, fileName = url:find("(.+)/(.+)")
|
|
|
|
|
return fileName
|
|
|
|
|
end
|
|
|
|
|
----------------------------image process end----------------------------
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
--function XNoticeManager.UrlDecode(s)
|
|
|
|
|
-- s = string.gsub(s, '%%(%x%x)', function(h)
|
|
|
|
|
-- return string.char(tonumber(h, 16))
|
|
|
|
|
-- end)
|
|
|
|
|
-- return s
|
|
|
|
|
--end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
function XNoticeManager.CheckNoticeValid(notice, nowTime)
|
|
|
|
|
if not notice then
|
|
|
|
|
return false
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
nowTime = nowTime or XTime.GetServerNowTimestamp()
|
|
|
|
|
if nowTime < notice.BeginTime then
|
|
|
|
|
return false
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if nowTime > notice.EndTime then
|
|
|
|
|
return false
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if not XNoticeManager.IsWhiteIp(notice.WhiteLists) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 发布渠道
|
|
|
|
|
local channelInfoList = notice.ChannelInfoList
|
|
|
|
|
if channelInfoList then
|
|
|
|
|
local myChannel = CS.XHeroSdkAgent.GetChannelId()
|
|
|
|
|
local isMyChannelInclude = false
|
|
|
|
|
for i = 1, #channelInfoList do
|
|
|
|
|
local channel = channelInfoList[i]
|
|
|
|
|
if channel == myChannel then
|
|
|
|
|
isMyChannelInclude = true
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if not isMyChannelInclude then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 发布平台 pc,ios,android
|
|
|
|
|
local loginPlatformList = notice.LoginPlatformList
|
|
|
|
|
if loginPlatformList then
|
|
|
|
|
local myPlatform = XUserManager.Platform
|
|
|
|
|
local isMyPlatformInclude = false
|
|
|
|
|
for i = 1, #loginPlatformList do
|
|
|
|
|
local platform = loginPlatformList[i]
|
|
|
|
|
if platform == myPlatform then
|
|
|
|
|
isMyPlatformInclude = true
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if not isMyPlatformInclude then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
return true
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
function XNoticeManager.IsWhiteIp(whiteList)
|
|
|
|
|
if not whiteList then
|
|
|
|
|
return true
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if string.IsNilOrEmpty(Ip) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
for _, whiteIp in pairs(whiteList) do
|
|
|
|
|
if string.find(Ip, whiteIp) then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
return false
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
function XNoticeManager.RequestNoticeByType(noticeType, proactiveRequest)
|
|
|
|
|
local successCb = NoticeRequestHandler[noticeType]
|
|
|
|
|
local failCb = NoticeRequestFailHandler[noticeType]
|
|
|
|
|
local interval = proactiveRequest and NoticeRequestTimerInterval or RequestInterval[noticeType]
|
|
|
|
|
-- XLog.Warning("RequestNoticeByType", NoticeRequestTimerInterval, "type", RequestInterval[noticeType], "主动", proactiveRequest)
|
|
|
|
|
XNoticeManager.RequestNotice(noticeType, successCb, failCb, interval)
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
function XNoticeManager.RequestNotice(noticeType, successCb, failCb, interval, unaskedCb)
|
|
|
|
|
if DisableFunction or not noticeType then
|
|
|
|
|
if unaskedCb then unaskedCb() end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local nowTime = XTime.GetServerNowTimestamp()
|
|
|
|
|
--if ((not nowTime) or (not noticeType) or (not interval)) then
|
|
|
|
|
-- XLog.Warning("XNoticeManager nowTime", nowTime,"noticeType", noticeType,"LastRequestTime", LastRequestTime[noticeType],"interval", interval)
|
|
|
|
|
--end
|
|
|
|
|
if LastRequestTime[noticeType] and LastRequestTime[noticeType] > 0
|
|
|
|
|
and nowTime - LastRequestTime[noticeType] < interval then
|
|
|
|
|
if unaskedCb then unaskedCb() end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
LastRequestTime[noticeType] = nowTime
|
|
|
|
|
|
|
|
|
|
local url = XNoticeManager.GetNoticeUrl(noticeType)
|
|
|
|
|
|
|
|
|
|
if string.IsNilOrEmpty(url) then
|
|
|
|
|
if unaskedCb then unaskedCb() end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local request = CS.XUriPrefixRequest.Get(url, nil, NoticeRequestTimeOut, false, true)
|
|
|
|
|
CS.XTool.WaitCoroutine(request:SendWebRequest(), function()
|
|
|
|
|
if not request then
|
|
|
|
|
if failCb then
|
|
|
|
|
failCb()
|
|
|
|
|
end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if request.isNetworkError or
|
|
|
|
|
request.isHttpError or
|
|
|
|
|
not request.downloadHandler or
|
|
|
|
|
string.IsNilOrEmpty(request.downloadHandler.text) then
|
|
|
|
|
if failCb then
|
|
|
|
|
failCb()
|
|
|
|
|
end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local ok, notice = pcall(Json.decode, request.downloadHandler.text)
|
|
|
|
|
if not ok then
|
|
|
|
|
XLog.Error("XNoticeManager json 解码失败. 数据是:", request.downloadHandler.data)
|
|
|
|
|
if failCb then
|
|
|
|
|
failCb()
|
|
|
|
|
end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not notice then
|
|
|
|
|
if failCb then
|
|
|
|
|
failCb()
|
|
|
|
|
end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if successCb then
|
|
|
|
|
successCb(notice)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_NOTICE_REQUEST_SUCCESS, noticeType)
|
|
|
|
|
|
|
|
|
|
request:Dispose()
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.InitTimer()
|
|
|
|
|
if NoticeRequestTimer then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for noticeType, _ in pairs(RequestInterval) do
|
|
|
|
|
XNoticeManager.RequestNoticeByType(noticeType)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
NoticeRequestTimer = XScheduleManager.ScheduleForever(function()
|
|
|
|
|
for noticeType, _ in pairs(RequestInterval) do
|
|
|
|
|
XNoticeManager.RequestNoticeByType(noticeType)
|
|
|
|
|
end
|
|
|
|
|
end, NoticeRequestTimerInterval * 1000)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.OnLogin()
|
|
|
|
|
XNoticeManager.ReadScrollCountList()
|
|
|
|
|
--登录时刷新玩家的蓝点
|
|
|
|
|
XNoticeManager.ReadInGameNoticeReadList()
|
|
|
|
|
XNoticeManager.ReadTextNoticeHideCache()
|
|
|
|
|
XNoticeManager.ReadSubMenuNoticeReadList()
|
|
|
|
|
|
|
|
|
|
XNoticeManager.InitTimer()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.OnLogout()
|
|
|
|
|
if NoticeRequestTimer then
|
|
|
|
|
XScheduleManager.UnSchedule(NoticeRequestTimer)
|
|
|
|
|
NoticeRequestTimer = nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, v in pairs(NoticePicList) do
|
|
|
|
|
if v and v:Exist() then
|
|
|
|
|
CS.UnityEngine.Object.Destroy(v)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
NoticePicList = {}
|
|
|
|
|
end
|
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
--检测请求开关
|
|
|
|
|
function XNoticeManager.CheckFuncDisable()
|
|
|
|
|
return XSaveTool.GetData(XPrefs.NoticeTrigger)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XNoticeManager.ChangeFuncDisable(state)
|
|
|
|
|
DisableFunction = state
|
|
|
|
|
XSaveTool.SaveData(XPrefs.NoticeTrigger, DisableFunction)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
function XNoticeManager.Init()
|
|
|
|
|
DisableFunction = XMain.IsDebug and XNoticeManager.CheckFuncDisable()
|
|
|
|
|
XNoticeManager.InitNoticeCdnUrl()
|
|
|
|
|
XNoticeManager.RequestIp()
|
|
|
|
|
XNoticeManager.ReadLoginNoticeTime()
|
|
|
|
|
--未登陆时使用通用蓝点
|
|
|
|
|
XNoticeManager.ReadInGameNoticeReadList()
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
XEventManager.AddEventListener(XEventId.EVENT_USER_LOGOUT, XNoticeManager.OnLogout)
|
|
|
|
|
XEventManager.AddEventListener(XEventId.EVENT_LOGIN_DATA_LOAD_COMPLETE, XNoticeManager.OnLogin)
|
|
|
|
|
XEventManager.AddEventListener(XEventId.EVENT_PHOTO_ENTER, function()
|
|
|
|
|
ScreenShotFlag = true
|
|
|
|
|
end)
|
|
|
|
|
XEventManager.AddEventListener(XEventId.EVENT_PHOTO_LEAVE, function()
|
|
|
|
|
ScreenShotFlag = false
|
|
|
|
|
end)
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
XNoticeManager.Init()
|
|
|
|
|
return XNoticeManager
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|