game_sync/worldsrv/playerinfo.go

187 lines
4.1 KiB
Go

package main
import (
"strconv"
"time"
"mongo.games.com/goserver/core/basic"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/module"
"mongo.games.com/goserver/core/task"
"mongo.games.com/game/common"
"mongo.games.com/game/model"
"mongo.games.com/game/worldsrv/internal"
)
/*
玩家信息加载,缓存,持久化,缓存释放
*/
func init() {
internal.RegisterPlayerLoad(PlayerInfoMgrSingle)
module.RegisteModule(PlayerInfoMgrSingle, time.Hour, 0)
}
var PlayerInfoMgrSingle = &PlayerInfoMgr{
Players: make(map[int32]*PlayerInfo),
PlayerPlatform: make(map[int32]string),
}
type AllPlayerInfo struct {
GameData []*model.PlayerGameData
Lottery []*model.Lottery
}
// PlayerInfo 玩家信息
type PlayerInfo struct {
GameData map[string]*model.PlayerGameData // 游戏数据
Lottery map[int64]*model.Lottery // 抽奖数据 key:抽奖配置id
}
type PlayerInfoMgr struct {
Players map[int32]*PlayerInfo
PlayerPlatform map[int32]string
}
func (p *PlayerInfoMgr) ModuleName() string {
return "PlayerInfoMgr"
}
func (p *PlayerInfoMgr) Init() {
}
func (p *PlayerInfoMgr) Update() {
for k, v := range p.PlayerPlatform {
if PlayerMgrSington.GetPlayerBySnId(k) == nil {
p.Save(v, k, true, true)
p.Release(v, k)
}
}
}
func (p *PlayerInfoMgr) Shutdown() {
for k, v := range p.Players {
if v == nil {
continue
}
p.Save(p.PlayerPlatform[k], k, true, true)
p.Release(p.PlayerPlatform[k], k)
}
module.UnregisteModule(p)
}
func (p *PlayerInfoMgr) Load(platform string, snid int32, data any) *internal.PlayerLoadReplay {
var err error
allPlayerInfo := &AllPlayerInfo{
GameData: make([]*model.PlayerGameData, 0),
Lottery: make([]*model.Lottery, 0),
}
// 游戏数据
allPlayerInfo.GameData, err = model.GetPlayerGameData(platform, snid)
if err != nil {
logger.Logger.Errorf("GetPlayerGameData snid:%v error: %v", snid, err)
goto here
}
// 抽奖数据
allPlayerInfo.Lottery, err = model.GetLottery(platform, snid, 0, common.GetDayStartTs(time.Now().Unix()))
if err != nil {
logger.Logger.Errorf("GetLottery snid:%v error: %v", snid, err)
goto here
}
// ...
here:
return &internal.PlayerLoadReplay{
Platform: platform,
Snid: snid,
Err: err,
Data: allPlayerInfo,
}
}
func (p *PlayerInfoMgr) Callback(data any, ret *internal.PlayerLoadReplay) {
if ret.Err != nil {
return
}
playerInfo, ok := ret.Data.(*AllPlayerInfo)
if !ok {
return
}
info := &PlayerInfo{
GameData: make(map[string]*model.PlayerGameData),
Lottery: make(map[int64]*model.Lottery),
}
// 游戏数据
for _, v := range playerInfo.GameData {
info.GameData[v.Id] = v
}
// 抽奖数据
for _, v := range playerInfo.Lottery {
info.Lottery[v.CId] = v
}
// ...
p.Players[ret.Snid] = info
if ret.Snid > 0 && ret.Platform != "" {
p.PlayerPlatform[ret.Snid] = ret.Platform
}
}
func (p *PlayerInfoMgr) LoadAfter(platform string, snid int32) *internal.PlayerLoadReplay {
return nil
}
func (p *PlayerInfoMgr) CallbackAfter(ret *internal.PlayerLoadReplay) {
if ret != nil && ret.Snid > 0 && ret.Platform != "" {
p.PlayerPlatform[ret.Snid] = ret.Platform
}
}
func (p *PlayerInfoMgr) Save(platform string, snid int32, isSync, force bool) {
var err error
f := func() {
data, ok := p.Players[snid]
if !ok {
return
}
// 游戏数据
err = model.SavePlayerGameData(platform, common.GetMapValues(data.GameData))
if err != nil {
logger.Logger.Errorf("SavePlayerGameData snid:%v error: %v", snid, err)
}
// 抽奖数据
err = model.UpsertLottery(platform, common.GetMapValues(data.Lottery)...)
if err != nil {
logger.Logger.Errorf("UpsertLottery snid:%v error: %v", snid, err)
}
// ...
}
cf := func() {
}
if isSync {
f()
cf()
return
}
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
f()
return nil
}), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) {
cf()
}), "SavePlayerInfo").StartByFixExecutor("SnId:" + strconv.Itoa(int(snid)))
}
func (p *PlayerInfoMgr) Release(platform string, snid int32) {
delete(p.Players, snid)
delete(p.PlayerPlatform, snid)
}