diff --git a/csgo/demo_loader.go b/csgo/demo_loader.go index a28886f..5e1447f 100644 --- a/csgo/demo_loader.go +++ b/csgo/demo_loader.go @@ -220,7 +220,7 @@ func (d DemoMatchLoader) connectLoop() { d.connecting = true for d.connectToSteam() != nil { log.Infof("[DL] Retrying connecting to steam...") - time.Sleep(time.Minute) + time.Sleep(time.Minute * 10) } } } @@ -245,11 +245,12 @@ func (d *DemoMatchLoader) steamEventHandler() { log.Warningf("[DL] Steam login denied: %+v", e) switch e.Result { case steamlang.EResult_AccountLogonDenied: - log.Fatalf("[DL] Please provide AuthCode with --authcode") + log.Fatalf("[DL] Please provide AuthCode in config") case steamlang.EResult_InvalidPassword: _ = os.Remove(d.sentryFile) _ = os.Remove(d.loginKey) - log.Fatalf("[DL] Steam login wrong") + log.Warningf("[DL] Steam login wrong") + go d.connectLoop() case steamlang.EResult_InvalidLoginAuthCode: log.Fatalf("[DL] Steam auth code wrong") } @@ -385,7 +386,7 @@ func (d *DemoMatchLoader) gcWorker(apiKey string, rl ratelimit.Limiter) { var players []*ent.Player for _, accountId := range lastRound.GetReservation().GetAccountIds() { - tPlayer, err := utils.GetPlayer(d.db, AccountId2SteamId(accountId), apiKey, rl) + tPlayer, err := utils.Player(d.db, AccountId2SteamId(accountId), apiKey, rl) if err != nil { log.Warningf("[DL] Unable to get player for steamid %d: %v", AccountId2SteamId(accountId), err) continue diff --git a/main.go b/main.go index 3f9ab3c..91bfb49 100644 --- a/main.go +++ b/main.go @@ -69,7 +69,7 @@ func housekeeping() { if len(tPlayerNeedSteamUpdate) > 0 { log.Infof("[HK] Refreshing %d profiles from steam", len(tPlayerNeedSteamUpdate)) - _, err = utils.UpdatePlayerFromSteam(tPlayerNeedSteamUpdate, db, conf.Steam.APIKey, rL) + _, err = utils.PlayerFromSteam(tPlayerNeedSteamUpdate, db, conf.Steam.APIKey, rL) if err != nil { log.Warningf("[HK] Unable to update profiles from steam: %v", err) } @@ -191,7 +191,7 @@ func getPlayerMeta(w http.ResponseWriter, r *http.Request) { return } - tPlayer, err := utils.GetPlayer(db, id, conf.Steam.APIKey, nil) + tPlayer, err := utils.Player(db, id, conf.Steam.APIKey, nil) if err != nil { log.Infof("[GPM] Player not found: %+v", err) w.WriteHeader(http.StatusNotFound) @@ -242,7 +242,7 @@ func getPlayerMeta(w http.ResponseWriter, r *http.Request) { for _, p := range append(metaStats.BestMates, metaStats.MostMates...) { if p.Player.Name == "" { - tP, err := utils.GetPlayer(db, p.Player.SteamID64, conf.Steam.APIKey, nil) + tP, err := utils.Player(db, p.Player.SteamID64, conf.Steam.APIKey, nil) if err != nil { log.Warningf("[GPM] Failure getting player: %v", err) w.WriteHeader(http.StatusInternalServerError) @@ -288,7 +288,7 @@ func getPlayer(w http.ResponseWriter, r *http.Request) { offsetTime = time.Unix(unixOffset, 0).UTC() } - tPlayer, err := utils.GetPlayer(db, id, conf.Steam.APIKey, nil) + tPlayer, err := utils.Player(db, id, conf.Steam.APIKey, nil) if err != nil { log.Infof("[GP] Player not found: %+v", err) w.WriteHeader(http.StatusNotFound) @@ -410,7 +410,7 @@ func deletePlayerTrack(w http.ResponseWriter, r *http.Request) { return } - tPlayer, err := utils.GetPlayer(db, id, conf.Steam.APIKey, nil) + tPlayer, err := utils.Player(db, id, conf.Steam.APIKey, nil) if err != nil { log.Infof("[PPT] player not found: %+v", err) w.WriteHeader(http.StatusNotFound) @@ -459,7 +459,7 @@ func postPlayerTrack(w http.ResponseWriter, r *http.Request) { return } - tPlayer, err := utils.GetPlayer(db, id, conf.Steam.APIKey, rL) + tPlayer, err := utils.Player(db, id, conf.Steam.APIKey, rL) if err != nil { log.Infof("[PPT] player not found: %+v", err) w.WriteHeader(http.StatusNotFound) diff --git a/utils/utils.go b/utils/utils.go index 34ebe01..acd30f7 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -540,10 +540,10 @@ func getNextShareCode(lastCode string, apiKey string, authCode string, steamId u return rJson.Result.Code, nil } -func GetPlayer(db *ent.Client, id interface{}, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) { +func Player(db *ent.Client, id interface{}, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) { switch e := id.(type) { case uint64: - return GetPlayerFromSteamID64(db, e, apiKey, rl) + return PlayerFromSteamID64(db, e, apiKey, rl) case string: if SteamId64RegEx.MatchString(e) { steamID64, err := strconv.ParseUint(e, 10, 64) @@ -551,16 +551,16 @@ func GetPlayer(db *ent.Client, id interface{}, apiKey string, rl ratelimit.Limit return nil, err } - return GetPlayerFromSteamID64(db, steamID64, apiKey, rl) + return PlayerFromSteamID64(db, steamID64, apiKey, rl) } - return GetPlayerFromVanityURL(db, e, apiKey, rl) + return PlayerFromVanityURL(db, e, apiKey, rl) default: return nil, fmt.Errorf("invalid arguments") } } -func GetPlayerFromVanityURL(db *ent.Client, id string, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) { +func PlayerFromVanityURL(db *ent.Client, id string, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) { if id == "" { return nil, fmt.Errorf("invalid arguments") } @@ -581,7 +581,7 @@ func GetPlayerFromVanityURL(db *ent.Client, id string, apiKey string, rl ratelim return nil, fmt.Errorf("vanity url not found") } - nPlayer, err := GetPlayerFromSteamID64(db, resp.SteamID, apiKey, rl) + nPlayer, err := PlayerFromSteamID64(db, resp.SteamID, apiKey, rl) if err != nil { return nil, err } @@ -590,30 +590,43 @@ func GetPlayerFromVanityURL(db *ent.Client, id string, apiKey string, rl ratelim } } -func GetPlayerFromSteamID64(db *ent.Client, steamID uint64, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) { +func PlayerFromSteamID64(db *ent.Client, steamID uint64, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) { tPlayer, err := db.Player.Get(context.Background(), steamID) if err == nil { return tPlayer, nil } else { - nPlayer, err := db.Player.Create().SetID(steamID).Save(context.Background()) - if err != nil { - return nil, err - } - - uPlayer, err := UpdatePlayerFromSteam([]*ent.Player{nPlayer}, db, apiKey, rl) + nPlayer := &ent.Player{ID: steamID} + uPlayer, err := PlayerFromSteam([]*ent.Player{nPlayer}, nil, apiKey, rl) if err != nil { return nil, err } if len(uPlayer) > 0 { - return uPlayer[0], nil - } else { - return nil, nil + nPlayer, err = db.Player.Create(). + SetID(steamID). + SetName(uPlayer[0].Name). + SetAvatar(uPlayer[0].Avatar). + SetSteamUpdated(uPlayer[0].SteamUpdated). + SetVanityURL(uPlayer[0].VanityURL). + SetVanityURLReal(uPlayer[0].VanityURLReal). + SetProfileCreated(uPlayer[0].ProfileCreated). + SetGameBanCount(uPlayer[0].GameBanCount). + SetVacCount(uPlayer[0].VacCount). + SetVacDate(uPlayer[0].VacDate). + SetGameBanDate(uPlayer[0].GameBanDate). + Save(context.Background()) + if err != nil { + return nil, err + } + + return nPlayer, nil } + + return nil, nil } } -func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string, rl ratelimit.Limiter) ([]*ent.Player, error) { +func PlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string, rl ratelimit.Limiter) ([]*ent.Player, error) { var idsToUpdate []uint64 for _, updatePlayer := range players { @@ -628,10 +641,9 @@ func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string, return nil, err } + // TODO: what happens if a player deleted their profile? var nPlayers []*ent.Player for _, pS := range playerSum { - // TODO: what happens if a player deleted their profile? - // check for vanityURL if SteamId64RegEx.MatchString(path.Base(pS.ProfileURL)) { pS.ProfileURL = "" @@ -639,17 +651,29 @@ func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string, pS.ProfileURL = path.Base(pS.ProfileURL) } - tPlayer, err := db.Player.UpdateOneID(pS.SteamID). - SetName(pS.PersonaName). - SetAvatar(pS.AvatarHash). - SetSteamUpdated(time.Now().UTC()). - SetVanityURL(strings.ToLower(pS.ProfileURL)). - SetVanityURLReal(pS.ProfileURL). - SetSteamUpdated(time.Now().UTC()). - SetProfileCreated(time.Unix(pS.TimeCreated, 0).UTC()). - Save(context.Background()) - if err != nil { - return nil, err + var tPlayer *ent.Player + if db != nil { + tPlayer, err = db.Player.UpdateOneID(pS.SteamID). + SetName(pS.PersonaName). + SetAvatar(pS.AvatarHash). + SetVanityURL(strings.ToLower(pS.ProfileURL)). + SetVanityURLReal(pS.ProfileURL). + SetSteamUpdated(time.Now().UTC()). + SetProfileCreated(time.Unix(pS.TimeCreated, 0).UTC()). + Save(context.Background()) + if err != nil { + return nil, err + } + } else { + tPlayer = &ent.Player{ + ID: pS.SteamID, + Name: pS.PersonaName, + Avatar: pS.AvatarHash, + VanityURL: strings.ToLower(pS.ProfileURL), + VanityURLReal: pS.ProfileURL, + SteamUpdated: time.Now().UTC(), + ProfileCreated: time.Unix(pS.TimeCreated, 0), + } } nPlayers = append(nPlayers, tPlayer) } @@ -663,20 +687,34 @@ func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string, } for _, ban := range bans { - if ban.NumberOfVACBans > 0 { + if ban.VACBanned || ban.NumberOfGameBans > 0 { banDate := time.Now().UTC().AddDate(0, 0, -1*int(ban.DaysSinceLastBan)) - err := db.Player.UpdateOneID(ban.SteamID).SetVacCount(int(ban.NumberOfVACBans)).SetVacDate(banDate).Exec(context.Background()) - if err != nil { - return nil, err + if db != nil && ban.VACBanned { + err := db.Player.UpdateOneID(ban.SteamID).SetVacCount(int(ban.NumberOfVACBans)).SetVacDate(banDate).Exec(context.Background()) + if err != nil { + return nil, err + } } - } - if ban.NumberOfGameBans > 0 { - banDate := time.Now().UTC().AddDate(0, 0, -1*int(ban.DaysSinceLastBan)) - err := db.Player.UpdateOneID(ban.SteamID).SetGameBanCount(int(ban.NumberOfGameBans)).SetGameBanDate(banDate).Exec(context.Background()) - if err != nil { - return nil, err + if db != nil && ban.NumberOfGameBans > 0 { + err := db.Player.UpdateOneID(ban.SteamID).SetGameBanCount(int(ban.NumberOfGameBans)).SetGameBanDate(banDate).Exec(context.Background()) + if err != nil { + return nil, err + } + } + + for _, p := range nPlayers { + if p.ID == ban.SteamID { + if ban.NumberOfGameBans > 0 { + p.GameBanCount = int(ban.NumberOfGameBans) + p.GameBanDate = banDate + } + if ban.VACBanned { + p.VacCount = int(ban.NumberOfVACBans) + p.GameBanDate = banDate + } + } } } }