From 6eb89cdc51b5a05e155dcc1eccb17bf2ef63652d Mon Sep 17 00:00:00 2001 From: Eyejoker Date: Sat, 23 May 2026 13:00:01 +0900 Subject: [PATCH] fix: skip restart recovery announcements when no channel is connected Prevents web-dashboard-only startup from crashing when Discord channels are unavailable. Co-authored-by: Cursor --- src/index.ts | 56 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/src/index.ts b/src/index.ts index 162dd40..27d2cdf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -174,6 +174,22 @@ export function _setRoomBindings( runtimeState.setRoomBindings(groups); } +async function tryDeliverRestartAnnouncement( + chatJid: string, + rawText: string, +): Promise { + try { + await deliverFormattedCanonicalMessage(chatJid, rawText); + return true; + } catch (err) { + logger.warn( + { err, chatJid }, + 'Skipped restart recovery announcement because no channel is connected', + ); + return false; + } +} + async function announceRestartRecovery( processStartedAtMs: number, ): Promise { @@ -188,14 +204,17 @@ async function announceRestartRecovery( return explicitContext; } - await deliverFormattedCanonicalMessage( - explicitContext.chatJid, - buildRestartAnnouncement(explicitContext), - ); - logger.info( - { chatJid: explicitContext.chatJid }, - 'Sent explicit restart recovery announcement', - ); + if ( + await tryDeliverRestartAnnouncement( + explicitContext.chatJid, + buildRestartAnnouncement(explicitContext), + ) + ) { + logger.info( + { chatJid: explicitContext.chatJid }, + 'Sent explicit restart recovery announcement', + ); + } for (const interrupted of getRecoverableInterruptedGroups( explicitContext, @@ -204,7 +223,7 @@ async function announceRestartRecovery( if (hasRecentRestartAnnouncement(interrupted.chatJid, dedupeSince)) { continue; } - await deliverFormattedCanonicalMessage( + await tryDeliverRestartAnnouncement( interrupted.chatJid, buildInterruptedRestartAnnouncement(interrupted), ); @@ -226,14 +245,17 @@ async function announceRestartRecovery( return null; } - await deliverFormattedCanonicalMessage( - inferred.chatJid, - inferred.lines.join('\n'), - ); - logger.info( - { chatJid: inferred.chatJid }, - 'Sent inferred restart recovery announcement', - ); + if ( + await tryDeliverRestartAnnouncement( + inferred.chatJid, + inferred.lines.join('\n'), + ) + ) { + logger.info( + { chatJid: inferred.chatJid }, + 'Sent inferred restart recovery announcement', + ); + } return null; }