From b78573021d3789e1a4d3ec0db83855409674fdc1 Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 12 Nov 2021 12:10:46 +0100 Subject: [PATCH] Merge multiple SendReceiptActions to same recipient to only send one receipt --- graalvm-config-dir/resource-config.json | 6 +++++ .../org/asamk/signal/manager/ManagerImpl.java | 18 ++++++++++----- .../signal/manager/actions/HandleAction.java | 3 +++ .../manager/actions/SendReceiptAction.java | 22 ++++++++++++++----- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/graalvm-config-dir/resource-config.json b/graalvm-config-dir/resource-config.json index 3957fcad..5aabcdf9 100644 --- a/graalvm-config-dir/resource-config.json +++ b/graalvm-config-dir/resource-config.json @@ -52,9 +52,15 @@ { "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR\\E" }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL\\E" + }, { "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN\\E" }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT\\E" + }, { "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA\\E" }, diff --git a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java index 69ae9269..756c0a94 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java @@ -1028,7 +1028,8 @@ public class ManagerImpl implements Manager { ) throws IOException { retryFailedReceivedMessages(handler); - Set queuedActions = new HashSet<>(); + // Use a Map here because java Set doesn't have a get method ... + Map queuedActions = new HashMap<>(); final var signalWebSocket = dependencies.getSignalWebSocket(); signalWebSocket.connect(); @@ -1057,7 +1058,7 @@ public class ManagerImpl implements Manager { logger.debug("New message received from server"); } else { logger.debug("Received indicator that server queue is empty"); - handleQueuedActions(queuedActions); + handleQueuedActions(queuedActions.keySet()); queuedActions.clear(); hasCaughtUpWithOldMessages = true; @@ -1098,11 +1099,18 @@ public class ManagerImpl implements Manager { } final var result = incomingMessageHandler.handleEnvelope(envelope, ignoreAttachments, handler); - queuedActions.addAll(result.first()); + for (final var h : result.first()) { + final var existingAction = queuedActions.get(h); + if (existingAction == null) { + queuedActions.put(h, h); + } else { + existingAction.mergeOther(h); + } + } final var exception = result.second(); if (hasCaughtUpWithOldMessages) { - handleQueuedActions(queuedActions); + handleQueuedActions(queuedActions.keySet()); queuedActions.clear(); } if (cachedMessage[0] != null) { @@ -1123,7 +1131,7 @@ public class ManagerImpl implements Manager { } } } - handleQueuedActions(queuedActions); + handleQueuedActions(queuedActions.keySet()); queuedActions.clear(); dependencies.getSignalWebSocket().disconnect(); } diff --git a/lib/src/main/java/org/asamk/signal/manager/actions/HandleAction.java b/lib/src/main/java/org/asamk/signal/manager/actions/HandleAction.java index cfe13bce..b793b841 100644 --- a/lib/src/main/java/org/asamk/signal/manager/actions/HandleAction.java +++ b/lib/src/main/java/org/asamk/signal/manager/actions/HandleAction.java @@ -5,4 +5,7 @@ import org.asamk.signal.manager.jobs.Context; public interface HandleAction { void execute(Context context) throws Throwable; + + default void mergeOther(HandleAction action) { + } } diff --git a/lib/src/main/java/org/asamk/signal/manager/actions/SendReceiptAction.java b/lib/src/main/java/org/asamk/signal/manager/actions/SendReceiptAction.java index 8341304c..9dc3d3b9 100644 --- a/lib/src/main/java/org/asamk/signal/manager/actions/SendReceiptAction.java +++ b/lib/src/main/java/org/asamk/signal/manager/actions/SendReceiptAction.java @@ -3,34 +3,44 @@ package org.asamk.signal.manager.actions; import org.asamk.signal.manager.jobs.Context; import org.asamk.signal.manager.storage.recipients.RecipientId; +import java.util.ArrayList; import java.util.List; import java.util.Objects; public class SendReceiptAction implements HandleAction { private final RecipientId recipientId; - private final long timestamp; + private final List timestamps = new ArrayList<>(); public SendReceiptAction(final RecipientId recipientId, final long timestamp) { this.recipientId = recipientId; - this.timestamp = timestamp; + this.timestamps.add(timestamp); } @Override public void execute(Context context) throws Throwable { - context.getSendHelper().sendDeliveryReceipt(recipientId, List.of(timestamp)); + context.getSendHelper().sendDeliveryReceipt(recipientId, timestamps); + } + + @Override + public void mergeOther(final HandleAction action) { + if (action instanceof SendReceiptAction sendReceiptAction) { + this.timestamps.addAll(sendReceiptAction.timestamps); + } } @Override public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - final var that = (SendReceiptAction) o; - return timestamp == that.timestamp && recipientId.equals(that.recipientId); + final SendReceiptAction that = (SendReceiptAction) o; + // Using only recipientId here on purpose + return recipientId.equals(that.recipientId); } @Override public int hashCode() { - return Objects.hash(recipientId, timestamp); + // Using only recipientId here on purpose + return Objects.hash(recipientId); } } -- 2.50.1