using UnityEngine; using UnityEngine.Events; using System.Collections; using System.Collections.Generic; using LitJson; public class ChatManager { public const int MAX_GLOBAL = 50; public const int MAX_FOLLOW = 25; public const int MAX_MAIL = 50; public const int MAX_CLAN = 50; private bool m_Initialized = false; public bool initialized { get{ return m_Initialized;} } private List globalList; private Dictionary followDict; private List followList; private List mailList; private int newMsgGlobalCount = 0; private int newMsgMailCount = 0; public ChatMsgEvent GlobalMsgGot = new ChatMsgEvent(); public ChatMsgEvent FollowMsgGot = new ChatMsgEvent(); public ChatMsgEvent MailMsgGot = new ChatMsgEvent(); public ChatMsgEvent ClanMsgGot = new ChatMsgEvent(); public UnityEvent MsgUpdate = new UnityEvent(); public FindFriendResultEvent FindFriendResult = new FindFriendResultEvent(); public ChatManager() { globalList = new List (); followDict = new Dictionary (); followList = new List (); mailList = new List (); SyncManager.Remove (SyncManager.SyncType.Chat); SyncManager.Add (SyncManager.SyncType.Chat, Sync, 60f); } public void Clear() { globalList.Clear (); followDict.Clear (); followList.Clear (); mailList.Clear (); m_Initialized = false; } private void CheckLatestId(int id) { if(latestId < id) { latestId = id; } } public void Init() { if (initialized) return; if (!Session.GetInstance ().myUserData.isLogin) return; JsonData list = LocalSaver.GetInstance ().LoadChat (Session.myUserId); Fill (list, true, false); m_Initialized = true; } private int latestId = 0; public void Sync() { Init (); if (!initialized) return; ChatRequest.Sync (latestId).ResultEvent.AddListener((bool success, JsonData data)=>{ if(success) { Fill(data, latestId==0, true); MsgUpdate.Invoke(); } }); } private void Fill(JsonData data, bool isLocal, bool isNew) { int myUserId = Session.myUserId; for(int i=0; i{ if(success) { int id = JsonUtil.ToInt(data["id"]); string time = data["time"].ToString(); int oldId = chatMsg.id; chatMsg.id = id; chatMsg.SetDateTime(time); LocalSaver.GetInstance().ReplaceChat(oldId, chatMsg, Session.myUserId); itemRender.data = itemRender.data; } }); } public void AddGlobalMsg(ChatMsg chatMsg) { globalList.Add (chatMsg); GlobalMsgGot.Invoke (chatMsg); while(globalList.Count > MAX_GLOBAL) { ChatMsg firstMsg = globalList [0]; globalList.RemoveAt (0); UnsaveMsg (firstMsg); } } public List GetGlobalMsgList() { Init (); return globalList; } public int GetNewMsgGlobalCount() { return newMsgGlobalCount; } public void ResetNewMsgClanCount() { newMsgGlobalCount = 0; MsgUpdate.Invoke(); } public void FindFriend(string key) { UserRequest.Find (key).ResultEvent.AddListener ((bool success, JsonData data)=>{ if(success) { List list = new List(); for(int i=0; i GetFollowMsgList(int userId) { ChatFollow chatFollow = null; followDict.TryGetValue (userId, out chatFollow); if (chatFollow == null) { return null; } return chatFollow.GetChatList (); } public void AddClanMsg(int sender, string content) { ChatMsg chatMsg = new ChatMsg (); chatMsg.categovy = ChatMsg.Category.Clan; chatMsg.sender = sender; chatMsg.content = content; chatMsg.dateTime = ChatMsg.GetNowDateTime (); ClanMsgGot.Invoke (chatMsg); } public void AddMailMsg(ChatMsg chatMsg) { mailList.Add (chatMsg); MailMsgGot.Invoke (chatMsg); while(mailList.Count > MAX_MAIL) { mailList.RemoveAt (0); } } public List GetMailMsgList() { Init (); return mailList; } private static ChatManager instance; public static ChatManager GetInstance() { if (instance == null) instance = new ChatManager (); return instance; } } public class ChatMsgEvent : UnityEvent{} public class FindFriendResultEvent : UnityEvent>{}