{"record":{"id":"7f6d3ec5a237929f","repo":"chenhg5/cc-connect","slug":"telegram-edit-message-w","errorCode":null,"errorMessage":"telegram: edit message: %w","messagePattern":"telegram: edit message: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"platform/telegram/telegram.go","lineNumber":1511,"sourceCode":"\t\terrMsg := err.Error()\n\t\tslog.Debug(\"telegram: UpdateMessage HTML failed\", \"error\", errMsg)\n\t\tif strings.Contains(errMsg, \"not modified\") {\n\t\t\treturn nil\n\t\t}\n\t\tif strings.Contains(errMsg, \"can't parse\") {\n\t\t\tslog.Warn(\"telegram: HTML rejected by Telegram, editing as plain text\",\n\t\t\t\t\"method\", \"UpdateMessage\",\n\t\t\t\t\"error\", errMsg,\n\t\t\t\t\"html_prefix\", truncateForLog(html, 200),\n\t\t\t\t\"html_len\", len(html),\n\t\t\t)\n\t\t\tparams.Text = content\n\t\t\tparams.ParseMode = \"\"\n\t\t\tif _, err2 := bot.EditMessageText(ctx, params); err2 != nil {\n\t\t\t\tif strings.Contains(err2.Error(), \"not modified\") {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn fmt.Errorf(\"telegram: edit message: %w\", err2)\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t\treturn fmt.Errorf(\"telegram: edit message: %w\", err)\n\t}\n\tslog.Debug(\"telegram: UpdateMessage HTML success\")\n\treturn nil\n}\n\n// telegramMaxMessageLen is the maximum message length for Telegram.\n// Telegram's limit is 4096 characters for text messages.\nconst telegramMaxMessageLen = 4096\n\n// sendChunked splits a message that's too long and sends it as multiple messages.\n// It uses SplitMessageCodeFenceAware to respect code block boundaries.\nfunc (p *Platform) sendChunked(ctx context.Context, bot telegramBot, rc replyContext, html string) error {\n\tchunks := core.SplitMessageCodeFenceAware(html, telegramMaxMessageLen)\n\tfor i, chunk := range chunks {","sourceCodeStart":1493,"sourceCodeEnd":1529,"githubUrl":"https://github.com/chenhg5/cc-connect/blob/4000b2338aa6e850c99df54f8b0ed6ed7460b401/platform/telegram/telegram.go#L1493-L1529","documentation":"This error path in UpdateMessage (platform/telegram/telegram.go:1511) is the plain-text fallback: after an HTML-formatted EditMessageText fails, the code retries with ParseMode cleared; if that EditMessageText also fails (and it is not the benign 'message is not modified' case), it wraps the error as 'telegram: edit message'. It means Telegram refused the edit entirely.","triggerScenarios":"Both HTML and plain-text EditMessageText calls fail — e.g. 'message is not editable' (message too old, >48h), 'message to edit not found', 'chat not found', bot lost send/edit rights, or network/API errors.","commonSituations":"Editing messages older than Telegram's 48-hour edit window; the preview message was deleted by a user; bot was demoted or removed from the chat; concurrent edits caused a race where the message was deleted mid-edit.","solutions":["Check the wrapped API message: 'not found' means recreate the message via a new Send instead of editing","'message can't be edited' means the message is too old — send a new message rather than editing","Verify the bot still has permission to edit messages in the chat","Skip 'message is not modified' errors when content is unchanged (already handled) to avoid spurious failures","Treat as non-fatal for streaming previews: log and continue the stream instead of aborting"],"exampleFix":"// before\nif _, err2 := bot.EditMessageText(ctx, params); err2 != nil {\n    return fmt.Errorf(\"telegram: edit message: %w\", err2)\n}\n// after\nif _, err2 := bot.EditMessageText(ctx, params); err2 != nil {\n    if strings.Contains(err2.Error(), \"message can't be edited\") || strings.Contains(err2.Error(), \"not found\") {\n        slog.Warn(\"telegram: edit impossible, sending new message\", \"err\", err2)\n        return p.sendNewMessage(ctx, h, content) // fallback to fresh send\n    }\n    return fmt.Errorf(\"telegram: edit message: %w\", err2)\n}","handlingStrategy":"try-catch","validationCode":"if time.Since(sentAt) > 48*time.Hour {\n    return errors.New(\"message past Telegram edit window; send new message instead\")\n}","typeGuard":null,"tryCatchPattern":"err := p.UpdateMessage(ctx, handle, content)\nif err != nil {\n    switch {\n    case strings.Contains(err.Error(), \"not modified\"):\n        return nil // benign\n    case strings.Contains(err.Error(), \"can't be edited\"), strings.Contains(err.Error(), \"not found\"):\n        return p.resendAsNew(ctx, handle, content)\n    default:\n        return fmt.Errorf(\"edit failed: %w\", err)\n    }\n}","preventionTips":["Finalize long-running streams within Telegram's 48-hour edit window","Handle 'message is not modified' as success to avoid noise on identical content","For long outputs, periodically send fresh messages instead of editing one message forever","Verify bot edit permissions when chats are reconfigured"],"tags":["telegram","api","edit-message","golang"],"backgroundTag":"api-request-failed","analyzedSha":"4000b2338aa6e850c99df54f8b0ed6ed7460b401","analyzedAt":"2026-09-06T11:45:09.575Z","contentChangedAt":"2026-09-06T11:45:09.575Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}