mlblive/main.go

140 lines
2.4 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"
2024-07-13 20:09:10 +00:00
"github.com/evanphx/json-patch/v5"
2024-07-02 04:16:44 +00:00
"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")
}
2024-07-13 20:35:43 +00:00
sched, err := statsapi.RequestSchedule("1", strconv.Itoa(id))
2024-07-02 04:16:44 +00:00
if err != nil {
log.Fatal(err)
}
2024-07-13 20:35:43 +00:00
var s statsapi.Schedule
2024-07-13 20:09:10 +00:00
err = json.Unmarshal(sched, &s)
2024-07-13 21:37:04 +00:00
if err != nil {
log.Fatal(err)
}
2024-07-13 20:09:10 +00:00
gamePk := s.Dates[0].Games[0].GamePk.String()
2024-07-02 04:16:44 +00:00
return gamePk
}
2024-07-13 22:30:53 +00:00
func extractPatches(diffPatch []byte) ([]jsonpatch.Patch, error) {
var patches []jsonpatch.Patch
2024-07-14 04:42:48 +00:00
2024-07-14 04:17:54 +00:00
var objs []map[string]any
2024-07-13 22:30:53 +00:00
err := json.Unmarshal(diffPatch, &objs)
2024-07-13 20:23:36 +00:00
if err != nil {
2024-07-13 22:30:53 +00:00
return patches, err
2024-07-13 20:23:36 +00:00
}
2024-07-13 22:30:53 +00:00
for _, obj := range objs {
2024-07-14 04:17:54 +00:00
diff := obj["diff"]
2024-07-13 22:30:53 +00:00
patch, err := json.Marshal(diff)
if err != nil {
2024-07-14 04:42:48 +00:00
break
2024-07-13 22:30:53 +00:00
}
2024-07-13 21:37:04 +00:00
2024-07-13 22:30:53 +00:00
p, err := jsonpatch.DecodePatch(patch)
if err != nil {
2024-07-14 04:42:48 +00:00
break
2024-07-13 22:30:53 +00:00
}
patches = append(patches, p)
2024-07-13 20:23:36 +00:00
}
2024-07-14 04:42:48 +00:00
return patches, err
2024-07-13 20:23:36 +00:00
}
2024-07-14 04:09:53 +00:00
func updateFeed(feedResp []byte, gamePk, ts, updateId string) ([]byte, error) {
2024-07-13 22:58:11 +00:00
diffPatchResp, err := statsapi.RequestDiffPatch(gamePk, ts, updateId)
2024-07-14 04:09:53 +00:00
if err != nil {
return statsapi.RequestFeed(gamePk)
2024-07-14 04:09:53 +00:00
}
2024-07-13 22:58:11 +00:00
patches, err := extractPatches(diffPatchResp)
if err != nil {
2024-07-14 05:15:40 +00:00
return statsapi.RequestFeed(gamePk)
2024-07-14 04:38:16 +00:00
}
for _, patch := range patches {
feedResp, err = patch.Apply(feedResp)
2024-07-13 22:58:11 +00:00
if err != nil {
2024-07-14 04:38:16 +00:00
break
2024-07-13 22:58:11 +00:00
}
}
return feedResp, err
}
2024-07-02 04:16:44 +00:00
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)
2024-07-13 21:37:04 +00:00
feedResp, err := statsapi.RequestFeed(gamePk)
2024-07-03 06:01:02 +00:00
if err != nil {
log.Fatal(err)
}
2024-07-13 21:37:04 +00:00
var feed statsapi.Feed
2024-07-04 04:52:40 +00:00
var game Game
2024-07-12 02:23:28 +00:00
for {
2024-07-14 05:07:24 +00:00
err = json.Unmarshal(feedResp, &feed)
2024-07-04 04:52:40 +00:00
if err != nil {
log.Fatal(err)
}
2024-07-14 05:07:24 +00:00
game.Update(&feed)
fmt.Println(game)
2024-07-12 02:23:28 +00:00
2024-07-14 05:07:24 +00:00
ts := feed.MetaData.TimeStamp
var p statsapi.Push
err = ws.ReadJSON(&p)
2024-07-12 02:23:28 +00:00
if err != nil {
2024-07-13 22:58:11 +00:00
log.Fatal(err)
2024-07-13 21:37:04 +00:00
}
2024-07-13 20:09:10 +00:00
2024-07-14 05:07:24 +00:00
feedResp, err = updateFeed(feedResp, gamePk, ts, p.UpdateId)
2024-07-13 21:37:04 +00:00
if err != nil {
log.Fatal(err)
}
2024-07-12 02:23:28 +00:00
}
2024-07-02 04:16:44 +00:00
}