| | |
| | | using System.Collections; |
| | | using System; |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using UnityEngine; |
| | | using System.Text; |
| | | using System; |
| | | using LitJson; |
| | | |
| | | public partial class ChatManager : GameSystemManager<ChatManager> |
| | |
| | | if (!obj) |
| | | { |
| | | nowChatChannel = ChatChannel.World; |
| | | nowChatTab = ChatTab.World; |
| | | nowChatTab = ChatChannel.World; |
| | | if (talkDict.ContainsKey(ChatChannel.Guild)) |
| | | { |
| | | talkDict[ChatChannel.Guild].Clear(); |
| | |
| | | { |
| | | talkDict.Clear(); |
| | | lastTalkDataDict.Clear(); |
| | | currentDay = -1; |
| | | currentDayDict.Clear(); |
| | | nowChatChannel = ChatChannel.World; |
| | | nowChatTab = ChatTab.World; |
| | | nowChatTab = ChatChannel.World; |
| | | } |
| | | |
| | | private void OnBeforePlayerDataInitializeEventOnRelogin() |
| | |
| | | return true; |
| | | return false; |
| | | } |
| | | |
| | | // 0-系统 1-日期 2-自己 3-其他玩家 |
| | | public int GetTalkDataType(TalkData talkData) |
| | | { |
| | |
| | | |
| | | public void SendChatInfo(ChatChannel type, string content) |
| | | { |
| | | if (ChangeBranch(content)) return; |
| | | if (IsChatBanned) return; |
| | | |
| | | SendChatPack((int)type, content); |
| | | } |
| | | public void SendChatPack(int channelType, string content) |
| | |
| | | pack.Content = content; |
| | | pack.Len = (ushort)GetUTF8InfoLen(content); |
| | | GameNetSystem.Instance.SendInfo(pack); |
| | | ChatReport(channelType, content); |
| | | } |
| | | |
| | | void ChatReport(int chatType, string content, string toPlayer = "") |
| | | { |
| | | if (IsChatBanned) return; |
| | | try |
| | | { |
| | | var channelName = Language.Get($"ChatTab{chatType}"); |
| | | |
| | | OperationLogCollect.Instance.ChatReport(content, channelName, toPlayer, chatType); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | Debug.LogError(e.StackTrace + e.Message); |
| | | } |
| | | } |
| | | |
| | | bool ChangeBranch(string content) |
| | | { |
| | | if (content.StartsWith("#@#BrancH")) |
| | | { |
| | | if (content.Split(' ')[1] == "c") |
| | | { |
| | | //删除记录 |
| | | LocalSave.DeleteKey("#@#BrancH"); |
| | | ScrollTip.ShowTip("清理分支设置"); |
| | | } |
| | | else |
| | | { |
| | | //切换分支 |
| | | LocalSave.SetString("#@#BrancH", content.Split(' ')[1]); |
| | | ScrollTip.ShowTip("分支设置完毕"); |
| | | } |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | //禁言设备 |
| | | public bool IsChatBanned |
| | | { |
| | | get |
| | | { |
| | | var value = PlayerDatas.Instance.extersion.forbidenTalk; |
| | | //增加判断是否设备禁言 |
| | | if (LocalSave.GetBool("BanChatDevice", false) || value > 0) |
| | | return true; |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | public readonly int maxTalkCount = 1000; //聊天数量上限 |
| | | public readonly int deleteTalkCount = 300; //聊天数量上限时删除前多少条 |
| | |
| | | bool isOpen = GetBulletSetting(channelType); |
| | | if (!isOpen) |
| | | continue; |
| | | if (channelType == ChatChannel.Guild && !IsTabOpen(ChatTab.Guild, false)) |
| | | if (channelType == ChatChannel.Guild && !IsTabOpen(ChatChannel.Guild, false)) |
| | | continue; |
| | | if (data == null || talkData.TalkTime > data.TalkTime) |
| | | { |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | public void AddTalkData(ChatChannel type, TalkData data, bool isSendBullet) |
| | | { |
| | | //如果超过限制先删除旧数据 |
| | |
| | | } |
| | | } |
| | | |
| | | if (isSendBullet) |
| | | { |
| | | OnUpdateTalkEvent?.Invoke(type, data, isSendBullet); |
| | | } |
| | | OnUpdateTalkEvent?.Invoke(type, data, isSendBullet); |
| | | } |
| | | |
| | | public int currentDay = -1; |
| | | public Dictionary<ChatChannel, int> currentDayDict = new Dictionary<ChatChannel, int>(); |
| | | public bool TryAddDate(int allSeconds, ChatChannel type, bool isSendBullet) |
| | | { |
| | | DateTime talkTime = TimeUtility.GetTime((uint)allSeconds); |
| | | if (talkTime.Day != currentDay) |
| | | // 确保字典中包含该频道的条目 |
| | | if (!currentDayDict.ContainsKey(type)) |
| | | { |
| | | currentDay = talkTime.Day; |
| | | currentDayDict[type] = -1; |
| | | } |
| | | // 每个频道独立检查日期 |
| | | if (talkTime.Day != currentDayDict[type]) |
| | | { |
| | | currentDayDict[type] = talkTime.Day; |
| | | AddTalkData(type, new TalkData() |
| | | { |
| | | ChannelType = (byte)type, |
| | |
| | | return false; |
| | | } |
| | | |
| | | public void AddSysData(string msg, ArrayList infoList, ChatChannel type, bool isSendBullet) |
| | | public void AddSysData(string msg, ArrayList infoList, ChatChannel type) |
| | | { |
| | | int allSeconds = TimeUtility.AllSeconds; |
| | | // 如果隔天,增加日期行 |
| | | TryAddDate(allSeconds, type, isSendBullet); |
| | | int allSeconds = type == ChatChannel.CrossServer ? TimeUtility.GetCommServerTick(GuildManager.Instance.zoneID) : TimeUtility.AllSeconds; |
| | | |
| | | TryAddDate(allSeconds, type, false); |
| | | |
| | | if (!talkDict.ContainsKey(type)) |
| | | { |
| | | talkDict[type] = new List<TalkData>(); |
| | | } |
| | | |
| | | AddTalkData(type, new TalkData() |
| | | { |
| | | ChannelType = (byte)type, |
| | |
| | | BubbleBox = 1, |
| | | TalkTime = (uint)allSeconds, |
| | | InfoList = new ArrayList(infoList), |
| | | }, isSendBullet); |
| | | }, false); |
| | | } |
| | | |
| | | public void SendPureBullet(string msg, ArrayList infoList, ChatChannel type = ChatChannel.World) |
| | | { |
| | | TalkData talkData = new TalkData() |
| | | { |
| | | ChannelType = (byte)type, |
| | | isSystem = true, |
| | | Content = msg, |
| | | InfoList = infoList != null ? new ArrayList(infoList) : null |
| | | }; |
| | | |
| | | OnUpdateTalkEvent?.Invoke(type, talkData, true); |
| | | } |
| | | public void UpdateTalk(HB310_tagMCTalk vNetData) |
| | | { |
| | | if (!IsValidChatChannel(vNetData.ChannelType)) |
| | |
| | | talkDict[type] = new List<TalkData>(); |
| | | } |
| | | |
| | | int allSeconds = TimeUtility.AllSeconds; |
| | | int allSeconds = type == ChatChannel.CrossServer ? TimeUtility.GetCommServerTick(GuildManager.Instance.zoneID) : TimeUtility.AllSeconds; |
| | | // 如果隔天,增加日期行 |
| | | TryAddDate(allSeconds, type, true); |
| | | |
| | |
| | | } |
| | | #region 标签页 |
| | | // 当前展示的频道入口 |
| | | private ChatTab m_NowChatTab; |
| | | public ChatTab nowChatTab |
| | | private ChatChannel m_NowChatTab; |
| | | public ChatChannel nowChatTab |
| | | { |
| | | get { return m_NowChatTab; } |
| | | set |
| | |
| | | } |
| | | } |
| | | |
| | | public event Action<ChatTab> OnChatTabChangeEvent; |
| | | public event Action<ChatChannel> OnChatTabChangeEvent; |
| | | |
| | | // 频道入口的展示顺序 |
| | | public readonly List<ChatTab> tabShowList = new List<ChatTab>() |
| | | public readonly List<ChatChannel> tabShowList = new List<ChatChannel>() |
| | | { |
| | | ChatTab.World, |
| | | ChatTab.Guild, |
| | | ChatChannel.World, |
| | | ChatChannel.Guild, |
| | | ChatChannel.CrossServer, |
| | | // ChatTab.Person, |
| | | // ChatTab.BlackList, |
| | | }; |
| | | |
| | | public bool IsTabOpen(ChatTab chatTab, bool isTip = false) |
| | | public bool IsTabOpen(ChatChannel chatTab, bool isTip = false) |
| | | { |
| | | if (!tabShowList.Contains(chatTab)) |
| | | return false; |
| | | |
| | | switch (chatTab) |
| | | { |
| | | case ChatTab.World: |
| | | return true; |
| | | case ChatTab.Guild: |
| | | case ChatChannel.Guild: |
| | | //没有公会 |
| | | if (!PlayerDatas.Instance.fairyData.HasFairy) |
| | | { |
| | |
| | | return false; |
| | | } |
| | | return true; |
| | | case ChatChannel.CrossServer: |
| | | //没有合服 |
| | | if (GuildManager.Instance.zoneID <= 0) |
| | | { |
| | | if (isTip) |
| | | SysNotifyMgr.Instance.ShowTip("CrossServerNoOpen"); |
| | | return false; |
| | | } |
| | | return true; |
| | | default: |
| | | return false; |
| | | return true; |
| | | } |
| | | } |
| | | |
| | | public bool IsSelectChatTab(ChatTab chatTab) |
| | | public bool IsSelectChatTab(ChatChannel chatTab) |
| | | { |
| | | return nowChatTab == chatTab; |
| | | } |
| | | |
| | | public bool IsValidChatTab(int chatTab) |
| | | { |
| | | return Enum.IsDefined(typeof(ChatTab), chatTab); |
| | | return Enum.IsDefined(typeof(ChatChannel), chatTab); |
| | | } |
| | | |
| | | public string GetChatTabName(ChatTab chatTab) |
| | | public string GetChatTabName(ChatChannel chatTab) |
| | | { |
| | | return Language.Get(StringUtility.Concat("ChatTab", ((int)chatTab).ToString())); |
| | | } |
| | | |
| | | public string GetChatTabSelectIcon(ChatTab chatTab, bool isSelect) |
| | | public string GetChatTabSelectIcon(ChatChannel chatTab, bool isSelect) |
| | | { |
| | | return StringUtility.Concat(isSelect ? "ChatTabSelect" : "ChatTabUnSelect", ((int)chatTab).ToString()); |
| | | } |
| | |
| | | |
| | | } |
| | | |
| | | public enum ChatTab |
| | | { |
| | | World = 0, //世界 |
| | | Guild = 1, //公会 |
| | | Person = 2, //私聊 |
| | | BlackList = 3, //黑名单 |
| | | } |
| | | |
| | | public enum ChatChannel |
| | | { |
| | | World = 0, //世界 |