Skip to content

Читання введення

Кожен обробник отримує *goroku.Message. Ці хелпери покривають майже весь розбір аргументів.

Args

Усе після слова команди, з обрізаними пробілами по краях:

go
// .say привіт усім
msg.Args() // "привіт усім"

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

Внутрішні пробіли зберігаються — .say a b дає "a b" — тож це безпечно для тексту, який ви збираєтеся віддати дослівно.

ArgsList і Arg

Розбиття за пробілами:

go
// .ban 42 спам тут
msg.ArgsList() // []string{"42", "спам", "тут"}
msg.Arg(0)     // "42"
msg.Arg(1)     // "спам"
msg.Arg(9)     // "" — без паніки

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

ПолеТипЗначення
IDint64ID повідомлення
ChatIDint64Де надіслано
SenderIDint64Хто надіслав
TextstringТекст із застосованим форматуванням
RawTextstringТекст як надруковано
OutboolНадіслано вами
IsPrivate, IsGroup, IsChannelboolТип чату
Mediatg.MessageMediaClassВкладення, nil якщо немає
ReplyToMsgIDint640, якщо це не відповідь
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.