]> nmode's Git Repositories - signal-cli/commitdiff
Send sync message for read/viewed receipt messages
authorAsamK <asamk@gmx.de>
Sun, 8 Sep 2024 06:51:33 +0000 (08:51 +0200)
committerAsamK <asamk@gmx.de>
Sun, 8 Sep 2024 06:51:33 +0000 (08:51 +0200)
Fixes #1570

lib/src/main/java/org/asamk/signal/manager/helper/SyncHelper.java
lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java

index db8ee935ee747f1f7a4169128c0691b7450bdb21..9af1f01fdce5d75a74a7546d022ef3735151ca3c 100644 (file)
@@ -19,6 +19,7 @@ import org.slf4j.LoggerFactory;
 import org.whispersystems.signalservice.api.messages.SendMessageResult;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream;
 import org.whispersystems.signalservice.api.messages.SendMessageResult;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream;
+import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.BlockedListMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.ConfigurationMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.ContactsMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.BlockedListMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.ConfigurationMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.ContactsMessage;
@@ -30,10 +31,13 @@ import org.whispersystems.signalservice.api.messages.multidevice.DeviceGroupsInp
 import org.whispersystems.signalservice.api.messages.multidevice.DeviceGroupsOutputStream;
 import org.whispersystems.signalservice.api.messages.multidevice.KeysMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.MessageRequestResponseMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.DeviceGroupsOutputStream;
 import org.whispersystems.signalservice.api.messages.multidevice.KeysMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.MessageRequestResponseMessage;
+import org.whispersystems.signalservice.api.messages.multidevice.ReadMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.RequestMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.StickerPackOperationMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.VerifiedMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.RequestMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.StickerPackOperationMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.VerifiedMessage;
+import org.whispersystems.signalservice.api.messages.multidevice.ViewedMessage;
+import org.whispersystems.signalservice.api.push.ServiceId;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.internal.push.SyncMessage;
 import org.whispersystems.signalservice.internal.push.http.ResumableUploadSpec;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.internal.push.SyncMessage;
 import org.whispersystems.signalservice.internal.push.http.ResumableUploadSpec;
@@ -89,6 +93,22 @@ public class SyncHelper {
                 .sendSyncMessage(SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.STORAGE_MANIFEST));
     }
 
                 .sendSyncMessage(SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.STORAGE_MANIFEST));
     }
 
+    public void sendSyncReceiptMessage(ServiceId sender, SignalServiceReceiptMessage receiptMessage) {
+        if (receiptMessage.isReadReceipt()) {
+            final var readMessages = receiptMessage.getTimestamps()
+                    .stream()
+                    .map(t -> new ReadMessage(sender, t))
+                    .toList();
+            context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forRead(readMessages));
+        } else if (receiptMessage.isViewedReceipt()) {
+            final var viewedMessages = receiptMessage.getTimestamps()
+                    .stream()
+                    .map(t -> new ViewedMessage(sender, t))
+                    .toList();
+            context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forViewed(viewedMessages));
+        }
+    }
+
     public void sendGroups() throws IOException {
         var groupsFile = IOUtils.createTempFile();
 
     public void sendGroups() throws IOException {
         var groupsFile = IOUtils.createTempFile();
 
index 480fa751f74e7909d5ceac75da8cd8f6284397e6..6549b088d8872403b4a7455e0dfacd8ddcd8216e 100644 (file)
@@ -704,8 +704,15 @@ public class ManagerImpl implements Manager {
             final SignalServiceReceiptMessage receiptMessage
     ) {
         try {
             final SignalServiceReceiptMessage receiptMessage
     ) {
         try {
-            final var result = context.getSendHelper()
-                    .sendReceiptMessage(receiptMessage, context.getRecipientHelper().resolveRecipient(sender));
+            final var recipientId = context.getRecipientHelper().resolveRecipient(sender);
+            final var result = context.getSendHelper().sendReceiptMessage(receiptMessage, recipientId);
+
+            final var serviceId = account.getRecipientAddressResolver()
+                    .resolveRecipientAddress(recipientId)
+                    .serviceId();
+            if (serviceId.isPresent()) {
+                context.getSyncHelper().sendSyncReceiptMessage(serviceId.get(), receiptMessage);
+            }
             return new SendMessageResults(timestamp, Map.of(sender, List.of(toSendMessageResult(result))));
         } catch (UnregisteredRecipientException e) {
             return new SendMessageResults(timestamp,
             return new SendMessageResults(timestamp, Map.of(sender, List.of(toSendMessageResult(result))));
         } catch (UnregisteredRecipientException e) {
             return new SendMessageResults(timestamp,