{"record":{"id":"c94fe43f27ff53c7","repo":"chenhg5/cc-connect","slug":"telegram-send-preview-w","errorCode":null,"errorMessage":"telegram: send preview: %w","messagePattern":"telegram: send preview: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"platform/telegram/telegram.go","lineNumber":1462,"sourceCode":"\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\tsent, err = bot.SendMessage(ctx, params)\n\t\t} else if strings.Contains(errMsg, \"message is too long\") {\n\t\t\t// Preview messages shouldn't be chunked; fall back to plain text\n\t\t\tslog.Warn(\"telegram: preview too long, sending as plain text\",\n\t\t\t\t\"method\", \"SendPreviewStart\",\n\t\t\t\t\"html_len\", len(html),\n\t\t\t\t\"content_len\", len(content),\n\t\t\t)\n\t\t\tparams.Text = content\n\t\t\tparams.ParseMode = \"\"\n\t\t\tsent, err = bot.SendMessage(ctx, params)\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"telegram: send preview: %w\", err)\n\t\t}\n\t}\n\treturn &telegramPreviewHandle{chatID: rc.chatID, threadID: rc.threadID, messageID: sent.ID}, nil\n}\n\n// UpdateMessage edits an existing message identified by previewHandle.\nfunc (p *Platform) UpdateMessage(ctx context.Context, previewHandle any, content string) error {\n\th, ok := previewHandle.(*telegramPreviewHandle)\n\tif !ok {\n\t\treturn fmt.Errorf(\"telegram: invalid preview handle type %T\", previewHandle)\n\t}\n\tbot, err := p.connectedBot(\"update message\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\thtml := core.MarkdownToSimpleHTML(content)\n\tslog.Debug(\"telegram: UpdateMessage\",","sourceCodeStart":1444,"sourceCodeEnd":1480,"githubUrl":"https://github.com/chenhg5/cc-connect/blob/4000b2338aa6e850c99df54f8b0ed6ed7460b401/platform/telegram/telegram.go#L1444-L1480","documentation":"SendPreviewStart (platform/telegram/telegram.go:1462) wraps any error returned by the Telegram Bot API SendMessage call with the 'telegram: send preview' prefix. The underlying error comes from go-telegram-bot/telegram (network failure, API error such as 'chat not found', 'bot was blocked by the user', or message parse failure after HTML fallback).","triggerScenarios":"Calling SendPreviewStart when the bot token is invalid, network is down, the chat ID no longer exists, the bot lacks permission to post in the chat, or both HTML and plain-text send attempts fail.","commonSituations":"Bot kicked from a group or blocked by a user between sessions; wrong chat ID in the reply context; Telegram API outages; message content rejected by the API even as plain text (e.g. too long).","solutions":["Unwrap the %w error and read the underlying Telegram API message (e.g. 'chat not found', 'Forbidden: bot was blocked')","Verify the bot is still a member of the target chat and has permission to send messages","Reconnect the bot (check bot token validity) via the platform's connect flow","If the message is too long, split or truncate content before previewing","Retry with exponential backoff on transient network/5xx errors"],"exampleFix":"// before\nif _, err := bot.SendMessage(ctx, params); err != nil {\n    return nil, err\n}\n// after\nsent, err := bot.SendMessage(ctx, params)\nif err != nil {\n    var apiErr *telegram.Error\n    if errors.As(err, &apiErr) && strings.Contains(apiErr.Message, \"chat not found\") {\n        return nil, fmt.Errorf(\"telegram: send preview: chat unavailable: %w\", err)\n    }\n    return retryable(err) // backoff and retry on 429/5xx\n}","handlingStrategy":"try-catch","validationCode":"if err := p.ensureConnected(ctx); err != nil {\n    return fmt.Errorf(\"bot not connected before preview: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"handle, err := p.SendPreviewStart(ctx, rc, content)\nvar apiErr *telegram.Error\nif err != nil && errors.As(err, &apiErr) {\n    if strings.Contains(apiErr.Message, \"chat not found\") || strings.Contains(apiErr.Message, \"blocked\") {\n        markChatUnavailable(rc.chatID)\n    } else if apiErr.Code == 429 {\n        time.AfterFunc(apiErr.RetryAfter, func() { retryPreview() })\n    }\n}","preventionTips":["Check bot connectivity before streaming previews","Monitor for 'bot was blocked by the user' / 'kicked from group' errors and disable that chat","Truncate preview content to Telegram's 4096-char limit before sending","Wrap API calls with retry/backoff for 429 and 5xx responses"],"tags":["telegram","api","network","send-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-14T00:17:10.932Z"}