From b585bee61a4de57672799b521819c8ce1fe4c372 Mon Sep 17 00:00:00 2001 From: david-harley Date: Fri, 1 Jan 2021 21:14:37 +1030 Subject: [PATCH] Added AsamK's suggestions --- man/signal-cli.1.adoc | 6 +-- .../org/asamk/signal/commands/Commands.java | 2 +- ...Command.java => GetUserStatusCommand.java} | 42 ++++++++++++++----- .../org/asamk/signal/manager/Manager.java | 23 +++++++--- 4 files changed, 52 insertions(+), 21 deletions(-) rename src/main/java/org/asamk/signal/commands/{IsRegisteredCommand.java => GetUserStatusCommand.java} (59%) diff --git a/man/signal-cli.1.adoc b/man/signal-cli.1.adoc index 5acb92a4..fa2db7c3 100644 --- a/man/signal-cli.1.adoc +++ b/man/signal-cli.1.adoc @@ -124,14 +124,14 @@ Only works, if this is the master device. Specify the device you want to remove. Use listDevices to see the deviceIds. -=== isRegistered +=== getUserStatus -Checks if a list of phone numbers are registered on Signal or not. +Uses a list of phone numbers to determine the statuses of those users. Shows if they are registered on the Signal Servers or not. [NUMBER [NUMBER ...]]:: One or more numbers to check. *--json*:: -Output number registration statuses in json format, one object per line. +Output the statuses as an array of json objects. === send diff --git a/src/main/java/org/asamk/signal/commands/Commands.java b/src/main/java/org/asamk/signal/commands/Commands.java index 0ea53a70..1e081dff 100644 --- a/src/main/java/org/asamk/signal/commands/Commands.java +++ b/src/main/java/org/asamk/signal/commands/Commands.java @@ -11,7 +11,7 @@ public class Commands { addCommand("addDevice", new AddDeviceCommand()); addCommand("block", new BlockCommand()); addCommand("daemon", new DaemonCommand()); - addCommand("isRegistered", new IsRegisteredCommand()); + addCommand("getUserStatus", new GetUserStatusCommand()); addCommand("link", new LinkCommand()); addCommand("listContacts", new ListContactsCommand()); addCommand("listDevices", new ListDevicesCommand()); diff --git a/src/main/java/org/asamk/signal/commands/IsRegisteredCommand.java b/src/main/java/org/asamk/signal/commands/GetUserStatusCommand.java similarity index 59% rename from src/main/java/org/asamk/signal/commands/IsRegisteredCommand.java rename to src/main/java/org/asamk/signal/commands/GetUserStatusCommand.java index ad65273d..c4bdf3d9 100644 --- a/src/main/java/org/asamk/signal/commands/IsRegisteredCommand.java +++ b/src/main/java/org/asamk/signal/commands/GetUserStatusCommand.java @@ -13,8 +13,13 @@ import net.sourceforge.argparse4j.inf.Subparser; import org.asamk.signal.manager.Manager; import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; +import java.util.Map; +import java.util.List; -public class IsRegisteredCommand implements LocalCommand { +public class GetUserStatusCommand implements LocalCommand { @Override public void attachToSubparser(final Subparser subparser) { @@ -32,33 +37,48 @@ public class IsRegisteredCommand implements LocalCommand { return 1; } + // Setup the json object mapper ObjectMapper jsonProcessor = new ObjectMapper(); jsonProcessor.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // disable autodetect jsonProcessor.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); jsonProcessor.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET); - for (String phone_number : ns.getList("number")) { + // Get a map of registration statuses + Map registered; + try { + registered = m.areUsersRegistered(new HashSet<>(ns.getList("number"))); + } catch (IOException e) { + System.err.println("Unable to check if users are registered"); + return 1; + } + + // Output + if (ns.getBoolean("json")) { + List objects = new ArrayList<>(); + for (Map.Entry entry : registered.entrySet()) { + objects.add(new JsonIsRegistered(entry.getKey(), entry.getValue())); + } + try { - boolean isRegistered = m.isUserRegistered(phone_number); - if (ns.getBoolean("json")) { - JsonIsReceived object = new JsonIsReceived(phone_number, isRegistered); - System.out.println(jsonProcessor.writeValueAsString(object)); - } else { - System.out.println(phone_number + ": " + isRegistered); - } + System.out.println(jsonProcessor.writeValueAsString(objects)); } catch (IOException e) { System.err.println(e.getMessage()); } + + } else { + for (Map.Entry entry : registered.entrySet()) { + System.out.println(entry.getKey() + ": " + entry.getValue()); + } } return 0; } - private class JsonIsReceived { + private class JsonIsRegistered { String name; boolean isRegistered; - public JsonIsReceived(String name, boolean isRegistered) { + public JsonIsRegistered(String name, boolean isRegistered) { this.name = name; this.isRegistered = isRegistered; } diff --git a/src/main/java/org/asamk/signal/manager/Manager.java b/src/main/java/org/asamk/signal/manager/Manager.java index 27eee77f..04882064 100644 --- a/src/main/java/org/asamk/signal/manager/Manager.java +++ b/src/main/java/org/asamk/signal/manager/Manager.java @@ -346,14 +346,25 @@ public class Manager implements Closeable { } /** - * This is used for checking if someone else's number is registered on Signal + * This is used for checking a set of phone numbers for registration on Signal * - * @param number The phone number in question - * @return True if registered, false otherwise - * @throws IOException if its unable to check if the user is registered + * @param numbers The set of phone number in question + * @return A map of numbers to booleans. True if registered, false otherwise. Should never be null + * @throws IOException if its unable to check if the users are registered */ - public boolean isUserRegistered(String number) throws IOException { - return this.accountManager.getContact(number).orNull() != null; + public Map areUsersRegistered(Set numbers) throws IOException { + // Note "contactDetails" has no optionals. It only gives us info on users who are registered + List contactDetails = this.accountManager.getContacts(numbers); + + // Make the initial map with all numbers set to false for now + Map usersRegistered = numbers.stream().collect(Collectors.toMap(x -> x, x -> false)); + + // Override the contacts we did obtain + for (ContactTokenDetails contactDetail : contactDetails) { + usersRegistered.put(contactDetail.getNumber(), true); + } + + return usersRegistered; } public void register(boolean voiceVerification, String captcha) throws IOException {