Skip to content

入力の読み取り

すべてのハンドラは *goroku.Message を受け取ります。以下のヘルパーで引数の解析は ほぼ足ります。

Args

コマンド語より後ろすべて、前後の空白を除いたもの。

go
// .say こんにちは みなさん
msg.Args() // "こんにちは みなさん"

// .say
msg.Args() // ""

内部の空白は保たれます — .say a b"a b" になります。そのまま返したい テキストにも安全です。

ArgsList と Arg

空白で分割します。

go
// .ban 42 spam here
msg.ArgsList() // []string{"42", "spam", "here"}
msg.Arg(0)     // "42"
msg.Arg(1)     // "spam"
msg.Arg(9)     // "" — panic しない

Arg は範囲外でも安全です。事前に長さを調べる必要はありません。

go
func (m *Mod) BanCmd(msg *goroku.Message) error {
	id := msg.Arg(0)
	if id == "" {
		return msg.Answer(m.T("no_id", "❌ <b>誰をですか?</b>"))
	}
	reason := msg.Arg(1) // 省略時は "" で問題ありません
	return m.ban(id, reason)
}

ArgsOrReply

ほとんどのコマンドが欲しがる形です。入力された引数を使い、無ければ返信先の メッセージにフォールバックします。

go
func (m *HTML) HTMLCmd(msg *goroku.Message) error {
	code := msg.ArgsOrReply()
	if code == "" {
		return msg.Answer(m.T("no_args", "❌ <b>テキストを送るか返信してください</b>"))
	}
	return msg.Answer(code)
}

これで両方が動きます。

.html <b>やあ</b>        → 入力されたマークアップを描画
.html  (返信として)     → 返信先のメッセージを描画

空の結果はどちらも無かったという意味なので、「やることなし」として扱ってください。

返信先のメッセージ

テキスト以外が必要なら取得します。

go
reply, err := msg.GetReplyMessage()
if err != nil || reply == nil {
	return msg.Answer(m.T("reply_needed", "❌ <b>メッセージに返信してください</b>"))
}

if reply.Media != nil {
	// 添付を処理する
}

返信を必須にしたいなら宣言的な書き方のほうが良いです。ハンドラの実行前に ディスパッチャが弾きます。

go
"mycmd": { OnlyReply: true },

Message のフィールド

フィールド意味
IDint64メッセージ ID
ChatIDint64送信されたチャット
SenderIDint64送信者
Textstring書式適用後のテキスト
RawTextstring入力そのままのテキスト
Outbool自分が送信した
IsPrivate, IsGroup, IsChannelboolチャット種別
Mediatg.MessageMediaClass添付、無ければ nil
ReplyToMsgIDint64返信でなければ 0
IsForwardedbool転送されたもの

キャンセル

msg.Context() はボット終了時にキャンセルされます。時間のかかる処理には必ず渡し てください。

go
req, err := http.NewRequestWithContext(msg.Context(), http.MethodGet, url, nil)
if err != nil {
	return err
}
resp, err := http.DefaultClient.Do(req)

無視するハンドラも動作はします。終了処理がそれを待つだけです。

Released under the GNU AGPL v3 License.