]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
Update systemd service file
[signal-cli] / src / main / java / org / asamk / signal / commands / ListGroupsCommand.java
1 package org.asamk.signal.commands;
2
3 import com.fasterxml.jackson.annotation.JsonAutoDetect;
4 import com.fasterxml.jackson.annotation.PropertyAccessor;
5 import com.fasterxml.jackson.core.JsonGenerator;
6 import com.fasterxml.jackson.databind.ObjectMapper;
7
8 import net.sourceforge.argparse4j.impl.Arguments;
9 import net.sourceforge.argparse4j.inf.Namespace;
10 import net.sourceforge.argparse4j.inf.Subparser;
11
12 import org.asamk.signal.manager.Manager;
13 import org.asamk.signal.manager.groups.GroupInviteLinkUrl;
14 import org.asamk.signal.manager.storage.groups.GroupInfo;
15 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
16
17 import java.io.IOException;
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.util.Set;
21 import java.util.stream.Collectors;
22
23 public class ListGroupsCommand implements LocalCommand {
24
25 private static Set<String> resolveMembers(Manager m, Set<SignalServiceAddress> addresses) {
26 return addresses.stream()
27 .map(m::resolveSignalServiceAddress)
28 .map(SignalServiceAddress::getLegacyIdentifier)
29 .collect(Collectors.toSet());
30 }
31
32 private static int printGroupsJson(ObjectMapper jsonProcessor, List<?> objects) {
33 try {
34 jsonProcessor.writeValue(System.out, objects);
35 System.out.println();
36 } catch (IOException e) {
37 System.err.println(e.getMessage());
38 return 3;
39 }
40
41 return 0;
42 }
43
44 private static void printGroupPlainText(Manager m, GroupInfo group, boolean detailed) {
45 if (detailed) {
46 final GroupInviteLinkUrl groupInviteLink = group.getGroupInviteLink();
47
48 System.out.println(String.format(
49 "Id: %s Name: %s Active: %s Blocked: %b Members: %s Pending members: %s Requesting members: %s Link: %s",
50 group.getGroupId().toBase64(),
51 group.getTitle(),
52 group.isMember(m.getSelfAddress()),
53 group.isBlocked(),
54 resolveMembers(m, group.getMembers()),
55 resolveMembers(m, group.getPendingMembers()),
56 resolveMembers(m, group.getRequestingMembers()),
57 groupInviteLink == null ? '-' : groupInviteLink.getUrl()));
58 } else {
59 System.out.println(String.format("Id: %s Name: %s Active: %s Blocked: %b",
60 group.getGroupId().toBase64(),
61 group.getTitle(),
62 group.isMember(m.getSelfAddress()),
63 group.isBlocked()));
64 }
65 }
66
67 @Override
68 public void attachToSubparser(final Subparser subparser) {
69 subparser.addArgument("-d", "--detailed")
70 .action(Arguments.storeTrue())
71 .help("List the members and group invite links of each group. If output=json, then this is always set");
72
73 subparser.help("List group information including names, ids, active status, blocked status and members");
74 }
75
76 @Override
77 public int handleCommand(final Namespace ns, final Manager m) {
78 if (ns.getString("output").equals("json")) {
79 final ObjectMapper jsonProcessor = new ObjectMapper();
80 jsonProcessor.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
81 jsonProcessor.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
82
83 List<JsonGroup> objects = new ArrayList<>();
84 for (GroupInfo group : m.getGroups()) {
85 final GroupInviteLinkUrl groupInviteLink = group.getGroupInviteLink();
86
87 objects.add(new JsonGroup(group.getGroupId().toBase64(),
88 group.getTitle(),
89 group.isMember(m.getSelfAddress()),
90 group.isBlocked(),
91 resolveMembers(m, group.getMembers()),
92 resolveMembers(m, group.getPendingMembers()),
93 resolveMembers(m, group.getRequestingMembers()),
94 groupInviteLink == null ? null : groupInviteLink.getUrl()));
95 }
96 return printGroupsJson(jsonProcessor, objects);
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 }