v0.5.0

狀態訊息

最後更新


SendStatus 與 FinishStatus 在 handler 執行期間,為每個 Telegram chat 或 Discord channel 維持一則可編輯的「思考中」訊息。LINE 沒有 status API。

簽名


  1. // core/telegram
  2. func (b *Bot) SendStatus(ctx context.Context, chatID int64, replyTo int, text string, opts ...StatusOption) error
  3. func (b *Bot) FinishStatus(ctx context.Context, chatID int64) error
  4. // core/discord
  5. func (b *Bot) SendStatus(ctx context.Context, channelID, replyTo, text string, opts ...StatusOption) error
  6. func (b *Bot) FinishStatus(ctx context.Context, channelID string) error

選項


選項平台效果預設
WithStatusEmoji(emoji)Telegram、Discord加在 replyTo 訊息上的 reaction🤔(emoji 為 "" 時也用它)
WithStatusSendType(t SendType)Telegramstatus 文字的 parse mode(TypeMarkdown = MarkdownV2、TypeHTML)純文字

emoji 與 parse mode 由該 chat/channel 第一次 SendStatus 決定,之後傳入的選項會被忽略。status 訊息建立前,replyTo 取最近一次呼叫的值,建立後固定。Telegram 的 emoji 必須是 Telegram 允許的 reaction;函式庫不驗證。

更新流程


步驟行為
第一次 flush先在 replyTo 加 reaction(失敗只記 log),再把 status 文字以 reply 方式送到 replyTo。replyTo 為 0/"" 時兩者皆略過
之後的呼叫編輯同一則訊息
頻率每個 chat/channel 每秒最多一次送出或編輯。間隔內的呼叫只記下文字,由 timer 送出最新文字;中間的文字會被捨棄
相同文字不打 API 直接略過。Telegram 的 message is not modified 錯誤也會被忽略
回傳值立即 flush 時回傳送出/編輯的 error;排入佇列時回 nil

結束


FinishStatus 停止待執行的 timer,移除 bot 在 replyTo 上的 reaction(失敗只記 log),並刪除 status 訊息。該 chat/channel 沒有 status 時回 nil。
若有送出或編輯正在進行,FinishStatus 會等它結束後立即清理;若你的 ctx 先結束則提早回傳 ctx.Err()。Close() 會停止所有 status timer,但不刪除訊息。

範例


  1. bot.Reply(func(ctx context.Context, in telegram.Input) string {
  2. bot.SendStatus(ctx, in.ChatID, in.MessageID, "Searching...")
  3. result := work(ctx)
  4. bot.SendStatus(ctx, in.ChatID, in.MessageID, "Writing answer...")
  5. bot.FinishStatus(ctx, in.ChatID)
  6. return result
  7. })

相關頁面


EN