1 package org
.asamk
.signal
.commands
;
3 import net
.sourceforge
.argparse4j
.impl
.Arguments
;
4 import net
.sourceforge
.argparse4j
.inf
.Namespace
;
5 import net
.sourceforge
.argparse4j
.inf
.Subparser
;
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
.api
.Group
;
13 import org
.asamk
.signal
.manager
.storage
.recipients
.RecipientAddress
;
14 import org
.slf4j
.Logger
;
15 import org
.slf4j
.LoggerFactory
;
18 import java
.util
.UUID
;
19 import java
.util
.stream
.Collectors
;
21 public class ListGroupsCommand
implements JsonRpcLocalCommand
{
23 private final static Logger logger
= LoggerFactory
.getLogger(ListGroupsCommand
.class);
26 public String
getName() {
31 public void attachToSubparser(final Subparser subparser
) {
32 subparser
.help("List group information including names, ids, active status, blocked status and members");
33 subparser
.addArgument("-d", "--detailed")
34 .action(Arguments
.storeTrue())
35 .help("List the members and group invite links of each group. If output=json, then this is always set");
38 private static Set
<String
> resolveMembers(Set
<RecipientAddress
> addresses
) {
39 return addresses
.stream().map(RecipientAddress
::getLegacyIdentifier
).collect(Collectors
.toSet());
42 private static Set
<JsonGroupMember
> resolveJsonMembers(Set
<RecipientAddress
> addresses
) {
43 return addresses
.stream()
44 .map(address
-> new JsonGroupMember(address
.getNumber().orElse(null),
45 address
.getUuid().map(UUID
::toString
).orElse(null)))
46 .collect(Collectors
.toSet());
49 private static void printGroupPlainText(
50 PlainTextWriter writer
, Group group
, boolean detailed
53 final var groupInviteLink
= group
.getGroupInviteLinkUrl();
56 "Id: {} Name: {} Description: {} Active: {} Blocked: {} Members: {} Pending members: {} Requesting members: {} Admins: {} Message expiration: {} Link: {}",
57 group
.getGroupId().toBase64(),
59 group
.getDescription(),
62 resolveMembers(group
.getMembers()),
63 resolveMembers(group
.getPendingMembers()),
64 resolveMembers(group
.getRequestingMembers()),
65 resolveMembers(group
.getAdminMembers()),
66 group
.getMessageExpirationTimer() == 0 ?
"disabled" : group
.getMessageExpirationTimer() + "s",
67 groupInviteLink
== null ?
'-' : groupInviteLink
.getUrl());
69 writer
.println("Id: {} Name: {} Active: {} Blocked: {}",
70 group
.getGroupId().toBase64(),
78 public void handleCommand(
79 final Namespace ns
, final Manager m
, final OutputWriter outputWriter
80 ) throws CommandException
{
81 final var groups
= m
.getGroups();
83 if (outputWriter
instanceof JsonWriter
) {
84 final var jsonWriter
= (JsonWriter
) outputWriter
;
86 var jsonGroups
= groups
.stream().map(group
-> {
87 final var groupInviteLink
= group
.getGroupInviteLinkUrl();
89 return new JsonGroup(group
.getGroupId().toBase64(),
91 group
.getDescription(),
94 group
.getMessageExpirationTimer(),
95 resolveJsonMembers(group
.getMembers()),
96 resolveJsonMembers(group
.getPendingMembers()),
97 resolveJsonMembers(group
.getRequestingMembers()),
98 resolveJsonMembers(group
.getAdminMembers()),
99 group
.getPermissionAddMember().name(),
100 group
.getPermissionEditDetails().name(),
101 group
.getPermissionSendMessage().name(),
102 groupInviteLink
== null ?
null : groupInviteLink
.getUrl());
103 }).collect(Collectors
.toList());
105 jsonWriter
.write(jsonGroups
);
107 final var writer
= (PlainTextWriter
) outputWriter
;
108 boolean detailed
= Boolean
.TRUE
.equals(ns
.getBoolean("detailed"));
109 for (var group
: groups
) {
110 printGroupPlainText(writer
, group
, detailed
);
115 private static final class JsonGroup
{
117 public final String id
;
118 public final String name
;
119 public final String description
;
120 public final boolean isMember
;
121 public final boolean isBlocked
;
122 public final int messageExpirationTime
;
124 public final Set
<JsonGroupMember
> members
;
125 public final Set
<JsonGroupMember
> pendingMembers
;
126 public final Set
<JsonGroupMember
> requestingMembers
;
127 public final Set
<JsonGroupMember
> admins
;
128 public final String permissionAddMember
;
129 public final String permissionEditDetails
;
130 public final String permissionSendMessage
;
131 public final String groupInviteLink
;
139 final int messageExpirationTime
,
140 Set
<JsonGroupMember
> members
,
141 Set
<JsonGroupMember
> pendingMembers
,
142 Set
<JsonGroupMember
> requestingMembers
,
143 Set
<JsonGroupMember
> admins
,
144 final String permissionAddMember
,
145 final String permissionEditDetails
,
146 final String permissionSendMessage
,
147 String groupInviteLink
151 this.description
= description
;
152 this.isMember
= isMember
;
153 this.isBlocked
= isBlocked
;
154 this.messageExpirationTime
= messageExpirationTime
;
156 this.members
= members
;
157 this.pendingMembers
= pendingMembers
;
158 this.requestingMembers
= requestingMembers
;
159 this.admins
= admins
;
160 this.permissionAddMember
= permissionAddMember
;
161 this.permissionEditDetails
= permissionEditDetails
;
162 this.permissionSendMessage
= permissionSendMessage
;
163 this.groupInviteLink
= groupInviteLink
;
167 private static final class JsonGroupMember
{
169 public final String number
;
170 public final String uuid
;
172 private JsonGroupMember(final String number
, final String uuid
) {
173 this.number
= number
;