| using System; | 
| using System.Collections; | 
| using System.Collections.Generic; | 
| using System.Text; | 
| using System.Text.RegularExpressions; | 
| using UnityEngine; | 
|   | 
|   | 
| public class LanguageVerify : Singleton<LanguageVerify> | 
|   | 
| { | 
|     const string Sercret = "c345a165b566d1c421afd8a748373d7f"; | 
|   | 
|     static StringBuilder sb = new StringBuilder(); | 
|   | 
|     /// <summary> | 
|     /// 校验玩家名 | 
|     /// </summary> | 
|     /// <param name="verifyName">需要检验的名字</param> | 
|     /// <param name="playerId">玩家id</param> | 
|     /// <param name="playerName">原来的角色名,创角传空</param> | 
|     /// <param name="level">玩家等级</param> | 
|     /// <param name="vipLv">玩家VIP等级</param> | 
|     /// <param name="callback"></param> | 
|     public void VerifyPlayerName(string verifyName, int playerId, string playerName, int level, int vipLv, Action<bool, string> callback) | 
|     { | 
|         if (callback != null) | 
|         { | 
|             callback(true, verifyName); | 
|             callback = null; | 
|         } | 
|         return; | 
|     } | 
|   | 
|     public void VerifyFairy(string verifyContent, int op_type, string fairyName, int title, Action<bool, string> callback) | 
|     { | 
|         if (callback != null) | 
|         { | 
|             callback(true, verifyContent); | 
|             callback = null; | 
|         } | 
|         return; | 
|     } | 
|   | 
|     public static uint toPlayer = 0; | 
|     public static string toPlayerName = string.Empty; | 
|     public static int toPlayerLevel = 0; | 
|     public void VerifyChat(string content, ChatInfoType channelType, Action<bool, string> callback) | 
|     { | 
|         int channel = 0; | 
|         var chatCenter = ChatCenter.Instance; | 
|         if (chatCenter.IsChatBanned || chatCenter.IsClientBan(channelType)) | 
|         { | 
|             if (!(IsFairyFeast(channelType) || IsSystemChat(content))) | 
|             { | 
|                 return; | 
|             } | 
|         } | 
|   | 
|         if (!GetChannel(channelType, out channel)) | 
|         { | 
|             return; | 
|         } | 
|         if (callback != null) | 
|         { | 
|             callback(true, content); | 
|             callback = null; | 
|         } | 
|   | 
|     } | 
|   | 
|     Dictionary<long, List<string>> transferContents = new Dictionary<long, List<string>>(); | 
|     Dictionary<long, List<int>> splitContents = new Dictionary<long, List<int>>(); | 
|   | 
|     List<MatchString> matchs = new List<MatchString>(); | 
|   | 
|     struct MatchString | 
|     { | 
|         public int index; | 
|         public string value; | 
|     } | 
|   | 
|     void AddMathcs(MatchCollection _matchs) | 
|     { | 
|         if (_matchs.Count == 0) | 
|         { | 
|             return; | 
|         } | 
|         foreach (Match match in _matchs) | 
|         { | 
|             matchs.Add(new MatchString() | 
|             { | 
|                 index = match.Index, | 
|                 value = match.Value, | 
|             }); | 
|         } | 
|     } | 
|   | 
|     string TransferContent(long tick, string content) | 
|     { | 
|         List<string> list; | 
|         List<int> splits; | 
|         if (!transferContents.TryGetValue(tick, out list)) | 
|         { | 
|             list = new List<string>(); | 
|             transferContents.Add(tick, list); | 
|         } | 
|         if (!splitContents.TryGetValue(tick, out splits)) | 
|         { | 
|             splits = new List<int>(); | 
|             splitContents.Add(tick, splits); | 
|         } | 
|         list.Clear(); | 
|         splits.Clear(); | 
|         matchs.Clear(); | 
|         AddMathcs(WordAnalysis.Color_Start_Regex.Matches(content)); | 
|         AddMathcs(WordAnalysis.Color_End_Regex.Matches(content)); | 
|         AddMathcs(ImgAnalysis.FaceRegex.Matches(content)); | 
|         AddMathcs(ChatManager.InviteRegex.Matches(content)); | 
|         AddMathcs(WordAnalysis.Size_Start_Regex.Matches(content)); | 
|         AddMathcs(WordAnalysis.Size_End_Regex.Matches(content)); | 
|         AddMathcs(WordAnalysis.Space_Regex.Matches(content)); | 
|         AddMathcs(ChatManager.KillRegex.Matches(content)); | 
|         AddMathcs(ChatCenter.s_VoiceRegex.Matches(content)); | 
|         matchs.Sort((x, y) => | 
|         { | 
|             return x.index.CompareTo(y.index); | 
|         }); | 
|         var index = 0; | 
|         for (int i = 0; i < matchs.Count; i++) | 
|         { | 
|             list.Add(matchs[i].value); | 
|             var length = matchs[i].index - index; | 
|             splits.Add(length); | 
|             index += length + matchs[i].value.Length; | 
|         } | 
|         content = WordAnalysis.Color_Start_Regex.Replace(content, string.Empty); | 
|         content = WordAnalysis.Color_End_Regex.Replace(content, string.Empty); | 
|         content = ImgAnalysis.FaceRegex.Replace(content, string.Empty); | 
|         content = ChatManager.InviteRegex.Replace(content, string.Empty); | 
|         content = WordAnalysis.Size_Start_Regex.Replace(content, string.Empty); | 
|         content = WordAnalysis.Size_End_Regex.Replace(content, string.Empty); | 
|         content = WordAnalysis.Space_Regex.Replace(content, string.Empty); | 
|         content = ChatManager.KillRegex.Replace(content, string.Empty); | 
|         content = ChatCenter.s_VoiceRegex.Replace(content, string.Empty); | 
|         return content; | 
|     } | 
|   | 
|     string DisTransfer(long tick, string content) | 
|     { | 
|         List<string> list; | 
|         if (!transferContents.TryGetValue(tick, out list)) | 
|         { | 
|             return content; | 
|         } | 
|         List<int> splits; | 
|         if (!splitContents.TryGetValue(tick, out splits)) | 
|         { | 
|             return content; | 
|         } | 
|         var index = 0; | 
|         sb.Length = 0; | 
|         for (int i = 0; i < splits.Count; i++) | 
|         { | 
|             sb.Append(content.Substring(index, splits[i])); | 
|             if (i < list.Count) | 
|             { | 
|                 sb.Append(list[i]); | 
|             } | 
|             index += splits[i]; | 
|         } | 
|         sb.Append(content.Substring(index)); | 
|         transferContents.Remove(tick); | 
|         splitContents.Remove(tick); | 
|         return sb.ToString(); | 
|     } | 
|   | 
|     bool IsSystemChat(string content) | 
|     { | 
|         if (ChatManager.InviteRegex.IsMatch(content) | 
|             || ChatManager.KillRegex.IsMatch(content)) | 
|         { | 
|             return true; | 
|         } | 
|         return false; | 
|     } | 
|   | 
|     bool GetChannel(ChatInfoType type, out int channel) | 
|     { | 
|         channel = 0; | 
|         switch (type) | 
|         { | 
|             case ChatInfoType.World: | 
|             case ChatInfoType.CrossServer: | 
|                 channel = 0; | 
|                 break; | 
|             case ChatInfoType.Team: | 
|                 channel = 4; | 
|                 break; | 
|             case ChatInfoType.Area: | 
|             case ChatInfoType.Trumpet: | 
|             case ChatInfoType.default1: | 
|                 channel = 5; | 
|                 break; | 
|             case ChatInfoType.Fairy: | 
|                 channel = 2; | 
|                 break; | 
|             case ChatInfoType.Friend: | 
|                 channel = 3; | 
|                 break; | 
|             default: | 
|                 return false; | 
|         } | 
|         return true; | 
|     } | 
|   | 
|     bool IsFairyFeast(ChatInfoType type) | 
|     { | 
|         // TODO YYL | 
|         // var dailyQuestModel = ModelCenter.Instance.GetModel<DailyQuestModel>(); | 
|         // DailyQuestOpenTime dailyQuestOpenTime; | 
|         // if (dailyQuestModel.TryGetOpenTime((int)DailyQuestType.FairyFeast, out dailyQuestOpenTime)) | 
|         // { | 
|         //     return type == ChatInfoType.Fairy && dailyQuestOpenTime.InOpenTime(); | 
|         // } | 
|         return false; | 
|     } | 
|   | 
|     public class VerifyResponse | 
|     { | 
|         public string result; | 
|         public int code; | 
|         public string content; | 
|     } | 
| } |