]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
Extend json output with number and uuid fields
[signal-cli] / src / main / java / org / asamk / signal / commands / ListGroupsCommand.java
1 package org.asamk.signal.commands;
2
3 import net.sourceforge.argparse4j.impl.Arguments;
4 import net.sourceforge.argparse4j.inf.Namespace;
5 import net.sourceforge.argparse4j.inf.Subparser;
6
7 import org.asamk.signal.JsonWriter;
8 import org.asamk.signal.OutputWriter;
9 import org.asamk.signal.PlainTextWriter;
10 import org.asamk.signal.commands.exceptions.CommandException;
11 import org.asamk.signal.manager.Manager;
12 import org.asamk.signal.manager.storage.groups.GroupInfo;
13 import org.asamk.signal.manager.storage.recipients.RecipientId;
14 import org.asamk.signal.util.Util;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17
18 import java.util.Set;
19 import java.util.stream.Collectors;
20
21 public class ListGroupsCommand implements JsonRpcLocalCommand {
22
23 private final static Logger logger = LoggerFactory.getLogger(ListGroupsCommand.class);
24
25 @Override
26 public String getName() {
27 return "listGroups";
28 }
29
30 @Override
31 public void attachToSubparser(final Subparser subparser) {
32 subparser.help("List group information including names, ids, active status, blocked status and members");
33 subparser.addArgument("-d", "--detailed")
34 .action(Arguments.storeTrue())
35 .help("List the members and group invite links of each group. If output=json, then this is always set");
36 }
37
38 private static Set<String> resolveMembers(Manager m, Set<RecipientId> addresses) {
39 return addresses.stream()
40 .map(m::resolveSignalServiceAddress)
41 .map(Util::getLegacyIdentifier)
42 .collect(Collectors.toSet());
43 }
44
45 private static void printGroupPlainText(
46 PlainTextWriter writer, Manager m, GroupInfo group, boolean detailed
47 ) {
48 if (detailed) {
49 final var groupInviteLink = group.getGroupInviteLink();
50
51 writer.println(
52 "Id: {} Name: {} Description: {} Active: {} Blocked: {} Members: {} Pending members: {} Requesting members: {} Admins: {} Link: {}",
53 group.getGroupId().toBase64(),
54 group.getTitle(),
55 group.getDescription(),
56 group.isMember(m.getSelfRecipientId()),
57 group.isBlocked(),
58 resolveMembers(m, group.getMembers()),
59 resolveMembers(m, group.getPendingMembers()),
60 resolveMembers(m, group.getRequestingMembers()),
61 resolveMembers(m, group.getAdminMembers()),
62 groupInviteLink == null ? '-' : groupInviteLink.getUrl());
63 } else {
64 writer.println("Id: {} Name: {} Active: {} Blocked: {}",
65 group.getGroupId().toBase64(),
66 group.getTitle(),
67 group.isMember(m.getSelfRecipientId()),
68 group.isBlocked());
69 }
70 }
71
72 @Override
73 public void handleCommand(
74 final Namespace ns, final Manager m, final OutputWriter outputWriter
75 ) throws CommandException {
76 final var groups = m.getGroups();
77
78 if (outputWriter instanceof JsonWriter) {
79 final var jsonWriter = (JsonWriter) outputWriter;
80
81 var jsonGroups = groups.stream().map(group -> {
82 final var groupInviteLink = group.getGroupInviteLink();
83
84 return new JsonGroup(group.getGroupId().toBase64(),
85 group.getTitle(),
86 group.getDescription(),
87 group.isMember(m.getSelfRecipientId()),
88 group.isBlocked(),
89 resolveMembers(m, group.getMembers()),
90 resolveMembers(m, group.getPendingMembers()),
91 resolveMembers(m, group.getRequestingMembers()),
92 resolveMembers(m, group.getAdminMembers()),
93 groupInviteLink == null ? null : groupInviteLink.getUrl());
94 }).collect(Collectors.toList());
95
96 jsonWriter.write(jsonGroups);
97 } else {
98 final var writer = (PlainTextWriter) outputWriter;
99 boolean detailed = ns.getBoolean("detailed");
100 for (var group : groups) {
101 printGroupPlainText(writer, m, group, detailed);
102 }
103 }
104 }
105
106 private static final class JsonGroup {
107
108 public String id;
109 public String name;
110 public String description;
111 public boolean isMember;
112 public boolean isBlocked;
113
114 public Set<String> members;
115 public Set<String> pendingMembers;
116 public Set<String> requestingMembers;
117 public Set<String> admins;
118 public String groupInviteLink;
119
120 public JsonGroup(
121 String id,
122 String name,
123 String description,
124 boolean isMember,
125 boolean isBlocked,
126 Set<String> members,
127 Set<String> pendingMembers,
128 Set<String> requestingMembers,
129 Set<String> admins,
130 String groupInviteLink
131 ) {
132 this.id = id;
133 this.name = name;
134 this.description = description;
135 this.isMember = isMember;
136 this.isBlocked = isBlocked;
137
138 this.members = members;
139 this.pendingMembers = pendingMembers;
140 this.requestingMembers = requestingMembers;
141 this.admins = admins;
142 this.groupInviteLink = groupInviteLink;
143 }
144 }
145 }