Вотчери
Вотчер бачить кожне повідомлення в кожному чаті, доступному акаунту, — не лише команди.
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)
}Паніки
Паніка у вотчері перехоплюється й логується з іменем вашого модуля; бот продовжує працювати.
Вотчер чи команда?
| Що використовувати | Коли |
|---|---|
| Команду | Користувач явно про щось просить |
| Вотчер | Ви реагуєте на звичайну розмову |
Якщо всередині вотчера ви розбираєте префікс — вам потрібна команда.