]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/Main.java
Duct tape solution to make daemon actually output JSON
[signal-cli] / src / main / java / org / asamk / signal / Main.java
index 5968904937c23484a4c47853ff8e015245c6a344..d50b4395be3beb2e7797d961a97ff997e39a54c7 100644 (file)
@@ -683,7 +683,7 @@ public class Main {
                         }
                         ignoreAttachments = ns.getBoolean("ignore_attachments");
                         try {
-                            m.receiveMessages(1, TimeUnit.HOURS, false, ignoreAttachments, new DbusReceiveMessageHandler(m, conn));
+                            m.receiveMessages(1, TimeUnit.HOURS, false, ignoreAttachments, ns.getBoolean("json") ? new JsonDbusReceiveMessageHandler(m, conn) : new DbusReceiveMessageHandler(m, conn));
                         } catch (IOException e) {
                             System.err.println("Error while receiving messages: " + e.getMessage());
                             return 3;
@@ -899,6 +899,9 @@ public class Main {
         parserDaemon.addArgument("--ignore-attachments")
                 .help("Don’t download attachments of received messages.")
                 .action(Arguments.storeTrue());
+        parserDaemon.addArgument("--json")
+                .help("Output received messages in json format, one json object per line.")
+                .action(Arguments.storeTrue());
 
         try {
             Namespace ns = parser.parseArgs(args);
@@ -1168,6 +1171,22 @@ public class Main {
                 System.out.println("Profile key update, key length:" + message.getProfileKey().get().length);
             }
 
+            if (message.getQuote().isPresent()) {
+                SignalServiceDataMessage.Quote quote = message.getQuote().get();
+                System.out.println("Quote: (" + quote.getId() + ")");
+                System.out.println(" Author: " + quote.getAuthor().getNumber());
+                System.out.println(" Text: " + quote.getText());
+                if (quote.getAttachments().size() > 0) {
+                    System.out.println(" Attachments: ");
+                    for (SignalServiceDataMessage.Quote.QuotedAttachment attachment : quote.getAttachments()) {
+                        System.out.println("  Filename: " + attachment.getFileName());
+                        System.out.println("  Type: " + attachment.getContentType());
+                        System.out.println("  Thumbnail:");
+                        printAttachment(attachment.getThumbnail());
+                    }
+                }
+            }
+
             if (message.getAttachments().isPresent()) {
                 System.out.println("Attachments: ");
                 for (SignalServiceAttachment attachment : message.getAttachments().get()) {
@@ -1277,6 +1296,59 @@ public class Main {
         }
     }
 
+    private static class JsonDbusReceiveMessageHandler extends JsonReceiveMessageHandler {
+        final DBusConnection conn;
+
+        public JsonDbusReceiveMessageHandler(Manager m, DBusConnection conn) {
+            super(m);
+            this.conn = conn;
+        }
+
+        @Override
+        public void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, Throwable exception) {
+            super.handleMessage(envelope, content, exception);
+
+            if (envelope.isReceipt()) {
+                try {
+                    conn.sendSignal(new Signal.ReceiptReceived(
+                            SIGNAL_OBJECTPATH,
+                            envelope.getTimestamp(),
+                            envelope.getSource()
+                    ));
+                } catch (DBusException e) {
+                    e.printStackTrace();
+                }
+            } else if (content != null && content.getDataMessage().isPresent()) {
+                SignalServiceDataMessage message = content.getDataMessage().get();
+
+                if (!message.isEndSession() &&
+                        !(message.getGroupInfo().isPresent() &&
+                                message.getGroupInfo().get().getType() != SignalServiceGroup.Type.DELIVER)) {
+                    List<String> attachments = new ArrayList<>();
+                    if (message.getAttachments().isPresent()) {
+                        for (SignalServiceAttachment attachment : message.getAttachments().get()) {
+                            if (attachment.isPointer()) {
+                                attachments.add(m.getAttachmentFile(attachment.asPointer().getId()).getAbsolutePath());
+                            }
+                        }
+                    }
+
+                    try {
+                        conn.sendSignal(new Signal.MessageReceived(
+                                SIGNAL_OBJECTPATH,
+                                message.getTimestamp(),
+                                envelope.getSource(),
+                                message.getGroupInfo().isPresent() ? message.getGroupInfo().get().getGroupId() : new byte[0],
+                                message.getBody().isPresent() ? message.getBody().get() : "",
+                                attachments));
+                    } catch (DBusException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+    }
+
     private static String formatTimestamp(long timestamp) {
         Date date = new Date(timestamp);
         final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); // Quoted "Z" to indicate UTC, no timezone offset