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.