【问题标题】:C# (Discord.Net) Checking a message for words in fileC# (Discord.Net) 检查文件中单词的消息
【发布时间】:2018-11-30 01:16:09
【问题描述】:

我正在尝试为不和谐的机器人做一个坏词过滤器。

我的代码没有给我一些错误,但它也不起作用。也许有人可以帮助我?

这是我的代码。

            private async Task BadWordsWarn(SocketMessage message)
    {
        string[] badWords = File.ReadAllLines("bad_words.txt");

        if (badWords.Any(word => message.Content.IndexOf(word, 0, message.Content.Length, StringComparison.OrdinalIgnoreCase) >= 0))
        {
            var m = (RestUserMessage)await message.Channel.GetMessageAsync(message.Id);
            await m.DeleteAsync();
        }
    }

【问题讨论】:

  • 所以你有一个坏词,你想从消息中过滤掉?你有没有调试过,你做了什么?你甚至会进入 await message.DeleteAsync() 调用吗?
  • 我得到了一个包含一堆单词的文本文件
  • 您想循环执行此操作。循环遍历数组并在其中使用检查
  • 你能告诉我一个例子吗?

标签: c# filter discord discord.net


【解决方案1】:

可以改成

if (badWords.Any(message.Content.Contains))
    await message.DeleteAsync();

它会扫描你所有的坏话,如果找到一个就停止。

还可以考虑使用不区分大小写的比较器,例如 StringComparer.OrdinalIgnoreCase

if (badWords.Any(word=>message.Content.Contains(word, StringComparer.OrdinalIgnoreCase))
    await message.DeleteAsync();

【讨论】:

  • 是的。它确实:) 尝试添加“使用 System.Linq;”在文件的顶部
  • 我正在使用 System.Linq。问题是,messge.Content.Contains 不接受第二个参数。您是否也开发过 Discord.Net 机器人?如果是,将其声明为 _client.MessageReceived += BadWordsWarn 是否正确?
  • 啊,可能是框架的旧版本。您可以将其更改为: word=>message.Content.IndexOf(word, StringComparer.OrdinalIgnoreCase)>=0 ...我认为带有比较器对象的 .IndexOf 已经存在了一段时间,包括在旧框架中。不过,可以在紧要关头对源字符串和单词字符串进行丑陋的 .ToLower() 破解,而不是使用字符串比较器。 :) ...(我恐怕不知道 Discord.Net,抱歉)
  • 我必须像这样给出一个 int startIndex 和一个 int 计数: word => message.Content.IndexOf(word, 0, 0, StringComparison.OrdinalIgnoreCase) >= 0) 计数是计数吗我的列表中有多少字?
  • 如果您要使用所有这些参数,第二个“0”应该是“message.Content.Length”,以检查整个字符串。见这里:msdn.microsoft.com/en-us/library/ms224423(v=vs.110).aspx
【解决方案2】:
    private static Task BadWordsWarn(SocketMessage msg)
    {
        string[] badWords = File.ReadAllLines(@"bad_words.txt");
        foreach(string badWord in badWords)
        {
            if (msg.Content.Replace(" ", "").ToLower().Contains(badWord.Replace(" ", "")))
            {
                msg.DeleteAsync();
                return Task.CompletedTask;
            }
        }
        return Task.CompletedTask;
    }

【讨论】:

  • 谢谢,但它对我不起作用。在我的列表中,每个单词都有一个新行,有时 1 行中有 2 个单词,例如“hello world”。我用 .Split(' '); 试过了也可以使用 .Split('\n') 但它不起作用。
  • @MendaxM。我已经更新了代码,现在它可以过滤掉多个单词和concordant(我不知道我是否正确翻译了前一个单词,所以例如“bad word” = “badword”)坏词。
  • 那只是删除所有消息。
猜你喜欢
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 2021-10-18
  • 2012-11-09
  • 2017-12-26
相关资源
最近更新 更多