]> nmode's Git Repositories - signal-cli/commitdiff
Implement announcement groups
authorAsamK <asamk@gmx.de>
Sun, 22 Aug 2021 07:55:53 +0000 (09:55 +0200)
committerAsamK <asamk@gmx.de>
Sun, 22 Aug 2021 07:55:53 +0000 (09:55 +0200)
lib/src/main/java/org/asamk/signal/manager/Manager.java
lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java
man/signal-cli.1.adoc
src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java
src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java

index e2306dece3cc73ad69ab0832bc60810339f0533a..e4342f9a30b29b59870e9c867b2354ca4b96893d 100644 (file)
@@ -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<Long, List<SendMessageResult>> 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<Long, List<SendMessageResult>> 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) {
index 206994f56f50501ae8e752c4d7c6d45744636527..e161673e45195f6c113b82612dee977409a76565 100644 (file)
@@ -407,6 +407,14 @@ public class GroupV2Helper {
         return commitChange(groupInfoV2, change);
     }
 
+    public Pair<DecryptedGroup, GroupChange> 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:
index 0e3789e54005e51d84dff65fac266deca238eeea..3df9198b881e3f51b8d8655bc75c77b2865b172f 100644 (file)
@@ -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.
index 397d1fe37d90be94f73fd3e958d590bd42bda515..00da38d45467de6f911b4dc615414b6ea7c457b2 100644 (file)
@@ -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();
index b88aa81e9bedb6087cb5ddd4d059f26a22638d2e..a214ef882a817f2d0f1210dbac6f80f729a06efe 100644 (file)
@@ -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());