#[arg(long)]
sticker: Option<String>,
+
+ #[arg(long)]
+ story_timestamp: Option<u64>,
+
+ #[arg(long)]
+ story_author: Option<String>,
},
SendContacts,
SendPaymentNotification {
#[allow(non_snake_case)] quoteMessage: Option<String>,
#[allow(non_snake_case)] quoteMention: Vec<String>,
sticker: Option<String>,
+ #[allow(non_snake_case)] storyTimestamp: Option<u64>,
+ #[allow(non_snake_case)] storyAuthor: Option<String>,
) -> Result<Value>;
#[rpc(name = "sendContacts", params = "named")]
quote_message,
quote_mention,
sticker,
+ story_timestamp,
+ story_author,
} => {
client
.send(
quote_message,
quote_mention,
sticker,
+ story_timestamp,
+ story_author,
)
.await
}
}
messageBuilder.withPreviews(previews);
}
+ if (message.storyReply().isPresent()) {
+ final var storyReply = message.storyReply().get();
+ final var authorServiceId = context.getRecipientHelper()
+ .resolveSignalServiceAddress(context.getRecipientHelper().resolveRecipient(storyReply.author()))
+ .getServiceId();
+ messageBuilder.withStoryContext(new SignalServiceDataMessage.StoryContext(authorServiceId,
+ storyReply.timestamp()));
+ }
}
private ArrayList<SignalServiceDataMessage.Mention> resolveMentions(final List<Message.Mention> mentionList) throws UnregisteredRecipientException {
List<Mention> mentions,
Optional<Quote> quote,
Optional<Sticker> sticker,
- List<Preview> previews
+ List<Preview> previews,
+ Optional<StoryReply> storyReply
) {
public record Mention(RecipientIdentifier.Single recipient, int start, int length) {}
public record Sticker(byte[] packId, int stickerId) {}
public record Preview(String url, String title, String description, Optional<String> image) {}
+
+ public record StoryReply(long timestamp, RecipientIdentifier.Single author) {}
}
*--preview-image*::
Specify the image file for the link preview (optional).
+*--story-timestamp*::
+Specify the timestamp of a story to reply to.
+
+*--story-author*::
+Specify the number of the author of the story.
+
*-e*, *--end-session*::
Clear session state and send end session message.
subparser.addArgument("--preview-title").help("Specify the title for the link preview (mandatory).");
subparser.addArgument("--preview-description").help("Specify the description for the link preview (optional).");
subparser.addArgument("--preview-image").help("Specify the image file for the link preview (optional).");
+ subparser.addArgument("--story-timestamp")
+ .type(long.class)
+ .help("Specify the timestamp of a story to reply to.");
+ subparser.addArgument("--story-author").help("Specify the number of the author of the story.");
}
@Override
previews = List.of();
}
+ final Message.StoryReply storyReply;
+ final var storyReplyTimestamp = ns.getLong("story-timestamp");
+ if (storyReplyTimestamp != null) {
+ final var storyAuthor = ns.getString("story-author");
+ storyReply = new Message.StoryReply(storyReplyTimestamp,
+ CommandUtil.getSingleRecipientIdentifier(storyAuthor, m.getSelfNumber()));
+ } else {
+ storyReply = null;
+ }
+
if (messageText.isEmpty() && attachments.isEmpty() && sticker == null && quote == null) {
throw new UserErrorException(
"Sending empty message is not allowed, either a message, attachment or sticker must be given.");
}
try {
- var results = m.sendMessage(new Message(messageText,
+ final var message = new Message(messageText,
attachments,
mentions,
Optional.ofNullable(quote),
Optional.ofNullable(sticker),
- previews), recipientIdentifiers);
+ previews,
+ Optional.ofNullable((storyReply)));
+ var results = m.sendMessage(message, recipientIdentifiers);
outputResult(outputWriter, results);
} catch (AttachmentInvalidException | IOException e) {
throw new UnexpectedErrorException("Failed to send message: " + e.getMessage() + " (" + e.getClass()
List.of(),
Optional.empty(),
Optional.empty(),
- List.of()),
+ List.of(),
+ Optional.empty()),
getSingleRecipientIdentifiers(recipients, m.getSelfNumber()).stream()
.map(RecipientIdentifier.class::cast)
.collect(Collectors.toSet()));
List.of(),
Optional.empty(),
Optional.empty(),
- List.of()), Set.of(RecipientIdentifier.NoteToSelf.INSTANCE));
+ List.of(),
+ Optional.empty()), Set.of(RecipientIdentifier.NoteToSelf.INSTANCE));
checkSendMessageResults(results);
return results.timestamp();
} catch (AttachmentInvalidException e) {
List.of(),
Optional.empty(),
Optional.empty(),
- List.of()), Set.of(getGroupRecipientIdentifier(groupId)));
+ List.of(),
+ Optional.empty()), Set.of(getGroupRecipientIdentifier(groupId)));
checkSendMessageResults(results);
return results.timestamp();
} catch (IOException | InvalidStickerException e) {