import org.asamk.signal.commands.exceptions.CommandException;
import org.asamk.signal.commands.exceptions.IOErrorException;
+import org.asamk.signal.manager.api.RecipientIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.whispersystems.signalservice.api.messages.SendMessageResult;
import org.whispersystems.signalservice.api.push.exceptions.ProofRequiredException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
+import java.util.Map;
import java.util.stream.Collectors;
import static org.asamk.signal.util.Util.getLegacyIdentifier;
}
public static void handleSendMessageResults(
- List<SendMessageResult> results
+ Map<RecipientIdentifier, List<SendMessageResult>> mapResults
+ ) throws CommandException {
+ List<String> errors = getErrorMessagesFromSendMessageResults(mapResults);
+ handleSendMessageResultErrors(errors);
+ }
+
+ public static void handleSendMessageResults(
+ Collection<SendMessageResult> results
) throws CommandException {
var errors = getErrorMessagesFromSendMessageResults(results);
handleSendMessageResultErrors(errors);
}
- public static List<String> getErrorMessagesFromSendMessageResults(List<SendMessageResult> results) {
+ public static List<String> getErrorMessagesFromSendMessageResults(final Map<RecipientIdentifier, List<SendMessageResult>> mapResults) {
+ return mapResults.values()
+ .stream()
+ .flatMap(results -> getErrorMessagesFromSendMessageResults(results).stream())
+ .collect(Collectors.toList());
+ }
+
+ public static List<String> getErrorMessagesFromSendMessageResults(Collection<SendMessageResult> results) {
var errors = new ArrayList<String>();
for (var result : results) {
var error = getErrorMessageFromSendMessageResult(result);
} else if (result.getProofRequiredFailure() != null) {
final var failure = result.getProofRequiredFailure();
return String.format(
- "CAPTCHA proof required for sending to \"%s\", available options \"%s\" with token \"%s\", or wait \"%d\" seconds",
+ "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)
+ ?
+ "To get the captcha token, go to https://signalcaptchas.org/registration/generate.html\n"
+ + "Check the developer tools (F12) console for a failed redirect to signalcaptcha://\n"
+ + "Everything after signalcaptcha:// is the captcha token.\n"
+ + "Use the following command to submit the captcha token:\n"
+ + "signal-cli submitRateLimitChallenge --challenge CHALLENGE_TOKEN --captcha CAPTCHA_TOKEN"
+ : ""
+ ),
identifier,
failure.getOptions()
.stream()
for (var error : errors) {
message.append(error).append("\n");
}
- throw new IOErrorException(message.toString());
+ throw new IOErrorException(message.toString(), null);
}
}