Відповіді
Answer
msg.Answer — те, що потрібно майже завжди:
return msg.Answer("🌤 <b>Ясно</b>, 22°C")Він редагує ваше власне повідомлення, якщо команду викликали ви, і відповідає, якщо хтось інший. Це юзербот-конвенція: ваша .weather перетворюється на результат, а не додає друге повідомлення.
Reply і Edit
Коли потрібна конкретна поведінка:
return msg.Reply("нове повідомлення в чаті")
return msg.Edit("замінити текст цього повідомлення")Форматування
Текст розбирається як Telegram HTML:
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 ламає повідомлення, якщо в ньому є < або &.
import "goroku/goroku/utils"
return msg.Answer("Ви написали: <code>" + utils.EscapeHTML(input) + "</code>")Опції
msg.Answer("без прев'ю", goroku.WithNoWebpage(true))
msg.Answer("у тему форуму", goroku.WithReplyTo(topicID))| Опція | Дія |
|---|---|
WithNoWebpage(bool) | Прибрати прев'ю посилання |
WithReplyTo(int64) | Відповісти на повідомлення або надіслати в тему форуму |
WithInvertMedia(bool) | Прев'ю над текстом |
WithWebPageMedia(url, optional, forceLarge) | Задати конкретне прев'ю |
Довгий вивід
Telegram обмежує повідомлення приблизно 4096 символами. Довгий результат надсилайте файлом:
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
}Прогрес довгої роботи
Відповідайте одразу, потім редагуйте по ходу:
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.