chenhg5/cc-connect · error
telegram: edit message: %w
Error message
telegram: edit message: %w
What it means
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.
Source
Thrown at platform/telegram/telegram.go:1511
errMsg := err.Error()
slog.Debug("telegram: UpdateMessage HTML failed", "error", errMsg)
if strings.Contains(errMsg, "not modified") {
return nil
}
if strings.Contains(errMsg, "can't parse") {
slog.Warn("telegram: HTML rejected by Telegram, editing as plain text",
"method", "UpdateMessage",
"error", errMsg,
"html_prefix", truncateForLog(html, 200),
"html_len", len(html),
)
params.Text = content
params.ParseMode = ""
if _, err2 := bot.EditMessageText(ctx, params); err2 != nil {
if strings.Contains(err2.Error(), "not modified") {
return nil
}
return fmt.Errorf("telegram: edit message: %w", err2)
}
return nil
}
return fmt.Errorf("telegram: edit message: %w", err)
}
slog.Debug("telegram: UpdateMessage HTML success")
return nil
}
// telegramMaxMessageLen is the maximum message length for Telegram.
// Telegram's limit is 4096 characters for text messages.
const telegramMaxMessageLen = 4096
// sendChunked splits a message that's too long and sends it as multiple messages.
// It uses SplitMessageCodeFenceAware to respect code block boundaries.
func (p *Platform) sendChunked(ctx context.Context, bot telegramBot, rc replyContext, html string) error {
chunks := core.SplitMessageCodeFenceAware(html, telegramMaxMessageLen)
for i, chunk := range chunks {View on GitHub (pinned to 4000b2338a)
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
Example fix
// before
if _, err2 := bot.EditMessageText(ctx, params); err2 != nil {
return fmt.Errorf("telegram: edit message: %w", err2)
}
// after
if _, err2 := bot.EditMessageText(ctx, params); err2 != nil {
if strings.Contains(err2.Error(), "message can't be edited") || strings.Contains(err2.Error(), "not found") {
slog.Warn("telegram: edit impossible, sending new message", "err", err2)
return p.sendNewMessage(ctx, h, content) // fallback to fresh send
}
return fmt.Errorf("telegram: edit message: %w", err2)
} Defensive patterns
Strategy: try-catch
Validate before calling
if time.Since(sentAt) > 48*time.Hour {
return errors.New("message past Telegram edit window; send new message instead")
} Try / catch
err := p.UpdateMessage(ctx, handle, content)
if err != nil {
switch {
case strings.Contains(err.Error(), "not modified"):
return nil // benign
case strings.Contains(err.Error(), "can't be edited"), strings.Contains(err.Error(), "not found"):
return p.resendAsNew(ctx, handle, content)
default:
return fmt.Errorf("edit failed: %w", err)
}
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.
Related errors
- telegram: send preview: %w
- telegram: send chunk %d: %w
- max: edit message: HTTP %d: %s
- getMe: %w
- telegram: invalid session key %q
AI-assisted analysis of chenhg5/cc-connect@4000b2338a (2026-09-06).
Data as JSON: /api/errors/7f6d3ec5a237929f.
Report an issue: GitHub.