From 7347357aab9c551c1d4c7818493234cc756cc370 Mon Sep 17 00:00:00 2001 From: filifa Date: Sat, 13 Jul 2024 16:37:04 -0500 Subject: [PATCH] cleanup and bug fixes --- game.go | 24 +++++++++++++++----- internal/statsapi/feed.go | 32 ++++++++++++++++++++++++++- main.go | 46 +++++++++++++++++++++------------------ 3 files changed, 74 insertions(+), 28 deletions(-) diff --git a/game.go b/game.go index 3d01c63..f2698e2 100644 --- a/game.go +++ b/game.go @@ -8,13 +8,25 @@ type Game struct { AwayScore uint } -func (g *Game) Update(feed *statsapi.Feed) { - homeScore, _ := (*feed)["liveData"].(map[string]any)["linescore"].(map[string]any)["teams"].(map[string]any)["home"].(map[string]any)["runs"].(float64) - awayScore, _ := (*feed)["liveData"].(map[string]any)["linescore"].(map[string]any)["teams"].(map[string]any)["away"].(map[string]any)["runs"].(float64) +func (g *Game) Update(feed *statsapi.Feed) error { + homeScore := feed.LiveData.Linescore.Teams.Home.Runs + awayScore := feed.LiveData.Linescore.Teams.Away.Runs // FIXME: currentPlay/result doesn't always have description - desc, _ := (*feed)["liveData"].(map[string]any)["plays"].(map[string]any)["currentPlay"].(map[string]any)["result"].(map[string]any)["description"].(string) + desc := feed.LiveData.Plays.CurrentPlay.Result.Description + + score, err := homeScore.Int64() + if err != nil { + return err + } + g.HomeScore = uint(score) + + score, err = awayScore.Int64() + if err != nil { + return err + } + g.AwayScore = uint(score) - g.HomeScore = uint(homeScore) - g.AwayScore = uint(awayScore) g.CurrPlayDesc = desc + + return nil } diff --git a/internal/statsapi/feed.go b/internal/statsapi/feed.go index b299468..42ab4eb 100644 --- a/internal/statsapi/feed.go +++ b/internal/statsapi/feed.go @@ -8,7 +8,37 @@ type FeedParams struct { GamePk string } -type Feed map[string]any +type Feed struct { + MetaData metadata + LiveData livedata +} + +type metadata struct { + TimeStamp string +} + +type livedata struct { + Plays plays + Linescore linescore +} + +type linescore struct { + Teams teams +} + +type teams struct { + Home team + Away team +} + +type team struct { + Runs json.Number +} + +type plays struct { + AllPlays []Play + CurrentPlay Play +} type Play struct { Result result diff --git a/main.go b/main.go index 935c9e5..e120d22 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "errors" "flag" "fmt" "log" @@ -41,6 +42,9 @@ func getGamePk() string { var s statsapi.Schedule err = json.Unmarshal(sched, &s) + if err != nil { + log.Fatal(err) + } gamePk := s.Dates[0].Games[0].GamePk.String() return gamePk @@ -54,10 +58,14 @@ func extractPatch(diffPatch []byte) (jsonpatch.Patch, error) { return p, err } + if len(d) == 0 { + return p, errors.New("empty diffPatch") + } + diff := d[0].(map[string]any)["Diff"] patch, err := json.Marshal(diff) if err != nil { - log.Fatal(err) + return p, err } p, err = jsonpatch.DecodePatch(patch) @@ -76,21 +84,21 @@ func main() { ch := make(chan error) go ws.KeepAlive(10*time.Second, ch) - feed, err := statsapi.RequestFeed(gamePk) + feedResp, err := statsapi.RequestFeed(gamePk) if err != nil { log.Fatal(err) } - var f statsapi.Feed - err = json.Unmarshal(feed, &f) + var feed statsapi.Feed + err = json.Unmarshal(feedResp, &feed) if err != nil { log.Fatal(err) } var game Game - game.Update(&f) + game.Update(&feed) - ts := f["metaData"].(map[string]any)["timeStamp"].(string) + ts := feed.MetaData.TimeStamp for { var p statsapi.Push @@ -99,32 +107,28 @@ func main() { log.Fatal(err) } - diffPatch, err := statsapi.RequestDiffPatch(gamePk, ts, p.UpdateId) + diffPatchResp, err := statsapi.RequestDiffPatch(gamePk, ts, p.UpdateId) + patch, err := extractPatch(diffPatchResp) if err != nil { - feed, err = statsapi.RequestFeed(gamePk) + feedResp, err = statsapi.RequestFeed(gamePk) if err != nil { log.Fatal(err) } } else { - p, err := extractPatch(diffPatch) - if err != nil { - log.Fatal(err) - } - - patchedFeed, err := p.Apply(feed) - if err != nil { - log.Fatal(err) - } - - err = json.Unmarshal(patchedFeed, &f) + feedResp, err = patch.Apply(feedResp) if err != nil { log.Fatal(err) } } - ts = f["metaData"].(map[string]any)["timeStamp"].(string) + err = json.Unmarshal(feedResp, &feed) + if err != nil { + log.Fatal(err) + } - game.Update(&f) + ts = feed.MetaData.TimeStamp + + game.Update(&feed) fmt.Println(game) } }