From 610e32aa52ffd71ce66ee313b559e5ab57fd12fa Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 22 Aug 2021 09:55:53 +0200 Subject: [PATCH] Implement announcement groups --- .../org/asamk/signal/manager/Manager.java | 23 ++++++++++++++----- .../signal/manager/helper/GroupV2Helper.java | 8 +++++++ man/signal-cli.1.adoc | 4 ++++ .../signal/commands/UpdateGroupCommand.java | 9 +++++++- .../org/asamk/signal/dbus/DbusSignalImpl.java | 1 + 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index e2306dec..e4342f9a 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -809,7 +809,8 @@ public class Manager implements Closeable { GroupPermission addMemberPermission, GroupPermission editDetailsPermission, File avatarFile, - Integer expirationTimer + Integer expirationTimer, + Boolean isAnnouncementGroup ) throws IOException, GroupNotFoundException, AttachmentInvalidException, InvalidNumberException, NotAGroupMemberException { return updateGroup(groupId, name, @@ -823,7 +824,8 @@ public class Manager implements Closeable { addMemberPermission, editDetailsPermission, avatarFile, - expirationTimer); + expirationTimer, + isAnnouncementGroup); } private Pair> updateGroup( @@ -839,7 +841,8 @@ public class Manager implements Closeable { final GroupPermission addMemberPermission, final GroupPermission editDetailsPermission, final File avatarFile, - final Integer expirationTimer + final Integer expirationTimer, + final Boolean isAnnouncementGroup ) throws IOException, GroupNotFoundException, AttachmentInvalidException, NotAGroupMemberException { var group = getGroupForUpdating(groupId); @@ -857,7 +860,8 @@ public class Manager implements Closeable { addMemberPermission, editDetailsPermission, avatarFile, - expirationTimer); + expirationTimer, + isAnnouncementGroup); } catch (ConflictException e) { // Detected conflicting update, refreshing group and trying again group = getGroup(groupId, true); @@ -873,7 +877,8 @@ public class Manager implements Closeable { addMemberPermission, editDetailsPermission, avatarFile, - expirationTimer); + expirationTimer, + isAnnouncementGroup); } } @@ -948,7 +953,8 @@ public class Manager implements Closeable { final GroupPermission addMemberPermission, final GroupPermission editDetailsPermission, final File avatarFile, - Integer expirationTimer + final Integer expirationTimer, + final Boolean isAnnouncementGroup ) throws IOException { Pair> result = null; if (group.isPendingMember(account.getSelfRecipientId())) { @@ -1034,6 +1040,11 @@ public class Manager implements Closeable { result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second()); } + if (isAnnouncementGroup != null) { + var groupGroupChangePair = groupV2Helper.setIsAnnouncementGroup(group, isAnnouncementGroup); + result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second()); + } + if (name != null || description != null || avatarFile != null) { var groupGroupChangePair = groupV2Helper.updateGroup(group, name, description, avatarFile); if (avatarFile != null) { 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 206994f5..e161673e 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 @@ -407,6 +407,14 @@ public class GroupV2Helper { return commitChange(groupInfoV2, change); } + public Pair setIsAnnouncementGroup( + GroupInfoV2 groupInfoV2, boolean isAnnouncementGroup + ) throws IOException { + final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); + final var change = groupOperations.createAnnouncementGroupChange(isAnnouncementGroup); + return commitChange(groupInfoV2, change); + } + private AccessControl.AccessRequired toAccessControl(final GroupLinkState state) { switch (state) { case DISABLED: diff --git a/man/signal-cli.1.adoc b/man/signal-cli.1.adoc index 0e3789e5..3df9198b 100644 --- a/man/signal-cli.1.adoc +++ b/man/signal-cli.1.adoc @@ -287,6 +287,10 @@ Set permission to add new group members: `every-member`, `only-admins` *--set-permission-edit-details* PERMISSION:: Set permission to edit group details: `every-member`, `only-admins` +*--set-permission-send-messages* PERMISSION:: +Set permission to send messages in group: `every-member`, `only-admins` +Groups where only admins can send messages are also called announcement groups + *-e* EXPIRATION_SECONDS, *--expiration* EXPIRATION_SECONDS:: Set expiration time of messages (seconds). To disable expiration set expiration time to 0. diff --git a/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java b/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java index 397d1fe3..00da38d4 100644 --- a/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java +++ b/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java @@ -70,6 +70,9 @@ public class UpdateGroupCommand implements DbusCommand, JsonRpcLocalCommand { subparser.addArgument("--set-permission-edit-details") .help("Set permission to edit group details") .choices("every-member", "only-admins"); + subparser.addArgument("--set-permission-send-messages") + .help("Set permission to send messages") + .choices("every-member", "only-admins"); subparser.addArgument("-e", "--expiration").type(int.class).help("Set expiration time of messages (seconds)"); } @@ -133,6 +136,7 @@ public class UpdateGroupCommand implements DbusCommand, JsonRpcLocalCommand { var groupExpiration = ns.getInt("expiration"); var groupAddMemberPermission = getGroupPermission(ns.getString("set-permission-add-member")); var groupEditDetailsPermission = getGroupPermission(ns.getString("set-permission-edit-details")); + var groupSendMessagesPermission = getGroupPermission(ns.getString("set-permission-send-messages")); try { boolean isNewGroup = false; @@ -160,7 +164,10 @@ public class UpdateGroupCommand implements DbusCommand, JsonRpcLocalCommand { groupAddMemberPermission, groupEditDetailsPermission, groupAvatar == null ? null : new File(groupAvatar), - groupExpiration); + groupExpiration, + groupSendMessagesPermission == null + ? null + : groupSendMessagesPermission == GroupPermission.ONLY_ADMINS); Long timestamp = null; if (results != null) { timestamp = results.first(); diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index b88aa81e..a214ef88 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -358,6 +358,7 @@ public class DbusSignalImpl implements Signal { null, null, avatar == null ? null : new File(avatar), + null, null); if (results != null) { checkSendMessageResults(results.first(), results.second()); -- 2.50.1