一段时间以来,我一直在尝试为 WoW 模拟器创建一个名为 TrinityCore 的审查系统。我基本上做的是用“坏词”填充一个数据库表(chat_filter),在启动时用这些填充一个向量,在玩家制作的每条聊天线上,它都会根据我的向量的内容进行检查。如果它包含一个坏词,它会被* * 替换(而 * 的数量也将从数据库表 (todo) 的列中获取)并且玩家会受到惩罚(静音左右)。
现在我遇到的问题是如何制作合适的过滤器。现在你必须添加你能想到的所有可能的单词组合,例如“ass”也应该读作“ass”,我不知道该怎么做!
这是当前代码的重要部分,我省略了数据库拉动,因为它无论如何都没有任何用处(而且它在不同的文件中会使其不太清楚)。
char* msg3 = strdup(msg.c_str());
char* words = strtok(msg3, " ,.-()&^%$#@!{}'<>/?|\\=+-_1234567890"); // This splits the sentence in seperated words and removes the symbols
ObjectMgr::ChatFilterContainer const& censoredWords = sObjectMgr->GetCensoredWords();
while (words != NULL && !censoredWords.empty())
{
for (uint32 i = 0; i < censoredWords.size(); ++i)
{
if (!stricmp(censoredWords[i].c_str(), words))
{
sLog->outString("%s", words);
//msg.replace(msg.begin(), msg.end(), msg.c_str(), "***");
msg.replace(msg.begin(), msg.end(), censoredWords[i].c_str(), '*');
}
//msg.replace(msg.begin(), msg.end(), censoredWords[i].c_str(), /*replacement*/ "***");
//msg.replace(msg.find(censoredWords[i].c_str()), censoredWords.size(),
}
words = strtok(NULL, " ,.-()&^%$#@!{}'<>/?|\=+-_1234567890");
}
提前致谢,
碧玉
PS 'GetCensoredWords' 返回向量。
PSS 'msg' 是一个 std::string - 它是玩家发送的实际消息。