소스 검색

Merge pull request #151 from rreuvekamp/fix/142-reconnect-command-doesnt-work-v2

Fix #142
Tulir Asokan 5 년 전
부모
커밋
8dd5f6a0d1
2개의 변경된 파일52개의 추가작업 그리고 13개의 파일을 삭제
  1. 24 5
      commands.go
  2. 28 8
      provisioning.go

+ 24 - 5
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()...")
@@ -247,12 +258,13 @@ func (handler *CommandHandler) CommandReconnect(ce *CommandEvent) {
 	} else if err == whatsapp.ErrLoginInProgress {
 		ce.Reply("A login or reconnection is already in progress.")
 		return
+	} else if err == whatsapp.ErrAlreadyLoggedIn {
+		ce.Reply("You were already connected.")
+		return
 	}
 	if err != nil {
 		ce.User.log.Warnln("Error while reconnecting:", err)
-		if err == whatsapp.ErrAlreadyLoggedIn {
-			ce.Reply("You were already connected.")
-		} else if err.Error() == "restore session connection timed out" {
+		if err.Error() == "restore session connection timed out" {
 			ce.Reply("Reconnection timed out. Is WhatsApp on your phone reachable?")
 		} else {
 			ce.Reply("Unknown error while reconnecting: %v", err)
@@ -267,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()
 }
 

+ 28 - 8
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()...")
@@ -178,15 +189,16 @@ func (prov *ProvisioningAPI) Reconnect(w http.ResponseWriter, r *http.Request) {
 			ErrCode: "login in progress",
 		})
 		return
+	} else if err == whatsapp.ErrAlreadyLoggedIn {
+		jsonResponse(w, http.StatusConflict, Error{
+			Error:   "You were already connected.",
+			ErrCode: err.Error(),
+		})
+		return
 	}
 	if err != nil {
 		user.log.Warnln("Error while reconnecting:", err)
-		if err == whatsapp.ErrAlreadyLoggedIn {
-			jsonResponse(w, http.StatusConflict, Error{
-				Error:   "You were already connected.",
-				ErrCode: err.Error(),
-			})
-		} else if err.Error() == "restore session connection timed out" {
+		if err.Error() == "restore session connection timed out" {
 			jsonResponse(w, http.StatusForbidden, Error{
 				Error:   "Reconnection timed out. Is WhatsApp on your phone reachable?",
 				ErrCode: err.Error(),
@@ -208,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) {