我是JavaScript的新手,我想做一个Discord Bot ...我认为我的discord bot很不错,但是我似乎没有能清除所有在通道中写入的消息的命令,该消息除了固定消息外...
有人可以给我发送有效的代码吗?
答案 0 :(得分:1)
TextChannel.fetchMessages()
。Message.pinned
函数中选中Collection.filter()
。TextChannel.bulkDelete()
。 * 示例:
import { MAT_SNACK_BAR_DEFAULT_OPTIONS } from '@angular/material/snack-bar';
providers: [
{
provide: MAT_SNACK_BAR_DEFAULT_OPTIONS,
useValue: {
duration: 41000,
horizontalPosition: 'center',
verticalPosition: 'bottom',
panelClass: 'snackBarInfo'
}
}
]
等效于Async/await
(必须在async function之内):
message.channel.fetchMessages({ limit: 100 })
.then(fetched => {
const notPinned = fetched.filter(fetchedMsg => !fetchedMsg.pinned);
message.channel.bulkDelete(notPinned, true);
})
.catch(console.error);
* 请记住,不能以这种方式删除超过2周的邮件。每次通话也有2-100条消息的限制。
答案 1 :(得分:0)
由于我已经回答了一个非常类似的问题,所以我将重复使用我的代码。
这种方式比使用TextChannel.bulkDelete()
慢,但是会删除2周以上的邮件。
正如懒惰所提到的,对所有这些消息调用Message.delete()
将强加rate limits。 Discord.js将为您处理它们,但是您一定会注意到它们。
async function deleteReturnLast(chan, option, prevMsg, cond) {
return chan.fetchMessages(option)
.then(async msgs => {
if (msgs.size === 0){
if (cond(prevMsg)) {
prevMsg.delete()
.then(d => console.log('last message deleted: ' + d.content))
.catch(err => console.log('ERR>>', err, prevMsg.content, option.before)); }
return prevMsg;
};
let last = msgs.last();
for (const[id, msg] of msgs) {
let tmp = (id === last.id) ? prevMsg : msg;
if (cond(tmp)) {
tmp.delete()
.then(d => console.log('Message deleted: ' + d.content))
.catch(err => console.log('ERR>>', err));
}
};
return last;
})
.catch(err => console.log('ERR>>', err));
}
function cond(msg) {
return !msg.pinned;
}
client.on('message', async function(msg) {
let chan = msg.channel;
let last = chan.lastMessage;
while (last !== (last = await deleteReturnLast(chan, {limit: 2, before: last.id}, last, cond))){
};
});