From 53b84bad0280694a19e47d6f76620f8a140fdd15 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 13 Nov 2021 22:54:59 +0100 Subject: [PATCH] Implement sending mentions Closes #584 --- .../org/asamk/signal/manager/ManagerImpl.java | 10 +++++++ .../org/asamk/signal/manager/api/Message.java | 5 +++- man/signal-cli.1.adoc | 5 ++++ .../asamk/signal/commands/SendCommand.java | 26 ++++++++++++++++++- .../org/asamk/signal/dbus/DbusSignalImpl.java | 6 ++--- 5 files changed, 47 insertions(+), 5 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java index df4820cc..81c18683 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java @@ -683,6 +683,16 @@ public class ManagerImpl implements Manager { if (attachments != null) { messageBuilder.withAttachments(attachmentHelper.uploadAttachments(attachments)); } + if (message.mentions().size() > 0) { + final var mentions = new ArrayList(); + for (final var m : message.mentions()) { + final var recipientId = resolveRecipient(m.recipient()); + mentions.add(new SignalServiceDataMessage.Mention(resolveSignalServiceAddress(recipientId).getAci(), + m.start(), + m.length())); + } + messageBuilder.withMentions(mentions); + } } @Override diff --git a/lib/src/main/java/org/asamk/signal/manager/api/Message.java b/lib/src/main/java/org/asamk/signal/manager/api/Message.java index 83666003..5d0c78f8 100644 --- a/lib/src/main/java/org/asamk/signal/manager/api/Message.java +++ b/lib/src/main/java/org/asamk/signal/manager/api/Message.java @@ -2,4 +2,7 @@ package org.asamk.signal.manager.api; import java.util.List; -public record Message(String messageText, List attachments) {} +public record Message(String messageText, List attachments, List mentions) { + + public record Mention(RecipientIdentifier.Single recipient, int start, int length) {} +} diff --git a/man/signal-cli.1.adoc b/man/signal-cli.1.adoc index 8eb0f0c2..c5b190eb 100644 --- a/man/signal-cli.1.adoc +++ b/man/signal-cli.1.adoc @@ -205,6 +205,11 @@ Send the message to self without notification. *-e*, *--end-session*:: Clear session state and send end session message. +*--mention*:: +Mention another group member (syntax: start:length:recipientNumber) +In the apps the mention replaces part of the message text, which is specified by the start and length values. +e.g.: `-m "Hi X!" --mention "3:1:+123456789"` + === sendReaction Send reaction to a previously received or sent message. diff --git a/src/main/java/org/asamk/signal/commands/SendCommand.java b/src/main/java/org/asamk/signal/commands/SendCommand.java index e22d307b..8d863d54 100644 --- a/src/main/java/org/asamk/signal/commands/SendCommand.java +++ b/src/main/java/org/asamk/signal/commands/SendCommand.java @@ -25,8 +25,10 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.regex.Pattern; import java.util.stream.Collectors; public class SendCommand implements JsonRpcLocalCommand { @@ -52,6 +54,9 @@ public class SendCommand implements JsonRpcLocalCommand { subparser.addArgument("-e", "--end-session", "--endsession") .help("Clear session state and send end session message.") .action(Arguments.storeTrue()); + subparser.addArgument("--mention") + .nargs("*") + .help("Mention another group member (syntax: start:length:recipientNumber)"); } @Override @@ -100,8 +105,27 @@ public class SendCommand implements JsonRpcLocalCommand { attachments = List.of(); } + List mentionStrings = ns.getList("mention"); + List mentions; + if (mentionStrings == null) { + mentions = List.of(); + } else { + final Pattern mentionPattern = Pattern.compile("([0-9]+):([0-9]+):(.+)"); + mentions = new ArrayList<>(); + for (final var mention : mentionStrings) { + final var matcher = mentionPattern.matcher(mention); + if (!matcher.matches()) { + throw new UserErrorException("Invalid mention syntax (" + + mention + + ") expected 'start:end:recipientNumber'"); + } + mentions.add(new Message.Mention(CommandUtil.getSingleRecipientIdentifier(matcher.group(3), + m.getSelfNumber()), Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)))); + } + } + try { - var results = m.sendMessage(new Message(messageText, attachments), recipientIdentifiers); + var results = m.sendMessage(new Message(messageText, attachments, mentions), recipientIdentifiers); outputResult(outputWriter, results.timestamp()); ErrorUtils.handleSendMessageResults(results.results()); } catch (AttachmentInvalidException | IOException e) { diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 8f6d0aa4..812110b3 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -201,7 +201,7 @@ public class DbusSignalImpl implements Signal { @Override public long sendMessage(final String message, final List attachments, final List recipients) { try { - final var results = m.sendMessage(new Message(message, attachments), + final var results = m.sendMessage(new Message(message, attachments, List.of()), getSingleRecipientIdentifiers(recipients, m.getSelfNumber()).stream() .map(RecipientIdentifier.class::cast) .collect(Collectors.toSet())); @@ -367,7 +367,7 @@ public class DbusSignalImpl implements Signal { final String message, final List attachments ) throws Error.AttachmentInvalid, Error.Failure, Error.UntrustedIdentity { try { - final var results = m.sendMessage(new Message(message, attachments), + final var results = m.sendMessage(new Message(message, attachments, List.of()), Set.of(RecipientIdentifier.NoteToSelf.INSTANCE)); checkSendMessageResults(results.timestamp(), results.results()); return results.timestamp(); @@ -393,7 +393,7 @@ public class DbusSignalImpl implements Signal { @Override public long sendGroupMessage(final String message, final List attachments, final byte[] groupId) { try { - var results = m.sendMessage(new Message(message, attachments), + var results = m.sendMessage(new Message(message, attachments, List.of()), Set.of(new RecipientIdentifier.Group(getGroupId(groupId)))); checkSendMessageResults(results.timestamp(), results.results()); return results.timestamp(); -- 2.50.1