]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
e0086cae6a7b4bd99b8bb569618144573482fd18
[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.manager.Manager;
10 import org.asamk.signal.manager.groups.GroupInviteLinkUrl;
11 import org.asamk.signal.manager.storage.groups.GroupInfo;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
14 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
15
16 import java.io.IOException;
17 import java.util.ArrayList;
18 import java.util.List;
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(Manager m, GroupInfo group, boolean detailed) {
34 if (detailed) {
35 final GroupInviteLinkUrl groupInviteLink = group.getGroupInviteLink();
36
37 System.out.println(String.format(
38 "Id: %s Name: %s Active: %s Blocked: %b Members: %s Pending members: %s Requesting members: %s Link: %s",
39 group.getGroupId().toBase64(),
40 group.getTitle(),
41 group.isMember(m.getSelfAddress()),
42 group.isBlocked(),
43 resolveMembers(m, group.getMembers()),
44 resolveMembers(m, group.getPendingMembers()),
45 resolveMembers(m, group.getRequestingMembers()),
46 groupInviteLink == null ? '-' : groupInviteLink.getUrl()));
47 } else {
48 System.out.println(String.format("Id: %s Name: %s Active: %s Blocked: %b",
49 group.getGroupId().toBase64(),
50 group.getTitle(),
51 group.isMember(m.getSelfAddress()),
52 group.isBlocked()));
53 }
54 }
55
56 @Override
57 public void attachToSubparser(final Subparser subparser) {
58 subparser.addArgument("-d", "--detailed")
59 .action(Arguments.storeTrue())
60 .help("List the members and group invite links of each group. If output=json, then this is always set");
61
62 subparser.help("List group information including names, ids, active status, blocked status and members");
63 }
64
65 @Override
66 public Set<OutputType> getSupportedOutputTypes() {
67 return Set.of(OutputType.PLAIN_TEXT, OutputType.JSON);
68 }
69
70 @Override
71 public int handleCommand(final Namespace ns, final Manager m) {
72 if (ns.get("output") == OutputType.JSON) {
73 final JsonWriter jsonWriter = new JsonWriter(System.out);
74
75 List<JsonGroup> jsonGroups = new ArrayList<>();
76 for (GroupInfo group : m.getGroups()) {
77 final GroupInviteLinkUrl groupInviteLink = group.getGroupInviteLink();
78
79 jsonGroups.add(new JsonGroup(group.getGroupId().toBase64(),
80 group.getTitle(),
81 group.isMember(m.getSelfAddress()),
82 group.isBlocked(),
83 resolveMembers(m, group.getMembers()),
84 resolveMembers(m, group.getPendingMembers()),
85 resolveMembers(m, group.getRequestingMembers()),
86 groupInviteLink == null ? null : groupInviteLink.getUrl()));
87 }
88
89 try {
90 jsonWriter.write(jsonGroups);
91 } catch (IOException e) {
92 logger.error("Failed to write json object: {}", e.getMessage());
93 return 3;
94 }
95
96 return 0;
97 } else {
98 boolean detailed = ns.getBoolean("detailed");
99 for (GroupInfo group : m.getGroups()) {
100 printGroupPlainText(m, group, detailed);
101 }
102 }
103
104 return 0;
105 }
106
107 private static final class JsonGroup {
108
109 public String id;
110 public String name;
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 String groupInviteLink;
118
119 public JsonGroup(
120 String id,
121 String name,
122 boolean isMember,
123 boolean isBlocked,
124 Set<String> members,
125 Set<String> pendingMembers,
126 Set<String> requestingMembers,
127 String groupInviteLink
128 ) {
129 this.id = id;
130 this.name = name;
131 this.isMember = isMember;
132 this.isBlocked = isBlocked;
133
134 this.members = members;
135 this.pendingMembers = pendingMembers;
136 this.requestingMembers = requestingMembers;
137 this.groupInviteLink = groupInviteLink;
138 }
139 }
140 }