using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using System.Text;
|
using System;
|
using System.Text.RegularExpressions;
|
using Snxxz.UI;
|
|
using System.Linq;
|
|
public class ChatCtrl
|
{
|
|
#region 单例
|
private static ChatCtrl _inst = null;
|
|
public static ChatCtrl Inst
|
{
|
get
|
{
|
if (_inst == null)
|
{
|
_inst = new ChatCtrl();
|
}
|
return _inst;
|
}
|
}
|
#endregion
|
public int CHAT_INFO_CNT = 50;
|
public const int CHAT_TIP_CNT = 4;
|
public const int CHAT_CELL_CNT = 6;
|
public const int CHAT_INFO_LIMIT = 50;
|
|
public readonly int BugleItem = 0;//喇叭物品id
|
|
private static StringBuilder _textBuilder = new StringBuilder();
|
/// <summary>
|
/// 聊天信息
|
/// </summary>
|
private bool _lockUpdate = true;
|
public bool lockUpdate
|
{
|
get
|
{
|
return _lockUpdate;
|
}
|
set
|
{
|
_lockUpdate = value;
|
if (ChatFriend != null && ChatFriend.IsOpen)
|
{
|
ChatFriend.OnSetLock();
|
}
|
}
|
}
|
|
private Dictionary<ChatInfoType, List<ChatData>> chatDics = new Dictionary<ChatInfoType, List<ChatData>>();
|
|
private Dictionary<ChatInfoType, bool> chatOpenDics = new Dictionary<ChatInfoType, bool>();
|
|
public List<ChatData> chatDisplayList = new List<ChatData>();
|
|
#region 私聊
|
private Dictionary<int, List<ChatFriendData>> pteChatDics = new Dictionary<int, List<ChatFriendData>>();
|
public event Action OnPteChatChangeEvent;
|
public event Action<int> SelectRecentlyEvent;
|
public static event OnChatPteRefresh OnRefreshPteChat;
|
private int pteChatId = 0;
|
public int PteChatID
|
{
|
get { return pteChatId; }
|
set
|
{
|
if (pteChatId == value)
|
{
|
return;
|
}
|
pteChatId = value;
|
if (OnPteChatChangeEvent != null)
|
{
|
OnPteChatChangeEvent();
|
}
|
if (ChatFriend != null && ChatFriend.IsOpen)
|
{
|
ChatFriend.RefreshChatInfo();
|
}
|
}
|
}
|
private string pteChatName = string.Empty;
|
public string PteChatName
|
{
|
get { return pteChatName; }
|
set { pteChatName = value; }
|
}
|
|
private ChatFriend m_ChatFriend;
|
public ChatFriend ChatFriend
|
{
|
get { return m_ChatFriend; }
|
}
|
|
public void ClearPteChat(int playerId)
|
{
|
var id = (int)PlayerDatas.Instance.PlayerId + playerId;
|
if (pteChatDics.ContainsKey(id))
|
{
|
pteChatDics.Remove(id);
|
if (OnRefreshPteChat != null)
|
{
|
OnRefreshPteChat(null);
|
}
|
}
|
}
|
|
public void SelectRecentlyChat(int playerId)
|
{
|
if (SelectRecentlyEvent != null)
|
{
|
SelectRecentlyEvent(playerId);
|
}
|
}
|
#endregion
|
|
private List<ChatData> chatlist = new List<ChatData>();
|
private List<ChatData> chatUpList = new List<ChatData>();
|
|
public delegate void OnChatRefresh(ChatInfoType type);
|
public static event OnChatRefresh OnRefreshChat;
|
|
public delegate void OnChatSelfRefresh(ChatData data);
|
public static event OnChatSelfRefresh OnRefreshSelf;
|
|
public delegate void OnChatPteRefresh(ChatFriendData data);
|
|
public ChatInfoType presentChatType
|
{
|
get; set;
|
}
|
|
public event Action OnClickCloseChatEvent;
|
public event Action<bool> OnChatExtentOpenEvent;
|
|
public event Action<ChatData> chatFloatUpdate;
|
|
TeamModel teamModel
|
{
|
get
|
{
|
return ModelCenter.Instance.GetModel<TeamModel>();
|
}
|
}
|
|
ChatCenter m_ChatCenter;
|
ChatCenter chatCenter
|
{
|
get
|
{
|
return m_ChatCenter ?? (m_ChatCenter = ModelCenter.Instance.GetModel<ChatCenter>());
|
}
|
}
|
|
FriendsModel friendModel
|
{
|
get { return ModelCenter.Instance.GetModel<FriendsModel>(); }
|
}
|
|
public Dictionary<ChatInfoType, List<string>> achievementRandoms = new Dictionary<ChatInfoType, List<string>>();
|
|
private ChatCtrl()
|
{
|
chatOpenDics.Add(ChatInfoType.System, true);
|
chatOpenDics.Add(ChatInfoType.World, true);
|
chatOpenDics.Add(ChatInfoType.CrossServer, true);
|
chatOpenDics.Add(ChatInfoType.Area, true);
|
chatOpenDics.Add(ChatInfoType.Team, true);
|
chatOpenDics.Add(ChatInfoType.Invite, true);
|
chatOpenDics.Add(ChatInfoType.Trumpet, true);
|
chatOpenDics.Add(ChatInfoType.Fairy, true);
|
lockUpdate = true;
|
presentChatType = ChatInfoType.World;
|
IsExtentOpen = false;
|
|
var _funcCfg = FuncConfigConfig.Get("BugleItem");
|
BugleItem = int.Parse(_funcCfg.Numerical1);
|
|
DTC0102_tagCDBPlayer.switchAccountEvent += SwitchAccountEvent;
|
StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish;
|
DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += PlayerLoginOkEvent;
|
|
InitChatRedpoints();
|
|
FuncConfigConfig _cfg = FuncConfigConfig.Get("RandomWord");
|
try
|
{
|
achievementRandoms.Add(ChatInfoType.World, new List<string>(ConfigParse.GetMultipleStr(_cfg.Numerical1)));
|
achievementRandoms.Add(ChatInfoType.Fairy, new List<string>(ConfigParse.GetMultipleStr(_cfg.Numerical2)));
|
}
|
catch (Exception e)
|
{
|
DebugEx.LogError(e.Message);
|
}
|
}
|
|
private void PlayerLoginOkEvent()
|
{
|
UpdateRedpoint(ChatInfoType.Team);
|
UpdateRedpoint(ChatInfoType.Fairy);
|
}
|
|
private void OnStageLoadFinish()
|
{
|
bool isDungeon = StageLoad.Instance.currentStage is DungeonStage;
|
if (!isDungeon)
|
{
|
ClearAllChatInfo();
|
unReadChatCounts[ChatInfoType.Fairy] = 0;
|
unReadChatCounts[ChatInfoType.Team] = 0;
|
}
|
}
|
|
private void SwitchAccountEvent()
|
{
|
ClearAllChatInfo();
|
}
|
|
void ChatReport(ChatInfoType chatType, string content, string toPlayer)
|
{
|
try
|
{
|
if (chatCenter.IsChatBanned || chatCenter.IsClientBan(chatType) ||
|
IsInviteChat(content) || KillRegex.IsMatch(content))
|
{
|
return;
|
}
|
var channelName = string.Empty;
|
switch (chatType)
|
{
|
case ChatInfoType.World:
|
channelName = Language.Get("ChatType_World");
|
break;
|
case ChatInfoType.Area:
|
channelName = Language.Get("ChatType_Area");
|
break;
|
case ChatInfoType.CrossServer:
|
channelName = Language.Get("ChatType_CrossServer");
|
break;
|
case ChatInfoType.Team:
|
channelName = Language.Get("ChatType_Team");
|
break;
|
case ChatInfoType.Invite:
|
channelName = Language.Get("ChatType_Invite");
|
break;
|
case ChatInfoType.Trumpet:
|
channelName = Language.Get("ChatType_Trumpet");
|
break;
|
case ChatInfoType.Fairy:
|
channelName = Language.Get("ChatType_Fairy");
|
break;
|
case ChatInfoType.Friend:
|
channelName = Language.Get("PlayerDetail_PrivateChat");
|
break;
|
default:
|
return;
|
}
|
OperationLogCollect.Instance.ChatReport(content, channelName, chatType == ChatInfoType.Friend ? toPlayer : string.Empty, chatType);
|
}
|
catch (Exception e)
|
{
|
DebugEx.Log(e.Message);
|
}
|
}
|
|
public void SendChatInfo(ChatInfoType type, string msg, ChatExtraData? info = null)
|
{
|
bool isDirty = false;
|
bool isVoice = ChatCenter.s_VoiceRegex.IsMatch(msg);
|
|
if (CheckEmptyChat(msg))
|
{
|
SysNotifyMgr.Instance.ShowTip("CanootTalk14");
|
return;
|
}
|
|
ChatReport(type, msg, PteChatName);
|
|
if (!isVoice && !InviteRegex.IsMatch(msg))
|
{
|
isDirty = DirtyWordConfig.IsDirtWord(msg);
|
msg = DirtyWordConfig.IsDirtWord(msg, '*');
|
var length = GetChatMessageLength(msg);
|
if (length > CHAT_INFO_CNT)
|
{
|
ServerTipDetails.DisplayNormalTip(Language.Get("L1014"));
|
return;
|
}
|
}
|
LanguageVerify.toPlayer = (uint)PteChatID;
|
LanguageVerify.toPlayerName = PteChatName;
|
LanguageVerify.Instance.VerifyChat(msg, type, (bool ok, string result) =>
|
{
|
if (ok)
|
{
|
ChatCenter.RecentlyChat _recentlyChat = null;
|
if (!isDirty && !isVoice)
|
{
|
_recentlyChat = chatCenter.SaveRecentlyChat(result);
|
}
|
msg = CheckHasItem(result, _recentlyChat);
|
chatCenter.recentlyChat = null;
|
|
if (chatCenter.IsChatBanned || chatCenter.IsClientBan(type))
|
{
|
var toPlayer = PteChatID;
|
if (info.HasValue && info.Value.infoint1 == 0)
|
{
|
toPlayer = info.Value.infoint1;
|
}
|
chatCenter.HandleChatBanned(type, msg, toPlayer);
|
return;
|
}
|
|
switch (type)
|
{
|
case ChatInfoType.World:
|
case ChatInfoType.Fairy:
|
if (IsAssitChat(msg) != 0)
|
{
|
teamModel.RequestAssistAutoMatch();
|
}
|
break;
|
}
|
|
switch (type)
|
{
|
case ChatInfoType.World:
|
{
|
C0201_tagCTalkGong chatPack = new C0201_tagCTalkGong();
|
chatPack.Len = (ushort)GetUTF8InfoLen(msg);
|
chatPack.Content = msg;
|
GameNetSystem.Instance.SendInfo(chatPack);
|
}
|
break;
|
case ChatInfoType.Area:
|
{
|
C0207_tagCTalkArea chatPack = new C0207_tagCTalkArea();
|
chatPack.Len = (ushort)GetUTF8InfoLen(msg);
|
chatPack.Content = msg;
|
if (CrossServerUtility.IsCrossServer())
|
{
|
GameNetSystem.Instance.SendToCrossServer(chatPack);
|
}
|
else
|
{
|
GameNetSystem.Instance.SendInfo(chatPack);
|
}
|
}
|
break;
|
case ChatInfoType.CrossServer:
|
{
|
C0208_tagCTalkCountry chatPack = new C0208_tagCTalkCountry();
|
chatPack.Len = (ushort)GetUTF8InfoLen(msg);
|
chatPack.Content = msg;
|
GameNetSystem.Instance.SendInfo(chatPack);
|
}
|
break;
|
case ChatInfoType.Team:
|
{
|
C0205_tagCTalkDui chatPack = new C0205_tagCTalkDui();
|
chatPack.Len = (ushort)GetUTF8InfoLen(msg);
|
chatPack.Content = msg;
|
GameNetSystem.Instance.SendInfo(chatPack);
|
}
|
break;
|
case ChatInfoType.Friend:
|
{
|
var _toPlayer = PteChatID;
|
if (info.HasValue && info.Value.infoint1 == 0)
|
{
|
_toPlayer = info.Value.infoint1;
|
}
|
if (_toPlayer == 0)
|
{
|
SysNotifyMgr.Instance.ShowTip("NoChatTarget");
|
return;
|
}
|
SendFriendChat(msg, _toPlayer);
|
}
|
break;
|
case ChatInfoType.Fairy:
|
{
|
C0203_tagCTalkBang chatPack = new C0203_tagCTalkBang();
|
chatPack.Len = (ushort)GetUTF8InfoLen(msg);
|
chatPack.Content = msg;
|
GameNetSystem.Instance.SendInfo(chatPack);
|
}
|
break;
|
case ChatInfoType.Trumpet:
|
{
|
if (info.HasValue)
|
{
|
CA217_tagCMPYSpeaker _pak = new CA217_tagCMPYSpeaker();
|
_pak.SpeakerType = 1;
|
_pak.IsUseGold = 0;
|
_pak.ItemIndex = (byte)info.Value.infoint1;
|
_pak.TextLen = (ushort)GetUTF8InfoLen(msg);
|
_pak.Text = msg;
|
GameNetSystem.Instance.SendInfo(_pak);
|
}
|
}
|
break;
|
}
|
}
|
});
|
}
|
|
int GetChatMessageLength(string message)
|
{
|
message = WordAnalysis.Color_Start_Regex.Replace(message, string.Empty);
|
message = WordAnalysis.Color_End_Regex.Replace(message, string.Empty);
|
return message.Length;
|
}
|
|
bool CheckEmptyChat(string msg)
|
{
|
if (string.IsNullOrEmpty(msg.Replace(" ", string.Empty)))
|
{
|
return true;
|
}
|
return false;
|
}
|
/// <summary>
|
/// 世界频道
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void RevChatInfo(H0201_tagTalkGong vNetData)
|
{
|
if (friendModel.GetFirendInfo(vNetData.PlayerID, (byte)GroupType.Balcklist) != null)//黑名单拦截
|
{
|
return;
|
}
|
ChatData chatData = null;
|
var content = vNetData.Content;
|
if (IsInviteChat(vNetData.Content))
|
{
|
content = InviteRegex.Replace(vNetData.Content, "");
|
if (teamModel.myTeam.GetIndexOfMember((int)vNetData.PlayerID) != -1)
|
{
|
content = StringUtility.Contact("<color=#f8983b>", vNetData.Name, "</color>", ":", content);
|
}
|
else
|
{
|
content = StringUtility.Contact("<color=#f8983b>", vNetData.Name, "</color>", ":", content, string.Format("<color=#00ff00><a>{0}|invite={1}</a></color>", Language.Get("L1013"), vNetData.PlayerID));
|
}
|
chatData = new ChatInviteData(content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
|
KeepChatInfo(chatData);
|
return;
|
}
|
if (IsAssitChat(content, true) == 2 && vNetData.PlayerID != PlayerDatas.Instance.baseData.PlayerID)
|
{
|
content = StringUtility.Contact(content, Language.Get("InviteTeam", vNetData.PlayerID));
|
}
|
chatData = new ChatWorldData(content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
|
LocalChatHistory.Save(chatData as ChatUeseData);
|
KeepChatInfo(chatData);
|
}
|
/// <summary>
|
/// 区域频道
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void RevChatInfo(H0207_tagTalkArea vNetData)
|
{
|
if (friendModel.GetFirendInfo(vNetData.PlayerID, (byte)GroupType.Balcklist) != null)//黑名单拦截
|
{
|
return;
|
}
|
ChatData chatData = new ChatAreaData(vNetData.Content, (int)vNetData.PlayerID, vNetData.SrcName, vNetData.Extras);
|
LocalChatHistory.Save(chatData as ChatUeseData);
|
KeepChatInfo(chatData);
|
}
|
|
/// <summary>
|
/// 跨服聊天
|
/// </summary>
|
/// <param name="package"></param>
|
public void RevChatInfo(H0208_tagTalkCountry package)
|
{
|
if (friendModel.GetFirendInfo(package.PlayerID, (byte)GroupType.Balcklist) != null)//黑名单拦截
|
{
|
return;
|
}
|
if (!FuncOpen.Instance.IsFuncOpen(162))
|
{
|
return;
|
}
|
ChatData chatData = new ChatCrossServerData(package.Content, (int)package.PlayerID, package.Name, package.Extras);
|
LocalChatHistory.Save(chatData as ChatUeseData);
|
KeepChatInfo(chatData);
|
}
|
|
/// <summary>
|
/// 喇叭喊话
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void RevChatInfo(HA9A3_tagGCPYSpeakerContent vNetData)
|
{
|
ChatData chatData = new ChatTrumpetData(vNetData.Text, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras, vNetData.SpeakerType, vNetData.AccID);
|
LocalChatHistory.Save(chatData as ChatUeseData);
|
KeepChatInfo(chatData);
|
ServerTipDetails.ShowTrumpetTip(chatData as ChatTrumpetData);
|
}
|
/// <summary>
|
/// 家族频道
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void RevChatInfo(H0203_tagTalkBang vNetData)
|
{
|
var content = vNetData.Content;
|
if (IsAssitChat(content, true) == 1 && vNetData.PlayerID != PlayerDatas.Instance.baseData.PlayerID)
|
{
|
content = StringUtility.Contact(content, Language.Get("InviteTeam", vNetData.PlayerID));
|
}
|
ChatData chatData = new ChatFamilyData(content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
|
LocalChatHistory.Save(chatData as ChatUeseData);
|
KeepChatInfo(chatData);
|
ReceiveNewChat(ChatInfoType.Fairy);
|
}
|
/// <summary>
|
/// 好友私聊
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void SetChatFreind(ChatFriend inst)
|
{
|
m_ChatFriend = inst;
|
}
|
public void RevChatInfo(H0206_tagTalkMi vNetData)
|
{
|
if (Regex.IsMatch(vNetData.Content, KILL_IDENTIFY))
|
{
|
if (vNetData.PlayerID == PlayerDatas.Instance.baseData.PlayerID)
|
{
|
return;
|
}
|
}
|
ChatFriendData chatData = new ChatFriendData(vNetData.Content, (int)vNetData.PlayerID, vNetData.SrcName, vNetData.Extras, vNetData.ToName, vNetData.TalkType, vNetData.ToPlayerID);
|
FitterChat(chatData);
|
AddPteChat(chatData, false);
|
LocalChatHistory.Save(chatData as ChatUeseData);
|
if (chatData.player == PlayerDatas.Instance.baseData.PlayerID)
|
{
|
if (OnRefreshSelf != null)
|
{
|
OnRefreshSelf(chatData);
|
}
|
}
|
if (chatData.IsSound)
|
{
|
chatCenter.CheckAutoPlayVoice(chatData);
|
}
|
}
|
private void AddPteChat(ChatFriendData chatData, bool isLocal)
|
{
|
List<ChatFriendData> list = null;
|
pteChatDics.TryGetValue(chatData.player + chatData.toPlayer, out list);
|
if (list != null)
|
{
|
if (list.Count > CHAT_INFO_CNT)
|
{
|
ChatUeseData outData = list[0];
|
list.RemoveAt(0);
|
outData = null;
|
}
|
list.Add(chatData);
|
}
|
else
|
{
|
list = new List<ChatFriendData>();
|
list.Add(chatData);
|
pteChatDics.Add(chatData.player + chatData.toPlayer, list);
|
}
|
if (OnRefreshPteChat != null && !isLocal)
|
{
|
OnRefreshPteChat(chatData);
|
}
|
}
|
/// <summary>
|
/// 队伍频道
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void RevChatInfo(H0205_tagTalkDui vNetData)
|
{
|
ChatData chatData = new ChatTeamData(vNetData.Content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
|
KeepChatInfo(chatData);
|
ReceiveNewChat(ChatInfoType.Team);
|
}
|
/// <summary>
|
/// GM
|
/// </summary>
|
/// <param name="vNetData"></param>
|
public void RevChatInfo(H3202_tagServerResponse vNetData)
|
{
|
ChatData chatData = new ChatSystemData(vNetData.Message);
|
KeepChatInfo(chatData);
|
}
|
/// <summary>
|
/// 系统提示
|
/// </summary>
|
/// <param name="msg"></param>
|
public void RevChatInfo(string msg)
|
{
|
ChatData chatData = new ChatSystemData(msg);
|
KeepChatInfo(chatData);
|
}
|
public void RevChatInfo(string msg, ArrayList infoList, ChatInfoType type = ChatInfoType.System)
|
{
|
ChatData chatData = null;
|
switch (type)
|
{
|
case ChatInfoType.System:
|
{
|
chatData = new ChatSystemData(msg);
|
chatData.infoList.AddRange(infoList);
|
}
|
break;
|
case ChatInfoType.FairyTip:
|
case ChatInfoType.FairyQuestion:
|
{
|
chatData = new ChatFamilyData(msg, 0, string.Empty, string.Empty, type);
|
chatData.infoList.AddRange(infoList);
|
}
|
break;
|
case ChatInfoType.TeamTip:
|
{
|
chatData = new ChatTeamData(msg, 0, string.Empty, string.Empty, type);
|
chatData.infoList.AddRange(infoList);
|
}
|
break;
|
}
|
if (chatData != null)
|
{
|
KeepChatInfo(chatData);
|
}
|
}
|
/// <summary>
|
/// 获取频道聊天数据
|
/// </summary>
|
/// <param name="type"></param>
|
/// <returns></returns>
|
public List<ChatData> GetChatInfo(ChatInfoType type)
|
{
|
List<ChatData> list = null;
|
chatDics.TryGetValue(type, out list);
|
return list;
|
}
|
/// <summary>
|
/// 获取好友聊天数据
|
/// </summary>
|
/// <param name="type"></param>
|
/// <returns></returns>
|
public List<ChatFriendData> GetChatInfo(int player)
|
{
|
List<ChatFriendData> list = null;
|
pteChatDics.TryGetValue(player + (int)PlayerDatas.Instance.baseData.PlayerID, out list);
|
return list;
|
}
|
/// <summary>
|
/// 获取主界面的聊天数据
|
/// </summary>
|
/// <returns></returns>
|
public List<ChatData> GetChatInfo()
|
{
|
return chatlist;
|
}
|
public List<ChatData> GetChatUpInfo()
|
{
|
return chatUpList;
|
}
|
public ChatData GetChatInfo(ChatInfoType type, int index)
|
{
|
List<ChatData> list = null;
|
chatDics.TryGetValue(type, out list);
|
if (list != null)
|
{
|
return list[index];
|
}
|
return null;
|
}
|
|
public void KeepLocalChat(ChatData chat)
|
{
|
if (chat.type == ChatInfoType.Friend)
|
{
|
FitterChat(chat);
|
AddPteChat(chat as ChatFriendData, true);
|
}
|
else
|
{
|
KeepChatInfo(chat);
|
}
|
}
|
|
private void KeepChatInfo(ChatData data)
|
{
|
KeepAllTypeChat(data);
|
List<ChatData> list = null;
|
chatDics.TryGetValue(data.type, out list);
|
if (list != null)
|
{
|
if (list.Count >= CHAT_INFO_CNT)
|
{
|
ChatData outData = list[0];
|
list.RemoveAt(0);
|
outData = null;
|
}
|
list.Add(data);
|
}
|
else
|
{
|
list = new List<ChatData>();
|
list.Add(data);
|
chatDics.Add(data.type, list);
|
}
|
if (chatFloatUpdate != null)
|
{
|
chatFloatUpdate(data);
|
}
|
if (OnRefreshChat != null)
|
OnRefreshChat(data.type);
|
if (data.type != ChatInfoType.System && (data as ChatUeseData).player == PlayerDatas.Instance.baseData.PlayerID)
|
{
|
if (OnRefreshSelf != null)
|
OnRefreshSelf(data);
|
}
|
if ((data is ChatUeseData)
|
&& (data as ChatUeseData).IsSound)
|
{
|
chatCenter.CheckAutoPlayVoice(data);
|
}
|
}
|
private void KeepAllTypeChat(ChatData data)
|
{
|
if (!FitterChat(data))
|
{
|
if (chatlist.Count >= CHAT_TIP_CNT)
|
{
|
ChatData outData = chatlist[0];
|
chatlist.RemoveAt(0);
|
}
|
if (chatUpList.Count >= CHAT_INFO_CNT)
|
{
|
ChatData outData = chatUpList[0];
|
chatUpList.RemoveAt(0);
|
}
|
chatlist.Add(data);
|
chatUpList.Add(data);
|
}
|
}
|
private bool FitterChat(ChatData data)
|
{
|
if (IsItemChat(data.content))
|
{
|
string content = data.content;
|
MatchCollection matchArray = HrefAnalysis.EquipDetailRegex.Matches(content);
|
int index = 0;
|
for (int i = 0; i < matchArray.Count; i++)
|
{
|
data.richText.Append(content.Substring(index, matchArray[i].Index - index));
|
index = matchArray[i].Index + matchArray[i].Length;
|
string detail = matchArray[i].Groups[1].Value;
|
string[] strarray = detail.Split('|');
|
int itemID = 0;
|
if (int.TryParse(strarray[0], out itemID))
|
{
|
ItemConfig cfg = ItemConfig.Get(itemID);
|
if (cfg != null)
|
{
|
try
|
{
|
string append = string.Format("<a><Word info=item id={0} userdata={4} chatsend=1/>|showitem={0} isbind={1} itemcnt={2} stone={3} userdata={4} suitLv={5} suitCnt={6} place={7} equipwash={8}</a>",
|
strarray[0], strarray[1], strarray[2], strarray[3], strarray[4], strarray[5], strarray[6], strarray[7], strarray[8]);
|
append = UIHelper.AppendStringColor(cfg.ItemColor, append);
|
data.richText.Append(append);
|
}
|
catch (Exception e)
|
{
|
data.richText.Append(cfg.ItemName);
|
DebugEx.Log(e.Message);
|
}
|
}
|
}
|
else
|
{
|
data.richText.Append(matchArray[i].Value);
|
}
|
}
|
data.richText.Append(content.Substring(index, content.Length - index));
|
}
|
if (data.type == ChatInfoType.Friend)
|
{
|
return true;
|
}
|
if (data.content.Equals(string.Empty))
|
{
|
return true;
|
}
|
return !chatOpenDics[data.type];
|
}
|
public Dictionary<ChatInfoType, bool> GetChatOpen()
|
{
|
return chatOpenDics;
|
}
|
|
#region 组队邀请
|
private const string INVITE_IDENTIFY = "<i>";
|
public static Regex InviteRegex = new Regex(@INVITE_IDENTIFY, RegexOptions.Singleline);
|
public void SendInvite(string msg)
|
{
|
SendChatInfo(ChatInfoType.World, StringUtility.Contact(msg, INVITE_IDENTIFY));
|
}
|
public bool IsInviteChat(string msg)
|
{
|
return InviteRegex.IsMatch(msg);
|
}
|
#endregion
|
|
#region 发送物品
|
public List<ItemModel> itemPlaceList = new List<ItemModel>();
|
public bool IsItemChat(string msg)
|
{
|
return HrefAnalysis.EquipDetailRegex.IsMatch(msg);
|
}
|
public string CheckHasItem(string msg,ChatCenter.RecentlyChat _recently)
|
{
|
if (!HrefAnalysis.EquipRegex.IsMatch(msg))
|
{
|
return msg;
|
}
|
_textBuilder.Length = 0;
|
MatchCollection matchArray = HrefAnalysis.EquipRegex.Matches(msg);
|
int index = 0;
|
for (int i = 0; i < matchArray.Count; i++)
|
{
|
_textBuilder.Append(msg.Substring(index, matchArray[i].Index - index));
|
if (chatCenter.recentlyChat != null)
|
{
|
if (i < chatCenter.recentlyChat.itemIndexs.Count)
|
{
|
var _index = chatCenter.recentlyChat.itemIndexs[i];
|
_textBuilder.Append(chatCenter.recentlyChat.itemInfos[_index]);
|
}
|
index = matchArray[i].Index + matchArray[i].Length;
|
continue;
|
}
|
var _length = _textBuilder.Length;
|
if (i < itemPlaceList.Count)
|
{
|
ItemConfig cfg = ItemConfig.Get((int)itemPlaceList[i].itemId);
|
if (cfg.ItemName == matchArray[i].Groups[1].Value)
|
{
|
bool equip = itemPlaceList[i].packType == PackType.Equip;
|
uint[] stones = equip ? PlayerStoneData.Instance.GetStoneInfo(itemPlaceList[i].itemPlace) : null;
|
_textBuilder.Append(StringUtility.Contact("#item#", itemPlaceList[i].itemId,
|
"|", itemPlaceList[i].itemInfo.IsBind,
|
"|", itemPlaceList[i].itemInfo.ItemCount,
|
"|", stones != null ? LitJson.JsonMapper.ToJson(stones) :
|
LitJson.JsonMapper.ToJson(new uint[0]),
|
"|"));
|
if (itemPlaceList[i].useDataDict != null && itemPlaceList[i].useDataDict.Count > 0)
|
{
|
foreach (int key in itemPlaceList[i].useDataDict.Keys)
|
{
|
List<int> intarray = itemPlaceList[i].useDataDict[key];
|
var _array = intarray.ToArray();
|
_textBuilder.Append(StringUtility.Contact("'", key, "':", _array != null ? LitJson.JsonMapper.ToJson(_array) :
|
LitJson.JsonMapper.ToJson(new int[0])));
|
_textBuilder.Append(",");
|
}
|
}
|
_textBuilder.Append("|");
|
var _dictSuitLv = ModelCenter.Instance.GetModel<PlayerSuitModel>().GetServerSuitModelByPlace(itemPlaceList[i].itemPlace);
|
if (_dictSuitLv != null&& equip)
|
{
|
foreach (int key in _dictSuitLv.Keys)
|
{
|
_textBuilder.Append(StringUtility.Contact("'", key, "_", _dictSuitLv[key]));
|
}
|
}
|
_textBuilder.Append("|");
|
var _dictSuitCnt = ModelCenter.Instance.GetModel<PlayerSuitModel>().GetServerSuitCntByPlace(itemPlaceList[i].itemPlace);
|
if (_dictSuitCnt != null && equip)
|
{
|
foreach (int key in _dictSuitCnt.Keys)
|
{
|
_textBuilder.Append(StringUtility.Contact("'", key, "_", _dictSuitCnt[(SuitType)key]));
|
}
|
}
|
_textBuilder.Append("|");
|
_textBuilder.Append(itemPlaceList[i].itemPlace);
|
_textBuilder.Append("|");
|
var _wash = ModelCenter.Instance.GetModel<EquipWashModel>().GetWashEquipInfo(itemPlaceList[i].itemPlace);
|
if (_wash != null && equip)
|
{
|
_textBuilder.Append("{");
|
int[] _array = _wash.proValuelist == null ? new int[0] : new int[_wash.proValuelist.Length];
|
for (int k = 0; k < _array.Length; k++)
|
{
|
_array[k] = (int)_wash.proValuelist[k].XLAttrValue;
|
}
|
_textBuilder.Append(StringUtility.Contact("\"LV\":", _wash.XLAttrLV, ",\"Place\":", _wash.EquipPlace,
|
",\"Value\":", LitJson.JsonMapper.ToJson(_array)));
|
_textBuilder.Append("}");
|
}
|
_textBuilder.Append("#item#");
|
if (_recently != null)
|
{
|
_recently.Add(cfg.ItemName, _textBuilder.ToString().Substring(_length));
|
}
|
}
|
else
|
{
|
_textBuilder.Append(matchArray[i].Value);
|
}
|
}
|
else
|
{
|
_textBuilder.Append(matchArray[i].Value);
|
}
|
index = matchArray[i].Index + matchArray[i].Length;
|
}
|
_textBuilder.Append(msg.Substring(index, msg.Length - index));
|
return _textBuilder.ToString();
|
}
|
#endregion
|
|
#region 好友私聊
|
public static Regex KillRegex = new Regex(@KILL_IDENTIFY, RegexOptions.Singleline);
|
public const string KILL_IDENTIFY = "<k>";
|
public void SendFriendChat(string msg, int player)
|
{
|
C0209_tagCTalkMiFix chatPack = new C0209_tagCTalkMiFix();
|
chatPack.TalkType = 1;
|
chatPack.PlayerID = (uint)player;
|
chatPack.Len = (ushort)GetUTF8InfoLen(msg);
|
chatPack.Content = msg;
|
GameNetSystem.Instance.SendInfo(chatPack);
|
}
|
#endregion
|
/// <summary>
|
/// 清屏
|
/// </summary>
|
public void ClearAllChatInfo()
|
{
|
chatDics.Clear();
|
chatlist.Clear();
|
chatUpList.Clear();
|
pteChatDics.Clear();
|
if (OnRefreshChat != null)
|
{
|
OnRefreshChat(presentChatType);
|
}
|
}
|
|
public void ClearChatInfo(ChatInfoType type)
|
{
|
List<ChatData> list = null;
|
if (chatDics.TryGetValue(type, out list))
|
{
|
list.Clear();
|
if (OnRefreshChat != null)
|
{
|
OnRefreshChat(type);
|
}
|
}
|
}
|
|
public static int GetUTF8InfoLen(string msg)
|
{
|
return Encoding.UTF8.GetBytes(msg).Length;
|
}
|
|
public void CloseChatBtnClick()
|
{
|
if (OnClickCloseChatEvent != null)
|
{
|
OnClickCloseChatEvent();
|
}
|
}
|
|
public bool IsExtentOpen { get; set; }
|
public void OpenChatExtent(bool open)
|
{
|
if (OnChatExtentOpenEvent != null)
|
{
|
OnChatExtentOpenEvent(open);
|
}
|
}
|
|
#region 陌生人聊天
|
public event Action OpenPteChatEvent;
|
public void OpenFriendWin()
|
{
|
if (OpenPteChatEvent != null)
|
{
|
OpenPteChatEvent();
|
}
|
}
|
#endregion
|
|
#region 主界面聊天频道显示设置
|
public void SetChatChannelShow(ChatInfoType type, bool open)
|
{
|
if (chatOpenDics.ContainsKey(type))
|
{
|
chatOpenDics[type] = open;
|
}
|
}
|
|
public void GetChatChannelShow()
|
{
|
chatOpenDics[ChatInfoType.World] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelWorld);
|
chatOpenDics[ChatInfoType.Area] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelArea);
|
chatOpenDics[ChatInfoType.Fairy] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelGrad);
|
chatOpenDics[ChatInfoType.Invite] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelATeam);
|
chatOpenDics[ChatInfoType.System] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelSystem);
|
chatOpenDics[ChatInfoType.Team] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelTeam);
|
chatOpenDics[ChatInfoType.Trumpet] = ChatSetting.Instance.GetBool(ChatBoolType.ChannelBugle);
|
chatOpenDics[ChatInfoType.CrossServer] = true;
|
}
|
#endregion
|
|
#region 日常跳转
|
private string[] realmRandomChats = new string[2] { "DailyQuestRealmTalk1", "DailyQuestRealmTalk2" };
|
private string[] dungeonRandomChats = new string[2] { "DailyQuestAssitmTalk1", "DailyQuestAssitmTalk2" };
|
public bool openFromDaily { get; set; }
|
public string GetAssitRandomChat(ChatInfoType _type)
|
{
|
int _index = UnityEngine.Random.Range(0, 2);
|
switch (_type)
|
{
|
case ChatInfoType.World:
|
if (_index == 0)
|
{
|
return Language.Get(dungeonRandomChats[0]);
|
}
|
else
|
{
|
return Language.Get(dungeonRandomChats[1], PlayerDatas.Instance.baseData.FightPoint);
|
}
|
case ChatInfoType.Fairy:
|
return Language.Get(realmRandomChats[_index]);
|
}
|
return string.Empty;
|
}
|
|
public bool needCheckAssitChat { get; set; }
|
public int IsAssitChat(string message, bool force = false)
|
{
|
int assitChat = 0;
|
if (needCheckAssitChat || force)
|
{
|
for (int i = 0; i < 2; i++)
|
{
|
if (message.Equals(Language.Get(realmRandomChats[i])))
|
{
|
assitChat = 1;
|
break;
|
}
|
if (message.Equals(Language.Get(dungeonRandomChats[i])))
|
{
|
assitChat = 2;
|
break;
|
}
|
}
|
}
|
return assitChat;
|
}
|
#endregion
|
|
#region 宝石炫耀跳转
|
public bool openFromGem { get; set; }
|
public int flauntGemId { get; set; }
|
public bool flauntGemBind { get; set; }
|
public string GetGemFlauntChat()
|
{
|
var config = ItemConfig.Get(flauntGemId);
|
if (config != null)
|
{
|
ItemModel _item = new ItemModel(PackType.Item);
|
ItemInfo _itemInfo = new ItemInfo();
|
_itemInfo.ItemID = flauntGemId;
|
_itemInfo.IsBind = flauntGemBind ? 1 : 0;
|
_item.SetItemInfo(_itemInfo);
|
var itemInfo = string.Format("[{0}]", config.ItemName);
|
itemPlaceList.Add(_item);
|
return Language.Get("GemLookTalk", itemInfo);
|
}
|
return string.Empty;
|
}
|
#endregion
|
|
#region 仙缘红点
|
Dictionary<ChatInfoType, Redpoint> chatSocialRedpoints = new Dictionary<ChatInfoType, Redpoint>();
|
Dictionary<ChatInfoType, int> unReadChatCounts = new Dictionary<ChatInfoType, int>();
|
public void InitChatRedpoints()
|
{
|
chatSocialRedpoints.Add(ChatInfoType.Fairy, new Redpoint(MainRedDot.RedPoint_FriendChatKey, 2502));
|
chatSocialRedpoints.Add(ChatInfoType.Team, new Redpoint(MainRedDot.RedPoint_FriendChatKey, 2503));
|
unReadChatCounts.Add(ChatInfoType.Fairy, 0);
|
unReadChatCounts.Add(ChatInfoType.Team, 0);
|
}
|
|
public void ViewChat(ChatInfoType type)
|
{
|
if (unReadChatCounts.ContainsKey(type))
|
{
|
unReadChatCounts[type] = 0;
|
UpdateRedpoint(type);
|
}
|
}
|
|
void ReceiveNewChat(ChatInfoType type)
|
{
|
switch (type)
|
{
|
case ChatInfoType.Team:
|
if (!WindowCenter.Instance.IsOpen<TeamChatWin>()
|
&& (!WindowCenter.Instance.IsOpen<ChatWin>() || presentChatType != ChatInfoType.Team))
|
{
|
unReadChatCounts[ChatInfoType.Team] = Mathf.Min(unReadChatCounts[ChatInfoType.Team] + 1, 99);
|
}
|
break;
|
case ChatInfoType.Fairy:
|
if (!WindowCenter.Instance.IsOpen<FairyChatWin>()
|
&& (!WindowCenter.Instance.IsOpen<ChatWin>() || presentChatType != ChatInfoType.Fairy))
|
{
|
unReadChatCounts[ChatInfoType.Fairy] = Mathf.Min(unReadChatCounts[ChatInfoType.Fairy] + 1, 99);
|
}
|
break;
|
}
|
UpdateRedpoint(type);
|
}
|
|
public void UpdateRedpoint(ChatInfoType type)
|
{
|
if (chatSocialRedpoints.ContainsKey(type))
|
{
|
var redpoint = chatSocialRedpoints[type];
|
if (unReadChatCounts[type] > 0)
|
{
|
redpoint.state = RedPointState.Quantity;
|
redpoint.count = unReadChatCounts[type];
|
}
|
else
|
{
|
redpoint.state = RedPointState.None;
|
}
|
}
|
var socialRed = MainRedDot.Instance.redPointFriendChat;
|
if (chatSocialRedpoints[ChatInfoType.Fairy].state == RedPointState.Quantity
|
|| chatSocialRedpoints[ChatInfoType.Team].state == RedPointState.Quantity)
|
{
|
socialRed.count = unReadChatCounts[ChatInfoType.Fairy] > 0 ?
|
unReadChatCounts[ChatInfoType.Fairy] : unReadChatCounts[ChatInfoType.Team];
|
}
|
else
|
{
|
socialRed.count = 0;
|
}
|
}
|
|
public RedPointState GetSocialChatRedpoint(ChatInfoType type)
|
{
|
if (chatSocialRedpoints.ContainsKey(type))
|
{
|
return chatSocialRedpoints[type].state;
|
}
|
return RedPointState.None;
|
}
|
#endregion
|
}
|
public struct ChatExtraData
|
{
|
public int infoint1;
|
public ChatExtraData(int info1)
|
{
|
this.infoint1 = info1;
|
}
|
|
public static ChatExtraData Default
|
{
|
get
|
{
|
return new ChatExtraData(0);
|
}
|
}
|
}
|
|
public enum ChatInfoType
|
{
|
System,//系统消息
|
World, //世界频道
|
Area, //区域频道
|
Team, //队伍
|
Invite,//组队
|
Trumpet,//喇叭
|
Fairy,//仙盟
|
Friend,//私聊
|
CrossServer,//跨服
|
FairyQuestion,
|
FairyTip,
|
TeamTip,
|
}
|