sped up /meta
This commit is contained in:
47
main.go
47
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)
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user