diff --git a/cmd/subscribe.go b/cmd/subscribe.go index 0f6b3b8..79f227a 100644 --- a/cmd/subscribe.go +++ b/cmd/subscribe.go @@ -23,6 +23,7 @@ import ( "strconv" "time" + "github.com/gorilla/websocket" "github.com/spf13/cobra" "scm.dairydemon.net/filifa/mlblive/cmd/internal/statsapi" ) @@ -50,17 +51,26 @@ func updateFeed(feedResp []byte, gamePk, ts, updateId string) ([]byte, error) { return feedResp, err } +func newWebsocket(gamePk string) (*statsapi.GamedayWebsocket, <-chan error, error) { + ws, err := statsapi.NewGamedayWebsocket(gamePk) + if err != nil { + return nil, nil, err + } + + ch := make(chan error) + go ws.KeepAlive(10*time.Second, ch) + + return &ws, ch, err +} + func subscribe(cmd *cobra.Command, args []string) { pkStr := strconv.Itoa(gamePk) - ws, err := statsapi.NewGamedayWebsocket(pkStr) + ws, _, err := newWebsocket(pkStr) if err != nil { log.Fatal(err) } defer ws.Close() - ch := make(chan error) - go ws.KeepAlive(10*time.Second, ch) - feedResp, err := statsapi.RequestFeed(pkStr) if err != nil { log.Fatal(err) @@ -78,7 +88,23 @@ func subscribe(cmd *cobra.Command, args []string) { var p statsapi.Push err = ws.ReadJSON(&p) - if err != nil { + if websocket.IsUnexpectedCloseError(err) { + log.Println(err) + ws.Close() + + ws, _, err = newWebsocket(pkStr) + if err != nil { + log.Fatal(err) + } + defer ws.Close() + + feedResp, err = statsapi.RequestFeed(pkStr) + if err != nil { + log.Fatal(err) + } + + continue + } else if err != nil { log.Fatal(err) }