------------------------------------------------ -- 作者: 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