]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
Reformat files
[signal-cli] / src / main / java / org / asamk / signal / commands / ListGroupsCommand.java
index e9da8099ee7c483f4ca45f16a213d08694abc461..62bb4f14510db227b935c28445aa71aaec67446d 100644 (file)
@@ -4,140 +4,140 @@ import net.sourceforge.argparse4j.impl.Arguments;
 import net.sourceforge.argparse4j.inf.Namespace;
 import net.sourceforge.argparse4j.inf.Subparser;
 
-import org.asamk.signal.JsonWriter;
-import org.asamk.signal.OutputWriter;
-import org.asamk.signal.PlainTextWriter;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.Manager;
-import org.asamk.signal.manager.storage.groups.GroupInfo;
-import org.asamk.signal.manager.storage.recipients.RecipientId;
-import org.asamk.signal.util.Util;
+import org.asamk.signal.manager.api.Group;
+import org.asamk.signal.manager.api.RecipientAddress;
+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 org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.Set;
+import java.util.UUID;
 import java.util.stream.Collectors;
 
 public class ListGroupsCommand implements JsonRpcLocalCommand {
 
-    private final static Logger logger = LoggerFactory.getLogger(ListGroupsCommand.class);
+    private static final Logger logger = LoggerFactory.getLogger(ListGroupsCommand.class);
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public String getName() {
+        return "listGroups";
+    }
+
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("List group information including names, ids, active status, blocked status and members");
         subparser.addArgument("-d", "--detailed")
                 .action(Arguments.storeTrue())
                 .help("List the members and group invite links of each group. If output=json, then this is always set");
+        subparser.addArgument("-g", "--group-id").help("Specify one or more group IDs to show.").nargs("*");
     }
 
