From 1432e0d0900eb3fd17d5ba1e9419b2af74e270e8 Mon Sep 17 00:00:00 2001 From: MyungHyun Date: Thu, 9 Apr 2026 12:25:04 +0900 Subject: [PATCH] fix(commands): re-sync global commands when definitions change --- src/events/ready.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/events/ready.ts b/src/events/ready.ts index 0ecf7c5..427477d 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -1,4 +1,5 @@ import { Events } from 'discord.js'; +import { createHash } from 'crypto'; import { KordClient } from '../client/KordClient'; import { logger } from '../utils/logger'; import { InviteService } from '../services/InviteService'; @@ -20,16 +21,19 @@ export default { EventService.startReminderLoop(client); try { - const lockKey = 'commands:sync:lock'; - // EX 300 = 5 minutes lock. Only one instance needs to do this per boot cycle. + const commandsData = Array.from(client.commands.values()).map(c => c.data.toJSON()); + const commandsHash = createHash('sha256') + .update(JSON.stringify(commandsData)) + .digest('hex'); + const lockKey = `commands:sync:lock:${commandsHash}`; + // Lock per command definition set so updated commands can still sync on the next boot. const acquired = await redis.set(lockKey, '1', 'EX', 300, 'NX'); - + if (acquired) { - const commandsData = Array.from(client.commands.values()).map(c => c.data.toJSON()); await client.application?.commands.set(commandsData); - logger.info(`Successfully registered ${commandsData.length} global application commands.`); + logger.info(`Successfully registered ${commandsData.length} global application commands. hash=${commandsHash}`); } else { - logger.info('Global commands registration skipped (already handled by another instance).'); + logger.info(`Global commands registration skipped for hash=${commandsHash} (already handled by another instance).`); } } catch (e) { logger.error('Failed to register global commands', e);