game_sync/statistics/task/task/robotwin.go

139 lines
3.1 KiB
Go

package task
import (
"encoding/json"
"go.mongodb.org/mongo-driver/bson"
"mongo.games.com/goserver/core/logger"
"sort"
)
// RobotWinRate 机器人胜利
// 返回 玩家胜利局数,总局数
func RobotWinRate(plt string, startTime, endTime string, gamefreeid int) (a, b int, err error) {
err = GameDetailFunc(plt, startTime, endTime, gamefreeid, func(data bson.M) error {
isPlayerWin, to := GameDetailRobot(data)
if isPlayerWin {
a++
}
b += to
return nil
})
return
}
func GameDetailRobot(data bson.M) (isPlayerWin bool, to int) {
if data == nil {
return
}
gameid := data["gameid"].(int32)
gamefreeid := data["gamefreeid"].(int32)
logger.Logger.Tracef("GameDetailRobot gameid:%d, gamefreeid:%d", gameid, gamefreeid)
detail := data["gamedetailednote"]
if detail == nil {
return
}
raw := new(RabbitMQDataRaw)
if err := json.Unmarshal([]byte(detail.(string)), raw); err != nil {
logger.Logger.Errorf("GameDetailRobot Unmarshal 1 error:%v %v", err, gameid)
return
}
switch gameid {
case 207, 208, 209, 210, 240, 241, 242, 243, 244, 245, 246, 247: // tienlen
data := new(TienLenType)
b, err := json.Marshal(raw.Data)
if err != nil {
logger.Logger.Errorf("GameDetailCount Marshal error:%v %v", err, gameid)
return
}
if err := json.Unmarshal(b, data); err != nil {
logger.Logger.Errorf("GameDetailCount Unmarshal 2 error:%v %v", err, gameid)
return
}
var has, hasPlayer bool
for _, v := range data.PlayerData {
if v.IsRob {
has = true
}
if !v.IsRob {
hasPlayer = true
}
}
if !has || !hasPlayer {
// 没有机器人
return
}
sort.Slice(data.PlayerData, func(i, j int) bool {
a, b := data.PlayerData[i].BillCoin+data.PlayerData[i].BillTaxCoin, data.PlayerData[j].BillCoin+data.PlayerData[j].BillTaxCoin
if a != b {
return a > b
}
if data.PlayerData[i].IsRob != data.PlayerData[j].IsRob {
return !data.PlayerData[i].IsRob
}
return data.PlayerData[i].UserId < data.PlayerData[j].UserId
})
for k, v := range data.PlayerData {
if !v.IsRob && v.BillCoin > 0 && k <= 1 {
isPlayerWin = true
break
}
}
to = 1
case 211, 212, 213, 214:
data := new(ThirteenWaterType)
b, err := json.Marshal(raw.Data)
if err != nil {
logger.Logger.Errorf("GameDetailCount Marshal error:%v %v", err, gameid)
return
}
if err := json.Unmarshal(b, data); err != nil {
logger.Logger.Errorf("GameDetailCount Unmarshal 2 error:%v %v", err, gameid)
return
}
var has, hasPlayer bool
for _, v := range data.PlayerData {
if v.IsRob {
has = true
}
if !v.IsRob {
hasPlayer = true
}
}
if !has || !hasPlayer {
// 没有机器人
return
}
sort.Slice(data.PlayerData, func(i, j int) bool {
a, b := data.PlayerData[i].AllScore, data.PlayerData[j].AllScore
if a != b {
return a > b
}
if data.PlayerData[i].IsRob != data.PlayerData[j].IsRob {
return !data.PlayerData[i].IsRob
}
return data.PlayerData[i].UserId < data.PlayerData[j].UserId
})
for k, v := range data.PlayerData {
if !v.IsRob && v.AllScore > 0 && k <= 1 {
isPlayerWin = true
break
}
}
to = 1
}
return
}