using vnxbqy.UI; using System; using System.Collections.Generic; using System.Text.RegularExpressions; using System.Text; using UnityEngine; using System.Linq; public class MailItemModel { public uint ItemID; //物品ID public int Count; //数量 public byte IsBind; //是否绑定 public string UserData; //自定义数据 } public class MailInfo { public string GUID; //补偿标识 public string CreateTime; //邮件接收时间 public string Text; //文字内容 public byte Count; //当前补偿物品数 public byte IsRead; //已读状态 0 未读取 1已读取 public uint Gold; //仙玉 public uint GoldPaper; //绑定仙玉 public uint Silver; //铜钱 public bool isChoose = false; public DateTime mailGetTime; //邮件接收时间 public MailItemModel[] Items = null; //补偿物品信息 } public class MailAllModel { public static MailAllModel _instance; public static MailAllModel Instance { get { if (_instance == null) _instance = new MailAllModel(); return _instance; } } DailyQuestModel m_dailyModel; DailyQuestModel dailyModel { get { return m_dailyModel ?? (m_dailyModel = ModelCenter.Instance.GetModel()); } } AwardExchangeModel exchangeModel { get { return ModelCenter.Instance.GetModel(); } } bool isLogin = true; public MailAllModel() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerDataInit; DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk; totalMailCnt = int.Parse(FuncConfigConfig.Get("MailDefaultCount").Numerical1); notifyMailCnt = int.Parse(FuncConfigConfig.Get("MailDefaultCount").Numerical2); } private void BeforePlayerDataInit() { isLogin = true; funcType = MailFuncType.Mail; mailModelDict.Clear(); timeOrderMailInfo.Clear(); mailTitleStr = ""; mailContentstr = ""; mailSendPersonStr = ""; } private void OnPlayerLoginOk() { isLogin = false; //改成客户端登陆地图成功后主动请求一次邮件 var pack = new CA9A1_tagCGQueryCompensation(); GameNetSystem.Instance.SendInfo(pack); } public MailFuncType funcType = MailFuncType.Mail; public event Action GetNewMailEvent; public event Action CallBackReceiveEvent; public event Action DeleteMailEvent; public event Action MailCntChangeEvent; private Dictionary mailModelDict = new Dictionary(); private List timeOrderMailInfo = new List(); private Regex smatch = new Regex(@"([^>.\n]*)([^<>\n]*)", RegexOptions.Singleline); private Regex smatchSystem = new Regex(@"[\\]*\/[\\]*", RegexOptions.Singleline); public string mailTitleStr = ""; public string mailContentstr = ""; public string mailSendPersonStr = ""; public int totalMailCnt = 0; public int notifyMailCnt = 0; //警报邮件件数,同时限制上架 public int addMailCnt { get; private set; } public void ReFreshModel(HA9A1_tagGCQueryCompensationResult mailModel) { DebugEx.Log("刷新邮件数据" + mailModel.Count); if (mailModel.Count > 0) { int preMailCnt = mailModelDict.Count; for (int i = 0; i < mailModel.Count; i++) { if (!mailModelDict.ContainsKey(mailModel.PackList[i].GUID)) { MailInfo mailInfo = new MailInfo(); mailInfo.GUID = mailModel.PackList[i].GUID; mailInfo.CreateTime = mailModel.PackList[i].CreateTime; mailInfo.mailGetTime = Convert.ToDateTime(UIHelper.GetTime(mailInfo.CreateTime)); mailInfo.Text = mailModel.PackList[i].Text; mailInfo.Count = mailModel.PackList[i].Count; mailInfo.IsRead = mailModel.PackList[i].IsRead; //0 未读取 1已读取未领取 3 已读取已领取 mailInfo.Gold = mailModel.PackList[i].Gold; mailInfo.GoldPaper = mailModel.PackList[i].GoldPaper; mailInfo.Silver = mailModel.PackList[i].Silver; mailInfo.Items = new MailItemModel[mailInfo.Count]; if (mailInfo.Count > 0) { for (int j = 0; j < mailInfo.Count; j++) { mailInfo.Items[j] = new MailItemModel(); mailInfo.Items[j].ItemID = mailModel.PackList[i].Items[j].ItemID; mailInfo.Items[j].Count = (int)mailModel.PackList[i].Items[j].Count; mailInfo.Items[j].IsBind = mailModel.PackList[i].Items[j].IsBind; mailInfo.Items[j].UserData = mailModel.PackList[i].Items[j].UserData; } } mailModelDict.Add(mailInfo.GUID, mailInfo); DeleteTodayDailyMail(mailInfo); } else { MailInfo mailInfo = mailModelDict[mailModel.PackList[i].GUID]; mailInfo.GUID = mailModel.PackList[i].GUID; mailInfo.CreateTime = mailModel.PackList[i].CreateTime; mailInfo.mailGetTime = Convert.ToDateTime(UIHelper.GetTime(mailInfo.CreateTime)); mailInfo.Text = mailModel.PackList[i].Text; mailInfo.Count = mailModel.PackList[i].Count; mailInfo.IsRead = mailModel.PackList[i].IsRead; //0 未读取 1已读取未领取 3 已读取已领取 mailInfo.Gold = mailModel.PackList[i].Gold; mailInfo.GoldPaper = mailModel.PackList[i].GoldPaper; mailInfo.Silver = mailModel.PackList[i].Silver; mailInfo.Items = null; mailInfo.Items = new MailItemModel[mailInfo.Count]; if (mailInfo.Count > 0) { for (int j = 0; j < mailInfo.Count; j++) { mailInfo.Items[j] = new MailItemModel(); mailInfo.Items[j].ItemID = mailModel.PackList[i].Items[j].ItemID; mailInfo.Items[j].Count = (int)mailModel.PackList[i].Items[j].Count; mailInfo.Items[j].IsBind = mailModel.PackList[i].Items[j].IsBind; mailInfo.Items[j].UserData = mailModel.PackList[i].Items[j].UserData; } } } if (mailModelDict.ContainsKey(mailModel.PackList[i].GUID)) { MailInfo info = mailModelDict[mailModel.PackList[i].GUID]; string mailTitle = GetMailTitle(info); if (mailTitle.Contains("") && info.IsRead == 0) { exchangeModel.SetAwardExchangeModel(info.Items, mailModel.PackList[i].GUID); } else if (GetMailType(info) == "CodeRewardMail" && info.IsRead == 0) { exchangeModel.SetAwardExchangeModel(info.Items, mailModel.PackList[i].GUID); } if (!isLogin) { if (info.Count > 0 || info.Gold > 0 || info.GoldPaper > 0 || info.Silver > 0) { SoundPlayer.Instance.PlayUIAudio(740); } } } } addMailCnt = mailModelDict.Count - preMailCnt; MailRedPointCtrl(); OnTimeOrderMailModel(); if (GetNewMailEvent != null) GetNewMailEvent(); if (MailCntChangeEvent != null) { MailCntChangeEvent(); } } } #region 红点逻辑处理 private void MailRedPointCtrl() { int sum = 0; foreach (var key in mailModelDict.Keys) { if (mailModelDict[key].IsRead == 0) { sum += 1; } } if (sum > 0) { MainRedDot.Instance.redpointMailFunc.count = sum; MainRedDot.Instance.redpointMainMail.count = sum; MainRedDot.Instance.redpointMailFunc.state = RedPointState.Quantity; } else { MainRedDot.Instance.redpointMailFunc.state = RedPointState.None; } } #endregion public void RecieveMail(HA31A_tagMCGiveCompensationResult receiveMail) { if (CallBackReceiveEvent != null) CallBackReceiveEvent(receiveMail.GUID, receiveMail.Result); } public void DeleteMail(HA9AA_tagGCDelCompensationResult deleteMail) { if (deleteMail.Result == 1) { DeleteMailData(deleteMail.GUID); if (DeleteMailEvent != null) { DeleteMailEvent(); } if (MailCntChangeEvent != null) { MailCntChangeEvent(); } } } //按时间给邮件数据排序 public void OnTimeOrderMailModel() { timeOrderMailInfo.Clear(); foreach (MailInfo info in mailModelDict.Values) { timeOrderMailInfo.Add(info); } if (timeOrderMailInfo.Count > 1) { timeOrderMailInfo.Sort(Compare); } } public int Compare(MailInfo startTime, MailInfo nextTime) { int startRead = startTime.IsRead; int nextRead = nextTime.IsRead; if (startRead.CompareTo(nextRead) != 0) return startRead.CompareTo(nextRead); DateTime curtime = startTime.mailGetTime; DateTime nexttime = nextTime.mailGetTime; if (curtime.CompareTo(nexttime) != 0) return -curtime.CompareTo(nexttime); return 0; } public List GetTimeOrderMaillist() { if (timeOrderMailInfo != null) return timeOrderMailInfo; else return null; } public void DeleteMailData(string id) { if (mailModelDict.ContainsKey(id)) mailModelDict.Remove(id); for (int i = 0; i < timeOrderMailInfo.Count; i++) { if (timeOrderMailInfo[i].GUID == id) { timeOrderMailInfo.Remove(timeOrderMailInfo[i]); break; } } MailRedPointCtrl(); } List todayDailylist = new List(); List orderTodayDailylist = new List(); public void DeleteTodayDailyMail(MailInfo curInfo) { if (!smatch.IsMatch(curInfo.Text)) return; Match curMatch = smatch.Match(curInfo.Text); MailConfig curMailModel = MailConfig.Get(curMatch.Groups[1].Value); if (curMailModel == null || curMailModel.MailType != "TodayDailyTask") return; todayDailylist.Clear(); foreach (MailInfo info in mailModelDict.Values) { if (smatch.IsMatch(info.Text)) { Match match = smatch.Match(info.Text); MailConfig _mailModel = MailConfig.Get(match.Groups[1].Value); if (_mailModel != null) { if (_mailModel.MailType == "TodayDailyTask") { todayDailylist.Add(info); } } } } orderTodayDailylist.Clear(); orderTodayDailylist.AddRange(todayDailylist); orderTodayDailylist.Sort(CompareByTime); for (int i = 0; i < orderTodayDailylist.Count - 1; i++) { SendMailDelete(orderTodayDailylist[i].GUID); mailModelDict.Remove(orderTodayDailylist[i].GUID); } } public int CompareByTime(MailInfo start, MailInfo next) { DateTime startTime = start.mailGetTime; DateTime nextTime = next.mailGetTime; if (startTime.CompareTo(nextTime) != 0) return startTime.CompareTo(nextTime); int startIndex = todayDailylist.IndexOf(start); int nextIndex = todayDailylist.IndexOf(next); if (startIndex.CompareTo(nextIndex) != 0) return startIndex.CompareTo(nextIndex); return 0; } public void GetReciveMailContent(MailInfo info) { Debug.Log(info.Text); info.Text = smatchSystem.Replace(info.Text, "/"); if (smatch.IsMatch(info.Text)) { Match match = smatch.Match(info.Text); if (match.Groups.Count > 2) { MailConfig _mailModel = MailConfig.Get(match.Groups[1].Value); List _mailParalist = new List(); if (_mailModel != null) { mailTitleStr = _mailModel.Title; string strCont = ""; if (match.Groups[2].Value != "" && match.Groups[2].Value != "[]") { _mailParalist.Clear(); string paraStr = ""; paraStr = match.Groups[2].Value.Remove(0, 1); paraStr = paraStr.Remove(paraStr.Length - 1, 1); string[] paraArray = paraStr.Split(','); for (int i = 0; i < paraArray.Length; i++) { string para = paraArray[i].Replace("'", ""); para = para.Trim(); _mailParalist.Add(para); } string[] mailCont = _mailModel.Content.Split(new string[] { "{0}" }, StringSplitOptions.None); if (mailCont != null && mailCont.Length > 0 && _mailParalist.Count != mailCont.Length - 1) { DebugEx.Log("参数数量不一致" + info.Text); } for (int i = 0; i < mailCont.Length; i++) { if (i < mailCont.Length - 1) { switch (_mailModel.MailType) { case "TodayDailyTask": strCont = StringUtility.Contact(strCont, mailCont[i], GetTodayDailyNotify(info.mailGetTime)); break; default: strCont = StringUtility.Contact(strCont, mailCont[i], _mailParalist[i]); break; } } else { strCont = StringUtility.Contact(strCont, mailCont[i]); } } } else { strCont = _mailModel.Content; } mailContentstr = strCont; string[] mailContentArray = info.Text.Split(new string[] { "<$_$>" }, StringSplitOptions.RemoveEmptyEntries); if (mailContentArray.Length > 0) { FuncConfigConfig funcMailModel = FuncConfigConfig.Get(mailContentArray[0]); if (funcMailModel != null) mailSendPersonStr = funcMailModel.Numerical1; else mailSendPersonStr = mailContentArray[0]; } } } else { DebugEx.LogError("服务端下发格式不正确"); } } else { DebugEx.Log("不需要解析模板邮件"); string[] mailContentArray = info.Text.Split(new string[] { "<$_$>" }, StringSplitOptions.RemoveEmptyEntries); if (mailContentArray.Length > 1) { FuncConfigConfig funcMailModel = FuncConfigConfig.Get(mailContentArray[0]); if (funcMailModel != null) mailSendPersonStr = funcMailModel.Numerical1; else mailSendPersonStr = mailContentArray[0]; mailTitleStr = mailContentArray[1]; if (mailContentArray.Length > 2) { string mailDes = mailContentArray[2]; mailContentstr = mailDes; } } else { DebugEx.LogError("服务端下发格式不正确"); } } mailTitleStr = mailTitleStr.Replace("", ""); } public string GetMailType(MailInfo info) { if (smatch.IsMatch(info.Text)) { Match match = smatch.Match(info.Text); MailConfig _mailModel = MailConfig.Get(match.Groups[1].Value); if (_mailModel != null) { return _mailModel.MailType; } } return string.Empty; } public string GetMailTitle(MailInfo info) { if (smatch.IsMatch(info.Text)) { Match match = smatch.Match(info.Text); MailConfig _mailModel = MailConfig.Get(match.Groups[1].Value); if (_mailModel != null) { return _mailModel.Title; } } else { string[] mailContentArray = info.Text.Split(new string[] { "<$_$>" }, StringSplitOptions.RemoveEmptyEntries); if (mailContentArray.Length > 0) { return mailContentArray[1]; } } return string.Empty; } StringBuilder todayDailySB = new StringBuilder(); List dailyIdlist = new List(); public string GetTodayDailyNotify(DateTime getTime) { dailyIdlist.Clear(); todayDailySB.Length = 0; var dayOfWeek = (int)getTime.DayOfWeek; var quests = dailyModel.GetQuestByWeekTime(dayOfWeek % 7); List openTimelist = quests.Keys.ToList(); openTimelist.Sort(); for (int i = 0; i < openTimelist.Count; i++) { int openTime = openTimelist[i]; for (int j = 0; j < quests[openTime].Count; j++) { var dailyQuestId = quests[openTime][j]; if (dailyIdlist.Contains(dailyQuestId)) { continue; } dailyIdlist.Add(dailyQuestId); DailyQuestOpenTime dailyQuestOpenTime; dailyModel.TryGetOpenTime(dailyQuestId, out dailyQuestOpenTime); if (dailyQuestOpenTime.IsValidServerOpenTime()) { List hourMinutelist = dailyQuestOpenTime.GetHourMinuteByWeek(dayOfWeek); if (hourMinutelist != null) { for (int k = 0; k < hourMinutelist.Count; k++) { HourMinute hourMinute = hourMinutelist[k]; if (!hourMinute.wholeDay) { var config = DailyQuestConfig.Get(dailyQuestId); string openTimeStr = StringUtility.Contact(hourMinute.hourBegin > 9 ? hourMinute.hourBegin.ToString() : "0" + hourMinute.hourBegin, ":", hourMinute.minuteBegin > 9 ? hourMinute.minuteBegin.ToString() : "0" + hourMinute.minuteBegin); string endTimeStr = StringUtility.Contact(hourMinute.hourEnd > 9 ? hourMinute.hourEnd.ToString() : "0" + hourMinute.hourEnd, ":", hourMinute.minuteEnd > 9 ? hourMinute.minuteEnd.ToString() : "0" + hourMinute.minuteEnd); switch ((DailyQuestType)dailyQuestId) { case DailyQuestType.FairyFeast: todayDailySB.Append(StringUtility.Contact("【", k == 0 ? config.Title : Language.Get("FairyFeastQuestion"), "】", openTimeStr, "-", endTimeStr, "\n")); break; default: todayDailySB.Append(StringUtility.Contact("【", config.Title, "】", openTimeStr, "-", endTimeStr, "\n")); break; } } } } } } } return todayDailySB.ToString(); } public void SendReadMailQuest(string id) { CA9A6_tagCGReadCompensation readMail = new CA9A6_tagCGReadCompensation(); readMail.GUID = id; GameNetSystem.Instance.SendInfo(readMail); MailRedPointCtrl(); } public void SendMailDelete(string id) { CA9A7_tagCGDelCompensation askDelete = new CA9A7_tagCGDelCompensation(); askDelete.GUID = id; GameNetSystem.Instance.SendInfo(askDelete); } public MailInfo GetMailInfo(string guid) { MailInfo mailInfo = null; mailModelDict.TryGetValue(guid, out mailInfo); return mailInfo; } VirtualPackModel virtualPackModel { get { return ModelCenter.Instance.GetModel(); } } PackModel playerPack { get { return ModelCenter.Instance.GetModel(); } } private Dictionary GetPackItemDcit = new Dictionary(); public void SendAskReceive(string id) { MailInfo mailInfo = MailAllModel.Instance.GetMailInfo(id); if (mailInfo == null) return; GetPackItemDcit.Clear(); int i = 0; ItemConfig tagChinItem = null; for (i = 0; i < mailInfo.Count; i++) { tagChinItem = ItemConfig.Get((int)mailInfo.Items[i].ItemID); if (tagChinItem != null) { var packType = GeneralDefine.GetPackTypeByItemType(tagChinItem.Type); if (!GetPackItemDcit.ContainsKey(packType)) { GetPackItemDcit.Add(packType, 1); } else { GetPackItemDcit[packType] += 1; } } } foreach (var key in GetPackItemDcit.Keys) { int remainCount = 0; if (virtualPackModel.IsVirtualPack(key)) { remainCount = virtualPackModel.GetPackRemainCount(key); } else { remainCount = playerPack.GetEmptyGridCount(key); } int getCount = GetPackItemDcit[key]; if (remainCount < getCount) { SysNotifyMgr.Instance.ShowTip("GeRen_chenxin_676165", (int)key); return; } } CA53B_tagCMRequestCompensation askRecive = new CA53B_tagCMRequestCompensation(); askRecive.GUID = id; GameNetSystem.Instance.SendInfo(askRecive); } public void SendAskDelete(string id) { CA9A7_tagCGDelCompensation askDelete = new CA9A7_tagCGDelCompensation(); askDelete.GUID = id; GameNetSystem.Instance.SendInfo(askDelete); } } public enum MailFuncType { Mail, }