From: AsamK Date: Sat, 15 May 2021 12:16:48 +0000 (+0200) Subject: Implement setting expiration timer for groups X-Git-Tag: v0.8.4~35 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/7170a68571f2d612f908e5293c15850ba726f35d?ds=inline Implement setting expiration timer for groups --- 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 03f4e8e9..28e06bbe 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -836,7 +836,8 @@ public class Manager implements Closeable { List 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> updateGroup( @@ -860,7 +862,8 @@ public class Manager implements Closeable { final Set 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> updateGroupV1( @@ -939,7 +948,8 @@ public class Manager implements Closeable { final Set removeAdmins, final boolean resetGroupLink, final GroupLinkState groupLinkState, - final File avatarFile + final File avatarFile, + Integer expirationTimer ) throws IOException { Pair> 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); } /** 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 a72c158d..b8e7566f 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 @@ -369,6 +369,14 @@ public class GroupV2Helper { return commitChange(groupInfoV2, change); } + public Pair 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: diff --git a/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java b/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java index 64485f6d..5a660650 100644 --- a/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java +++ b/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java @@ -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.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) { diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 834f0d23..6ecf2aba 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -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; }