Discord.js清除命令,跳过固定的消息

时间:2019-06-29 20:33:58

标签: javascript discord discord.js

我是JavaScript的新手,我想做一个Discord Bot ...我认为我的discord bot很不错,但是我似乎没有能清除所有在通道中写入的消息的命令,该消息除了固定消息外...

有人可以给我发送有效的代码吗?

2 个答案:

答案 0 :(得分:1)

  1. 要从某个频道中获取大量消息,请使用TextChannel.fetchMessages()
  2. 要过滤结果以仅包括未固定的邮件,请在Message.pinned函数中选中Collection.filter()
  3. 要一次删除所有这些消息,请使用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))){
  };
});