From 4709cfacc798f72b3db018ac0456395949923fa5 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 11 Apr 2026 11:55:59 +0200 Subject: [PATCH] Update multiple member roles in one change Fixes #2009 --- .../signal/manager/helper/GroupHelper.java | 16 ++++------------ .../signal/manager/helper/GroupV2Helper.java | 19 +++++++++++++------ 2 files changed, 17 insertions(+), 18 deletions(-) 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 cd4dba84..b8337f69 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 @@ -768,12 +768,8 @@ public class GroupHelper { newAdmins.retainAll(group.getMemberRecipientIds()); newAdmins.removeAll(group.getAdminMemberRecipientIds()); if (!newAdmins.isEmpty()) { - for (var admin : newAdmins) { - var groupGroupChangePair = groupV2Helper.setMemberAdmin(group, admin, true); - result = sendUpdateGroupV2Message(group, - groupGroupChangePair.first(), - groupGroupChangePair.second()); - } + var groupGroupChangePair = groupV2Helper.setMemberAdmin(group, newAdmins, true); + result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second()); } } @@ -781,12 +777,8 @@ public class GroupHelper { final var existingRemoveAdmins = new HashSet<>(removeAdmins); existingRemoveAdmins.retainAll(group.getAdminMemberRecipientIds()); if (!existingRemoveAdmins.isEmpty()) { - for (var admin : existingRemoveAdmins) { - var groupGroupChangePair = groupV2Helper.setMemberAdmin(group, admin, false); - result = sendUpdateGroupV2Message(group, - groupGroupChangePair.first(), - groupGroupChangePair.second()); - } + var groupGroupChangePair = groupV2Helper.setMemberAdmin(group, existingRemoveAdmins, false); + result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second()); } } diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java b/lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java index 437ddb67..e2bc2a82 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java @@ -501,18 +501,25 @@ class GroupV2Helper { Pair setMemberAdmin( GroupInfoV2 groupInfoV2, - RecipientId recipientId, + Set recipientIds, boolean admin ) throws IOException { final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); - final var address = context.getRecipientHelper().resolveSignalServiceAddress(recipientId); final var newRole = admin ? Member.Role.ADMINISTRATOR : Member.Role.DEFAULT; - if (address.getServiceId() instanceof ACI aci) { - final var change = groupOperations.createChangeMemberRole(aci, newRole); - return commitChange(groupInfoV2, change); - } else { + final var change = new GroupChange.Actions.Builder(); + final var memberRoles = recipientIds.stream() + .map(context.getRecipientHelper()::resolveSignalServiceAddress) + .map(SignalServiceAddress::getServiceId) + .filter(m -> m instanceof ACI) + .map(m -> (ACI) m) + .map(aci -> new GroupChange.Actions.ModifyMemberRoleAction.Builder().userId(groupOperations.encryptServiceId( + aci)).role(newRole).build()) + .toList(); + if (memberRoles.size() < recipientIds.size()) { throw new IllegalArgumentException("Can't make a PNI a group admin."); } + change.modifyMemberRoles(memberRoles); + return commitChange(groupInfoV2, change); } Pair setMessageExpirationTimer(