]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
Add command to delete local account data
[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.commands.exceptions.CommandException;
8 import org.asamk.signal.manager.Manager;
9 import org.asamk.signal.manager.api.Group;
10 import org.asamk.signal.manager.storage.recipients.RecipientAddress;
11 import org.asamk.signal.output.JsonWriter;
12 import org.asamk.signal.output.OutputWriter;
13 import org.asamk.signal.output.PlainTextWriter;
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.number().orElse(null),
45 address.uuid().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.groupInviteLinkUrl();
54
55 writer.println(
56 "Id: {} Name: {} Description: {} Active: {} Blocked: {} Members: {} Pending members: {} Requesting members: {} Admins: {} Banned: {} Message expiration: {} Link: {}",
57 group.groupId().toBase64(),
58 group.title(),
59 group.description(),
60 group.isMember(),
61 group.isBlocked(),
62 resolveMembers(group.members()),
63 resolveMembers(group.pendingMembers()),
64 resolveMembers(group.requestingMembers()),
65 resolveMembers(group.adminMembers()),
66 resolveMembers(group.bannedMembers()),
67 group.messageExpirationTimer() == 0 ? "disabled" : group.messageExpirationTimer() + "s",
68 groupInviteLink == null ? '-' : groupInviteLink.getUrl());
69 } else {
70 writer.println("Id: {} Name: {} Active: {} Blocked: {}",
71 group.groupId().toBase64(),
72 group.title(),
73 group.isMember(),
74 group.isBlocked());
75 }
76 }
77
78 @Override
79 public void handleCommand(
80 final Namespace ns, final Manager m, final OutputWriter outputWriter
81 ) throws CommandException {
82 final var groups = m.getGroups();
83
84 if (outputWriter instanceof JsonWriter jsonWriter) {
85
86 var jsonGroups = groups.stream().map(group -> {
87 final var groupInviteLink = group.groupInviteLinkUrl();
88
89 return new JsonGroup(group.groupId().toBase64(),
90 group.title(),
91 group.description(),
92 group.isMember(),
93 group.isBlocked(),
94 group.messageExpirationTimer(),
95 resolveJsonMembers(group.members()),
96 resolveJsonMembers(group.pendingMembers()),
97 resolveJsonMembers(group.requestingMembers()),
98 resolveJsonMembers(group.adminMembers()),
99 resolveJsonMembers(group.bannedMembers()),
100 group.permissionAddMember().name(),
101 group.permissionEditDetails().name(),
102 group.permissionSendMessage().name(),
103 groupInviteLink == null ? null : groupInviteLink.getUrl());
104 }).toList();
105
106 jsonWriter.write(jsonGroups);
107 } else {
108 final var writer = (PlainTextWriter) outputWriter;
109 boolean detailed = Boolean.TRUE.equals(ns.getBoolean("detailed"));
110 for (var group : groups) {
111 printGroupPlainText(writer, group, detailed);
112 }
113 }
114 }
115
116 private record JsonGroup(
117 String id,
118 String name,
119 String description,
120 boolean isMember,
121 boolean isBlocked,
122 int messageExpirationTime,
123 Set<JsonGroupMember> members,
124 Set<JsonGroupMember> pendingMembers,
125 Set<JsonGroupMember> requestingMembers,
126 Set<JsonGroupMember> admins,
127 Set<JsonGroupMember> banned,
128 String permissionAddMember,
129 String permissionEditDetails,
130 String permissionSendMessage,
131 String groupInviteLink
132 ) {}
133
134 private record JsonGroupMember(String number, String uuid) {}
135 }