From 1871f7a5f4ceb3cec1dc50b59d127313c5d4fee1 Mon Sep 17 00:00:00 2001
From: client_linchunjie <461730578@qq.com>
Date: 星期三, 17 十月 2018 15:22:05 +0800
Subject: [PATCH] 2158【1.2.0】猫耳聊天屏蔽逻辑优化,组队邀请,击杀提示不经过猫耳验证

---
 Utility/LanguageVerify.cs |   77 +++++++++++++++++++++++++-------------
 1 files changed, 50 insertions(+), 27 deletions(-)

diff --git a/Utility/LanguageVerify.cs b/Utility/LanguageVerify.cs
index 9d1067f..3093c58 100644
--- a/Utility/LanguageVerify.cs
+++ b/Utility/LanguageVerify.cs
@@ -18,7 +18,7 @@
         }
     }
 
-    static StringBuilder s_StringBuilder = new StringBuilder();
+    static StringBuilder sb = new StringBuilder();
 
     const string VerifyPlayerNameUrl = "https://api.maoergame.com/game/role/response";
     /// <summary>
@@ -152,7 +152,7 @@
         int channel = 0;
         var chatCenter = ModelCenter.Instance.GetModel<ChatCenter>();
         if (!requireVerify || !GetChannel(channelType, out channel) || PlayerDatas.Instance.baseData.VIPLv >= 4
-            || IsFairyFeast(channelType) || chatCenter.IsChatBanned)
+            || IsFairyFeast(channelType) || chatCenter.IsChatBanned || IsSystemChat(content))
         {
             if (callback != null)
             {
@@ -227,11 +227,9 @@
     }
 
     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>();
-
-    const string TransferIdentify = " 0 ";
-    Regex transferRegex = new Regex(TransferIdentify, RegexOptions.Singleline);
 
     struct MatchString
     {
@@ -258,12 +256,19 @@
     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));
@@ -278,19 +283,23 @@
         {
             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, TransferIdentify);
-        content = WordAnalysis.Color_End_Regex.Replace(content, TransferIdentify);
-        content = ImgAnalysis.FaceRegex.Replace(content, TransferIdentify);
-        content = ChatCtrl.InviteRegex.Replace(content, TransferIdentify);
-        content = WordAnalysis.Size_Start_Regex.Replace(content, TransferIdentify);
-        content = WordAnalysis.Size_End_Regex.Replace(content, TransferIdentify);
-        content = WordAnalysis.Space_Regex.Replace(content, TransferIdentify);
-        content = ChatCtrl.KillRegex.Replace(content, TransferIdentify);
-        content = ChatCenter.s_VoiceRegex.Replace(content, TransferIdentify);
+        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 = ChatCtrl.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 = ChatCtrl.KillRegex.Replace(content, string.Empty);
+        content = ChatCenter.s_VoiceRegex.Replace(content, string.Empty);
         return content;
     }
 
@@ -301,22 +310,36 @@
         {
             return content;
         }
-        var stringIndex = 0;
-        var index = 0;
-        s_StringBuilder.Length = 0;
-        foreach (Match match in transferRegex.Matches(content))
+        List<int> splits;
+        if (!splitContents.TryGetValue(tick, out splits))
         {
-            s_StringBuilder.Append(content.Substring(index, match.Index - index));
-            if (stringIndex < list.Count)
-            {
-                s_StringBuilder.Append(list[stringIndex]);
-                stringIndex++;
-            }
-            index = match.Index + match.Length;
+            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);
-        s_StringBuilder.Append(content.Substring(index, content.Length - index));
-        return s_StringBuilder.ToString();
+        splitContents.Remove(tick);
+        return sb.ToString();
+    }
+
+    bool IsSystemChat(string content)
+    {
+        if (ChatCtrl.InviteRegex.IsMatch(content)
+            || ChatCtrl.KillRegex.IsMatch(content))
+        {
+            return true;
+        }
+        return false;
     }
 
     bool GetChannel(ChatInfoType type, out int channel)

--
Gitblit v1.8.0