From: AsamK Date: Fri, 3 Apr 2020 14:22:10 +0000 (+0200) Subject: Output json when receiving messages from dbus and --json parameter is given X-Git-Tag: v0.6.7~1 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/ae41d0c5026fe868c6198e1005344fc78b6e0a2c?ds=sidebyside Output json when receiving messages from dbus and --json parameter is given Fixes #138 --- diff --git a/src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java b/src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java index 3ba65f7d..ecb54d07 100644 --- a/src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java +++ b/src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java @@ -9,9 +9,9 @@ import org.whispersystems.signalservice.api.messages.SignalServiceContent; import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope; import org.whispersystems.signalservice.api.messages.SignalServiceGroup; -import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; +import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage; import org.whispersystems.signalservice.api.messages.multidevice.SentTranscriptMessage; -import org.whispersystems.signalservice.api.push.SignalServiceAddress; +import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; import java.util.ArrayList; import java.util.List; @@ -40,12 +40,25 @@ public class JsonDbusReceiveMessageHandler extends JsonReceiveMessageHandler { e.printStackTrace(); } } else if (content != null) { - if (content.getDataMessage().isPresent()) { + if (content.getReceiptMessage().isPresent()) { + final SignalServiceReceiptMessage receiptMessage = content.getReceiptMessage().get(); + if (receiptMessage.isDeliveryReceipt()) { + final String sender = !envelope.isUnidentifiedSender() && envelope.hasSource() ? envelope.getSourceE164().get() : content.getSender().getNumber().get(); + for (long timestamp : receiptMessage.getTimestamps()) { + try { + conn.sendSignal(new Signal.ReceiptReceived( + objectPath, + timestamp, + sender + )); + } catch (DBusException e) { + e.printStackTrace(); + } + } + } + } else if (content.getDataMessage().isPresent()) { SignalServiceDataMessage message = content.getDataMessage().get(); - if (message.getBody().isPresent()) - System.out.println(message.getBody().get()); - if (!message.isEndSession() && !(message.getGroupContext().isPresent() && message.getGroupContext().get().getGroupV1Type() != SignalServiceGroup.Type.DELIVER)) { diff --git a/src/main/java/org/asamk/signal/JsonError.java b/src/main/java/org/asamk/signal/JsonError.java deleted file mode 100644 index 5ef2cd7c..00000000 --- a/src/main/java/org/asamk/signal/JsonError.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.asamk.signal; - -class JsonError { - - String message; - - JsonError(Throwable exception) { - this.message = exception.getMessage(); - } -} diff --git a/src/main/java/org/asamk/signal/JsonReceiveMessageHandler.java b/src/main/java/org/asamk/signal/JsonReceiveMessageHandler.java index 1aea2327..5aa57f44 100644 --- a/src/main/java/org/asamk/signal/JsonReceiveMessageHandler.java +++ b/src/main/java/org/asamk/signal/JsonReceiveMessageHandler.java @@ -8,6 +8,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.node.ObjectNode; +import org.asamk.signal.json.JsonError; +import org.asamk.signal.json.JsonMessageEnvelope; import org.asamk.signal.manager.Manager; import org.whispersystems.signalservice.api.messages.SignalServiceContent; import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope; diff --git a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java index 42ab7327..f85aea8b 100644 --- a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java +++ b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java @@ -1,5 +1,11 @@ package org.asamk.signal.commands; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + import net.sourceforge.argparse4j.impl.Arguments; import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparser; @@ -7,6 +13,7 @@ import net.sourceforge.argparse4j.inf.Subparser; import org.asamk.Signal; import org.asamk.signal.JsonReceiveMessageHandler; import org.asamk.signal.ReceiveMessageHandler; +import org.asamk.signal.json.JsonMessageEnvelope; import org.asamk.signal.manager.Manager; import org.asamk.signal.util.DateUtils; import org.freedesktop.dbus.DBusConnection; @@ -34,9 +41,27 @@ public class ReceiveCommand implements ExtendedDbusCommand, LocalCommand { } public int handleCommand(final Namespace ns, final Signal signal, DBusConnection dbusconnection) { - if (dbusconnection != null) { - try { - dbusconnection.addSigHandler(Signal.MessageReceived.class, messageReceived -> { + final ObjectMapper jsonProcessor; + if (ns.getBoolean("json")) { + jsonProcessor = new ObjectMapper(); + jsonProcessor.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // disable autodetect + jsonProcessor.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET); + } else { + jsonProcessor = null; + } + try { + dbusconnection.addSigHandler(Signal.MessageReceived.class, messageReceived -> { + if (jsonProcessor != null) { + JsonMessageEnvelope envelope = new JsonMessageEnvelope(messageReceived); + ObjectNode result = jsonProcessor.createObjectNode(); + result.putPOJO("envelope", envelope); + try { + jsonProcessor.writeValue(System.out, result); + System.out.println(); + } catch (IOException e) { + e.printStackTrace(); + } + } else { System.out.print(String.format("Envelope from: %s\nTimestamp: %s\nBody: %s\n", messageReceived.getSender(), DateUtils.formatTimestamp(messageReceived.getTimestamp()), messageReceived.getMessage())); if (messageReceived.getGroupId().length > 0) { @@ -50,11 +75,39 @@ public class ReceiveCommand implements ExtendedDbusCommand, LocalCommand { } } System.out.println(); - }); - dbusconnection.addSigHandler(Signal.ReceiptReceived.class, - receiptReceived -> System.out.print(String.format("Receipt from: %s\nTimestamp: %s\n", - receiptReceived.getSender(), DateUtils.formatTimestamp(receiptReceived.getTimestamp())))); - dbusconnection.addSigHandler(Signal.SyncMessageReceived.class, syncReceived -> { + } + }); + + dbusconnection.addSigHandler(Signal.ReceiptReceived.class, + receiptReceived -> { + if (jsonProcessor != null) { + JsonMessageEnvelope envelope = new JsonMessageEnvelope(receiptReceived); + ObjectNode result = jsonProcessor.createObjectNode(); + result.putPOJO("envelope", envelope); + try { + jsonProcessor.writeValue(System.out, result); + System.out.println(); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + System.out.print(String.format("Receipt from: %s\nTimestamp: %s\n", + receiptReceived.getSender(), DateUtils.formatTimestamp(receiptReceived.getTimestamp()))); + } + }); + + dbusconnection.addSigHandler(Signal.SyncMessageReceived.class, syncReceived -> { + if (jsonProcessor != null) { + JsonMessageEnvelope envelope = new JsonMessageEnvelope(syncReceived); + ObjectNode result = jsonProcessor.createObjectNode(); + result.putPOJO("envelope", envelope); + try { + jsonProcessor.writeValue(System.out, result); + System.out.println(); + } catch (IOException e) { + e.printStackTrace(); + } + } else { System.out.print(String.format("Sync Envelope from: %s to: %s\nTimestamp: %s\nBody: %s\n", syncReceived.getSource(), syncReceived.getDestination(), DateUtils.formatTimestamp(syncReceived.getTimestamp()), syncReceived.getMessage())); if (syncReceived.getGroupId().length > 0) { @@ -68,23 +121,22 @@ public class ReceiveCommand implements ExtendedDbusCommand, LocalCommand { } } System.out.println(); - }); - } catch (UnsatisfiedLinkError e) { - System.err.println("Missing native library dependency for dbus service: " + e.getMessage()); - return 1; - } catch (DBusException e) { - e.printStackTrace(); - return 1; - } - while (true) { - try { - Thread.sleep(10000); - } catch (InterruptedException e) { - return 0; } + }); + } catch (UnsatisfiedLinkError e) { + System.err.println("Missing native library dependency for dbus service: " + e.getMessage()); + return 1; + } catch (DBusException e) { + e.printStackTrace(); + return 1; + } + while (true) { + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + return 0; } } - return 0; } @Override diff --git a/src/main/java/org/asamk/signal/JsonAttachment.java b/src/main/java/org/asamk/signal/json/JsonAttachment.java similarity index 88% rename from src/main/java/org/asamk/signal/JsonAttachment.java rename to src/main/java/org/asamk/signal/json/JsonAttachment.java index 58165639..8a405fc4 100644 --- a/src/main/java/org/asamk/signal/JsonAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonAttachment.java @@ -1,4 +1,4 @@ -package org.asamk.signal; +package org.asamk.signal.json; import org.whispersystems.signalservice.api.messages.SignalServiceAttachment; import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer; @@ -24,4 +24,8 @@ class JsonAttachment { } } } + + JsonAttachment(String filename) { + this.filename = filename; + } } diff --git a/src/main/java/org/asamk/signal/JsonCallMessage.java b/src/main/java/org/asamk/signal/json/JsonCallMessage.java similarity index 97% rename from src/main/java/org/asamk/signal/JsonCallMessage.java rename to src/main/java/org/asamk/signal/json/JsonCallMessage.java index 2c8518f9..c1b1d443 100644 --- a/src/main/java/org/asamk/signal/JsonCallMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonCallMessage.java @@ -1,4 +1,4 @@ -package org.asamk.signal; +package org.asamk.signal.json; import org.whispersystems.signalservice.api.messages.calls.AnswerMessage; import org.whispersystems.signalservice.api.messages.calls.BusyMessage; diff --git a/src/main/java/org/asamk/signal/JsonDataMessage.java b/src/main/java/org/asamk/signal/json/JsonDataMessage.java similarity index 60% rename from src/main/java/org/asamk/signal/JsonDataMessage.java rename to src/main/java/org/asamk/signal/json/JsonDataMessage.java index efd8e53e..fc8538aa 100644 --- a/src/main/java/org/asamk/signal/JsonDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonDataMessage.java @@ -1,11 +1,13 @@ -package org.asamk.signal; +package org.asamk.signal.json; +import org.asamk.Signal; import org.whispersystems.signalservice.api.messages.SignalServiceAttachment; import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; import org.whispersystems.signalservice.api.messages.SignalServiceGroup; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; class JsonDataMessage { @@ -34,4 +36,24 @@ class JsonDataMessage { this.attachments = new ArrayList<>(); } } + + public JsonDataMessage(Signal.MessageReceived messageReceived) { + timestamp = messageReceived.getTimestamp(); + message = messageReceived.getMessage(); + groupInfo = new JsonGroupInfo(messageReceived.getGroupId()); + attachments = messageReceived.getAttachments() + .stream() + .map(JsonAttachment::new) + .collect(Collectors.toList()); + } + + public JsonDataMessage(Signal.SyncMessageReceived messageReceived) { + timestamp = messageReceived.getTimestamp(); + message = messageReceived.getMessage(); + groupInfo = new JsonGroupInfo(messageReceived.getGroupId()); + attachments = messageReceived.getAttachments() + .stream() + .map(JsonAttachment::new) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/org/asamk/signal/json/JsonError.java b/src/main/java/org/asamk/signal/json/JsonError.java new file mode 100644 index 00000000..29d85c8b --- /dev/null +++ b/src/main/java/org/asamk/signal/json/JsonError.java @@ -0,0 +1,10 @@ +package org.asamk.signal.json; + +public class JsonError { + + String message; + + public JsonError(Throwable exception) { + this.message = exception.getMessage(); + } +} diff --git a/src/main/java/org/asamk/signal/JsonGroupInfo.java b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java similarity index 87% rename from src/main/java/org/asamk/signal/JsonGroupInfo.java rename to src/main/java/org/asamk/signal/json/JsonGroupInfo.java index 5678b896..572623e4 100644 --- a/src/main/java/org/asamk/signal/JsonGroupInfo.java +++ b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java @@ -1,4 +1,4 @@ -package org.asamk.signal; +package org.asamk.signal.json; import org.whispersystems.signalservice.api.messages.SignalServiceGroup; import org.whispersystems.signalservice.api.push.SignalServiceAddress; @@ -27,4 +27,8 @@ class JsonGroupInfo { } this.type = groupInfo.getType().toString(); } + + JsonGroupInfo(byte[] groupId) { + this.groupId = Base64.encodeBytes(groupId); + } } diff --git a/src/main/java/org/asamk/signal/JsonMessageEnvelope.java b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java similarity index 71% rename from src/main/java/org/asamk/signal/JsonMessageEnvelope.java rename to src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java index 9a275970..3279d941 100644 --- a/src/main/java/org/asamk/signal/JsonMessageEnvelope.java +++ b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java @@ -1,10 +1,11 @@ -package org.asamk.signal; +package org.asamk.signal.json; +import org.asamk.Signal; import org.whispersystems.signalservice.api.messages.SignalServiceContent; import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope; import org.whispersystems.signalservice.api.push.SignalServiceAddress; -class JsonMessageEnvelope { +public class JsonMessageEnvelope { String source; int sourceDevice; @@ -44,4 +45,22 @@ class JsonMessageEnvelope { } } } + + public JsonMessageEnvelope(Signal.MessageReceived messageReceived) { + source = messageReceived.getSender(); + timestamp = messageReceived.getTimestamp(); + dataMessage = new JsonDataMessage(messageReceived); + } + + public JsonMessageEnvelope(Signal.ReceiptReceived receiptReceived) { + source = receiptReceived.getSender(); + timestamp = receiptReceived.getTimestamp(); + isReceipt = true; + } + + public JsonMessageEnvelope(Signal.SyncMessageReceived messageReceived) { + source = messageReceived.getSource(); + timestamp = messageReceived.getTimestamp(); + syncMessage = new JsonSyncMessage(messageReceived); + } } diff --git a/src/main/java/org/asamk/signal/JsonReceiptMessage.java b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java similarity index 95% rename from src/main/java/org/asamk/signal/JsonReceiptMessage.java rename to src/main/java/org/asamk/signal/json/JsonReceiptMessage.java index fd875af5..1b896053 100644 --- a/src/main/java/org/asamk/signal/JsonReceiptMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java @@ -1,4 +1,4 @@ -package org.asamk.signal; +package org.asamk.signal.json; import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage; diff --git a/src/main/java/org/asamk/signal/JsonSyncDataMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java similarity index 67% rename from src/main/java/org/asamk/signal/JsonSyncDataMessage.java rename to src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java index b72fb26d..d253b197 100644 --- a/src/main/java/org/asamk/signal/JsonSyncDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java @@ -1,5 +1,6 @@ -package org.asamk.signal; +package org.asamk.signal.json; +import org.asamk.Signal; import org.whispersystems.signalservice.api.messages.multidevice.SentTranscriptMessage; class JsonSyncDataMessage extends JsonDataMessage { @@ -12,4 +13,9 @@ class JsonSyncDataMessage extends JsonDataMessage { this.destination = transcriptMessage.getDestination().get().getNumber().get(); } } + + JsonSyncDataMessage(Signal.SyncMessageReceived messageReceived) { + super(messageReceived); + destination = messageReceived.getDestination(); + } } diff --git a/src/main/java/org/asamk/signal/JsonSyncMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncMessage.java similarity index 89% rename from src/main/java/org/asamk/signal/JsonSyncMessage.java rename to src/main/java/org/asamk/signal/json/JsonSyncMessage.java index 326ec4ed..27766bda 100644 --- a/src/main/java/org/asamk/signal/JsonSyncMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncMessage.java @@ -1,5 +1,6 @@ -package org.asamk.signal; +package org.asamk.signal.json; +import org.asamk.Signal; import org.whispersystems.signalservice.api.messages.multidevice.ReadMessage; import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; import org.whispersystems.signalservice.api.push.SignalServiceAddress; @@ -42,4 +43,8 @@ class JsonSyncMessage { this.type = JsonSyncMessageType.REQUEST_SYNC; } } + + JsonSyncMessage(Signal.SyncMessageReceived messageReceived) { + sentMessage = new JsonSyncDataMessage(messageReceived); + } } diff --git a/src/main/java/org/asamk/signal/JsonStickerPack.java b/src/main/java/org/asamk/signal/manager/JsonStickerPack.java similarity index 88% rename from src/main/java/org/asamk/signal/JsonStickerPack.java rename to src/main/java/org/asamk/signal/manager/JsonStickerPack.java index 4594c5d1..a7e5eb7f 100644 --- a/src/main/java/org/asamk/signal/JsonStickerPack.java +++ b/src/main/java/org/asamk/signal/manager/JsonStickerPack.java @@ -1,10 +1,10 @@ -package org.asamk.signal; +package org.asamk.signal.manager; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; -public class JsonStickerPack { +class JsonStickerPack { @JsonProperty public String title; diff --git a/src/main/java/org/asamk/signal/manager/Manager.java b/src/main/java/org/asamk/signal/manager/Manager.java index 06350982..11c49d84 100644 --- a/src/main/java/org/asamk/signal/manager/Manager.java +++ b/src/main/java/org/asamk/signal/manager/Manager.java @@ -21,7 +21,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.asamk.Signal; import org.asamk.signal.AttachmentInvalidException; import org.asamk.signal.GroupNotFoundException; -import org.asamk.signal.JsonStickerPack; import org.asamk.signal.NotAGroupMemberException; import org.asamk.signal.StickerPackInvalidException; import org.asamk.signal.TrustLevel;