فهرست منبع

Fix most unexpected logout bugs, handle connection-in-progress states better and send warning message if sending to whatsapp times out

Tulir Asokan 5 سال پیش
والد
کامیت
d91f705e95
4فایلهای تغییر یافته به همراه40 افزوده شده و 7 حذف شده
  1. 24 4
      commands.go
  2. 1 1
      main.go
  3. 11 2
      portal.go
  4. 4 0
      user.go

+ 24 - 4
commands.go

@@ -223,6 +223,13 @@ func (handler *CommandHandler) CommandReconnect(ce *CommandEvent) {
 		} else {
 			ce.Reply("Unknown error while reconnecting: %v", err)
 		}
+		ce.User.log.Debugln("Disconnecting due to failed session restore in reconnect command...")
+		sess, err := ce.User.Conn.Disconnect()
+		if err != nil {
+			ce.User.log.Errorln("Failed to disconnect after failed session restore in reconnect command:", err)
+		} else if len(sess.Wid) > 0 {
+			ce.User.SetSession(&sess)
+		}
 		return
 	}
 	ce.User.ConnectionErrors = 0
@@ -259,8 +266,9 @@ func (handler *CommandHandler) CommandDisconnect(ce *CommandEvent) {
 		ce.User.log.Warnln("Error while disconnecting:", err)
 		ce.Reply("Unknown error while disconnecting: %v", err)
 		return
+	} else if len(sess.Wid) > 0 {
+		ce.User.SetSession(&sess)
 	}
-	ce.User.SetSession(&sess)
 	ce.Reply("Successfully disconnected. Use the `reconnect` command to reconnect.")
 }
 
@@ -268,13 +276,25 @@ const cmdPingHelp = `ping - Check your connection to WhatsApp.`
 
 func (handler *CommandHandler) CommandPing(ce *CommandEvent) {
 	if ce.User.Session == nil {
-		ce.Reply("You're not logged into WhatsApp.")
+		if ce.User.IsLoginInProgress() {
+			ce.Reply("You're not logged into WhatsApp, but there's a login in progress.")
+		} else {
+			ce.Reply("You're not logged into WhatsApp.")
+		}
 	} else if ce.User.Conn == nil {
 		ce.Reply("You don't have a WhatsApp connection.")
 	} else if ok, err := ce.User.Conn.AdminTest(); err != nil {
-		ce.Reply("Connection not OK: %v", err)
+		if ce.User.IsLoginInProgress() {
+			ce.Reply("Connection not OK: %v, but login in progress", err)
+		} else {
+			ce.Reply("Connection not OK: %v", err)
+		}
 	} else if !ok {
-		ce.Reply("Connection not OK, but no error received")
+		if ce.User.IsLoginInProgress() {
+			ce.Reply("Connection not OK, but no error received and login in progress")
+		} else {
+			ce.Reply("Connection not OK, but no error received")
+		}
 	} else {
 		ce.Reply("Connection to WhatsApp OK")
 	}

+ 1 - 1
main.go

@@ -282,7 +282,7 @@ func (bridge *Bridge) Stop() {
 		sess, err := user.Conn.Disconnect()
 		if err != nil {
 			bridge.Log.Errorfln("Error while disconnecting %s: %v", user.MXID, err)
-		} else {
+		} else if len(sess.Wid) > 0 {
 			user.SetSession(&sess)
 		}
 	}

+ 11 - 2
portal.go

@@ -1092,8 +1092,11 @@ func (portal *Portal) sendMatrixConnectionError(sender *User, eventID string) bo
 		if portal.IsPrivateChat() {
 			inRoom = " in your management room"
 		}
-		msg := format.RenderMarkdown(fmt.Sprintf("\u26a0 You are not connected to WhatsApp, so your message was not bridged. " +
-			"Use `%s reconnect`%s to reconnect.", portal.bridge.Config.Bridge.CommandPrefix, inRoom))
+		reconnect := fmt.Sprintf("Use `%s reconnect`%s to reconnect.", portal.bridge.Config.Bridge.CommandPrefix, inRoom)
+		if sender.IsLoginInProgress() {
+			reconnect = "You have a login attempt in progress, please wait."
+		}
+		msg := format.RenderMarkdown("\u26a0 You are not connected to WhatsApp, so your message was not bridged. " + reconnect)
 		msg.MsgType = mautrix.MsgNotice
 		_, err := portal.MainIntent().SendMessageEvent(portal.MXID, mautrix.EventMessage, msg)
 		if err != nil {
@@ -1227,6 +1230,12 @@ func (portal *Portal) HandleMatrixMessage(sender *User, evt *mautrix.Event) {
 	_, err = sender.Conn.Send(info)
 	if err != nil {
 		portal.log.Errorfln("Error handling Matrix event %s: %v", evt.ID, err)
+		msg := format.RenderMarkdown(fmt.Sprintf("\u26a0 Your message may not have been bridged: %v", err))
+		msg.MsgType = mautrix.MsgNotice
+		_, err := portal.MainIntent().SendMessageEvent(portal.MXID, mautrix.EventMessage, msg)
+		if err != nil {
+			portal.log.Errorln("Failed to send bridging failure message:", err)
+		}
 	} else {
 		portal.log.Debugln("Handled Matrix event:", evt)
 	}

+ 4 - 0
user.go

@@ -233,6 +233,10 @@ func (user *User) IsConnected() bool {
 	return user.Conn != nil && user.Conn.IsConnected() && user.Conn.IsLoggedIn()
 }
 
+func (user *User) IsLoginInProgress() bool {
+	return user.Conn != nil && user.Conn.IsLoginInProgress()
+}
+
 func (user *User) loginQrChannel(ce *CommandEvent, qrChan <-chan string, eventIDChan chan<- string) {
 	var qrEventID string
 	for code := range qrChan {