From 24e7c028b9d8456e43ee8d5b7013f403d70a0bdb Mon Sep 17 00:00:00 2001 From: John Freed Date: Thu, 7 Oct 2021 18:34:15 +0200 Subject: [PATCH] new DBus signal ReceiptReceivedV2 ReceiptReceivedV2 (timestamp, sender, isDeliveryReceipt, isReadReceipt , isViewedReceipt):: send three (mutually exclusive) booleans to describe nature of receipt --- man/signal-cli-dbus.5.adoc | 9 ++++ src/main/java/org/asamk/Signal.java | 45 +++++++++++++++++++ .../signal/JsonDbusReceiveMessageHandler.java | 23 +++++++++- .../asamk/signal/json/JsonReceiptMessage.java | 9 +++- 4 files changed, 82 insertions(+), 4 deletions(-) diff --git a/man/signal-cli-dbus.5.adoc b/man/signal-cli-dbus.5.adoc index deea74ee..545f3676 100755 --- a/man/signal-cli-dbus.5.adoc +++ b/man/signal-cli-dbus.5.adoc @@ -303,6 +303,15 @@ ReceiptReceived (timestamp, sender):: This signal is sent by each recipient (e.g. each group member) after the message was successfully delivered to the device +ReceiptReceivedV2 (timestamp, sender, isDeliveryReceipt, isReadReceipt, isViewedReceipt):: +* timestamp : Integer value that can be used to associate this e.g. with a sendMessage() +* sender : Phone number of the sender +* isDeliveryReceipt : boolean representing whether a delivery receipt was received +* isReadReceipt : boolean representing whether a read receipt was received +* isViewedReceipt : boolean representing whether a viewed receipt was received + +This signal is sent by each recipient (e.g. each group member) after the message was successfully delivered to the device + == Examples Send a text message (without attachment) to a contact:: diff --git a/src/main/java/org/asamk/Signal.java b/src/main/java/org/asamk/Signal.java index 22a467aa..e0f67888 100644 --- a/src/main/java/org/asamk/Signal.java +++ b/src/main/java/org/asamk/Signal.java @@ -224,6 +224,51 @@ public interface Signal extends DBusInterface { } } + class ReceiptReceivedV2 extends DBusSignal { + + private final long timestamp; + private final String sender; + private final boolean isDelivery; + private final boolean isRead; + private final boolean isViewed; + + public ReceiptReceivedV2( + String objectpath, + long timestamp, + String sender, + boolean isDelivery, + boolean isRead, + boolean isViewed + ) throws DBusException { + super(objectpath, timestamp, sender, isDelivery, isRead, isViewed); + this.timestamp = timestamp; + this.sender = sender; + this.isDelivery = isDelivery; + this.isRead = isRead; + this.isViewed = isViewed; + } + + public long getTimestamp() { + return timestamp; + } + + public String getSender() { + return sender; + } + + public boolean isDelivery() { + return isDelivery; + } + + public boolean isRead() { + return isRead; + } + + public boolean isViewed() { + return isViewed; + } + } + class SyncMessageReceived extends DBusSignal { private final long timestamp; diff --git a/src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java b/src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java index a7bdbabf..8b80e9d6 100644 --- a/src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java +++ b/src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java @@ -12,6 +12,7 @@ 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.SignalServiceAttachment; +import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage; import java.util.ArrayList; import java.util.List; @@ -42,8 +43,18 @@ public class JsonDbusReceiveMessageHandler extends JsonReceiveMessageHandler { if (envelope.isReceipt()) { try { conn.sendMessage(new Signal.ReceiptReceived(objectPath, envelope.getTimestamp(), - // A receipt envelope always has a source address getLegacyIdentifier(envelope.getSourceAddress()))); + if (content.getReceiptMessage().isPresent()) { + SignalServiceReceiptMessage receiptMessage = content.getReceiptMessage().get(); + conn.sendMessage(new Signal.ReceiptReceivedV2(objectPath, envelope.getTimestamp(), + // A receipt envelope always has a source address + getLegacyIdentifier(envelope.getSourceAddress()), + receiptMessage.isDeliveryReceipt(), + receiptMessage.isReadReceipt(), + receiptMessage.isViewedReceipt() + )); + } + } catch (DBusException e) { e.printStackTrace(); } @@ -53,12 +64,20 @@ public class JsonDbusReceiveMessageHandler extends JsonReceiveMessageHandler { : content.getSender(); if (content.getReceiptMessage().isPresent()) { final var receiptMessage = content.getReceiptMessage().get(); - if (receiptMessage.isDeliveryReceipt()) { + if (receiptMessage.isDeliveryReceipt() || receiptMessage.isReadReceipt() || receiptMessage.isViewedReceipt()) { for (long timestamp : receiptMessage.getTimestamps()) { try { + //send both signals; only one is relevant conn.sendMessage(new Signal.ReceiptReceived(objectPath, timestamp, getLegacyIdentifier(sender))); + conn.sendMessage(new Signal.ReceiptReceivedV2(objectPath, + timestamp, + getLegacyIdentifier(sender), + receiptMessage.isDeliveryReceipt(), + receiptMessage.isReadReceipt(), + receiptMessage.isViewedReceipt() + )); } catch (DBusException e) { e.printStackTrace(); } diff --git a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java index e32009e1..15e2cf43 100644 --- a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java @@ -17,6 +17,9 @@ class JsonReceiptMessage { @JsonProperty final boolean isRead; + @JsonProperty + final boolean isViewed; + @JsonProperty final List timestamps; @@ -24,19 +27,21 @@ class JsonReceiptMessage { this.when = receiptMessage.getWhen(); this.isDelivery = receiptMessage.isDeliveryReceipt(); this.isRead = receiptMessage.isReadReceipt(); + this.isViewed = receiptMessage.isViewedReceipt(); this.timestamps = receiptMessage.getTimestamps(); } private JsonReceiptMessage( - final long when, final boolean isDelivery, final boolean isRead, final List timestamps + final long when, final boolean isDelivery, final boolean isRead, final boolean isViewed, final List timestamps ) { this.when = when; this.isDelivery = isDelivery; this.isRead = isRead; + this.isViewed = isViewed; this.timestamps = timestamps; } static JsonReceiptMessage deliveryReceipt(final long when, final List timestamps) { - return new JsonReceiptMessage(when, true, false, timestamps); + return new JsonReceiptMessage(when, true, false, false, timestamps); } }