flesh out game struct

This commit is contained in:
filifa 2024-07-03 01:01:02 -05:00
parent ff5f7f3a6d
commit 0a49223173
3 changed files with 144 additions and 57 deletions

100
game.go
View File

@ -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
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
}

View File

@ -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
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"

64
main.go
View File

@ -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