Читання введення
Кожен обробник отримує *goroku.Message. Ці хелпери покривають майже весь розбір аргументів.
Args
Усе після слова команди, з обрізаними пробілами по краях:
// .say привіт усім
msg.Args() // "привіт усім"
// .say
msg.Args() // ""Внутрішні пробіли зберігаються — .say a b дає "a b" — тож це безпечно для тексту, який ви збираєтеся віддати дослівно.
ArgsList і Arg
Розбиття за пробілами:
// .ban 42 спам тут
msg.ArgsList() // []string{"42", "спам", "тут"}
msg.Arg(0) // "42"
msg.Arg(1) // "спам"
msg.Arg(9) // "" — без панікиArg не виходить за межі. Перевіряти довжину заздалегідь не потрібно:
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
Патерн, потрібний більшості команд: узяти надруковані аргументи, а якщо їх немає — текст повідомлення, на яке відповіли.
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 (у відповідь) → відмалює повідомлення, на яке відповілиПорожній результат означає, що немає ні того, ні іншого — вважайте це «робити нічого».
Повідомлення, на яке відповіли
Для всього, крім тексту, отримайте його повністю:
reply, err := msg.GetReplyMessage()
if err != nil || reply == nil {
return msg.Answer(m.T("reply_needed", "❌ <b>Відповідайте на повідомлення</b>"))
}
if reply.Media != nil {
// обробити вкладення
}Щоб вимагати відповідь, краще оголосити це декларативно — диспетчер відфільтрує до запуску обробника:
"mycmd": { OnlyReply: true },Поля Message
| Поле | Тип | Значення |
|---|---|---|
ID | int64 | ID повідомлення |
ChatID | int64 | Де надіслано |
SenderID | int64 | Хто надіслав |
Text | string | Текст із застосованим форматуванням |
RawText | string | Текст як надруковано |
Out | bool | Надіслано вами |
IsPrivate, IsGroup, IsChannel | bool | Тип чату |
Media | tg.MessageMediaClass | Вкладення, nil якщо немає |
ReplyToMsgID | int64 | 0, якщо це не відповідь |
IsForwarded | bool | Переслано звідкись |
Скасування
msg.Context() скасовується під час завершення бота. Передавайте його в усе довге:
req, err := http.NewRequestWithContext(msg.Context(), http.MethodGet, url, nil)
if err != nil {
return err
}
resp, err := http.DefaultClient.Do(req)Обробники, які його ігнорують, працювати не перестануть — завершення просто їх дочекається.