]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
aab91077676feead0dd5da430cf29591f4e573f9
[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.OutputType;
9 import org.asamk.signal.PlainTextWriter;
10 import org.asamk.signal.PlainTextWriterImpl;
11 import org.asamk.signal.commands.exceptions.CommandException;
12 import org.asamk.signal.manager.Manager;
13 import org.asamk.signal.manager.storage.groups.GroupInfo;
14 import org.asamk.signal.manager.storage.recipients.RecipientId;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
18
19 import java.util.ArrayList;
20 import java.util.Set;
21 import java.util.stream.Collectors;
22
23 public class ListGroupsCommand implements LocalCommand {
24
25 private final static Logger logger = LoggerFactory.getLogger(ListGroupsCommand.class);
26
27 private static Set<String> resolveMembers(Manager m, Set<RecipientId> addresses) {
28 return addresses.stream()
29 .map(m::resolveSignalServiceAddress)
30 .map(SignalServiceAddress::getLegacyIdentifier)
31 .collect(Collectors.toSet());
32 }
33
34 private static void printGroupPlainText(
35 PlainTextWriter writer, Manager m, GroupInfo group, boolean detailed
36 ) {
37 if (detailed) {
38 final var groupInviteLink = group.getGroupInviteLink();
39
40 writer.println(
41 "Id: {} Name: {} Description: {} Active: {} Blocked: {} Members: {} Pending members: {} Requesting members: {} Admins: {} Link: {}",
42 group.getGroupId().toBase64(),
43 group.getTitle(),
44 group.getDescription(),
45 group.isMember(m.getSelfRecipientId()),
46 group.isBlocked(),
47 resolveMembers(m, group.getMembers()),
48 resolveMembers(m, group.getPendingMembers()),
49 resolveMembers(m, group.getRequestingMembers()),
50 resolveMembers(m, group.getAdminMembers()),
51 groupInviteLink == null ? '-' : groupInviteLink.getUrl());
52 } else {
53 writer.println("Id: {} Name: {} Active: {} Blocked: {}",
54 group.getGroupId().toBase64(),
55 group.getTitle(),
56 group.isMember(m.getSelfRecipientId()),
57 group.isBlocked());
58 }
59 }
60
61 @Override
62 public void attachToSubparser(final Subparser subparser) {
63 subparser.addArgument("-d", "--detailed")
64 .action(Arguments.storeTrue())
65 .help("List the members and group invite links of each group. If output=json, then this is always set");
66
67 subparser.help("List group information including names, ids, active status, blocked status and members");
68 }
69
70 @Override
71 public Set<OutputType> getSupportedOutputTypes() {
72 return Set.of(OutputType.PLAIN_TEXT, OutputType.JSON);
73 }
74
75 @Override
76 public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
77 if (ns.get("output") == OutputType.JSON) {
78 final var jsonWriter = new JsonWriter(System.out);
79
80 var jsonGroups = new ArrayList<JsonGroup>();
81 for (var group : m.getGroups()) {
82 final var groupInviteLink = group.getGroupInviteLink();
83
84 jsonGroups.add(new JsonGroup(group.getGroupId().toBase64(),
85 group.getTitle(),
86 group.getDescription(),
87 group.isMember(m.getSelfRecipientId()),
88 group.isBlocked(),
89 resolveMembers(m, group.getMembers()),
90 resolveMembers(m, group.getPendingMembers()),
91 resolveMembers(m, group.getRequestingMembers()),
92 resolveMembers(m, group.getAdminMembers()),
93 groupInviteLink == null ? null : groupInviteLink.getUrl()));
94 }
95
96 jsonWriter.write(jsonGroups);
97 } else {
98 final var writer = new PlainTextWriterImpl(System.out);
99 boolean detailed = ns.getBoolean("detailed");
100 for (var group : m.getGroups()) {
101 printGroupPlainText(writer, m, group, detailed);
102 }
103 }
104 }
105
106 private static final class JsonGroup {
107
108 public String id;
109 public String name;
110 public String description;
111 public boolean isMember;
112 public boolean isBlocked;
113
114 public Set<String> members;
115 public Set<String> pendingMembers;
116 public Set<String> requestingMembers;
117 public Set<String> admins;
118 public String groupInviteLink;
119
120 public JsonGroup(
121 String id,
122 String name,
123 String description,
124 boolean isMember,
125 boolean isBlocked,
126 Set<String> members,
127 Set<String> pendingMembers,
128 Set<String> requestingMembers,
129 Set<String> admins,
130 String groupInviteLink
131 ) {
132 this.id = id;
133 this.name = name;
134 this.description = description;
135 this.isMember = isMember;
136 this.isBlocked = isBlocked;
137
138 this.members = members;
139 this.pendingMembers = pendingMembers;
140 this.requestingMembers = requestingMembers;
141 this.admins = admins;
142 this.groupInviteLink = groupInviteLink;
143 }
144 }
145 }