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