#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 руководство выше, прочитайте его и посмотрите, что вы можете сделать. Я бы настоятельно рекомендовал попробовать это с совершенно другим ботом и чистым индексным файлом, так как это было бы проще, чем пытаться вписаться в код, который вы не понимаете, между вашим и без того проблемным кодом.