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

Fix #142
This commit is contained in:
Tulir Asokan 2020-03-26 19:29:36 +02:00 committed by GitHub
commit 8dd5f6a0d1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 13 deletions

View file

@ -231,7 +231,18 @@ func (handler *CommandHandler) CommandReconnect(ce *CommandEvent) {
} }
return 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 err == whatsapp.ErrInvalidSession {
if ce.User.Session != nil { if ce.User.Session != nil {
ce.User.log.Debugln("Got invalid session error when reconnecting, but user has session. Retrying using RestoreWithSession()...") 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 { } else if err == whatsapp.ErrLoginInProgress {
ce.Reply("A login or reconnection is already in progress.") ce.Reply("A login or reconnection is already in progress.")
return return
} else if err == whatsapp.ErrAlreadyLoggedIn {
ce.Reply("You were already connected.")
return
} }
if err != nil { if err != nil {
ce.User.log.Warnln("Error while reconnecting:", err) ce.User.log.Warnln("Error while reconnecting:", err)
if err == whatsapp.ErrAlreadyLoggedIn { if err.Error() == "restore session connection timed out" {
ce.Reply("You were already connected.")
} else if err.Error() == "restore session connection timed out" {
ce.Reply("Reconnection timed out. Is WhatsApp on your phone reachable?") ce.Reply("Reconnection timed out. Is WhatsApp on your phone reachable?")
} else { } else {
ce.Reply("Unknown error while reconnecting: %v", err) ce.Reply("Unknown error while reconnecting: %v", err)
@ -267,7 +279,14 @@ func (handler *CommandHandler) CommandReconnect(ce *CommandEvent) {
return return
} }
ce.User.ConnectionErrors = 0 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() ce.User.PostLogin()
} }

View file

@ -156,7 +156,18 @@ func (prov *ProvisioningAPI) Reconnect(w http.ResponseWriter, r *http.Request) {
} }
return 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 err == whatsapp.ErrInvalidSession {
if user.Session != nil { if user.Session != nil {
user.log.Debugln("Got invalid session error when reconnecting, but user has session. Retrying using RestoreWithSession()...") 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", ErrCode: "login in progress",
}) })
return return
} } else if err == whatsapp.ErrAlreadyLoggedIn {
if err != nil {
user.log.Warnln("Error while reconnecting:", err)
if err == whatsapp.ErrAlreadyLoggedIn {
jsonResponse(w, http.StatusConflict, Error{ jsonResponse(w, http.StatusConflict, Error{
Error: "You were already connected.", Error: "You were already connected.",
ErrCode: err.Error(), ErrCode: err.Error(),
}) })
} else if err.Error() == "restore session connection timed out" { return
}
if err != nil {
user.log.Warnln("Error while reconnecting:", err)
if err.Error() == "restore session connection timed out" {
jsonResponse(w, http.StatusForbidden, Error{ jsonResponse(w, http.StatusForbidden, Error{
Error: "Reconnection timed out. Is WhatsApp on your phone reachable?", Error: "Reconnection timed out. Is WhatsApp on your phone reachable?",
ErrCode: err.Error(), ErrCode: err.Error(),
@ -208,7 +220,15 @@ func (prov *ProvisioningAPI) Reconnect(w http.ResponseWriter, r *http.Request) {
} }
user.ConnectionErrors = 0 user.ConnectionErrors = 0
user.PostLogin() 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) { func (prov *ProvisioningAPI) Ping(w http.ResponseWriter, r *http.Request) {