flesh out game struct
This commit is contained in:
		
							parent
							
								
									ff5f7f3a6d
								
							
						
					
					
						commit
						0a49223173
					
				
							
								
								
									
										102
									
								
								game.go
								
								
								
								
							
							
						
						
									
										102
									
								
								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
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										64
									
								
								main.go
								
								
								
								
							
							
						
						
									
										64
									
								
								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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue