Настройки
Объявите 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": "Сколько минут кэшировать прогноз по городу",
}
}