]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/util/SendMessageResultUtils.java
Reformat files
[signal-cli] / src / main / java / org / asamk / signal / util / SendMessageResultUtils.java
index 0e13a20091cddab85f9739f005d36f9706caf19a..a23e3c5493938ebedb3d6968f813fd8d4fa68261 100644 (file)
@@ -1,7 +1,12 @@
 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.manager.api.RateLimitException;
 import org.asamk.signal.manager.api.RecipientIdentifier;
 import org.asamk.signal.manager.api.SendGroupMessageResults;
 import org.asamk.signal.manager.api.SendMessageResult;
@@ -22,26 +27,43 @@ public class SendMessageResultUtils {
     }
 
     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");
+            }
         }
     }
 
@@ -53,14 +75,14 @@ public class SendMessageResultUtils {
                         .map(SendMessageResultUtils::getErrorMessageFromSendMessageResult)
                         .filter(Objects::nonNull)
                         .map(error -> entry.getKey().getIdentifier() + ": " + error))
-                .collect(Collectors.toList());
+                .toList();
     }
 
     public static List<String> getErrorMessagesFromSendMessageResults(Collection<SendMessageResult> results) {
         return results.stream()
                 .map(SendMessageResultUtils::getErrorMessageFromSendMessageResult)
                 .filter(Objects::nonNull)
-                .collect(Collectors.toList());
+                .toList();
     }
 
     public static String getErrorMessageFromSendMessageResult(SendMessageResult result) {
@@ -70,13 +92,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"
                             + (
-                            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,
@@ -88,6 +109,8 @@ public class SendMessageResultUtils {
                     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()) {
@@ -97,7 +120,7 @@ public class SendMessageResultUtils {
     }
 
     public static void printSendMessageResultErrors(PlainTextWriter writer, List<String> errors) {
-        if (errors.size() == 0) {
+        if (errors.isEmpty()) {
             return;
         }
         writer.println("Failed to send (some) messages:");
@@ -106,14 +129,14 @@ 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));
-        }).collect(Collectors.toList());
+        }).toList();
     }
 
     public static List<JsonSendMessageResult> getJsonSendMessageResults(Collection<SendMessageResult> results) {
-        return results.stream().map(JsonSendMessageResult::from).collect(Collectors.toList());
+        return results.stream().map(JsonSendMessageResult::from).toList();
     }
 }