mlblive/game.go

108 lines
2.0 KiB
Go

package main
import (
"log"
"scm.dairydemon.net/filifa/mlblive/internal/statsapi"
)
type Team struct {
Location string
Name string
}
type Game struct {
GamePk string
HomeTeam Team
AwayTeam Team
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
}