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