~xenrox/faceit_checker

7cabef803a59569c11a9b0a1549508a6b36229e8 — Thorben Günther 9 months ago 61ffbba
Propagate context

So if a request is cancelled early, the API won't be spammed.
1 files changed, 14 insertions(+), 13 deletions(-)

M faceit.go
M faceit.go => faceit.go +14 -13
@@ 2,6 2,7 @@
package main

import (
	"context"
	"crypto/tls"
	"embed"
	"encoding/json"


@@ 168,9 169,9 @@ func redirect(w http.ResponseWriter, r *http.Request, s string) {
	http.Redirect(w, r, redirect, http.StatusSeeOther)
}

func (fc *faceitChecker) checkStats(playerid string, data *faceitCSGO) error {
func (fc *faceitChecker) checkStats(ctx context.Context, playerid string, data *faceitCSGO) error {
	url := "https://open.faceit.com/data/v4/players/" + playerid + "/stats/csgo"
	req, err := http.NewRequest("GET", url, nil)
	req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
	if err != nil {
		return &statsError{"request"}
	}


@@ 194,9 195,9 @@ func (fc *faceitChecker) checkStats(playerid string, data *faceitCSGO) error {
	return json.Unmarshal(text, &data)
}

func (fc *faceitChecker) checkBan(faceitID string) (bool, string, error) {
func (fc *faceitChecker) checkBan(ctx context.Context, faceitID string) (bool, string, error) {
	url := "https://api.faceit.com/sheriff/v1/bans/" + faceitID
	req, err := http.NewRequest("GET", url, nil)
	req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
	if err != nil {
		return false, "", err
	}


@@ 229,10 230,10 @@ func (fc *faceitChecker) checkBan(faceitID string) (bool, string, error) {
	return false, "", nil
}

func (fc *faceitChecker) lastMatch(faceitID string) (time.Time, error) {
func (fc *faceitChecker) lastMatch(ctx context.Context, faceitID string) (time.Time, error) {
	var lastMatch time.Time
	url := "https://open.faceit.com/data/v4/players/" + faceitID + "/history?game=csgo&limit=1"
	req, err := http.NewRequest("GET", url, nil)
	req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
	if err != nil {
		return lastMatch, err
	}


@@ 307,11 308,11 @@ func getSteamProfile(url string) (*xmlSteam, error) {
}

// getFaceitPlayer returns a faceitInfo struct from a steamID64
func (fc *faceitChecker) getFaceitPlayer(steamID64 string) (faceitInfo, error) {
func (fc *faceitChecker) getFaceitPlayer(ctx context.Context, steamID64 string) (faceitInfo, error) {
	var info faceitInfo

	url := "https://open.faceit.com/data/v4/players?game=csgo&game_player_id=" + steamID64
	req, err := http.NewRequest("GET", url, nil)
	req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
	if err != nil {
		return info, fmt.Errorf("faceit API: %v", err)
	}


@@ 465,7 466,7 @@ func (fc *faceitChecker) requestHandler(w http.ResponseWriter, r *http.Request) 
			slog.String("name", parsed[1]))
		playerLogger.Debug("Checking player")

		data, err := fc.getFaceitPlayer(parsed[0])
		data, err := fc.getFaceitPlayer(r.Context(), parsed[0])
		if err != nil {
			playerLogger.Error("Failed to get Faceit player",
				slog.String("error", err.Error()))


@@ 474,7 475,7 @@ func (fc *faceitChecker) requestHandler(w http.ResponseWriter, r *http.Request) 
		}

		var data2 faceitCSGO
		err = fc.checkStats(data.PlayerID, &data2)
		err = fc.checkStats(r.Context(), data.PlayerID, &data2)
		if err != nil {
			playerLogger.Error("Failed to check stats",
				slog.String("error", err.Error()))


@@ 482,7 483,7 @@ func (fc *faceitChecker) requestHandler(w http.ResponseWriter, r *http.Request) 
			continue
		}

		banned, reason, err := fc.checkBan(data.PlayerID)
		banned, reason, err := fc.checkBan(r.Context(), data.PlayerID)
		if err != nil {
			playerLogger.Error("Failed to check ban status",
				slog.String("error", err.Error()))


@@ 497,7 498,7 @@ func (fc *faceitChecker) requestHandler(w http.ResponseWriter, r *http.Request) 
			status = ""
		}

		lastMatch, err := fc.lastMatch(data.PlayerID)
		lastMatch, err := fc.lastMatch(r.Context(), data.PlayerID)
		if err != nil {
			playerLogger.Error("Failed to retrieve last match",
				slog.String("error", err.Error()))


@@ 534,7 535,7 @@ func (fc *faceitChecker) getElo(w http.ResponseWriter, r *http.Request) {

	steamID64 := strings.TrimPrefix(r.URL.Path, "/api/elo/")

	data, err := fc.getFaceitPlayer(steamID64)
	data, err := fc.getFaceitPlayer(r.Context(), steamID64)
	if err != nil {
		// Validate steamid; there are two possibilies: User entered correct steamID
		// but has no Faceit account -> give him default elo or user entered wrong steamID