Compare commits

...
Author SHA1 Message Date
Claude f8a5dfdf09 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
2026-04-01 03:00:35 +00:00
+29 -6
View File
@@ -144,12 +144,13 @@ export class BotInstance extends EventEmitter {
if (response) { if (response) {
await this.tsClient.sendTextMessage(response); await this.tsClient.sendTextMessage(response);
} }
} catch (err) { } catch (err: any) {
this.logger.error({ err, command: parsed.name }, "Command execution error"); 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 { try {
await this.tsClient.sendTextMessage( await this.tsClient.sendTextMessage(friendlyMsg);
`Error: ${(err as Error).message}`
);
} catch (sendErr) { } catch (sendErr) {
this.logger.error({ err: sendErr }, "Failed to send error message to chat"); 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<string> { private async cmdPlay(cmd: ParsedCommand): Promise<string> {
if (!cmd.args) return "Usage: !play <song name or URL>"; if (!cmd.args) return "Usage: !play <song name or URL>";
const provider = this.getProvider(cmd.flags); 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) if (result.songs.length === 0)
return `No results found for: ${cmd.args}`; return `No results found for: ${cmd.args}`;
@@ -269,7 +281,18 @@ export class BotInstance extends EventEmitter {
private async cmdAdd(cmd: ParsedCommand): Promise<string> { private async cmdAdd(cmd: ParsedCommand): Promise<string> {
if (!cmd.args) return "Usage: !add <song name>"; if (!cmd.args) return "Usage: !add <song name>";
const provider = this.getProvider(cmd.flags); 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) if (result.songs.length === 0)
return `No results found for: ${cmd.args}`; return `No results found for: ${cmd.args}`;