応答
Answer
ほとんどの場合は msg.Answer です。
go
return msg.Answer("🌤 <b>晴れ</b>、22°C")コマンドが自分のものなら自分のメッセージを編集し、他人が実行したなら返信します。 これがユーザーボットの流儀で、.weather が結果そのものに変わり、2つ目の メッセージを増やしません。
Reply と Edit
特定の挙動が必要なとき。
go
return msg.Reply("チャットに新しいメッセージ")
return msg.Edit("このメッセージの本文を差し替える")書式
テキストは Telegram HTML として解釈されます。
go
msg.Answer("<b>太字</b> <i>斜体</i> <code>等幅</code>")
msg.Answer("<a href=\"https://goroku.dev\">リンク</a>")
msg.Answer("<blockquote>引用</blockquote>")使えるタグ: b, strong, i, em, u, s, del, code, pre, a, blockquote, tg-spoiler、プレミアム絵文字の tg-emoji。
利用者由来の文字列は必ずエスケープ
利用者のテキストをそのまま HTML に入れると、< や & が含まれた時点で メッセージが壊れます。
go
import "goroku/goroku/utils"
return msg.Answer("入力: <code>" + utils.EscapeHTML(input) + "</code>")オプション
go
msg.Answer("プレビューなし", goroku.WithNoWebpage(true))
msg.Answer("フォーラムのトピックへ", goroku.WithReplyTo(topicID))| オプション | 効果 |
|---|---|
WithNoWebpage(bool) | リンクプレビューを抑制 |
WithReplyTo(int64) | メッセージへ返信、またはフォーラムのトピックへ投稿 |
WithInvertMedia(bool) | プレビューをテキストの上に |
WithWebPageMedia(url, optional, forceLarge) | プレビューを指定 |
長い出力
Telegram の1メッセージは約4096文字までです。長い結果はファイルで送ります。
go
import (
"bytes"
"goroku/goroku"
)
func (m *Mod) DumpCmd(msg *goroku.Message) error {
report := m.buildLongReport()
if len(report) < 3500 {
return msg.Answer("<pre>" + report + "</pre>")
}
_, err := m.Client.SendFile(
goroku.ChatRefID(msg.ChatID),
bytes.NewReader([]byte(report)),
"📄 完全なレポート",
)
return err
}時間のかかる処理の進捗
すぐ応答し、進行に応じて編集します。
go
func (m *Mod) SlowCmd(msg *goroku.Message) error {
if err := msg.Answer("⏳ <b>処理中…</b>"); err != nil {
return err
}
result, err := m.doSlowThing(msg.Context())
if err != nil {
return err
}
return msg.Answer(result)
}自動応答
ハンドラが msg.Text を変更して Answer を一度も呼ばなかった場合、 ディスパッチャが新しいテキストを送信します。明示したほうが読みやすいのですが、 組み込みモジュールのいくつかが msg.Text への代入で終わっているのはこのためです。