我的 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...
Discord 在更新/修改/删除现有应用程序命令方面有严格的速率限制。由于您循环执行每个命令并为每个命令发送一个 api 请求,因此您很容易很快就受到速率限制。
要修复此行为,请更新您的代码,如下所示:
不要清除旧命令,您可以覆盖它们,旧命令就会消失。
如果您想清除所有命令,您可以在发送 api 请求之前将它们全部收集到一个数组中,或者 - 这是更好的行为 - 只需放置一个空数组。