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