+ final var selfNumber = m.getSelfNumber();
+
+ final var mentionStrings = ns.<String>getList("mention");
+ final var mentions = mentionStrings == null
+ ? List.<Message.Mention>of()
+ : parseMentions(selfNumber, mentionStrings);
+
+ final var textStyleStrings = ns.<String>getList("text-style");
+ final var textStyles = textStyleStrings == null ? List.<TextStyle>of() : parseTextStyles(textStyleStrings);
+
+ final Message.Quote quote;
+ final var quoteTimestamp = ns.getLong("quote-timestamp");
+ if (quoteTimestamp != null) {
+ final var quoteAuthor = ns.getString("quote-author");
+ final var quoteMessage = ns.getString("quote-message");
+ final var quoteMentionStrings = ns.<String>getList("quote-mention");
+ final var quoteMentions = quoteMentionStrings == null
+ ? List.<Message.Mention>of()
+ : parseMentions(selfNumber, quoteMentionStrings);
+ final var quoteTextStyleStrings = ns.<String>getList("quote-text-style");
+ final var quoteAttachmentStrings = ns.<String>getList("quote-attachment");
+ final var quoteTextStyles = quoteTextStyleStrings == null
+ ? List.<TextStyle>of()
+ : parseTextStyles(quoteTextStyleStrings);
+ final var quoteAttachments = quoteAttachmentStrings == null
+ ? List.<Message.Quote.Attachment>of()
+ : parseQuoteAttachments(quoteAttachmentStrings);
+ quote = new Message.Quote(quoteTimestamp,
+ CommandUtil.getSingleRecipientIdentifier(quoteAuthor, selfNumber),
+ quoteMessage == null ? "" : quoteMessage,
+ quoteMentions,
+ quoteTextStyles,
+ quoteAttachments);
+ } else {
+ quote = null;
+ }
+
+ final List<Message.Preview> previews;
+ final var previewUrl = ns.getString("preview-url");
+ if (previewUrl != null) {
+ final var previewTitle = ns.getString("preview-title");
+ final var previewDescription = ns.getString("preview-description");
+ final var previewImage = ns.getString("preview-image");
+ previews = List.of(new Message.Preview(previewUrl,
+ Optional.ofNullable(previewTitle).orElse(""),
+ Optional.ofNullable(previewDescription).orElse(""),
+ Optional.ofNullable(previewImage)));
+ } else {
+ 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, selfNumber));
+ } 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.");
+ }
+
+ final var editTimestamp = ns.getLong("edit-timestamp");
+