Browse Source

负载同步

zhengtao 8 months ago
parent
commit
94e3f188b5

+ 1 - 1
game/game_cluster/nodes/db/db.go

@@ -12,7 +12,7 @@ import (
 )
 
 func main() {
-	nodeId := "m-database"
+	nodeId := "m-db"
 	// 配置mhaya引擎
 	app := mhaya.Configure("./config/profile-gc.json", nodeId, false, mhaya.Cluster)
 

+ 6 - 6
game/game_cluster/nodes/db/module/actor_save_db.go

@@ -53,7 +53,7 @@ func (p *ActorSaves) saveAccountDB() {
 	for k, v := range newAccounts {
 		var account models.Account
 		if v == "1" {
-			if newKey < 1000 {
+			if newKey < 5000 {
 				acc, _ := mdb.RDB.Get(ctx, fmt.Sprintf("%v:%v", constant.CNameAccount, k)).Bytes()
 				if len(acc) > 0 {
 					err := jsoniter.Unmarshal(acc, &account)
@@ -71,7 +71,7 @@ func (p *ActorSaves) saveAccountDB() {
 			}
 			newKey++
 		} else {
-			if key < 1000 {
+			if key < 5000 {
 				acc, _ := mdb.RDB.Get(ctx, fmt.Sprintf("%v:%v", constant.CNameAccount, k)).Bytes()
 				if len(acc) > 0 {
 					err := jsoniter.Unmarshal(acc, &account)
@@ -86,7 +86,7 @@ func (p *ActorSaves) saveAccountDB() {
 				key++
 			}
 		}
-		if newKey > 1000 || key > 1000 {
+		if newKey > 5000 || key > 5000 {
 			break
 		}
 	}
@@ -127,7 +127,7 @@ func (p *ActorSaves) savePlayerDB() {
 	newPlayers := mdb.RDB.HGetAll(ctx, constant.NewPlayers).Val()
 	updPlayer := []string{}
 	for k, _ := range newPlayers {
-		if key < 1000 {
+		if key < 5000 {
 			var player models.Player
 			acc, _ := mdb.RDB.Get(ctx, fmt.Sprintf("%v:%v", constant.CNamePlayer, k)).Bytes()
 			if len(acc) > 0 {
@@ -142,7 +142,7 @@ func (p *ActorSaves) savePlayerDB() {
 			updPlayer = append(updPlayer, player.OpenId)
 		}
 		key++
-		if key > 1000 {
+		if key > 5000 {
 			break
 		}
 	}
@@ -169,7 +169,7 @@ func (p *ActorSaves) savePlayerDBTwo() {
 
 	// 使用 goroutines 并发处理玩家更新
 	for k, _ := range newPlayers {
-		if key >= 1000 {
+		if key >= 5000 {
 			break // 优化了循环条件,提前退出
 		}
 

+ 1 - 0
game/game_cluster/nodes/game/game.go

@@ -40,6 +40,7 @@ func main() {
 
 	app.AddActors(
 		&player.ActorPlayers{Name: nodeId},
+		&player.ActorAvatars{Name: nodeId},
 		&mdb.ActorDB{Name: nodeId},
 	)
 

+ 1 - 0
game/game_cluster/nodes/game/game/game.go

@@ -39,6 +39,7 @@ func Run(profileFilePath, nodeId string) {
 
 	app.AddActors(
 		&player.ActorPlayers{Name: nodeId},
+		&player.ActorAvatars{Name: nodeId},
 		&mdb.ActorDB{Name: nodeId},
 	)
 

+ 226 - 0
game/game_cluster/nodes/game/module/player/actor_avatar.go

@@ -0,0 +1,226 @@
+package player
+
+import (
+	"context"
+	"fmt"
+	"github.com/aws/aws-sdk-go/aws"
+	"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"
+	jsoniter "github.com/json-iterator/go"
+	mhayaString "github.com/mhaya/extend/string"
+	cfacade "github.com/mhaya/facade"
+	"github.com/mhaya/game/game_cluster/internal/data"
+	clog "github.com/mhaya/logger"
+	"github.com/mhaya/net/parser/pomelo"
+	"io"
+	"net/http"
+	"time"
+)
+
+type (
+	// ActorAvatar 玩家头像管理actor
+	ActorAvatar struct {
+		pomelo.ActorBase
+		isOnline      bool
+		openId        string
+		avatar        string
+		userName      string
+		dirty         bool
+		childExitTime time.Duration
+	}
+
+	UserAvatar struct {
+		openId   string
+		avatar   string
+		userName string
+	}
+)
+
+func (p *ActorAvatar) OnInit() {
+	p.childExitTime = time.Minute * 3
+	clog.Debugf("[ActorAvatar] path = %s init!", p.PathString())
+	p.Remote().Register("setAvatar", p.setAvatar)
+	p.Remote().Register("sessionClose", p.sessionClose)
+	p.Timer().Add(10*time.Second, p.getAndUpdateAvatar)
+	p.Timer().Add(30*time.Second, p.getAndUpdateAvatar)
+	//p.Timer().Add(2*time.Minute, p.SetDb)
+}
+
+func (p *ActorAvatar) sessionClose() {
+	if p.isOnline {
+		p.isOnline = false
+		p.Exit()
+	}
+}
+
+func (p *ActorAvatar) setAvatar(req *UserAvatar) {
+	p.isOnline = true
+	p.openId = req.openId
+	p.avatar = req.avatar
+	p.dirty = true
+	clog.Infof("[ActorAvatar] init userAvatar = %v", req)
+}
+
+// 获取和更新头像
+func (p *ActorAvatar) getAndUpdateAvatar() {
+	if p.isOnline && p.dirty {
+		p.dirty = false
+		go p.getAvatar()
+	}
+}
+
+func (p *ActorAvatar) getAvatar() {
+	openid, _ := mhayaString.ToInt64(p.openId)
+
+	// 使用自定义 Transport 创建 HTTP 客户端
+	client := &http.Client{
+		Timeout: 10 * time.Second, // 设置超时时间
+	}
+
+	sdkConfig := data.SdkConfig.Get(2).Params
+
+	url := fmt.Sprintf("https://api.telegram.org/bot%s/getUserProfilePhotos?user_id=%d", sdkConfig.BotToken, openid)
+
+	// 发起 HTTP 请求
+	req, err := http.NewRequestWithContext(context.Background(), "GET", url, nil)
+	if err != nil {
+		clog.Warnf("Failed to create request: %v", err)
+		return
+	}
+
+	resp, err := client.Do(req)
+	if err != nil {
+		clog.Warnf("Failed to send request: %v", err)
+		return
+	}
+	defer resp.Body.Close()
+	body, err := io.ReadAll(resp.Body)
+	if err != nil {
+		clog.Warnf("Error reading body: %v", err)
+		return
+	}
+	var result struct {
+		Ok     bool `json:"ok"`
+		Result struct {
+			Photos [][]struct {
+				FileID string `json:"file_id"`
+			} `json:"photos"`
+		} `json:"result"`
+	}
+
+	err = jsoniter.Unmarshal(body, &result)
+	if err != nil {
+		clog.Warnf("Error unmarshalling JSON: %v", err)
+		return
+	}
+
+	if !result.Ok {
+		clog.Warnf("Error: %s", string(body))
+		return
+	}
+	if len(result.Result.Photos) == 0 {
+		clog.Warnf("No photos found for user %d", openid)
+		return
+	}
+
+	if len(result.Result.Photos) > 0 {
+		// 获取第一张照片的最大尺寸
+		photo := result.Result.Photos[0][len(result.Result.Photos[0])-1]
+
+		//根据数据库记录判断是否需要更新图片库
+		if photo.FileID != p.avatar {
+			if p.uploadPhotoToS3(client, sdkConfig.BotToken, photo.FileID, openid) == true {
+				p.avatar = photo.FileID
+				targetPath := cfacade.NewChildPath(p.App().NodeId(), "player"+p.App().NodeId(), p.userName)
+				p.Call(targetPath, "setAvatar", &UserAvatar{avatar: p.avatar, openId: p.openId, userName: p.userName})
+			}
+		}
+	}
+}
+
+func (p *ActorAvatar) uploadPhotoToS3(client *http.Client, botToken, fileId string, openid int64) bool {
+
+	s3 := data.SdkConfig.Get(2).S3
+
+	url := fmt.Sprintf("https://api.telegram.org/bot%s/getFile?file_id=%s", botToken, fileId)
+
+	// 发起 HTTP 请求
+	req, err := http.NewRequestWithContext(context.Background(), "GET", url, nil)
+	if err != nil {
+		clog.Warnf("Failed to create request: %v", err)
+		return false
+	}
+
+	resp, err := client.Do(req)
+
+	if err != nil {
+		clog.Warnf("Failed to send request: %v", err)
+		return false
+	}
+	defer resp.Body.Close()
+
+	body, err := io.ReadAll(resp.Body)
+	if err != nil {
+		clog.Warnf("Error reading body: %v", err)
+		return false
+	}
+
+	var fileInfo struct {
+		Ok     bool `json:"ok"`
+		Result struct {
+			FilePath string `json:"file_path"`
+		} `json:"result"`
+	}
+
+	err = jsoniter.Unmarshal(body, &fileInfo)
+	if err != nil {
+		clog.Warnf("Error unmarshalling JSON: %v", err)
+		return false
+	}
+
+	if !fileInfo.Ok {
+		clog.Warnf("Error: %s", string(body))
+		return false
+	}
+
+	downloadUrl := fmt.Sprintf("https://api.telegram.org/file/bot%s/%s", botToken, fileInfo.Result.FilePath)
+
+	resp, err = client.Get(downloadUrl)
+	if err != nil {
+		clog.Warnf("Error: %v", err)
+		return false
+	}
+	defer resp.Body.Close()
+
+	// 配置 AWS 凭证
+	sess, err := session.NewSession(&aws.Config{
+		Credentials: credentials.NewStaticCredentials(
+			s3.AccessKey,
+			s3.SecretKey,
+			"",
+		),
+		Region: aws.String(s3.Region), // 替换为你的 S3 区域
+	})
+
+	uploader := s3manager.NewUploader(sess)
+
+	// 上传文件到 S3
+	_, err = uploader.Upload(&s3manager.UploadInput{
+		Bucket: aws.String(s3.BucketName),                        // S3 存储桶名称
+		Key:    aws.String(fmt.Sprintf("avatar/%d.jpg", openid)), //当前目录存储文件
+		Body:   resp.Body,
+		ACL:    aws.String("private"), // 可以根据需要设置 ACL
+	})
+
+	if err != nil {
+		clog.Warnf("Error uploading file: %v", err)
+		return false
+	}
+	return true
+
+}
+
+func (p *ActorAvatar) OnStop() {
+	clog.Infof("ActorAvatar stop")
+}

+ 44 - 0
game/game_cluster/nodes/game/module/player/actor_avatars.go

@@ -0,0 +1,44 @@
+package player
+
+import (
+	cfacade "github.com/mhaya/facade"
+	"github.com/mhaya/game/game_cluster/nodes/game/module/online"
+	clog "github.com/mhaya/logger"
+	"github.com/mhaya/net/parser/pomelo"
+	"time"
+)
+
+type (
+	// ActorAvatars 玩家头像总管理actor
+	ActorAvatars struct {
+		pomelo.ActorBase
+		Name          string
+		childExitTime time.Duration
+	}
+)
+
+func (p *ActorAvatars) AliasID() string {
+	return "avatar" + p.Name
+}
+
+func (p *ActorAvatars) OnInit() {
+	clog.Debugf("[ActorAvatars] path = %s init!", p.PathString())
+}
+
+func (p *ActorAvatars) OnFindChild(msg *cfacade.Message) (cfacade.IActor, bool) {
+	// 动态创建 player child actor
+	childID := msg.TargetPath().ChildID
+	childActor, err := p.Child().Create(childID, &ActorAvatar{
+		isOnline: false,
+	})
+
+	if err != nil {
+		return nil, false
+	}
+
+	return childActor, true
+}
+
+func (p *ActorAvatars) OnStop() {
+	clog.Infof("onlineCount = %d", online.Count())
+}

+ 46 - 15
game/game_cluster/nodes/game/module/player/actor_player.go

@@ -11,6 +11,7 @@ import (
 	jsoniter "github.com/json-iterator/go"
 	mhayaString "github.com/mhaya/extend/string"
 	mhayaTime "github.com/mhaya/extend/time"
+	cfacade "github.com/mhaya/facade"
 	"github.com/mhaya/game/game_cluster/internal/code"
 	"github.com/mhaya/game/game_cluster/internal/constant"
 	"github.com/mhaya/game/game_cluster/internal/data"
@@ -52,7 +53,7 @@ type (
 )
 
 func (p *actorPlayer) OnInit() {
-	p.exitTime = time.Duration(rand.Int63n(1200)) + time.Minute*5
+	p.exitTime = time.Duration(rand.Int63n(1200)) + time.Minute*10
 	clog.Debugf("[actorPlayer] path = %s init!", p.PathString())
 
 	// 注册 session关闭的remote函数(网关触发连接断开后,会调用RPC发送该消息)
@@ -100,6 +101,8 @@ func (p *actorPlayer) OnInit() {
 
 	p.Remote().Register("unitTest", p.unitTest)
 
+	p.Remote().Register("setAvatar", p.setAvatar)
+
 	//p.Timer().Add(10*time.Second, p.refreshRoll)
 	//	p.Timer().Add(60*time.Second, p.SetRewardToDB)
 	p.Timer().Add(1*time.Minute, p.setRedis)
@@ -118,7 +121,7 @@ func (p *actorPlayer) OnInit() {
 
 	//p.Timer().Add(5*time.Second, p.initHourly)
 
-	p.Timer().AddOnce(5*time.Second, p.getAndUpdateAvatar) //排行榜头像
+	//p.Timer().AddOnce(5*time.Second, p.getAndUpdateAvatar) //排行榜头像
 
 	//p.Timer().Add(30*time.Second, p.updPassWordTime)
 
@@ -133,6 +136,13 @@ func (p *actorPlayer) updCashOut() {
 	}
 }
 
+func (p *actorPlayer) setAvatar(req *UserAvatar) {
+	if p.isOnline && p.Player != nil {
+		p.Player.Avatar = req.avatar
+		p.dirty = true
+	}
+}
+
 func (p *actorPlayer) updPassWordTime() {
 	if p.isOnline && p.Player != nil {
 		if p.Player.PwdErrRefreshTime > 0 && p.Player.PwdErrRefreshTime < mhayaTime.Now().Unix() {
@@ -185,6 +195,7 @@ func (p *actorPlayer) upatePlayerLevelStat() {
 }
 
 func (p *actorPlayer) OnStop() {
+	p.Timer().RemoveAll()
 	clog.Debugf("[actorPlayer] path = %s exit!", p.PathString())
 }
 
@@ -257,6 +268,7 @@ func (p *actorPlayer) getAndUpdateAvatar() {
 		go p.getAvatar()
 	}
 }
+
 func (p *actorPlayer) getAvatar() {
 	openid, _ := mhayaString.ToInt64(p.Player.OpenId)
 
@@ -423,38 +435,42 @@ func (p *actorPlayer) playerSessionClose() {
 
 // sessionClose 接收角色session关闭处理
 func (p *actorPlayer) sessionClose() {
-	if p.Player != nil {
+	if p.Player != nil && p.isOnline {
 		online.UnBindPlayer(p.uid)
-		p.setDb()
+		//p.setDb()
 		//p.SetRewardToDB()
 		p.setRedisAll()
 		//logoutEvent := event.NewPlayerLogout(p.ActorID(), p.playerId, p.targetPath)
 		p.isOnline = false
 		p.Exit()
-		models.SetServerRecord(p.App().NodeId(), online.Count())
+		//models.SetServerRecord(p.App().NodeId(), online.Count())
 	}
 	//p.PostEvent(&logoutEvent)
 }
 
-func (p *actorPlayer) Init(req *token.Token) {
+func (p *actorPlayer) Init(req *token.Token) bool {
 	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
+		return false
 	}
 	var account models.Account
 	if len(acc) > 0 {
 		err = jsoniter.Unmarshal(acc, &account)
 		if err != nil {
 			clog.Debugf("[actorPlayer] unmarshal account data error: %v", err)
-			return
+			return false
 		}
 		p.Account = &account
 	} else {
-		mdb.MDB.Collection(constant.CNameAccount).FindOne(context.Background(), bson.M{"openId": req.OpenID}).Decode(&account)
+		dbErr := mdb.MDB.Collection(constant.CNameAccount).FindOne(context.Background(), bson.M{"openId": req.OpenID}).Decode(&account).Error()
+		if dbErr != "" {
+			clog.Debugf("[actorPlayer] read account data by db error: %v", err)
+			return false
+		}
 		p.Account = &account
 	}
 
@@ -462,17 +478,22 @@ func (p *actorPlayer) Init(req *token.Token) {
 	play, err := mdb.RDB.Get(ctx, fmt.Sprintf("%v:%v", constant.CNamePlayer, req.OpenID)).Bytes()
 	if err != nil && err != redis.Nil {
 		clog.Debugf("[actorPlayer] initUser error: %v", err)
-		return
+		return false
 	}
 	if len(play) > 0 {
 		err = jsoniter.Unmarshal(play, &player)
 		if err != nil {
 			clog.Debugf("[actorPlayer] unmarshal player data error: %v", err)
-			return
+			return false
 		}
 		p.Player = &player
 	} else {
-		mdb.MDB.Collection(constant.CNamePlayer).FindOne(context.Background(), bson.M{"userName": req.PlayerID}).Decode(&player)
+		dbErr := mdb.MDB.Collection(constant.CNamePlayer).FindOne(context.Background(), bson.M{"userName": req.PlayerID}).Decode(&player).Error()
+		if dbErr != "" {
+			clog.Debugf("[actorPlayer] read player data by db error: %v", err)
+			return false
+		}
+		p.Player = &player
 	}
 	if player.IsNew {
 		//	go mdb.MDB.Collection(constant.CNamePlayer).InsertOne(context.Background(), user)
@@ -481,7 +502,7 @@ func (p *actorPlayer) Init(req *token.Token) {
 		clog.Debugf("[Init] newUser userName = %s openId = %s", p.Player.UserName, p.Player.OpenId)
 		p.botInvite()
 	}
-
+	return true
 }
 
 func (p *actorPlayer) InitBase(uid string) int32 {
@@ -500,9 +521,15 @@ func (p *actorPlayer) InitBase(uid string) int32 {
 }
 
 func (p *actorPlayer) login(req *token.Token) (*models.Player, int32) {
+	clog.Infof("[actorPlayer] init token = %v", req)
+
 	if !p.isOnline {
-		p.Init(req)
+		if !p.Init(req) {
+			clog.Infof("[login] PlayerNotLogin err node=%v", p.App().NodeId())
+			return nil, code.PlayerNotLogin
+		}
 	}
+	clog.Infof("[actorPlayer] init suss token = %v", req)
 
 	p.isOnline = true
 	p.dirty = true
@@ -549,9 +576,13 @@ func (p *actorPlayer) login(req *token.Token) (*models.Player, int32) {
 
 	//p.getAndUpdateAvatar()
 	//检查提现
-	go p.updCashOutStatusByOld(0)
+	//go p.updCashOutStatusByOld(0)
 	//统计相关
 	p.loginStat()
+	//更新头像
+	targetPath := cfacade.NewChildPath(p.App().NodeId(), "avatar"+p.App().NodeId(), p.Player.UserName)
+	p.Call(targetPath, "setAvatar", &UserAvatar{avatar: p.Player.Avatar, openId: p.Player.OpenId, userName: p.Player.UserName})
+
 	// 保存进入游戏的玩家对应的agentPath
 	online.BindPlayer(p.Player.UserName, p.uid, req.TargetPath)
 

+ 0 - 52
game/game_cluster/nodes/game/module/player/actor_players.go

@@ -3,7 +3,6 @@ package player
 import (
 	"context"
 	"fmt"
-	jsoniter "github.com/json-iterator/go"
 	cconst "github.com/mhaya/const"
 	cstring "github.com/mhaya/extend/string"
 	cfacade "github.com/mhaya/facade"
@@ -14,9 +13,6 @@ import (
 	"github.com/mhaya/game/game_cluster/nodes/game/module/online"
 	clog "github.com/mhaya/logger"
 	"github.com/mhaya/net/parser/pomelo"
-	"go.mongodb.org/mongo-driver/bson"
-	"go.mongodb.org/mongo-driver/mongo"
-	"log"
 	"time"
 )
 
@@ -51,54 +47,6 @@ func (p *ActorPlayers) loadServer() {
 	mdb.RDB.Del(context.Background(), fmt.Sprintf("%v:%v", constant.CNamePlayer, p.App().NodeId()))
 }
 
-func (p *ActorPlayers) SetDb() {
-	go p.OpDb()
-}
-
-func (p *ActorPlayers) OpDb() {
-	res := mdb.RDB.HGetAll(context.Background(), fmt.Sprintf("%v:%v", constant.CNamePlayer, p.App().NodeId())).Val()
-	newPlayer := mdb.RDB.HGetAll(context.Background(), constant.NewPlayers).Val()
-	bulkUpdOps := []mongo.WriteModel{}
-	bulkInsOps := []mongo.WriteModel{}
-	np := []string{}
-	for k, v := range res {
-		var player CachePlayer
-		if len(v) > 0 {
-			err := jsoniter.Unmarshal([]byte(v), &player)
-			if err != nil {
-				clog.Debugf("[ActorPlayers] unmarshal player data error: %v", err)
-				return
-			}
-			if player.Dirty {
-				if _, ok := newPlayer[k]; ok {
-					np = append(np, k)
-					bulkInsOps = append(bulkInsOps, mongo.NewInsertOneModel().SetDocument(player.Player))
-				} else {
-					filter := bson.M{"openId": player.Player.OpenId}
-					update := bson.M{"$set": player.Player}
-					bulkUpdOps = append(bulkUpdOps, mongo.NewUpdateOneModel().SetFilter(filter).SetUpdate(update))
-				}
-			}
-		}
-	}
-	if len(bulkInsOps) > 0 {
-		_, err := mdb.MDB.Collection(constant.CNamePlayer).BulkWrite(context.Background(), bulkInsOps)
-		if err != nil {
-			log.Fatalf("Bulk write failed: %v", err)
-		}
-		for _, op := range np {
-			mdb.RDB.HDel(context.Background(), constant.NewPlayers, op)
-		}
-
-	}
-	if len(bulkUpdOps) > 0 {
-		_, err := mdb.MDB.Collection(constant.CNamePlayer).BulkWrite(context.Background(), bulkUpdOps)
-		if err != nil {
-			clog.Fatalf("Bulk write failed: %v", err)
-		}
-	}
-}
-
 func (p *ActorPlayers) OnFindChild(msg *cfacade.Message) (cfacade.IActor, bool) {
 	// 动态创建 player child actor
 	childID := msg.TargetPath().ChildID

+ 10 - 5
game/game_cluster/nodes/game/module/player/cashout.go

@@ -3,6 +3,7 @@ package player
 import (
 	"context"
 	"fmt"
+	clog "github.com/mhaya/logger"
 
 	mhayaCrypto "github.com/mhaya/extend/crypto"
 	cstring "github.com/mhaya/extend/string"
@@ -22,9 +23,10 @@ import (
 )
 
 func (p *actorPlayer) cashOut(req *param.CashOutReq) int32 {
-	//if !p.isOnline {
-	//	return code.PlayerNotLogin
-	//}
+	if !p.isOnline {
+		clog.Infof("[cashOut] PlayerNotLogin err node=%v", p.App().NodeId())
+		return code.PlayerNotLogin
+	}
 
 	if p.Player.TonWall == "" {
 		return code.TonWallNotExistsError
@@ -75,6 +77,7 @@ func (p *actorPlayer) cashOut(req *param.CashOutReq) int32 {
 
 func (p *actorPlayer) setPwd(req *param.SetPwdReq) int32 {
 	if !p.isOnline {
+		clog.Infof("[setPwd] PlayerNotLogin err node=%v", p.App().NodeId())
 		return code.PlayerNotLogin
 	}
 	if len(p.Player.Password) > 0 {
@@ -106,6 +109,7 @@ func (p *actorPlayer) VerifyPwd(pwd string) int32 {
 
 func (p *actorPlayer) cashOutList(req *param.PageReq) (interface{}, int32) {
 	if !p.isOnline {
+		clog.Infof("[cashOutList] PlayerNotLogin err node=%v", p.App().NodeId())
 		return nil, code.PlayerNotLogin
 	}
 
@@ -157,6 +161,7 @@ type Resp struct {
 
 func (p *actorPlayer) updCashOutStatus(tp int) {
 	if !p.isOnline {
+
 		return
 	}
 	if tp == 1 {
@@ -175,7 +180,7 @@ func (p *actorPlayer) updCashOutStatus(tp int) {
 
 	defer func() {
 		if closeErr := cursor.Close(ctx); closeErr != nil {
-			log.Printf("Error closing cursor: %v", closeErr)
+			clog.Warnf("Error closing cursor: %v", closeErr)
 		}
 	}()
 	var num int
@@ -237,7 +242,7 @@ func (p *actorPlayer) updCashOutStatusByOld(tp int) {
 
 	defer func() {
 		if closeErr := cursor.Close(ctx); closeErr != nil {
-			log.Printf("Error closing cursor: %v", closeErr)
+			clog.Warnf("Error closing cursor: %v", closeErr)
 		}
 	}()
 	var num int

+ 2 - 0
game/game_cluster/nodes/game/module/player/claim.go

@@ -15,6 +15,7 @@ import (
 
 func (p *actorPlayer) claim(req *param.ClaimReq) (*param.ChangeData, int32) {
 	if !p.isOnline {
+		mhayaLogger.Infof("[claim] PlayerNotLogin err node=%v", p.App().NodeId())
 		return nil, code.PlayerNotLogin
 	}
 	var resp *param.ChangeData
@@ -145,6 +146,7 @@ func (p *actorPlayer) ClaimFirstReward(id int) (*param.ChangeData, int32) {
 // 领取邀请节点奖励
 func (p *actorPlayer) ClaimInviteNodeReward(id int) (*param.ChangeData, int32) {
 	if !p.isOnline {
+		mhayaLogger.Infof("[ClaimInviteNodeReward] PlayerNotLogin err node=%v", p.App().NodeId())
 		return nil, code.PlayerNotLogin
 	}
 

+ 5 - 3
game/game_cluster/nodes/game/module/player/guide.go

@@ -5,12 +5,14 @@ import (
 	"github.com/mhaya/game/game_cluster/internal/code"
 	"github.com/mhaya/game/game_cluster/internal/mdb/models"
 	"github.com/mhaya/game/game_cluster/internal/param"
+	clog "github.com/mhaya/logger"
 )
 
 func (p *actorPlayer) guide(req *param.GuideReq) (*param.GuideResp, int32) {
-	//if !p.isOnline {
-	//	return nil, code.PlayerNotLogin
-	//}
+	if !p.isOnline {
+		clog.Infof("[guide] PlayerNotLogin err node=%v", p.App().NodeId())
+		return nil, code.PlayerNotLogin
+	}
 
 	if req.Close == 1 {
 		p.Player.Guide = 0

+ 5 - 0
game/game_cluster/nodes/game/module/player/invite.go

@@ -34,6 +34,7 @@ func (p *actorPlayer) botInvite() {
 func (p *actorPlayer) invite(req *param.InviteReq) int32 {
 	clog.Debugf("invite execute => parenName = ", req.ParentName)
 	if !p.isOnline {
+		clog.Infof("[invite] PlayerNotLogin err node=%v", p.App().NodeId())
 		return code.PlayerNotLogin
 	}
 	if p.Player.Pid != "" {
@@ -64,6 +65,7 @@ func (p *actorPlayer) invite(req *param.InviteReq) int32 {
 
 func (p *actorPlayer) inviteRecord() (*param.WeeklyRankConfigResp, int32) {
 	if !p.isOnline {
+		clog.Infof("[inviteRecord] PlayerNotLogin err node=%v", p.App().NodeId())
 		return nil, code.PlayerNotLogin
 	}
 	var resp param.WeeklyRankConfigResp
@@ -135,6 +137,7 @@ func (p *actorPlayer) inviteRecord() (*param.WeeklyRankConfigResp, int32) {
 // 邀请裂变奖励查询
 func (p *actorPlayer) inviteRewardRatio() (*param.InviteRatioResp, int32) {
 	if !p.isOnline {
+		clog.Infof("[inviteRewardRatio] PlayerNotLogin err node=%v", p.App().NodeId())
 		return nil, code.PlayerNotLogin
 	}
 	key := fmt.Sprintf("%v:1:%v", constant.InviteScoreKey, p.Player.UserName)
@@ -144,6 +147,7 @@ func (p *actorPlayer) inviteRewardRatio() (*param.InviteRatioResp, int32) {
 // 邀请裂变好友累计奖励
 func (p *actorPlayer) inviteRewardRatioHistory() (*param.InviteRatioResp, int32) {
 	if !p.isOnline {
+		clog.Infof("[inviteRewardRatioHistory] PlayerNotLogin err node=%v", p.App().NodeId())
 		return nil, code.PlayerNotLogin
 	}
 	key := fmt.Sprintf("%v:1:%v", constant.InviteRatioRecordKey, p.Player.UserName)
@@ -218,6 +222,7 @@ func (p *actorPlayer) inviteRewardList(key string, isHistory bool) (*param.Invit
 // 邀请奖励查询
 func (p *actorPlayer) inviteNodeReward() (*models.InviteNodeReward, int32) {
 	if !p.isOnline {
+		clog.Infof("[inviteNodeReward] PlayerNotLogin err node=%v", p.App().NodeId())
 		return nil, code.PlayerNotLogin
 	}
 

+ 3 - 0
game/game_cluster/nodes/game/module/player/jump.go

@@ -11,6 +11,7 @@ import (
 func (p *actorPlayer) jump(req *param.JumpReq) (*param.JumpResp, int32) {
 	clog.Debugf("jump tp = %v", req.Tp)
 	if !p.isOnline {
+		clog.Infof("[jump] PlayerNotLogin err node=%v", p.App().NodeId())
 		return nil, code.PlayerNotLogin
 	}
 	ret := p.Player.FinishAchieveTaskByType1(req.Tp)
@@ -27,6 +28,7 @@ func (p *actorPlayer) jump(req *param.JumpReq) (*param.JumpResp, int32) {
 
 func (p *actorPlayer) savex(req *param.SaveXReq) (*param.ChangeData, int32) {
 	if !p.isOnline {
+		clog.Infof("[savex] PlayerNotLogin err node=%v", p.App().NodeId())
 		return nil, code.PlayerNotLogin
 	}
 
@@ -55,6 +57,7 @@ func (p *actorPlayer) savex(req *param.SaveXReq) (*param.ChangeData, int32) {
 
 func (p *actorPlayer) savetonwall(req *param.SaveTonWallReq) int32 {
 	if !p.isOnline {
+		clog.Infof("[savetonwall] PlayerNotLogin err node=%v", p.App().NodeId())
 		return code.PlayerNotLogin
 	}
 

+ 6 - 3
game/game_cluster/nodes/game/module/player/lottery.go

@@ -8,6 +8,7 @@ import (
 	"github.com/mhaya/game/game_cluster/internal/mdb"
 	"github.com/mhaya/game/game_cluster/internal/mdb/models"
 	"github.com/mhaya/game/game_cluster/internal/param"
+	clog "github.com/mhaya/logger"
 	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/mongo/options"
 	"log"
@@ -15,9 +16,10 @@ import (
 )
 
 func (p *actorPlayer) lottery(req *param.DrawReq) (*param.DrawResp, int32) {
-	//if !p.isOnline {
-	//	return nil, code.PlayerNotLogin
-	//}
+	if !p.isOnline {
+		clog.Infof("[lottery] PlayerNotLogin err node=%v", p.App().NodeId())
+		return nil, code.PlayerNotLogin
+	}
 	var num = 1
 	if req.Tp == 2 {
 		num = 10
@@ -46,6 +48,7 @@ func (p *actorPlayer) lottery(req *param.DrawReq) (*param.DrawResp, int32) {
 
 func (p *actorPlayer) getLotteryHistory(req *param.PageReq) (interface{}, int32) {
 	if !p.isOnline {
+		clog.Infof("[getLotteryHistory] PlayerNotLogin err node=%v", p.App().NodeId())
 		return nil, code.PlayerNotLogin
 	}
 	findFilter := bson.M{"userName": p.Player.UserName, "source": models.SourceDraw, "createTime": bson.M{"$gte": mhayaTime.Now().Add(-time.Hour * 24 * 7).Unix()}}

+ 1 - 0
game/game_cluster/nodes/game/module/player/start.go

@@ -14,6 +14,7 @@ import (
 
 func (p *actorPlayer) start() (*models.HomeData, int32) {
 	if !p.isOnline {
+		clog.Infof("[start] PlayerNotLogin err node=%v", p.App().NodeId())
 		return nil, code.PlayerNotLogin
 	}
 	p.dirty = true

+ 34 - 33
game/game_cluster/nodes/web/controller/controller.go

@@ -49,7 +49,7 @@ func (p *Users) GetChildActor(userName string) (cfacade.IActor, bool) {
 
 func (cu *User) OnInit() {
 	cu.childExitTime = time.Minute * 5
-	cu.Timer().Add(10*time.Second, cu.sessionClose)
+	cu.Timer().Add(30*time.Second, cu.sessionClose)
 }
 
 func (cu *User) sessionClose() {
@@ -128,47 +128,48 @@ func (p *Controller) Auth(c *mhayaGin.Context) (*token.Token, int32) {
 	if oldToken != tokenString {
 		return nil, code.AccountTokenValidateFail
 	}
-
-	sdkInvoke, err := sdk.GetInvoke(userToken.PID)
-	if err != nil {
-		mhayaLogger.Warnf("[Auth] [pid = %d] get invoke error. params=%v", userToken.PID, userToken)
-		return nil, code.AccountTokenValidateFail
-	}
-
-	s, newToken := sdkInvoke.Reconnect(userToken)
-	if code.IsFail(s) {
-		mhayaLogger.Warnf("[Auth]  Reconnect err , errCode = %v", s)
-		return nil, code.AccountTokenValidateFail
-	}
-	//如果重新刷新路由
-	if newToken.TargetPath != userToken.TargetPath {
-		config := data.SdkConfig.Get(newToken.PID)
-		if config == nil {
-			mhayaLogger.Warnf("[Auth] if config err.  params=%v", newToken)
-			return nil, code.AccountTokenValidateFail
-		}
-		base64Token := token.New(userToken.PID, userToken.OpenID, userToken.PlayerID, newToken.TargetPath, "", config.Salt).ToBase64()
-		err = mdb.RDB.Set(context.Background(), fmt.Sprintf("%v:%v", constant.Token, userToken.OpenID), base64Token, mhayaTime.SecondsPerWeek*time.Second).Err()
+	/*
+		sdkInvoke, err := sdk.GetInvoke(userToken.PID)
 		if err != nil {
-			mhayaLogger.Warnf("[Auth] result set token err. result = %s", newToken)
+			mhayaLogger.Warnf("[Auth] [pid = %d] get invoke error. params=%v", userToken.PID, userToken)
 			return nil, code.AccountTokenValidateFail
 		}
 
-		ctl, ok := p.GetChildActor(newToken.PlayerID)
-		if !ok {
-			mhayaLogger.Warnf("[Auth] result set token err. result = %s", newToken)
+		s, newToken := sdkInvoke.Reconnect(userToken)
+		if code.IsFail(s) {
+			mhayaLogger.Warnf("[Auth]  Reconnect err , errCode = %v", s)
 			return nil, code.AccountTokenValidateFail
 		}
-		ctl.Call(userToken.TargetPath, "sessionClose", nil)
+		//如果重新刷新路由
+		if newToken.TargetPath != userToken.TargetPath {
+			config := data.SdkConfig.Get(newToken.PID)
+			if config == nil {
+				mhayaLogger.Warnf("[Auth] if config err.  params=%v", newToken)
+				return nil, code.AccountTokenValidateFail
+			}
+			base64Token := token.New(userToken.PID, userToken.OpenID, userToken.PlayerID, newToken.TargetPath, "", config.Salt).ToBase64()
+			err = mdb.RDB.Set(context.Background(), fmt.Sprintf("%v:%v", constant.Token, userToken.OpenID), base64Token, mhayaTime.SecondsPerWeek*time.Second).Err()
+			if err != nil {
+				mhayaLogger.Warnf("[Auth] result set token err. result = %s", newToken)
+				return nil, code.AccountTokenValidateFail
+			}
 
-		errCode := ctl.Call(newToken.TargetPath, "login", newToken)
-		if code.IsFail(errCode) {
-			mhayaLogger.Warnf("[Auth] result set token err. result = %s", newToken)
-			return nil, code.AccountTokenValidateFail
+			ctl, ok := p.GetChildActor(newToken.PlayerID)
+			if !ok {
+				mhayaLogger.Warnf("[Auth] result set token err. result = %s", newToken)
+				return nil, code.AccountTokenValidateFail
+			}
+			ctl.Call(userToken.TargetPath, "sessionClose", nil)
+
+			errCode := ctl.Call(newToken.TargetPath, "login", newToken)
+			if code.IsFail(errCode) {
+				mhayaLogger.Warnf("[Auth] result set token err. result = %s", newToken)
+				return nil, code.AccountTokenValidateFail
+			}
 		}
-	}
+	*/
 
-	return newToken, code.OK
+	return userToken, code.OK
 }
 
 // login 根据pid获取sdkConfig,与第三方进行帐号登陆效验

+ 12 - 9
game/game_cluster/robot_client/main.go

@@ -17,9 +17,9 @@ import (
 func main() {
 
 	// 定义命令行标志
-	userOffset := flag.Int("userOffset", 0, "用户偏移量")
-	count := flag.Int("count", 10000, "请求总数")
-	qps := flag.Int("qps", 200, "最大并发数")
+	userOffset := flag.Int("userOffset", 500000, "用户偏移量")
+	count := flag.Int("count", 100000, "请求总数")
+	qps := flag.Int("qps", 500, "最大并发数")
 	url := flag.String("url", "http://127.0.0.1:20000", "请求url")
 	url1 := flag.String("url1", "http://127.0.0.1:20001", "请求url")
 	url2 := flag.String("url2", "http://127.0.0.1:20002", "请求url")
@@ -87,9 +87,11 @@ func RunRobot(url string, val *param.LoginReq, num int) {
 	params := map[string]interface{}{
 		"nickName": "guest" + val.OpenID,
 	}
-	Login(url, params, token)
+	rs := Login(url, params, token)
+	if !code.IsFail(rs) {
+		start(val, token, url)
+	}
 
-	start(val, token, url)
 	//singInList(val, token, url)
 	//singIn(val, token,url)
 }
@@ -198,26 +200,27 @@ func claim(val *param.LoginReq, token string, url string) {
 	execute("claim", requestURL, params, token)
 }
 
-func Login(url string, params map[string]interface{}, token string) {
+func Login(url string, params map[string]interface{}, token string) int32 {
 	requestURL := fmt.Sprintf("%s/login", url)
 	jsonBytes, err := mhayaHttp.PostJSONWithHeader(requestURL, params, token)
 	if err != nil {
 		mhayaLogger.Warnf("login err: %v", err)
-		return
+		return 1
 	}
 
 	rsp := &code.Result{}
 	err = jsoniter.Unmarshal(jsonBytes, rsp)
 	if err != nil {
 		mhayaLogger.Warnf("login Unmarshal err :%v ", err)
-		return
+		return 1
 	}
 	if rsp.Code == 0 {
 		mhayaLogger.Debugf("Login OK : %v", rsp.Code)
+		return 0
 	} else {
 		mhayaLogger.Debugf("Login Fail : %v", rsp.Code)
 	}
-
+	return 1
 }
 
 func execute(handler string, url string, params map[string]interface{}, token string) {