-    private static Set<String> resolveMembers(Manager m, Set<RecipientId> addresses) {
+    private static Set<String> resolveMembers(Set<RecipientAddress> addresses) {
+        return addresses.stream().map(RecipientAddress::getLegacyIdentifier).collect(Collectors.toSet());
+    }
+
+    private static Set<JsonGroupMember> resolveJsonMembers(Set<RecipientAddress> addresses) {
         return addresses.stream()
-                .map(m::resolveSignalServiceAddress)
-                .map(Util::getLegacyIdentifier)
+                .map(address -> new JsonGroupMember(address.number().orElse(null),
+                        address.uuid().map(UUID::toString).orElse(null)))
                 .collect(Collectors.toSet());
     }
 
-    private static void printGroupPlainText(
-            PlainTextWriter writer, Manager m, GroupInfo group, boolean detailed
-    ) {
+    private static void printGroupPlainText(PlainTextWriter writer, Group group, boolean detailed) {
         if (detailed) {
-            final var groupInviteLink = group.getGroupInviteLink();
+            final var groupInviteLink = group.groupInviteLinkUrl();
 
             writer.println(
-                    "Id: {} Name: {} Description: {} Active: {} Blocked: {} Members: {} Pending members: {} Requesting members: {} Admins: {} Link: {}",
-                    group.getGroupId().toBase64(),
-                    group.getTitle(),
-                    group.getDescription(),
-                    group.isMember(m.getSelfRecipientId()),
+                    "Id: {} Name: {} Description: {} Active: {} Blocked: {} Members: {} Pending members: {} Requesting members: {} Admins: {} Banned: {} Message expiration: {} Link: {}",
+                    group.groupId().toBase64(),
+                    group.title(),
+                    group.description(),
+                    group.isMember(),
                     group.isBlocked(),
-                    resolveMembers(m, group.getMembers()),
-                    resolveMembers(m, group.getPendingMembers()),
-                    resolveMembers(m, group.getRequestingMembers()),
-                    resolveMembers(m, group.getAdminMembers()),
+                    resolveMembers(group.members()),
+                    resolveMembers(group.pendingMembers()),
+                    resolveMembers(group.requestingMembers()),
+                    resolveMembers(group.adminMembers()),
+                    resolveMembers(group.bannedMembers()),
+                    group.messageExpirationTimer() == 0 ? "disabled" : group.messageExpirationTimer() + "s",
                     groupInviteLink == null ? '-' : groupInviteLink.getUrl());
         } else {
             writer.println("Id: {} Name: {}  Active: {} Blocked: {}",
-                    group.getGroupId().toBase64(),
-                    group.getTitle(),
-                    group.isMember(m.getSelfRecipientId()),
+                    group.groupId().toBase64(),
+                    group.title(),
+                    group.isMember(),
                     group.isBlocked());
         }
     }
 
-    private final OutputWriter outputWriter;
-
-    public ListGroupsCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
-    }
-
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
-        final var groups = m.getGroups();
-
-        if (outputWriter instanceof JsonWriter) {
-            final var jsonWriter = (JsonWriter) outputWriter;
-
-            var jsonGroups = groups.stream().map(group -> {
-                final var groupInviteLink = group.getGroupInviteLink();
-
-                return new JsonGroup(group.getGroupId().toBase64(),
-                        group.getTitle(),
-                        group.getDescription(),
-                        group.isMember(m.getSelfRecipientId()),
-                        group.isBlocked(),
-                        resolveMembers(m, group.getMembers()),
-                        resolveMembers(m, group.getPendingMembers()),
-                        resolveMembers(m, group.getRequestingMembers()),
-                        resolveMembers(m, group.getAdminMembers()),
-                        groupInviteLink == null ? null : groupInviteLink.getUrl());
-            }).collect(Collectors.toList());
-
-            jsonWriter.write(jsonGroups);
-        } else {
-            final var writer = (PlainTextWriter) outputWriter;
-            boolean detailed = ns.getBoolean("detailed");
-            for (var group : groups) {
-                printGroupPlainText(writer, m, group, detailed);
-            }
+    public void handleCommand(
+            final Namespace ns,
+            final Manager m,
+            final OutputWriter outputWriter
+    ) throws CommandException {
+        var groups = m.getGroups();
+
+        final var groupIdStrings = ns.<String>getList("group-id");
+        final var groupIds = CommandUtil.getGroupIds(groupIdStrings);
+        if (!groupIds.isEmpty()) {
+            groups = groups.stream().filter(g -> groupIds.contains(g.groupId())).toList();
         }
-    }
 
-    private static final class JsonGroup {
-
-        public String id;
-        public String name;
-        public String description;
-        public boolean isMember;
-        public boolean isBlocked;
-
-        public Set<String> members;
-        public Set<String> pendingMembers;
-        public Set<String> requestingMembers;
-        public Set<String> admins;
-        public String groupInviteLink;
-
-        public JsonGroup(
-                String id,
-                String name,
-                String description,
-                boolean isMember,
-                boolean isBlocked,
-                Set<String> members,
-                Set<String> pendingMembers,
-                Set<String> requestingMembers,
-                Set<String> admins,
-                String groupInviteLink
-        ) {
-            this.id = id;
-            this.name = name;
-            this.description = description;
-            this.isMember = isMember;
-            this.isBlocked = isBlocked;
-
-            this.members = members;
-            this.pendingMembers = pendingMembers;
-            this.requestingMembers = requestingMembers;
-            this.admins = admins;
-            this.groupInviteLink = groupInviteLink;
+        switch (outputWriter) {
+            case JsonWriter jsonWriter -> {
+                var jsonGroups = groups.stream().map(group -> {
+                    final var groupInviteLink = group.groupInviteLinkUrl();
+
+                    return new JsonGroup(group.groupId().toBase64(),
+                            group.title(),
+                            group.description(),
+                            group.isMember(),
+                            group.isBlocked(),
+                            group.messageExpirationTimer(),
+                            resolveJsonMembers(group.members()),
+                            resolveJsonMembers(group.pendingMembers()),
+                            resolveJsonMembers(group.requestingMembers()),
+                            resolveJsonMembers(group.adminMembers()),
+                            resolveJsonMembers(group.bannedMembers()),
+                            group.permissionAddMember().name(),
+                            group.permissionEditDetails().name(),
+                            group.permissionSendMessage().name(),
+                            groupInviteLink == null ? null : groupInviteLink.getUrl());
+                }).toList();
+                jsonWriter.write(jsonGroups);
+            }
+            case PlainTextWriter writer -> {
+                boolean detailed = Boolean.TRUE.equals(ns.getBoolean("detailed"));
+                for (var group : groups) {
+                    printGroupPlainText(writer, group, detailed);
+                }
+            }
         }
     }
+
+    private record JsonGroup(
+            String id,
+            String name,
+            String description,
+            boolean isMember,
+            boolean isBlocked,
+            int messageExpirationTime,
+            Set<JsonGroupMember> members,
+            Set<JsonGroupMember> pendingMembers,
+            Set<JsonGroupMember> requestingMembers,
+            Set<JsonGroupMember> admins,
+            Set<JsonGroupMember> banned,
+            String permissionAddMember,
+            String permissionEditDetails,
+            String permissionSendMessage,
+            String groupInviteLink
+    ) {}
+
+    private record JsonGroupMember(String number, String uuid) {}
 }