Browse Source

Merge pull request #181 from mautrix/unregistered-failures-non-fatal

mausignald/signald: make unregisteredFailures non-fatal
Sumner Evans 3 years ago
parent
commit
2ee27d6056
1 changed files with 23 additions and 9 deletions
  1. 23 9
      mausignald/signald.py

+ 23 - 9
mausignald/signald.py

@@ -165,18 +165,29 @@ class SignaldClient(SignaldRPCClient):
                                      mentions=serialized_mentions, timestamp=timestamp,
                                      mentions=serialized_mentions, timestamp=timestamp,
                                      **self._recipient_to_args(recipient))
                                      **self._recipient_to_args(recipient))
         errors = []
         errors = []
-        for result in resp.get("results", []):
-            number = result.get("address", {}).get("number")
+
+        # 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.
+        unregistered_failures = []
+        successful_send_count = 0
+        results = resp.get("results", [])
+        for result in results:
+            number = (
+                result.get("address", {}).get("number") or result.get("address", {}).get("uuid")
+            )
+            proof_required_failure = result.get("proof_required_failure")
             if result.get("networkFailure", False):
             if result.get("networkFailure", False):
                 errors.append(f"Network failure occurred while sending message to {number}.")
                 errors.append(f"Network failure occurred while sending message to {number}.")
-            if result.get("unregisteredFailure", False):
-                errors.append(f"Unregistered failure occurred while sending message to {number}.")
-            if result.get("identityFailure", ""):
+            elif result.get("unregisteredFailure", False):
+                unregistered_failures.append(
+                    f"Unregistered failure occurred while sending message to {number}."
+                )
+            elif result.get("identityFailure", ""):
                 errors.append(
                 errors.append(
                     f"Identity failure occurred while sending message to {number}. New identity: "
                     f"Identity failure occurred while sending message to {number}. New identity: "
                     f"{result['identityFailure']}")
                     f"{result['identityFailure']}")
-            proof_required_failure = result.get("proof_required_failure")
-            if proof_required_failure:
+            elif proof_required_failure:
                 options = proof_required_failure.get('options')
                 options = proof_required_failure.get('options')
                 self.log.warning(
                 self.log.warning(
                     f"Proof Required Failure {options}. "
                     f"Proof Required Failure {options}. "
@@ -193,8 +204,11 @@ class SignaldClient(SignaldRPCClient):
                 elif "PUSH_CHALLENGE" in options:
                 elif "PUSH_CHALLENGE" in options:
                     # Just submit the challenge automatically.
                     # Just submit the challenge automatically.
                     await self.request_v1("submit_challenge")
                     await self.request_v1("submit_challenge")
-        if errors:
-            raise Exception("\n".join(errors))
+            else:
+                successful_send_count += 1
+        self.log.info(f"Successfully sent message to {successful_send_count}/{len(results)} users in {recipient}")
+        if errors or successful_send_count == 0:
+            raise Exception("\n".join(errors + unregistered_failures))
 
 
     async def send_receipt(self, username: str, sender: Address, timestamps: List[int],
     async def send_receipt(self, username: str, sender: Address, timestamps: List[int],
                            when: Optional[int] = None, read: bool = False) -> None:
                            when: Optional[int] = None, read: bool = False) -> None: