111 lines
2.7 KiB
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
|
|
}
|