Module
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
}Встраивание goroku.Base даёт все методы, кроме Name и Commands.
Методы
Name() string
Идентичность модуля — в .help, .unloadmod, интерфейсе настроек и как ключ владельца в хранилище. Должно быть уникальным среди загруженных модулей.
Strings() map[string]string
Переводимый текст. Особые префиксы ключей описаны в Переводах. Base возвращает nil, и это допустимо.
Init(client, db) error
Вызывается один раз при регистрации, до того как сработает любой обработчик. Base к этому моменту уже заполнил Client, DB и Translator.
Возврат ошибки прерывает регистрацию, и модуль не загружается.
ClientReady() error
Вызывается, когда клиент Telegram подключён. Для работы, которой нужен API; Init может выполниться раньше, чем появится соединение.
OnUnload() error
Вызывается при удалении модуля. Освободите горутины и дескрипторы.
Паника здесь перехватывается и логируется, удаление продолжается.
OnDlmod() error
Вызывается сразу после установки через .dlmod.
Commands() map[string]CommandHandler
Слово команды → обработчик. Ключ — то, что пользователь набирает после префикса, регистр не важен. Возврат nil допустим для модуля только с вотчерами.
Watchers() []WatcherHandler
Обработчики, вызываемые на каждое сообщение. Base возвращает nil.
Типы обработчиков
type CommandHandler func(msg *Message) error
type WatcherHandler func(msg *Message) errorПорядок жизненного цикла
создание → привязка Base → Init → [зарегистрирован] → ClientReady
↓
команды / вотчеры
↓
OnUnloadМинимальный модуль
package modules
import "goroku/goroku"
type Ping struct{ goroku.Base }
func (m *Ping) Name() string { return "Ping" }
func (m *Ping) Commands() map[string]goroku.CommandHandler {
return map[string]goroku.CommandHandler{
"ping": func(msg *goroku.Message) error { return msg.Answer("🏓 pong") },
}
}Реализация без Base
Base необязателен. Модуль, который сам реализует все восемь методов, работает точно так же, а модули, написанные до появления Base, продолжают загружаться без изменений.