diff --git a/main.go b/main.go index 2e9ed42..16b0238 100644 --- a/main.go +++ b/main.go @@ -178,9 +178,9 @@ func getPlayerMeta(w http.ResponseWriter, r *http.Request) { } metaStats := new(utils.MetaStatsResponse) - err = rdc.Get(context.Background(), fmt.Sprintf(utils.SideMetaCacheKey, tPlayer.ID, limit), &metaStats) + err = rdc.Get(context.Background(), fmt.Sprintf(utils.SideMetaCacheKey, tPlayer.ID), &metaStats) if err != nil { - metaStats, err = utils.GetMetaStats(tPlayer, db.Lock, limit) + metaStats, err = utils.GetMetaStats(tPlayer, db.Lock) if err != nil { log.Infof("[GPM] Unable to get MetaStats: %v", err) w.WriteHeader(http.StatusInternalServerError) @@ -189,7 +189,7 @@ func getPlayerMeta(w http.ResponseWriter, r *http.Request) { err = rdc.Set(&cache.Item{ Ctx: context.Background(), - Key: fmt.Sprintf(utils.SideMetaCacheKey, tPlayer.ID, limit), + Key: fmt.Sprintf(utils.SideMetaCacheKey, tPlayer.ID), Value: metaStats, TTL: time.Hour * 24 * 30, }) @@ -203,6 +203,47 @@ func getPlayerMeta(w http.ResponseWriter, r *http.Request) { log.Debugf("[GPM] SideMetaStats for %d from cache", tPlayer.ID) } + if len(metaStats.BestMates) > limit { + metaStats.BestMates = metaStats.BestMates[:limit] + } + if len(metaStats.MostMates) > limit { + metaStats.MostMates = metaStats.MostMates[:limit] + } + if len(metaStats.WeaponDmg) > limit { + metaStats.WeaponDmg = metaStats.WeaponDmg[:limit] + } + + for _, wD := range metaStats.WeaponDmg { + if _, exist := metaStats.EqMap[wD.Eq]; !exist { + metaStats.EqMap[wD.Eq] = common.EquipmentType(wD.Eq).String() + } + } + + for _, p := range append(metaStats.BestMates, metaStats.MostMates...) { + if p.Player.Name == "" { + tP, err := db.Client.Player.Get(context.Background(), p.Player.SteamID64) + if err != nil { + log.Warningf("[GPM] Failure getting player: %v", err) + w.WriteHeader(http.StatusInternalServerError) + return + } + p.Player.Avatar = tP.Avatar + p.Player.Name = tP.Name + p.Player.VAC = !tP.VacDate.IsZero() + p.Player.Tracked = tP.AuthCode != "" + p.Player.GameBan = !tP.GameBanDate.IsZero() + p.Player.VanityURL = tP.VanityURLReal + + if !tP.GameBanDate.IsZero() { + p.Player.GameBanDate = tP.GameBanDate.Unix() + } + + if !tP.VacDate.IsZero() { + p.Player.VACDate = tP.VacDate.Unix() + } + } + } + err = utils.SendJSON(metaStats, w) if err != nil { log.Errorf("[GPM] Unable to marshal JSON: %v", err) diff --git a/utils/utils.go b/utils/utils.go index 30dde4b..e726802 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -6,6 +6,7 @@ import ( "csgowtfd/ent/match" "csgowtfd/ent/player" "csgowtfd/ent/stats" + "csgowtfd/ent/weaponstats" "encoding/json" "entgo.io/ent/dialect/sql" "errors" @@ -196,7 +197,7 @@ type ( const ( shareCodeURLEntry = "https://api.steampowered.com/ICSGOPlayers_730/GetNextMatchSharingCode/v1?key=%s&steamid=%d&steamidkey=%s&knowncode=%s" - SideMetaCacheKey = "csgowtfd_side_meta_%d_%d" + SideMetaCacheKey = "csgowtfd_side_meta_%d" MatchMetaCacheKey = "csgowtfd_match_meta_%d" ) @@ -230,12 +231,12 @@ func GetMatchStats(dbPlayer *ent.Player, lock *sync.RWMutex) (int, int, int, err return wins, ties, loss, nil } -func GetMetaStats(dbPlayer *ent.Player, lock *sync.RWMutex, limit int) (*MetaStatsResponse, error) { +func GetMetaStats(dbPlayer *ent.Player, lock *sync.RWMutex) (*MetaStatsResponse, error) { mResponse := new(MetaStatsResponse) mResponse.Player = &PlayerResponse{SteamID64: dbPlayer.ID} lock.RLock() - tPlayers, err := dbPlayer.QueryMatches().QueryPlayers().All(context.Background()) + tPlayers, err := dbPlayer.QueryMatches().QueryPlayers().Select(player.FieldID).All(context.Background()) lock.RUnlock() if err != nil { return nil, err @@ -264,14 +265,15 @@ func GetMetaStats(dbPlayer *ent.Player, lock *sync.RWMutex, limit int) (*MetaSta playerRes := &PlayerResponse{ SteamID64: s.ID, - Name: s.Name, - Avatar: s.Avatar, - Tracked: s.AuthCode != "", - VanityURL: s.VanityURLReal, } lock.RLock() - pMatches, err := s.QueryMatches().Where(match.IDIn(matchIDs...)).WithStats().Where(match.HasStatsWith(stats.Or(stats.PlayerStats(dbPlayer.ID), stats.PlayerStats(s.ID)))).All(context.Background()) + pMatches, err := s.QueryMatches(). + Select(match.FieldID, match.FieldMatchResult, match.FieldMap). + Where(match.IDIn(matchIDs...)). + WithStats(). + Where(match.HasStatsWith(stats.Or(stats.PlayerStats(dbPlayer.ID), stats.PlayerStats(s.ID)))). + All(context.Background()) lock.RUnlock() if err != nil { return nil, err @@ -307,7 +309,8 @@ func GetMetaStats(dbPlayer *ent.Player, lock *sync.RWMutex, limit int) (*MetaSta } lock.RLock() - wSs, err := subjectStats.QueryWeaponStats().All(context.Background()) + wSs, err := subjectStats.QueryWeaponStats(). + Select(weaponstats.FieldEqType, weaponstats.FieldEqType).All(context.Background()) lock.RUnlock() if err != nil { return nil, err @@ -381,14 +384,14 @@ func GetMetaStats(dbPlayer *ent.Player, lock *sync.RWMutex, limit int) (*MetaSta return mResponse.WeaponDmg[i].Dmg > mResponse.WeaponDmg[j].Dmg }) - if len(mResponse.BestMates) > limit { - mResponse.BestMates = mResponse.BestMates[:limit] + if len(mResponse.BestMates) > 10 { + mResponse.BestMates = mResponse.BestMates[:10] } - if len(mResponse.MostMates) > limit { - mResponse.MostMates = mResponse.MostMates[:limit] + if len(mResponse.MostMates) > 10 { + mResponse.MostMates = mResponse.MostMates[:10] } - if len(mResponse.WeaponDmg) > limit { - mResponse.WeaponDmg = mResponse.WeaponDmg[:limit] + if len(mResponse.WeaponDmg) > 10 { + mResponse.WeaponDmg = mResponse.WeaponDmg[:10] } for _, wD := range mResponse.WeaponDmg {