检测到某个单词时删除消息

Posted

技术标签:

【中文标题】检测到某个单词时删除消息【英文标题】:Delete Message When Detects A Certain Word 【发布时间】:2021-11-23 23:54:11 【问题描述】:

我对制作不和谐机器人很陌生,并尝试制作一个过滤器,当我的机器人检测到消息中的某个单词时,它会删除它。它不会抛出任何错误,只是不会删除消息。我可能只是将代码放在错误的位置,但我不知道。如果有人可以帮助我,我将不胜感激。

        private async Task BadWordsWarn(SocketMessage message)
        
            string[] badWords = File.ReadAllLines(Environment.CurrentDirectory + "/wordstodelete.txt");

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

【问题讨论】:

您是否在阅读后检查了badWords 的内容,以确保它符合您的预期? 您好,感谢您的评论。是的,我做到了,但它没有删除任何令我惊讶的内容。 在您希望被过滤的邮件中,“坏词”的大小写是否与wordstodelete.txt 中定义的相同? string.Contains(string) 执行区分大小写的 char 比较。在 .NET (Core) 2.1 及更高版本上,您可以调用采用 StringComparison 参数的重载;否则,请致电string.IndexOf(string, StringComparison) 并针对!= -1 进行测试。 【参考方案1】:

你怎么打电话给BadWordsWarn?我怀疑您可能没有在等待异步调用,或者 badWords 实际上并没有为您正在运行的代码版本填充​​,例如如果您正在运行发布版本,文件是否被复制到输出目录?

C# 代码有效 - 不是最佳的,因为应该传入 badWords 数组而不是每次都读取,但语法没有问题。

或许 Discord 消息内容是 JSON 格式,需要解析?

如果是字符串,则此代码不区分大小写且绝对有效。

var badWords = new [] 
  "grape",
  "apple"
;
var messageContent = "good good good grape";

foreach(var word in badWords) 
  var contentHasBadWord = messageContent.IndexOf(word, StringComparison.OrdinalIgnoreCase) >= 0;

  if (contentHasBadWord) 
    Console.WriteLine("Bad word found - " + word);
    // delete message
    break;
  

dotnetfiddle

【讨论】:

这是异步的,但我确实解决了问题。该代码正在运行,但我的一位管理员在我不知情的情况下从我们的机器人角色中删除了删除消息权限。我需要弄清楚的是如何使代码不区分大小写。 @JejejejDnjdjdnd 更新为不区分大小写的版本,如果有帮助请告诉我。 感谢您提供此代码。它需要相当多的修改,但它确实帮助了我并最终解决了问题。非常感谢! 不客气。如果我能提供帮助,请随时标记为已接受。

以上是关于检测到某个单词时删除消息的主要内容,如果未能解决你的问题,请参考以下文章

过滤掉某些单词并只匹配确切的单词

将 CSV 文件中的行跳过到某个单词 C#

HTML5 Localstorage & jQuery:删除以某个单词开头的本地存储键

通过删除字母匹配到字典里最长单词--双指针or自动机预处理?

如何检测键盘顶部的单词建议栏是不是显示?

结对-结对英文词频检测程序-需求分析