我是javascript的新手,并且最近一直在修改名为discord.js的不和谐API。我想在我的机器人中执行一条命令,该命令可以清除通道中的所有消息,除非 包含一个certian字符串或表情符号,并且它是由certian编写的人。有人知道我该怎么做吗?我看过.bulkDelete()
方法,但是没有办法告诉它不要删除某些包含certian字符串的消息。
编辑:我看过这篇文章:Search a given discord channel for all messages that satisfies the condition and delete,但这和我想要的相反。该帖子是,如果邮件中包含certian关键字,它将被删除。
答案 0 :(得分:1)
让我们逐步解决问题。
要从一个渠道收集Collection个Message,请使用TextBasedChannel.fetchMessages()
方法。
使用Collection.filter()
,您只能返回集合中满足特定条件的元素。
您可以通过多种方式检查邮件中是否包含字符串,但也许最简单的方法是Message.content
和String.includes()
的组合。
可以通过Message.author
属性引用消息的发件人。要与其他用户核对作者,您应该比较其ID(由User.id
返回)。
在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);
TextChannel.bulkDelete()
方法。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
。