]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/commands/ListContactsCommand.java
Extend listContacts command with profiles and filtering
[signal-cli] / src / main / java / org / asamk / signal / commands / ListContactsCommand.java
index b83440ec61377f338a2cab1fe663185cc422d1ba..0bfc7ab9a377c99134dd4a8c2e1d831112c896a1 100644 (file)
@@ -1,13 +1,20 @@
 package org.asamk.signal.commands;
 
+import net.sourceforge.argparse4j.impl.Arguments;
 import net.sourceforge.argparse4j.inf.Namespace;
 import net.sourceforge.argparse4j.inf.Subparser;
 
+import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.Manager;
+import org.asamk.signal.manager.storage.recipients.Contact;
+import org.asamk.signal.manager.storage.recipients.Profile;
 import org.asamk.signal.output.JsonWriter;
 import org.asamk.signal.output.OutputWriter;
 import org.asamk.signal.output.PlainTextWriter;
+import org.asamk.signal.util.CommandUtil;
 
+import java.util.Base64;
+import java.util.Optional;
 import java.util.UUID;
 
 public class ListContactsCommand implements JsonRpcLocalCommand {
@@ -19,19 +26,39 @@ public class ListContactsCommand implements JsonRpcLocalCommand {
 
     @Override
     public void attachToSubparser(final Subparser subparser) {
-        subparser.help("Show a list of known contacts with names.");
+        subparser.help("Show a list of known contacts with names and profiles.");
+        subparser.addArgument("recipient").help("Specify one ore more phone numbers to show.").nargs("*");
+        subparser.addArgument("-a", "--all-recipients")
+                .action(Arguments.storeTrue())
+                .help("Include all known recipients, not only contacts.");
+        subparser.addArgument("--blocked")
+                .type(Boolean.class)
+                .help("Specify if only blocked or unblocked contacts should be shown (default: all contacts)");
+        subparser.addArgument("--name").help("Find contacts with the given contact or profile name.");
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m, final OutputWriter outputWriter) {
-        var contacts = m.getContacts();
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
+        final var allRecipients = Boolean.TRUE.equals(ns.getBoolean("all-recipients"));
+        final var blocked = ns.getBoolean("blocked");
+        final var recipientStrings = ns.<String>getList("recipient");
+        final var recipientIdentifiers = CommandUtil.getSingleRecipientIdentifiers(recipientStrings, m.getSelfNumber());
+        final var name = ns.getString("name");
+        final var recipients = m.getRecipients(!allRecipients,
+                Optional.ofNullable(blocked),
+                recipientIdentifiers,
+                Optional.ofNullable(name));
 
         if (outputWriter instanceof PlainTextWriter writer) {
-            for (var c : contacts) {
-                final var contact = c.second();
-                writer.println("Number: {} Name: {} Blocked: {} Message expiration: {}",
-                        c.first().getLegacyIdentifier(),
+            for (var r : recipients) {
+                final var contact = r.getContact() == null ? Contact.newBuilder().build() : r.getContact();
+                final var profile = r.getProfile() == null ? Profile.newBuilder().build() : r.getProfile();
+                writer.println("Number: {} Name: {} Profile name: {} Blocked: {} Message expiration: {}",
+                        r.getAddress().getLegacyIdentifier(),
                         contact.getName(),
+                        profile.getDisplayName(),
                         contact.isBlocked(),
                         contact.getMessageExpirationTime() == 0
                                 ? "disabled"
@@ -39,19 +66,47 @@ public class ListContactsCommand implements JsonRpcLocalCommand {
             }
         } else {
             final var writer = (JsonWriter) outputWriter;
-            final var jsonContacts = contacts.stream().map(contactPair -> {
-                final var address = contactPair.first();
-                final var contact = contactPair.second();
+            final var jsonContacts = recipients.stream().map(r -> {
+                final var address = r.getAddress();
+                final var contact = r.getContact() == null ? Contact.newBuilder().build() : r.getContact();
                 return new JsonContact(address.number().orElse(null),
                         address.uuid().map(UUID::toString).orElse(null),
                         contact.getName(),
                         contact.isBlocked(),
-                        contact.getMessageExpirationTime());
+                        contact.getMessageExpirationTime(),
+                        r.getProfile() == null
+                                ? null
+                                : new JsonContact.JsonProfile(r.getProfile().getLastUpdateTimestamp(),
+                                        r.getProfile().getGivenName(),
+                                        r.getProfile().getFamilyName(),
+                                        r.getProfile().getAbout(),
+                                        r.getProfile().getAboutEmoji(),
+                                        r.getProfile().getPaymentAddress() == null
+                                                ? null
+                                                : Base64.getEncoder()
+                                                        .encodeToString(r.getProfile().getPaymentAddress())));
             }).toList();
 
             writer.write(jsonContacts);
         }
     }
 
-    private record JsonContact(String number, String uuid, String name, boolean isBlocked, int messageExpirationTime) {}
+    private record JsonContact(
+            String number,
+            String uuid,
+            String name,
+            boolean isBlocked,
+            int messageExpirationTime,
+            JsonProfile profile
+    ) {
+
+        private record JsonProfile(
+                long lastUpdateTimestamp,
+                String givenName,
+                String familyName,
+                String about,
+                String aboutEmoji,
+                String paymentAddress
+        ) {}
+    }
 }