game_sync/worldsrv/actmonitormgr.go

178 lines
4.9 KiB
Go

package main
import (
"math"
"mongo.games.com/game/model"
"mongo.games.com/goserver/core/logger"
"sort"
)
const (
ActState_Login int32 = 1 << iota //登录.1
ActState_Exchange //兑换.2
ActState_Game //游戏.3
ActState_Max
)
var ActMonitorMgrSington = &ActMonitorMgr{
ActMonitorList: make(map[int64]*ActMonitorInfo),
}
type ActMonitorInfo struct {
SeqNo int64
SnId int32
Platform string //平台
MonitorType int32 //二进制 1.登录 2.兑换 3.游戏
CreateTime int64 //创建时间
Creator string //创建者
ReMark string //备注
GameName string //当前所在游戏名字
State int //玩家状态 0.全部 1.不在线 2.在线 3.游戏中
}
type ActMonitorMgr struct {
ActMonitorList map[int64]*ActMonitorInfo
NowActSeqNo int64
}
// monitorType 自己的类型 flag 当前触发的类型
func (u *ActMonitorMgr) IsMarkFlag(monitorType, flag int32) bool {
if (monitorType & flag) != 0 {
return true
}
return false
}
func (u *ActMonitorMgr) Init() {
actMonitorData := model.GetAllActMonitorData()
for _, info := range actMonitorData {
ami := &ActMonitorInfo{
SeqNo: info.SeqNo,
SnId: info.SnId,
Platform: info.Platform,
MonitorType: info.MonitorType,
CreateTime: info.CreateTime,
Creator: info.Creator,
ReMark: info.ReMark,
}
if u.NowActSeqNo < info.SeqNo {
u.NowActSeqNo = info.SeqNo
}
u.ActMonitorList[info.SeqNo] = ami
}
}
type ActMonitorList struct {
PageNo int
PageSize int
PageSum int
TotalSum int
Data []*ActMonitorInfo
}
func (u *ActMonitorMgr) QueryAMIList(pageNo, pageSize int, platform string, snid, startTs, endTs, state int) *ActMonitorList {
if len(u.ActMonitorList) == 0 {
return nil
}
var amiList = make([]*ActMonitorInfo, 0)
for _, v := range u.ActMonitorList {
if len(platform) != 0 && v.Platform != platform {
continue
}
if snid != 0 && v.SnId != int32(snid) {
continue
}
if startTs != 0 && endTs != 0 && (v.CreateTime < int64(startTs) || v.CreateTime > int64(endTs)) {
continue
}
if state != 0 && v.State != state {
continue
}
amiList = append(amiList, v)
}
sort.Slice(amiList, func(i, j int) bool {
if amiList[i].SeqNo > amiList[j].SeqNo {
return true
}
return false
})
totalNum := len(amiList) //总条目
pageSum := int(math.Ceil(float64(totalNum) / float64(pageSize))) //总页数
if pageNo <= 0 || pageNo > pageSum {
pageNo = 1 //当前页
}
start := (pageNo - 1) * pageSize
end := start + pageSize
if totalNum > start {
if totalNum < end {
end = totalNum
}
amiList = amiList[start:end]
}
for k, v := range amiList {
actPlayer := amiList[k]
actPlayer.GameName = ""
p := PlayerMgrSington.GetPlayerBySnId(v.SnId)
if p != nil {
if p.IsOnLine() {
actPlayer.State = 2
} else {
actPlayer.State = 1
}
if p.scene != nil {
actPlayer.State = 3
actPlayer.GameName = p.scene.dbGameFree.GetName() + p.scene.dbGameFree.GetTitle()
}
} else {
actPlayer.State = 1
}
}
return &ActMonitorList{pageNo, pageSize, pageSum, totalNum, amiList}
}
func (u *ActMonitorMgr) Edit(amt *ActMonitorInfo) {
u.ActMonitorList[amt.SeqNo] = amt
}
func (u *ActMonitorMgr) Del(seqNo int64) {
delete(u.ActMonitorList, seqNo)
}
func (u *ActMonitorMgr) AddSeqNo() int64 {
u.NowActSeqNo++
return u.NowActSeqNo
}
func (u *ActMonitorMgr) GetSeqNo(snid int32, platform string) int64 {
for _, v := range u.ActMonitorList {
if v.SnId == snid && v.Platform == platform {
return v.SeqNo
}
}
return -1
}
func (u *ActMonitorMgr) SendActMonitorEvent(eventType, snid int32, name, platform string, billNo, exchangeCoin int64,
gameSceneName string, state int32) {
logger.Logger.Tracef("SendActMonitorEvent eventType:%v snid:%v name:%v platform:%v billNo:%v exchangeCoin:%v "+
"gameSceneName:%v state:%v", eventType, snid, name, platform, billNo, exchangeCoin, gameSceneName, state)
//seqNo := u.GetSeqNo(snid, platform)
//if data, ok := u.ActMonitorList[seqNo]; ok {
// if u.IsMarkFlag(eventType, data.MonitorType) {
// var flag int32
// if eventType == ActState_Login {
// flag = 1
// } else if eventType == ActState_Exchange {
// flag = 2
// } else if eventType == ActState_Game {
// flag = 3
// }
// logger.Logger.Tracef("GenerateActMonitorEvent "+
// "flag:%v eventType:%v snid:%v name:%v platform:%v billNo:%v exchangeCoin:%v "+
// "gameSceneName:%v state:%v reMark:%v",
// flag, eventType, snid, name, platform, billNo, exchangeCoin, gameSceneName, state, data.ReMark)
// LogChannelSingleton.WriteMQData(model.GenerateActMonitorEvent(flag, snid, name, platform,
// time.Now().Unix(), billNo, exchangeCoin, gameSceneName, state, data.ReMark))
// }
//}
}
func init() {
//RegisterParallelLoadFunc("用户行为监控列表", func() error {
// ActMonitorMgrSington.Init()
// return nil
//})
}