@userpuzer

Как удалить сообщения для бота?

Есть код с несколько условиями. Для каждого прописано удаление сообщения от пользователя после ввода. При первичном запросе удаление происходит. Во время второго вызова происходит удаление без ответа бота. В третий раз не происходит ни удаления, ни отклика бота. Понять причину не могу.

client.on('messageCreate', (message) => {
 if (message.author.bot) {
      return;
   }

   if (message.content === "ввод") {
      message.reply("вывод");
      message.delete();
   }


   if (message.content === "тест") {
      message.reply("результат");
       message.delete();
   }


   if (message.content === "пинг") {
      message.reply("понг");
            message.delete();
   }
});
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
Alexandre888
@Alexandre888 Куратор тега discord.js
Javascript-разработчик
message.reply() и message.delete() — это промисы.

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

сейчас вы запускаете два этих промиса синхронно, а значит, из них первым выполнится тот, кто потратит меньше всего времени на запрос к Discord API.

если первым выполнится message.reply(), тогда все будет работать, как задумано - сначала бот ответит на сообщение пользователя, потом это сообщение удалит.

если же первым выполнится message.delete(), бот вылетит с фатальной ошибкой REPLIES_UNKNOWN_MESSAGE, т.к попытается опубликовать ответ на не существующее (уже удаленное) сообщение.

поэтому, чтобы избежать подобных проблем, вы должны использовать.then(), либо синтаксис async/await:
message.reply("ответ на сообщение").then(() => { // после выполнения message.reply()...
  message.delete(); // ...удалить сообщение
})

// или //

await message.reply("ответ на сообщение"); 
await message.delete();

/* 
в этом примере выполнение кода не пойдет дальше, пока не выполнится message.reply().
после выполнения message.reply() компилятор будет так же ждать выполнения message.delete(), и пока оно не выполнится, весь код, написанный после message.delete() не будет приведен в действие.
*/
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы