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/HasMinMaximum/HasMax
float&FloatValidator{}
string&StringValidator{MaxLen: n}MinLen
choice&ChoiceValidator{PossibleValues: ...}固定の選択肢
series&SeriesValidator{}値のリスト
url&URLValidator{}
link&LinkValidator{}Telegram のリンク
hidden&HiddenValidator{}画面に出さない

他に RegExpValidatorTelegramIDValidatorEmojiValidatorEntityLikeValidatorUnionValidatorNoneTypeValidator があります。

秘密情報

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": "都市の予報をキャッシュする分数",
	}
}

Released under the GNU AGPL v3 License.