Forráskód Böngészése

Sleep if logged in user is disconnected when handling message

Tulir Asokan 1 éve
szülő
commit
22812c7455
1 módosított fájl, 8 hozzáadás és 4 törlés
  1. 8 4
      portal.go

+ 8 - 4
portal.go

@@ -4094,7 +4094,7 @@ func (portal *Portal) HandleMatrixMessage(sender *User, evt *event.Event, timing
 	ms := metricSender{portal: portal, timings: &timings}
 
 	allowRelay := evt.Type != TypeMSC3381PollResponse && evt.Type != TypeMSC3381V2PollResponse && evt.Type != TypeMSC3381PollStart
-	if err := portal.canBridgeFrom(sender, allowRelay); err != nil {
+	if err := portal.canBridgeFrom(sender, allowRelay, true); err != nil {
 		go ms.sendMessageMetrics(evt, err, "Ignoring", true)
 		return
 	} else if portal.Key.JID == types.StatusBroadcastJID && portal.bridge.Config.Bridge.DisableStatusBroadcastSend {
@@ -4188,7 +4188,7 @@ func (portal *Portal) HandleMatrixMessage(sender *User, evt *event.Event, timing
 }
 
 func (portal *Portal) HandleMatrixReaction(sender *User, evt *event.Event) {
-	if err := portal.canBridgeFrom(sender, false); err != nil {
+	if err := portal.canBridgeFrom(sender, false, true); err != nil {
 		go portal.sendMessageMetrics(evt, err, "Ignoring", nil)
 		return
 	} else if portal.Key.JID.Server == types.BroadcastServer {
@@ -4280,7 +4280,7 @@ func (portal *Portal) upsertReaction(txn dbutil.Transaction, intent *appservice.
 }
 
 func (portal *Portal) HandleMatrixRedaction(sender *User, evt *event.Event) {
-	if err := portal.canBridgeFrom(sender, true); err != nil {
+	if err := portal.canBridgeFrom(sender, true, true); err != nil {
 		go portal.sendMessageMetrics(evt, err, "Ignoring", nil)
 		return
 	}
@@ -4449,12 +4449,16 @@ func (portal *Portal) HandleMatrixTyping(newTyping []id.UserID) {
 	portal.setTyping(stoppedTyping, types.ChatPresencePaused)
 }
 
-func (portal *Portal) canBridgeFrom(sender *User, allowRelay bool) error {
+func (portal *Portal) canBridgeFrom(sender *User, allowRelay, reconnectWait bool) error {
 	if !sender.IsLoggedIn() {
 		if allowRelay && portal.HasRelaybot() {
 			return nil
 		} else if sender.Session != nil {
 			return errUserNotConnected
+		} else if reconnectWait {
+			// If a message was received exactly during a disconnection, wait a second for the socket to reconnect
+			time.Sleep(1 * time.Second)
+			return portal.canBridgeFrom(sender, allowRelay, false)
 		} else {
 			return errUserNotLoggedIn
 		}