Skip to content

Module ​

go
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.

Типы обработчиков ​

go
type CommandHandler func(msg *Message) error
type WatcherHandler func(msg *Message) error

Порядок жизненного цикла ​

создание → привязка Base → Init → [зарегистрирован] → ClientReady
                                          ↓
                                  команды / вотчеры
                                          ↓
                                      OnUnload

Минимальный модуль ​

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

Released under the GNU AGPL v3 License.