From: AsamK Date: Thu, 13 May 2021 18:05:46 +0000 (+0200) Subject: Add group descriptions X-Git-Tag: v0.8.4~41 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/dd0effc10c1c91675fdbc6c24937979c0e868752 Add group descriptions --- 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 096f1c07..39e6d8ce 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -783,17 +783,17 @@ public class Manager implements Closeable { } public Pair> updateGroup( - GroupId groupId, String name, List members, File avatarFile + GroupId groupId, String name, String description, List members, File avatarFile ) throws IOException, GroupNotFoundException, AttachmentInvalidException, InvalidNumberException, NotAGroupMemberException { final var membersRecipientIds = members == null ? null : getSignalServiceAddresses(members); if (membersRecipientIds != null) { membersRecipientIds.remove(account.getSelfRecipientId()); } - return sendUpdateGroupMessage(groupId, name, membersRecipientIds, avatarFile); + return sendUpdateGroupMessage(groupId, name, description, membersRecipientIds, avatarFile); } private Pair> sendUpdateGroupMessage( - GroupId groupId, String name, Set members, File avatarFile + GroupId groupId, String name, String description, Set members, File avatarFile ) throws IOException, GroupNotFoundException, AttachmentInvalidException, NotAGroupMemberException { GroupInfo g; SignalServiceDataMessage.Builder messageBuilder; @@ -809,6 +809,7 @@ public class Manager implements Closeable { messageBuilder = getGroupUpdateMessageBuilder(gv1); g = gv1; } else { + // TODO set description as well final var gv2 = gv2Pair.first(); final var decryptedGroup = gv2Pair.second(); @@ -843,8 +844,8 @@ public class Manager implements Closeable { groupGroupChangePair.second()); } } - if (result == null || name != null || avatarFile != null) { - var groupGroupChangePair = groupHelper.updateGroupV2(groupInfoV2, name, avatarFile); + if (result == null || name != null || description != null || avatarFile != null) { + var groupGroupChangePair = groupHelper.updateGroupV2(groupInfoV2, name, description, avatarFile); if (avatarFile != null) { avatarStore.storeGroupAvatar(groupInfoV2.getGroupId(), outputStream -> IOUtils.copyFileToStream(avatarFile, outputStream)); 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 6abdff07..0bf4069e 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 @@ -196,13 +196,17 @@ public class GroupHelper { } public Pair updateGroupV2( - GroupInfoV2 groupInfoV2, String name, File avatarFile + GroupInfoV2 groupInfoV2, String name, String description, File avatarFile ) throws IOException { final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey()); var groupOperations = groupsV2Operations.forGroup(groupSecretParams); var change = name != null ? groupOperations.createModifyGroupTitle(name) : GroupChange.Actions.newBuilder(); + if (description != null) { + change.setModifyDescription(groupOperations.createModifyGroupDescription(description)); + } + if (avatarFile != null) { final var avatarBytes = readAvatarBytes(avatarFile); var avatarCdnKey = groupsV2Api.uploadAvatar(avatarBytes, diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfo.java b/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfo.java index 8f9146de..e2aaff4c 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfo.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfo.java @@ -14,6 +14,10 @@ public abstract class GroupInfo { public abstract String getTitle(); + public String getDescription() { + return null; + } + public abstract GroupInviteLinkUrl getGroupInviteLink(); public abstract Set getMembers(); diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java b/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java index b37e50a9..859c7209 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java @@ -59,6 +59,14 @@ public class GroupInfoV2 extends GroupInfo { return this.group.getTitle(); } + @Override + public String getDescription() { + if (this.group == null) { + return null; + } + return this.group.getDescription(); + } + @Override public GroupInviteLinkUrl getGroupInviteLink() { if (this.group == null || this.group.getInviteLinkPassword() == null || ( diff --git a/src/main/java/org/asamk/signal/ReceiveMessageHandler.java b/src/main/java/org/asamk/signal/ReceiveMessageHandler.java index e63ce548..b39fbf22 100644 --- a/src/main/java/org/asamk/signal/ReceiveMessageHandler.java +++ b/src/main/java/org/asamk/signal/ReceiveMessageHandler.java @@ -20,6 +20,7 @@ import org.whispersystems.signalservice.api.messages.shared.SharedContact; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.util.InvalidNumberException; +import java.util.ArrayList; import java.util.Base64; import java.util.stream.Collectors; @@ -285,6 +286,14 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { DateUtils.formatTimestamp(rm.getTimestamp())); } } + if (syncMessage.getViewed().isPresent()) { + writer.println("Received sync viewed messages list"); + for (var vm : syncMessage.getViewed().get()) { + writer.println("- From: {} Message timestamp: {}", + formatContact(vm.getSender()), + DateUtils.formatTimestamp(vm.getTimestamp())); + } + } if (syncMessage.getRequest().isPresent()) { String type; if (syncMessage.getRequest().get().isContactsRequest()) { @@ -643,8 +652,19 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { pointer.getPreview().isPresent() ? " (Preview is available: " + pointer.getPreview().get().length + " bytes)" : ""); - writer.println("Voice note: {}", pointer.getVoiceNote() ? "yes" : "no"); - writer.println("Borderless: {}", pointer.isBorderless() ? "yes" : "no"); + final var flags = new ArrayList(); + if (pointer.getVoiceNote()) { + flags.add("voice note"); + } + if (pointer.isBorderless()) { + flags.add("borderless"); + } + if (pointer.isGif()) { + flags.add("video gif"); + } + if (flags.size() > 0) { + writer.println("Flags: {}", String.join(", ", flags)); + } if (pointer.getWidth() > 0 || pointer.getHeight() > 0) { writer.println("Dimensions: {}x{}", pointer.getWidth(), pointer.getHeight()); } diff --git a/src/main/java/org/asamk/signal/commands/ListGroupsCommand.java b/src/main/java/org/asamk/signal/commands/ListGroupsCommand.java index a3a55608..4886eac4 100644 --- a/src/main/java/org/asamk/signal/commands/ListGroupsCommand.java +++ b/src/main/java/org/asamk/signal/commands/ListGroupsCommand.java @@ -38,9 +38,10 @@ public class ListGroupsCommand implements LocalCommand { final var groupInviteLink = group.getGroupInviteLink(); writer.println( - "Id: {} Name: {} Active: {} Blocked: {} Members: {} Pending members: {} Requesting members: {} Link: {}", + "Id: {} Name: {} Description: {} Active: {} Blocked: {} Members: {} Pending members: {} Requesting members: {} Link: {}", group.getGroupId().toBase64(), group.getTitle(), + group.getDescription(), group.isMember(m.getSelfRecipientId()), group.isBlocked(), resolveMembers(m, group.getMembers()), @@ -81,6 +82,7 @@ public class ListGroupsCommand implements LocalCommand { jsonGroups.add(new JsonGroup(group.getGroupId().toBase64(), group.getTitle(), + group.getDescription(), group.isMember(m.getSelfRecipientId()), group.isBlocked(), resolveMembers(m, group.getMembers()), @@ -103,6 +105,7 @@ public class ListGroupsCommand implements LocalCommand { public String id; public String name; + public String description; public boolean isMember; public boolean isBlocked; @@ -114,6 +117,7 @@ public class ListGroupsCommand implements LocalCommand { public JsonGroup( String id, String name, + String description, boolean isMember, boolean isBlocked, Set members, @@ -123,6 +127,7 @@ public class ListGroupsCommand implements LocalCommand { ) { this.id = id; this.name = name; + this.description = description; this.isMember = isMember; this.isBlocked = isBlocked; diff --git a/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java b/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java index 00730c82..48efde75 100644 --- a/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java +++ b/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java @@ -8,17 +8,26 @@ import org.asamk.signal.PlainTextWriterImpl; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.commands.exceptions.UnexpectedErrorException; import org.asamk.signal.commands.exceptions.UserErrorException; +import org.asamk.signal.manager.AttachmentInvalidException; +import org.asamk.signal.manager.Manager; +import org.asamk.signal.manager.groups.GroupId; import org.asamk.signal.manager.groups.GroupIdFormatException; +import org.asamk.signal.manager.groups.GroupNotFoundException; +import org.asamk.signal.manager.groups.NotAGroupMemberException; +import org.asamk.signal.util.ErrorUtils; import org.asamk.signal.util.Util; import org.freedesktop.dbus.exceptions.DBusExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.whispersystems.signalservice.api.util.InvalidNumberException; +import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Base64; import java.util.List; -public class UpdateGroupCommand implements DbusCommand { +public class UpdateGroupCommand implements DbusCommand, LocalCommand { private final static Logger logger = LoggerFactory.getLogger(UpdateGroupCommand.class); @@ -26,10 +35,56 @@ public class UpdateGroupCommand implements DbusCommand { public void attachToSubparser(final Subparser subparser) { subparser.addArgument("-g", "--group").help("Specify the recipient group ID."); subparser.addArgument("-n", "--name").help("Specify the new group name."); + subparser.addArgument("-d", "--description").help("Specify the new group description."); subparser.addArgument("-a", "--avatar").help("Specify a new group avatar image file"); subparser.addArgument("-m", "--member").nargs("*").help("Specify one or more members to add to the group"); } + @Override + public void handleCommand(final Namespace ns, final Manager m) throws CommandException { + final var writer = new PlainTextWriterImpl(System.out); + GroupId groupId = null; + final var groupIdString = ns.getString("group"); + if (groupIdString != null) { + try { + groupId = Util.decodeGroupId(groupIdString); + } catch (GroupIdFormatException e) { + throw new UserErrorException("Invalid group id:" + e.getMessage()); + } + } + + var groupName = ns.getString("name"); + + var groupDescription = ns.getString("description"); + + List groupMembers = ns.getList("member"); + + var groupAvatar = ns.getString("avatar"); + + try { + var results = m.updateGroup(groupId, + groupName, + groupDescription, + groupMembers, + groupAvatar == null ? null : new File(groupAvatar)); + ErrorUtils.handleTimestampAndSendMessageResults(writer, 0, results.second()); + final var newGroupId = results.first(); + if (groupId == null) { + writer.println("Created new group: \"{}\"", newGroupId.toBase64()); + } + } catch (AttachmentInvalidException e) { + throw new UserErrorException("Failed to add avatar attachment for group\": " + e.getMessage()); + } catch (GroupNotFoundException e) { + logger.warn("Unknown group id: {}", groupIdString); + } catch (NotAGroupMemberException e) { + logger.warn("You're not a group member"); + } catch (InvalidNumberException e) { + throw new UserErrorException("Failed to parse member number: " + e.getMessage()); + } catch (IOException e) { + throw new UnexpectedErrorException("Failed to send message: " + e.getMessage()); + } + } + @Override public void handleCommand(final Namespace ns, final Signal signal) throws CommandException { final var writer = new PlainTextWriterImpl(System.out); diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 325ae7a1..a8ccf3d0 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -337,6 +337,7 @@ public class DbusSignalImpl implements Signal { } final var results = m.updateGroup(groupId == null ? null : GroupId.unknownVersion(groupId), name, + null, members, avatar == null ? null : new File(avatar)); checkSendMessageResults(0, results.second());