From d6b321dc19e5eab05e49d0b8b6f176050e311397 Mon Sep 17 00:00:00 2001 From: Tony Cebzanov Date: Thu, 9 Jul 2026 09:35:43 -0400 Subject: [PATCH] Resolve recipients before uploading story attachment Move recipient resolution ahead of the attachment upload so that an empty contact list is caught early without wasting bandwidth on an upload that would reach nobody. --- .../signal/manager/internal/ManagerImpl.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java index 72f16a95..3b812c5e 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java @@ -841,13 +841,6 @@ public class ManagerImpl implements Manager { throw new AttachmentInvalidException(attachment, new IOException("Stories only support image and video attachments")); } - final var uploadedAttachment = context.getAttachmentHelper().uploadAttachment(attachment); - final var storyMessage = SignalServiceStoryMessage.forFileAttachment(account.getProfileKey().serialize(), - null, - uploadedAttachment, - allowsReplies, - List.of()); - final var timestamp = getNextMessageTimestamp(); final var recipients = account.getRecipientStore() .getRecipients(true, Optional.of(false), Set.of(), Optional.empty()); @@ -857,6 +850,18 @@ public class ManagerImpl implements Manager { .map(r -> r.getRecipientId()) .collect(Collectors.toSet()); + if (recipientIds.isEmpty()) { + throw new IOException("No eligible contacts found for story delivery"); + } + + final var uploadedAttachment = context.getAttachmentHelper().uploadAttachment(attachment); + final var storyMessage = SignalServiceStoryMessage.forFileAttachment(account.getProfileKey().serialize(), + null, + uploadedAttachment, + allowsReplies, + List.of()); + final var timestamp = getNextMessageTimestamp(); + final var sendResults = context.getSendHelper() .sendStoryMessage(storyMessage, timestamp, recipientIds, allowsReplies);