Skip to content

Настройки

Объявите ConfigSchema — и модуль получит интерфейс настроек в .config, типизированную валидацию и сохранение, ничего из этого не написав.

Объявление настроек

go
var _ goroku.ModuleWithConfigSchema = (*Weather)(nil)

func (m *Weather) ConfigSchema() []goroku.ConfigField {
	return []goroku.ConfigField{
		{
			Key:       "units",
			Type:      "choice",
			Default:   "metric",
			Validator: &goroku.ChoiceValidator{PossibleValues: []string{"metric", "imperial"}},
		},
		{
			Key:       "api_key",
			Type:      "string",
			Default:   "",
			Validator: &goroku.StringValidator{MaxLen: 128},
			Secret:    true,
		},
		{
			Key:       "cache_minutes",
			Type:      "int",
			Default:   10,
			Validator: &goroku.IntegerValidator{},
		},
	}
}

Строку var _ = стоит оставить: она заставляет компилятор подтвердить, что вы попали в интерфейс, вместо того чтобы метод молча игнорировался.

Чтение настроек

Значения лежат в базе под именем вашего модуля:

go
units := m.DB.GetString(m.Name(), "units", "metric")
minutes := m.DB.GetInt(m.Name(), "cache_minutes", 10)

Реакция на изменения

ConfigReady вызывается при старте и снова при каждом изменении настройки. Верните ошибку, чтобы отклонить изменение — пользователь её увидит, а прежнее значение останется.

go
func (m *Weather) ConfigReady(config map[string]any) error {
	units, ok := config["units"].(string)
	if !ok {
		return fmt.Errorf("units должен быть строкой, получено %T", config["units"])
	}

	m.mu.Lock()
	m.units = units
	m.mu.Unlock()
	return nil
}

Ругайтесь громко

Если значение непригодно, верните ошибку с описанием проблемы. Принять его и тихо ничего не сделать — оставить пользователя с настройкой, которая выглядит применённой, но не работает.

Типы полей и валидаторы

TypeВалидаторПримечания
bool&BooleanValidator{}
int&IntegerValidator{}Границы через Minimum/HasMin, Maximum/HasMax
float&FloatValidator{}
string&StringValidator{MaxLen: n}Также MinLen
choice&ChoiceValidator{PossibleValues: ...}Фиксированный набор
series&SeriesValidator{}Список значений
url&URLValidator{}
link&LinkValidator{}Ссылки Telegram
hidden&HiddenValidator{}Не показывается в интерфейсе

Также доступны: RegExpValidator, TelegramIDValidator, EmojiValidator, EntityLikeValidator, UnionValidator, NoneTypeValidator.

Секреты

Secret: true помечает значение как скрываемое в логах и заменяемое плейсхолдером в бэкапах. При восстановлении бэкапа живое значение сохраняется, а не затирается маркером.

Используйте для API-ключей, токенов и паролей. Стоит одно поле — убирает целый класс случайностей.

Описания настроек

Ключ в Strings с префиксом _cfg_ становится описанием в интерфейсе настроек:

go
func (m *Weather) Strings() map[string]string {
	return map[string]string{
		"name":              "Weather",
		"_cfg_units":        "Единицы температуры: metric или imperial",
		"_cfg_api_key":      "Ключ API поставщика погоды",
		"_cfg_cache_minutes": "Сколько минут кэшировать прогноз по городу",
	}
}

Released under the GNU AGPL v3 License.