discord.js 机器人正在删除所有消息

Posted

技术标签:

【中文标题】discord.js 机器人正在删除所有消息【英文标题】:discord.js bot is deleting all messages 【发布时间】:2018-04-29 04:26:43 【问题描述】:

我的机器人中运行了以下代码,作为删除脏话的命令。但是,无论如何,它似乎使机器人删除了任何发送的消息!帮助!

bot.on('message', message => 
    if (message.content.includes == 'bannedWord1' ||'bannedWord2' || 'bannedWord3' || 'bannedWord4') 
       message.delete(1);
       message.channel.send("That word's not appropriate!");
    
 );

【问题讨论】:

谢谢,马克斯·沃尔默。我没有注意到我没有更改代码。 【参考方案1】:

这就是我所拥有的......随意摆弄它!

bot.on('message', async message => 


  //1 blacklisted words
  let blacklisted = ['bannedWord1','bannedWord2,','bannedWord3','bannedWord4','bannedWord5','bannedWord6','bannedWord7','bannedWord8','bannedWord9','bannedWord10','bannedWord11'] //words

  //2 looking for words
  let foundInText = false;
  for (var i in blacklisted)  // loops through the blacklisted list
    if (message.content.toLowerCase().includes(blacklisted[i].toLowerCase())) foundInText = true;
  
  // checks casesensitive words

  //3 deletes and send message
    if (foundInText) 
      message.delete();
      message.channel.send('Hey! That word is not allowed!! :rage:').then(msg => msg.delete(5000));
  
);

【讨论】:

【参考方案2】:

问题是message.content.includes == 'bannedWord1' ||'bannedWord2' || 'bannedWord3' || 'bannedWord4' 真正的意思是(message.content.includes == 'bannedWord1') ||'bannedWord2' || 'bannedWord3' || 'bannedWord4'。非空字符串是真的,所以这总是真的。

另外,我假设message.content 是一个字符串。因此,您需要处理包含ass 但不是坏词的“假设”之类的事情。

演示解决方案:

var badWords = [
  'bannedWord1',
  'bannedWord2',
  'bannedWord3',
  'bannedWord4'
];

var contents = [
  'This is a test.',
  'bannedWord1 tester.',
  'bannedWord2!',
  'OkaywordthatcontainsbannedWord1.'
];

var allowed = contents.filter(content => 
  var words = content.toLowerCase().trim().match(/\w+|\s+|[^\s\w]+/g);
  return !words.find(word => 
    return badWords.includes(word);
  );
);

console.log(allowed);

在你的情况下使用:

var badWords = [
  'bannedWord1',
  'bannedWord2',
  'bannedWord3',
  'bannedWord4'
];

bot.on('message', message => 
  var words = message.content.toLowerCase().trim().match(/\w+|\s+|[^\s\w]+/g);
  var containsBadWord = words.some(word => 
    return badWords.includes(word);
  );
  if (containsBadWord) 
    message.delete(1);
    message.channel.send("That word's not appropriate!");
  
);

来自 regex101.com 的正则表达式解释

    第一选择\w+ \w+ 匹配任何单词字符(等于[a-zA-Z0-9_]+ Quantifier — 匹配一次到无限次,尽可能多次,根据需要回馈(贪婪) 第二选择\S+ \S+ 匹配任何空白字符(等于[\r\n\t\f\v ]+ Quantifier — 匹配一次到无限次,尽可能多次,按需回馈(贪心) 第三选择[^\s\w]+ 匹配下面列表中不存在的单个字符[^\s\w]+ + Quantifier — 匹配一次到无限次,尽可能多次,根据需要返回(贪婪) \s 匹配任何空白字符(等于 [\r\n\t\f\v]

【讨论】:

谢谢!这是有道理的,而且非常有帮助。不过,我对 .match(/\w+|\S...) 部分正在做什么感到有些困惑。 我添加了一个正则表达式解释。基本上,目标是将字符串拆分为单词。这些单词可以用空格、某些标点符号等分隔。【参考方案3】:

因为您试图将指向函数的指针与表达式进行比较 string OR string OR string 这总是正确的,所以 if 为每条新消息执行

【讨论】:

以上是关于discord.js 机器人正在删除所有消息的主要内容,如果未能解决你的问题,请参考以下文章

从机器人 Discord.js 获取机器人消息

Discord js中的messageDelete问题

从特定消息中删除特定用户反应 - Discord.js

Discord.js 删除命令消息

如何隐藏 DiscordAPIError (discord.js) (node.js)

discord.js 删除包含空格的消息