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.