|
@@ -7,6 +7,7 @@ import (
|
|
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
|
|
"github.com/aws/aws-sdk-go/aws/session"
|
|
|
"github.com/aws/aws-sdk-go/service/s3/s3manager"
|
|
|
+ "github.com/go-redis/redis/v8"
|
|
|
jsoniter "github.com/json-iterator/go"
|
|
|
mhayaString "github.com/mhaya/extend/string"
|
|
|
mhayaTime "github.com/mhaya/extend/time"
|
|
@@ -43,11 +44,15 @@ type (
|
|
|
Player *models.Player
|
|
|
Account *models.Account
|
|
|
}
|
|
|
+
|
|
|
+ CachePlayer struct {
|
|
|
+ Player *models.Player
|
|
|
+ Dirty bool
|
|
|
+ }
|
|
|
)
|
|
|
|
|
|
func (p *actorPlayer) OnInit() {
|
|
|
-
|
|
|
- p.exitTime = time.Minute * 60
|
|
|
+ p.exitTime = time.Minute * 10
|
|
|
clog.Debugf("[actorPlayer] path = %s init!", p.PathString())
|
|
|
|
|
|
// 注册 session关闭的remote函数(网关触发连接断开后,会调用RPC发送该消息)
|
|
@@ -98,7 +103,7 @@ func (p *actorPlayer) OnInit() {
|
|
|
//p.Timer().Add(10*time.Second, p.refreshRoll)
|
|
|
p.Timer().Add(60*time.Second, p.SetRewardToDB)
|
|
|
p.Timer().Add(1*time.Minute, p.setRedis)
|
|
|
- p.Timer().Add(60*time.Second, p.setDb)
|
|
|
+ //p.Timer().Add(60*time.Second, p.setDb)
|
|
|
//p.Timer().Add(30*time.Second, p.setInviteReward)
|
|
|
|
|
|
//p.Timer().Add(1*time.Second, p.addRoll)
|
|
@@ -109,6 +114,7 @@ func (p *actorPlayer) OnInit() {
|
|
|
|
|
|
//在线用户定时刷新
|
|
|
p.Timer().Add(1*time.Minute, p.initDaily)
|
|
|
+ p.Timer().Add(10*time.Second, p.setRedisAll)
|
|
|
|
|
|
//p.Timer().Add(5*time.Second, p.initHourly)
|
|
|
|
|
@@ -222,6 +228,20 @@ func (p *actorPlayer) SetRewardToDB() {
|
|
|
}()
|
|
|
}
|
|
|
|
|
|
+func (p *actorPlayer) setRedisAll() {
|
|
|
+ if p.isOnline && p.Player != nil && p.dirty {
|
|
|
+ ctx := context.Background()
|
|
|
+ cachePlayer := CachePlayer{Dirty: true, Player: p.Player}
|
|
|
+ // 将玩家信息转换为 JSON 格式并存储到 Redis
|
|
|
+ jsonData, err := jsoniter.Marshal(&cachePlayer)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ mdb.RDB.HSet(ctx, fmt.Sprintf("%v:%v", constant.CNamePlayer, p.App().NodeId()), p.Player.OpenId, jsonData)
|
|
|
+ p.dirty = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func (p *actorPlayer) setDb() {
|
|
|
go func() {
|
|
|
if p.isOnline && p.dirty {
|
|
@@ -409,6 +429,8 @@ func (p *actorPlayer) sessionClose() {
|
|
|
online.UnBindPlayer(p.uid)
|
|
|
p.setDb()
|
|
|
p.SetRewardToDB()
|
|
|
+ mdb.RDB.HDel(context.Background(), fmt.Sprintf("%v:%v", constant.CNamePlayer, p.App().NodeId()), string(p.uid))
|
|
|
+
|
|
|
logoutEvent := event.NewPlayerLogout(p.ActorID(), p.playerId, p.targetPath)
|
|
|
p.isOnline = false
|
|
|
p.Exit()
|
|
@@ -417,18 +439,49 @@ func (p *actorPlayer) sessionClose() {
|
|
|
|
|
|
func (p *actorPlayer) Init(req *token.Token) {
|
|
|
clog.Debugf("[actorPlayer] init token = %s", req)
|
|
|
+
|
|
|
+ ctx := context.Background()
|
|
|
+ acc, err := mdb.RDB.Get(ctx, fmt.Sprintf("%v:%v", constant.CNameAccount, req.OpenID)).Bytes()
|
|
|
+ if err != nil && err != redis.Nil {
|
|
|
+ clog.Debugf("[actorPlayer] initUser error: %v", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
var account models.Account
|
|
|
- mdb.MDB.Collection(constant.CNameAccount).FindOne(context.Background(), bson.M{"userName": req.PlayerID}).Decode(&account)
|
|
|
- p.Account = &account
|
|
|
- var player models.Player
|
|
|
- mdb.MDB.Collection(constant.CNamePlayer).FindOne(context.Background(), bson.M{"userName": req.PlayerID}).Decode(&player)
|
|
|
+ if len(acc) > 0 {
|
|
|
+ err = jsoniter.Unmarshal(acc, &account)
|
|
|
+ if err != nil {
|
|
|
+ clog.Debugf("[actorPlayer] unmarshal account data error: %v", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ p.Account = &account
|
|
|
+ } else {
|
|
|
+ mdb.MDB.Collection(constant.CNameAccount).FindOne(context.Background(), bson.M{"openId": req.OpenID}).Decode(&account)
|
|
|
+ p.Account = &account
|
|
|
+ }
|
|
|
|
|
|
- if player.OpenId != "" {
|
|
|
- p.Player = &player
|
|
|
- clog.Debugf("[Init] oldUser userName = %s openId = %s", p.Player.UserName, p.Player.OpenId)
|
|
|
+ var player models.Player
|
|
|
+ var cachePlayer CachePlayer
|
|
|
+ play, err := mdb.RDB.HGet(ctx, fmt.Sprintf("%v:%v", constant.CNamePlayer, p.App().NodeId()), req.OpenID).Bytes()
|
|
|
+ if err != nil && err != redis.Nil {
|
|
|
+ clog.Debugf("[actorPlayer] initUser error: %v", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if len(play) > 0 {
|
|
|
+ err = jsoniter.Unmarshal(play, &cachePlayer)
|
|
|
+ if err != nil {
|
|
|
+ clog.Debugf("[actorPlayer] unmarshal player data error: %v", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ p.Player = cachePlayer.Player
|
|
|
} else {
|
|
|
+ mdb.MDB.Collection(constant.CNamePlayer).FindOne(context.Background(), bson.M{"userName": req.PlayerID}).Decode(&player)
|
|
|
+ cachePlayer.Player = &player
|
|
|
+ }
|
|
|
+ if cachePlayer.Player.OpenId == "" {
|
|
|
user := models.NewPlayer(req)
|
|
|
- mdb.MDB.Collection(constant.CNamePlayer).InsertOne(context.Background(), user)
|
|
|
+ // go mdb.MDB.Collection(constant.CNamePlayer).InsertOne(context.Background(), user)
|
|
|
+ //标记新用户
|
|
|
+ mdb.RDB.HSet(ctx, constant.NewPlayers, req.OpenID, 1)
|
|
|
p.Player = user
|
|
|
clog.Debugf("[Init] newUser userName = %s openId = %s", p.Player.UserName, p.Player.OpenId)
|
|
|
p.botInvite()
|