tkcashgame_v4/app/eonline/internal/biz/serverData.go

241 lines
5.0 KiB
Go
Raw Normal View History

2025-10-22 10:01:11 +00:00
package biz
import (
"errors"
"fmt"
"sync"
"time"
go_redis_orm "github.com/fananchong/go-redis-orm.v2"
"github.com/go-kratos/kratos/v2/log"
v1 "sandc/api/eonline/v1"
"sandc/app/eonline/internal/conf"
)
var (
G_SvrData *SvrData
MutexSvrData sync.RWMutex
ERR_INIT_USER_DATA = errors.New("init db user data error")
)
const (
db_name = "my_redis_db"
NS2MS int64 = 1_000_000 // 纳秒转换成毫秒,需要的被除数
)
func InitSvrData(bootstrap *conf.Bootstrap) {
go_redis_orm.SetNewRedisHandler(go_redis_orm.NewDefaultRedisClient)
err := go_redis_orm.CreateDB(db_name, []string{bootstrap.Data.Redis.Addr}, bootstrap.Data.Redis.Password, int(bootstrap.Data.Redis.Db))
if nil != err {
log.Fatalf("go_redis_orm.CreateDB err: dbName[%v] Idx[%v] Redis[%v] err[%v]", db_name, bootstrap.Data.Redis.Db, bootstrap.Data.Redis.Addr, err)
}
err = loadSvrData(uint32(bootstrap.Server.SvrId))
if err != nil {
log.Fatal("loadSvrData error: %v", err)
} else {
log.Infof("loadSvrData success")
}
}
func SaveSvrDataOnTimer() {
begin := time.Now().UnixNano()
var save map[string]interface{}
getSaveDataSvrData(&save)
var err error
go func() {
begin := time.Now().UnixNano()
err = saveDataSvrData(&save)
if err != nil {
log.Infof("saveDataSvrData error: %v", err)
}
save = nil
end := time.Now().UnixNano()
delta := end - begin
log.Infof("saveDataSvrData: begin[%dns] end[%dns], spend[%dms %dns]", begin, end, delta/NS2MS, delta%NS2MS)
}()
end := time.Now().UnixNano()
delta := end - begin
log.Infof("SaveSvrDataOnTimer: begin[%dns] end[%dns], spend[%dms %dns]", begin, end, delta/NS2MS, delta%NS2MS)
}
func SaveSvrDataShutDown() {
begin := time.Now().UnixNano()
err := saveDataSvrData2()
if err != nil {
log.Infof("saveSvrDataShutDown error: %v", err)
}
end := time.Now().UnixNano()
delta := end - begin
log.Infof("SaveSvrDataShutDown: begin[%dns] end[%dns], spend[%dms %dns]", begin, end, delta/NS2MS, delta%NS2MS)
}
func loadSvrData(key uint32) error {
MutexSvrData.Lock()
defer MutexSvrData.Unlock()
G_SvrData = NewSvrData(db_name, key)
if G_SvrData.IsLoad() {
log.Infof("神奇的已加载数据 SvrData")
return nil
}
var hasKey int
var err error
hasKey, err = G_SvrData.HasKey()
switch hasKey {
case 1:
err = G_SvrData.Load()
if err == nil {
initValueSvrDataOnLoad(key)
}
case 0:
// new
err := initValueSvrData(key)
if err != nil {
log.Error("initValueSvrData %v data error: %v", key, err)
return ERR_INIT_USER_DATA
}
case -1:
return err
default:
log.Error("loadSvrData HasKey key[%v] hasKey[%d] error: %v", key, hasKey, err)
return errors.New(fmt.Sprintf("error haskey[%d]", hasKey))
}
return nil
}
func initValueSvrData(key uint32) error {
initValueSvrDataOnLoad(key)
return nil
}
func initValueSvrDataOnLoad(key uint32) {
bChange := false
data := G_SvrData.GetData(false)
if data.LstChat == nil {
bChange = true
data.LstChat = []*v1.PbMsgOne{}
}
// if data.MapReportData == nil {
// bChange = true
// data.MapReportData = map[string]*v1.PbReportData{}
// }
if bChange {
G_SvrData.GetData(true)
}
}
func getSaveDataSvrData(temp *map[string]interface{}) error {
MutexSvrData.Lock()
defer MutexSvrData.Unlock()
var err error
*temp, err = G_SvrData.DirtyData()
return err
}
func saveDataSvrData(temp *map[string]interface{}) error {
MutexSvrData.RLock()
defer MutexSvrData.RUnlock()
var err error
err = G_SvrData.Save2(*temp)
return err
}
func saveDataSvrData2() error {
MutexSvrData.Lock()
defer MutexSvrData.Unlock()
var err error
err = G_SvrData.Save()
return err
}
func AddChat(req *v1.AddChatReq) {
MutexSvrData.Lock()
defer MutexSvrData.Unlock()
lst := &G_SvrData.GetData(true).LstChat
*lst = append(*lst, &v1.PbMsgOne{
TimeStamp: time.Now().UnixNano(),
Uuid: req.Uuid,
Name: "",
Msg: req.Msg,
})
lstNum := len(*lst)
if lstNum > 100 {
*lst = (*lst)[lstNum-100:]
}
}
func GetChat(timeStamp int64) []*v1.PbMsgOne {
MutexSvrData.RLock()
defer MutexSvrData.RUnlock()
lst := G_SvrData.GetData(false).LstChat
if timeStamp <= 0 {
return lst
}
for k, v := range lst {
if v.TimeStamp >= timeStamp {
return lst[k:]
}
}
return lst
}
func AddReportOne(key string, data *v1.PbReportData) {
// MutexSvrData.Lock()
// defer MutexSvrData.Unlock()
//
// now := uint32(time.Now().Unix())
//
// svrData := G_SvrData.GetData(true)
// lst := &svrData.MapReportData
//
// // 清理超时的
// if svrData.RfClearReportData+30*60 <= now {
// svrData.RfClearReportData = now
//
// for k, v := range *lst {
// if v.Rf+15*60*60 <= now { // 提现平台最后一次发送回调消息是14小时
// delete(*lst, k)
// }
// }
// }
//
// (*lst)[key] = data
}
func GetReportOne(key string) *v1.PbReportData {
// MutexSvrData.Lock()
// defer MutexSvrData.Unlock()
//
// lst := &G_SvrData.GetData(false).MapReportData
//
// if v, ok := (*lst)[key]; ok {
// delete(*lst, key)
// return v
// }
//
return nil
}