Files
Main/Assets/GameAssets/Resources/Lua/Logic/Mail/MailSystem.lua

337 lines
12 KiB
Lua
Raw Normal View History

2025-01-25 04:38:09 +08:00
------------------------------------------------
-- 作者: xihan
-- 日期: 2020-01-13
-- 文件: MailSystem.lua
-- 模块: MailSystem
-- 描述: 邮件系统
------------------------------------------------
local MailSystem = {
-- 最大数量
MaxMailCount = 0,
-- 剩余未返给的邮件数量如果没有此值为0即可
RemainMailNum = 0,
-- 当前读取的邮件ID
CurReadMailId = -1,
-- 文字缓存
ContentList = List:New(),
-- 所有邮件(摘要)
AllMails = Dictionary:New(),
-- 缓存邮件详细信息
DetailInfos = Dictionary:New(),
-- 服务器发来到邮件列表
MsgMailList = {},
-- MSG 读邮件
ReqReadMail = nil,
-- MSG 领取附件内容
ReqReceiveSingleMailAttach = nil,
-- MSG 一键领取所有邮件的附件
ReqOneClickReceiveMailAttach = nil,
-- MSG 一键删除所有没有附件的邮件
ReqOneClickDeleteMail = nil
}
function MailSystem:Initialize()
self.MaxMailCount = tonumber(DataConfig.DataGlobal[33].Params)
end
function MailSystem:UnInitialize()
self.AllMails:Clear();
self.DetailInfos:Clear();
self.RemainMailNum = 0;
self.CurReadMailId = -1;
self.MsgMailList = {}
end
-- 刷新红点
function MailSystem:RefreshRepoint()
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.Mail, self:GetMailNumPrompt() > 0)
end
-- 排序
function MailSystem:SortMailList()
-- 1.未读2.时间大
local _keys = self.AllMails:GetKeys();
table.sort(_keys, function(a, b)
local _mailA = self.AllMails[a];
local _mailB = self.AllMails[b];
if _mailA.isRead == _mailB.isRead then
local _isGetA = _mailA.hasAttachment and not _mailA.isAttachReceived;
local _isGetB = _mailB.hasAttachment and not _mailB.isAttachReceived;
if _isGetA == _isGetB then
return self.AllMails[a].receiveTime > self.AllMails[b].receiveTime;
else
return _isGetA;
end
end
return _mailB.isRead;
end)
end
-- 获取邮件提示数量
function MailSystem:GetMailNumPrompt()
-- 未读的、已读有附件未领取到、服务器存储未发送的
local _allMails = self.AllMails;
local _keys = _allMails:GetKeys();
local _tipsCount = 0;
if #_keys > 0 then
for i = 1, #_keys do
local _mail = _allMails[_keys[i]];
if not _mail.isRead or (_mail.hasAttachment and not _mail.isAttachReceived) then
_tipsCount = _tipsCount + 1;
end
end
end
local _cnt = _tipsCount + self.RemainMailNum;
_cnt = _cnt > 999 and 999 or _cnt;
return _cnt;
end
-- MSG
-- 请求读取单封邮件
function MailSystem:ReqReadSingleMail(id)
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_OPEN);
if not self.ReqReadMail then
self.ReqReadMail = ReqMsg.MSG_Mail.ReqReadMail:New()
end
self.ReqReadMail.mailId = id
self.ReqReadMail:Send()
end
-- 请求获取当前阅读的邮件到奖励
function MailSystem:ReqGetRewardByCurRead()
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_OPEN);
self:ReqReceiveSingleMail(self.CurReadMailId)
end
-- 请求领取单封邮件的奖励
function MailSystem:ReqReceiveSingleMail(id)
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_OPEN);
if not self.ReqReceiveSingleMailAttach then
self.ReqReceiveSingleMailAttach = ReqMsg.MSG_Mail.ReqReceiveSingleMailAttach:New();
end
self.ReqReceiveSingleMailAttach.mailId = id;
self.ReqReceiveSingleMailAttach:Send();
end
-- 请求一键领取奖励
function MailSystem:ReqGetAllReward()
if not self.ReqOneClickReceiveMailAttach then
self.ReqOneClickReceiveMailAttach = ReqMsg.MSG_Mail.ReqOneClickReceiveMailAttach:New();
end
local _mailIds = self.ReqOneClickReceiveMailAttach.mailIdList;
local _allMails = self.AllMails;
local _keys = _allMails:GetKeys();
for i = 1, #_keys do
local _mail = _allMails[_keys[i]];
if _mail.hasAttachment and not _mail.isAttachReceived then
_mailIds:Add(_mail.mailId);
end
end
if #_mailIds <= 0 then
Utils.ShowPromptByEnum("NoRewardMail")
return false;
end
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_OPEN);
self.ReqOneClickReceiveMailAttach:Send();
_mailIds:Clear();
return true;
end
-- 请求删除当前阅读的邮件
function MailSystem:ReqDeleteByCurRead()
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_OPEN);
self:ReqDeleteMaill(self.CurReadMailId)
end
-- 请求删除邮件
function MailSystem:ReqDeleteMaill(id)
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_OPEN);
if not self.ReqOneClickDeleteMail then
self.ReqOneClickDeleteMail = ReqMsg.MSG_Mail.ReqOneClickDeleteMail:New()
end
self.ReqOneClickDeleteMail.mailIdList:Add(id);
self.ReqOneClickDeleteMail:Send()
self.ReqOneClickDeleteMail.mailIdList:Clear();
end
-- 请求一键删除邮件
function MailSystem:ReqDeleteAllMail()
if not self.ReqOneClickDeleteMail then
self.ReqOneClickDeleteMail = ReqMsg.MSG_Mail.ReqOneClickDeleteMail:New()
end
local _mailIds = self.ReqOneClickDeleteMail.mailIdList;
local _allMails = self.AllMails;
local _keys = _allMails:GetKeys();
for i = 1, #_keys do
local _mail = _allMails[_keys[i]];
if _mail.isRead and (not _mail.hasAttachment or (_mail.hasAttachment and _mail.isAttachReceived)) then
_mailIds:Add(_mail.mailId);
end
end
if #_mailIds <= 0 then
Utils.ShowPromptByEnum("NoDelateMail")
return
end
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_OPEN);
self.ReqOneClickDeleteMail:Send()
_mailIds:Clear();
end
-- 返给请求读取邮件
-- required MailDetailInfo mailDetailInfo = 1; //所读取邮件的详细信息
function MailSystem:ResReadMail(msg)
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_CLOSE);
local _mailDetailInfo = msg.mailDetailInfo;
if not _mailDetailInfo then
return;
end
local _mailId = _mailDetailInfo.mailId;
if _mailId then
local _mailInfo = self.AllMails[_mailId];
_mailInfo.isRead = true;
self.CurReadMailId = _mailId;
if self.DetailInfos:ContainsKey(_mailId) then
self.DetailInfos[_mailId] = _mailDetailInfo;
else
self.DetailInfos:Add(_mailId, _mailDetailInfo);
end
local _isReadTable = _mailDetailInfo.readTable;
local _GetByKeyFunc = DataConfig.DataMessageString.GetByKey;
local _mailTitle = _mailDetailInfo.mailTitle;
_mailDetailInfo.mailTitle = _isReadTable and _GetByKeyFunc(tonumber(_mailTitle)) or _mailTitle;
_mailDetailInfo.sender = _isReadTable and _GetByKeyFunc(tonumber(_mailDetailInfo.sender)) or _mailDetailInfo.sender;
if _isReadTable then
_mailDetailInfo.mailContent = self:CetContent(_mailDetailInfo.mailContent, _mailDetailInfo.paramlists);
end
-- 刷新界面
GameCenter.PushFixEvent(UILuaEventDefine.UIMailRefreshChangeMail);
-- 刷新小红点
self:RefreshRepoint();
-- 刷新界面数量
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MAIL_MAILNUM_PROMPT);
end
end
-- 返给领取单封邮件的附件物品
-- required uint64 mailId = 1; //所领取附件的邮件Id
-- required bool isAttachReceived = 2; //附件是否领取成功
function MailSystem:ResReceiveSingleMailAttach(msg)
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_CLOSE);
if msg.isAttachReceived then
self.AllMails[msg.mailId].isAttachReceived = true;
self.DetailInfos[msg.mailId].isAttachReceived = true;
else
Utils.ShowPromptByEnum("GetMailRewardFail")
end
-- 刷新界面
GameCenter.PushFixEvent(UILuaEventDefine.UIMailRefreshChangeMail);
-- 刷新小红点
self:RefreshRepoint();
-- 刷新界面数量
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MAIL_MAILNUM_PROMPT);
end
-- 返给客户端玩家邮件列表数据(登录、一键领取和删除后的同步需要发送此消息)
-- repeated MailSummaryInfo mailList = 1; //返给的邮件列表
-- required int32 remainMailNum = 2; //剩余未返给的邮件数量如果没有此值为0即可
function MailSystem:ResMailInfoList(msg)
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_CLOSE);
if not msg.mailList then
msg.mailList = {}
end
self.RemainMailNum = msg.remainMailNum;
self.AllMails:Clear();
self.DetailInfos:Clear();
self.MsgMailList = msg.mailList;
local _mailList = msg.mailList;
for i = 1, #_mailList do
local _mailMsgData = _mailList[i];
local _GetByKeyFunc = DataConfig.DataMessageString.GetByKey;
_mailMsgData.mailTitle = _mailMsgData.readTable and _GetByKeyFunc(tonumber(_mailMsgData.mailTitle)) or _mailMsgData.mailTitle;
self.AllMails:Add(_mailList[i].mailId, _mailMsgData);
end
-- 排序
self:SortMailList();
local _keys = self.AllMails:GetKeys();
self.CurReadMailId = #_keys > 0 and self.AllMails[_keys[1]].mailId or -1;
-- 刷新界面
GameCenter.PushFixEvent(UILuaEventDefine.UIMailRefreshUI);
-- 刷新小红点
self:RefreshRepoint();
-- 刷新界面数量
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MAIL_MAILNUM_PROMPT);
end
-- 新邮件通知
-- required MailSummaryInfo newMail = 1; //新邮件摘要信息
function MailSystem:ResNewMail(msg)
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_CLOSE);
if not msg.newMail then
return
end
-- 超过最大数量
Utils.ShowPromptByEnum("GetNewMail")
table.insert(self.MsgMailList, 1, msg.newMail);
if self.AllMails:Count() >= self.MaxMailCount then
self.RemainMailNum = self.RemainMailNum + 1;
Utils.ShowPromptByEnum("MailOverFlow")
for i = self.MaxMailCount + 1, #self.MsgMailList do
local _mail = table.remove(self.MsgMailList, i);
self.AllMails:Remove(_mail.mailId);
end
end
local _newMail = msg.newMail;
--是否有附件
if _newMail.hasAttachment then
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MAILEXISTITEMS);
end
local _GetByKeyFunc = DataConfig.DataMessageString.GetByKey;
_newMail.mailTitle = _newMail.readTable and _GetByKeyFunc(tonumber(_newMail.mailTitle)) or _newMail.mailTitle;
self.CurReadMailId = _newMail.mailId;
self.AllMails:Add(_newMail.mailId, _newMail);
-- 排序
self:SortMailList();
-- 刷新界面
GameCenter.PushFixEvent(UILuaEventDefine.UIMailRefreshUI);
-- 刷新小红点
self:RefreshRepoint();
-- 刷新界面数量
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_MAIL_MAILNUM_PROMPT);
end
function MailSystem:CetContent(content, params)
local _key = tonumber(content);
if not _key then
return content
end
local _content = DataConfig.DataMessageString.GetByKey(_key)
if _content and params then
self.ContentList:Clear();
for i = 1, #params do
if params[i].mark == 0 then
table.insert(self.ContentList, params[i].paramsValue)
elseif params[i].mark == 1 then
table.insert(self.ContentList, DataConfig.DataMessageString.GetByKey(tonumber(params[i].paramsValue)))
elseif params[i].mark == 2 then
table.insert(self.ContentList, GameCenter.LanguageConvertSystem:ConvertLan(params[i].paramsValue))
end
end
return #self.ContentList > 0 and UIUtils.CSFormatLuaTable(_content, self.ContentList) or _content;
end
return _content or content
end
return MailSystem