Browse Source

message send errors: fix when sending to chat with only you

Sumner Evans 3 years ago
parent
commit
4dce1c3d01
2 changed files with 36 additions and 24 deletions
  1. 7 4
      mausignald/signald.py
  2. 29 20
      mautrix_signal/portal.py

+ 7 - 4
mausignald/signald.py

@@ -209,11 +209,11 @@ class SignaldClient(SignaldRPCClient):
             timestamp=timestamp,
             **self._recipient_to_args(recipient),
         )
-        errors = []
 
         # We handle unregisteredFailure a little differently than other errors. If there are no
         # successful sends, then we show an error with the unregisteredFailure details, otherwise
         # we ignore it.
+        errors = []
         unregistered_failures = []
         successful_send_count = 0
         results = resp.get("results", [])
@@ -252,10 +252,13 @@ class SignaldClient(SignaldRPCClient):
             else:
                 successful_send_count += 1
         self.log.info(
-            f"Successfully sent message to {successful_send_count}/{len(results)} users in {recipient}"
+            f"Successfully sent message to {successful_send_count}/{len(results)} users in "
+            f"{recipient} with {len(unregistered_failures)} unregistered failures"
         )
-        if errors or successful_send_count == 0:
-            raise Exception("\n".join(errors + unregistered_failures))
+        if len(unregistered_failures) == len(results):
+            errors.extend(unregistered_failures)
+        if errors:
+            raise Exception("\n".join(errors))
 
     async def send_receipt(
         self,

+ 29 - 20
mautrix_signal/portal.py

@@ -287,6 +287,32 @@ class Portal(DBPortal, BasePortal):
 
     async def handle_matrix_message(
         self, sender: u.User, message: MessageEventContent, event_id: EventID
+    ) -> None:
+        try:
+            await self._handle_matrix_message(sender, message, event_id)
+        except Exception as e:
+            sender.send_remote_checkpoint(
+                MessageSendCheckpointStatus.PERM_FAILURE,
+                event_id,
+                self.mxid,
+                EventType.ROOM_MESSAGE,
+                message.msgtype,
+                error=e,
+            )
+            auth_failed = (
+                "org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException"
+            )
+            if isinstance(e, ResponseError) and auth_failed in e.data.get("exceptions", []):
+                await sender.push_bridge_state(BridgeStateEvent.BAD_CREDENTIALS, error=str(e))
+            await self._send_message(
+                self.main_intent,
+                TextMessageEventContent(
+                    msgtype=MessageType.NOTICE, body=f"\u26a0 Your message was not bridged: {e}"
+                ),
+            )
+
+    async def _handle_matrix_message(
+        self, sender: u.User, message: MessageEventContent, event_id: EventID
     ) -> None:
         orig_sender = sender
         sender, is_relay = await self.get_relay_sender(sender, f"message {event_id}")
@@ -338,26 +364,9 @@ class Portal(DBPortal, BasePortal):
                 attachments=attachments,
                 timestamp=request_id,
             )
-        except Exception as e:
-            sender.send_remote_checkpoint(
-                MessageSendCheckpointStatus.PERM_FAILURE,
-                event_id,
-                self.mxid,
-                EventType.ROOM_MESSAGE,
-                message.msgtype,
-                error=e,
-            )
-            auth_failed = (
-                "org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException"
-            )
-            if isinstance(e, ResponseError) and auth_failed in e.data.get("exceptions", []):
-                await sender.push_bridge_state(BridgeStateEvent.BAD_CREDENTIALS, error=str(e))
-            await self._send_message(
-                self.main_intent,
-                TextMessageEventContent(
-                    msgtype=MessageType.NOTICE, body=f"\u26a0 Your message was not bridged: {e}"
-                ),
-            )
+        except Exception:
+            self.log.exception("Sending message failed")
+            raise
         else:
             sender.send_remote_checkpoint(
                 MessageSendCheckpointStatus.SUCCESS,