From 813be25713b066a0382b8aa263b3aea7c5d27a32 Mon Sep 17 00:00:00 2001 From: "diamondburned (Forefront)" Date: Mon, 13 Apr 2020 18:23:38 -0700 Subject: [PATCH] Gateway: Fixed infinite InvalidSession loop --- gateway/gateway.go | 3 ++- gateway/op.go | 18 ++++++------------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/gateway/gateway.go b/gateway/gateway.go index ebd992c..110115f 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -195,7 +195,7 @@ func (g *Gateway) Reconnect() { // If the connection is rate limited (documented behavior): // https://discordapp.com/developers/docs/topics/gateway#rate-limiting - if err := g.Open(); err != nil && err != ErrInvalidSession { + if err := g.Open(); err != nil { g.ErrorLog(errors.Wrap(err, "Failed to open gateway")) continue } @@ -282,6 +282,7 @@ func (g *Gateway) start() error { // Expect either READY or RESUMED before continuing. WSDebug("Waiting for either READY or RESUMED.") + // WaitForEvent should err := WaitForEvent(g, ch, func(op *OP) bool { switch op.EventName { case "READY": diff --git a/gateway/op.go b/gateway/op.go index 30fe00d..0410253 100644 --- a/gateway/op.go +++ b/gateway/op.go @@ -38,8 +38,6 @@ type OP struct { EventName string `json:"t,omitempty"` } -var ErrInvalidSession = errors.New("Invalid session") - func DecodeEvent(driver json.Driver, ev wsutil.Event, v interface{}) (OPCode, error) { op, err := DecodeOP(driver, ev) if err != nil { @@ -91,16 +89,16 @@ func WaitForEvent(g *Gateway, ch <-chan wsutil.Event, fn func(*OP) bool) error { return err } - // Are these events what we're looking for? - found := fn(o) - - // Handle the *OP anyway. + // Handle the *OP first, in case it's an Invalid Session. This should + // also prevent a race condition with things that need Ready after + // Open(). if err := HandleOP(g, o); err != nil { return err } - // If we found the event, return. - if found { + // Are these events what we're looking for? If we've found the event, + // return. + if fn(o) { return nil } } @@ -122,10 +120,6 @@ func DecodeOP(driver json.Driver, ev wsutil.Event) (*OP, error) { return nil, errors.Wrap(err, "OP error: "+string(ev.Data)) } - if op.Code == InvalidSessionOP { - return op, ErrInvalidSession - } - return op, nil }