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
.commands
.exceptions
.CommandException
;
8 import org
.asamk
.signal
.manager
.Manager
;
9 import org
.asamk
.signal
.manager
.api
.Group
;
10 import org
.asamk
.signal
.manager
.storage
.recipients
.RecipientAddress
;
11 import org
.asamk
.signal
.output
.JsonWriter
;
12 import org
.asamk
.signal
.output
.OutputWriter
;
13 import org
.asamk
.signal
.output
.PlainTextWriter
;
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
.number().orElse(null),
45 address
.uuid().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
.groupInviteLinkUrl();
56 "Id: {} Name: {} Description: {} Active: {} Blocked: {} Members: {} Pending members: {} Requesting members: {} Admins: {} Banned: {} Message expiration: {} Link: {}",
57 group
.groupId().toBase64(),
62 resolveMembers(group
.members()),
63 resolveMembers(group
.pendingMembers()),
64 resolveMembers(group
.requestingMembers()),
65 resolveMembers(group
.adminMembers()),
66 resolveMembers(group
.bannedMembers()),
67 group
.messageExpirationTimer() == 0 ?
"disabled" : group
.messageExpirationTimer() + "s",
68 groupInviteLink
== null ?
'-' : groupInviteLink
.getUrl());
70 writer
.println("Id: {} Name: {} Active: {} Blocked: {}",
71 group
.groupId().toBase64(),
79 public void handleCommand(
80 final Namespace ns
, final Manager m
, final OutputWriter outputWriter
81 ) throws CommandException
{
82 final var groups
= m
.getGroups();
84 if (outputWriter
instanceof JsonWriter jsonWriter
) {
86 var jsonGroups
= groups
.stream().map(group
-> {
87 final var groupInviteLink
= group
.groupInviteLinkUrl();
89 return new JsonGroup(group
.groupId().toBase64(),
94 group
.messageExpirationTimer(),
95 resolveJsonMembers(group
.members()),
96 resolveJsonMembers(group
.pendingMembers()),
97 resolveJsonMembers(group
.requestingMembers()),
98 resolveJsonMembers(group
.adminMembers()),
99 resolveJsonMembers(group
.bannedMembers()),
100 group
.permissionAddMember().name(),
101 group
.permissionEditDetails().name(),
102 group
.permissionSendMessage().name(),
103 groupInviteLink
== null ?
null : groupInviteLink
.getUrl());
106 jsonWriter
.write(jsonGroups
);
108 final var writer
= (PlainTextWriter
) outputWriter
;
109 boolean detailed
= Boolean
.TRUE
.equals(ns
.getBoolean("detailed"));
110 for (var group
: groups
) {
111 printGroupPlainText(writer
, group
, detailed
);
116 private record JsonGroup(
122 int messageExpirationTime
,
123 Set
<JsonGroupMember
> members
,
124 Set
<JsonGroupMember
> pendingMembers
,
125 Set
<JsonGroupMember
> requestingMembers
,
126 Set
<JsonGroupMember
> admins
,
127 Set
<JsonGroupMember
> banned
,
128 String permissionAddMember
,
129 String permissionEditDetails
,
130 String permissionSendMessage
,
131 String groupInviteLink
134 private record JsonGroupMember(String number
, String uuid
) {}