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; 
 | 
        } 
 | 
    } 
 |