]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/commands/SendCommand.java
Add support for sending stickers
[signal-cli] / src / main / java / org / asamk / signal / commands / SendCommand.java
index f73d3e70d3a1d13db17412fd518a9fe857daba4b..74209feb54d8cbb8ec5e74b3d0d206532445f9e5 100644 (file)
@@ -9,16 +9,16 @@ 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.api.InvalidStickerException;
 import org.asamk.signal.manager.api.Message;
 import org.asamk.signal.manager.api.RecipientIdentifier;
+import org.asamk.signal.manager.api.UnregisteredRecipientException;
 import org.asamk.signal.manager.groups.GroupNotFoundException;
 import org.asamk.signal.manager.groups.GroupSendingNotAllowedException;
 import org.asamk.signal.manager.groups.NotAGroupMemberException;
-import org.asamk.signal.output.JsonWriter;
 import org.asamk.signal.output.OutputWriter;
-import org.asamk.signal.output.PlainTextWriter;
 import org.asamk.signal.util.CommandUtil;
-import org.asamk.signal.util.ErrorUtils;
+import org.asamk.signal.util.Hex;
 import org.asamk.signal.util.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -27,11 +27,12 @@ import java.io.IOException;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.Optional;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
+import static org.asamk.signal.util.SendMessageResultUtils.outputResult;
+
 public class SendCommand implements JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(SendCommand.class);
@@ -66,6 +67,7 @@ public class SendCommand implements JsonRpcLocalCommand {
         subparser.addArgument("--quote-mention")
                 .nargs("*")
                 .help("Quote with mention of another group member (syntax: start:length:recipientNumber)");
+        subparser.addArgument("--sticker").help("Send a sticker (syntax: stickerPackId:stickerId)");
     }
 
     @Override
@@ -93,8 +95,7 @@ public class SendCommand implements JsonRpcLocalCommand {
 
             try {
                 final var results = m.sendEndSessionMessage(singleRecipients);
-                outputResult(outputWriter, results.timestamp());
-                ErrorUtils.handleSendMessageResults(results.results());
+                outputResult(outputWriter, results);
                 return;
             } catch (IOException e) {
                 throw new UnexpectedErrorException("Failed to send message: " + e.getMessage() + " (" + e.getClass()
@@ -102,12 +103,20 @@ public class SendCommand implements JsonRpcLocalCommand {
             }
         }
 
+        final var stickerString = ns.getString("sticker");
+        final var sticker = stickerString == null ? null : parseSticker(stickerString);
+
         var messageText = ns.getString("message");
         if (messageText == null) {
-            try {
-                messageText = IOUtils.readAll(System.in, Charset.defaultCharset());
-            } catch (IOException e) {
-                throw new UserErrorException("Failed to read message from stdin: " + e.getMessage());
+            if (sticker != null) {
+                messageText = "";
+            } else {
+                logger.debug("Reading message from stdin...");
+                try {
+                    messageText = IOUtils.readAll(System.in, Charset.defaultCharset());
+                } catch (IOException e) {
+                    throw new UserErrorException("Failed to read message from stdin: " + e.getMessage());
+                }
             }
         }
 
@@ -130,22 +139,28 @@ public class SendCommand implements JsonRpcLocalCommand {
                     : parseMentions(m, quoteMentionStrings);
             quote = new Message.Quote(quoteTimestamp,
                     CommandUtil.getSingleRecipientIdentifier(quoteAuthor, m.getSelfNumber()),
-                    quoteMessage,
+                    quoteMessage == null ? "" : quoteMessage,
                     quoteMentions);
         } else {
             quote = null;
         }
 
         try {
-            var results = m.sendMessage(new Message(messageText, attachments, mentions, Optional.ofNullable(quote)),
-                    recipientIdentifiers);
-            outputResult(outputWriter, results.timestamp());
-            ErrorUtils.handleSendMessageResults(results.results());
+            var results = m.sendMessage(new Message(messageText,
+                    attachments,
+                    mentions,
+                    Optional.ofNullable(quote),
+                    Optional.ofNullable(sticker)), recipientIdentifiers);
+            outputResult(outputWriter, results);
         } catch (AttachmentInvalidException | IOException e) {
             throw new UnexpectedErrorException("Failed to send message: " + e.getMessage() + " (" + e.getClass()
                     .getSimpleName() + ")", e);
         } catch (GroupNotFoundException | NotAGroupMemberException | GroupSendingNotAllowedException e) {
             throw new UserErrorException(e.getMessage());
+        } catch (UnregisteredRecipientException e) {
+            throw new UserErrorException("The user " + e.getSender().getIdentifier() + " is not registered.");
+        } catch (InvalidStickerException e) {
+            throw new UserErrorException("Failed to send sticker: " + e.getMessage(), e);
         }
     }
 
@@ -168,12 +183,14 @@ public class SendCommand implements JsonRpcLocalCommand {
         return mentions;
     }
 
-    private void outputResult(final OutputWriter outputWriter, final long timestamp) {
-        if (outputWriter instanceof PlainTextWriter writer) {
-            writer.println("{}", timestamp);
-        } else {
-            final var writer = (JsonWriter) outputWriter;
-            writer.write(Map.of("timestamp", timestamp));
+    private Message.Sticker parseSticker(final String stickerString) throws UserErrorException {
+        final Pattern stickerPattern = Pattern.compile("([0-9a-f]+):([0-9]+)");
+        final var matcher = stickerPattern.matcher(stickerString);
+        if (!matcher.matches() || matcher.group(1).length() % 2 != 0) {
+            throw new UserErrorException("Invalid sticker syntax ("
+                    + stickerString
+                    + ") expected 'stickerPackId:stickerId'");
         }
+        return new Message.Sticker(Hex.toByteArray(matcher.group(1)), Integer.parseInt(matcher.group(2)));
     }
 }