mirror of
https://github.com/AsamK/signal-cli
synced 2025-08-29 10:30:38 +00:00
Merge multiple SendReceiptActions to same recipient to only send one receipt
This commit is contained in:
parent
b7005884fd
commit
b78573021d
4 changed files with 38 additions and 11 deletions
|
@ -1028,7 +1028,8 @@ public class ManagerImpl implements Manager {
|
|||
) throws IOException {
|
||||
retryFailedReceivedMessages(handler);
|
||||
|
||||
Set<HandleAction> queuedActions = new HashSet<>();
|
||||
// Use a Map here because java Set doesn't have a get method ...
|
||||
Map<HandleAction, HandleAction> 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();
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<Long> 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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue