From 6ba1dd7080960b4668a7a0783d0a4e7e4aca62ba Mon Sep 17 00:00:00 2001 From: neken Date: Fri, 10 Apr 2026 15:13:39 +0500 Subject: [PATCH] feat: add message handler routing text to active Claude session --- src/handlers/message.ts | 45 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/handlers/message.ts diff --git a/src/handlers/message.ts b/src/handlers/message.ts new file mode 100644 index 0000000..805ec1b --- /dev/null +++ b/src/handlers/message.ts @@ -0,0 +1,45 @@ +import { type Context } from "grammy"; +import { SessionManager } from "../services/session-manager.js"; +import { ClaudeService } from "../services/claude.js"; +import { splitMessage } from "../utils/telegram.js"; + +export function createMessageHandler( + manager: SessionManager, + claude: ClaudeService, +) { + return async (ctx: Context) => { + const text = ctx.message?.text; + if (!text) return; + + const activeName = manager.activeSession; + if (!activeName) { + await ctx.reply("No active session. Use /start to create one."); + return; + } + + const session = manager.activeSessionInfo; + if (!session) return; + + if (session.status === "busy") { + await ctx.reply("Session is busy, wait for the current request to finish."); + return; + } + + manager.setStatus(activeName, "busy"); + await ctx.replyWithChatAction("typing"); + + try { + const result = await claude.sendMessage(text, session.sessionId); + const response = result || "(empty response)"; + const chunks = splitMessage(response); + + for (const chunk of chunks) { + await ctx.reply(chunk); + } + } catch (err) { + await ctx.reply(`Error: ${err}`); + } finally { + manager.setStatus(activeName, "idle"); + } + }; +}