using Fantasy; using Fantasy.Async; using Fantasy.Entitas.Interface; using Fantasy.Helper; using NB.Game; namespace NB.Chat; public class MailConversationDeserializeSystem : DeserializeSystem { protected override void Deserialize(MailConversation self) { self.Key = $"{self.FirstId}-{self.SecondId}"; } } public class MailConversationDestroySystem : DestroySystem { protected override void Destroy(MailConversation self) { foreach (var mail in self.Mails) { mail.Dispose(); } self.Mails.Clear(); self.FirstId = 0; self.SecondId = 0; self.Key = string.Empty; } } public static class MailConversationSystem { public static async FTask Add(this MailConversation self, Mail mail) { self.Mails.Add(mail); if (self.Mails.Count > AppConfig.MaxConversationCount) { self.Mails.RemoveAt(0); } if (mail.Items != null && mail.Items.Count > 0) { //有附件需要立马保存 await self.Save(true); } else { await self.Save(false); } } public static async FTask Save(this MailConversation self, bool forceSave = true) { // self.NeedSave = true; // self.NeedSaveTime = TimeHelper.Now + AppConfig.PlayerDataAutoSaveTime; if (forceSave) { self.UpdateTime = TimeHelper.Now; await self.Scene.World.DataBase.Save(self); } else { self.NeedSave = true; self.NeedSaveTime = TimeHelper.Now + AppConfig.ChatDataAutoSaveTime; } } /// /// 是否可以发送邮件 /// /// /// /// public static bool CanSend(this MailConversation self, long sendId) { if (self.Mails.Count < 1) return true; foreach (var mail in self.Mails) { if (mail.Sender != sendId) { return true; } } return false; } #region 转换 public static async FTask> ToInfo(this List self, Scene scene, long selfId) { List ret = new List(); HashSet ids = new HashSet(); foreach (var conversation in self) { if (conversation.RemoveId.Contains(selfId)) continue; ids.Add(conversation.FirstId); ids.Add(conversation.SecondId); } ids.Remove(selfId); var infos = await CacheHandler.GetPlayerBasicCacheInfos(scene, ids.ToList()); foreach (var conversation in self) { if (conversation.RemoveId.Contains(selfId)) continue; var item = new ConversationInfo(); item.List = conversation.Mails.ToMailInfo(); var otherId = conversation.FirstId == selfId ? conversation.SecondId : conversation.FirstId; var info = infos.Find(t => t.RoleId == otherId); if (info != null) { item.RoleInfo = info; } ret.Add(item); } return ret; } #endregion }