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'),