]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
b22ace6cbc8f51438f1faf91aa9a36cc4fc759c3
[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 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 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 if (outputWriter instanceof JsonWriter jsonWriter) {
93
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
114 jsonWriter.write(jsonGroups);
115 } else {
116 final var writer = (PlainTextWriter) outputWriter;
117 boolean detailed = Boolean.TRUE.equals(ns.getBoolean("detailed"));
118 for (var group : groups) {
119 printGroupPlainText(writer, group, detailed);
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 }