| using System; | 
| using System.Collections; | 
| using System.Collections.Generic; | 
| using System.Text; | 
| using System.Text.RegularExpressions; | 
| using UnityEngine; | 
| using Cysharp.Threading.Tasks; | 
|   | 
|      | 
|     public class ChatCenter : Singleton<ChatCenter> | 
|     { | 
|         public int talkRechargeLimmit; | 
|         public int talkLevelLimmit; | 
|   | 
|         public void Init() | 
|         { | 
|             ParseConfig(); | 
|             //var _uiframe = UIFrameMgr.Inst; | 
|             // ChatSetting.Instance.RefreshChatSetAct += RefreshChatSetAct; | 
|             // TimeMgr.Instance.OnSyntonyEvent += OnSyntonyEvent; | 
|             // VoiceHttpRequest.Instance.samplesDecodecComplete += SamplesDecodecComplete; | 
|             UIManager.Instance.OnOpenWindow += WindowAfterOpenEvent; | 
|             // StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish; | 
|             // PrepareHandler.Instance.OnPrepareEnd += OnPrepareEnd; | 
|   | 
|             var time = bandTime; | 
|             banTimeArray[0] = time.Year; | 
|             banTimeArray[1] = time.Month; | 
|             banTimeArray[2] = time.Day; | 
|             banTimeArray[3] = time.Hour; | 
|             banTimeArray[4] = time.Minute; | 
|             banTimeArray[5] = time.Second; | 
|         } | 
|   | 
|         public void UnInit() | 
|         { | 
|   | 
|         } | 
|   | 
|         bool serverInited = false; | 
|   | 
|         public int chatCharacterLimit { get; private set; } | 
|         public int bugleItem { get; private set; } | 
|         public bool beforeDungeon { get; private set; } | 
|         public List<ChatInfoType> chatChannels { get; private set; } | 
|   | 
|         public int chatInputLength { get; set; } | 
|         public StringBuilder m_EncodeBuilder = new StringBuilder(); | 
|         void ParseConfig() | 
|         { | 
|             chatCharacterLimit = int.Parse(FuncConfigConfig.Get("MessageLength").Numerical1); | 
|             // var _funcCfg = FuncConfigConfig.Get("BugleItem"); | 
|             // bugleItem = int.Parse(_funcCfg.Numerical1); | 
|             chatChannels = new List<ChatInfoType>(); | 
|             chatChannels.Add(ChatInfoType.System); | 
|             chatChannels.Add(ChatInfoType.World); | 
|             chatChannels.Add(ChatInfoType.CrossServer); | 
|             chatChannels.Add(ChatInfoType.Area); | 
|             chatChannels.Add(ChatInfoType.Team); | 
|             chatChannels.Add(ChatInfoType.Invite); | 
|             chatChannels.Add(ChatInfoType.Trumpet); | 
|             chatChannels.Add(ChatInfoType.Fairy); | 
|             chatChannels.Add(ChatInfoType.Friend); | 
|             chatChannels.Add(ChatInfoType.default1); | 
|   | 
|             // var config = FuncConfigConfig.Get("ClientChatBan"); | 
|             // banCheckSecond = int.Parse(config.Numerical1); | 
|             // repeatCountLimit = int.Parse(config.Numerical2); | 
|             // maliceCheckCount = int.Parse(config.Numerical3); | 
|             // maliceLimitCount = int.Parse(config.Numerical4); | 
|             // var array = ConfigParse.GetMultipleStr<int>(config.Numerical5); | 
|             // singleBanSecond = array[0]; | 
|             // maxBanSecond = array[1]; | 
|   | 
|             var config = FuncConfigConfig.Get("LocalChatHistoryCount"); | 
|             if (config != null) | 
|             { | 
|                 LocalChatHistory.localSaveCount = int.Parse(config.Numerical1); | 
|                 if (!string.IsNullOrEmpty(config.Numerical2)) | 
|                 { | 
|                     LocalChatHistory.localChatKeepHour = int.Parse(config.Numerical2); | 
|                 } | 
|             } | 
|   | 
|             config = FuncConfigConfig.Get("TalkLimit"); | 
|             talkRechargeLimmit = int.Parse(config.Numerical1); | 
|             talkLevelLimmit = int.Parse(config.Numerical2); | 
|         } | 
|   | 
|         public event Action<string, bool, bool> UpdateChatValueEvent; | 
|         public void ChangeChatValue(string _msg, bool _add, bool _force) | 
|         { | 
|             if (UpdateChatValueEvent != null) | 
|             { | 
|                 UpdateChatValueEvent(_msg, _add, _force); | 
|             } | 
|         } | 
|   | 
|         public event Action UpdateChatType; | 
|         public void ChangeChatType() | 
|         { | 
|             if (UpdateChatType != null) | 
|             { | 
|                 UpdateChatType(); | 
|             } | 
|         } | 
|   | 
|         public event Action UpdateChatContent; | 
|         public void UpdateChatContentPos() | 
|         { | 
|             if (UpdateChatContent != null) | 
|             { | 
|                 UpdateChatContent(); | 
|             } | 
|         } | 
|   | 
|         public ChatData GetChatData(ChatInfoType _type, int _index, int _pteChatId = 0) | 
|         { | 
|             ChatData chat = null; | 
|             if (_type == ChatInfoType.Friend) | 
|             { | 
|                 var _list = ChatManager.Instance.GetChatInfo(_pteChatId == 0 ? ChatManager.Instance.PteChatID : _pteChatId); | 
|                 if (_list == null || _index >= _list.Count) | 
|                 { | 
|                     return null; | 
|                 } | 
|                 chat = _list[_index]; | 
|             } | 
|             else | 
|             { | 
|                 List<ChatData> _list = ChatManager.Instance.GetChatInfo(_type); | 
|                 if (_list == null || _index >= _list.Count) | 
|                 { | 
|                     return null; | 
|                 } | 
|                 chat = _list[_index]; | 
|             } | 
|             return chat; | 
|         } | 
|   | 
|         public const int RecentlyChatNum = 8; | 
|         public List<RecentlyChat> recentlyChats = new List<RecentlyChat>(RecentlyChatNum); | 
|         public event Action RecentlyChatChangeEvent; | 
|         public RecentlyChat recentlyChat = null; | 
|   | 
|         public RecentlyChat SaveRecentlyChat(string _chat) | 
|         { | 
|             if (ChatManager.Instance.IsInviteChat(_chat) | 
|                 || Regex.IsMatch(_chat, ChatManager.KILL_IDENTIFY)) | 
|             { | 
|                 return null; | 
|             } | 
|             if (s_VoiceRegex.IsMatch(_chat)) | 
|             { | 
|                 _chat = s_VoiceRegex.Replace(_chat, string.Empty); | 
|             } | 
|             if (recentlyChats.FindIndex((x) => | 
|              { | 
|                  return x.display.Equals(_chat); | 
|              }) != -1) | 
|             { | 
|                 return null; | 
|             } | 
|             if (recentlyChats.Count >= RecentlyChatNum) | 
|             { | 
|                 var _old = recentlyChats[0]; | 
|                 recentlyChats.RemoveAt(0); | 
|                 _old = null; | 
|             } | 
|             var _recentlyChat = new RecentlyChat(_chat); | 
|             recentlyChats.Add(_recentlyChat); | 
|             if (RecentlyChatChangeEvent != null) | 
|             { | 
|                 RecentlyChatChangeEvent(); | 
|             } | 
|             return _recentlyChat; | 
|         } | 
|   | 
|         public void OnBeforePlayerDataInitialize() | 
|         { | 
|             recentlyChat = null; | 
|             serverInited = false; | 
|             m_VoiceChatDict.Clear(); | 
|         } | 
|   | 
|         public void OnSwitchAccount() | 
|         { | 
|   | 
|         } | 
|   | 
|   | 
|         public class RecentlyChat | 
|         { | 
|             public string display = string.Empty; | 
|             public List<string> itemInfos = new List<string>(); | 
|             public List<int> itemIndexs = new List<int>(); | 
|             public List<string> itemNames = new List<string>(); | 
|   | 
|             public RecentlyChat() | 
|             { | 
|   | 
|             } | 
|   | 
|             public RecentlyChat(string _chat) | 
|             { | 
|                 display = _chat; | 
|             } | 
|   | 
|             public void Add(string _name, string _itemInfo) | 
|             { | 
|                 itemNames.Add(_name); | 
|                 itemInfos.Add(_itemInfo); | 
|             } | 
|   | 
|             public void Reset() | 
|             { | 
|                 itemIndexs.Clear(); | 
|                 for (int i = 0; i < itemInfos.Count; i++) | 
|                 { | 
|                     itemIndexs.Add(i); | 
|                 } | 
|             } | 
|   | 
|             public override string ToString() | 
|             { | 
|                 return LitJson.JsonMapper.ToJson(this); | 
|             } | 
|   | 
|             public static bool TryParse(string json, out RecentlyChat chat) | 
|             { | 
|                 chat = null; | 
|                 try | 
|                 { | 
|                     chat = LitJson.JsonMapper.ToObject<RecentlyChat>(json); | 
|                 } | 
|                 catch (Exception e) | 
|                 { | 
|                     Debug.LogError(e.StackTrace + e.Message); | 
|                     return false; | 
|                 } | 
|                 return chat != null; | 
|             } | 
|         } | 
|   | 
|         public static readonly Regex s_VoiceRegex = new Regex("<v=([0-9]+)_([0-9]+)>"); | 
|         private Dictionary<int, VoiceChat> m_VoiceChatDict = new Dictionary<int, VoiceChat>(); | 
|   | 
|         public class VoiceChat | 
|         { | 
|             public ChatInfoType chatType; | 
|             public int index; | 
|             public int toPlayer; | 
|             public long tick; | 
|             public byte length; | 
|             public bool translate = false; | 
|             public byte[] encode; | 
|             public string result = string.Empty; | 
|         } | 
|   | 
|         public void SetVoice(int _instance, ChatInfoType _type, float _length, int _toPlayer = 0) | 
|         { | 
|             if (!m_VoiceChatDict.ContainsKey(_instance)) | 
|             { | 
|                 VoiceChat _chat = new VoiceChat() | 
|                 { | 
|                     chatType = _type, | 
|                     index = _instance, | 
|                     toPlayer = _toPlayer, | 
|                     tick = TimeUtility.ServerNow.Ticks, | 
|                     translate = false, | 
|                     encode = null, | 
|                     length = (byte)Mathf.Min((int)(_length * 10), 100), | 
|                 }; | 
|                 m_VoiceChatDict.Add(_instance, _chat); | 
|             } | 
|         } | 
|   | 
|         public void OnPlayerLoginOk() | 
|         { | 
|             serverInited = true; | 
|         } | 
|   | 
|         private void WindowAfterOpenEvent(UIBase win) | 
|         { | 
|             CheckChatFloatOpen(); | 
|             if (win is MainWin) | 
|             { | 
|                 Co_CheckAfterCollect().Forget(); | 
|             } | 
|         } | 
|   | 
|         public bool IsShowChatFloat() | 
|         { | 
|             return !UIManager.Instance.IsOpened<LoadingWin>(); | 
|             // if (!UIManager.Instance.IsOpened<LoadingWin>()) | 
|             //     return true; | 
|             // return false; | 
|         } | 
|   | 
|         private void CheckChatFloatOpen() | 
|         { | 
|             if (IsShowChatFloat()) | 
|             { | 
|                 if (!UIManager.Instance.IsOpened<ChatFloatWin>()) | 
|                 { | 
|                     UIManager.Instance.OpenWindow<ChatFloatWin>(); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         bool openChatAfterCollect = false; | 
|         // private void OnPrepareEnd(int playerId, int type) | 
|         // { | 
|         //     if (playerId == PlayerDatas.Instance.baseData.PlayerID | 
|         //         && type == 0 && PlayerDatas.Instance.baseData.MapID == 31230) | 
|         //     { | 
|         //         openChatAfterCollect = true; | 
|         //     } | 
|         //     CheckOpenChatAfterCollect(); | 
|         // } | 
|   | 
|         async UniTask Co_CheckAfterCollect() | 
|         { | 
|             await UniTask.Yield(); | 
|             CheckOpenChatAfterCollect(); | 
|         } | 
|   | 
|         void CheckOpenChatAfterCollect() | 
|         { | 
|             if (!openChatAfterCollect) | 
|             { | 
|                 return; | 
|             } | 
|             if (PlayerDatas.Instance.baseData.MapID != 31230) | 
|             { | 
|                 return; | 
|             } | 
|             if (!UIManager.Instance.IsOpened<MainWin>() | 
|                 /*TODO YYL|| NewBieCenter.Instance.inGuiding*/) | 
|             { | 
|                 return; | 
|             } | 
|             openChatAfterCollect = false; | 
|   | 
|             if (!UIManager.Instance.IsOpened<ChatWin>()) | 
|             { | 
|                 ChatManager.Instance.presentChatType = ChatInfoType.Fairy; | 
|                 UIManager.Instance.OpenWindow<ChatWin>(); | 
|             } | 
|         } | 
|   | 
|   | 
|         public string SetChatExtra() | 
|         { | 
|             var vipLevel = PlayerDatas.Instance.baseData.VIPLv; | 
|             var job = PlayerDatas.Instance.baseData.Job; | 
|             var bubbleId = PlayerDatas.Instance.baseData.bubbleId; | 
|             var serverGroupId = PlayerDatas.Instance.baseData.ServerGroupId; | 
|             return StringUtility.Contact(vipLevel.ToString().PadLeft(2, '0'), 0, job, | 
|                 bubbleId.ToString().PadLeft(2, '0'), serverGroupId.ToString().PadLeft(7, '0')); | 
|         } | 
|   | 
|         public void HandleChatBanned(ChatInfoType channel, string message, int toPlayer) | 
|         { | 
|             if (IsChatBanned || clientBanned) | 
|             { | 
|                 var playerId = PlayerDatas.Instance.baseData.PlayerID; | 
|                 var playerName = UIHelper.ServerStringTrim(PlayerDatas.Instance.baseData.PlayerName); | 
|                 switch (channel) | 
|                 { | 
|                     case ChatInfoType.World: | 
|                         ChatManager.Instance.RevChatInfo(new H0201_tagTalkGong() | 
|                         { | 
|                             Content = message, | 
|                             Extras = SetChatExtra(), | 
|                             PlayerID = playerId, | 
|                             Name = playerName, | 
|                         }); | 
|                         break; | 
|                     case ChatInfoType.Area: | 
|                         ChatManager.Instance.RevChatInfo(new H0207_tagTalkArea() | 
|                         { | 
|                             Content = message, | 
|                             Extras = SetChatExtra(), | 
|                             PlayerID = playerId, | 
|                             SrcName = playerName, | 
|                         }); | 
|                         break; | 
|                     case ChatInfoType.CrossServer: | 
|                         ChatManager.Instance.RevChatInfo(new H0208_tagTalkCountry() | 
|                         { | 
|                             Content = message, | 
|                             Extras = SetChatExtra(), | 
|                             PlayerID = playerId, | 
|                             Name = playerName, | 
|                         }); | 
|                         break; | 
|                     case ChatInfoType.Team: | 
|                         ChatManager.Instance.RevChatInfo(new H0205_tagTalkDui() | 
|                         { | 
|                             PlayerID = playerId, | 
|                             Name = playerName, | 
|                             Content = message, | 
|                             Extras = SetChatExtra(), | 
|                         }); | 
|                         break; | 
|                     case ChatInfoType.Fairy: | 
|                         ChatManager.Instance.RevChatInfo(new H0203_tagTalkBang() | 
|                         { | 
|                             PlayerID = playerId, | 
|                             Content = message, | 
|                             Extras = SetChatExtra(), | 
|                             Name = playerName, | 
|                         }); | 
|                         break; | 
|                     case ChatInfoType.Friend: | 
|                         ChatManager.Instance.RevChatInfo(new H0206_tagTalkMi() | 
|                         { | 
|                             PlayerID = playerId, | 
|                             SrcName = playerName, | 
|                             Content = message, | 
|                             Extras = SetChatExtra(), | 
|                             ToPlayerID = (uint)toPlayer, | 
|                             ToName = string.Empty, | 
|                             TalkType = 1, | 
|                         }); | 
|                         break; | 
|                     case ChatInfoType.default1: | 
|                         ChatManager.Instance.RevChatInfo(new HA707_tagMCPyTalk() | 
|                         { | 
|                             Content = message, | 
|                             Extras = SetChatExtra(), | 
|                             PlayerID = playerId, | 
|                             Name = playerName, | 
|                         }); | 
|                         break; | 
|                 } | 
|             } | 
|         } | 
|   | 
|         public void ServerForbidenChat(bool value) | 
|         { | 
|             if (value) | 
|             { | 
|                 serverForbidenChat = true; | 
|             } | 
|         } | 
|         private bool m_serverForbidenChat; | 
|         bool serverForbidenChat { | 
|             //get { return LocalSave.GetBool("ServerForbidenChat"); } | 
|             //set { LocalSave.SetBool("ServerForbidenChat", value); } | 
|             get { return m_serverForbidenChat; } | 
|             set { m_serverForbidenChat = value; } | 
|         } | 
|   | 
|         public bool IsChatBanned { | 
|             get { | 
|                 var value = PlayerDatas.Instance.extersion.forbidenTalk; | 
|                 //增加判断是否设备禁言 | 
|                 if (LocalSave.GetBool("ServerForbidenChatDevice1", false) || value > 0) | 
|                     return true; | 
|                 return false; | 
|             } | 
|         } | 
|   | 
|         public bool clientBanned { | 
|             get { | 
|                 return false; | 
|                 //var time = new DateTime(banTimeArray[0], banTimeArray[1], banTimeArray[2], | 
|                 //    banTimeArray[3], banTimeArray[4], banTimeArray[5]); | 
|                 //return TimeUtility.ServerNow < time; | 
|             } | 
|         } | 
|   | 
|         public int banCheckSecond = 60; | 
|         public int repeatCountLimit = 5; | 
|         public int maliceCheckCount = 10; | 
|         public int maliceLimitCount = 5; | 
|         public int singleBanSecond = 1; | 
|         public int maxBanSecond = 1; | 
|   | 
|     public int banSecond; | 
|         // { | 
|         //     get { return LocalSave.GetInt("ClientChatBanSecond", 0); } | 
|         //     set { | 
|         //         LocalSave.SetInt("ClientChatBanSecond", value); | 
|         //     } | 
|         // } | 
|   | 
|         private int[] banTimeArray = new int[6]; | 
|     private DateTime bandTime; | 
|         // { | 
|         //     get { | 
|         //         var timeArray = LocalSave.GetIntArray("ClientChatBanTime"); | 
|         //         if (null == timeArray) | 
|         //         { | 
|         //             return TimeUtility.OriginalTime; | 
|         //         } | 
|         //         else | 
|         //         { | 
|         //             return new DateTime(timeArray[0], timeArray[1], timeArray[2], timeArray[3], timeArray[4], timeArray[5]); | 
|         //         } | 
|         //     } | 
|         //     set { | 
|         //         banTimeArray[0] = value.Year; | 
|         //         banTimeArray[1] = value.Month; | 
|         //         banTimeArray[2] = value.Day; | 
|         //         banTimeArray[3] = value.Hour; | 
|         //         banTimeArray[4] = value.Minute; | 
|         //         banTimeArray[5] = value.Second; | 
|         //         LocalSave.SetIntArray("ClientChatBanTime", banTimeArray); | 
|         //     } | 
|         // } | 
|   | 
|         public void ChatClientBan() | 
|         { | 
| //            if (!clientBanned) | 
| //            { | 
| //                var time = TimeUtility.ServerNow; | 
| //                var second = Mathf.Min(maxBanSecond, banSecond + singleBanSecond); | 
| //                banSecond = second; | 
| //                bandTime = time.AddTicks(second * TimeSpan.TicksPerSecond); | 
| //#if !UNITY_EDITOR | 
| //                OperationLogCollect.Instance.BugReport(Language.Get("ClientBanTitle"), | 
| //                    Language.Get("ClientBanContent", banSecond)); | 
| //#endif | 
| //            } | 
|         } | 
|   | 
|         public bool IsClientBan(ChatInfoType chatType) | 
|         { | 
|             return false; | 
|             //if (!clientBanned) | 
|             //{ | 
|             //    return false; | 
|             //} | 
|             //if (chatType == ChatInfoType.Fairy) | 
|             //{ | 
|             //    var model = ModelCenter.Instance.GetModel<DailyQuestModel>(); | 
|             //    return model.GetQuestState((int)DailyQuestType.FairyFeast) != DailyQuestModel.DailyQuestState.Normal; | 
|             //} | 
|             //return clientBanned; | 
|         } | 
|     } |