Fix most unexpected logout bugs, handle connection-in-progress states better and send warning message if sending to whatsapp times out
This commit is contained in:
		
							
								
								
									
										28
									
								
								commands.go
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								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") | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										2
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								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) | ||||
| 		} | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										13
									
								
								portal.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								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
									
								
								user.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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 { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user