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