]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
b178b09c2a8b5de84b898b7b3344d7f08788e161
[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 int handleCommand(final Namespace ns, final Manager m) {
67 if (ns.get("output") == OutputType.JSON) {
68 final JsonWriter jsonWriter = new JsonWriter(System.out);
69
70 List<JsonGroup> jsonGroups = new ArrayList<>();
71 for (GroupInfo group : m.getGroups()) {
72 final GroupInviteLinkUrl groupInviteLink = group.getGroupInviteLink();
73
74 jsonGroups.add(new JsonGroup(group.getGroupId().toBase64(),
75 group.getTitle(),
76 group.isMember(m.getSelfAddress()),
77 group.isBlocked(),
78 resolveMembers(m, group.getMembers()),
79 resolveMembers(m, group.getPendingMembers()),
80 resolveMembers(m, group.getRequestingMembers()),
81 groupInviteLink == null ? null : groupInviteLink.getUrl()));
82 }
83
84 try {
85 jsonWriter.write(jsonGroups);
86 } catch (IOException e) {
87 logger.error("Failed to write json object: {}", e.getMessage());
88 return 3;
89 }
90
91 return 0;
92 } else {
93 boolean detailed = ns.getBoolean("detailed");
94 for (GroupInfo group : m.getGroups()) {
95 printGroupPlainText(m, group, detailed);
96 }
97 }
98
99 return 0;
100 }
101
102 private static final class JsonGroup {
103
104 public String id;
105 public String name;
106 public boolean isMember;
107 public boolean isBlocked;
108
109 public Set<String> members;
110 public Set<String> pendingMembers;
111 public Set<String> requestingMembers;
112 public String groupInviteLink;
113
114 public JsonGroup(
115 String id,
116 String name,
117 boolean isMember,
118 boolean isBlocked,
119 Set<String> members,
120 Set<String> pendingMembers,
121 Set<String> requestingMembers,
122 String groupInviteLink
123 ) {
124 this.id = id;
125 this.name = name;
126 this.isMember = isMember;
127 this.isBlocked = isBlocked;
128
129 this.members = members;
130 this.pendingMembers = pendingMembers;
131 this.requestingMembers = requestingMembers;
132 this.groupInviteLink = groupInviteLink;
133 }
134 }
135 }