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, продовжують завантажуватися без змін.