少年修仙传客户端代码仓库
client_Wu Xijin
2019-04-13 f94112a6427fa69d3e244e49eb677ec7fb94e0d6
Core/GameEngine/Model/TelPartialConfig/DirtyWordConfig.cs
@@ -1,285 +1,272 @@
// ------------------------------------------------------------------------------
//  <autogenerated>
//      This code was generated by a tool.
//      Mono Runtime Version: 2.0.50727.1433
//
//      Changes to this file may cause incorrect behavior and will be lost if
//      the code is regenerated.
//  </autogenerated>
// ------------------------------------------------------------------------------
namespace TableConfig
{
    using System;
    using System.Collections.Generic;
    using System.Text.RegularExpressions;
    using UnityEngine;
    using System.Threading;
    public partial class DirtyWordConfig : ConfigBase, IConfigPostProcess
    {
        private static WordGroup[] DIRTYWORLD = new WordGroup[(int)char.MaxValue];
        private static List<string> memoryList = new List<string>();
        private static bool inited = false;
        static int cursor = 0;
        static int wordlenght = 0;
        static int nextCursor = 0;
        public void OnConfigParseCompleted()
        {
            string key = ToDBC(word);
            memoryList.Add(key);
        }
        private static string ToDBC(string input)
        {
            char[] c = input.ToCharArray();
            for (int i = 0; i < c.Length; i++)
            {
                if (c[i] == 12288)
                {
                    c[i] = (char)32;
                    continue;
                }
                if (c[i] > 65280 && c[i] < 65375)
                    c[i] = (char)(c[i] - 65248);
            }
            return new string(c).ToLower();
        }
        public static string IsDirtWord(string source, char filter)
        {
            if (!inited)
            {
                Init();
            }
            if (source != string.Empty)
            {
                cursor = 0;
                nextCursor = 0;
                char[] temp = source.ToCharArray();
                source = FitterSpecial(source);
                for (int i = 0; i < source.Length; i++)
                {
                    //查询以该字为首字符的词组
                    WordGroup group = DIRTYWORLD[(int)ToDBC(source)[i]];
                    if (group != null)
                    {
                        for (int z = 0; z < group.Count(); z++)
                        {
                            string word = group.GetWord(z);
                            if (word.Length == 0 || Check(word, source))
                            {
                                string blackword = string.Empty;
                                for (int pos = 0; pos < wordlenght + 1; pos++)
                                {
                                    try
                                    {
                                        blackword += temp[pos + cursor].ToString();
                                        temp[pos + cursor] = filter;
                                    }
                                    catch (Exception e)
                                    {
                                        DesignDebug.Log(e.Message);
                                    }
                                }
                                cursor = cursor + wordlenght;
                                i = i + wordlenght;
                            }
                        }
                    }
                    cursor++;
                }
                return new string(temp);
            }
            return string.Empty;
        }
        public static bool IsDirtWord(string source)
        {
            if (!inited)
            {
                Init();
            }
            if (source != string.Empty)
            {
                cursor = 0;
                nextCursor = 0;
                for (int i = 0; i < source.Length; i++)
                {
                    //查询以该字为首字符的词组
                    WordGroup group = DIRTYWORLD[(int)ToDBC(source)[i]];
                    if (group != null)
                    {
                        for (int z = 0; z < group.Count(); z++)
                        {
                            string word = group.GetWord(z);
                            if (word.Length == 0 || Check(word, source))
                            {
                                return true;
                            }
                        }
                    }
                    cursor++;
                }
            }
            return false;
        }
        private static bool Check(string blackWord, string source)
        {
            wordlenght = 0;
            int wordCnt = 0;
            //检测源下一位游标
            nextCursor = cursor + 1;
            bool found = false;
            //遍历词的每一位做匹配
            for (int i = 0; i < blackWord.Length; i++)
            {
                //特殊字符偏移游标
                int offset = 0;
                if (nextCursor >= source.Length)
                {
                    break;
                }
                else
                {
                    //检测下位字符如果不是汉字 数字 字符 偏移量加1,,过滤特殊字符
                    for (int y = nextCursor; y < source.Length; y++)
                    {
                        //if (!IsCHS(source[y]) && !IsNum(source[y]) && !IsAlphabet(source[y])) {
                        if (IsSpecial(source[y]))
                        {
                            offset++;
                            //避让特殊字符,下位游标如果>=字符串长度 跳出
                            if (nextCursor + offset >= source.Length) break;
                            wordlenght++;
                        }
                        else break;
                    }
                    if (nextCursor + offset >= source.Length)
                    {
                        break;
                    }
                    if ((int)blackWord[i] == (int)source[nextCursor + offset])
                    {
                        wordCnt++;
                        found = true;
                    }
                    else
                    {
                        found = false;
                        break;
                    }
                }
                nextCursor = nextCursor + 1 + offset;
                wordlenght++;
            }
            if (blackWord.Length != wordCnt) return false;
            return found;
        }
        private static bool IsSpecial(char character)
        {
            if (character == ' ')
            {
                return true;
            }
            return false;
        }
        static public void Init()
        {
            if (inited)
            {
                return;
            }
            inited = true;
            ThreadPool.QueueUserWorkItem((object aaa) =>
            {
                memoryList.Sort((string x, string y) =>
                {
                    return x.CompareTo(y);
                });
                for (int i = memoryList.Count - 1; i > 0; i--)
                {
                    if (memoryList[i].ToString() == memoryList[i - 1].ToString())
                    {
                        memoryList.RemoveAt(i);
                    }
                }
                foreach (string word in memoryList)
                {
                    WordGroup group = DIRTYWORLD[(int)word[0]];
                    if (group == null)
                    {
                        group = new WordGroup();
                        DIRTYWORLD[(int)word[0]] = group;
                    }
                    group.Add(word.Substring(1));
                }
            });
        }
        public static bool IsCHS(char character)
        {
            //  中文表意字符的范围 4E00-9FA5
            int charVal = (int)character;
            return (charVal >= 0x4e00 && charVal <= 0x9fa5);
        }
        private static bool IsNum(char character)
        {
            int charVal = (int)character;
            return (charVal >= 48 && charVal <= 57);
        }
        private static bool IsAlphabet(char character)
        {
            int charVal = (int)character;
            return ((charVal >= 97 && charVal <= 122) || (charVal >= 65 && charVal <= 90));
        }
        private const string FACE_REPLACE = @"#~[0-9a-zA-Z]{1,3}";
        private static Regex FaceRegex = new Regex(FACE_REPLACE, RegexOptions.Singleline);
        public static string FitterSpecial(string source)
        {
            return FaceRegex.Replace(source, "     ");
        }
    }
    class WordGroup
    {
        private List<string> groupList;
        public WordGroup()
        {
            groupList = new List<string>();
        }
        public void Add(string word)
        {
            groupList.Add(word);
        }
        public int Count()
        {
            return groupList.Count;
        }
        public string GetWord(int index)
        {
            return groupList[index];
        }
    }
}
    using System;
    using System.Collections.Generic;
    using System.Text.RegularExpressions;
    using UnityEngine;
    using System.Threading;
    public partial class DirtyWordConfig :  IConfigPostProcess
    {
        private static WordGroup[] DIRTYWORLD = new WordGroup[(int)char.MaxValue];
        private static List<string> memoryList = new List<string>();
        private static bool dirtyWordInited = false;
        static int cursor = 0;
        static int wordlenght = 0;
        static int nextCursor = 0;
        public void OnConfigParseCompleted()
        {
            string key = ToDBC(word);
            memoryList.Add(key);
        }
        private static string ToDBC(string input)
        {
            char[] c = input.ToCharArray();
            for (int i = 0; i < c.Length; i++)
            {
                if (c[i] == 12288)
                {
                    c[i] = (char)32;
                    continue;
                }
                if (c[i] > 65280 && c[i] < 65375)
                    c[i] = (char)(c[i] - 65248);
            }
            return new string(c).ToLower();
        }
        public static string IsDirtWord(string source, char filter)
        {
            if (!dirtyWordInited)
            {
                Init();
            }
            if (source != string.Empty)
            {
                cursor = 0;
                nextCursor = 0;
                char[] temp = source.ToCharArray();
                source = FitterSpecial(source);
                for (int i = 0; i < source.Length; i++)
                {
                    //查询以该字为首字符的词组
                    WordGroup group = DIRTYWORLD[(int)ToDBC(source)[i]];
                    if (group != null)
                    {
                        for (int z = 0; z < group.Count(); z++)
                        {
                            string word = group.GetWord(z);
                            if (word.Length == 0 || Check(word, source))
                            {
                                string blackword = string.Empty;
                                for (int pos = 0; pos < wordlenght + 1; pos++)
                                {
                                    try
                                    {
                                        blackword += temp[pos + cursor].ToString();
                                        temp[pos + cursor] = filter;
                                    }
                                    catch (Exception e)
                                    {
                                        DebugEx.Log(e.Message);
                                    }
                                }
                                cursor = cursor + wordlenght;
                                i = i + wordlenght;
                            }
                        }
                    }
                    cursor++;
                }
                return new string(temp);
            }
            return string.Empty;
        }
        public static bool IsDirtWord(string source)
        {
            if (!dirtyWordInited)
            {
                Init();
            }
            if (source != string.Empty)
            {
                cursor = 0;
                nextCursor = 0;
                for (int i = 0; i < source.Length; i++)
                {
                    //查询以该字为首字符的词组
                    WordGroup group = DIRTYWORLD[(int)ToDBC(source)[i]];
                    if (group != null)
                    {
                        for (int z = 0; z < group.Count(); z++)
                        {
                            string word = group.GetWord(z);
                            if (word.Length == 0 || Check(word, source))
                            {
                                return true;
                            }
                        }
                    }
                    cursor++;
                }
            }
            return false;
        }
        private static bool Check(string blackWord, string source)
        {
            wordlenght = 0;
            int wordCnt = 0;
            //检测源下一位游标
            nextCursor = cursor + 1;
            bool found = false;
            //遍历词的每一位做匹配
            for (int i = 0; i < blackWord.Length; i++)
            {
                //特殊字符偏移游标
                int offset = 0;
                if (nextCursor >= source.Length)
                {
                    break;
                }
                else
                {
                    //检测下位字符如果不是汉字 数字 字符 偏移量加1,,过滤特殊字符
                    for (int y = nextCursor; y < source.Length; y++)
                    {
                        //if (!IsCHS(source[y]) && !IsNum(source[y]) && !IsAlphabet(source[y])) {
                        if (IsSpecial(source[y]))
                        {
                            offset++;
                            //避让特殊字符,下位游标如果>=字符串长度 跳出
                            if (nextCursor + offset >= source.Length) break;
                            wordlenght++;
                        }
                        else break;
                    }
                    if (nextCursor + offset >= source.Length)
                    {
                        break;
                    }
                    if ((int)blackWord[i] == (int)source[nextCursor + offset])
                    {
                        wordCnt++;
                        found = true;
                    }
                    else
                    {
                        found = false;
                        break;
                    }
                }
                nextCursor = nextCursor + 1 + offset;
                wordlenght++;
            }
            if (blackWord.Length != wordCnt) return false;
            return found;
        }
        private static bool IsSpecial(char character)
        {
            if (character == ' ')
            {
                return true;
            }
            return false;
        }
        static public void DirtyWordInit()
        {
            if (dirtyWordInited)
            {
                return;
            }
            dirtyWordInited = true;
            ThreadPool.QueueUserWorkItem((object aaa) =>
            {
                memoryList.Sort((string x, string y) =>
                {
                    return x.CompareTo(y);
                });
                for (int i = memoryList.Count - 1; i > 0; i--)
                {
                    if (memoryList[i].ToString() == memoryList[i - 1].ToString())
                    {
                        memoryList.RemoveAt(i);
                    }
                }
                foreach (string word in memoryList)
                {
                    WordGroup group = DIRTYWORLD[(int)word[0]];
                    if (group == null)
                    {
                        group = new WordGroup();
                        DIRTYWORLD[(int)word[0]] = group;
                    }
                    group.Add(word.Substring(1));
                }
            });
        }
        public static bool IsCHS(char character)
        {
            //  中文表意字符的范围 4E00-9FA5
            int charVal = (int)character;
            return (charVal >= 0x4e00 && charVal <= 0x9fa5);
        }
        private static bool IsNum(char character)
        {
            int charVal = (int)character;
            return (charVal >= 48 && charVal <= 57);
        }
        private static bool IsAlphabet(char character)
        {
            int charVal = (int)character;
            return ((charVal >= 97 && charVal <= 122) || (charVal >= 65 && charVal <= 90));
        }
        private const string FACE_REPLACE = @"#~[0-9a-zA-Z]{1,3}";
        private static Regex FaceRegex = new Regex(FACE_REPLACE, RegexOptions.Singleline);
        public static string FitterSpecial(string source)
        {
            return FaceRegex.Replace(source, "     ");
        }
    }
    class WordGroup
    {
        private List<string> groupList;
        public WordGroup()
        {
            groupList = new List<string>();
        }
        public void Add(string word)
        {
            groupList.Add(word);
        }
        public int Count()
        {
            return groupList.Count;
        }
        public string GetWord(int index)
        {
            return groupList[index];
        }
    }