]> nmode's Git Repositories - signal-cli/commitdiff
Add support for sending view once messages
authorAsamK <asamk@gmx.de>
Mon, 14 Jul 2025 14:42:06 +0000 (16:42 +0200)
committerAsamK <asamk@gmx.de>
Mon, 14 Jul 2025 14:42:06 +0000 (16:42 +0200)
Closes #1812

client/src/cli.rs
client/src/jsonrpc.rs
client/src/main.rs
lib/src/main/java/org/asamk/signal/manager/api/Message.java
lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.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 90809e1b77494c4edddb5569d0d509ac9112dc51..7fa5d1c5987aae15d62f9df66b27eb714d052411 100644 (file)
@@ -179,6 +179,9 @@ pub enum CliCommands {
         #[arg(short = 'a', long)]
         attachment: Vec<String>,
 
         #[arg(short = 'a', long)]
         attachment: Vec<String>,
 
+        #[arg(long)]
+        view_once: bool,
+
         #[arg(long)]
         mention: Vec<String>,
 
         #[arg(long)]
         mention: Vec<String>,
 
index 6874652dc0750a3a8026985cc3b758684bea4969..fe0dc668e879378f34824437f4fb16954361811c 100644 (file)
@@ -183,6 +183,7 @@ pub trait Rpc {
         endSession: bool,
         message: String,
         attachments: Vec<String>,
         endSession: bool,
         message: String,
         attachments: Vec<String>,
+        view_once: bool,
         mentions: Vec<String>,
         textStyle: Vec<String>,
         quoteTimestamp: Option<u64>,
         mentions: Vec<String>,
         textStyle: Vec<String>,
         quoteTimestamp: Option<u64>,
index f82ee237eb3a23f5aca8cf386f66cbc667467b0d..ac12331df672891a7f62ce06348207080848679f 100644 (file)
@@ -144,6 +144,7 @@ async fn handle_command(
             end_session,
             message,
             attachment,
             end_session,
             message,
             attachment,
+            view_once,
             mention,
             text_style,
             quote_timestamp,
             mention,
             text_style,
             quote_timestamp,
@@ -170,6 +171,7 @@ async fn handle_command(
                     end_session,
                     message.unwrap_or_default(),
                     attachment,
                     end_session,
                     message.unwrap_or_default(),
                     attachment,
+                    view_once,
                     mention,
                     text_style,
                     quote_timestamp,
                     mention,
                     text_style,
                     quote_timestamp,
index 48277e6dc9d277821ce2bb79d3de7d604dc5b6ac..9b3724512008a8ec2d90d0708c57246132ad317b 100644 (file)
@@ -6,6 +6,7 @@ import java.util.Optional;
 public record Message(
         String messageText,
         List<String> attachments,
 public record Message(
         String messageText,
         List<String> attachments,
+        boolean viewOnce,
         List<Mention> mentions,
         Optional<Quote> quote,
         Optional<Sticker> sticker,
         List<Mention> mentions,
         Optional<Quote> quote,
         Optional<Sticker> sticker,
index eb672d24f9ef130b71cb457426fdfcdc42f85a23..726d0aafbffea9819adf971beccc97017b47ca22 100644 (file)
@@ -810,6 +810,7 @@ public class ManagerImpl implements Manager {
         } else if (!additionalAttachments.isEmpty()) {
             messageBuilder.withAttachments(additionalAttachments);
         }
         } else if (!additionalAttachments.isEmpty()) {
             messageBuilder.withAttachments(additionalAttachments);
         }
+        messageBuilder.withViewOnce(message.viewOnce());
         if (!message.mentions().isEmpty()) {
             messageBuilder.withMentions(resolveMentions(message.mentions()));
         }
         if (!message.mentions().isEmpty()) {
             messageBuilder.withMentions(resolveMentions(message.mentions()));
         }
index 32321095775d53754b0421d9ef6a8c44668edec8..73286aaca64b66dbac4fff4f7f5e9d1a697cdb60 100644 (file)
@@ -316,6 +316,11 @@ Data URI encoded attachments must follow the RFC 2397.
 Additionally a file name can be added:
 e.g.: `data:<MIME-TYPE>;filename=<FILENAME>;base64,<BASE64 ENCODED DATA>`
 
 Additionally a file name can be added:
 e.g.: `data:<MIME-TYPE>;filename=<FILENAME>;base64,<BASE64 ENCODED DATA>`
 
+*--view-once*::
+Send the message as a view once message.
+A conformant client will only allow the receiver to view the message once.
+View Once is only supported for messages that include an image attachment.
+
 *--sticker* STICKER::
 Send a sticker of a locally known sticker pack (syntax: stickerPackId:stickerId).
 Shouldn't be used together with `-m` as the official clients don't support this.
 *--sticker* STICKER::
 Send a sticker of a locally known sticker pack (syntax: stickerPackId:stickerId).
 Shouldn't be used together with `-m` as the official clients don't support this.
index cce1d21e82eca88f96924d6def135a670619eb78..e022723e3ec777bb58deb019d740a1112ffe0bf3 100644 (file)
@@ -66,6 +66,9 @@ public class SendCommand implements JsonRpcLocalCommand {
                 .help("Add an attachment. "
                         + "Can be either a file path or a data URI. Data URI encoded attachments must follow the RFC 2397. Additionally a file name can be added, e.g. "
                         + "data:<MIME-TYPE>;filename=<FILENAME>;base64,<BASE64 ENCODED DATA>.");
                 .help("Add an attachment. "
                         + "Can be either a file path or a data URI. Data URI encoded attachments must follow the RFC 2397. Additionally a file name can be added, e.g. "
                         + "data:<MIME-TYPE>;filename=<FILENAME>;base64,<BASE64 ENCODED DATA>.");
+        subparser.addArgument("--view-once")
+                .action(Arguments.storeTrue())
+                .help("Send the message as a view once message");
         subparser.addArgument("-e", "--end-session", "--endsession")
                 .help("Clear session state and send end session message.")
                 .action(Arguments.storeTrue());
         subparser.addArgument("-e", "--end-session", "--endsession")
                 .help("Clear session state and send end session message.")
                 .action(Arguments.storeTrue());
@@ -164,6 +167,7 @@ public class SendCommand implements JsonRpcLocalCommand {
         if (attachments == null) {
             attachments = List.of();
         }
         if (attachments == null) {
             attachments = List.of();
         }
+        final var viewOnce = ns.getBoolean("view-once");
 
         final var selfNumber = m.getSelfNumber();
 
 
         final var selfNumber = m.getSelfNumber();
 
@@ -239,6 +243,7 @@ public class SendCommand implements JsonRpcLocalCommand {
         try {
             final var message = new Message(messageText,
                     attachments,
         try {
             final var message = new Message(messageText,
                     attachments,
+                    viewOnce,
                     mentions,
                     Optional.ofNullable(quote),
                     Optional.ofNullable(sticker),
                     mentions,
                     Optional.ofNullable(quote),
                     Optional.ofNullable(sticker),
index ac77df99d2500d23269e4bd69a201f814795fc78..725df8b1a639be8b25a6853018ee52586bacadd3 100644 (file)
@@ -236,6 +236,7 @@ public class DbusSignalImpl implements Signal, AutoCloseable {
         try {
             final var message = new Message(messageText,
                     attachments,
         try {
             final var message = new Message(messageText,
                     attachments,
+                    false,
                     List.of(),
                     Optional.empty(),
                     Optional.empty(),
                     List.of(),
                     Optional.empty(),
                     Optional.empty(),
@@ -399,6 +400,7 @@ public class DbusSignalImpl implements Signal, AutoCloseable {
         try {
             final var message = new Message(messageText,
                     attachments,
         try {
             final var message = new Message(messageText,
                     attachments,
+                    false,
                     List.of(),
                     Optional.empty(),
                     Optional.empty(),
                     List.of(),
                     Optional.empty(),
                     Optional.empty(),
@@ -444,6 +446,7 @@ public class DbusSignalImpl implements Signal, AutoCloseable {
         try {
             final var message = new Message(messageText,
                     attachments,
         try {
             final var message = new Message(messageText,
                     attachments,
+                    false,
                     List.of(),
                     Optional.empty(),
                     Optional.empty(),
                     List.of(),
                     Optional.empty(),
                     Optional.empty(),