]> nmode's Git Repositories - signal-cli/commitdiff
Duct tape solution to make daemon actually output JSON
authorRiamse <andrewwang43@gmail.com>
Sun, 6 May 2018 18:38:15 +0000 (14:38 -0400)
committerAsamK <asamk@gmx.de>
Thu, 17 May 2018 16:07:31 +0000 (18:07 +0200)
src/main/java/org/asamk/signal/Main.java

index 3b2fbadbb1fb6efc447bb2e3f946eee5815e2a0a..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;
@@ -1296,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