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