@Den18
MYSQL, JS хобби

В чем проблема слэш команд?

Столкнулся с проблемой использования слэш команд на версии 13 discord js.
Когда бот находится на 1,2 серверах то все работает прекрасно без ошибок и быстрым откликом.
Но когда запускаю бота, который на 500+ то начинается тупняк и такие ошибки
DiscordAPIError: Unknown interaction
    at RequestHandler.execute (C:\Program Files (x86)\Bot\node_modules\discord.js\src\rest\RequestHandler.js:298:13)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async RequestHandler.push (C:\Program Files (x86)\Bot\node_modules\discord.js\src\rest\RequestHandler.js:50:14)
    at async CommandInteraction.reply (C:\Program Files (x86)\Bot\node_modules\discord.js\src\structures\interfaces\InteractionResponses.js:99:5) {
  method: 'post',
  path: '/interactions/917815534404386826/aW50ZXJhY3Rpb246OTE3ODE1NTM0NDA0Mzg2ODI2OlFEdldSZU16NDJ3dWZ2ekRSekcwenhSS0E4OXYwM1hJZzZJc2NFNmVUTXF3cEcyeTF4WnZhRHRqZVl1aW5BbFpuZ1Roc0FXNW90VndFOEhsZ3B0aHRwUm1NVldMWGVVY1ZNSzJvZTd2Q0p1YUhEME1KVzFTQVgxWE5CYUdVOUdp/callback',
  code: 10062,
  httpStatus: 404,
  requestData: { json: { type: 4, data: [Object] }, files: [ [Object] ] }
}

Уже перепробовал и мощный комп, и мощный интернет. Может кто сталкивался с такими проблемами.
Подключение к БД MYSQL.
Все команды находятся в одном файле index.js, но пробовал и разделить их по разным файлам (все равно так же)
К примеру вот так оформлены все команды:
try {
    if(interaction.commandName === 'info') {
        if (interaction.options.getString('category') === 'server') {
            const { utc } = require('moment')
            pool.query(`SELECT lang FROM data WHERE GuildID = ?`, [interaction.guild.id], async function (err, result, fields) {
                    if (err) console.log(err);

                if (result[0]['lang'] === 'rus') {
                                            
                    let embed = new MessageEmbed()
                    .setThumbnail(interaction.guild.iconURL({dynamic : true}))
                    .setColor('#f3f3f3')
                    .setTitle(`Информация о сервере ${interaction.guild.name}`)
                    .setDescription(`**Участники**
                    >Всего: ${interaction.guild.memberCount}\n
                    **Каналы**
                    >Всего: ${interaction.guild.channels.cache.size}
                    >Текстовых: ${interaction.guild.channels.cache.filter(c => c.type === 'GUILD_TEXT').size}
                    >Новостных: ${interaction.guild.channels.cache.filter(c => c.type === 'GUILD_NEWS').size}
                    >Голосовых: ${interaction.guild.channels.cache.filter(c => c.type === 'GUILD_VOICE').size}
                    >Категорий: ${interaction.guild.channels.cache.filter(c => c.type === 'GUILD_CATEGORY').size}\n
                    **Инфо**
                    >Владелец: ${(await interaction.guild.fetchOwner()).user.tag}
                    >Дата создания: ${utc(interaction.guild.createdAt).format('DD MMMM YYYY')}
                    >Количество ролей: ${interaction.guild.roles.cache.size}
                    >Требование 2FA: ${interaction.guild.verified ? 'Включено' : `Выключено`}
                    >Количество бустов: ${interaction.guild.premiumSubscriptionCount >= 1 ? `${interaction.guild.premiumSubscriptionCount}` : `Нет бустов`}
                    >Количество эмоций: ${interaction.guild.emojis.cache.size >= 1 ? `${interaction.guild.emojis.cache.size}` : `Нет эмоций`}`)
                    .setFooter(`ID сервера ${interaction.guild.id}` )
                    return interaction.reply({ embeds: [embed] }).catch(function(err){
                        if(err) {
                            console.log(err)
                        }
                    });
                }
            })
        }
    }    
} catch(err) {
    console.log(err);
}
  • Вопрос задан
  • 1070 просмотров
Решения вопроса 1
nowm
@nowm
У дискорда есть такая фишка, что на interaction нужно ответить в течение 3-х секунд. Если не успели, он начинает выдавать такую ошибку. Есть несколько вариантов:

  1. Сразу после того, как был получен interaction, нужно вызвать interaction.deferReply. Вызов deferReply даёт возможность продлить срок ответа до 15 минут. Дальше как обычно — делаете pool.query и потом interaction.reply
    await interaction.deferReply();
    // После вызова кода выше, дискорд даёт ещё 15 минут 
    // на то, чтобы отправить ответ.
    
    // [Тут какой-то ваш код, который долго работает]
    
    await interaction.reply('Информация о сервере: бла-блабла');


  2. Можно использовать механизм Follow-ups. В таком случае вы сразу что-нибудь отвечаете с помощью interaction.reply, потом делаете pool.query и потом добавляете ещё текст с помощью interaction.followUp:
    await interaction.reply('Ща, погодь, нужно в БД посмотреть...');
    // После вызова кода выше, дискорд даёт ещё 15 минут 
    // на то, чтобы отправить follow up.
    
    // [Тут какой-то ваш код, который долго работает]
    
    await interaction.followUp('Вот, нашёл: Информация о сервере: бла-блабла');
    // Код выше добавляет к ответу текст "Вот, нашёл: Информация о сервере: бла-блабла" 
    // (фраза «Ща, погодь» никуда не пропадает)


  3. Можно точно так же сразу ответить, но вместо interaction.followUp вызывать interaction.editReply. В этом случае даётся тоже 15 минут на то, чтобы вызвать editReply.
    await interaction.reply('Подождите...');
    // После вызова кода выше, дискорд даёт ещё 15 минут 
    // на то, чтобы отредактировать это сообщение
    
    // [Тут какой-то ваш код, который долго работает]
    
    await interaction.editReply('Информация о сервере: бла-блабла');
    // Код выше заменяет "Подождите.." на "Информация о сервере: бла-блабла"


Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы