X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/62687d103fab1ade650b920008060c220361d581..17c24b3ff22ca00d9fa26e976b4f1de64eb4a689:/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java diff --git a/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java b/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java index bb46a89d..76932402 100644 --- a/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java +++ b/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java @@ -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,42 @@ 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"); + } } } @@ -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" + ( - 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 +108,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 +119,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:"); @@ -106,7 +128,7 @@ public class SendMessageResultUtils { } } - public static List getJsonSendMessageResults(final Map> mapResults) { + private static List getJsonSendMessageResults(final Map> 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));