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