119 lines
2.3 KiB
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))
|
|
}
|
|
}
|
|
}
|
|
}
|