don't add player to database before its confirmed he exists

This commit is contained in:
2021-11-16 14:02:15 +01:00
parent 95c93f738b
commit 1d17aa3f82
3 changed files with 89 additions and 50 deletions

View File

@@ -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

12
main.go
View File

@@ -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)

View File

@@ -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
}
}
}
}
}