Fixed TBA match and rankings publishing.

This commit is contained in:
Patrick Fairbank
2015-09-10 20:13:05 -07:00
parent 83e98c341a
commit ab5b493147
3 changed files with 55 additions and 33 deletions

View File

@@ -128,6 +128,11 @@ func ScheduleSavePostHandler(w http.ResponseWriter, r *http.Request) {
if eventSettings.TbaPublishingEnabled && cachedMatchType != "practice" {
// Publish schedule to The Blue Alliance.
err = DeletePublishedMatches()
if err != nil {
http.Error(w, "Failed to delete published matches: "+err.Error(), 500)
return
}
err = PublishMatches()
if err != nil {
http.Error(w, "Failed to publish matches: "+err.Error(), 500)

54
tba.go
View File

@@ -29,6 +29,7 @@ var tbaEventNames = make(map[string]string)
type TbaMatch struct {
CompLevel string `json:"comp_level"`
SetNumber int `json:"set_number"`
MatchNumber int `json:"match_number"`
Alliances map[string]interface{} `json:"alliances"`
ScoreBreakdown map[string]TbaScoreBreakdown `json:"score_breakdown"`
@@ -37,23 +38,23 @@ type TbaMatch struct {
}
type TbaScoreBreakdown struct {
Coopertition int `json:"coopertition"`
Auto int `json:"auto"`
Container int `json:"container"`
Tote int `json:"tote"`
Litter int `json:"litter"`
Foul int `json:"foul"`
Coopertition int `json:"coopertition_points"`
Auto int `json:"auto_points"`
Container int `json:"container_points"`
Tote int `json:"tote_points"`
Litter int `json:"litter_points"`
Foul int `json:"foul_points"`
}
type TbaRanking struct {
TeamKey string `json:"team_key"`
Rank int `json:"rank"`
QA float64 `json:"qa"`
Coopertition int `json:"coopertition"`
Auto int `json:"auto"`
Container int `json:"container"`
Tote int `json:"tote"`
Litter int `json:"litter"`
QA float64 `json:"QA"`
Coopertition int `json:"Coopertition"`
Auto int `json:"Auto"`
Container int `json:"Container"`
Tote int `json:"Tote"`
Litter int `json:"Litter"`
Dqs int `json:"dqs"`
Played int `json:"played"`
}
@@ -208,7 +209,7 @@ func PublishTeams() error {
return err
}
resp, err := postTbaRequest("team_list", jsonBody)
resp, err := postTbaRequest("team_list", "update", jsonBody)
if err != nil {
return err
}
@@ -263,11 +264,12 @@ func PublishMatches() error {
}
}
tbaMatches[i] = TbaMatch{"qm", matchNumber, map[string]interface{}{"red": redAlliance,
tbaMatches[i] = TbaMatch{"qm", 0, matchNumber, map[string]interface{}{"red": redAlliance,
"blue": blueAlliance}, scoreBreakdown, match.Time.Local().Format("3:04 PM"),
match.Time.Format("2006-01-02T15:04:05")}
if match.Type == "elimination" {
tbaMatches[i].CompLevel = map[int]string{1: "f", 2: "sf", 4: "qf", 8: "ef"}[match.ElimRound]
tbaMatches[i].SetNumber = match.ElimGroup
tbaMatches[i].MatchNumber = match.ElimInstance
}
}
@@ -276,7 +278,7 @@ func PublishMatches() error {
return err
}
resp, err := postTbaRequest("matches", jsonBody)
resp, err := postTbaRequest("matches", "update", jsonBody)
if err != nil {
return err
}
@@ -308,7 +310,7 @@ func PublishRankings() error {
return err
}
resp, err := postTbaRequest("rankings", jsonBody)
resp, err := postTbaRequest("rankings", "update", jsonBody)
if err != nil {
return err
}
@@ -339,7 +341,21 @@ func PublishAlliances() error {
return err
}
resp, err := postTbaRequest("alliance_selections", jsonBody)
resp, err := postTbaRequest("alliance_selections", "update", jsonBody)
if err != nil {
return err
}
if resp.StatusCode != 200 {
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
return fmt.Errorf("Got status code %d from TBA: %s", resp.StatusCode, body)
}
return nil
}
// Clears out the existing match data on The Blue Alliance for the event.
func DeletePublishedMatches() error {
resp, err := postTbaRequest("matches", "delete_all", []byte(eventSettings.TbaEventCode))
if err != nil {
return err
}
@@ -359,8 +375,8 @@ func getTbaTeam(team int) string {
// HELPERS
// Signs the request and sends it to the TBA API.
func postTbaRequest(resource string, body []byte) (*http.Response, error) {
path := fmt.Sprintf("/api/trusted/v1/event/%s/%s/update", eventSettings.TbaEventCode, resource)
func postTbaRequest(resource string, action string, body []byte) (*http.Response, error) {
path := fmt.Sprintf("/api/trusted/v1/event/%s/%s/%s", eventSettings.TbaEventCode, resource, action)
signature := fmt.Sprintf("%x", md5.Sum(append([]byte(eventSettings.TbaSecret+path), body...)))
client := &http.Client{}

View File

@@ -51,7 +51,7 @@ func TestPublishMatches(t *testing.T) {
eventSettings, _ = db.GetEventSettings()
match1 := Match{Type: "qualification", DisplayName: "2", Time: time.Unix(600, 0), Red1: 7, Red2: 8, Red3: 9,
Blue1: 10, Blue2: 11, Blue3: 12, Status: "complete"}
match2 := Match{Type: "elimination", DisplayName: "SF2-2", ElimRound: 2, ElimInstance: 2}
match2 := Match{Type: "elimination", DisplayName: "SF2-2", ElimRound: 2, ElimGroup: 2, ElimInstance: 2}
db.CreateMatch(&match1)
db.CreateMatch(&match2)
matchResult1 := buildTestMatchResult(match1.Id, 1)
@@ -61,15 +61,16 @@ func TestPublishMatches(t *testing.T) {
tbaServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var reader bytes.Buffer
reader.ReadFrom(r.Body)
assert.Equal(t, "[{\"comp_level\":\"qm\",\"match_number\":2,\"alliances\":{\"blue\":{\"score\":104,"+
"\"teams\":[\"frc10\",\"frc11\",\"frc12\"]},\"red\":{\"score\":92,\"teams\":[\"frc7\","+
"\"frc8\",\"frc9\"]}},\"score_breakdown\":{\"blue\":{\"coopertition\":40,\"auto\":10,"+
"\"container\":24,\"tote\":24,\"litter\":6,\"foul\":0},\"red\":{\"coopertition\":40,"+
"\"auto\":28,\"container\":24,\"tote\":12,\"litter\":6,\"foul\":18}},\"time_string\":"+
"\"4:10 PM\",\"time_utc\":\"1970-01-01T00:10:00\"},{\"comp_level\":\"sf\",\"match_number\":2,"+
"\"alliances\":{\"blue\":{\"score\":null,\"teams\":[\"frc0\",\"frc0\",\"frc0\"]},\"red\":"+
"{\"score\":null,\"teams\":[\"frc0\",\"frc0\",\"frc0\"]}},\"score_breakdown\":null,"+
"\"time_string\":\"4:00 PM\",\"time_utc\":\"0001-01-01T00:00:00\"}]", reader.String())
assert.Equal(t, "[{\"comp_level\":\"qm\",\"set_number\":0,\"match_number\":2,\"alliances\":{\"blue\""+
":{\"score\":104,\"teams\":[\"frc10\",\"frc11\",\"frc12\"]},\"red\":{\"score\":92,\"teams\":[\"f"+
"rc7\",\"frc8\",\"frc9\"]}},\"score_breakdown\":{\"blue\":{\"coopertition_points\":40,\"auto_poi"+
"nts\":10,\"container_points\":24,\"tote_points\":24,\"litter_points\":6,\"foul_points\":0},\"re"+
"d\":{\"coopertition_points\":40,\"auto_points\":28,\"container_points\":24,\"tote_points\":12,"+
"\"litter_points\":6,\"foul_points\":18}},\"time_string\":\"4:10 PM\",\"time_utc\":\"1970-01-01T"+
"00:10:00\"},{\"comp_level\":\"sf\",\"set_number\":2,\"match_number\":2,\"alliances\":{\"blue\":"+
"{\"score\":null,\"teams\":[\"frc0\",\"frc0\",\"frc0\"]},\"red\":{\"score\":null,\"teams\":[\"fr"+
"c0\",\"frc0\",\"frc0\"]}},\"score_breakdown\":null,\"time_string\":\"4:00 PM\",\"time_utc\":\"0"+
"001-01-01T00:00:00\"}]", reader.String())
}))
defer tbaServer.Close()
tbaBaseUrl = tbaServer.URL
@@ -93,10 +94,10 @@ func TestPublishRankings(t *testing.T) {
var reader bytes.Buffer
reader.ReadFrom(r.Body)
assert.Equal(t, "{\"breakdowns\":[\"QA\",\"Coopertition\",\"Auto\",\"Container\",\"Tote\","+
"\"Litter\"],\"rankings\":[{\"team_key\":\"frc254\",\"rank\":1,\"qa\":20,\"coopertition\":1100,"+
"\"auto\":625,\"container\":90,\"tote\":554,\"litter\":10,\"dqs\":0,\"played\":10},"+
"{\"team_key\":\"frc1114\",\"rank\":2,\"qa\":20,\"coopertition\":1100,\"auto\":625,"+
"\"container\":90,\"tote\":554,\"litter\":10,\"dqs\":0,\"played\":10}]}", reader.String())
"\"Litter\"],\"rankings\":[{\"team_key\":\"frc254\",\"rank\":1,\"QA\":20,\"Coopertition\":1100,"+
"\"Auto\":625,\"Container\":90,\"Tote\":554,\"Litter\":10,\"dqs\":0,\"played\":10},"+
"{\"team_key\":\"frc1114\",\"rank\":2,\"QA\":20,\"Coopertition\":1100,\"Auto\":625,"+
"\"Container\":90,\"Tote\":554,\"Litter\":10,\"dqs\":0,\"played\":10}]}", reader.String())
}))
defer tbaServer.Close()
tbaBaseUrl = tbaServer.URL