From 9bc6057ca7426bf80bec4dd66648e2baee90e9aa Mon Sep 17 00:00:00 2001 From: Bruce Marriner Date: Sat, 30 Apr 2016 17:52:09 -0500 Subject: [PATCH] partial support for gateway resume --- wsapi.go | 59 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 10 deletions(-) diff --git a/wsapi.go b/wsapi.go index d09f07c..1088240 100644 --- a/wsapi.go +++ b/wsapi.go @@ -48,6 +48,15 @@ type handshakeOp struct { Data handshakeData `json:"d"` } +type ResumePacket struct { + Op int `json:"ip"` + Data struct { + Token string `json:"token"` + SessionID string `json:"session_id"` + Sequence int `json:"seq"` + } `json:"d"` +} + // Open opens a websocket connection to Discord. func (s *Session) Open() (err error) { @@ -95,18 +104,30 @@ func (s *Session) Open() (err error) { if s.sessionID != "" && s.sequence > 0 { - s.log(LogInformational, "sending resume packet to gateway") - // TODO: RESUME - } - //else { + p := ResumePacket{} + p.Op = 6 + p.Data.Token = s.Token + p.Data.SessionID = s.sessionID + p.Data.Sequence = s.sequence - s.log(LogInformational, "sending identify packet to gateway") - err = s.wsConn.WriteJSON(handshakeOp{2, handshakeData{s.Token, handshakeProperties{runtime.GOOS, "Discordgo v" + VERSION, "", "", ""}, 250, s.Compress}}) - if err != nil { - s.log(LogWarning, "error sending gateway identify packet, %s, %s", s.gateway, err) - return + s.log(LogInformational, "sending resume packet to gateway") + temp, _ := json.Marshal(p) + printJSON(temp) + err = s.wsConn.WriteJSON(p) + if err != nil { + s.log(LogWarning, "error sending gateway resume packet, %s, %s", s.gateway, err) + return + } + + } else { + + s.log(LogInformational, "sending identify packet to gateway") + err = s.wsConn.WriteJSON(handshakeOp{2, handshakeData{s.Token, handshakeProperties{runtime.GOOS, "Discordgo v" + VERSION, "", "", ""}, 250, s.Compress}}) + if err != nil { + s.log(LogWarning, "error sending gateway identify packet, %s, %s", s.gateway, err) + return + } } - //} // Create listening outside of listen, as it needs to happen inside the mutex // lock. @@ -326,6 +347,24 @@ func (s *Session) onEvent(messageType int, message []byte) { } } + // Reconnect + // Must immediately disconnect from gateway and reconnect to new gateway. + if e.Operation == 7 { + // TODO + } + + // Invalid Session + // Must respond with a Identify packet. + if e.Operation == 9 { + + s.log(LogInformational, "sending identify packet to gateway in response to Op9") + err = s.wsConn.WriteJSON(handshakeOp{2, handshakeData{s.Token, handshakeProperties{runtime.GOOS, "Discordgo v" + VERSION, "", "", ""}, 250, s.Compress}}) + if err != nil { + s.log(LogWarning, "error sending gateway identify packet, %s, %s", s.gateway, err) + return + } + } + // Do not try to Dispatch a non-Dispatch Message if e.Operation != 0 { // But we probably should be doing something with them.