v0.5.0

Telegram 互動

最後更新


本頁說明 core/telegram 的自由文字輸入、單選與多選提示,以及各自的答案如何回到 Reply handler。
三個方法都接收 (ctx, chatID int64, replyTo int, text string, ...),回傳 prompt 的 *models.Message;text 為空時回 text is required,並接受 WithSendType 設定 prompt 的 parse mode。replyTo > 0 時 prompt 以 reply 方式掛在該訊息下。

自由文字輸入:SendInput


  1. prompt, err := bot.SendInput(ctx, in.ChatID, in.MessageID, "What is your name?")

prompt 帶 ForceReply,使用者端會以 reply 模式開啟鍵盤。答案以一般 message update 抵達:in.Text 是答案,in.Raw.Message.ReplyToMessage.ID 等於 prompt.ID。函式庫不保存 input prompt 的狀態;答案與 prompt 的對應由你的 handler 處理。

單選:SendSelect


  1. prompt, err := bot.SendSelect(ctx, in.ChatID, in.MessageID, "Pick a color", []string{"Red", "Green", "Blue"})

步驟行為
送出每個非空項目一個 inline button,每列一個;按鈕文字與 callback data 都是該項目。至少需要一個非空項目
點擊函式庫回應 callback query、清除 prompt 上的鍵盤,再以 CallbackData = 該項目、MessageID = prompt ID 呼叫 Reply

Telegram 限制 callback data 為 64 bytes,較長的項目會在送出 prompt 時被 Telegram 拒絕。

多選:SendMultiSelect


  1. prompt, err := bot.SendMultiSelect(ctx, in.ChatID, in.MessageID, "Pick toppings", []string{"Cheese", "Ham", "Olive"})

步驟行為
送出每個非空項目一個 toggle 按鈕(⬜ item),最後一列為 Done 按鈕。項目 __bot_multiselect_done__ 為保留字,傳入會回 error
切換函式庫翻轉該項目並重繪鍵盤(✅ item),不呼叫 handler。每個 prompt 每秒最多重繪一次;快速連點會合併成一次編輯
Done函式庫清除鍵盤,並以 CallbackPicks = 依原順序排列的已選項目(未選時為空)、MessageID = prompt ID 呼叫一次 Reply

多選 prompt 的狀態以 chat 與 prompt ID 為 key 存在記憶體,按下 Done 5 分鐘後或 Close() 時移除。Done 之後的點擊會被忽略。

清理 prompt


select 鍵盤會自動移除,但 prompt 文字仍保留。要移除時呼叫 bot.Delete(ctx, chatID, prompt.ID),需要的話再用 Send reply 到原始訊息送出彙整。

相關頁面


EN