mlblive/main.go

136 lines
2.5 KiB
Go
Raw Normal View History

2024-07-02 04:16:44 +00:00
package main
import (
"encoding/json"
"flag"
"fmt"
"log"
"os"
"strconv"
"time"
"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 {
log.Println(err)
}
os.WriteFile("examples/data/data_"+ts+".json", b, 0644)
}
func getGamePk() string {
teamId := flag.String("t", "", "team to get updates for")
flag.Parse()
if *teamId == "" {
log.Fatal("need team ID")
}
id, ok := statsapi.TeamIds[*teamId]
if !ok {
log.Fatal("invalid team ID")
}
sched, err := statsapi.Schedule("1", strconv.Itoa(id))
if err != nil {
log.Fatal(err)
}
gamePk := sched.Dates[0].Games[0].GamePk.String()
return gamePk
}
func main() {
gamePk := getGamePk()
ws, err := statsapi.NewGamedayWebsocket(gamePk)
if err != nil {
log.Fatal(err)
}
defer ws.Close()
ch := make(chan error)
go ws.KeepAlive(10*time.Second, ch)
var ts string
_, err = feedUpdate(gamePk, &ts)
if err != nil {
log.Fatal(err)
}
for {
var p statsapi.Push
err := ws.ReadJSON(&p)
if err != nil {
log.Fatal(err)
}
plays, err := update(gamePk, &ts, p.UpdateId)
if err != nil {
log.Println(err)
continue
}
for _, play := range plays {
result := play.Result
if result.Event != "" {
// TODO: figure out format
// maybe a string format with play/result type?
// FIXME: proper score on patch updates
// FIXME: repeated output on feed updates
fmt.Printf("%v (%v-%v)\n", result.Description, result.AwayScore, result.HomeScore)
}
}
}
}