Как исправить ошибку DiscordAPIError: Неизвестное сообщение?

#javascript #node.js #discord.js

Вопрос:

Я создал бота, который удаляет текстовые сообщения в канале изображений, но когда я его использую, он регистрирует эту ошибку.

 client.on("message", async message => {
    if (message.author.bot) return;
    const users = ['853248522563485717'];
    if (message.channel.id === '841260660960395287') {
        if (users.includes(message.author.id)) return;
        if (message.attachments.size !== 0) return;
        message.member.send("You can't send text in 'images' channel")
         await message.delete();
    } else return;
});
 

(это отличается от других вопросов на ту же тему)
как мне это исправить?

Комментарии:

1. вы уверены, что у вас нет нескольких оболочек одного и того же бота? таким образом, он может попытаться удалить сообщения, которые уже были удалены

2. Я почти уверен, что в этом и проблема, вы знаете, как ее решить?

3. закрыть другую работающую оболочку? это не должно быть трудно ;-;

Ответ №1:

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

 client.on("message", async (message) => {
  if (!message) return; // ADDED THIS LINE OF CODE
  if (message.author.bot) return;
  const users = ["853248522563485717"];
  if (message.channel.id === "841260660960395287") {
    if (users.includes(message.author.id)) return;
    if (message.attachments.size !== 0) return;
    message.member.send("You can't send text in 'images' channel");
    await message.delete();
  } else {
    return;
  }
});
 

Комментарии:

1. теперь это дает мне новую ошибку — (узел:15092) MaxListenersExceededWarning: Обнаружена возможная утечка памяти источника событий. 11 прослушивателей сообщений, добавленных в [Клиент]. Используйте emitter.setMaxListeners() для увеличения лимита (Используйте node --trace-warnings ... , чтобы показать, где было создано предупреждение) (узел:15092) Необработанный Promiserejectionwarning: DiscordAPIError: Неизвестное сообщение

2. @Давид Сарек, его проблема в том, что он использует несколько on message событий.

3. Ах да, так оно и есть

Ответ №2:

Судя по вашей ошибке выше, вы, по-видимому, используете a message event listener для каждой команды или функции, которые вы хотите, чтобы ваш бот выполнял. Максимум для этого-11 (того же типа). Это неправильный способ сделать это.

Что такое прослушиватель событий?

 //the 'client.on' function is called every time a 'message' is sent

client.on("message", async (message) => {
  //do code
});
 

Как это исправить:

Вместо использования 1 прослушивателя событий на команду используйте 1 для всего клиента. Вы могли бы решить эту проблему множеством способов, с помощью обработчиков команд или чего-то подобного, однако я постараюсь сделать это простым.

Это базовая настройка, которую вы должны увидеть в своем index.js main.js файле или:

 // require the discord.js module
const Discord = require('discord.js');

// create a new Discord client
const client = new Discord.Client();

// on message, run this
client.on('message', (message) => {
    if (!message) return;
    console.log(`message sent in ${message.channel.name}. message content: ${message.content}`);
    //this event will fire every time a message is sent, for example.
});

// login to Discord with your app's token
client.login('your-token-goes-here');
 

Итак, что вы делаете, если хотите выполнять несколько функций с помощью своего бота? (например, удаление текста в канале только для изображений и запись сообщений в консоль)

Обработка команд. Это единственный способ. Я связал чиновника Discord.js руководство выше, прочитайте его и посмотрите, что вы можете сделать. Я бы настоятельно рекомендовал попробовать это с совершенно другим ботом и чистым индексным файлом, так как это было бы проще, чем пытаться вписаться в код, который вы не понимаете, между вашим и без того проблемным кодом.