Переглянути джерело

partial support for gateway resume

Bruce Marriner 8 роки тому
батько
коміт
9bc6057ca7
1 змінених файлів з 48 додано та 9 видалено
  1. 48 9
      wsapi.go

+ 48 - 9
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 {
 
+		p := ResumePacket{}
+		p.Op = 6
+		p.Data.Token = s.Token
+		p.Data.SessionID = s.sessionID
+		p.Data.Sequence = s.sequence
+
 		s.log(LogInformational, "sending resume packet to gateway")
-		// TODO: RESUME
-	}
-	//else {
+		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
+		}
 
-	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
+	} 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.