]> nmode's Git Repositories - signal-cli/commitdiff
Implement setting expiration timer for groups
authorAsamK <asamk@gmx.de>
Sat, 15 May 2021 12:16:48 +0000 (14:16 +0200)
committerAsamK <asamk@gmx.de>
Sat, 15 May 2021 15:04:22 +0000 (17:04 +0200)
lib/src/main/java/org/asamk/signal/manager/Manager.java
lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java
src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java
src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java

index 03f4e8e9c71b8f82e6d99719c38186ab175a680d..28e06bbe0ec6c182776c50fba55fa403f35450ea 100644 (file)
@@ -836,7 +836,8 @@ public class Manager implements Closeable {
             List<String> removeAdmins,
             boolean resetGroupLink,
             GroupLinkState groupLinkState,
-            File avatarFile
+            File avatarFile,
+            Integer expirationTimer
     ) throws IOException, GroupNotFoundException, AttachmentInvalidException, InvalidNumberException, NotAGroupMemberException {
         return updateGroup(groupId,
                 name,
@@ -847,7 +848,8 @@ public class Manager implements Closeable {
                 removeAdmins == null ? null : getSignalServiceAddresses(removeAdmins),
                 resetGroupLink,
                 groupLinkState,
-                avatarFile);
+                avatarFile,
+                expirationTimer);
     }
 
     private Pair<Long, List<SendMessageResult>> updateGroup(
@@ -860,7 +862,8 @@ public class Manager implements Closeable {
             final Set<RecipientId> removeAdmins,
             final boolean resetGroupLink,
             final GroupLinkState groupLinkState,
-            final File avatarFile
+            final File avatarFile,
+            Integer expirationTimer
     ) throws IOException, GroupNotFoundException, AttachmentInvalidException, NotAGroupMemberException {
         var group = getGroupForUpdating(groupId);
 
@@ -874,10 +877,16 @@ public class Manager implements Closeable {
                     removeAdmins,
                     resetGroupLink,
                     groupLinkState,
-                    avatarFile);
+                    avatarFile,
+                    expirationTimer);
         }
 
-        return updateGroupV1((GroupInfoV1) group, name, members, avatarFile);
+        final var gv1 = (GroupInfoV1) group;
+        final var result = updateGroupV1(gv1, name, members, avatarFile);
+        if (expirationTimer != null) {
+            setExpirationTimer(gv1, expirationTimer);
+        }
+        return result;
     }
 
     private Pair<Long, List<SendMessageResult>> updateGroupV1(
@@ -939,7 +948,8 @@ public class Manager implements Closeable {
             final Set<RecipientId> removeAdmins,
             final boolean resetGroupLink,
             final GroupLinkState groupLinkState,
-            final File avatarFile
+            final File avatarFile,
+            Integer expirationTimer
     ) throws IOException {
         Pair<Long, List<SendMessageResult>> result = null;
         if (group.isPendingMember(account.getSelfRecipientId())) {
@@ -1010,6 +1020,11 @@ public class Manager implements Closeable {
             result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second());
         }
 
+        if (expirationTimer != null) {
+            var groupGroupChangePair = groupV2Helper.setMessageExpirationTimer(group, expirationTimer);
+            result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second());
+        }
+
         if (result == null || name != null || description != null || avatarFile != null) {
             var groupGroupChangePair = groupV2Helper.updateGroup(group, name, description, avatarFile);
             if (avatarFile != null) {
@@ -1306,15 +1321,17 @@ public class Manager implements Closeable {
     /**
      * Change the expiration timer for a group
      */
-    public void setExpirationTimer(GroupId groupId, int messageExpirationTimer) {
-        var g = getGroup(groupId);
-        if (g instanceof GroupInfoV1) {
-            var groupInfoV1 = (GroupInfoV1) g;
-            groupInfoV1.messageExpirationTime = messageExpirationTimer;
-            account.getGroupStore().updateGroup(groupInfoV1);
-        } else {
-            throw new RuntimeException("TODO Not implemented!");
-        }
+    private void setExpirationTimer(
+            GroupInfoV1 groupInfoV1, int messageExpirationTimer
+    ) throws NotAGroupMemberException, GroupNotFoundException, IOException {
+        groupInfoV1.messageExpirationTime = messageExpirationTimer;
+        account.getGroupStore().updateGroup(groupInfoV1);
+        sendExpirationTimerUpdate(groupInfoV1.getGroupId());
+    }
+
+    private void sendExpirationTimerUpdate(GroupIdV1 groupId) throws IOException, NotAGroupMemberException, GroupNotFoundException {
+        final var messageBuilder = SignalServiceDataMessage.newBuilder().asExpirationUpdate();
+        sendGroupMessage(messageBuilder, groupId);
     }
 
     /**
index a72c158d9284ef72d53f47fb5544ef888aefd8a7..b8e7566f28c3287ac67aff06e191cf0e9a6bbe66 100644 (file)
@@ -369,6 +369,14 @@ public class GroupV2Helper {
         return commitChange(groupInfoV2, change);
     }
 
+    public Pair<DecryptedGroup, GroupChange> setMessageExpirationTimer(
+            GroupInfoV2 groupInfoV2, int messageExpirationTimer
+    ) throws IOException {
+        final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
+        final var change = groupOperations.createModifyGroupTimerChange(messageExpirationTimer);
+        return commitChange(groupInfoV2, change);
+    }
+
     private AccessControl.AccessRequired toAccessControl(final GroupLinkState state) {
         switch (state) {
             case DISABLED:
index 64485f6d2427b0f19a588d9f555eee156ee01ff2..5a6606504b060d95b2a5e009052d924545e67dda 100644 (file)
@@ -54,6 +54,8 @@ public class UpdateGroupCommand implements DbusCommand, LocalCommand {
         subparser.addArgument("--link")
                 .help("Set group link state, with or without admin approval")
                 .type(Arguments.enumStringType(GroupLinkState.class));
+
+        subparser.addArgument("-e", "--expiration").type(int.class).help("Set expiration time of messages (seconds)");
     }
 
     @Override
@@ -87,6 +89,8 @@ public class UpdateGroupCommand implements DbusCommand, LocalCommand {
 
         var groupLinkState = ns.<GroupLinkState>get("link");
 
+        var groupExpiration = ns.getInt("expiration");
+
         try {
             if (groupId == null) {
                 var results = m.createGroup(groupName,
@@ -105,7 +109,8 @@ public class UpdateGroupCommand implements DbusCommand, LocalCommand {
                         groupRemoveAdmins,
                         groupResetLink,
                         groupLinkState != null ? groupLinkState.toLinkState() : null,
-                        groupAvatar == null ? null : new File(groupAvatar));
+                        groupAvatar == null ? null : new File(groupAvatar),
+                        groupExpiration);
                 ErrorUtils.handleTimestampAndSendMessageResults(writer, results.first(), results.second());
             }
         } catch (AttachmentInvalidException e) {
index 834f0d2354e494db7ae89f6d1d8f46b387184a9f..6ecf2abaa19b8523b8b17414faec727b5f1a6eac 100644 (file)
@@ -349,7 +349,8 @@ public class DbusSignalImpl implements Signal {
                         null,
                         false,
                         null,
-                        avatar == null ? null : new File(avatar));
+                        avatar == null ? null : new File(avatar),
+                        null);
                 checkSendMessageResults(results.first(), results.second());
                 return groupId;
             }