From f2f856628df7d37be30eba0b5e333b84749211f1 Mon Sep 17 00:00:00 2001 From: smueller Date: Wed, 22 Jul 2026 12:57:25 +0200 Subject: [PATCH] Refactor command registration to support guild-specific commands - Updated the command registration process to allow for instant synchronization of guild commands, while maintaining global command registration. - Introduced optional BOT_GUILD_ID environment variable for guild-specific command handling. - Enhanced logging to differentiate between guild and global command registrations, improving traceability. --- apps/bot/src/commands.ts | 37 +++++++++++++++++++++++++++++-------- apps/bot/src/env.ts | 1 + 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/apps/bot/src/commands.ts b/apps/bot/src/commands.ts index db3a6de..69d6299 100644 --- a/apps/bot/src/commands.ts +++ b/apps/bot/src/commands.ts @@ -33,15 +33,36 @@ const contextMenuMap = new Map(utilityContextMenus.map((c) => [c.data.name, c])) export async function registerCommands() { const rest = new REST({ version: '10' }).setToken(env.BOT_TOKEN); - await rest.put(Routes.applicationCommands(env.BOT_CLIENT_ID), { - body: [ - ...commands.map((c) => c.data.toJSON()), - ...utilityContextMenus.map((c) => c.data.toJSON()) - ] - }); + const body = [ + ...commands.map((c) => c.data.toJSON()), + ...utilityContextMenus.map((c) => c.data.toJSON()) + ]; + + // Guild commands sync instantly; global can take up to ~1h. + if (env.BOT_GUILD_ID) { + await rest.put(Routes.applicationGuildCommands(env.BOT_CLIENT_ID, env.BOT_GUILD_ID), { + body + }); + logger.info( + { + scope: 'guild', + guildId: env.BOT_GUILD_ID, + count: commands.length, + contextMenus: utilityContextMenus.length + }, + 'Registered guild application commands' + ); + return; + } + + await rest.put(Routes.applicationCommands(env.BOT_CLIENT_ID), { body }); logger.info( - { count: commands.length, contextMenus: utilityContextMenus.length }, - 'Registered application commands' + { + scope: 'global', + count: commands.length, + contextMenus: utilityContextMenus.length + }, + 'Registered global application commands' ); } diff --git a/apps/bot/src/env.ts b/apps/bot/src/env.ts index e115f23..b5d2e7e 100644 --- a/apps/bot/src/env.ts +++ b/apps/bot/src/env.ts @@ -7,6 +7,7 @@ const EnvSchema = z.object({ NODE_ENV: z.enum(['development', 'test', 'production']).default('development'), BOT_TOKEN: z.string().min(1), BOT_CLIENT_ID: z.string().min(1), + BOT_GUILD_ID: z.string().min(1).optional(), DATABASE_URL: z.string().url(), REDIS_URL: z.string().url(), LOG_LEVEL: z.string().default('info'),