Skip to content

応答

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 への代入で終わっているのはこのためです。

Released under the GNU AGPL v3 License.