c1_lua/lua/app/userdata/mail/mail_data.lua
2023-05-22 21:23:07 +08:00

256 lines
7.2 KiB
Lua

local MailData = class("MailData", BaseData)
local MailEntity = "app/userdata/mail/mail_entity"
local TIME_TYPE = {
DAY = 1,
WEEK = 2,
MONTH = 3,
}
function MailData:ctor()
self.mails = {}
self.checkNewMailTimsList = {}
self.needGetNewMail = false
self.data.isDirty = false
self.data.redPoint = false
self.maxMailId = 0
end
function MailData:clear()
self.mails = {}
self.data.redPoint = false
self.lastMailId = nil
self.mailIsOpen = false
DataManager:unregisterDataCd("MailData")
DataManager:unregisterCrossDayFunc("MailData")
end
function MailData:init(data)
data = data or GConst.EMPTY_TABLE
self.mails = {}
self.needGetNewMail = false
self:addMails(data.mails)
self:updateRedPointCd()
DataManager:registerDataCd("MailData")
DataManager:registerCrossDayFunc("MailData", function()
self:updateRedPointCd()
end)
end
function MailData:updateRedPointCd()
for i = 1, #self.checkNewMailTimsList do
table.remove(self.checkNewMailTimsList)
end
local cfg = ConfigManager:getConfig("mail")
for i,v in ipairs(cfg) do
if v.time_type == TIME_TYPE.DAY then
if #v.time_send == 3 then
local time = v.time_send[1] * 3600 + v.time_send[2] * 60 + v.time_send[3] + 1
local currTime = Time:getServerTime() % 86400
if time >= currTime then
local find = false
for k, v in ipairs(self.checkNewMailTimsList) do
if v == time then
find = true
break
end
end
if not find then
table.insert(self.checkNewMailTimsList, time)
end
end
end
elseif v.time_type == TIME_TYPE.WEEK then
if #v.time_send == 4 then -- 周几,时,分,秒
local day = v.time_send[1]
if day == Time:getDayofWeekUTC() then
local time = v.time_send[2] * 3600 + v.time_send[3] * 60 + v.time_send[4] + 1
local currTime = Time:getServerTime() % 86400
if time >= currTime then
local find = false
for k, v in ipairs(self.checkNewMailTimsList) do
if v == time then
find = true
break
end
end
if not find then
table.insert(self.checkNewMailTimsList, time)
end
end
end
end
elseif v.time_type == TIME_TYPE.MONTH then
if #v.time_send == 4 then -- 几号,时,分,秒
local offsetSeconds = math.floor(Time:getClientTimeZone() * 3600)
local time = Time:getServerTime()
local utcNow = os.date('!*t', time)
local targetTime = math.floor(os.time({day = v.time_send[1], month = utcNow.month, year = utcNow.year, hour = v.time_send[2], min = v.time_send[3], sec = v.time_send[4]})) + offsetSeconds
if targetTime >= time then -- 还没到目标时间
local diff = targetTime - time
local todayRemainTime = time % 86400 -- 到今天24点还剩余的秒数
if diff <= todayRemainTime then -- 今天内就能达到目标时间
local targetRemainTime = targetTime % 86400
local find = false
for k, v in ipairs(self.checkNewMailTimsList) do
if v == targetRemainTime then
find = true
break
end
end
if not find then
table.insert(self.checkNewMailTimsList, targetRemainTime)
end
end
end
end
end
end
end
function MailData:checkNewMail()
if #self.checkNewMailTimsList <= 0 then
return
end
local nowTime = Time:getServerTime() % 86400
for i = #self.checkNewMailTimsList, 1, -1 do
if self.checkNewMailTimsList[i] <= nowTime then
table.remove(self.checkNewMailTimsList, i)
EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.TIME_TRIGGERED_NEW_EMAIL)
break
end
end
end
function MailData:updateCd()
self:checkNewMail()
end
function MailData:addMails(mails)
if not mails then
return
end
for _, info in pairs(mails) do
local entity = require(MailEntity):create(info)
self.mails[info.id] = entity
if self.maxMailId < info.id then
self.maxMailId = info.id
end
end
self:setDirty()
self:refreshRedPoint()
end
function MailData:getMails()
return self.mails
end
function MailData:setDirty()
self.data.isDirty = not self.data.isDirty
end
function MailData:setMailReceived(id)
if not self.mails[id] then
return
end
self.mails[id]:receivedThis()
self:setDirty()
self:refreshRedPoint()
end
function MailData:setMailRead(id)
if not self.mails[id] then
return
end
self.mails[id]:readThis()
self:refreshRedPoint()
self:setDirty()
end
function MailData:deleteMail(ids)
if not ids then
return
end
for _, id in ipairs(ids) do
self.mails[id] = nil
end
self:setDirty()
end
function MailData:refreshRedPoint()
if self.needGetNewMail then
self.data.redPoint = true
self.isAdRedPoint = false
return
end
local reset = true
local haveNoAdRp = false
for id, entity in pairs(self.mails) do
if entity:canClaim() then
self.data.redPoint = true
if entity:getIsAdMail() then
if not haveNoAdRp then
self.isAdRedPoint = true
end
else
haveNoAdRp = true
self.isAdRedPoint = false
end
reset = false
end
end
if reset then
self.data.redPoint = false
self.isAdRedPoint = false
end
end
function MailData:getRedPoint()
return self.data.redPoint, self.isAdRedPoint
end
function MailData:setNeedGetNewMail(need)
self.needGetNewMail = need == true
if self.needGetNewMail then
self:refreshRedPoint()
end
end
function MailData:getNeedGetNewMail()
return self.needGetNewMail
end
function MailData:getLastMailId()
if not self.lastMailId then
self.lastMailId = LocalData:getLastMailId()
end
return self.lastMailId
end
function MailData:setLastMailId()
if not self.maxMailId or not self.lastMailId then
return
end
if self.lastMailId < self.maxMailId then
self.lastMailId = self.maxMailId
LocalData:setLastMailId(self.lastMailId)
end
end
function MailData:getIsOpen()
if not self.mailIsOpen then
self.mailIsOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.MAIL_OPEN, true)
end
return self.mailIsOpen
end
return MailData