From ddd51e6ca3058866149df51971726621fb45dcf0 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Sun, 26 Sep 2021 13:32:40 +0800 Subject: [PATCH 1/2] style: move global/config to internal/config --- coolq/bot.go | 18 +++----- internal/base/flag.go | 33 +++++++++++--- {global => internal}/config/config.go | 22 +++++----- .../config/default_config.yml | 0 main.go | 43 +++++++++---------- server/http.go | 2 +- server/pprof.go | 2 +- server/scf.go | 2 +- server/websocket.go | 2 +- 9 files changed, 69 insertions(+), 55 deletions(-) rename {global => internal}/config/config.go (96%) rename {global => internal}/config/default_config.yml (100%) diff --git a/coolq/bot.go b/coolq/bot.go index 5ff9b36..b654acb 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -24,8 +24,8 @@ import ( "github.com/syndtr/goleveldb/leveldb/opt" "github.com/Mrs4s/go-cqhttp/global" - "github.com/Mrs4s/go-cqhttp/global/config" "github.com/Mrs4s/go-cqhttp/internal/base" + "github.com/Mrs4s/go-cqhttp/internal/config" ) // CQBot CQBot结构体,存储Bot实例相关配置 @@ -69,12 +69,12 @@ func (e *Event) JSONString() string { } // NewQQBot 初始化一个QQBot实例 -func NewQQBot(cli *client.QQClient, conf *config.Config) *CQBot { +func NewQQBot(cli *client.QQClient) *CQBot { bot := &CQBot{ Client: cli, } enableLevelDB := false - node, ok := conf.Database["leveldb"] + node, ok := base.Database["leveldb"] if ok { lconf := new(config.LevelDBConfig) _ = node.Decode(lconf) @@ -96,7 +96,7 @@ func NewQQBot(cli *client.QQClient, conf *config.Config) *CQBot { } bot.Client.OnPrivateMessage(bot.privateMessageEvent) bot.Client.OnGroupMessage(bot.groupMessageEvent) - if conf.Message.ReportSelfMessage { + if base.ReportSelfMessage { bot.Client.OnSelfPrivateMessage(bot.privateMessageEvent) bot.Client.OnSelfGroupMessage(bot.groupMessageEvent) } @@ -121,15 +121,11 @@ func NewQQBot(cli *client.QQClient, conf *config.Config) *CQBot { bot.Client.OnOtherClientStatusChanged(bot.otherClientStatusChangedEvent) bot.Client.OnGroupDigest(bot.groupEssenceMsg) go func() { - i := conf.Heartbeat.Interval - if i < 0 || conf.Heartbeat.Disabled { + if base.HeartbeatInterval == 0 { log.Warn("警告: 心跳功能已关闭,若非预期,请检查配置文件。") return } - if i == 0 { - i = 5 - } - t := time.NewTicker(time.Second * time.Duration(i)) + t := time.NewTicker(base.HeartbeatInterval) for { <-t.C bot.dispatchEventMessage(global.MSG{ @@ -138,7 +134,7 @@ func NewQQBot(cli *client.QQClient, conf *config.Config) *CQBot { "post_type": "meta_event", "meta_event_type": "heartbeat", "status": bot.CQGetStatus()["data"], - "interval": 1000 * i, + "interval": base.HeartbeatInterval.Milliseconds(), }) } }() diff --git a/internal/base/flag.go b/internal/base/flag.go index 6150776..c96eebe 100644 --- a/internal/base/flag.go +++ b/internal/base/flag.go @@ -6,8 +6,9 @@ import ( "time" log "github.com/sirupsen/logrus" + "gopkg.in/yaml.v3" - "github.com/Mrs4s/go-cqhttp/global/config" + "github.com/Mrs4s/go-cqhttp/internal/config" ) // command flags @@ -27,16 +28,23 @@ var ( SplitURL bool // 是否分割URL ForceFragmented bool // 是否启用强制分片 SkipMimeScan bool // 是否跳过Mime扫描 + ReportSelfMessage bool // 是否上报自身消息 UseSSOAddress bool // 是否使用服务器下发的新地址进行重连 LogForceNew bool // 是否在每次启动时强制创建全新的文件储存日志 FastStart bool // 是否为快速启动 - PostFormat string // 上报格式 string or array - Proxy string // 存储 proxy_rewrite,用于设置代理 - PasswordHash [16]byte // 存储QQ密码哈希供登录使用 - AccountToken []byte // 存储 AccountToken 供登录使用 - Reconnect *config.Reconnect // 重连配置 - LogAging = time.Hour * 24 * 365 // 日志时效 + PostFormat string // 上报格式 string or array + Proxy string // 存储 proxy_rewrite,用于设置代理 + PasswordHash [16]byte // 存储QQ密码哈希供登录使用 + AccountToken []byte // 存储 AccountToken 供登录使用 + Account *config.Account // 账户配置 + Reconnect *config.Reconnect // 重连配置 + LogLevel string // 日志等级 + LogAging = time.Hour * 24 * 365 // 日志时效 + HeartbeatInterval = time.Second * 5 // 心跳间隔 + + Servers []map[string]yaml.Node // 连接服务列表 + Database map[string]yaml.Node // 数据库列表 ) // Parse parse flags @@ -67,11 +75,16 @@ func Init() { ExtraReplyData = conf.Message.ExtraReplyData ForceFragmented = conf.Message.ForceFragment SkipMimeScan = conf.Message.SkipMimeScan + ReportSelfMessage = conf.Message.ReportSelfMessage UseSSOAddress = conf.Account.UseSSOAddress } { // others Proxy = conf.Message.ProxyRewrite + Account = conf.Account Reconnect = conf.Account.ReLogin + Servers = conf.Servers + Database = conf.Database + LogLevel = conf.Output.LogLevel if conf.Message.PostFormat != "string" && conf.Message.PostFormat != "array" { log.Warnf("post-format 配置错误, 将自动使用 string") PostFormat = "string" @@ -81,5 +94,11 @@ func Init() { if conf.Output.LogAging > 0 { LogAging = time.Hour * 24 * time.Duration(conf.Output.LogAging) } + if conf.Heartbeat.Interval > 0 { + HeartbeatInterval = time.Second * time.Duration(conf.Heartbeat.Interval) + } + if conf.Heartbeat.Disabled || conf.Heartbeat.Interval < 0 { + HeartbeatInterval = 0 + } } } diff --git a/global/config/config.go b/internal/config/config.go similarity index 96% rename from global/config/config.go rename to internal/config/config.go index 39fff1f..9292da9 100644 --- a/global/config/config.go +++ b/internal/config/config.go @@ -34,17 +34,19 @@ type Reconnect struct { Interval int `yaml:"interval"` } +// Account 账号配置 +type Account struct { + Uin int64 `yaml:"uin"` + Password string `yaml:"password"` + Encrypt bool `yaml:"encrypt"` + Status int `yaml:"status"` + ReLogin *Reconnect `yaml:"relogin"` + UseSSOAddress bool `yaml:"use-sso-address"` +} + // Config 总配置文件 type Config struct { - Account struct { - Uin int64 `yaml:"uin"` - Password string `yaml:"password"` - Encrypt bool `yaml:"encrypt"` - Status int `yaml:"status"` - ReLogin *Reconnect `yaml:"relogin"` - UseSSOAddress bool `yaml:"use-sso-address"` - } `yaml:"account"` - + Account *Account `yaml:"account"` Heartbeat struct { Disabled bool `yaml:"disabled"` Interval int `yaml:"interval"` @@ -52,10 +54,10 @@ type Config struct { Message struct { PostFormat string `yaml:"post-format"` + ProxyRewrite string `yaml:"proxy-rewrite"` IgnoreInvalidCQCode bool `yaml:"ignore-invalid-cqcode"` ForceFragment bool `yaml:"force-fragment"` FixURL bool `yaml:"fix-url"` - ProxyRewrite string `yaml:"proxy-rewrite"` ReportSelfMessage bool `yaml:"report-self-message"` RemoveReplyAt bool `yaml:"remove-reply-at"` ExtraReplyData bool `yaml:"extra-reply-data"` diff --git a/global/config/default_config.yml b/internal/config/default_config.yml similarity index 100% rename from global/config/default_config.yml rename to internal/config/default_config.yml diff --git a/main.go b/main.go index d0f0cba..9e1b5ff 100644 --- a/main.go +++ b/main.go @@ -28,9 +28,9 @@ import ( "github.com/Mrs4s/go-cqhttp/coolq" "github.com/Mrs4s/go-cqhttp/global" - "github.com/Mrs4s/go-cqhttp/global/config" "github.com/Mrs4s/go-cqhttp/global/terminal" "github.com/Mrs4s/go-cqhttp/internal/base" + "github.com/Mrs4s/go-cqhttp/internal/config" "github.com/Mrs4s/go-cqhttp/internal/selfupdate" "github.com/Mrs4s/go-cqhttp/server" ) @@ -56,9 +56,6 @@ func main() { } base.Init() - // todo: do all config parse in internal/base? - conf := config.Get() - rotateOptions := []rotatelogs.Option{ rotatelogs.WithRotationTime(time.Hour * 24), } @@ -71,7 +68,7 @@ func main() { log.Errorf("rotatelogs init err: %v", err) panic(err) } - log.AddHook(global.NewLocalHook(w, global.LogFormat{}, global.GetLogLevel(conf.Output.LogLevel)...)) + log.AddHook(global.NewLocalHook(w, global.LogFormat{}, global.GetLogLevel(base.LogLevel)...)) mkCacheDir := func(path string, _type string) { if !global.PathExists(path) { @@ -117,7 +114,7 @@ func main() { return } - if (conf.Account.Uin == 0 || (conf.Account.Password == "" && !conf.Account.Encrypt)) && !global.PathExists("session.token") { + if (base.Account.Uin == 0 || (base.Account.Password == "" && !base.Account.Encrypt)) && !global.PathExists("session.token") { log.Warn("账号密码未配置, 将使用二维码登录.") if !base.FastStart { log.Warn("将在 5秒 后继续.") @@ -145,22 +142,22 @@ func main() { } } - if conf.Account.Encrypt { + if base.Account.Encrypt { if !global.PathExists("password.encrypt") { - if conf.Account.Password == "" { + if base.Account.Password == "" { log.Error("无法进行加密,请在配置文件中的添加密码后重新启动.") readLine() os.Exit(0) } log.Infof("密码加密已启用, 请输入Key对密码进行加密: (Enter 提交)") byteKey, _ = term.ReadPassword(int(os.Stdin.Fd())) - base.PasswordHash = md5.Sum([]byte(conf.Account.Password)) + base.PasswordHash = md5.Sum([]byte(base.Account.Password)) _ = os.WriteFile("password.encrypt", []byte(PasswordHashEncrypt(base.PasswordHash[:], byteKey)), 0o644) log.Info("密码已加密,为了您的账号安全,请删除配置文件中的密码后重新启动.") readLine() os.Exit(0) } else { - if conf.Account.Password != "" { + if base.Account.Password != "" { log.Error("密码已加密,为了您的账号安全,请删除配置文件中的密码后重新启动.") readLine() os.Exit(0) @@ -194,8 +191,8 @@ func main() { } copy(base.PasswordHash[:], ph) } - } else if len(conf.Account.Password) > 0 { - base.PasswordHash = md5.Sum([]byte(conf.Account.Password)) + } else if len(base.Account.Password) > 0 { + base.PasswordHash = md5.Sum([]byte(base.Account.Password)) } if !base.FastStart { log.Info("Bot将在5秒后登录并开始信息处理, 按 Ctrl+C 取消.") @@ -218,7 +215,7 @@ func main() { return "未知" }()) cli = newClient() - isQRCodeLogin := (conf.Account.Uin == 0 || len(conf.Account.Password) == 0) && !conf.Account.Encrypt + isQRCodeLogin := (base.Account.Uin == 0 || len(base.Account.Password) == 0) && !base.Account.Encrypt isTokenLogin := false saveToken := func() { base.AccountToken = cli.GenToken() @@ -227,11 +224,11 @@ func main() { if global.PathExists("session.token") { token, err := os.ReadFile("session.token") if err == nil { - if conf.Account.Uin != 0 { + if base.Account.Uin != 0 { r := binary.NewReader(token) cu := r.ReadInt64() - if cu != conf.Account.Uin { - log.Warnf("警告: 配置文件内的QQ号 (%v) 与缓存内的QQ号 (%v) 不相同", conf.Account.Uin, cu) + if cu != base.Account.Uin { + log.Warnf("警告: 配置文件内的QQ号 (%v) 与缓存内的QQ号 (%v) 不相同", base.Account.Uin, cu) log.Warnf("1. 使用会话缓存继续.") log.Warnf("2. 删除会话缓存并重启.") log.Warnf("请选择: (5秒后自动选1)") @@ -255,8 +252,8 @@ func main() { } } } - if conf.Account.Uin != 0 && base.PasswordHash != [16]byte{} { - cli.Uin = conf.Account.Uin + if base.Account.Uin != 0 && base.PasswordHash != [16]byte{} { + cli.Uin = base.Account.Uin cli.PasswordMd5 = base.PasswordHash } if !isTokenLogin { @@ -329,12 +326,12 @@ func main() { log.Infof("开始加载群列表...") global.Check(cli.ReloadGroupList(), true) log.Infof("共加载 %v 个群.", len(cli.GroupList)) - if uint(conf.Account.Status) >= uint(len(allowStatus)) { - conf.Account.Status = 0 + if uint(base.Account.Status) >= uint(len(allowStatus)) { + base.Account.Status = 0 } - cli.SetOnlineStatus(allowStatus[conf.Account.Status]) - bot := coolq.NewQQBot(cli, conf) - for _, m := range conf.Servers { + cli.SetOnlineStatus(allowStatus[base.Account.Status]) + bot := coolq.NewQQBot(cli) + for _, m := range base.Servers { if h, ok := m["http"]; ok { hc := new(config.HTTPServer) if err := h.Decode(hc); err != nil { diff --git a/server/http.go b/server/http.go index e7e1c3d..b5ba048 100644 --- a/server/http.go +++ b/server/http.go @@ -21,7 +21,7 @@ import ( "github.com/tidwall/gjson" "github.com/Mrs4s/go-cqhttp/coolq" - "github.com/Mrs4s/go-cqhttp/global/config" + "github.com/Mrs4s/go-cqhttp/internal/config" ) type httpServer struct { diff --git a/server/pprof.go b/server/pprof.go index d6202c6..d1e30b1 100644 --- a/server/pprof.go +++ b/server/pprof.go @@ -9,7 +9,7 @@ import ( log "github.com/sirupsen/logrus" - "github.com/Mrs4s/go-cqhttp/global/config" + "github.com/Mrs4s/go-cqhttp/internal/config" ) // RunPprofServer 启动 pprof 性能分析服务器 diff --git a/server/scf.go b/server/scf.go index 1caf983..3a4beff 100644 --- a/server/scf.go +++ b/server/scf.go @@ -16,7 +16,7 @@ import ( "github.com/Mrs4s/go-cqhttp/coolq" "github.com/Mrs4s/go-cqhttp/global" - "github.com/Mrs4s/go-cqhttp/global/config" + "github.com/Mrs4s/go-cqhttp/internal/config" ) type lambdaClient struct { diff --git a/server/websocket.go b/server/websocket.go index 3e7273e..6d1000c 100644 --- a/server/websocket.go +++ b/server/websocket.go @@ -12,7 +12,7 @@ import ( "github.com/Mrs4s/go-cqhttp/coolq" "github.com/Mrs4s/go-cqhttp/global" - "github.com/Mrs4s/go-cqhttp/global/config" + "github.com/Mrs4s/go-cqhttp/internal/config" "github.com/Mrs4s/MiraiGo/utils" "github.com/gorilla/websocket" From 1337d3f1f31bdab5d31a8f5d7fde34a6284c48b8 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Sun, 26 Sep 2021 19:41:03 +0800 Subject: [PATCH 2/2] style: move internal/config to modules/config config should not be internal, maybe some module need it. --- coolq/bot.go | 2 +- internal/base/flag.go | 11 +- main.go | 2 +- {internal => modules}/config/config.go | 199 ++++++++---------- .../config/default_config.yml | 0 server/http.go | 2 +- server/pprof.go | 2 +- server/scf.go | 2 +- server/websocket.go | 2 +- 9 files changed, 101 insertions(+), 121 deletions(-) rename {internal => modules}/config/config.go (61%) rename {internal => modules}/config/default_config.yml (100%) diff --git a/coolq/bot.go b/coolq/bot.go index b654acb..f5507a4 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -25,7 +25,7 @@ import ( "github.com/Mrs4s/go-cqhttp/global" "github.com/Mrs4s/go-cqhttp/internal/base" - "github.com/Mrs4s/go-cqhttp/internal/config" + "github.com/Mrs4s/go-cqhttp/modules/config" ) // CQBot CQBot结构体,存储Bot实例相关配置 diff --git a/internal/base/flag.go b/internal/base/flag.go index c96eebe..85c5ef1 100644 --- a/internal/base/flag.go +++ b/internal/base/flag.go @@ -3,12 +3,14 @@ package base import ( "flag" + "os" + "path" "time" log "github.com/sirupsen/logrus" "gopkg.in/yaml.v3" - "github.com/Mrs4s/go-cqhttp/internal/config" + "github.com/Mrs4s/go-cqhttp/modules/config" ) // command flags @@ -49,14 +51,15 @@ var ( // Parse parse flags func Parse() { - flag.StringVar(&LittleC, "c", config.DefaultConfigFile, "configuration filename") + wd, _ := os.Getwd() + dc := path.Join(wd, "config.yml") + flag.StringVar(&LittleC, "c", dc, "configuration filename") flag.BoolVar(&LittleD, "d", false, "running as a daemon") flag.BoolVar(&LittleH, "h", false, "this help") flag.StringVar(&LittleWD, "w", "", "cover the working directory") d := flag.Bool("D", false, "debug mode") flag.Parse() - config.DefaultConfigFile = LittleC // cover config file if *d { Debug = true } @@ -64,7 +67,7 @@ func Parse() { // Init read config from yml file func Init() { - conf := config.Get() + conf := config.Parse(LittleC) { // bool config if conf.Output.Debug { Debug = true diff --git a/main.go b/main.go index 9e1b5ff..cb71b6c 100644 --- a/main.go +++ b/main.go @@ -30,8 +30,8 @@ import ( "github.com/Mrs4s/go-cqhttp/global" "github.com/Mrs4s/go-cqhttp/global/terminal" "github.com/Mrs4s/go-cqhttp/internal/base" - "github.com/Mrs4s/go-cqhttp/internal/config" "github.com/Mrs4s/go-cqhttp/internal/selfupdate" + "github.com/Mrs4s/go-cqhttp/modules/config" "github.com/Mrs4s/go-cqhttp/server" ) diff --git a/internal/config/config.go b/modules/config/config.go similarity index 61% rename from internal/config/config.go rename to modules/config/config.go index 9292da9..31c4462 100644 --- a/internal/config/config.go +++ b/modules/config/config.go @@ -6,10 +6,8 @@ import ( _ "embed" // embed the default config file "fmt" "os" - "path" "strconv" "strings" - "sync" "github.com/Mrs4s/go-cqhttp/internal/param" @@ -21,11 +19,6 @@ import ( //go:embed default_config.yml var defaultConfig string -var currentPath = getCurrentPath() - -// DefaultConfigFile 默认配置文件路径 -var DefaultConfigFile = path.Join(currentPath, "config.yml") - // Reconnect 重连配置 type Reconnect struct { Disabled bool `yaml:"disabled"` @@ -144,113 +137,97 @@ type LevelDBConfig struct { Enable bool `yaml:"enable"` } -var ( - config *Config - once sync.Once -) +// Parse 从默认配置文件路径中获取 +func Parse(path string) *Config { + fromEnv := os.Getenv("GCQ_UIN") != "" -// Get 从默认配置文件路径中获取 -func Get() *Config { - once.Do(func() { - hasEnvironmentConf := os.Getenv("GCQ_UIN") != "" - - file, err := os.Open(DefaultConfigFile) - config = &Config{} - if err == nil { - defer func() { _ = file.Close() }() - if err = yaml.NewDecoder(file).Decode(config); err != nil && !hasEnvironmentConf { - log.Fatal("配置文件不合法!", err) - } - } else if !hasEnvironmentConf { - generateConfig() - os.Exit(0) + file, err := os.Open(path) + config := &Config{} + if err == nil { + defer func() { _ = file.Close() }() + if err = yaml.NewDecoder(file).Decode(config); err != nil && !fromEnv { + log.Fatal("配置文件不合法!", err) } - if hasEnvironmentConf { - // type convert tools - toInt64 := func(str string) int64 { - i, _ := strconv.ParseInt(str, 10, 64) - return i - } - - // load config from environment variable - param.SetAtDefault(&config.Account.Uin, toInt64(os.Getenv("GCQ_UIN")), int64(0)) - param.SetAtDefault(&config.Account.Password, os.Getenv("GCQ_PWD"), "") - param.SetAtDefault(&config.Account.Status, int32(toInt64(os.Getenv("GCQ_STATUS"))), int32(0)) - param.SetAtDefault(&config.Account.ReLogin.Disabled, !param.EnsureBool(os.Getenv("GCQ_RELOGIN_DISABLED"), true), false) - param.SetAtDefault(&config.Account.ReLogin.Delay, uint(toInt64(os.Getenv("GCQ_RELOGIN_DELAY"))), uint(0)) - param.SetAtDefault(&config.Account.ReLogin.MaxTimes, uint(toInt64(os.Getenv("GCQ_RELOGIN_MAX_TIMES"))), uint(0)) - dbConf := &LevelDBConfig{Enable: param.EnsureBool(os.Getenv("GCQ_LEVELDB"), true)} - if config.Database == nil { - config.Database = make(map[string]yaml.Node) - } - config.Database["leveldb"] = func() yaml.Node { - n := &yaml.Node{} - _ = n.Encode(dbConf) - return *n - }() - accessTokenEnv := os.Getenv("GCQ_ACCESS_TOKEN") - if os.Getenv("GCQ_HTTP_PORT") != "" { - node := &yaml.Node{} - httpConf := &HTTPServer{ - Host: "0.0.0.0", - Port: 5700, - MiddleWares: MiddleWares{ - AccessToken: accessTokenEnv, - }, - } - param.SetExcludeDefault(&httpConf.Disabled, param.EnsureBool(os.Getenv("GCQ_HTTP_DISABLE"), false), false) - param.SetExcludeDefault(&httpConf.Host, os.Getenv("GCQ_HTTP_HOST"), "") - param.SetExcludeDefault(&httpConf.Port, int(toInt64(os.Getenv("GCQ_HTTP_PORT"))), 0) - if os.Getenv("GCQ_HTTP_POST_URL") != "" { - httpConf.Post = append(httpConf.Post, struct { - URL string `yaml:"url"` - Secret string `yaml:"secret"` - }{os.Getenv("GCQ_HTTP_POST_URL"), os.Getenv("GCQ_HTTP_POST_SECRET")}) - } - _ = node.Encode(httpConf) - config.Servers = append(config.Servers, map[string]yaml.Node{"http": *node}) - } - if os.Getenv("GCQ_WS_PORT") != "" { - node := &yaml.Node{} - wsServerConf := &WebsocketServer{ - Host: "0.0.0.0", - Port: 6700, - MiddleWares: MiddleWares{ - AccessToken: accessTokenEnv, - }, - } - param.SetExcludeDefault(&wsServerConf.Disabled, param.EnsureBool(os.Getenv("GCQ_WS_DISABLE"), false), false) - param.SetExcludeDefault(&wsServerConf.Host, os.Getenv("GCQ_WS_HOST"), "") - param.SetExcludeDefault(&wsServerConf.Port, int(toInt64(os.Getenv("GCQ_WS_PORT"))), 0) - _ = node.Encode(wsServerConf) - config.Servers = append(config.Servers, map[string]yaml.Node{"ws": *node}) - } - if os.Getenv("GCQ_RWS_API") != "" || os.Getenv("GCQ_RWS_EVENT") != "" || os.Getenv("GCQ_RWS_UNIVERSAL") != "" { - node := &yaml.Node{} - rwsConf := &WebsocketReverse{ - MiddleWares: MiddleWares{ - AccessToken: accessTokenEnv, - }, - } - param.SetExcludeDefault(&rwsConf.Disabled, param.EnsureBool(os.Getenv("GCQ_RWS_DISABLE"), false), false) - param.SetExcludeDefault(&rwsConf.API, os.Getenv("GCQ_RWS_API"), "") - param.SetExcludeDefault(&rwsConf.Event, os.Getenv("GCQ_RWS_EVENT"), "") - param.SetExcludeDefault(&rwsConf.Universal, os.Getenv("GCQ_RWS_UNIVERSAL"), "") - _ = node.Encode(rwsConf) - config.Servers = append(config.Servers, map[string]yaml.Node{"ws-reverse": *node}) - } - } - }) - return config -} - -// getCurrentPath 获取当前文件的路径,直接返回string -func getCurrentPath() string { - cwd, e := os.Getwd() - if e != nil { - panic(e) + } else if !fromEnv { + generateConfig() + os.Exit(0) } - return cwd + if fromEnv { + // type convert tools + toInt64 := func(str string) int64 { + i, _ := strconv.ParseInt(str, 10, 64) + return i + } + + // load config from environment variable + param.SetAtDefault(&config.Account.Uin, toInt64(os.Getenv("GCQ_UIN")), int64(0)) + param.SetAtDefault(&config.Account.Password, os.Getenv("GCQ_PWD"), "") + param.SetAtDefault(&config.Account.Status, int32(toInt64(os.Getenv("GCQ_STATUS"))), int32(0)) + param.SetAtDefault(&config.Account.ReLogin.Disabled, !param.EnsureBool(os.Getenv("GCQ_RELOGIN_DISABLED"), true), false) + param.SetAtDefault(&config.Account.ReLogin.Delay, uint(toInt64(os.Getenv("GCQ_RELOGIN_DELAY"))), uint(0)) + param.SetAtDefault(&config.Account.ReLogin.MaxTimes, uint(toInt64(os.Getenv("GCQ_RELOGIN_MAX_TIMES"))), uint(0)) + dbConf := &LevelDBConfig{Enable: param.EnsureBool(os.Getenv("GCQ_LEVELDB"), true)} + if config.Database == nil { + config.Database = make(map[string]yaml.Node) + } + config.Database["leveldb"] = func() yaml.Node { + n := &yaml.Node{} + _ = n.Encode(dbConf) + return *n + }() + accessTokenEnv := os.Getenv("GCQ_ACCESS_TOKEN") + if os.Getenv("GCQ_HTTP_PORT") != "" { + node := &yaml.Node{} + httpConf := &HTTPServer{ + Host: "0.0.0.0", + Port: 5700, + MiddleWares: MiddleWares{ + AccessToken: accessTokenEnv, + }, + } + param.SetExcludeDefault(&httpConf.Disabled, param.EnsureBool(os.Getenv("GCQ_HTTP_DISABLE"), false), false) + param.SetExcludeDefault(&httpConf.Host, os.Getenv("GCQ_HTTP_HOST"), "") + param.SetExcludeDefault(&httpConf.Port, int(toInt64(os.Getenv("GCQ_HTTP_PORT"))), 0) + if os.Getenv("GCQ_HTTP_POST_URL") != "" { + httpConf.Post = append(httpConf.Post, struct { + URL string `yaml:"url"` + Secret string `yaml:"secret"` + }{os.Getenv("GCQ_HTTP_POST_URL"), os.Getenv("GCQ_HTTP_POST_SECRET")}) + } + _ = node.Encode(httpConf) + config.Servers = append(config.Servers, map[string]yaml.Node{"http": *node}) + } + if os.Getenv("GCQ_WS_PORT") != "" { + node := &yaml.Node{} + wsServerConf := &WebsocketServer{ + Host: "0.0.0.0", + Port: 6700, + MiddleWares: MiddleWares{ + AccessToken: accessTokenEnv, + }, + } + param.SetExcludeDefault(&wsServerConf.Disabled, param.EnsureBool(os.Getenv("GCQ_WS_DISABLE"), false), false) + param.SetExcludeDefault(&wsServerConf.Host, os.Getenv("GCQ_WS_HOST"), "") + param.SetExcludeDefault(&wsServerConf.Port, int(toInt64(os.Getenv("GCQ_WS_PORT"))), 0) + _ = node.Encode(wsServerConf) + config.Servers = append(config.Servers, map[string]yaml.Node{"ws": *node}) + } + if os.Getenv("GCQ_RWS_API") != "" || os.Getenv("GCQ_RWS_EVENT") != "" || os.Getenv("GCQ_RWS_UNIVERSAL") != "" { + node := &yaml.Node{} + rwsConf := &WebsocketReverse{ + MiddleWares: MiddleWares{ + AccessToken: accessTokenEnv, + }, + } + param.SetExcludeDefault(&rwsConf.Disabled, param.EnsureBool(os.Getenv("GCQ_RWS_DISABLE"), false), false) + param.SetExcludeDefault(&rwsConf.API, os.Getenv("GCQ_RWS_API"), "") + param.SetExcludeDefault(&rwsConf.Event, os.Getenv("GCQ_RWS_EVENT"), "") + param.SetExcludeDefault(&rwsConf.Universal, os.Getenv("GCQ_RWS_UNIVERSAL"), "") + _ = node.Encode(rwsConf) + config.Servers = append(config.Servers, map[string]yaml.Node{"ws-reverse": *node}) + } + } + return config } // generateConfig 生成配置文件 diff --git a/internal/config/default_config.yml b/modules/config/default_config.yml similarity index 100% rename from internal/config/default_config.yml rename to modules/config/default_config.yml diff --git a/server/http.go b/server/http.go index b5ba048..767c02c 100644 --- a/server/http.go +++ b/server/http.go @@ -21,7 +21,7 @@ import ( "github.com/tidwall/gjson" "github.com/Mrs4s/go-cqhttp/coolq" - "github.com/Mrs4s/go-cqhttp/internal/config" + "github.com/Mrs4s/go-cqhttp/modules/config" ) type httpServer struct { diff --git a/server/pprof.go b/server/pprof.go index d1e30b1..5ea0640 100644 --- a/server/pprof.go +++ b/server/pprof.go @@ -9,7 +9,7 @@ import ( log "github.com/sirupsen/logrus" - "github.com/Mrs4s/go-cqhttp/internal/config" + "github.com/Mrs4s/go-cqhttp/modules/config" ) // RunPprofServer 启动 pprof 性能分析服务器 diff --git a/server/scf.go b/server/scf.go index 3a4beff..68f6da5 100644 --- a/server/scf.go +++ b/server/scf.go @@ -16,7 +16,7 @@ import ( "github.com/Mrs4s/go-cqhttp/coolq" "github.com/Mrs4s/go-cqhttp/global" - "github.com/Mrs4s/go-cqhttp/internal/config" + "github.com/Mrs4s/go-cqhttp/modules/config" ) type lambdaClient struct { diff --git a/server/websocket.go b/server/websocket.go index 6d1000c..a7e3f1c 100644 --- a/server/websocket.go +++ b/server/websocket.go @@ -12,7 +12,7 @@ import ( "github.com/Mrs4s/go-cqhttp/coolq" "github.com/Mrs4s/go-cqhttp/global" - "github.com/Mrs4s/go-cqhttp/internal/config" + "github.com/Mrs4s/go-cqhttp/modules/config" "github.com/Mrs4s/MiraiGo/utils" "github.com/gorilla/websocket"