]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/util/SendMessageResultUtils.java
Update libsignal-service-java
[signal-cli] / src / main / java / org / asamk / signal / util / SendMessageResultUtils.java
index bb46a89dff700f6d41ae3f0ac4925b6fbdc7e7ba..7693240260e7cc987919f8eaed665cae98ee20b8 100644 (file)
@@ -1,7 +1,12 @@
 package org.asamk.signal.util;
 
 package org.asamk.signal.util;
 
+import org.asamk.signal.commands.exceptions.CommandException;
+import org.asamk.signal.commands.exceptions.RateLimitErrorException;
+import org.asamk.signal.commands.exceptions.UntrustedKeyErrorException;
+import org.asamk.signal.commands.exceptions.UserErrorException;
 import org.asamk.signal.json.JsonSendMessageResult;
 import org.asamk.signal.manager.api.ProofRequiredException;
 import org.asamk.signal.json.JsonSendMessageResult;
 import org.asamk.signal.manager.api.ProofRequiredException;
+import org.asamk.signal.manager.api.RateLimitException;
 import org.asamk.signal.manager.api.RecipientIdentifier;
 import org.asamk.signal.manager.api.SendGroupMessageResults;
 import org.asamk.signal.manager.api.SendMessageResult;
 import org.asamk.signal.manager.api.RecipientIdentifier;
 import org.asamk.signal.manager.api.SendGroupMessageResults;
 import org.asamk.signal.manager.api.SendMessageResult;
@@ -22,26 +27,42 @@ public class SendMessageResultUtils {
     }
 
     public static void outputResult(final OutputWriter outputWriter, final SendGroupMessageResults sendMessageResults) {
     }
 
     public static void outputResult(final OutputWriter outputWriter, final SendGroupMessageResults sendMessageResults) {
-        if (outputWriter instanceof PlainTextWriter writer) {
-            var errors = getErrorMessagesFromSendMessageResults(sendMessageResults.results());
-            printSendMessageResultErrors(writer, errors);
-            writer.println("{}", sendMessageResults.timestamp());
-        } else {
-            final var writer = (JsonWriter) outputWriter;
-            var results = getJsonSendMessageResults(sendMessageResults.results());
-            writer.write(Map.of("timestamp", sendMessageResults.timestamp(), "results", results));
+        switch (outputWriter) {
+            case PlainTextWriter writer -> {
+                var errors = getErrorMessagesFromSendMessageResults(sendMessageResults.results());
+                printSendMessageResultErrors(writer, errors);
+                writer.println("{}", sendMessageResults.timestamp());
+            }
+            case JsonWriter writer -> {
+                var results = getJsonSendMessageResults(sendMessageResults.results());
+                writer.write(Map.of("timestamp", sendMessageResults.timestamp(), "results", results));
+            }
         }
     }
 
         }
     }
 
-    public static void outputResult(final OutputWriter outputWriter, final SendMessageResults sendMessageResults) {
-        if (outputWriter instanceof PlainTextWriter writer) {
-            var errors = getErrorMessagesFromSendMessageResults(sendMessageResults.results());
-            printSendMessageResultErrors(writer, errors);
-            writer.println("{}", sendMessageResults.timestamp());
-        } else {
-            final var writer = (JsonWriter) outputWriter;
-            var results = getJsonSendMessageResults(sendMessageResults.results());
-            writer.write(Map.of("timestamp", sendMessageResults.timestamp(), "results", results));
+    public static void outputResult(
+            final OutputWriter outputWriter, final SendMessageResults sendMessageResults
+    ) throws CommandException {
+        switch (outputWriter) {
+            case PlainTextWriter writer -> {
+                var errors = getErrorMessagesFromSendMessageResults(sendMessageResults.results());
+                printSendMessageResultErrors(writer, errors);
+                writer.println("{}", sendMessageResults.timestamp());
+            }
+            case JsonWriter writer -> {
+                var results = getJsonSendMessageResults(sendMessageResults.results());
+                writer.write(Map.of("timestamp", sendMessageResults.timestamp(), "results", results));
+            }
+        }
+        if (!sendMessageResults.hasSuccess()) {
+            if (sendMessageResults.hasOnlyUntrustedIdentity()) {
+                throw new UntrustedKeyErrorException("Failed to send message due to untrusted identities");
+            } else if (sendMessageResults.hasOnlyRateLimitFailure()) {
+                throw new RateLimitErrorException("Failed to send message due to rate limiting",
+                        new RateLimitException(0));
+            } else {
+                throw new UserErrorException("Failed to send message");
+            }
         }
     }
 
         }
     }
 
