Files
cheesy-arena-lite/web/scores.go
2021-05-16 11:00:29 -07:00

116 lines
2.7 KiB
Go

// Copyright 2020 Team 254. All Rights Reserved.
// Author: kenschenke@gmail.com (Ken Schenke)
//
// Web handlers for handling realtime scores API.
/*
API Docs
JSON Schema:
{
“red”: {“auto”: 99, “teleop”: 99, “endgame": 99},
“blue”: {“auto”: 99, “teleop”: 99, “endgame": 99}
}
GET http://10.0.100.5/api/scores
Returns current score.
PUT http://10.0.100.5/api/scores
Sets the current scores from the request body. All
parts are optional. Anything missing is set to zero.
Example:
{
“red”: {“auto”: 10}
}
Red teleop and endgame are set to zero as well as all blue scores.
PATCH http://10.0.100.5/api/scores
Adds or subtracts the current scores from the request
body. All parts are optional. Scores missing from the
request body are left untouched.
Example:
{
“red”: {“auto”: 10},
"blue": {"teleop": -5}
}
10 is added to red auto. Red teleop and endgame are left untouched.
5 is subtracted from blue teleop. Blue auto and endgame are left untouched.
*/
package web
import (
"encoding/json"
"github.com/Team254/cheesy-arena-lite/field"
"github.com/Team254/cheesy-arena-lite/game"
"io/ioutil"
"net/http"
)
type jsonAllianceScore struct {
Auto int `json:"auto"`
Teleop int `json:"teleop"`
Endgame int `json:"endgame"`
}
type jsonScore struct {
Red jsonAllianceScore `json:"red"`
Blue jsonAllianceScore `json:"blue"`
}
func (web *Web) getScoresHandler(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(jsonScore{
Red: jsonAllianceScore{
Auto: web.arena.RedScore.AutoPoints,
Teleop: web.arena.RedScore.TeleopPoints,
Endgame: web.arena.RedScore.EndgamePoints,
},
Blue: jsonAllianceScore{
Auto: web.arena.BlueScore.AutoPoints,
Teleop: web.arena.BlueScore.TeleopPoints,
Endgame: web.arena.BlueScore.EndgamePoints,
},
})
}
func (web *Web) setScoresHandler(w http.ResponseWriter, r *http.Request) {
if web.arena.MatchState == field.PreMatch || web.arena.MatchState == field.TimeoutActive ||
web.arena.MatchState == field.PostTimeout {
http.Error(w, "Score cannot be updated in this match state", http.StatusBadRequest)
return
}
var scores jsonScore
reqBody, err := ioutil.ReadAll(r.Body)
if err != nil {
handleWebErr(w, err)
return
}
json.Unmarshal(reqBody, &scores)
if r.Method == "PUT" {
web.arena.RedScore = new(game.Score)
web.arena.BlueScore = new(game.Score)
}
web.arena.RedScore.AutoPoints += scores.Red.Auto
web.arena.RedScore.TeleopPoints += scores.Red.Teleop
web.arena.RedScore.EndgamePoints += scores.Red.Endgame
web.arena.BlueScore.AutoPoints += scores.Blue.Auto
web.arena.BlueScore.TeleopPoints += scores.Blue.Teleop
web.arena.BlueScore.EndgamePoints += scores.Blue.Endgame
web.arena.RealtimeScoreNotifier.Notify()
}