Будова модуля
Кожен модуль реалізує goroku.Module. Вбудовування goroku.Base дає значення за замовчуванням для всього, крім Name і Commands, — лише ці два методи писати обов'язково.
type Module interface {
Name() string
Strings() map[string]string
Init(client *CustomTelegramClient, db *Database) error
ClientReady() error
OnUnload() error
OnDlmod() error
Commands() map[string]CommandHandler
Watchers() []WatcherHandler
}Обов'язкові
Name
Ідентичність модуля в .help, .unloadmod та інтерфейсі налаштувань. Це саме ім'я типу Go і ключ, під яким зберігаються ваші дані.
func (m *Weather) Name() string { return "Weather" }Commands
Зіставляє слово команди з обробником. Користувач набирає слово після префікса, тому "weather" перетворюється на .weather.
func (m *Weather) Commands() map[string]goroku.CommandHandler {
return map[string]goroku.CommandHandler{
"weather": m.WeatherCmd,
"forecast": m.ForecastCmd,
}
}CommandHandler — це func(msg *goroku.Message) error. Повернення помилки покаже її користувачу; диспетчер до того ж перехоплює паніки, тож падіння обробника не покладе бота.
Необов'язкові, зі значеннями з Base
Strings
Текст для користувача і джерело для m.T. Два префікси ключів особливі:
| Ключ | Значення |
|---|---|
name | Відображуване ім'я в .help |
_cls_doc | Що робить модуль |
_cmd_doc_<команда> | Що робить ця команда |
Усі інші ключі — ваші, діставайте їх через m.T.
func (m *Weather) Strings() map[string]string {
return map[string]string{
"name": "Weather",
"_cls_doc": "Погода в місті",
"_cmd_doc_weather": "[місто] — показати погоду",
"no_city": "❌ <b>Яке місто?</b>",
}
}Init
Виконується один раз під час реєстрації, до того як спрацює будь-яка команда. Base на цей момент уже заповнив m.Client, m.DB і m.Translator, тож Init потрібен лише для вашого власного налаштування.
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
}Викликайте m.Base.Init першим
Завантажувач заповнює поля до виклику Init, тому у звичайній роботі цей виклик зайвий. Усе одно залиште його: так модуль працюватиме й тоді, коли його створюють напряму в тесті, оминаючи завантажувач.
ClientReady
Виконується, коли з'єднання з Telegram встановлено. Сюди — усе, чому потрібен API під час старту; Init може відпрацювати раніше, ніж клієнт підключиться.
func (m *Weather) ClientReady() error {
me := m.Client.Me()
_ = me
return nil
}OnUnload
Виконується під час видалення модуля. Тут звільняйте горутини, таймери та файлові дескриптори.
func (m *Weather) OnUnload() error {
close(m.stop)
return nil
}WARNING
Паніка в OnUnload перехоплюється й логується, але модуль усе одно видаляється. Не покладайтеся на OnUnload там, де очищення критичне для коректності.
OnDlmod
Виконується одразу після встановлення через .dlmod. Зручно для одноразового привітання або початкового налаштування.
Watchers
Обробники, які бачать кожне повідомлення, а не лише команди. Див. Вотчери.
За межами інтерфейсу
Частина можливостей підключається окремими інтерфейсами — просто оголосіть метод, і Goroku його підхопить:
| Інтерфейс | Метод | Призначення |
|---|---|---|
ModuleWithMeta | CommandMetas() | Аліаси та обмеження |
ModuleWithConfigSchema | ConfigSchema() | Типізовані налаштування |
ModuleWithConfigReady | ConfigReady(map[string]any) | Реакція на зміну налаштувань |
ModuleWithTranslationAliases | TranslationAliases() | Додаткові імена файлів перекладу |
Повний перелік — у Необов'язкових інтерфейсах.