139 lines
3.1 KiB
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
|
|
}
|