server/remote/scores-sync-zqds/treat.go

119 lines
2.3 KiB
Go

package main
import (
"bytes"
"context"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"net/url"
"path"
"sync"
"golang.org/x/oauth2/clientcredentials"
"srs.epita.fr/fic-server/libfic"
)
var (
teams_scores = map[string]float64{}
base_URL = "https://api.well-played.gg"
eventId = ""
roundId = ""
TokenURL = "https://idp.well-played.gg/oauth/token"
configOauth = clientcredentials.Config{}
lock sync.Mutex
)
func getTeams(pathname string) (teams map[string]fic.ExportedTeam, err error) {
var cnt_raw []byte
if cnt_raw, err = ioutil.ReadFile(pathname); err != nil {
return
}
if err = json.Unmarshal(cnt_raw, &teams); err != nil {
return
}
return
}
func treatAll(pathname string) {
teams, err := getTeams(pathname)
if err != nil {
log.Printf("[ERR] %s\n", err)
}
for tid, team := range teams {
treat(team, tid)
}
}
func treatDiff(pathname string) {
teams, err := getTeams(pathname)
if err != nil {
log.Printf("[ERR] %s\n", err)
}
for tid, team := range teams {
if v, ok := teams_scores[tid]; !ok || v != team.Points {
treat(team, tid)
}
}
}
type ZQDSScore struct {
Score int64 `json:"score"`
}
func treat(team fic.ExportedTeam, tid string) {
lock.Lock()
defer lock.Unlock()
log.Printf("Syncing score for %q: %d\n", team.Name, int64(team.Points))
// Save in memory what is the team's score
teams_scores[tid] = team.Points
if u, err := url.Parse(base_URL); err != nil {
log.Println(err.Error())
} else {
u.Path = path.Join(u.Path, "rank", "score", roundId, team.ExternalId)
body, err := json.Marshal(ZQDSScore{int64(team.Points * 10)})
if err != nil {
log.Println("[ERR] Unable to create JSON from Score")
return
}
client := configOauth.Client(context.Background())
req, err := http.NewRequest("PUT", u.String(), bytes.NewReader(body))
if err != nil {
log.Println("[ERR] Unable to send request: ", err.Error())
return
}
req.Header.Add("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
log.Println("[ERR] Error during request execution: ", err.Error())
return
}
if resp.StatusCode != http.StatusOK {
if v, err := ioutil.ReadAll(resp.Body); err != nil {
log.Println("An error occurs when trying to send scores, then decoding response: %w", err)
} else {
log.Printf("An error occurs when trying to send scores: %s", string(v))
}
}
}
}