100 lines
2.2 KiB
Go
100 lines
2.2 KiB
Go
package core
|
|
|
|
import (
|
|
"io"
|
|
|
|
"mongo.games.com/goserver/core/logger"
|
|
"mongo.games.com/goserver/core/viperx"
|
|
)
|
|
|
|
var packages = make(map[string]Package)
|
|
var packagesLoaded = make(map[string]bool)
|
|
|
|
// Package 功能包
|
|
// 只做初始化,不要依赖其它功能包
|
|
type Package interface {
|
|
Name() string
|
|
Init() error
|
|
io.Closer
|
|
}
|
|
|
|
// RegistePackage 注册功能包
|
|
func RegistePackage(p Package) {
|
|
packages[p.Name()] = p
|
|
}
|
|
|
|
// IsPackageRegistered 判断功能包是否已经注册
|
|
func IsPackageRegistered(name string) bool {
|
|
if _, exist := packages[name]; exist {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// IsPackageLoaded 判断功能包是否已经加载
|
|
func IsPackageLoaded(name string) bool {
|
|
if _, exist := packagesLoaded[name]; exist {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// RegisterConfigEncryptor 注册配置文件加密器
|
|
func RegisterConfigEncryptor(h viperx.ConfigFileEncryptorHook) {
|
|
viperx.RegisterConfigEncryptor(h)
|
|
}
|
|
|
|
// LoadPackages 加载功能包
|
|
func LoadPackages(configFile string) {
|
|
vp := viperx.GetViper(configFile)
|
|
|
|
var err error
|
|
var notFoundConfig []string
|
|
var notFoundPackage []string
|
|
for k := range vp.AllSettings() {
|
|
if _, ok := packages[k]; !ok {
|
|
notFoundPackage = append(notFoundPackage, k)
|
|
continue
|
|
}
|
|
|
|
name := k
|
|
pkg := packages[k]
|
|
if err = vp.UnmarshalKey(k, pkg); err != nil {
|
|
logger.Logger.Errorf("Package %s: Error while unmarshalling from config file %s: %v", name, configFile, err)
|
|
continue
|
|
}
|
|
|
|
if err = pkg.Init(); err != nil {
|
|
logger.Logger.Errorf("Package %s: Error while initializing from config file %s: %v", name, configFile, err)
|
|
continue
|
|
}
|
|
|
|
packagesLoaded[pkg.Name()] = true
|
|
logger.Logger.Infof("package [%16s] load success", pkg.Name())
|
|
}
|
|
|
|
for k := range packages {
|
|
if !IsPackageLoaded(k) {
|
|
notFoundConfig = append(notFoundConfig, k)
|
|
}
|
|
}
|
|
|
|
if len(notFoundConfig) > 0 {
|
|
logger.Logger.Warnf("package load success, not found config: %v", notFoundConfig)
|
|
}
|
|
|
|
if len(notFoundPackage) > 0 {
|
|
logger.Logger.Warnf("package load success, not found package: %v", notFoundPackage)
|
|
}
|
|
}
|
|
|
|
// ClosePackages 关闭功能包
|
|
func ClosePackages() {
|
|
for _, pkg := range packages {
|
|
err := pkg.Close()
|
|
if err != nil {
|
|
logger.Logger.Errorf("Error while closing package %s: %s", pkg.Name(), err)
|
|
}
|
|
}
|
|
}
|