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

  1. Check the wrapped API message: 'not found' means recreate the message via a new Send instead of editing
  2. 'message can't be edited' means the message is too old — send a new message rather than editing
  3. Verify the bot still has permission to edit messages in the chat
  4. Skip 'message is not modified' errors when content is unchanged (already handled) to avoid spurious failures
  5. 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

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


AI-assisted analysis of chenhg5/cc-connect@4000b2338a (2026-09-06). Data as JSON: /api/errors/7f6d3ec5a237929f. Report an issue: GitHub.