狀態訊息
最後更新
SendStatus 與 FinishStatus 在 handler 執行期間,為每個 Telegram chat 或 Discord channel 維持一則可編輯的「思考中」訊息。LINE 沒有 status API。簽名
- // 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
選項
| 選項 | 平台 | 效果 | 預設 |
|---|---|---|---|
WithStatusEmoji(emoji) | Telegram、Discord | 加在 replyTo 訊息上的 reaction | 🤔(emoji 為 "" 時也用它) |
WithStatusSendType(t SendType) | Telegram | status 文字的 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,但不刪除訊息。範例
- 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
- })