@@ -70,13 +91,12 @@ public class SendMessageResultUtils {
             return String.format(
                     "CAPTCHA proof required for sending to \"%s\", available options \"%s\" with challenge token \"%s\", or wait \"%d\" seconds.\n"
                             + (
             return String.format(
                     "CAPTCHA proof required for sending to \"%s\", available options \"%s\" with challenge token \"%s\", or wait \"%d\" seconds.\n"
                             + (
-                            failure.getOptions().contains(ProofRequiredException.Option.RECAPTCHA)
+                            failure.getOptions().contains(ProofRequiredException.Option.CAPTCHA)
                                     ? """
                                     ? """
-                                    To get the captcha token, go to https://signalcaptchas.org/challenge/generate.html
-                                    Check the developer tools (F12) console for a failed redirect to signalcaptcha://
-                                    Everything after signalcaptcha:// is the captcha token.
-                                    Use the following command to submit the captcha token:
-                                    signal-cli submitRateLimitChallenge --challenge CHALLENGE_TOKEN --captcha CAPTCHA_TOKEN"""
+                                      To get the captcha token, go to https://signalcaptchas.org/challenge/generate.html
+                                      After solving the captcha, right-click on the "Open Signal" link and copy the link.
+                                      Use the following command to submit the captcha token:
+                                      signal-cli submitRateLimitChallenge --challenge CHALLENGE_TOKEN --captcha CAPTCHA_TOKEN"""
                                     : ""
                     ),
                     identifier,
                                     : ""
                     ),
                     identifier,
@@ -88,6 +108,8 @@ public class SendMessageResultUtils {
                     failure.getRetryAfterSeconds());
         } else if (result.isNetworkFailure()) {
             return String.format("Network failure for \"%s\"", identifier);
                     failure.getRetryAfterSeconds());
         } else if (result.isNetworkFailure()) {
             return String.format("Network failure for \"%s\"", identifier);
+        } else if (result.isRateLimitFailure()) {
+            return String.format("Rate limit failure for \"%s\"", identifier);
         } else if (result.isUnregisteredFailure()) {
             return String.format("Unregistered user \"%s\"", identifier);
         } else if (result.isIdentityFailure()) {
         } else if (result.isUnregisteredFailure()) {
             return String.format("Unregistered user \"%s\"", identifier);
         } else if (result.isIdentityFailure()) {
@@ -97,7 +119,7 @@ public class SendMessageResultUtils {
     }
 
     public static void printSendMessageResultErrors(PlainTextWriter writer, List<String> errors) {
     }
 
     public static void printSendMessageResultErrors(PlainTextWriter writer, List<String> errors) {
-        if (errors.size() == 0) {
+        if (errors.isEmpty()) {
             return;
         }
         writer.println("Failed to send (some) messages:");
             return;
         }
         writer.println("Failed to send (some) messages:");
@@ -106,7 +128,7 @@ public class SendMessageResultUtils {
         }
     }
 
         }
     }
 
-    public static List<JsonSendMessageResult> getJsonSendMessageResults(final Map<RecipientIdentifier, List<SendMessageResult>> mapResults) {
+    private static List<JsonSendMessageResult> getJsonSendMessageResults(final Map<RecipientIdentifier, List<SendMessageResult>> mapResults) {
         return mapResults.entrySet().stream().flatMap(entry -> {
             final var groupId = entry.getKey() instanceof RecipientIdentifier.Group g ? g.groupId() : null;
             return entry.getValue().stream().map(r -> JsonSendMessageResult.from(r, groupId));
         return mapResults.entrySet().stream().flatMap(entry -> {
             final var groupId = entry.getKey() instanceof RecipientIdentifier.Group g ? g.groupId() : null;
             return entry.getValue().stream().map(r -> JsonSendMessageResult.from(r, groupId));