From 5b87ddf3932831e1911f5f50523aae046e7df321 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 10 Mar 2026 21:00:17 +0530 Subject: [PATCH] fix: avoid dropping telegram fallback chunks --- src/telegram/send.test.ts | 24 ++++++++++++++++++++++++ src/telegram/send.ts | 16 ++++++++++------ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/telegram/send.test.ts b/src/telegram/send.test.ts index cc6fd80f649..25752fc337e 100644 --- a/src/telegram/send.test.ts +++ b/src/telegram/send.test.ts @@ -1347,6 +1347,30 @@ describe("sendMessageTelegram", () => { expect(plainFallbackCalls.every((call) => String(call?.[1] ?? "").length > 0)).toBe(true); expect(res.messageId).toBe("93"); }); + + it("cuts over to plain text when fallback text needs more chunks than html", async () => { + const chatId = "123"; + const htmlText = `${"A".repeat(5000)}`; + const plainText = "P".repeat(9000); + const sendMessage = vi + .fn() + .mockResolvedValueOnce({ message_id: 94, chat: { id: chatId } }) + .mockResolvedValueOnce({ message_id: 95, chat: { id: chatId } }) + .mockResolvedValueOnce({ message_id: 96, chat: { id: chatId } }); + const api = { sendMessage } as unknown as { sendMessage: typeof sendMessage }; + + const res = await sendMessageTelegram(chatId, htmlText, { + token: "tok", + api, + textMode: "html", + plainText, + }); + + expect(sendMessage).toHaveBeenCalledTimes(3); + expect(sendMessage.mock.calls.every((call) => call[2]?.parse_mode === undefined)).toBe(true); + expect(sendMessage.mock.calls.map((call) => String(call[1] ?? "")).join("")).toBe(plainText); + expect(res.messageId).toBe("96"); + }); }); describe("reactMessageTelegram", () => { diff --git a/src/telegram/send.ts b/src/telegram/send.ts index 55499c9c308..4d52d84c80a 100644 --- a/src/telegram/send.ts +++ b/src/telegram/send.ts @@ -735,6 +735,7 @@ export async function sendMessageTelegram( rawText: string, context: string, ): Promise<{ messageId: string; chatId: string }> => { + const fallbackText = opts.plainText ?? rawText; let htmlChunks: string[]; try { htmlChunks = splitTelegramHtmlChunks(rawText, 4000); @@ -744,13 +745,16 @@ export async function sendMessageTelegram( error, )}`, ); - return await sendPlainChunkedText(opts.plainText ?? rawText, context); + return await sendPlainChunkedText(fallbackText, context); } - const plainTextChunks = splitTelegramPlainTextFallback( - opts.plainText ?? rawText, - htmlChunks.length, - 4000, - ); + const fixedPlainTextChunks = splitTelegramPlainTextChunks(fallbackText, 4000); + if (fixedPlainTextChunks.length > htmlChunks.length) { + logVerbose( + `telegram ${context} plain-text fallback needs more chunks than HTML; sending plain text`, + ); + return await sendPlainChunkedText(fallbackText, context); + } + const plainTextChunks = splitTelegramPlainTextFallback(fallbackText, htmlChunks.length, 4000); const chunks = htmlChunks.map((chunk, index) => ({ rawText: chunk, htmlText: chunk,