]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/ReceiveMessageHandler.java
Implement receive handling for story messages
[signal-cli] / src / main / java / org / asamk / signal / ReceiveMessageHandler.java
index b794f8602b8eeabf612abb7e71cf6a66979ff0a8..10f7370675b57d228358f01bc52150a4456f9761 100644 (file)
@@ -1,16 +1,17 @@
 package org.asamk.signal;
 
 import org.asamk.signal.manager.Manager;
-import org.asamk.signal.manager.UntrustedIdentityException;
 import org.asamk.signal.manager.api.MessageEnvelope;
 import org.asamk.signal.manager.api.RecipientIdentifier;
+import org.asamk.signal.manager.api.UntrustedIdentityException;
 import org.asamk.signal.manager.groups.GroupId;
 import org.asamk.signal.manager.storage.recipients.RecipientAddress;
+import org.asamk.signal.output.PlainTextWriter;
 import org.asamk.signal.util.DateUtils;
+import org.asamk.signal.util.Hex;
 import org.slf4j.helpers.MessageFormatter;
 
 import java.util.ArrayList;
-import java.util.Base64;
 import java.util.stream.Collectors;
 
 public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
@@ -25,6 +26,12 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
 
     @Override
     public void handleMessage(MessageEnvelope envelope, Throwable exception) {
+        synchronized (writer) {
+            handleMessageInternal(envelope, exception);
+        }
+    }
+
+    private void handleMessageInternal(MessageEnvelope envelope, Throwable exception) {
         var source = envelope.sourceAddress();
         writer.println("Envelope from: {} (device: {})",
                 source.map(this::formatContact).orElse("unknown source"),
@@ -43,13 +50,13 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
                         "The user’s key is untrusted, either the user has reinstalled Signal or a third party sent this message.");
                 final var recipientName = e.getSender().getLegacyIdentifier();
                 writer.println(
-                        "Use 'signal-cli -u {} listIdentities -n {}', verify the key and run 'signal-cli -u {} trust -v \"FINGER_PRINT\" {}' to mark it as trusted",
+                        "Use 'signal-cli -a {} listIdentities -n {}', verify the key and run 'signal-cli -a {} trust -v \"FINGER_PRINT\" {}' to mark it as trusted",
                         m.getSelfNumber(),
                         recipientName,
                         m.getSelfNumber(),
                         recipientName);
                 writer.println(
-                        "If you don't care about security, use 'signal-cli -u {} trust -a {}' to trust it without verification",
+                        "If you don't care about security, use 'signal-cli -a {} trust -a {}' to trust it without verification",
                         m.getSelfNumber(),
                         recipientName);
             } else {
@@ -61,6 +68,10 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
             var message = envelope.data().get();
             printDataMessage(writer, message);
         }
+        if (envelope.story().isPresent()) {
+            var message = envelope.story().get();
+            printStoryMessage(writer.indentedWriter(), message);
+        }
         if (envelope.sync().isPresent()) {
             writer.println("Received a sync message");
             var syncMessage = envelope.sync().get();
@@ -100,6 +111,11 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
             final var groupContext = message.groupContext().get();
             printGroupContext(writer.indentedWriter(), groupContext);
         }
