diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 000000000..715e55ea3 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,7 @@ +{ + "permissions": { + "allow": [ + "Bash(pnpm build:*)" + ] + } +} diff --git a/extensions/twitch/src/monitor.ts b/extensions/twitch/src/monitor.ts index f4872100e..97672c0e0 100644 --- a/extensions/twitch/src/monitor.ts +++ b/extensions/twitch/src/monitor.ts @@ -122,13 +122,14 @@ async function processTwitchMessage(params: { payload, channel: message.channel, account, + accountId, + config, + tableMode, runtime, statusSink, }); }, }, - runtime, - tableMode, }); } @@ -139,26 +140,37 @@ async function deliverTwitchReply(params: { payload: ReplyPayload; channel: string; account: TwitchAccountConfig; + accountId: string; + config: unknown; + tableMode: "off" | "plain" | "markdown" | "bullets" | "code"; runtime: TwitchRuntimeEnv; statusSink?: (patch: { lastInboundAt?: number; lastOutboundAt?: number }) => void; }): Promise { - const { payload, channel, account, runtime, statusSink } = params; + const { payload, channel, account, accountId, config, tableMode, runtime, statusSink } = params; try { - const clientManager = getOrCreateClientManager(account.accountId ?? "default", { + const clientManager = getOrCreateClientManager(accountId, { info: (msg) => runtime.log?.(`[twitch] ${msg}`), warn: (msg) => runtime.log?.(`[twitch] ${msg}`), error: (msg) => runtime.error?.(`[twitch] ${msg}`), debug: (msg) => runtime.log?.(`[twitch] ${msg}`), }); - const client = await clientManager.getClient(account, null, account.accountId ?? "default"); + const client = await clientManager.getClient( + account, + config as Parameters[1], + accountId, + ); if (!client) { runtime.error?.(`[twitch] No client available for sending reply`); return; } // Send the reply + if (!payload.text) { + runtime.error?.(`[twitch] No text to send in reply payload`); + return; + } await client.say(channel, payload.text); statusSink?.({ lastOutboundAt: Date.now() }); } catch (err) { @@ -253,7 +265,5 @@ export async function monitorTwitchProvider( // Handle abort signal abortSignal.addEventListener("abort", stop, { once: true }); - runtime.log?.(`[twitch] Monitor started for account ${accountId}`); - return { stop }; } diff --git a/extensions/twitch/src/twitch-client.ts b/extensions/twitch/src/twitch-client.ts index 91f67c11f..bafeed394 100644 --- a/extensions/twitch/src/twitch-client.ts +++ b/extensions/twitch/src/twitch-client.ts @@ -228,10 +228,14 @@ export class TwitchClientManager { /** * Set a message handler for an account + * @returns A function that removes the handler when called */ - onMessage(account: TwitchAccountConfig, handler: (message: TwitchChatMessage) => void): void { + onMessage(account: TwitchAccountConfig, handler: (message: TwitchChatMessage) => void): () => void { const key = this.getAccountKey(account); this.messageHandlers.set(key, handler); + return () => { + this.messageHandlers.delete(key); + }; } /**