]> nmode's Git Repositories - signal-cli/commitdiff
Implement exit code for rate limiting error
authorAsamK <asamk@gmx.de>
Fri, 13 Oct 2023 17:35:29 +0000 (19:35 +0200)
committerAsamK <asamk@gmx.de>
Fri, 13 Oct 2023 17:36:58 +0000 (19:36 +0200)
Closes #1240

lib/src/main/java/org/asamk/signal/manager/api/SendMessageResults.java
man/signal-cli.1.adoc
src/main/java/org/asamk/signal/Main.java
src/main/java/org/asamk/signal/commands/RegisterCommand.java
src/main/java/org/asamk/signal/commands/exceptions/RateLimitErrorException.java [new file with mode: 0644]
src/main/java/org/asamk/signal/util/SendMessageResultUtils.java

index 5b8cfc03624e96155121722e767d9674b87d92c9..de25016359c7117a9202bbd02b121c399abe2333 100644 (file)
@@ -19,4 +19,11 @@ public record SendMessageResults(long timestamp, Map<RecipientIdentifier, List<S
                 .allMatch(identityFailure -> identityFailure)
                 && results.values().stream().mapToInt(List::size).sum() > 0;
     }
+
+    public boolean hasOnlyRateLimitFailure() {
+        return results.values()
+                .stream()
+                .flatMap(res -> res.stream().map(SendMessageResult::isRateLimitFailure))
+                .allMatch(r -> r) && results.values().stream().mapToInt(List::size).sum() > 0;
+    }
 }
index 0fbbe85586295e679b43fef9547a727b8786e080..b3431341b2aaac3960beb2d512d92833b311a403 100644 (file)
@@ -788,6 +788,7 @@ signal-cli -a ACCOUNT trust -a NUMBER
 * *2*: Some unexpected error
 * *3*: Server or IO error
 * *4*: Sending failed due to untrusted key
+* *5*: Server rate limiting error
 
 == Files
 
index 429cdc939199ae59403e12bd1da65fb9b2ef44bb..0a30d20231d004a9fb836f5fe4f485fd00e60d6b 100644 (file)
@@ -24,6 +24,7 @@ import net.sourceforge.argparse4j.inf.Namespace;
 
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.commands.exceptions.IOErrorException;
+import org.asamk.signal.commands.exceptions.RateLimitErrorException;
 import org.asamk.signal.commands.exceptions.UnexpectedErrorException;
 import org.asamk.signal.commands.exceptions.UntrustedKeyErrorException;
 import org.asamk.signal.commands.exceptions.UserErrorException;
@@ -116,6 +117,8 @@ public class Main {
             return 3;
         } else if (e instanceof UntrustedKeyErrorException) {
             return 4;
+        } else if (e instanceof RateLimitErrorException) {
+            return 5;
         } else {
             return 2;
         }
index 5018b7e08face13f2754eeaafac01a0d15e549f1..1ca7bee2c1e20c94e54b086585f2280ee7337708 100644 (file)
@@ -9,6 +9,7 @@ import net.sourceforge.argparse4j.inf.Subparser;
 import org.asamk.signal.OutputType;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.commands.exceptions.IOErrorException;
+import org.asamk.signal.commands.exceptions.RateLimitErrorException;
 import org.asamk.signal.commands.exceptions.UserErrorException;
 import org.asamk.signal.manager.RegistrationManager;
 import org.asamk.signal.manager.api.CaptchaRequiredException;
@@ -64,7 +65,7 @@ public class RegisterCommand implements RegistrationCommand, JsonRpcRegistration
 
     private void register(
             final RegistrationManager m, final boolean voiceVerification, final String captcha
-    ) throws UserErrorException, IOErrorException {
+    ) throws CommandException {
         try {
             m.register(voiceVerification, captcha);
         } catch (RateLimitException e) {
@@ -72,7 +73,7 @@ public class RegisterCommand implements RegistrationCommand, JsonRpcRegistration
             if (e.getNextAttemptTimestamp() > 0) {
                 message += "\nNext attempt may be tried at " + DateUtils.formatTimestamp(e.getNextAttemptTimestamp());
             }
-            throw new UserErrorException(message);
+            throw new RateLimitErrorException(message, e);
         } catch (CaptchaRequiredException e) {
             String message;
             if (captcha == null) {
diff --git a/src/main/java/org/asamk/signal/commands/exceptions/RateLimitErrorException.java b/src/main/java/org/asamk/signal/commands/exceptions/RateLimitErrorException.java
new file mode 100644 (file)
index 0000000..a2eb567
--- /dev/null
@@ -0,0 +1,10 @@
+package org.asamk.signal.commands.exceptions;
+
+import org.asamk.signal.manager.api.RateLimitException;
+
+public final class RateLimitErrorException extends CommandException {
+
+    public RateLimitErrorException(final String message, final RateLimitException cause) {
+        super(message, cause);
+    }
+}
index cf2b282fabd33d8f150c0f43eb94ee66205e0e40..ecc669e863b6ebfd1699d05f4bff8597a20a12d8 100644 (file)
@@ -1,10 +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;
@@ -51,6 +53,9 @@ public class SendMessageResultUtils {
         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");
             }
@@ -111,7 +116,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:");