88 lines
1.9 KiB
Go
88 lines
1.9 KiB
Go
package config
|
|
|
|
import (
|
|
jsonIter "github.com/json-iterator/go"
|
|
"github.com/kercylan98/minotaur/utils/log"
|
|
"github.com/kercylan98/minotaur/utils/timer"
|
|
"go.uber.org/zap"
|
|
"os"
|
|
"path/filepath"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// LoadHandle 配置加载处理函数
|
|
type LoadHandle func(handle func(filename string, config any) error)
|
|
|
|
// RefreshHandle 配置刷新处理函数
|
|
type RefreshHandle func()
|
|
|
|
const (
|
|
tickerLoadRefresh = "_tickerLoadRefresh"
|
|
)
|
|
|
|
var (
|
|
cLoadDir string
|
|
cTicker *timer.Ticker
|
|
cInterval time.Duration
|
|
cLoadHandle LoadHandle
|
|
cRefreshHandle RefreshHandle
|
|
json = jsonIter.ConfigCompatibleWithStandardLibrary
|
|
mutex sync.Mutex
|
|
)
|
|
|
|
// Init 配置初始化
|
|
func Init(loadDir string, loadHandle LoadHandle, refreshHandle RefreshHandle) {
|
|
cLoadDir = loadDir
|
|
cLoadHandle = loadHandle
|
|
cRefreshHandle = refreshHandle
|
|
}
|
|
|
|
// Load 加载配置
|
|
func Load() {
|
|
mutex.Lock()
|
|
if cTicker != nil {
|
|
WithTickerLoad(cTicker, cInterval)
|
|
} else {
|
|
cLoadHandle(func(filename string, config any) error {
|
|
bytes, err := os.ReadFile(filepath.Join(cLoadDir, filename))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err = json.Unmarshal(bytes, &config); err == nil {
|
|
log.Info("Config", zap.String("Name", filename), zap.Bool("LoadSuccess", true))
|
|
}
|
|
return err
|
|
})
|
|
}
|
|
mutex.Unlock()
|
|
}
|
|
|
|
// WithTickerLoad 通过定时器加载配置
|
|
func WithTickerLoad(ticker *timer.Ticker, interval time.Duration) {
|
|
if ticker != cTicker && cTicker != nil {
|
|
cTicker.StopTimer(tickerLoadRefresh)
|
|
}
|
|
cTicker = ticker
|
|
cInterval = interval
|
|
cTicker.Loop(tickerLoadRefresh, timer.Instantly, cInterval, timer.Forever, func() {
|
|
Load()
|
|
Refresh()
|
|
})
|
|
}
|
|
|
|
// StopTickerLoad 停止通过定时器加载配置
|
|
func StopTickerLoad() {
|
|
if cTicker != nil {
|
|
cTicker.StopTimer(tickerLoadRefresh)
|
|
}
|
|
}
|
|
|
|
// Refresh 刷新配置
|
|
func Refresh() {
|
|
mutex.Lock()
|
|
cRefreshHandle()
|
|
OnConfigRefreshEvent()
|
|
mutex.Unlock()
|
|
}
|