Compare commits

...

6 Commits

Author SHA1 Message Date
sk bcbc162549 解决冲突 2024-12-16 11:17:11 +08:00
sk 5ca1048b18 Merge branch 'release' into develop 2024-12-13 11:16:09 +08:00
sk 9c3f3ea191 fix:机器人服务房间管理器房间删除 2024-12-13 11:15:43 +08:00
sk cab63a8bf9 add:游戏记录上报数据添加唯一id 2024-12-12 16:08:22 +08:00
sk 500fed59dd modify:游戏记录上报 2024-12-12 16:03:11 +08:00
sk bf636de73a fix:机器人离场金币 2024-12-12 09:34:13 +08:00
14 changed files with 132 additions and 80 deletions

View File

@ -7,6 +7,7 @@ import (
"math/rand" "math/rand"
"time" "time"
"go.mongodb.org/mongo-driver/bson/primitive"
rawproto "google.golang.org/protobuf/proto" rawproto "google.golang.org/protobuf/proto"
"mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/netlib" "mongo.games.com/goserver/core/netlib"
@ -641,15 +642,15 @@ func (this *Player) ReportGameEvent(param *ReportGameEventParam) *ReportGameEven
var gameTimes, gameFreeTimes int64 var gameTimes, gameFreeTimes int64
data, ok := this.GDatas[this.scene.KeyGamefreeId] data, ok := this.GDatas[this.scene.KeyGamefreeId]
if ok { if ok {
gameFirstTime = data.FirstTime gameFreeFirstTime = data.FirstTime
gameTimes = data.Statics.GameTimes gameFreeTimes = data.Statics.GameTimes
} }
// 记录玩家 首次参与该游戏时间 游戏次数(不区分场次) // 记录玩家 首次参与该游戏时间 游戏次数(不区分场次)
dataGame, ok := this.GDatas[this.scene.KeyGameId] dataGame, ok := this.GDatas[this.scene.KeyGameId]
if ok { if ok {
gameFreeFirstTime = dataGame.FirstTime gameFirstTime = dataGame.FirstTime
gameFreeTimes = dataGame.Statics.GameTimes gameTimes = dataGame.Statics.GameTimes
} }
isNew := int32(0) isNew := int32(0)
@ -668,12 +669,13 @@ func (this *Player) ReportGameEvent(param *ReportGameEventParam) *ReportGameEven
var ret ReportGameEventOnly var ret ReportGameEventOnly
ret.Param = param ret.Param = param
log := &model.PlayerGameRecEvent{ log := &model.PlayerGameRecEvent{
Id: primitive.NewObjectID().Hex(),
Platform: this.Platform, Platform: this.Platform,
RecordId: this.scene.GetRecordId(), RecordId: this.scene.GetRecordId(),
SnId: this.GetSnId(), SnId: this.GetSnId(),
Channel: this.Channel, Channel: this.Channel,
ChannelId: this.ChannelId, ChannelId: this.ChannelId,
City: this.City, //City: this.City,
OS: this.DeviceOS, OS: this.DeviceOS,
GameId: this.scene.GameId, GameId: this.scene.GameId,
ModeId: this.scene.GameMode, ModeId: this.scene.GameMode,
@ -686,12 +688,12 @@ func (this *Player) ReportGameEvent(param *ReportGameEventParam) *ReportGameEven
IsNew: isNew, IsNew: isNew,
GameFreeID: this.scene.GetGameFreeId(), GameFreeID: this.scene.GetGameFreeId(),
GamingTime: int32(param.GameTime), GamingTime: int32(param.GameTime),
FirstTime: gameFirstTime.Unix(), FirstTime: gameFreeFirstTime.Unix(),
PlayTimes: gameTimes, PlayTimes: gameFreeTimes,
FirstGameTime: gameFreeFirstTime.Unix(), FirstGameTime: gameFirstTime.Unix(),
PlayGameTimes: gameFreeTimes, PlayGameTimes: gameTimes,
LastLoginTime: this.LastLoginTime.Unix(), LastLoginTime: this.LastLoginTime.Unix(),
DeviceId: this.DeviceId, //DeviceId: this.DeviceId,
} }
if param.OnlyLog { if param.OnlyLog {
ret.Log = append(ret.Log, log) ret.Log = append(ret.Log, log)

View File

@ -245,33 +245,35 @@ func CreatePlayerLoginEvent(snid int32, channel, promoter, platform, city, os, i
// 玩家游戏记录 // 玩家游戏记录
type PlayerGameRecEvent struct { type PlayerGameRecEvent struct {
Id string //id
RecordId string //游戏记录ID RecordId string //游戏记录ID
SnId int32 //用户ID SnId int32 //用户ID
Channel string //包类型 Channel string //包类型
Promoter string //推广
Platform string //平台 Platform string //平台
City string //城市
OS string //操作系统 OS string //操作系统
TelephonePromoter int32 //电销标记
GameId int32 //游戏id GameId int32 //游戏id
ModeId int32 //游戏模式 ModeId int32 //游戏模式
Tax int64 //税收 Tax int64 //税收
Amount int64 //金币变化(正值为赢;负值为输) Amount int64 //金币变化,税后(正值为赢;负值为输)
CreateTime int64 //创建时间 CreateTime int64 //创建时间
CreateDayTime int64 //账号创建时间0点 CreateDayTime int64 //账号创建时间0点
ValidBet int64 //有效下注数量
ValidFlow int64 //有效流水数量
Out int64 //产出 Out int64 //产出
In int64 //投入 In int64 //投入
IsNew int32 //是否是新人 IsNew int32 //是否是新人
GameFreeID int32 //游戏freeid GameFreeID int32 //游戏freeid
GamingTime int32 //游戏开始到玩家结算的时长 单位:秒 GamingTime int32 //游戏开始到玩家结算的时长 单位:秒
GameDif int32 // 游戏分组
FirstGameDifTime int64 // 首次游戏分组时间
GameDifTimes int64 // 游戏分组游戏次数
FirstTime int64 //首次玩该场次游戏时间 FirstTime int64 //首次玩该场次游戏时间
PlayTimes int64 //该场次游戏次数 PlayTimes int64 //该场次游戏次数
FirstGameTime int64 //首次玩游戏时间 FirstGameTime int64 //首次玩游戏时间
PlayGameTimes int64 //该游戏总次数 PlayGameTimes int64 //该游戏总次数
LastLoginTime int64 //最后登录时间 LastLoginTime int64 //最后登录时间
DeviceId string //设备id
ChannelId string //推广渠道id ChannelId string //推广渠道id
} }

View File

@ -99,6 +99,7 @@ func SCPlayerFlag(s *netlib.Session, packetid int, data interface{}) error {
return nil return nil
} }
// 更新房间里玩家的状态
if scene, ok := GetScene(s).(IScene); ok && scene != nil { if scene, ok := GetScene(s).(IScene); ok && scene != nil {
p := scene.GetPlayerBySnid(msg.GetPlayerId()) p := scene.GetPlayerBySnid(msg.GetPlayerId())
if p != nil { if p != nil {

View File

@ -52,6 +52,7 @@ func SCDestroyRoom(s *netlib.Session, packid int, pack interface{}) error {
if msg.GetOpRetCode() == gamehallproto.OpResultCode_Game_OPRC_Sucess_Game { if msg.GetOpRetCode() == gamehallproto.OpResultCode_Game_OPRC_Sucess_Game {
cleanRoomState(s) cleanRoomState(s)
SceneMgrSingleton.DelScene(msg.GetRoomId())
return nil return nil
} }

View File

@ -30,12 +30,12 @@ import (
func init() { func init() {
common.RegisterClockFunc(&common.ClockFunc{ common.RegisterClockFunc(&common.ClockFunc{
OnHourTimerFunc: func() { OnHourTimerFunc: func() {
ClientMgrSingleton.HourChange() ClientMgrSingleton.AccountReplace()
logger.Logger.Infof("client state: %+v", ClientMgrSingleton.GetState()) logger.Logger.Info(ClientMgrSingleton.GetState())
}, },
OnDayTimerFunc: func() { OnDayTimerFunc: func() {
ClientMgrSingleton.DayChange() ClientMgrSingleton.AccountDeletePolicy()
}, },
}) })
} }
@ -110,13 +110,17 @@ func (this *ClientMgr) UnRegisterSession(acc string) {
delete(this.sessionPool, acc) delete(this.sessionPool, acc)
} }
func (this *ClientMgr) HourChange() { // AccountReplace 账号替换
func (this *ClientMgr) AccountReplace() {
fileModify := false fileModify := false
eventArr := this.CycleTimeEvent[time.Now().Hour()] eventArr := this.CycleTimeEvent[time.Now().Hour()]
for _, event := range eventArr { for _, event := range eventArr {
accChan[event.newAcc] = true //使用新的账号 accChan[event.newAcc] = true //使用新的账号
cfg := NewSessionConfig()
netlib.Connect(cfg) //创建新的连接 //创建新的连接
NewSession()
// 关闭旧的连接
if session, ok := this.sessionPool[event.oldAcc]; ok && session != nil { if session, ok := this.sessionPool[event.oldAcc]; ok && session != nil {
//删除旧有账号数据 //删除旧有账号数据
pack := &serverproto.RWAccountInvalid{ pack := &serverproto.RWAccountInvalid{
@ -128,6 +132,7 @@ func (this *ClientMgr) HourChange() {
//关闭连接 //关闭连接
session.Close() session.Close()
} }
//更新本地账号数据信息 //更新本地账号数据信息
for key, value := range accPool { for key, value := range accPool {
if value.Acc == event.oldAcc { if value.Acc == event.oldAcc {
@ -156,7 +161,8 @@ func (this *ClientMgr) HourChange() {
} }
} }
func (this *ClientMgr) DayChange() { // AccountDeletePolicy 账号删除策略
func (this *ClientMgr) AccountDeletePolicy() {
invalidCount := 0 //过期账号数量 invalidCount := 0 //过期账号数量
updateLimit := len(accPool) * model.GameParamData.InvalidRobotAccRate / 100 //可更新的账号数量 updateLimit := len(accPool) * model.GameParamData.InvalidRobotAccRate / 100 //可更新的账号数量
invalidAccs := []InvalidAcc{} invalidAccs := []InvalidAcc{}
@ -201,6 +207,10 @@ type ClientState struct {
Event map[int]int Event map[int]int
} }
func (c *ClientState) String() string {
return fmt.Sprintf("ClientMgrState 连接总数:%v, 每小时账号替换数量:%v", c.SessionNum, c.Event)
}
func (this *ClientMgr) GetState() *ClientState { func (this *ClientMgr) GetState() *ClientState {
ret := &ClientState{ ret := &ClientState{
SessionNum: len(this.sessionPool), SessionNum: len(this.sessionPool),

View File

@ -18,12 +18,19 @@ var (
WaitConnectSessions []*netlib.SessionConfig WaitConnectSessions []*netlib.SessionConfig
) )
func NewSessionConfig() *netlib.SessionConfig { // NewSession 新建session
BenchMarkModule.idx++ // id 连接id, 默认自动分配
func NewSession(id ...int) {
cfg := Config.Connects cfg := Config.Connects
if len(id) > 0 && id[0] > 0 {
cfg.Id = id[0]
} else {
BenchMarkModule.idx++
cfg.Id = BenchMarkModule.idx cfg.Id = BenchMarkModule.idx
}
cfg.Init() cfg.Init()
return &cfg logger.Logger.Info("waite connect session id=", cfg.Id)
WaitConnectSessions = append(WaitConnectSessions, &cfg)
} }
type BenchMark struct { type BenchMark struct {
@ -37,9 +44,7 @@ func (m *BenchMark) ModuleName() string {
func (m *BenchMark) Init() { func (m *BenchMark) Init() {
m.idx = RobotSessionStartId m.idx = RobotSessionStartId
for i := 0; i < Config.Count; i++ { for i := 0; i < Config.Count; i++ {
cfg := NewSessionConfig() NewSession()
logger.Logger.Info("waite connect session id=", cfg.Id)
WaitConnectSessions = append(WaitConnectSessions, cfg)
} }
} }

View File

@ -62,10 +62,7 @@ func (g *GateSessionHandler) OnSessionClosed(s *netlib.Session) {
StopSessionPingTimer(s) StopSessionPingTimer(s)
if reconnect { if reconnect {
logger.Logger.Infof("账号重连 sessionID:%v account:%v", s.Id, accIdParam) logger.Logger.Infof("账号重连 sessionID:%v account:%v", s.Id, accIdParam)
cfg := Config.Connects NewSession(s.GetSessionConfig().Id)
cfg.Id = s.GetSessionConfig().Id
cfg.Init()
WaitConnectSessions = append(WaitConnectSessions, &cfg)
} }
} }

View File

@ -16,9 +16,9 @@ type AccountData struct {
} }
var ( var (
// 待使用的账号,将要建立连接 // 待登录的账号,将要建立连接
accChan = make(map[string]bool) accChan = make(map[string]bool)
// 账号池,当前正在使用的机器人 // 账号池,当前正在使用的机器人账号
accPool []*AccountData accPool []*AccountData
) )
var accountFileName = "robotaccount.json" var accountFileName = "robotaccount.json"

View File

@ -1,12 +1,13 @@
package base package base
import ( import (
"fmt"
"math/rand" "math/rand"
"mongo.games.com/game/common"
"mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/netlib" "mongo.games.com/goserver/core/netlib"
"mongo.games.com/game/common"
"mongo.games.com/game/proto" "mongo.games.com/game/proto"
hall_proto "mongo.games.com/game/protocol/gamehall" hall_proto "mongo.games.com/game/protocol/gamehall"
player_proto "mongo.games.com/game/protocol/player" player_proto "mongo.games.com/game/protocol/player"
@ -20,6 +21,9 @@ func init() {
OnMiniTimerFunc: func() { OnMiniTimerFunc: func() {
PlayerMgrSingleton.OnMiniTimer() PlayerMgrSingleton.OnMiniTimer()
}, },
OnHourTimerFunc: func() {
logger.Logger.Info(PlayerMgrSingleton.GetState())
},
}) })
} }
@ -173,3 +177,22 @@ func (pm *PlayerMgr) OnSecondTimer() {
func (pm *PlayerMgr) OnMiniTimer() { func (pm *PlayerMgr) OnMiniTimer() {
pm.ProcessCheckRobotNum() pm.ProcessCheckRobotNum()
} }
type PlayerMgrState struct {
PlayerNum int
NormalSessionNum int
MatchSessionNum int
}
func (p *PlayerMgrState) String() string {
return fmt.Sprintf("PlayerMgrState 玩家总数:%v, 普通场连接数:%v, 比赛场连接数:%v", p.PlayerNum, p.NormalSessionNum, p.MatchSessionNum)
}
func (pm *PlayerMgr) GetState() *PlayerMgrState {
ret := &PlayerMgrState{
PlayerNum: len(pm.playersMapSnId),
NormalSessionNum: len(pm.playersSession),
MatchSessionNum: len(pm.playersMatchSession),
}
return ret
}

View File

@ -1,6 +1,7 @@
package base package base
import ( import (
"fmt"
"time" "time"
"mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/logger"
@ -16,11 +17,7 @@ func init() {
common.RegisterClockFunc(&common.ClockFunc{ common.RegisterClockFunc(&common.ClockFunc{
OnHourTimerFunc: func() { OnHourTimerFunc: func() {
sceneState := map[int32]int{} logger.Logger.Info(SceneMgrSingleton.GetState())
for _, v := range SceneMgrSingleton.Scenes {
sceneState[v.GetGameId()]++
}
logger.Logger.Infof("sceneState: %v", sceneState)
}, },
}) })
} }
@ -71,6 +68,22 @@ func (sm *SceneMgr) IsFreeMode(sceneId int32) bool {
return false return false
} }
type SceneMgrState struct {
Num map[int32]int
}
func (s *SceneMgrState) String() string {
return fmt.Sprintf("SceneMgrState 每个游戏的房间数量 [游戏id:房间数量]: %v", s.Num)
}
func (sm *SceneMgr) GetState() *SceneMgrState {
m := make(map[int32]int)
for _, v := range sm.Scenes {
m[v.GetGameId()]++
}
return &SceneMgrState{Num: m}
}
// ////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////
// / Module Implement [beg] // / Module Implement [beg]
// ////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////

View File

@ -341,10 +341,7 @@ func (this *Scene) PlayerEnter(p *Player, pos int, ischangeroom bool) bool {
//离场金币 //离场金币
leaverng := this.dbGameFree.GetRobotLimitCoin() leaverng := this.dbGameFree.GetRobotLimitCoin()
if len(leaverng) >= 2 { if len(leaverng) >= 2 {
rangeValue := leaverng[1] - leaverng[0] leaveCoin = int64(common.RandInt(int(leaverng[0]), int(leaverng[1])))
if rangeValue > 0 {
leaveCoin = leaverng[0] + rand.Int63n(rangeValue)
}
} }
} }

View File

@ -38,6 +38,7 @@ type SceneMgr struct {
matchAutoId int // 比赛场房间号 matchAutoId int // 比赛场房间号
coinSceneAutoId int // 金币场房间号 coinSceneAutoId int // 金币场房间号
hundredSceneAutoId int // 百人场房间号 hundredSceneAutoId int // 百人场房间号
password map[string]struct{} // 密码 password map[string]struct{} // 密码
pushList map[int]struct{} // 已经推荐过的房间列表 pushList map[int]struct{} // 已经推荐过的房间列表
lastPushSceneId int // 最后推荐的房间id lastPushSceneId int // 最后推荐的房间id