mlblive/main.go

131 lines
2.2 KiB
Go

package main
import (
"encoding/json"
"flag"
"fmt"
"log"
"os"
"strconv"
"time"
"github.com/evanphx/json-patch/v5"
"scm.dairydemon.net/filifa/mlblive/internal/statsapi"
)
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.RequestSchedule("1", strconv.Itoa(id))
if err != nil {
log.Fatal(err)
}
var s statsapi.Schedule
err = json.Unmarshal(sched, &s)
gamePk := s.Dates[0].Games[0].GamePk.String()
return gamePk
}
func extractPatch(diffPatch []byte) (jsonpatch.Patch, error) {
var p jsonpatch.Patch
var d []any
err := json.Unmarshal(diffPatch, &d)
if err != nil {
return p, err
}
diff := d[0].(map[string]any)["Diff"]
patch, err := json.Marshal(diff)
if err != nil {
log.Fatal(err)
}
p, err = jsonpatch.DecodePatch(patch)
return p, err
}
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)
feed, err := statsapi.RequestFeed(gamePk)
if err != nil {
log.Fatal(err)
}
var f statsapi.Feed
err = json.Unmarshal(feed, &f)
if err != nil {
log.Fatal(err)
}
var game Game
game.Update(&f)
ts := f["metaData"].(map[string]any)["timeStamp"].(string)
for {
var p statsapi.Push
err = ws.ReadJSON(&p)
if err != nil {
log.Fatal(err)
}
diffPatch, err := statsapi.RequestDiffPatch(gamePk, ts, p.UpdateId)
if err != nil {
feed, err = statsapi.RequestFeed(gamePk)
if err != nil {
log.Fatal(err)
}
} else {
p, err := extractPatch(diffPatch)
if err != nil {
log.Fatal(err)
}
patchedFeed, err := p.Apply(feed)
if err != nil {
log.Fatal(err)
}
err = json.Unmarshal(patchedFeed, &f)
if err != nil {
log.Fatal(err)
}
}
ts = f["metaData"].(map[string]any)["timeStamp"].(string)
game.Update(&f)
fmt.Println(game)
}
}