]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
debe4ad088975af9cdedbf4f0eb0e54d0bf5a1a8
[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.api.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.asamk.signal.util.CommandUtil;
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 static final 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 subparser.addArgument("-g", "--group-id").help("Specify one or more group IDs to show.").nargs("*");
38 }
39
40 private static Set<String> resolveMembers(Set<RecipientAddress> addresses) {
41 return addresses.stream().map(RecipientAddress::getLegacyIdentifier).collect(Collectors.toSet());
42 }
43
44 private static Set<JsonGroupMember> resolveJsonMembers(Set<RecipientAddress> addresses) {
45 return addresses.stream()
46 .map(address -> new JsonGroupMember(address.number().orElse(null),
47 address.uuid().map(UUID::toString).orElse(null)))
48 .collect(Collectors.toSet());
49 }
50
51 private static void printGroupPlainText(
52 PlainTextWriter writer, Group group, boolean detailed
53 ) {
54 if (detailed) {
55 final var groupInviteLink = group.groupInviteLinkUrl();
56
57 writer.println(
58 "Id: {} Name: {} Description: {} Active: {} Blocked: {} Members: {} Pending members: {} Requesting members: {} Admins: {} Banned: {} Message expiration: {} Link: {}",
59 group.groupId().toBase64(),
60 group.title(),
61 group.description(),
62 group.isMember(),
63 group.isBlocked(),
64 resolveMembers(group.members()),
65 resolveMembers(group.pendingMembers()),
66 resolveMembers(group.requestingMembers()),
67 resolveMembers(group.adminMembers()),
68 resolveMembers(group.bannedMembers()),
69 group.messageExpirationTimer() == 0 ? "disabled" : group.messageExpirationTimer() + "s",
70 groupInviteLink == null ? '-' : groupInviteLink.getUrl());
71 } else {
72 writer.println("Id: {} Name: {} Active: {} Blocked: {}",
73 group.groupId().toBase64(),
74 group.title(),
75 group.isMember(),
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 var groups = m.getGroups();
85
86 final var groupIdStrings = ns.<String>getList("group-id");
87 final var groupIds = CommandUtil.getGroupIds(groupIdStrings);
88 if (!groupIds.isEmpty()) {
89 groups = groups.stream().filter(g -> groupIds.contains(g.groupId())).toList();
90 }
91
92 switch (outputWriter) {
93 case JsonWriter jsonWriter -> {
94 var jsonGroups = groups.stream().map(group -> {
95 final var groupInviteLink = group.groupInviteLinkUrl();
96
97 return new JsonGroup(group.groupId().toBase64(),
98 group.title(),
99 group.description(),
100 group.isMember(),
101 group.isBlocked(),
102 group.messageExpirationTimer(),
103 resolveJsonMembers(group.members()),
104 resolveJsonMembers(group.pendingMembers()),
105 resolveJsonMembers(group.requestingMembers()),
106 resolveJsonMembers(group.adminMembers()),
107 resolveJsonMembers(group.bannedMembers()),
108 group.permissionAddMember().name(),
109 group.permissionEditDetails().name(),
110 group.permissionSendMessage().name(),
111 groupInviteLink == null ? null : groupInviteLink.getUrl());
112 }).toList();
113 jsonWriter.write(jsonGroups);
114 }
115 case PlainTextWriter writer -> {
116 boolean detailed = Boolean.TRUE.equals(ns.getBoolean("detailed"));
117 for (var group : groups) {
118 printGroupPlainText(writer, group, detailed);
119 }
120 }
121 }
122 }
123
124 private record JsonGroup(
125 String id,
126 String name,
127 String description,
128 boolean isMember,
129 boolean isBlocked,
130 int messageExpirationTime,
131 Set<JsonGroupMember> members,
132 Set<JsonGroupMember> pendingMembers,
133 Set<JsonGroupMember> requestingMembers,
134 Set<JsonGroupMember> admins,
135 Set<JsonGroupMember> banned,
136 String permissionAddMember,
137 String permissionEditDetails,
138 String permissionSendMessage,
139 String groupInviteLink
140 ) {}
141
142 private record JsonGroupMember(String number, String uuid) {}
143 }