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.