Налаштування
Оголосіть ConfigSchema — і модуль отримає інтерфейс налаштувань у .config, типізовану валідацію та збереження, нічого з цього не написавши.
Оголошення налаштувань
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 _ = варто залишити: він змушує компілятор підтвердити, що ви влучили в інтерфейс, замість того щоб метод мовчки ігнорувався.
Читання налаштувань
Значення лежать у базі під іменем вашого модуля:
units := m.DB.GetString(m.Name(), "units", "metric")
minutes := m.DB.GetInt(m.Name(), "cache_minutes", 10)Реакція на зміни
ConfigReady викликається під час старту й знову за кожної зміни налаштування. Поверніть помилку, щоб відхилити зміну — користувач її побачить, а попереднє значення залишиться.
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_ стає описом в інтерфейсі налаштувань:
func (m *Weather) Strings() map[string]string {
return map[string]string{
"name": "Weather",
"_cfg_units": "Одиниці температури: metric або imperial",
"_cfg_api_key": "Ключ API постачальника погоди",
"_cfg_cache_minutes": "Скільки хвилин кешувати прогноз для міста",
}
}