# 狀態訊息

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

## 簽名

```go
// 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，但不刪除訊息。

## 範例

```go
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
})
```

## 相關頁面

- [Reply Handler](/zh/reply-handler)
- [Telegram API](/zh/api-reference-telegram)、[Discord API](/zh/api-reference-discord)
