PGRData/Script/matrix/xmanager/XMailManager.lua

406 lines
No EOL
12 KiB
Lua

XMailManagerCreator = function()
local XMailManager = {}
local tableInsert = table.insert
local METHOD_NAME = {
MailReadRequest = "MailReadRequest",
MailGetRewardRequest = "MailGetRewardRequest",
MailGetSingleRewardRequest = "MailGetSingleRewardRequest",
MailDeleteRequest = "MailDeleteRequest",
}
local MailCache = {}
-- local lastSyncServerTime = 0
local NewMailMark = false
XMailManager.MAIL_STATUS_UNREAD = 0
XMailManager.MAIL_STATUS_READ = 1
XMailManager.MAIL_STATUS_GETREWARD = 3
XMailManager.MAIL_STATUS_DELETE = 4
local STATUS_UNREAD = 0
local STATUS_READ = 1 << 0
local STATUS_GETREWARD = STATUS_READ | (1 << 1)
local STATUS_DELETE = 1 << 2
function XMailManager.GetRewardList(mailId)
return XMailConfigs.GetRewardList(mailId)
end
--==============================--
--desc: 检查邮件是否过期或失效
--@mailId: 邮件id
--@return
--==============================--
local function CheckMailExpire(mailId)
local mail = MailCache[mailId]
if not mail then
return true
end
if mail.Status == STATUS_DELETE then
return true
end
if not mail.ExpireTime or mail.ExpireTime <= 0 then
return false
end
return XTime.GetServerNowTimestamp() > mail.ExpireTime
end
--==============================--
--desc: 删除邮件数据
--@mailId: 邮件id
--@return
--==============================--
local function DeleteMail(mailId)
MailCache[mailId] = nil
end
--==============================--
--desc: 更新邮件数据
--@mailData: 邮件数据
--@return
--==============================--
local function UpdateMail(mailData)
MailCache[mailData.Id] = mailData
end
--==============================--
--desc: 处理邮件数据
--@return
--==============================--
local function DealMailDatas(mailList, expireIdList)
if mailList then
for _, mail in pairs(mailList) do
UpdateMail(mail)
end
end
if expireIdList then
for _, id in pairs(expireIdList) do
DeleteMail(id)
end
end
XEventManager.DispatchEvent(XEventId.EVENT_MAIL_SYNC)
end
function XMailManager.SyncMailEvent()
XEventManager.DispatchEvent(XEventId.EVENT_MAIL_SYNC)
end
function XMailManager.IsRead(status)
return (status & STATUS_READ) == STATUS_READ
end
function XMailManager.IsGetReward(status)
return (status & STATUS_GETREWARD) == STATUS_GETREWARD
end
function XMailManager.IsDelete(status)
return (status & STATUS_DELETE) == STATUS_DELETE
end
function XMailManager.SetMailStatus(id, status)
local mail = MailCache[id]
if not mail then
return
end
if status == STATUS_UNREAD or (mail.Status & status) == status then
return
end
mail.Status = mail.Status | status
end
function XMailManager.GetNewMailMark()
return NewMailMark
end
function XMailManager:GetIsUnReadMail()
local mailList = XMailManager.GetMailList()
for _, mailInfo in pairs(mailList) do
if mailInfo.Status == XMailManager.MAIL_STATUS_UNREAD then
return true
end
end
return false
end
function XMailManager.ReadMail(mailId)
if CheckMailExpire(mailId) then
return
end
local mail = MailCache[mailId]
if XMailManager.IsRead(mail.Status) or XMailManager.IsDelete(mail.Status) then
return
end
XNetwork.Call(METHOD_NAME.MailReadRequest, { Id = mailId }, function(res)
if res.Code == XCode.Success then
if XMailManager.HasMailReward(mailId) then
XMailManager.SetMailStatus(mailId, STATUS_READ)
XEventManager.DispatchEvent(XEventId.EVENT_MAIL_READ, mailId)
else
XMailManager.SetMailStatus(mailId, STATUS_GETREWARD)
XEventManager.DispatchEvent(XEventId.MAIL_STATUS_GETREWARD, mailId)
end
end
end)
end
function XMailManager.GetMailReward(mailId, cb)
if not XMailManager.HasMailReward(mailId) then
XUiManager.TipText("MailGetRewardEmpty")
return
end
local mailData = MailCache[mailId]
if XMailManager.IsGetReward(mailData.Status) then
XUiManager.TipCode(XCode.MailManagerGetRewardRepeat)
return
end
if CheckMailExpire(mailId) then
DeleteMail(mailId)
XUiManager.TipCode(XCode.MailManagerMailWasInvalid)
cb(mailId)
return
end
XNetwork.Call(METHOD_NAME.MailGetSingleRewardRequest, { Id = mailId }, function(res)
local func = function()
if res.Status == XMailManager.MAIL_STATUS_DELETE then
DeleteMail(mailId)
XUiManager.TipCode(XCode.MailManagerMailWasInvalid)
cb(mailId)
return
end
XMailManager.SetMailStatus(mailId, res.Status)
XEventManager.DispatchEvent(XEventId.EVENT_MAIL_GET_MAIL_REWARD)
cb()
end
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
func()
else
XUiManager.OpenUiObtain(res.RewardGoodsList, nil, func)
end
end)
end
function XMailManager.GetAllMailReward(cb)
local mailIds = {}
for id, mail in pairs(MailCache) do
if CheckMailExpire(id) then
DeleteMail(id)
elseif XMailManager.HasMailReward(id) and not XMailManager.IsGetReward(mail.Status) then
tableInsert(mailIds, id)
end
end
if #mailIds <= 0 then
XUiManager.TipText("MailGetRewardEmpty")
cb()
return
end
XNetwork.Call(METHOD_NAME.MailGetRewardRequest, { IdList = mailIds }, function(res)
local func = function(resCode)
if resCode == XCode.Success then
if cb then
cb()
end
XEventManager.DispatchEvent(XEventId.EVENT_MAIL_GET_ALL_MAIL_REWARD)
elseif resCode == XCode.MailManagerGetMailRewardSomeGoodsMoreThanCapacity then
local title = CS.XTextManager.GetText("TipTitle")
XUiManager.DialogTip(title, CS.XTextManager.GetCodeText(resCode), XUiManager.DialogType.Normal, cb, cb)
else
XUiManager.TipCode(resCode)
if cb then
cb()
end
end
end
if res.MailStatus then
for id, status in pairs(res.MailStatus) do
if status == XMailManager.MAIL_STATUS_DELETE then
DeleteMail(id)
else
XMailManager.SetMailStatus(id, status)
end
end
end
if res.RewardGoodsList and #res.RewardGoodsList > 0 then
XUiManager.OpenUiObtain(res.RewardGoodsList, nil, function()
func(res.Code)
end)
else
func(res.Code)
end
end)
end
function XMailManager.DeleteMail(cb)
XNetwork.Call(METHOD_NAME.MailDeleteRequest, nil, function(res)
if res.DelIdList then
for _, id in pairs(res.DelIdList) do
DeleteMail(id)
end
end
XEventManager.DispatchEvent(XEventId.EVENT_MAIL_DELETE)
cb()
end)
end
--==============================--
--desc: 获取邮件列表 (未读未领奖 > 已读未领奖 > 已读已领奖(没附件相当于已领奖)> 创建时间 > 过期时间)
--@return
--==============================--
function XMailManager.GetMailList()
local list = {}
for k, mail in pairs(MailCache) do
if mail.Status == STATUS_READ then
if XMailManager.HasMailReward(mail.Id) then
XMailManager.SetMailStatus(mail.Id, STATUS_READ)
else
XMailManager.SetMailStatus(mail.Id, STATUS_GETREWARD)
end
end
if not CheckMailExpire(k) then
tableInsert(list, mail)
end
end
table.sort(list, function(a, b)
if a.Status ~= b.Status then
return a.Status < b.Status
else
return a.ExpireTime < b.ExpireTime
end
end)
return list
end
function XMailManager.GetMailCount()
local list = {}
for k, mail in pairs(MailCache) do
if not CheckMailExpire(k) then
tableInsert(list, mail)
end
end
return #list
end
function XMailManager.GetMailCache(mailId)
return MailCache[mailId]
end
function XMailManager.HasMailReward(mailId)
local mail = MailCache[mailId]
if not mail then
return false
end
local rewardList = mail.RewardGoodsList
if not rewardList then
return false
end
if #rewardList > 0 then
return true
end
return false
end
function XMailManager.IsMailGetReward(mailId)
local mail = MailCache[mailId]
if not mail then
return
end
return XMailManager.IsGetReward(mail.Status)
end
--检查红点-----------------------------------
--有未读或者有奖励未领取
function XMailManager.IsMailUnReadOrHasReward(mailId)
if not mailId then
return false
end
local mailData = MailCache[mailId]
if not mailData then
return false
end
if CheckMailExpire(mailId) then
return false
end
if not XMailManager.IsRead(mailData.Status) then
return true
end
if not XMailManager.IsGetReward(mailData.Status) and XMailManager.HasMailReward(mailId) then
return true
end
return false
end
--获取没处理的邮件
function XMailManager.GetHasUnDealMail()
local mailList = XMailManager.GetMailList()
local result = 0
for _, mailInfo in pairs(mailList) do
if XMailManager.IsMailUnReadOrHasReward(mailInfo.Id) then
result = result + 1
end
end
return result
end
---
--- 邮件是否达到数量上限
---@param hintTip boolean 是否弹出提示
function XMailManager.CheckMailIsOverLimit(hintTip)
local max = CS.XGame.Config:GetInt("MailCountLimit")
local cur = #XMailManager.GetMailList()
if (max - cur) < 1 then
if hintTip then
XUiManager.TipMsg(CS.XTextManager.GetText("MailBoxIsFull"))
end
return true
end
return false
end
function XMailManager.NotifyMails(data)
-- lastSyncServerTime = XTime.GetServerNowTimestamp()
DealMailDatas(data.NewMailList, data.ExpireIdList)
end
return XMailManager
end
XRpc.NotifyMails = function(data)
XDataCenter.MailManager.NotifyMails(data)
CsXGameEventManager.Instance:Notify(XEventId.EVENT_MAIL_COUNT_CHANGE)
end