Skip to content

Будова модуля

Кожен модуль реалізує goroku.Module. Вбудовування goroku.Base дає значення за замовчуванням для всього, крім Name і Commands, — лише ці два методи писати обов'язково.

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
}

Обов'язкові

Name

Ідентичність модуля в .help, .unloadmod та інтерфейсі налаштувань. Це саме ім'я типу Go і ключ, під яким зберігаються ваші дані.

go
func (m *Weather) Name() string { return "Weather" }

Commands

Зіставляє слово команди з обробником. Користувач набирає слово після префікса, тому "weather" перетворюється на .weather.

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

go
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 потрібен лише для вашого власного налаштування.

go
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 може відпрацювати раніше, ніж клієнт підключиться.

go
func (m *Weather) ClientReady() error {
	me := m.Client.Me()
	_ = me
	return nil
}

OnUnload

Виконується під час видалення модуля. Тут звільняйте горутини, таймери та файлові дескриптори.

go
func (m *Weather) OnUnload() error {
	close(m.stop)
	return nil
}

WARNING

Паніка в OnUnload перехоплюється й логується, але модуль усе одно видаляється. Не покладайтеся на OnUnload там, де очищення критичне для коректності.

OnDlmod

Виконується одразу після встановлення через .dlmod. Зручно для одноразового привітання або початкового налаштування.

Watchers

Обробники, які бачать кожне повідомлення, а не лише команди. Див. Вотчери.

За межами інтерфейсу

Частина можливостей підключається окремими інтерфейсами — просто оголосіть метод, і Goroku його підхопить:

ІнтерфейсМетодПризначення
ModuleWithMetaCommandMetas()Аліаси та обмеження
ModuleWithConfigSchemaConfigSchema()Типізовані налаштування
ModuleWithConfigReadyConfigReady(map[string]any)Реакція на зміну налаштувань
ModuleWithTranslationAliasesTranslationAliases()Додаткові імена файлів перекладу

Повний перелік — у Необов'язкових інтерфейсах.

Released under the GNU AGPL v3 License.