]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
Added JSON output to listGroups and allowed json to be activated with -j (#401)
[signal-cli] / src / main / java / org / asamk / signal / commands / ListGroupsCommand.java
index 97af502e8525beb952dd2292f5d56b66ef5e33c1..debc2a4211ffb6941aae2f51c2872344e7b8f450 100644 (file)
@@ -9,32 +9,39 @@ import org.asamk.signal.manager.groups.GroupInviteLinkUrl;
 import org.asamk.signal.manager.storage.groups.GroupInfo;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 
 public class ListGroupsCommand implements LocalCommand {
 
-    private static void printGroup(Manager m, GroupInfo group, boolean detailed) {
-        if (detailed) {
-            Set<String> members = group.getMembers()
-                    .stream()
-                    .map(m::resolveSignalServiceAddress)
-                    .map(SignalServiceAddress::getLegacyIdentifier)
-                    .collect(Collectors.toSet());
-
-            Set<String> pendingMembers = group.getPendingMembers()
-                    .stream()
-                    .map(m::resolveSignalServiceAddress)
-                    .map(SignalServiceAddress::getLegacyIdentifier)
-                    .collect(Collectors.toSet());
-
-            Set<String> requestingMembers = group.getRequestingMembers()
-                    .stream()
-                    .map(m::resolveSignalServiceAddress)
-                    .map(SignalServiceAddress::getLegacyIdentifier)
-                    .collect(Collectors.toSet());
+    private static Set<String> resolveMembers(Manager m, Set<SignalServiceAddress> addresses) {
+        return addresses.stream().map(m::resolveSignalServiceAddress)
+                .map(SignalServiceAddress::getLegacyIdentifier)
+                .collect(Collectors.toSet());
+    }
+
+    private static int printGroupsJson(ObjectMapper jsonProcessor, List<?> objects) {
+        try {
+            jsonProcessor.writeValue(System.out, objects);
+            System.out.println();
+        } catch (IOException e) {
+            System.err.println(e.getMessage());
+            return 1;
+        }
 
+        return 0;
+    }
+
+    private static void printGroupPlainText(Manager m, GroupInfo group, boolean detailed) {
+        if (detailed) {
             final GroupInviteLinkUrl groupInviteLink = group.getGroupInviteLink();
 
             System.out.println(String.format(
@@ -43,9 +50,9 @@ public class ListGroupsCommand implements LocalCommand {
                     group.getTitle(),
                     group.isMember(m.getSelfAddress()),
                     group.isBlocked(),
-                    members,
-                    pendingMembers,
-                    requestingMembers,
+                    resolveMembers(m, group.getMembers()),
+                    resolveMembers(m, group.getPendingMembers()),
+                    resolveMembers(m, group.getRequestingMembers()),
                     groupInviteLink == null ? '-' : groupInviteLink.getUrl()));
         } else {
             System.out.println(String.format("Id: %s Name: %s  Active: %s Blocked: %b",
@@ -58,18 +65,68 @@ public class ListGroupsCommand implements LocalCommand {
 
     @Override
     public void attachToSubparser(final Subparser subparser) {
-        subparser.addArgument("-d", "--detailed").action(Arguments.storeTrue()).help("List members of each group");
-        subparser.help("List group name and ids");
+        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.help("List group information including names, ids, active status, blocked status and members");
     }
 
     @Override
     public int handleCommand(final Namespace ns, final Manager m) {
-        List<GroupInfo> groups = m.getGroups();
-        boolean detailed = ns.getBoolean("detailed");
+        if (ns.getString("output").equals("json")) {
+            final ObjectMapper jsonProcessor = new ObjectMapper();
+            jsonProcessor.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+            jsonProcessor.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
 
-        for (GroupInfo group : groups) {
-            printGroup(m, group, detailed);
+            List<JsonGroup> objects = new ArrayList<>();
+            for (GroupInfo group : m.getGroups()) {
+                final GroupInviteLinkUrl groupInviteLink = group.getGroupInviteLink();
+
+                objects.add(new JsonGroup(group.getGroupId().toBase64(),
+                        group.getTitle(),
+                        group.isMember(m.getSelfAddress()),
+                        group.isBlocked(),
+                        resolveMembers(m, group.getMembers()),
+                        resolveMembers(m, group.getPendingMembers()),
+                        resolveMembers(m, group.getRequestingMembers()),
+                        groupInviteLink == null ? null : groupInviteLink.getUrl()));
+            }
+            return printGroupsJson(jsonProcessor, objects);
+        } else {
+            boolean detailed = ns.getBoolean("detailed");
+            for (GroupInfo group : m.getGroups()) {
+                printGroupPlainText(m, group, detailed);
+            }
         }
+
         return 0;
     }
+
+    private static final class JsonGroup {
+
+        public String id;
+        public String name;
+        public boolean isMember;
+        public boolean isBlocked;
+
+        public Set<String> members;
+        public Set<String> pendingMembers;
+        public Set<String> requestingMembers;
+        public String groupInviteLink;
+
+        public JsonGroup(String id, String name, boolean isMember, boolean isBlocked,
+                         Set<String> members, Set<String> pendingMembers,
+                         Set<String> requestingMembers, String groupInviteLink)
+        {
+            this.id = id;
+            this.name = name;
+            this.isMember = isMember;
+            this.isBlocked = isBlocked;
+
+            this.members = members;
+            this.pendingMembers = pendingMembers;
+            this.requestingMembers = requestingMembers;
+            this.groupInviteLink = groupInviteLink;
+        }
+    }
 }