diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java index 0c15ceff3..7cc9fef8f 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java @@ -79,6 +79,12 @@ public GroupInfo getGroup(GroupId groupId) { return getGroup(groupId, false); } + public List getGroups() { + final var groups = account.getGroupStore().getGroups(); + groups.forEach(group -> fillOrUpdateGroup(group, false)); + return groups; + } + public boolean isGroupBlocked(final GroupId groupId) { var group = getGroup(groupId); return group != null && group.isBlocked(); @@ -382,34 +388,46 @@ public SendGroupMessageResults sendGroupInfoMessage( private GroupInfo getGroup(GroupId groupId, boolean forceUpdate) { final var group = account.getGroupStore().getGroup(groupId); - if (group instanceof GroupInfoV2 groupInfoV2) { - if (forceUpdate || (!groupInfoV2.isPermissionDenied() && groupInfoV2.getGroup() == null)) { - final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey()); - DecryptedGroup decryptedGroup; - try { - decryptedGroup = context.getGroupV2Helper().getDecryptedGroup(groupSecretParams); - } catch (NotAGroupMemberException e) { - groupInfoV2.setPermissionDenied(true); - decryptedGroup = null; - } - if (decryptedGroup != null) { - try { - storeProfileKeysFromHistory(groupSecretParams, groupInfoV2, decryptedGroup); - } catch (NotAGroupMemberException ignored) { - } - storeProfileKeysFromMembers(decryptedGroup); - final var avatar = decryptedGroup.avatar; - if (!avatar.isEmpty()) { - downloadGroupAvatar(groupInfoV2.getGroupId(), groupSecretParams, avatar); - } - } - groupInfoV2.setGroup(decryptedGroup); - account.getGroupStore().updateGroup(group); - } - } + fillOrUpdateGroup(group, forceUpdate); return group; } + private void fillOrUpdateGroup(final GroupInfo group, final boolean forceUpdate) { + if (!(group instanceof GroupInfoV2 groupInfoV2)) { + return; + } + + if (!forceUpdate && (groupInfoV2.isPermissionDenied() || groupInfoV2.getGroup() != null)) { + return; + } + + final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey()); + DecryptedGroup decryptedGroup; + try { + decryptedGroup = context.getGroupV2Helper().getDecryptedGroup(groupSecretParams); + } catch (NotAGroupMemberException e) { + groupInfoV2.setPermissionDenied(true); + account.getGroupStore().updateGroup(group); + return; + } + + if (decryptedGroup == null) { + return; + } + + try { + storeProfileKeysFromHistory(groupSecretParams, groupInfoV2, decryptedGroup); + } catch (NotAGroupMemberException ignored) { + } + storeProfileKeysFromMembers(decryptedGroup); + final var avatar = decryptedGroup.avatar; + if (!avatar.isEmpty()) { + downloadGroupAvatar(groupInfoV2.getGroupId(), groupSecretParams, avatar); + } + groupInfoV2.setGroup(decryptedGroup); + account.getGroupStore().updateGroup(group); + } + private void downloadGroupAvatar(GroupIdV2 groupId, GroupSecretParams groupSecretParams, String cdnKey) { try { context.getAvatarStore() diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/SendHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/SendHelper.java index a066c8510..0ff7fd89c 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/SendHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/SendHelper.java @@ -261,7 +261,7 @@ public SendMessageResult resendMessage( } final var groupId = messageSendLogEntry.groupId().get(); - final var group = account.getGroupStore().getGroup(groupId); + final var group = context.getGroupHelper().getGroup(groupId); if (group == null) { logger.debug("Could not find a matching group for the groupId {}! Skipping message send.", diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java index c21a150e4..13785a949 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java @@ -511,7 +511,7 @@ void refreshPreKeys() throws IOException { @Override public List getGroups() { - return account.getGroupStore().getGroups().stream().map(this::toGroup).toList(); + return context.getGroupHelper().getGroups().stream().map(this::toGroup).toList(); } private Group toGroup(final GroupInfo groupInfo) {