]> nmode's Git Repositories - signal-cli/commitdiff
Implement sending mentions
authorAsamK <asamk@gmx.de>
Sat, 13 Nov 2021 21:54:59 +0000 (22:54 +0100)
committerAsamK <asamk@gmx.de>
Sat, 13 Nov 2021 21:54:59 +0000 (22:54 +0100)
Closes #584

lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/api/Message.java
man/signal-cli.1.adoc
src/main/java/org/asamk/signal/commands/SendCommand.java
src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java

index df4820cc24e04401d10183393788f605f2dd0b8a..81c18683acf8256e2e9dfc93c81c8f48ec429d5c 100644 (file)
@@ -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<SignalServiceDataMessage.Mention>();
+            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
index 8366600352ebaa60004bd138e9bb57c57403fb1f..5d0c78f80c8b27b38048a9b611569ba206582814 100644 (file)
@@ -2,4 +2,7 @@ package org.asamk.signal.manager.api;
 
 import java.util.List;
 
-public record Message(String messageText, List<String> attachments) {}
+public record Message(String messageText, List<String> attachments, List<Mention> mentions) {
+
+    public record Mention(RecipientIdentifier.Single recipient, int start, int length) {}
+}
index 8eb0f0c21082d211ddea3b33da7cb5030ca7f321..c5b190eb09a4273f1892dce19faa53239d06ce1f 100644 (file)
@@ -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.
index e22d307b7f3c4ad239d77fdfa3bd4b76c7ee1bde..8d863d5468c1857ff3a52e52fc347249401d514c 100644 (file)
@@ -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<String> mentionStrings = ns.getList("mention");
+        List<Message.Mention> 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) {
index 8f6d0aa4575d9c146bf97b78286aa532cd3cb8b1..812110b31bdf2fb11ae656ce53e400990db3d21c 100644 (file)
@@ -201,7 +201,7 @@ public class DbusSignalImpl implements Signal {
     @Override
     public long sendMessage(final String message, final List<String> attachments, final List<String> 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<String> 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<String> 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();