DelayNoMore/battle_srv/common/conf.go
2022-09-20 23:52:55 +08:00

156 lines
3.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package common
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"strings"
"go.uber.org/zap"
)
// 隐式导入
var Conf *config
const (
APP_NAME = "server"
SERVER_ENV_PROD = "PROD"
SERVER_ENV_TEST = "TEST"
)
type generalConf struct {
AppRoot string `json:"-"`
ConfDir string `json:"-"`
TestEnvSQLitePath string `json:"-"`
PreConfSQLitePath string `json:"-"`
ServerEnv string `json:"-"`
}
type mysqlConf struct {
DSN string `json:"-"`
Host string `json:"host"`
Port int `json:"port"`
Dbname string `json:"dbname"`
Username string `json:"username"`
Password string `json:"password"`
}
type sioConf struct {
HostAndPort string `json:"hostAndPort"`
}
type botServerConf struct {
SecondsBeforeSummoning int `json:"secondsBeforeSummoning"`
Protocol string `json:"protocol"`
Host string `json:"host"`
Port int `json:"port"`
SymmetricKey string `json:"symmetricKey"`
}
type redisConf struct {
Dbname int `json:"dbname"`
Host string `json:"host"`
Password string `json:"password"`
Port int `json:"port"`
}
type config struct {
General *generalConf
MySQL *mysqlConf
Sio *sioConf
Redis *redisConf
BotServer *botServerConf
}
func MustParseConfig() {
Conf = &config{
General: new(generalConf),
MySQL: new(mysqlConf),
Sio: new(sioConf),
Redis: new(redisConf),
BotServer: new(botServerConf),
}
execPath, err := os.Executable()
ErrFatal(err)
pwd, err := os.Getwd()
Logger.Debug("os.GetWd", zap.String("pwd", pwd))
ErrFatal(err)
appRoot := pwd
confDir := filepath.Join(appRoot, "configs")
Logger.Debug("conf", zap.String("dir", confDir))
if isNotExist(confDir) {
appRoot = filepath.Dir(execPath)
confDir = filepath.Join(appRoot, "configs")
Logger.Debug("conf", zap.String("dir", confDir))
if isNotExist(confDir) {
i := strings.LastIndex(pwd, "battle_srv")
if i == -1 {
Logger.Fatal("无法找到配置目录cp -rn configs.template configs并配置相关参数再启动")
}
appRoot = pwd[:(i + 10)]
confDir = filepath.Join(appRoot, "configs")
Logger.Debug("conf", zap.String("dir", confDir))
if isNotExist(confDir) {
Logger.Fatal("无法找到配置目录cp -rn configs.template configs并配置相关参数再启动")
}
}
}
Conf.General.AppRoot = appRoot
testEnvSQLitePath := filepath.Join(confDir, "test_env.sqlite")
if !isNotExist(testEnvSQLitePath) {
Conf.General.TestEnvSQLitePath = testEnvSQLitePath
}
preConfSQLitePath := filepath.Join(confDir, "pre_conf_data.sqlite")
if !isNotExist(preConfSQLitePath) {
Conf.General.PreConfSQLitePath = preConfSQLitePath
}
Conf.General.ConfDir = confDir
Conf.General.ServerEnv = os.Getenv("ServerEnv")
loadJSON("mysql.json", Conf.MySQL)
setMySQLDSNURL(Conf.MySQL)
loadJSON("sio.json", Conf.Sio)
loadJSON("redis.json", Conf.Redis)
loadJSON("bot_server.json", Conf.BotServer)
}
func setMySQLDSNURL(c *mysqlConf) {
var dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s",
c.Username, c.Password, c.Host, c.Port, c.Dbname)
c.DSN = dsn
}
func loadJSON(fp string, v interface{}) {
if !filepath.IsAbs(fp) {
fp = filepath.Join(Conf.General.ConfDir, fp)
}
_, err := os.Stat(fp)
ErrFatal(err)
fd, err := os.Open(fp)
ErrFatal(err)
defer fd.Close()
Logger.Info("Opened json file successfully.", zap.String("fp", fp))
err = json.NewDecoder(fd).Decode(v)
ErrFatal(err)
Logger.Info("Loaded json file successfully.", zap.String("fp", fp))
}
// Please only use this auxiliary function before server is fully started up, but not afterwards (启动过程可以使用,运行时不准使用).
func ErrFatal(err error) {
if err != nil {
Logger.Fatal("ErrFatal", zap.NamedError("err", err))
}
}
func isNotExist(p string) bool {
if _, err := os.Stat(p); err != nil {
return true
}
return false
}