using System; using System.Collections; using System.Diagnostics; using UnityEngine; namespace HC { public class SensitiveManager : HCSingleton { private TrieNode _root; public void InitializeSdk() { StartCoroutine(InitializeTrieNode()); } private IEnumerator InitializeTrieNode() { _root = new TrieNode(); var sensitiveWordsFile = Resources.Load("sensitivewords"); var sensitiveWords = sensitiveWordsFile.text.Split('\n'); yield return _root.Initialize(sensitiveWords, () => { HCDebugger.LogDebug("TrieNode initialization complete."); }); } public void CheckSensitiveWords(string text, SensitiveType type, Action action) { StartCoroutine(FilterText(text, type, (filteredText, checkSource) => { // 在回调函数中处理过滤后的文本 var result = new SensitiveCheckResult { HasSensitive = !text.Equals(filteredText), Text = filteredText, CheckSource = checkSource }; HCDebugger.LogDebug($"[CheckSensitiveWords] inputText = {text} type = {type} outText = {result.Text} HasSensitive = {result.HasSensitive} checkSource = {result.CheckSource}"); // 调用传入的回调函数,将结果返回 action(result); })); } private IEnumerator FilterText(string inputText, SensitiveType type, Action callback) { // 先从本地查 var filteredText = _root.FilterText(inputText); if (inputText.Equals(filteredText)) { // 服务器校验,并把文本内容传递出去,如果服务器请求失败了,那么直接用原文本发送 HCServer.Instance.CheckSensitiveWords((int)type, inputText, (code, msg, censorTextResult) => { callback(code != 0 ? filteredText : censorTextResult.content, code != 0 ? CheckSource.ServerError : CheckSource.Server); }); } else { // 本地已经被修改了文本内容了,直接给返回去了 callback(filteredText, CheckSource.Local); } yield return null; } } }