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