pet_home_server/src/server/gamedata/reader.go
2026-01-13 15:28:39 +08:00

259 lines
4.9 KiB
Go

package gamedata
import (
"encoding/json"
"errors"
"fmt"
"io"
"os"
"path/filepath"
"strconv"
"server/conf"
"server/game/mod/item"
"server/pkg/github.com/name5566/leaf/log"
"server/pkg/github.com/name5566/leaf/recordfile"
"github.com/fsnotify/fsnotify"
)
var watcher *fsnotify.Watcher
var ConfPath = "./gamedata/config/"
func init() {
if conf.Server.GameConfPath != "" {
ConfPath = conf.Server.GameConfPath
}
watcher, _ = fsnotify.NewWatcher()
watcher.Add(ConfPath + "reload")
go func() {
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
if event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Create == fsnotify.Create || event.Op&fsnotify.Rename == fsnotify.Rename {
for k := range G_AllConfigsJsonData {
InitCfg(k)
log.Debug("配置已重新加载:%s", k)
}
}
case err, ok := <-watcher.Errors:
if !ok {
return
}
fmt.Println("错误:", err)
}
}
}()
}
func Reload() {
for k := range G_AllConfigsJsonData {
InitCfg(k)
log.Debug("配置已重新加载:%s", k)
}
}
func readRfNew(st interface{}, ralativePath string) *recordfile.RecordFile {
rf, err := recordfile.New(st)
if err != nil {
log.Fatal("%v", err)
}
fn := ralativePath + ".txt"
err = rf.Read(ConfPath + fn)
if err != nil {
log.Fatal("%v: %v", fn, err)
}
return rf
}
func InitCfg(cfgname string) {
// 读取文件内容
filePath := ConfPath + cfgname + ".json"
absPath, _ := filepath.Abs(filePath)
file, err := os.Open(absPath)
if err != nil {
log.Debug("打开文件失败:%v", err)
return
}
defer file.Close()
// 读取文件内容到字节数组
byteValue, err := io.ReadAll(file)
if err != nil {
log.Debug("读取文件失败:%v", err)
return
}
// 移除 BOM
if len(byteValue) >= 3 && byteValue[0] == 0xEF && byteValue[1] == 0xBB && byteValue[2] == 0xBF {
byteValue = byteValue[3:]
}
var data map[string]interface{}
// 反序列化JSON数据
err = json.Unmarshal(byteValue, &data)
if err != nil {
log.Debug("config name:%s,反序列化失败:%v", cfgname, err)
return
}
rf := new(ConfigData)
convertedData := make(map[string]interface{})
for k, v := range data {
convertedData[k] = v
}
rf.SetData(convertedData)
G_AllConfigsJsonData[cfgname] = rf
}
func GetValue(a interface{}, key string) interface{} {
if a == nil {
return nil
}
if v, ok := a.(map[string]interface{})[key]; ok {
return v
}
return nil
}
func GetIntValue(a interface{}, key string) int {
if a == nil {
return 0
}
if v, ok := a.(map[string]interface{})[key]; ok {
if v == nil {
return 0
}
return Int(v)
}
return 0
}
func GetIntSliceValue(a interface{}, key string) []int {
if a == nil {
return nil
}
if v, ok := a.(map[string]interface{})[key]; ok {
if v == nil {
return nil
}
var r []int
for _, v := range v.([]interface{}) {
r = append(r, int(v.(float64)))
}
return r
}
return nil
}
func GetFloatValue(a interface{}, key string) float64 {
if a == nil {
return 0
}
if v, ok := a.(map[string]interface{})[key]; ok {
if v == nil {
return 0
}
return v.(float64)
}
return 0
}
func GetItemList(a interface{}, key string) []*item.Item {
if a == nil {
return nil
}
if v, ok := a.(map[string]interface{})[key]; ok {
if v == nil {
return nil
}
return item.ParseItem(v)
}
return nil
}
func GetStringValue(a interface{}, key string) string {
if a == nil {
return ""
}
if v, ok := a.(map[string]interface{})[key]; ok {
if v == nil {
return ""
}
return String(v)
}
return ""
}
func GetData(cfgname string) (map[string]interface{}, error) {
if v, ok := G_AllConfigsJsonData[cfgname]; ok {
return v.GetData(), nil
}
return make(map[string]interface{}), errors.New("not found")
}
func GetDataByKey(cfgname, key string) (map[string]interface{}, error) {
if v, ok := G_AllConfigsJsonData[cfgname]; ok {
if v, ok := v.GetData()[key]; ok {
return v.(map[string]interface{}), nil
}
}
return make(map[string]interface{}), errors.New("not found")
}
func GetDataByIntKey(cfgname string, key int) (map[string]interface{}, error) {
keyStr := strconv.Itoa(key)
if v, ok := G_AllConfigsJsonData[cfgname]; ok {
if v, ok := v.GetData()[keyStr]; ok {
return v.(map[string]interface{}), nil
}
}
return make(map[string]interface{}), errors.New("not found")
}
func Int(a interface{}) int {
if a == nil {
return 0
}
switch v := a.(type) {
case int:
return v
case int32:
return int(v)
case int64:
return int(v)
case float64:
return int(v)
case string:
r, err := strconv.Atoi(v)
if err != nil {
return 0
}
return r
}
return 0
}
func String(a interface{}) string {
if a == nil {
return ""
}
switch v := a.(type) {
case int:
return strconv.Itoa(v)
case int32:
return strconv.Itoa(int(v))
case int64:
return strconv.Itoa(int(v))
case float64:
return strconv.FormatFloat(v, 'f', -1, 64)
case string:
return v
}
return ""
}