Explorar o código

Disconnect before reconnecting

Remi Reuvekamp %!s(int64=5) %!d(string=hai) anos
pai
achega
46b784ca3d
Modificáronse 2 ficheiros con 41 adicións e 4 borrados
  1. 20 2
      commands.go
  2. 21 2
      provisioning.go

+ 20 - 2
commands.go

@@ -231,7 +231,18 @@ func (handler *CommandHandler) CommandReconnect(ce *CommandEvent) {
 		}
 		return
 	}
-	err := ce.User.Conn.Restore()
+
+	wasConnected := true
+	sess, err := ce.User.Conn.Disconnect()
+	if err == whatsapp.ErrNotConnected {
+		wasConnected = false
+	} else if err != nil {
+		ce.User.log.Warnln("Error while disconnecting:", err)
+	} else if len(sess.Wid) > 0 {
+		ce.User.SetSession(&sess)
+	}
+
+	err = ce.User.Conn.Restore()
 	if err == whatsapp.ErrInvalidSession {
 		if ce.User.Session != nil {
 			ce.User.log.Debugln("Got invalid session error when reconnecting, but user has session. Retrying using RestoreWithSession()...")
@@ -268,7 +279,14 @@ func (handler *CommandHandler) CommandReconnect(ce *CommandEvent) {
 		return
 	}
 	ce.User.ConnectionErrors = 0
-	ce.Reply("Reconnected successfully.")
+
+	var msg string
+	if wasConnected {
+		msg = "Reconnected successfully."
+	} else {
+		msg = "Connected successfully."
+	}
+	ce.Reply(msg)
 	ce.User.PostLogin()
 }
 

+ 21 - 2
provisioning.go

@@ -156,7 +156,18 @@ func (prov *ProvisioningAPI) Reconnect(w http.ResponseWriter, r *http.Request) {
 		}
 		return
 	}
-	err := user.Conn.Restore()
+
+	wasConnected := true
+	sess, err := user.Conn.Disconnect()
+	if err == whatsapp.ErrNotConnected {
+		wasConnected = false
+	} else if err != nil {
+		user.log.Warnln("Error while disconnecting:", err)
+	} else if len(sess.Wid) > 0 {
+		user.SetSession(&sess)
+	}
+
+	err = user.Conn.Restore()
 	if err == whatsapp.ErrInvalidSession {
 		if user.Session != nil {
 			user.log.Debugln("Got invalid session error when reconnecting, but user has session. Retrying using RestoreWithSession()...")
@@ -209,7 +220,15 @@ func (prov *ProvisioningAPI) Reconnect(w http.ResponseWriter, r *http.Request) {
 	}
 	user.ConnectionErrors = 0
 	user.PostLogin()
-	jsonResponse(w, http.StatusOK, Response{true, "Reconnected successfully."})
+
+	var msg string
+	if wasConnected {
+		msg = "Reconnected successfully."
+	} else {
+		msg = "Connected successfully."
+	}
+
+	jsonResponse(w, http.StatusOK, Response{true, msg})
 }
 
 func (prov *ProvisioningAPI) Ping(w http.ResponseWriter, r *http.Request) {