From a6f42748708d4c5a28981366feadaf63ee136285 Mon Sep 17 00:00:00 2001 From: I Putu Eddy Irawan Date: Sun, 1 Mar 2026 08:56:12 +0700 Subject: [PATCH] feat: add message chunking in Telegram Send method Split HTML content into 4000-char chunks before sending to handle cases where markdown-to-HTML conversion causes messages to exceed Telegram's 4096-character limit. Uses the existing SplitMessage utility which preserves code block integrity across chunk boundaries. Co-Authored-By: Claude Opus 4.6 --- pkg/channels/telegram/telegram.go | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/pkg/channels/telegram/telegram.go b/pkg/channels/telegram/telegram.go index a11cf53b8..ef0a1ef30 100644 --- a/pkg/channels/telegram/telegram.go +++ b/pkg/channels/telegram/telegram.go @@ -175,17 +175,22 @@ func (c *TelegramChannel) Send(ctx context.Context, msg bus.OutboundMessage) err htmlContent := markdownToTelegramHTML(msg.Content) - // Typing/placeholder handled by Manager.preSend — just send the message - tgMsg := tu.Message(tu.ID(chatID), htmlContent) - tgMsg.ParseMode = telego.ModeHTML + // Split HTML content into chunks that fit within Telegram's message limit. + // Use 4000 to leave headroom for HTML tag overhead beyond the 4096 limit. + chunks := channels.SplitMessage(htmlContent, 4000) + + for _, chunk := range chunks { + tgMsg := tu.Message(tu.ID(chatID), chunk) + tgMsg.ParseMode = telego.ModeHTML - if _, err = c.bot.SendMessage(ctx, tgMsg); err != nil { - logger.ErrorCF("telegram", "HTML parse failed, falling back to plain text", map[string]any{ - "error": err.Error(), - }) - tgMsg.ParseMode = "" if _, err = c.bot.SendMessage(ctx, tgMsg); err != nil { - return fmt.Errorf("telegram send: %w", channels.ErrTemporary) + logger.ErrorCF("telegram", "HTML parse failed, falling back to plain text", map[string]any{ + "error": err.Error(), + }) + tgMsg.ParseMode = "" + if _, err = c.bot.SendMessage(ctx, tgMsg); err != nil { + return fmt.Errorf("telegram send: %w", channels.ErrTemporary) + } } }