Skip to content

Вотчери

Вотчер бачить кожне повідомлення в кожному чаті, доступному акаунту, — не лише команди.

go
func (m *Mod) Watchers() []goroku.WatcherHandler {
	return []goroku.WatcherHandler{
		func(msg *goroku.Message) error {
			if strings.Contains(strings.ToLower(msg.Text), "goroku") {
				return msg.Reply("👋")
			}
			return nil
		},
	}
}

WatcherHandler влаштований так само, як обробник команди: func(msg *goroku.Message) error.

Фільтрація

Фільтруйте декларативно через WatcherMetas — вони зіставляються за позицією зі слайсом із Watchers. Диспетчер застосовує фільтр до вашого коду, що і зрозуміліше, і дешевше за if на початку кожного вотчера:

go
func (m *Mod) WatcherMetas() []goroku.CommandMeta {
	return []goroku.CommandMeta{
		{
			OnlyGroups:  true,
			NoForwarded: true,
			Contains:    "goroku",
		},
	}
}

Доступні ті самі поля, що й у CommandMeta.

Ціна

Вотчери виконуються на кожне повідомлення. Повільний або балакучий вотчер відчувається в усьому боті.

  • Повертайте nil одразу, якщо повідомлення не ваше. Найдешевша перевірка — першою.
  • Не пишіть у базу на кожне повідомлення — див. приклад із накопиченням у Сховищі.
  • Вотчери працюють паралельно в обмеженому пулі. Коли пул заповнений, виклики відкидаються, а не стають у чергу, — тобто повільний вотчер коштує вам пропущених повідомлень.
go
func(msg *goroku.Message) error {
	if msg.Out || msg.Text == "" {
		return nil // найдешевша відмова — першою
	}
	if !strings.Contains(msg.Text, "goroku") {
		return nil
	}
	return m.handle(msg)
}

Паніки

Паніка у вотчері перехоплюється й логується з іменем вашого модуля; бот продовжує працювати.

Вотчер чи команда?

Що використовуватиКоли
КомандуКористувач явно про щось просить
ВотчерВи реагуєте на звичайну розмову

Якщо всередині вотчера ви розбираєте префікс — вам потрібна команда.

Released under the GNU AGPL v3 License.