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 }