]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
b2182429d30648de5de762149d5ef50bcc2e80e9
[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.api.Group;
13 import org.asamk.signal.manager.storage.recipients.RecipientAddress;
14 import org.slf4j.Logger;
15 import org.slf4j.LoggerFactory;
16
17 import java.util.Set;
18 import java.util.UUID;
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(Set<RecipientAddress> addresses) {
39 return addresses.stream().map(RecipientAddress::getLegacyIdentifier).collect(Collectors.toSet());
40 }
41
42 private static Set<JsonGroupMember> resolveJsonMembers(Set<RecipientAddress> addresses) {
43 return addresses.stream()
44 .map(address -> new JsonGroupMember(address.getNumber().orElse(null),
45 address.getUuid().map(UUID::toString).orElse(null)))
46 .collect(Collectors.toSet());
47 }
48
49 private static void printGroupPlainText(
50 PlainTextWriter writer, Group group, boolean detailed
51 ) {
52 if (detailed) {
53 final var groupInviteLink = group.getGroupInviteLinkUrl();
54
55 writer.println(
56 "Id: {} Name: {} Description: {} Active: {} Blocked: {} Members: {} Pending members: {} Requesting members: {} Admins: {} Message expiration: {} Link: {}",
57 group.getGroupId().toBase64(),
58 group.getTitle(),
59 group.getDescription(),
60 group.isMember(),
61 group.isBlocked(),
62 resolveMembers(group.getMembers()),
63 resolveMembers(group.getPendingMembers()),
64 resolveMembers(group.getRequestingMembers()),
65 resolveMembers(group.getAdminMembers()),
66 group.getMessageExpirationTimer() == 0 ? "disabled" : group.getMessageExpirationTimer() + "s",
67 groupInviteLink == null ? '-' : groupInviteLink.getUrl());
68 } else {
69 writer.println("Id: {} Name: {} Active: {} Blocked: {}",
70 group.getGroupId().toBase64(),
71 group.getTitle(),
72 group.isMember(),
73 group.isBlocked());
74 }
75 }
76
77 @Override
78 public void handleCommand(
79 final Namespace ns, final Manager m, final OutputWriter outputWriter
80 ) throws CommandException {
81 final var groups = m.getGroups();
82
83 if (outputWriter instanceof JsonWriter) {
84 final var jsonWriter = (JsonWriter) outputWriter;
85
86 var jsonGroups = groups.stream().map(group -> {
87 final var groupInviteLink = group.getGroupInviteLinkUrl();
88
89 return new JsonGroup(group.getGroupId().toBase64(),
90 group.getTitle(),
91 group.getDescription(),
92 group.isMember(),
93 group.isBlocked(),
94 group.getMessageExpirationTimer(),
95 resolveJsonMembers(group.getMembers()),
96 resolveJsonMembers(group.getPendingMembers()),
97 resolveJsonMembers(group.getRequestingMembers()),
98 resolveJsonMembers(group.getAdminMembers()),
99 group.getPermissionAddMember().name(),
100 group.getPermissionEditDetails().name(),
101 group.getPermissionSendMessage().name(),
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 = Boolean.TRUE.equals(ns.getBoolean("detailed"));
109 for (var group : groups) {
110 printGroupPlainText(writer, 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 permissionAddMember;
129 public final String permissionEditDetails;
130 public final String permissionSendMessage;
131 public final String groupInviteLink;
132
133 public JsonGroup(
134 String id,
135 String name,
136 String description,
137 boolean isMember,
138 boolean isBlocked,
139 final int messageExpirationTime,
140 Set<JsonGroupMember> members,
141 Set<JsonGroupMember> pendingMembers,
142 Set<JsonGroupMember> requestingMembers,
143 Set<JsonGroupMember> admins,
144 final String permissionAddMember,
145 final String permissionEditDetails,
146 final String permissionSendMessage,
147 String groupInviteLink
148 ) {
149 this.id = id;
150 this.name = name;
151 this.description = description;
152 this.isMember = isMember;
153 this.isBlocked = isBlocked;
154 this.messageExpirationTime = messageExpirationTime;
155
156 this.members = members;
157 this.pendingMembers = pendingMembers;
158 this.requestingMembers = requestingMembers;
159 this.admins = admins;
160 this.permissionAddMember = permissionAddMember;
161 this.permissionEditDetails = permissionEditDetails;
162 this.permissionSendMessage = permissionSendMessage;
163 this.groupInviteLink = groupInviteLink;
164 }
165 }
166
167 private static final class JsonGroupMember {
168
169 public final String number;
170 public final String uuid;
171
172 private JsonGroupMember(final String number, final String uuid) {
173 this.number = number;
174 this.uuid = uuid;
175 }
176 }
177 }