清除包含特定字符串discord.js的消息

时间:2019-09-06 19:22:40

标签: javascript discord discord.js

我是javascript的新手,并且最近一直在修改名为discord.js的不和谐API。我想在我的机器人中执行一条命令,该命令可以清除通道中的所有消息,除非 包含一个certian字符串或表情符号,并且它是由certian编写的人。有人知道我该怎么做吗?我看过.bulkDelete()方法,但是没有办法告诉它不要删除某些包含certian字符串的消息。

编辑:我看过这篇文章:Search a given discord channel for all messages that satisfies the condition and delete,但这和我想要的相反。该帖子是,如果邮件中包含certian关键字,它将被删除。

1 个答案:

答案 0 :(得分:1)

让我们逐步解决问题。

  1. 要从一个渠道收集CollectionMessage,请使用TextBasedChannel.fetchMessages()方法。

  2. 使用Collection.filter(),您只能返回集合中满足特定条件的元素。

  3. 您可以通过多种方式检查邮件中是否包含字符串,但也许最简单的方法是Message.contentString.includes()的组合。

  4. 可以通过Message.author属性引用消息的发件人。要与其他用户核对作者,您应该比较其ID(由User.id返回)。

  5. 在filter方法的谓词函数中,“除非”将转换为logical NOT operator!。我们可以将其放在一组条件之前,以便如果满足它们 ,则运算符将返回false。这样,不符合您指定限制的消息将从返回的集合中排除

到目前为止,一直在一起...

channel.fetchMessages(...)
  .then(fetchedMessages => {
    const messagesToDelete = fetchedMessages.filter(msg => !(msg.author.id === 'someID' && msg.content.includes('keep')));
    ...
  })
  .catch(console.error);
  1. 要批量删除邮件,可以使用发现的TextChannel.bulkDelete()方法。
  2. 删除正确的消息后,您可以根据需要使用TextBasedChannel.send()添加回复。

一起...

// Depending on your use case...
// const channel = message.channel;
// const channel = client.channels.get('someID');

channel.fetchMessages({ limit: 100 })
//                      ^^^^^^^^^^
// You can only bulk delete up to 100 messages per call.
  .then(fetchedMessages => {
    const messagesToDelete = fetchedMessages.filter(msg => !(msg.author.id === 'someID' && msg.content.includes('keep')));

    return channel.bulkDelete(messagesToDelete, true);
//                                              ^^^^
//        The second parameter here represents whether or not to automatically skip messages
//               that are too old to delete (14 days old) due to API restrictions.
  })
  .then(deletedMessages => channel.send(`Deleted **${deletedMessages.size}** message${deletedMessages.size !== 1 ? 's' : ''}.`))
//                                                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//                                                                This template literal will add an 's' if the word 'message' should be plural.
  .catch(console.error);

为保持更好的代码流,请考虑使用async/await