Base
type Base struct {
Client *CustomTelegramClient
DB *Database
Translator *Translator
}Встройте его — и модулю понадобятся только Name и Commands.
type Weather struct{ goroku.Base }Поля
| Поле | Для чего |
|---|---|
Client | API Telegram — отправка файлов, разрешение пиров, инлайн-менеджер |
DB | Постоянное хранилище, см. Хранилище |
Translator | Основа для T; напрямую нужен редко |
Все три заполняются загрузчиком до вызова Init, поэтому доступны и в Init, и в ClientReady, и в командах, и в вотчерах.
Методы
T(key, def string) string
Перевод для key или def, если его нет. Заменяет хелпер getTrans, который раньше копировался в каждый модуль.
return msg.Answer(m.T("no_city", "❌ <b>Какой город?</b>"))Поиск идёт по goroku.modules.<имя>.<key> с именем модуля как написано, в нижнем регистре и в snake_case, затем по TranslationAliases.
Безопасен на nil-Base и на незарегистрированном модуле — вернёт def.
Init(client, db) error
Заполняет поля и возвращает nil. Переопределяйте свободно:
func (m *Weather) Init(client *goroku.CustomTelegramClient, db *goroku.Database) error {
if err := m.Base.Init(client, db); err != nil {
return err
}
m.cache = make(map[string]string)
return nil
}Загрузчик заполняет поля до вызова Init, так что вызов m.Base.Init в обычной работе избыточен. Оставьте его: так модуль работает и когда его создают напрямую в тесте.
ClientReady() / OnUnload() / OnDlmod() error
Возвращают nil. Переопределяйте нужные.
Strings() map[string]string
Возвращает nil. Переопределите, чтобы объявить текст.
Watchers() []WatcherHandler
Возвращает nil. Переопределите, чтобы смотреть все сообщения.
NewBase
func NewBase(client *CustomTelegramClient, db *Database) BaseДля модуля, созданного вручную, а не зарегистрированного через загрузчик, — внутренние хелперы и тесты:
mod := &Weather{Base: goroku.NewBase(client, db)}Встраивающий модуль здесь неизвестен, поэтому T возвращает значение по умолчанию, пока модуль не зарегистрирован.
Конфликты имён
Если в вашей структуре уже есть поле Client, DB или Translator, встраивание Base сделает имя неоднозначным. Переименуйте своё поле или обращайтесь через встроенную структуру явно: m.Base.Client.