Skip to content

Відповіді

Answer

msg.Answer — те, що потрібно майже завжди:

go
return msg.Answer("🌤 <b>Ясно</b>, 22°C")

Він редагує ваше власне повідомлення, якщо команду викликали ви, і відповідає, якщо хтось інший. Це юзербот-конвенція: ваша .weather перетворюється на результат, а не додає друге повідомлення.

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 обмежує повідомлення приблизно 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.