Discord.js Очистить команду, которая пропускает закрепленные сообщения - PullRequest
0 голосов
/ 29 июня 2019

Я новичок в JavaScript, и я хотел создать бот Discord ... Я думаю, что мой бот Discord хорош, но у меня, кажется, нет работающей команды, которая очищает все сообщения, записанные в канале, кроме закрепленных ...

Кто-нибудь может выслать мне код, который работает?

Ответы [ 2 ]

1 голос
/ 30 июня 2019
  1. Чтобы получить большое количество сообщений из канала, используйте TextChannel.fetchMessages().
  2. Чтобы отфильтровать результаты, чтобы включить только сообщения, которые не были закреплены, установите флажокMessage.pinned в функции Collection.filter().
  3. Чтобы удалить все эти сообщения одновременно, используйте TextChannel.bulkDelete(). *

Пример:

message.channel.fetchMessages({ limit: 100 })
  .then(fetched => {
    const notPinned = fetched.filter(fetchedMsg => !fetchedMsg.pinned);

    message.channel.bulkDelete(notPinned, true);
  })
  .catch(console.error);

Асинхронный / await эквивалент (должен быть в пределах асинхронной функции ):

try {
  const fetched = await message.channel.fetchMessages({ limit: 100 });
  const notPinned = fetched.filter(fetchedMsg => !fetchedMsg.pinned);

  await message.channel.bulkDelete(notPinned, true);
} catch(err) {
  console.error(err);
}

* Имейте в виду, что сообщения старше 2 недель не могут быть удалены таким образом.Существует также ограничение в 2-100 сообщений на звонок.

0 голосов
/ 01 июля 2019

Поскольку я уже ответил на довольно похожий вопрос, я просто собираюсь повторно использовать свой код.

Этот способ будет медленнее, чем при использовании TextChannel.bulkDelete(), но удалит сообщение старше 2 недель.
Как упомянул ленивец, вызов Message.delete() для всех этих сообщений наложит ограничения скорости .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))){
  };
});
...