v0.5.0

Status Messages

Last updated

SendStatus and FinishStatus keep one editable "thinking" message per Telegram chat or Discord channel while your handler works. LINE has no status API.

Signatures

// core/telegram
func (b *Bot) SendStatus(ctx context.Context, chatID int64, replyTo int, text string, opts ...StatusOption) error
func (b *Bot) FinishStatus(ctx context.Context, chatID int64) error

// core/discord
func (b *Bot) SendStatus(ctx context.Context, channelID, replyTo, text string, opts ...StatusOption) error
func (b *Bot) FinishStatus(ctx context.Context, channelID string) error

Options

Option Platform Effect Default
WithStatusEmoji(emoji) Telegram, Discord Reaction added to the replyTo message 🤔 (also used when emoji is "")
WithStatusSendType(t SendType) Telegram Parse mode for the status text (TypeMarkdown = MarkdownV2, TypeHTML) plain text

The emoji and parse mode are captured by the first SendStatus call for that chat or channel; options passed later are ignored. replyTo is taken from the latest call until the status message has been created, then fixed. On Telegram the emoji must be one Telegram allows as a reaction; the library does not validate it.

Update flow

Step Behavior
First flush Adds the reaction to replyTo (failure is only logged), then sends the status text as a reply to replyTo. With replyTo zero / "", both the reaction and the reply link are skipped
Later calls Edit the same message
Rate At most one send or edit per second per chat/channel. A call inside that window stores the text and a timer flushes the latest text; intermediate texts are dropped
Same text Skipped without an API call. Telegram's message is not modified error is also ignored
Return value The send/edit error when the call flushed immediately; nil when the text was queued

Finish

FinishStatus stops the pending timer, removes the bot's reaction from replyTo (failure is only logged), and deletes the status message. It returns nil when there is no status for that chat or channel.

If a send or edit is in flight, FinishStatus waits for it and the cleanup runs right after it; it returns early with ctx.Err() if your ctx ends first. Close() stops all status timers without deleting messages.

Example

bot.Reply(func(ctx context.Context, in telegram.Input) string {
    bot.SendStatus(ctx, in.ChatID, in.MessageID, "Searching...")
    result := work(ctx)
    bot.SendStatus(ctx, in.ChatID, in.MessageID, "Writing answer...")
    bot.FinishStatus(ctx, in.ChatID)
    return result
})
中文