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 { 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 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(); 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(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 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 _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 recentlyChats = new List(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 itemInfos = new List(); public List itemIndexs = new List(); public List itemNames = new List(); 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(json); } catch (Exception e) { Debug.LogError(e.StackTrace + e.Message); return false; } return chat != null; } } public static readonly Regex s_VoiceRegex = new Regex(""); private Dictionary m_VoiceChatDict = new Dictionary(); 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(); // if (!UIManager.Instance.IsOpened()) // return true; // return false; } private void CheckChatFloatOpen() { if (IsShowChatFloat()) { if (!UIManager.Instance.IsOpened()) { UIManager.Instance.OpenWindow(); } } } 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() /*TODO YYL|| NewBieCenter.Instance.inGuiding*/) { return; } openChatAfterCollect = false; if (!UIManager.Instance.IsOpened()) { ChatManager.Instance.presentChatType = ChatInfoType.Fairy; UIManager.Instance.OpenWindow(); } } 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(); // return model.GetQuestState((int)DailyQuestType.FairyFeast) != DailyQuestModel.DailyQuestState.Normal; //} //return clientBanned; } }