game_sync/statistics/task/task/gamerate.go

111 lines
2.7 KiB
Go

package task
import (
"encoding/json"
"go.mongodb.org/mongo-driver/bson"
"mongo.games.com/goserver/core/logger"
"slices"
)
// 场次平均倍数
func PlayerGameRate(plt string, startTime, endTime string, gamefreeid int) (total, bombTotal, remain2Total int, rateAvg, bombRateAvg float64, err error) {
var totalRate, totalBombRate float64
err = GameDetailFunc(plt, startTime, endTime, gamefreeid, func(data bson.M) error {
rate, isBomb, bombRate, remain2 := GameDetailRate(data)
total++
if isBomb {
bombTotal++
}
totalRate += rate
totalBombRate += bombRate
if remain2 {
remain2Total++
}
return nil
})
if total > 0 {
rateAvg = totalRate / float64(total)
}
if bombTotal > 0 {
bombRateAvg = totalBombRate / float64(bombTotal)
}
return
}
// rate 赢分/底分
// isBomb 是否有炸弹
// bombRate 炸弹倍数,炸弹赢分/底分
// remain2 是否有剩余2
func GameDetailRate(data bson.M) (rate float64, isBomb bool, bombRate float64, remain2 bool) {
if data == nil {
return
}
gameid := data["gameid"].(int32)
gamefreeid := data["gamefreeid"].(int32)
logger.Logger.Tracef("GameDetail 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("GameDetailCount Unmarshal 1 error:%v %v", err, gameid)
return
}
switch gameid {
case 207, 208, 209, 210, 240, 241, 242, 243, 244, 245, 246, 247: // tienlen
d := 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, d); err != nil {
logger.Logger.Errorf("GameDetailCount Unmarshal 2 error:%v %v", err, gameid)
return
}
for _, v := range d.PlayerData {
if v.BillCoin > 0 {
rate = float64(v.BillCoin+v.BillTaxCoin) / float64(d.BaseScore)
}
if v.BombCoin > 0 {
isBomb = true
bombRate = float64(v.BombCoin+v.BombTaxCoin) / float64(d.BaseScore)
}
if slices.ContainsFunc(v.CardInfoEnd, func(i int32) bool {
switch i {
case 51, 38, 25, 12:
return true
}
return false
}) {
remain2 = true
}
}
case 211, 212, 213, 214:
d := 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, d); err != nil {
logger.Logger.Errorf("GameDetailCount Unmarshal 2 error:%v %v", err, gameid)
return
}
for _, v := range d.PlayerData {
if v.AllScore > 0 {
rate = float64(v.AllScore) / float64(d.BaseScore)
}
}
}
return
}