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
.groupInviteLinkUrl();
56 "Id: {} Name: {} Description: {} Active: {} Blocked: {} Members: {} Pending members: {} Requesting members: {} Admins: {} Message expiration: {} Link: {}",
57 group
.groupId().toBase64(),
62 resolveMembers(group
.members()),
63 resolveMembers(group
.pendingMembers()),
64 resolveMembers(group
.requestingMembers()),
65 resolveMembers(group
.adminMembers()),
66 group
.messageExpirationTimer() == 0 ?
"disabled" : group
.messageExpirationTimer() + "s",
67 groupInviteLink
== null ?
'-' : groupInviteLink
.getUrl());
69 writer
.println("Id: {} Name: {} Active: {} Blocked: {}",
70 group
.groupId().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 jsonWriter
) {
85 var jsonGroups
= groups
.stream().map(group
-> {
86 final var groupInviteLink
= group
.groupInviteLinkUrl();
88 return new JsonGroup(group
.groupId().toBase64(),
93 group
.messageExpirationTimer(),
94 resolveJsonMembers(group
.members()),
95 resolveJsonMembers(group
.pendingMembers()),
96 resolveJsonMembers(group
.requestingMembers()),
97 resolveJsonMembers(group
.adminMembers()),
98 group
.permissionAddMember().name(),
99 group
.permissionEditDetails().name(),
100 group
.permissionSendMessage().name(),
101 groupInviteLink
== null ?
null : groupInviteLink
.getUrl());
102 }).collect(Collectors
.toList());
104 jsonWriter
.write(jsonGroups
);
106 final var writer
= (PlainTextWriter
) outputWriter
;
107 boolean detailed
= Boolean
.TRUE
.equals(ns
.getBoolean("detailed"));
108 for (var group
: groups
) {
109 printGroupPlainText(writer
, group
, detailed
);
114 private record JsonGroup(
120 int messageExpirationTime
,
121 Set
<JsonGroupMember
> members
,
122 Set
<JsonGroupMember
> pendingMembers
,
123 Set
<JsonGroupMember
> requestingMembers
,
124 Set
<JsonGroupMember
> admins
,
125 String permissionAddMember
,
126 String permissionEditDetails
,
127 String permissionSendMessage
,
128 String groupInviteLink
131 private record JsonGroupMember(String number
, String uuid
) {}