]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java
b37e50a969943c9836fa09cc30e412cf979dd3fb
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / storage / groups / GroupInfoV2.java
1 package org.asamk.signal.manager.storage.groups;
2
3 import org.asamk.signal.manager.groups.GroupIdV2;
4 import org.asamk.signal.manager.groups.GroupInviteLinkUrl;
5 import org.asamk.signal.manager.storage.recipients.RecipientId;
6 import org.asamk.signal.manager.storage.recipients.RecipientResolver;
7 import org.signal.storageservice.protos.groups.AccessControl;
8 import org.signal.storageservice.protos.groups.local.DecryptedGroup;
9 import org.signal.zkgroup.groups.GroupMasterKey;
10 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
11 import org.whispersystems.signalservice.api.util.UuidUtil;
12
13 import java.util.Set;
14 import java.util.stream.Collectors;
15
16 public class GroupInfoV2 extends GroupInfo {
17
18 private final GroupIdV2 groupId;
19 private final GroupMasterKey masterKey;
20
21 private boolean blocked;
22 private DecryptedGroup group; // stored as a file with hexadecimal groupId as name
23 private RecipientResolver recipientResolver;
24
25 public GroupInfoV2(final GroupIdV2 groupId, final GroupMasterKey masterKey) {
26 this.groupId = groupId;
27 this.masterKey = masterKey;
28 }
29
30 public GroupInfoV2(final GroupIdV2 groupId, final GroupMasterKey masterKey, final boolean blocked) {
31 this.groupId = groupId;
32 this.masterKey = masterKey;
33 this.blocked = blocked;
34 }
35
36 @Override
37 public GroupIdV2 getGroupId() {
38 return groupId;
39 }
40
41 public GroupMasterKey getMasterKey() {
42 return masterKey;
43 }
44
45 public void setGroup(final DecryptedGroup group, final RecipientResolver recipientResolver) {
46 this.group = group;
47 this.recipientResolver = recipientResolver;
48 }
49
50 public DecryptedGroup getGroup() {
51 return group;
52 }
53
54 @Override
55 public String getTitle() {
56 if (this.group == null) {
57 return null;
58 }
59 return this.group.getTitle();
60 }
61
62 @Override
63 public GroupInviteLinkUrl getGroupInviteLink() {
64 if (this.group == null || this.group.getInviteLinkPassword() == null || (
65 this.group.getAccessControl().getAddFromInviteLink() != AccessControl.AccessRequired.ANY
66 && this.group.getAccessControl().getAddFromInviteLink()
67 != AccessControl.AccessRequired.ADMINISTRATOR
68 )) {
69 return null;
70 }
71
72 return GroupInviteLinkUrl.forGroup(masterKey, group);
73 }
74
75 @Override
76 public Set<RecipientId> getMembers() {
77 if (this.group == null) {
78 return Set.of();
79 }
80 return group.getMembersList()
81 .stream()
82 .map(m -> new SignalServiceAddress(UuidUtil.parseOrThrow(m.getUuid().toByteArray()), null))
83 .map(recipientResolver::resolveRecipient)
84 .collect(Collectors.toSet());
85 }
86
87 @Override
88 public Set<RecipientId> getPendingMembers() {
89 if (this.group == null) {
90 return Set.of();
91 }
92 return group.getPendingMembersList()
93 .stream()
94 .map(m -> new SignalServiceAddress(UuidUtil.parseOrThrow(m.getUuid().toByteArray()), null))
95 .map(recipientResolver::resolveRecipient)
96 .collect(Collectors.toSet());
97 }
98
99 @Override
100 public Set<RecipientId> getRequestingMembers() {
101 if (this.group == null) {
102 return Set.of();
103 }
104 return group.getRequestingMembersList()
105 .stream()
106 .map(m -> new SignalServiceAddress(UuidUtil.parseOrThrow(m.getUuid().toByteArray()), null))
107 .map(recipientResolver::resolveRecipient)
108 .collect(Collectors.toSet());
109 }
110
111 @Override
112 public boolean isBlocked() {
113 return blocked;
114 }
115
116 @Override
117 public void setBlocked(final boolean blocked) {
118 this.blocked = blocked;
119 }
120
121 @Override
122 public int getMessageExpirationTime() {
123 return this.group != null && this.group.hasDisappearingMessagesTimer()
124 ? this.group.getDisappearingMessagesTimer().getDuration()
125 : 0;
126 }
127 }