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