chicken_dy/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveManager.cs

62 lines
2.4 KiB
C#

using System;
using System.Collections;
using System.Diagnostics;
using UnityEngine;
namespace HC
{
public class SensitiveManager : HCSingleton<SensitiveManager>
{
private TrieNode _root;
public void InitializeSdk()
{
StartCoroutine(InitializeTrieNode());
}
private IEnumerator InitializeTrieNode()
{
_root = new TrieNode();
var sensitiveWordsFile = Resources.Load<TextAsset>("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<SensitiveCheckResult> 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<string, CheckSource> 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;
}
}
}