配置读取功能实现,核心功能未实现

This commit is contained in:
2022-09-10 08:50:11 +08:00
commit 1f6da5fd8d
19 changed files with 425 additions and 0 deletions

26
pkg/boot/bootstrap.go Normal file
View File

@@ -0,0 +1,26 @@
package boot
import (
"NaiveBotRouter/pkg/conf"
"NaiveBotRouter/pkg/log"
ws "NaiveBotRouter/pkg/websocket"
"flag"
)
var (
cfgFile string
debug bool
)
func init() {
flag.StringVar(&cfgFile, "config", "config.toml", "config file")
flag.BoolVar(&debug, "debug", false, "debug mode")
flag.Parse()
log.InitLog(debug)
}
func Bootstrap() {
conf.InitConfig(cfgFile)
ws.ServeBackendServer()
}

74
pkg/conf/conf.go Normal file
View File

@@ -0,0 +1,74 @@
package conf
import (
"NaiveBotRouter/pkg/log"
"NaiveBotRouter/pkg/util"
"encoding/json"
"github.com/BurntSushi/toml"
"os"
)
type Config struct {
Common Common
Servers map[string]Server
}
type Common struct {
Name string
}
type Server struct {
Addr string
}
var (
GlobalConfig Config
BackendConfig Server
)
// 释放默认配置文件
func releaseConfig(file string, config Config) {
f, err := util.CreateNestedFile(file)
if err != nil {
log.Log.Fatalf("failed to create default config: %s", err.Error())
}
encoder := toml.NewEncoder(f)
err = encoder.Encode(config)
if err != nil {
log.Log.Fatalf("internal - encoding toml: %s", err.Error())
}
}
func InitConfig(file string) {
GlobalConfig = defaultConfig
if util.NotExists(file) {
// 默认配置文件不存在则创建
if file == "config.toml" {
releaseConfig(file, GlobalConfig)
log.Log.Infof("default config created")
} else {
log.Log.Fatalf("config file not exists: %s", file)
os.Exit(1)
}
}
// 解析配置文件
_, err := toml.DecodeFile(file, &GlobalConfig)
if err != nil {
log.Log.Fatalf("toml decoding error: %s", err.Error())
}
// 验证必须的字段
if v, ok := GlobalConfig.Servers["backend"]; ok {
BackendConfig = v
} else {
log.Log.Fatalf("mission required field: servers.backend")
}
jsonConfig, err := json.Marshal(GlobalConfig)
if err == nil {
log.Log.Debugf("config loaded: %s", string(jsonConfig))
}
}

7
pkg/conf/conf_test.go Normal file
View File

@@ -0,0 +1,7 @@
package conf
import "testing"
func TestInitConfig(t *testing.T) {
InitConfig("fconfig.toml")
}

15
pkg/conf/default.go Normal file
View File

@@ -0,0 +1,15 @@
package conf
var defaultConfig Config
func init() {
defaultConfig = Config{
Common: Common{
Name: "NaiveBotRouter",
},
Servers: map[string]Server{
"backend": {Addr: "127.0.0.1:5700/ws"},
"frontend1": {Addr: "127.0.0.1:6600/onebot/v11/ws"},
},
}
}

23
pkg/log/log.go Normal file
View File

@@ -0,0 +1,23 @@
package log
import (
nested "github.com/antonfisher/nested-logrus-formatter"
"github.com/sirupsen/logrus"
)
var Log *logrus.Logger
func InitLog(debug bool) {
Log = logrus.New()
Log.SetFormatter(&nested.Formatter{
HideKeys: true,
FieldsOrder: []string{"component", "category"},
})
if debug {
Log.SetLevel(logrus.DebugLevel)
} else {
Log.SetLevel(logrus.InfoLevel)
}
Log.Debug("logger loaded")
}

30
pkg/util/file.go Normal file
View File

@@ -0,0 +1,30 @@
package util
import (
"os"
"path/filepath"
)
func Exists(name string) bool {
if _, err := os.Stat(name); err != nil {
if os.IsNotExist(err) {
return false
}
}
return true
}
func NotExists(name string) bool {
return !Exists(name)
}
func CreateNestedFile(path string) (*os.File, error) {
basePath := filepath.Dir(path)
if !Exists(basePath) {
err := os.MkdirAll(basePath, 0700)
if err != nil {
return nil, err
}
}
return os.Create(path)
}

32
pkg/websocket/backend.go Normal file
View File

@@ -0,0 +1,32 @@
package websocket
import (
"NaiveBotRouter/pkg/conf"
"NaiveBotRouter/pkg/log"
"github.com/gorilla/websocket"
"net/http"
)
var upgrader = websocket.Upgrader{} // use default options
func ServeBackendServer() {
http.HandleFunc("/onebot/v11/ws", listen)
http.ListenAndServe(conf.GlobalConfig.Servers["backend"].Addr, nil)
}
func listen(w http.ResponseWriter, r *http.Request) {
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Log.Info("upgrade:", err)
return
}
defer ws.Close()
for {
_, message, err := ws.ReadMessage()
if err != nil {
log.Log.Info("read:", err)
break
}
log.Log.Infof("recv: %s", message)
}
}

View File

@@ -0,0 +1 @@
package websocket