Discord Bot 命令未部署(卡在部署中)

问题描述 投票:0回答:1

我的 Discord 机器人确实会停止向特定公会部署命令。 3 分钟前,它确实可以在同一个地方、同一个公会、同一个终端使用相同的代码工作,但现在却陷入了部署困境。我今天早上遇到过一次这个问题,在我的 mac 被禁用几个小时后它就自行修复了。有人知道问题是什么吗?

我的deploy.js:

const { REST, Routes } = require('discord.js');
const { GlobalModules } = require('../config/modules');
const Guild = require('../models/Guild');
require('dotenv').config();

let clientCommands = null;

function setClientCommands(commands) {
    clientCommands = commands;
}

async function clearCommands(guildId) {
    const rest = new REST().setToken(process.env.TOKEN);

    try {
        console.log(`Lösche Commands für Guild ${guildId}...`);

        // Prüfe globale Commands
        console.log('Prüfe globale Commands...');
        const globalCommands = await rest.get(
            Routes.applicationCommands(process.env.CLIENT_ID)
        );
        console.log(
            `Gefundene globale Commands: ${JSON.stringify(globalCommands, null, 2)}`
        );

        // Lösche globale Commands
        for (const command of globalCommands) {
            console.log(`Lösche globalen Command ${command.name} (${command.id})...`);
            await rest.delete(
                Routes.applicationCommand(process.env.CLIENT_ID, command.id)
            );
        }

        // Prüfe guild-spezifische Commands
        console.log('Prüfe guild-spezifische Commands...');
        const guildCommands = await rest.get(
            Routes.applicationGuildCommands(process.env.CLIENT_ID, guildId)
        );
        console.log(
            `Gefundene Guild Commands: ${JSON.stringify(guildCommands, null, 2)}`
        );

        // Lösche guild-spezifische Commands
        for (const command of guildCommands) {
            console.log(`Lösche Guild Command ${command.name} (${command.id})...`);
            await rest.delete(
                Routes.applicationGuildCommand(
                    process.env.CLIENT_ID,
                    guildId,
                    command.id
                )
            );
        }

        console.log('Erfolgreich alle Commands gelöscht.');
    } catch (error) {
        console.error('Fehler beim Löschen der Commands:', error);
        throw error;
    }
}

async function deployCommandsForGuild(guildId) {
    if (!clientCommands) {
        console.error('Client commands wurden nicht initialisiert');
        return;
    }

    const rest = new REST().setToken(process.env.TOKEN);
    let guild = await Guild.findOne({ guildId });

    // Wenn keine Konfiguration existiert, erstelle eine neue
    if (!guild) {
        try {
            // Hole Guild-Informationen von Discord
            const discordGuild = await rest.get(Routes.guild(guildId));
            console.log(
                `Erstelle neue Guild-Konfiguration für ${guildId} (${discordGuild.name})...`
            );

            guild = new Guild({
                guildId,
                name: discordGuild.name,
                enabledModules: [],
                availableModules: [],
            });
            await guild.save();
        } catch (error) {
            console.error(`Fehler beim Erstellen der Guild-Konfiguration: ${error}`);
            return;
        }
    }

    try {
        // Erst alle Commands löschen
        await clearCommands(guildId);

        // Sammle alle Commands die deployed werden sollen
        const commandsToRegister = [];

        for (const [name, command] of clientCommands) {
            // Wenn es ein globales Modul ist oder wenn das Modul aktiviert ist
            if (
                !command.module ||
                GlobalModules.includes(command.module) ||
                guild.enabledModules.includes(command.module)
            ) {
                commandsToRegister.push(command.data.toJSON());
            }
        }

        console.log(
            `Starte Deployment von ${commandsToRegister.length} Commands für Guild ${guildId}...`
        );

        // Registriere die neuen Commands
        await rest.put(
            Routes.applicationGuildCommands(process.env.CLIENT_ID, guildId),
            { body: commandsToRegister }
        );

        console.log(
            `Erfolgreich ${commandsToRegister.length} Commands für Guild ${guildId} deployed.`
        );
    } catch (error) {
        console.error('Fehler beim Deployen der Commands:', error);
    }
}

module.exports = {
    setClientCommands,
    deployCommandsForGuild,
    clearCommands,
};

输出:

✅ Erfolgreich mit MongoDB verbunden
🎉 Giveaway-System wird gestartet...
✅ Giveaway-System erfolgreich gestartet
Bereit! Eingeloggt als BayMax Dev#7945
Lösche Commands für Guild 1325228698642681928...
Prüfe globale Commands...
🕒 Reminder-System gestartet
Gefundene globale Commands: []
Prüfe guild-spezifische Commands...
Gefundene Guild Commands: []
Erfolgreich alle Commands gelöscht.
Lösche Commands für Guild 1325228698642681928...
Prüfe globale Commands...
Gefundene globale Commands: []
Prüfe guild-spezifische Commands...
Gefundene Guild Commands: []
Erfolgreich alle Commands gelöscht.
Starte Deployment von 2 Commands für Guild 1325228698642681928...
javascript discord discord.js bots
1个回答
0
投票

Discord 在更新/修改/删除现有应用程序命令方面有严格的速率限制。由于您循环执行每个命令并为每个命令发送一个 api 请求,因此您很容易很快就受到速率限制。

要修复此行为,请更新您的代码,如下所示:

  • 不要清除旧命令,您可以覆盖它们,旧命令就会消失。

  • 如果您想清除所有命令,您可以在发送 api 请求之前将它们全部收集到一个数组中,或者 - 这是更好的行为 - 只需放置一个空数组。

© www.soinside.com 2019 - 2024. All rights reserved.