From a7a53614ccc6002205134df17a3e8191d78e4c10 Mon Sep 17 00:00:00 2001 From: filifa Date: Sat, 13 Jul 2024 15:09:10 -0500 Subject: [PATCH] incorporate jsonpatch package --- go.mod | 6 +++- go.sum | 4 +++ internal/statsapi/client.go | 36 ++++++++++-------------- main.go | 56 +++++++++++++++++++++++++++---------- 4 files changed, 66 insertions(+), 36 deletions(-) diff --git a/go.mod b/go.mod index 61fb99e..4e5fd76 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,8 @@ module scm.dairydemon.net/filifa/mlblive go 1.19 -require github.com/gorilla/websocket v1.5.3 // indirect +require ( + github.com/evanphx/json-patch/v5 v5.9.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/pkg/errors v0.9.1 // indirect +) diff --git a/go.sum b/go.sum index 25a9fc4..c60ae18 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,6 @@ +github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/internal/statsapi/client.go b/internal/statsapi/client.go index adf4735..3845587 100644 --- a/internal/statsapi/client.go +++ b/internal/statsapi/client.go @@ -1,22 +1,22 @@ package statsapi import ( - "encoding/json" + "io" "net/http" "net/url" ) var DefaultClient = NewClient(http.DefaultClient) -func Schedule(sportId, teamId string) (ScheduleResponse, error) { +func Schedule(sportId, teamId string) ([]byte, error) { return DefaultClient.Schedule(sportId, teamId) } -func Feed(gamePk string) (FeedResponse, error) { +func Feed(gamePk string) ([]byte, error) { return DefaultClient.Feed(gamePk) } -func DiffPatch(gamePk, startTimecode, pushUpdateId string) (DiffPatchResponse, error) { +func DiffPatch(gamePk, startTimecode, pushUpdateId string) ([]byte, error) { return DefaultClient.DiffPatch(gamePk, startTimecode, pushUpdateId) } @@ -35,7 +35,7 @@ func NewClient(c *http.Client) *Client { } } -func (c *Client) Schedule(sportId, teamId string) (ScheduleResponse, error) { +func (c *Client) Schedule(sportId, teamId string) ([]byte, error) { endpoint := url.URL{Path: "api/v1/schedule"} query := endpoint.Query() query.Add("sportId", sportId) @@ -44,21 +44,17 @@ func (c *Client) Schedule(sportId, teamId string) (ScheduleResponse, error) { url := c.baseURL.ResolveReference(&endpoint) - var schedule ScheduleResponse - err := c.get(url.String(), &schedule) - return schedule, err + return c.get(url.String()) } -func (c *Client) Feed(gamePk string) (FeedResponse, error) { +func (c *Client) Feed(gamePk string) ([]byte, error) { endpoint := url.URL{Path: "api/v1.1/game/" + gamePk + "/feed/live"} url := c.baseURL.ResolveReference(&endpoint) - var feed FeedResponse - err := c.get(url.String(), &feed) - return feed, err + return c.get(url.String()) } -func (c *Client) DiffPatch(gamePk, startTimecode, pushUpdateId string) (DiffPatchResponse, error) { +func (c *Client) DiffPatch(gamePk, startTimecode, pushUpdateId string) ([]byte, error) { endpoint := url.URL{Path: "api/v1.1/game/" + gamePk + "/feed/live/diffPatch"} query := endpoint.Query() query.Add("language", "en") @@ -68,23 +64,21 @@ func (c *Client) DiffPatch(gamePk, startTimecode, pushUpdateId string) (DiffPatc url := c.baseURL.ResolveReference(&endpoint) - var diffPatch DiffPatchResponse - err := c.get(url.String(), &diffPatch) - return diffPatch, err + return c.get(url.String()) } -func (c *Client) get(url string, v any) error { +func (c *Client) get(url string) ([]byte, error) { req, err := http.NewRequest("GET", url, nil) if err != nil { - return err + return nil, err } resp, err := c.httpClient.Do(req) if err != nil { - return err + return nil, err } defer resp.Body.Close() - err = json.NewDecoder(resp.Body).Decode(v) - return err + body, err := io.ReadAll(resp.Body) + return body, err } diff --git a/main.go b/main.go index 9c005a9..f93f5ef 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "strconv" "time" + "github.com/evanphx/json-patch/v5" "scm.dairydemon.net/filifa/mlblive/internal/statsapi" ) @@ -38,7 +39,10 @@ func getGamePk() string { log.Fatal(err) } - gamePk := sched.Dates[0].Games[0].GamePk.String() + var s statsapi.ScheduleResponse + err = json.Unmarshal(sched, &s) + + gamePk := s.Dates[0].Games[0].GamePk.String() return gamePk } @@ -59,10 +63,16 @@ func main() { log.Fatal(err) } - var game Game - game.Update(&feed) + var f statsapi.FeedResponse + err = json.Unmarshal(feed, &f) + if err != nil { + log.Fatal(err) + } - ts := feed["metaData"].(map[string]any)["timeStamp"].(string) + var game Game + game.Update(&f) + + ts := f["metaData"].(map[string]any)["timeStamp"].(string) for { var p statsapi.Push @@ -71,26 +81,44 @@ func main() { log.Fatal(err) } - patches, err := statsapi.DiffPatch(gamePk, ts, p.UpdateId) + diffPatch, err := statsapi.DiffPatch(gamePk, ts, p.UpdateId) if err != nil { feed, err = statsapi.Feed(gamePk) if err != nil { log.Fatal(err) } } else { - for _, patch := range patches { - for _, instr := range patch.Diff { - err = feed.Patch(&instr) - if err != nil { - log.Println(err) - } - } + var d []any + err = json.Unmarshal(diffPatch, &d) + if err != nil { + log.Fatal(err) + } + + diff := d[0].(map[string]any)["Diff"] + patch, err := json.Marshal(diff) + if err != nil { + log.Fatal(err) + } + + p, err := jsonpatch.DecodePatch(patch) + 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 = feed["metaData"].(map[string]any)["timeStamp"].(string) + ts = f["metaData"].(map[string]any)["timeStamp"].(string) - game.Update(&feed) + game.Update(&f) fmt.Println(game) } }