From 0a49223173bfef3ddae0b6241fcfbbf4f53d558b Mon Sep 17 00:00:00 2001 From: filifa Date: Wed, 3 Jul 2024 01:01:02 -0500 Subject: [PATCH] flesh out game struct --- game.go | 102 +++++++++++++++++++++++++++++++++++--- internal/statsapi/feed.go | 35 ++++++++++++- main.go | 64 ++++++------------------ 3 files changed, 144 insertions(+), 57 deletions(-) diff --git a/game.go b/game.go index 04408ca..911d92a 100644 --- a/game.go +++ b/game.go @@ -1,17 +1,107 @@ package main -import "scm.dairydemon.net/filifa/mlblive/internal/statsapi" +import ( + "log" + + "scm.dairydemon.net/filifa/mlblive/internal/statsapi" +) type Team struct { - City string - Name string + Location string + Name string } type Game struct { - GUID string + GamePk string HomeTeam Team AwayTeam Team - HomeScore int - AwayScore int + HomeScore uint + AwayScore uint Plays []statsapi.Play } + +func feedUpdate(gamePk string, ts *string) (statsapi.Play, error) { + feed, err := statsapi.Feed(gamePk) + if err != nil { + return statsapi.Play{}, err + } + + *ts = feed.MetaData.TimeStamp + return feed.LiveData.Plays.CurrentPlay, nil +} + +func patchUpdate(patches statsapi.DiffPatchResponse, ts *string) []statsapi.Play { + var plays []statsapi.Play + var err error + for _, patch := range patches { + var play statsapi.Play + play.Patch(patch) + plays = append(plays, play) + + *ts, err = patch.Timestamp() + if err != nil { + continue + } + } + + return plays +} + +func (g *Game) Update(ts *string, updateId string) error { + var plays []statsapi.Play + + patches, err := statsapi.DiffPatch(g.GamePk, *ts, updateId) + if err != nil { + log.Println("feed update") + var p statsapi.Play + p, err = feedUpdate(g.GamePk, ts) + if err != nil { + return err + } + + plays = []statsapi.Play{p} + } else { + log.Println("patch update") + plays = patchUpdate(patches, ts) + } + + for _, play := range plays { + i := play.AtBatIndex + if i >= len(g.Plays) { + g.Plays = append(g.Plays, play) + } + } + + return nil +} + +func InitGame(feed statsapi.FeedResponse) (*Game, error) { + hometeam := Team{ + Location: feed.GameData.Teams.Home.LocationName, + Name: feed.GameData.Teams.Home.TeamName, + } + awayteam := Team{ + Location: feed.GameData.Teams.Away.LocationName, + Name: feed.GameData.Teams.Away.TeamName, + } + + homescore, err := feed.LiveData.Linescore.Teams.Home.Runs.Int64() + if err != nil { + return nil, err + } + awayscore, err := feed.LiveData.Linescore.Teams.Away.Runs.Int64() + if err != nil { + return nil, err + } + + game := Game{ + GamePk: feed.GamePk, + HomeTeam: hometeam, + AwayTeam: awayteam, + HomeScore: uint(homescore), + AwayScore: uint(awayscore), + Plays: feed.LiveData.Plays.AllPlays, + } + + return &game, nil +} diff --git a/internal/statsapi/feed.go b/internal/statsapi/feed.go index 861e0cf..5d95e1d 100644 --- a/internal/statsapi/feed.go +++ b/internal/statsapi/feed.go @@ -9,7 +9,9 @@ type FeedParams struct { } type FeedResponse struct { + GamePk string MetaData metadata + GameData gamedata LiveData livedata } @@ -17,8 +19,23 @@ type metadata struct { TimeStamp string } +type gamedata struct { + Teams teams +} + +type teams struct { + Away team + Home team +} + +type team struct { + LocationName string + TeamName string +} + type livedata struct { - Plays plays + Plays plays + Linescore linescore } type plays struct { @@ -49,6 +66,22 @@ type about struct { CaptivatingIndex json.Number } +type linescore struct { + Teams teamLines +} + +type teamLines struct { + Home teamline + Away teamline +} + +type teamline struct { + Runs json.Number + Hits json.Number + Errors json.Number + LeftOnBase json.Number +} + func (p *Play) Patch(patch Patch) { instructions := patch.Diff stem := "/liveData/plays/currentPlay" diff --git a/main.go b/main.go index 9549d8f..c68b88d 100644 --- a/main.go +++ b/main.go @@ -12,54 +12,6 @@ import ( "scm.dairydemon.net/filifa/mlblive/internal/statsapi" ) -func feedUpdate(gamePk string, ts *string) (statsapi.Play, error) { - feed, err := statsapi.Feed(gamePk) - if err != nil { - return statsapi.Play{}, err - } - - *ts = feed.MetaData.TimeStamp - return feed.LiveData.Plays.CurrentPlay, nil -} - -func patchUpdate(patches statsapi.DiffPatchResponse, ts *string) []statsapi.Play { - var plays []statsapi.Play - var err error - for _, patch := range patches { - var play statsapi.Play - play.Patch(patch) - plays = append(plays, play) - - *ts, err = patch.Timestamp() - if err != nil { - continue - } - } - - return plays -} - -func update(gamePk string, ts *string, updateId string) ([]statsapi.Play, error) { - var plays []statsapi.Play - - patches, err := statsapi.DiffPatch(gamePk, *ts, updateId) - if err != nil { - log.Println("feed update") - var p statsapi.Play - p, err = feedUpdate(gamePk, ts) - if err != nil { - return plays, err - } - - plays = []statsapi.Play{p} - } else { - log.Println("patch update") - plays = patchUpdate(patches, ts) - } - - return plays, err -} - func writeTest(v any, ts string) { b, err := json.Marshal(v) if err != nil { @@ -108,6 +60,17 @@ func main() { log.Fatal(err) } + // FIXME: we're calling feed twice now + feed, err := statsapi.Feed(gamePk) + if err != nil { + log.Fatal(err) + } + + game, err := InitGame(feed) + if err != nil { + log.Fatal(err) + } + for { var p statsapi.Push err := ws.ReadJSON(&p) @@ -115,13 +78,14 @@ func main() { log.Fatal(err) } - plays, err := update(gamePk, &ts, p.UpdateId) + err = game.Update(&ts, p.UpdateId) if err != nil { log.Println(err) continue } - for _, play := range plays { + // FIXME: this will output the same play multiple times + for _, play := range game.Plays { result := play.Result if result.Event != "" { // TODO: figure out format