From f8a5dfdf098636d96f9808cb2e755119e32785f8 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 1 Apr 2026 03:00:35 +0000 Subject: [PATCH] Handle ECONNREFUSED errors gracefully in play/add commands When the QQ Music (or other) API server is not running, the bot now returns a user-friendly message instead of crashing with a raw ECONNREFUSED error. Applied to cmdPlay, cmdAdd, and the generic command error handler. https://claude.ai/code/session_01Niz9kmZ4zqfe3PWc6tjvMw --- src/bot/instance.ts | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/bot/instance.ts b/src/bot/instance.ts index 69921ad..be3217b 100644 --- a/src/bot/instance.ts +++ b/src/bot/instance.ts @@ -144,12 +144,13 @@ export class BotInstance extends EventEmitter { if (response) { await this.tsClient.sendTextMessage(response); } - } catch (err) { + } catch (err: any) { this.logger.error({ err, command: parsed.name }, "Command execution error"); + const friendlyMsg = err?.code === "ECONNREFUSED" + ? "Error: Music API server is not reachable. Please check if the service is running." + : `Error: ${(err as Error).message}`; try { - await this.tsClient.sendTextMessage( - `Error: ${(err as Error).message}` - ); + await this.tsClient.sendTextMessage(friendlyMsg); } catch (sendErr) { this.logger.error({ err: sendErr }, "Failed to send error message to chat"); } @@ -252,7 +253,18 @@ export class BotInstance extends EventEmitter { private async cmdPlay(cmd: ParsedCommand): Promise { if (!cmd.args) return "Usage: !play "; const provider = this.getProvider(cmd.flags); - const result = await provider.search(cmd.args, 1); + + let result; + try { + result = await provider.search(cmd.args, 1); + } catch (err: any) { + if (err?.code === "ECONNREFUSED") { + this.logger.error({ err, platform: provider.platform }, "Music API server is not reachable"); + return `Music API server for ${provider.platform} is not running. Please check the service.`; + } + throw err; + } + if (result.songs.length === 0) return `No results found for: ${cmd.args}`; @@ -269,7 +281,18 @@ export class BotInstance extends EventEmitter { private async cmdAdd(cmd: ParsedCommand): Promise { if (!cmd.args) return "Usage: !add "; const provider = this.getProvider(cmd.flags); - const result = await provider.search(cmd.args, 1); + + let result; + try { + result = await provider.search(cmd.args, 1); + } catch (err: any) { + if (err?.code === "ECONNREFUSED") { + this.logger.error({ err, platform: provider.platform }, "Music API server is not reachable"); + return `Music API server for ${provider.platform} is not running. Please check the service.`; + } + throw err; + } + if (result.songs.length === 0) return `No results found for: ${cmd.args}`;