This repository has been archived by the owner on Jun 17, 2023. It is now read-only.
/
config.go
89 lines (78 loc) · 2.21 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package gonebot
import (
"fmt"
"os"
"strings"
"github.com/mitchellh/mapstructure"
"gopkg.in/yaml.v3"
)
type Config interface {
GetBaseConfig() *BaseConfig
}
type PluginConfigMap map[string]interface{} // 插件配置
type ProviderConfigMap map[string]interface{} // 服务提供者配置
type BaseConfig struct {
// Websocket WebsocketConfig `yaml:"websocket"`
CmdPrefix []string `yaml:"cmd_prefix"` // 命令前缀
Superuser []int64 `yaml:"superuser"` // 超级用户
ApiCallTimeout int `yaml:"apicall_timeout"` // API调用超时时间,单位:秒
Plugin struct {
Enable map[string]bool `yaml:"enable"`
Config map[string]PluginConfigMap `yaml:"config"`
} `yaml:"plugin"`
Provider string `yaml:"provider"`
ProviderConfig map[string]ProviderConfigMap `yaml:"provider_config"`
}
func (mp ProviderConfigMap) DecodeTo(v interface{}) error {
decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
MatchName: func(mapKey, fieldName string) bool {
switch {
case mapKey == camelCaseToSnakeCase(fieldName):
return true
case mapKey == fieldName:
return true
case mapKey == strings.ToLower(fieldName[:1])+fieldName[1:]:
return true
}
return false
},
Result: v,
})
if err != nil {
return err
}
return decoder.Decode(mp)
}
func (cfg *BaseConfig) GetBaseConfig() *BaseConfig {
return cfg
}
// 载入配置文件
func LoadConfig(path string) *BaseConfig {
yamlFile, err := os.Open(path)
if err != nil {
err = fmt.Errorf("打开配置文件失败:%s", err)
panic(err)
}
defer yamlFile.Close()
var cfg BaseConfig
err = yaml.NewDecoder(yamlFile).Decode(&cfg)
if err != nil {
err = fmt.Errorf("解析配置文件失败:%s", err)
panic(err)
}
return &cfg
}
// 载入自定义配置文件,文件为YAML。自定义配置的结构体必须继承BaseConfig
func LoadCustomConfig(path string, cfgPtr Config) {
yamlFile, err := os.Open(path)
if err != nil {
err = fmt.Errorf("打开配置文件失败:%s", err)
panic(err)
}
defer yamlFile.Close()
err = yaml.NewDecoder(yamlFile).Decode(cfgPtr)
if err != nil {
err = fmt.Errorf("解析配置文件失败:%s", err)
panic(err)
}
}