+        if (message.storyContext().isPresent()) {
+            writer.println("Story reply:");
+            final var storyContext = message.storyContext().get();
+            printStoryContext(writer.indentedWriter(), storyContext);
+        }
         if (message.groupCallUpdate().isPresent()) {
             writer.println("Group call update:");
             final var groupCallUpdate = message.groupCallUpdate().get();
@@ -134,9 +150,12 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
         if (message.expiresInSeconds() > 0) {
             writer.println("Expires in: {} seconds", message.expiresInSeconds());
         }
-        if (message.hasProfileKey()) {
+        if (message.isProfileKeyUpdate()) {
             writer.println("Profile key update");
         }
+        if (message.hasProfileKey()) {
+            writer.println("With profile key");
+        }
         if (message.reaction().isPresent()) {
             writer.println("Reaction:");
             final var reaction = message.reaction().get();
@@ -166,6 +185,28 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
         }
     }
 
+    private void printStoryMessage(
+            PlainTextWriter writer, MessageEnvelope.Story message
+    ) {
+        writer.println("Story: with replies: {}", message.allowsReplies());
+        if (message.groupId().isPresent()) {
+            writer.println("Group info:");
+            printGroupInfo(writer.indentedWriter(), message.groupId().get());
+        }
+        if (message.textAttachment().isPresent()) {
+            writer.println("Body: {}", message.textAttachment().get().text().orElse(""));
+
+            if (message.textAttachment().get().preview().isPresent()) {
+                writer.println("Preview:");
+                printPreview(writer.indentedWriter(), message.textAttachment().get().preview().get());
+            }
+        }
+        if (message.fileAttachment().isPresent()) {
+            writer.println("Attachments:");
+            printAttachment(writer.indentedWriter(), message.fileAttachment().get());
+        }
+    }
+
     private void printTypingMessage(
             final PlainTextWriter writer, final MessageEnvelope.Typing typingMessage
     ) {
@@ -291,8 +332,14 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
                         .println("Expiration started at: {}",
                                 DateUtils.formatTimestamp(sentTranscriptMessage.expirationStartTimestamp()));
             }
-            var message = sentTranscriptMessage.message();
-            printDataMessage(writer.indentedWriter(), message);
+            if (sentTranscriptMessage.message().isPresent()) {
+                var message = sentTranscriptMessage.message().get();
+                printDataMessage(writer.indentedWriter(), message);
+            }
+            if (sentTranscriptMessage.story().isPresent()) {
+                var message = sentTranscriptMessage.story().get();
+                printStoryMessage(writer.indentedWriter(), message);
+            }
         }
         if (syncMessage.blocked().isPresent()) {
             writer.println("Received sync message with block list");
@@ -302,7 +349,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
                 writer.println("- {}", address.getLegacyIdentifier());
             }
             for (var groupId : blockedList.groupIds()) {
-                writer.println("- {}", groupId);
+                writer.println("- {}", groupId.toBase64());
             }
         }
         if (syncMessage.viewOnceOpen().isPresent()) {
@@ -342,8 +389,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
     private void printSticker(
             final PlainTextWriter writer, final MessageEnvelope.Data.Sticker sticker
     ) {
-        writer.println("Pack id: {}", Base64.getEncoder().encodeToString(sticker.packId()));
-        writer.println("Pack key: {}", Base64.getEncoder().encodeToString(sticker.packKey()));
+        writer.println("Pack id: {}", Hex.toStringCondensed(sticker.packId().serialize()));
         writer.println("Sticker id: {}", sticker.stickerId());
     }
 
@@ -484,6 +530,13 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
         writer.println("Type: {}", groupContext.isGroupUpdate() ? "UPDATE" : "DELIVER");
     }
 
+    private void printStoryContext(
+            final PlainTextWriter writer, final MessageEnvelope.Data.StoryContext storyContext
+    ) {
+        writer.println("Sender: {}", formatContact(storyContext.author()));
+        writer.println("Sent timestamp: {}", storyContext.sentTimestamp());
+    }
+
     private void printGroupInfo(final PlainTextWriter writer, final GroupId groupId) {
         writer.println("Id: {}", groupId.toBase64());
 
@@ -543,8 +596,8 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
         if (attachment.width().isPresent() || attachment.height().isPresent()) {
             writer.println("Dimensions: {}x{}", attachment.width().orElse(0), attachment.height().orElse(0));
         }
-        if (attachment.id().isPresent()) {
-            var file = m.getAttachmentFile(attachment.id().get());
+        if (attachment.file().isPresent()) {
+            var file = attachment.file().get();
             if (file.exists()) {
                 writer.println("Stored plaintext in: {}", file);
             }