設定
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 キー、トークン、パスワードに使ってください。1フィールドの手間で、事故の一群を まとめて消せます。
設定に説明を付ける
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": "都市の予報をキャッシュする分数",
}
}