]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
Update libsignal-service-java
[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 Set<JsonGroupMember> resolveJsonMembers(Manager m, Set<RecipientId> addresses) {
46 return addresses.stream()
47 .map(m::resolveSignalServiceAddress)
48 .map(address -> new JsonGroupMember(address.getNumber().orNull(), address.getUuid().toString()))
49 .collect(Collectors.toSet());
50 }
51
52 private static void printGroupPlainText(
53 PlainTextWriter writer, Manager m, GroupInfo group, boolean detailed
54 ) {
55 if (detailed) {
56 final var groupInviteLink = group.getGroupInviteLink();
57
58 writer.println(
59 "Id: {} Name: {} Description: {} Active: {} Blocked: {} Members: {} Pending members: {} Requesting members: {} Admins: {} Message expiration: {} Link: {}",
60 group.getGroupId().toBase64(),
61 group.getTitle(),
62 group.getDescription(),
63 group.isMember(m.getSelfRecipientId()),
64 group.isBlocked(),
65 resolveMembers(m, group.getMembers()),
66 resolveMembers(m, group.getPendingMembers()),
67 resolveMembers(m, group.getRequestingMembers()),
68 resolveMembers(m, group.getAdminMembers()),
69 group.getMessageExpirationTime() == 0 ? "disabled" : group.getMessageExpirationTime() + "s",
70 groupInviteLink == null ? '-' : groupInviteLink.getUrl());
71 } else {
72 writer.println("Id: {} Name: {} Active: {} Blocked: {}",
73 group.getGroupId().toBase64(),
74 group.getTitle(),
75 group.isMember(m.getSelfRecipientId()),
76 group.isBlocked());
77 }
78 }
79
80 @Override
81 public void handleCommand(
82 final Namespace ns, final Manager m, final OutputWriter outputWriter
83 ) throws CommandException {
84 final var groups = m.getGroups();
85
86 if (outputWriter instanceof JsonWriter) {
87 final var jsonWriter = (JsonWriter) outputWriter;
88
89 var jsonGroups = groups.stream().map(group -> {
90 final var groupInviteLink = group.getGroupInviteLink();
91
92 return new JsonGroup(group.getGroupId().toBase64(),
93 group.getTitle(),
94 group.getDescription(),
95 group.isMember(m.getSelfRecipientId()),
96 group.isBlocked(),
97 group.getMessageExpirationTime(),
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 public final int messageExpirationTime;
123
124 public final Set<JsonGroupMember> members;
125 public final Set<JsonGroupMember> pendingMembers;
126 public final Set<JsonGroupMember> requestingMembers;
127 public final Set<JsonGroupMember> admins;
128 public final String groupInviteLink;
129
130 public JsonGroup(
131 String id,
132 String name,
133 String description,
134 boolean isMember,
135 boolean isBlocked,
136 final int messageExpirationTime,
137 Set<JsonGroupMember> members,
138 Set<JsonGroupMember> pendingMembers,
139 Set<JsonGroupMember> requestingMembers,
140 Set<JsonGroupMember> admins,
141 String groupInviteLink
142 ) {
143 this.id = id;
144 this.name = name;
145 this.description = description;
146 this.isMember = isMember;
147 this.isBlocked = isBlocked;
148 this.messageExpirationTime = messageExpirationTime;
149
150 this.members = members;
151 this.pendingMembers = pendingMembers;
152 this.requestingMembers = requestingMembers;
153 this.admins = admins;
154 this.groupInviteLink = groupInviteLink;
155 }
156 }
157
158 private static final class JsonGroupMember {
159
160 public final String number;
161 public final String uuid;
162
163 private JsonGroupMember(final String number, final String uuid) {
164 this.number = number;
165 this.uuid = uuid;
166 }
167 }
168 }