From: AsamK Date: Fri, 13 Oct 2023 17:35:29 +0000 (+0200) Subject: Implement exit code for rate limiting error X-Git-Tag: v0.12.3~16 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/56ee173d03baf8feede7c14aea5d9d670a047ae7?ds=sidebyside Implement exit code for rate limiting error Closes #1240 --- diff --git a/lib/src/main/java/org/asamk/signal/manager/api/SendMessageResults.java b/lib/src/main/java/org/asamk/signal/manager/api/SendMessageResults.java index 5b8cfc03..de250163 100644 --- a/lib/src/main/java/org/asamk/signal/manager/api/SendMessageResults.java +++ b/lib/src/main/java/org/asamk/signal/manager/api/SendMessageResults.java @@ -19,4 +19,11 @@ public record SendMessageResults(long timestamp, Map 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; + } } diff --git a/man/signal-cli.1.adoc b/man/signal-cli.1.adoc index 0fbbe855..b3431341 100644 --- a/man/signal-cli.1.adoc +++ b/man/signal-cli.1.adoc @@ -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 diff --git a/src/main/java/org/asamk/signal/Main.java b/src/main/java/org/asamk/signal/Main.java index 429cdc93..0a30d202 100644 --- a/src/main/java/org/asamk/signal/Main.java +++ b/src/main/java/org/asamk/signal/Main.java @@ -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; } diff --git a/src/main/java/org/asamk/signal/commands/RegisterCommand.java b/src/main/java/org/asamk/signal/commands/RegisterCommand.java index 5018b7e0..1ca7bee2 100644 --- a/src/main/java/org/asamk/signal/commands/RegisterCommand.java +++ b/src/main/java/org/asamk/signal/commands/RegisterCommand.java @@ -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 index 00000000..a2eb567e --- /dev/null +++ b/src/main/java/org/asamk/signal/commands/exceptions/RateLimitErrorException.java @@ -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); + } +} diff --git a/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java b/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java index cf2b282f..ecc669e8 100644 --- a/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java +++ b/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java @@ -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 errors) { - if (errors.size() == 0) { + if (errors.isEmpty()) { return; } writer.println("Failed to send (some) messages:");