From: AsamK Date: Sun, 17 Jan 2021 10:23:02 +0000 (+0100) Subject: Make fields in json classes final and omit unnecessary nulls when serializing X-Git-Tag: v0.7.3~5 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/46a4c2c0d0a36b7f230fc2c2d47aa371a6e02d35 Make fields in json classes final and omit unnecessary nulls when serializing Fix sender in sync read messages --- diff --git a/src/main/java/org/asamk/signal/JsonWriter.java b/src/main/java/org/asamk/signal/JsonWriter.java index 3cc87514..26a20a1f 100644 --- a/src/main/java/org/asamk/signal/JsonWriter.java +++ b/src/main/java/org/asamk/signal/JsonWriter.java @@ -20,7 +20,7 @@ public class JsonWriter { this.writer = new OutputStreamWriter(writer, StandardCharsets.UTF_8); objectMapper = new ObjectMapper(); - objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.PUBLIC_ONLY); objectMapper.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET); } diff --git a/src/main/java/org/asamk/signal/json/JsonAttachment.java b/src/main/java/org/asamk/signal/json/JsonAttachment.java index 1949171a..1b2a7bc7 100644 --- a/src/main/java/org/asamk/signal/json/JsonAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonAttachment.java @@ -1,31 +1,45 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.whispersystems.signalservice.api.messages.SignalServiceAttachment; import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer; +import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream; class JsonAttachment { - String contentType; - String filename; - String id; - int size; + @JsonProperty + final String contentType; + + @JsonProperty + final String filename; + + @JsonProperty + final String id; + + @JsonProperty + final Long size; JsonAttachment(SignalServiceAttachment attachment) { this.contentType = attachment.getContentType(); - final SignalServiceAttachmentPointer pointer = attachment.asPointer(); if (attachment.isPointer()) { - this.id = String.valueOf(pointer.getRemoteId()); - if (pointer.getFileName().isPresent()) { - this.filename = pointer.getFileName().get(); - } - if (pointer.getSize().isPresent()) { - this.size = pointer.getSize().get(); - } + final SignalServiceAttachmentPointer pointer = attachment.asPointer(); + this.id = pointer.getRemoteId().toString(); + this.filename = pointer.getFileName().orNull(); + this.size = pointer.getSize().transform(Integer::longValue).orNull(); + } else { + final SignalServiceAttachmentStream stream = attachment.asStream(); + this.id = null; + this.filename = stream.getFileName().orNull(); + this.size = stream.getLength(); } } JsonAttachment(String filename) { this.filename = filename; + this.contentType = null; + this.id = null; + this.size = null; } } diff --git a/src/main/java/org/asamk/signal/json/JsonCallMessage.java b/src/main/java/org/asamk/signal/json/JsonCallMessage.java index c1b1d443..885c38a4 100644 --- a/src/main/java/org/asamk/signal/json/JsonCallMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonCallMessage.java @@ -1,5 +1,8 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.whispersystems.signalservice.api.messages.calls.AnswerMessage; import org.whispersystems.signalservice.api.messages.calls.BusyMessage; import org.whispersystems.signalservice.api.messages.calls.HangupMessage; @@ -11,27 +14,31 @@ import java.util.List; class JsonCallMessage { - OfferMessage offerMessage; - AnswerMessage answerMessage; - BusyMessage busyMessage; - HangupMessage hangupMessage; - List iceUpdateMessages; + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final OfferMessage offerMessage; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final AnswerMessage answerMessage; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final BusyMessage busyMessage; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final HangupMessage hangupMessage; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final List iceUpdateMessages; JsonCallMessage(SignalServiceCallMessage callMessage) { - if (callMessage.getOfferMessage().isPresent()) { - this.offerMessage = callMessage.getOfferMessage().get(); - } - if (callMessage.getAnswerMessage().isPresent()) { - this.answerMessage = callMessage.getAnswerMessage().get(); - } - if (callMessage.getBusyMessage().isPresent()) { - this.busyMessage = callMessage.getBusyMessage().get(); - } - if (callMessage.getHangupMessage().isPresent()) { - this.hangupMessage = callMessage.getHangupMessage().get(); - } - if (callMessage.getIceUpdateMessages().isPresent()) { - this.iceUpdateMessages = callMessage.getIceUpdateMessages().get(); - } + this.offerMessage = callMessage.getOfferMessage().orNull(); + this.answerMessage = callMessage.getAnswerMessage().orNull(); + this.busyMessage = callMessage.getBusyMessage().orNull(); + this.hangupMessage = callMessage.getHangupMessage().orNull(); + this.iceUpdateMessages = callMessage.getIceUpdateMessages().orNull(); } } diff --git a/src/main/java/org/asamk/signal/json/JsonDataMessage.java b/src/main/java/org/asamk/signal/json/JsonDataMessage.java index fd3f1efc..e755acad 100644 --- a/src/main/java/org/asamk/signal/json/JsonDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonDataMessage.java @@ -1,9 +1,13 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.asamk.Signal; import org.asamk.signal.manager.Manager; import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; import org.whispersystems.signalservice.api.messages.SignalServiceGroup; +import org.whispersystems.signalservice.api.messages.SignalServiceGroupContext; import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2; import java.util.List; @@ -11,38 +15,61 @@ import java.util.stream.Collectors; class JsonDataMessage { - long timestamp; - String message; - int expiresInSeconds; + @JsonProperty + final long timestamp; + + @JsonProperty + final String message; + + @JsonProperty + final Integer expiresInSeconds; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonReaction reaction; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonQuote quote; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final List mentions; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final List attachments; - JsonReaction reaction; - JsonQuote quote; - List mentions; - List attachments; - JsonSticker sticker; - JsonGroupInfo groupInfo; + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonSticker sticker; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonGroupInfo groupInfo; JsonDataMessage(SignalServiceDataMessage dataMessage, Manager m) { this.timestamp = dataMessage.getTimestamp(); if (dataMessage.getGroupContext().isPresent()) { - if (dataMessage.getGroupContext().get().getGroupV1().isPresent()) { - SignalServiceGroup groupInfo = dataMessage.getGroupContext().get().getGroupV1().get(); + final SignalServiceGroupContext groupContext = dataMessage.getGroupContext().get(); + if (groupContext.getGroupV1().isPresent()) { + SignalServiceGroup groupInfo = groupContext.getGroupV1().get(); this.groupInfo = new JsonGroupInfo(groupInfo); - } else if (dataMessage.getGroupContext().get().getGroupV2().isPresent()) { - SignalServiceGroupV2 groupInfo = dataMessage.getGroupContext().get().getGroupV2().get(); + } else if (groupContext.getGroupV2().isPresent()) { + SignalServiceGroupV2 groupInfo = groupContext.getGroupV2().get(); this.groupInfo = new JsonGroupInfo(groupInfo); + } else { + this.groupInfo = null; } + } else { + this.groupInfo = null; } - if (dataMessage.getBody().isPresent()) { - this.message = dataMessage.getBody().get(); - } + this.message = dataMessage.getBody().orNull(); this.expiresInSeconds = dataMessage.getExpiresInSeconds(); - if (dataMessage.getReaction().isPresent()) { - this.reaction = new JsonReaction(dataMessage.getReaction().get(), m); - } - if (dataMessage.getQuote().isPresent()) { - this.quote = new JsonQuote(dataMessage.getQuote().get(), m); - } + this.reaction = dataMessage.getReaction().isPresent() + ? new JsonReaction(dataMessage.getReaction().get(), m) + : null; + this.quote = dataMessage.getQuote().isPresent() ? new JsonQuote(dataMessage.getQuote().get(), m) : null; if (dataMessage.getMentions().isPresent()) { this.mentions = dataMessage.getMentions() .get() @@ -61,15 +88,14 @@ class JsonDataMessage { } else { this.attachments = List.of(); } - if (dataMessage.getSticker().isPresent()) { - this.sticker = new JsonSticker(dataMessage.getSticker().get()); - } + this.sticker = dataMessage.getSticker().isPresent() ? new JsonSticker(dataMessage.getSticker().get()) : null; } public JsonDataMessage(Signal.MessageReceived messageReceived) { timestamp = messageReceived.getTimestamp(); message = messageReceived.getMessage(); groupInfo = messageReceived.getGroupId().length > 0 ? new JsonGroupInfo(messageReceived.getGroupId()) : null; + expiresInSeconds = null; reaction = null; // TODO Replace these 4 with the proper commands quote = null; mentions = null; @@ -81,6 +107,7 @@ class JsonDataMessage { timestamp = messageReceived.getTimestamp(); message = messageReceived.getMessage(); groupInfo = messageReceived.getGroupId().length > 0 ? new JsonGroupInfo(messageReceived.getGroupId()) : null; + expiresInSeconds = null; reaction = null; // TODO Replace these 4 with the proper commands quote = null; mentions = null; diff --git a/src/main/java/org/asamk/signal/json/JsonError.java b/src/main/java/org/asamk/signal/json/JsonError.java index 29d85c8b..d8b3e5f5 100644 --- a/src/main/java/org/asamk/signal/json/JsonError.java +++ b/src/main/java/org/asamk/signal/json/JsonError.java @@ -1,8 +1,11 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonProperty; + public class JsonError { - String message; + @JsonProperty + final String message; public JsonError(Throwable exception) { this.message = exception.getMessage(); diff --git a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java index bc3e7e0e..d79941ed 100644 --- a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java +++ b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java @@ -1,41 +1,59 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.asamk.signal.manager.groups.GroupUtils; import org.whispersystems.signalservice.api.messages.SignalServiceGroup; import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2; import org.whispersystems.signalservice.api.push.SignalServiceAddress; -import java.util.ArrayList; import java.util.Base64; import java.util.List; +import java.util.stream.Collectors; class JsonGroupInfo { - String groupId; - List members; - String name; - String type; + @JsonProperty + final String groupId; + + @JsonProperty + final String type; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final String name; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final List members; JsonGroupInfo(SignalServiceGroup groupInfo) { this.groupId = Base64.getEncoder().encodeToString(groupInfo.getGroupId()); + this.type = groupInfo.getType().toString(); + this.name = groupInfo.getName().orNull(); if (groupInfo.getMembers().isPresent()) { - this.members = new ArrayList<>(groupInfo.getMembers().get().size()); - for (SignalServiceAddress address : groupInfo.getMembers().get()) { - this.members.add(address.getLegacyIdentifier()); - } - } - if (groupInfo.getName().isPresent()) { - this.name = groupInfo.getName().get(); + this.members = groupInfo.getMembers() + .get() + .stream() + .map(SignalServiceAddress::getLegacyIdentifier) + .collect(Collectors.toList()); + } else { + this.members = null; } - this.type = groupInfo.getType().toString(); } JsonGroupInfo(SignalServiceGroupV2 groupInfo) { this.groupId = GroupUtils.getGroupIdV2(groupInfo.getMasterKey()).toBase64(); this.type = groupInfo.hasSignedGroupChange() ? "UPDATE" : "DELIVER"; + this.members = null; + this.name = null; } JsonGroupInfo(byte[] groupId) { this.groupId = Base64.getEncoder().encodeToString(groupId); + this.type = "DELIVER"; + this.members = null; + this.name = null; } } diff --git a/src/main/java/org/asamk/signal/json/JsonMention.java b/src/main/java/org/asamk/signal/json/JsonMention.java index 302128ed..b6243041 100644 --- a/src/main/java/org/asamk/signal/json/JsonMention.java +++ b/src/main/java/org/asamk/signal/json/JsonMention.java @@ -1,14 +1,21 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.asamk.signal.manager.Manager; import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; import org.whispersystems.signalservice.api.push.SignalServiceAddress; public class JsonMention { - String name; - int start; - int length; + @JsonProperty + final String name; + + @JsonProperty + final int start; + + @JsonProperty + final int length; JsonMention(SignalServiceDataMessage.Mention mention, Manager m) { this.name = m.resolveSignalServiceAddress(new SignalServiceAddress(mention.getUuid(), null)) diff --git a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java index 787f62e2..2a87d129 100644 --- a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java +++ b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java @@ -1,5 +1,8 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.asamk.Signal; import org.asamk.signal.manager.Manager; import org.whispersystems.signalservice.api.messages.SignalServiceContent; @@ -10,61 +13,99 @@ import java.util.List; public class JsonMessageEnvelope { - String source; - int sourceDevice; - String relay; - long timestamp; - JsonDataMessage dataMessage; - JsonSyncMessage syncMessage; - JsonCallMessage callMessage; - JsonReceiptMessage receiptMessage; + @JsonProperty + final String source; + + @JsonProperty + final Integer sourceDevice; + + @JsonProperty + final String relay; + + @JsonProperty + final long timestamp; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonDataMessage dataMessage; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonSyncMessage syncMessage; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonCallMessage callMessage; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonReceiptMessage receiptMessage; public JsonMessageEnvelope(SignalServiceEnvelope envelope, SignalServiceContent content, Manager m) { if (!envelope.isUnidentifiedSender() && envelope.hasSource()) { SignalServiceAddress source = envelope.getSourceAddress(); this.source = source.getLegacyIdentifier(); - this.relay = source.getRelay().isPresent() ? source.getRelay().get() : null; + this.sourceDevice = envelope.getSourceDevice(); + this.relay = source.getRelay().orNull(); + } else if (envelope.isUnidentifiedSender() && content != null) { + this.source = content.getSender().getLegacyIdentifier(); + this.sourceDevice = content.getSenderDevice(); + this.relay = null; + } else { + this.source = null; + this.sourceDevice = null; + this.relay = null; } - this.sourceDevice = envelope.getSourceDevice(); this.timestamp = envelope.getTimestamp(); if (envelope.isReceipt()) { this.receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp)); + } else if (content != null && content.getReceiptMessage().isPresent()) { + this.receiptMessage = new JsonReceiptMessage(content.getReceiptMessage().get()); + } else { + this.receiptMessage = null; } - if (content != null) { - if (envelope.isUnidentifiedSender()) { - this.source = content.getSender().getLegacyIdentifier(); - this.sourceDevice = content.getSenderDevice(); - } - if (content.getDataMessage().isPresent()) { - this.dataMessage = new JsonDataMessage(content.getDataMessage().get(), m); - } - if (content.getSyncMessage().isPresent()) { - this.syncMessage = new JsonSyncMessage(content.getSyncMessage().get(), m); - } - if (content.getCallMessage().isPresent()) { - this.callMessage = new JsonCallMessage(content.getCallMessage().get()); - } - if (content.getReceiptMessage().isPresent()) { - this.receiptMessage = new JsonReceiptMessage(content.getReceiptMessage().get()); - } - } + + this.dataMessage = content != null && content.getDataMessage().isPresent() + ? new JsonDataMessage(content.getDataMessage().get(), m) + : null; + this.syncMessage = content != null && content.getSyncMessage().isPresent() + ? new JsonSyncMessage(content.getSyncMessage().get(), m) + : null; + this.callMessage = content != null && content.getCallMessage().isPresent() + ? new JsonCallMessage(content.getCallMessage().get()) + : null; } public JsonMessageEnvelope(Signal.MessageReceived messageReceived) { source = messageReceived.getSender(); + sourceDevice = null; + relay = null; timestamp = messageReceived.getTimestamp(); + receiptMessage = null; dataMessage = new JsonDataMessage(messageReceived); + syncMessage = null; + callMessage = null; } public JsonMessageEnvelope(Signal.ReceiptReceived receiptReceived) { source = receiptReceived.getSender(); + sourceDevice = null; + relay = null; timestamp = receiptReceived.getTimestamp(); receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp)); + dataMessage = null; + syncMessage = null; + callMessage = null; } public JsonMessageEnvelope(Signal.SyncMessageReceived messageReceived) { source = messageReceived.getSource(); + sourceDevice = null; + relay = null; timestamp = messageReceived.getTimestamp(); + receiptMessage = null; + dataMessage = null; syncMessage = new JsonSyncMessage(messageReceived); + callMessage = null; } } diff --git a/src/main/java/org/asamk/signal/json/JsonQuote.java b/src/main/java/org/asamk/signal/json/JsonQuote.java index 10cd0bf4..8165bcfa 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuote.java +++ b/src/main/java/org/asamk/signal/json/JsonQuote.java @@ -1,5 +1,8 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.asamk.signal.manager.Manager; import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; @@ -9,12 +12,21 @@ import java.util.stream.Collectors; public class JsonQuote { - long id; - String author; - String text; + @JsonProperty + final long id; + + @JsonProperty + final String author; + + @JsonProperty + final String text; - List mentions; - List attachments; + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final List mentions; + + @JsonProperty + final List attachments; JsonQuote(SignalServiceDataMessage.Quote quote, Manager m) { this.id = quote.getId(); @@ -26,6 +38,8 @@ public class JsonQuote { .stream() .map(quotedMention -> new JsonMention(quotedMention, m)) .collect(Collectors.toList()); + } else { + this.mentions = null; } if (quote.getAttachments().size() > 0) { diff --git a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java index bcbbe2a5..f3f809dc 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java @@ -1,12 +1,21 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; public class JsonQuotedAttachment { - String contentType; - String filename; - JsonAttachment thumbnail; + @JsonProperty + final String contentType; + + @JsonProperty + final String filename; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonAttachment thumbnail; JsonQuotedAttachment(SignalServiceDataMessage.Quote.QuotedAttachment quotedAttachment) { contentType = quotedAttachment.getContentType(); diff --git a/src/main/java/org/asamk/signal/json/JsonReaction.java b/src/main/java/org/asamk/signal/json/JsonReaction.java index 5e978fe0..2fa15b48 100644 --- a/src/main/java/org/asamk/signal/json/JsonReaction.java +++ b/src/main/java/org/asamk/signal/json/JsonReaction.java @@ -1,14 +1,23 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.asamk.signal.manager.Manager; import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage.Reaction; public class JsonReaction { - String emoji; - String targetAuthor; - long targetSentTimestamp; - boolean isRemove; + @JsonProperty + final String emoji; + + @JsonProperty + final String targetAuthor; + + @JsonProperty + final long targetSentTimestamp; + + @JsonProperty + final boolean isRemove; JsonReaction(Reaction reaction, Manager m) { this.emoji = reaction.getEmoji(); diff --git a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java index ccd5960b..e32009e1 100644 --- a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java @@ -1,25 +1,29 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage; import java.util.List; class JsonReceiptMessage { - long when; - boolean isDelivery; - boolean isRead; - List timestamps; + @JsonProperty + final long when; - JsonReceiptMessage(SignalServiceReceiptMessage receiptMessage) { + @JsonProperty + final boolean isDelivery; + + @JsonProperty + final boolean isRead; + @JsonProperty + final List timestamps; + + JsonReceiptMessage(SignalServiceReceiptMessage receiptMessage) { this.when = receiptMessage.getWhen(); - if (receiptMessage.isDeliveryReceipt()) { - this.isDelivery = true; - } - if (receiptMessage.isReadReceipt()) { - this.isRead = true; - } + this.isDelivery = receiptMessage.isDeliveryReceipt(); + this.isRead = receiptMessage.isReadReceipt(); this.timestamps = receiptMessage.getTimestamps(); } diff --git a/src/main/java/org/asamk/signal/json/JsonSticker.java b/src/main/java/org/asamk/signal/json/JsonSticker.java index ea7a5815..e56ddf3f 100644 --- a/src/main/java/org/asamk/signal/json/JsonSticker.java +++ b/src/main/java/org/asamk/signal/json/JsonSticker.java @@ -1,19 +1,25 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; import java.util.Base64; public class JsonSticker { - String packId; - String packKey; - int stickerId; + @JsonProperty + final String packId; + + @JsonProperty + final String packKey; + + @JsonProperty + final int stickerId; public JsonSticker(SignalServiceDataMessage.Sticker sticker) { this.packId = Base64.getEncoder().encodeToString(sticker.getPackId()); this.packKey = Base64.getEncoder().encodeToString(sticker.getPackKey()); this.stickerId = sticker.getStickerId(); - // TODO also download sticker image ?? } } diff --git a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java index 7ea75bbd..d93351f1 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java @@ -1,18 +1,23 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.asamk.Signal; import org.asamk.signal.manager.Manager; import org.whispersystems.signalservice.api.messages.multidevice.SentTranscriptMessage; +import org.whispersystems.signalservice.api.push.SignalServiceAddress; class JsonSyncDataMessage extends JsonDataMessage { - String destination; + @JsonProperty + final String destination; JsonSyncDataMessage(SentTranscriptMessage transcriptMessage, Manager m) { super(transcriptMessage.getMessage(), m); - if (transcriptMessage.getDestination().isPresent()) { - this.destination = transcriptMessage.getDestination().get().getLegacyIdentifier(); - } + + this.destination = transcriptMessage.getDestination() + .transform(SignalServiceAddress::getLegacyIdentifier) + .orNull(); } JsonSyncDataMessage(Signal.SyncMessageReceived messageReceived) { diff --git a/src/main/java/org/asamk/signal/json/JsonSyncMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncMessage.java index f29bc02e..11ecbbc8 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncMessage.java @@ -1,13 +1,16 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.asamk.Signal; import org.asamk.signal.manager.Manager; -import org.whispersystems.signalservice.api.messages.multidevice.ReadMessage; import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; import org.whispersystems.signalservice.api.push.SignalServiceAddress; -import java.util.ArrayList; +import java.util.Base64; import java.util.List; +import java.util.stream.Collectors; enum JsonSyncMessageType { CONTACTS_SYNC, @@ -17,23 +20,57 @@ enum JsonSyncMessageType { class JsonSyncMessage { - JsonSyncDataMessage sentMessage; - List blockedNumbers; - List readMessages; - JsonSyncMessageType type; + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonSyncDataMessage sentMessage; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final List blockedNumbers; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final List blockedGroupIds; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final List readMessages; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonSyncMessageType type; JsonSyncMessage(SignalServiceSyncMessage syncMessage, Manager m) { - if (syncMessage.getSent().isPresent()) { - this.sentMessage = new JsonSyncDataMessage(syncMessage.getSent().get(), m); - } + this.sentMessage = syncMessage.getSent().isPresent() + ? new JsonSyncDataMessage(syncMessage.getSent().get(), m) + : null; if (syncMessage.getBlockedList().isPresent()) { - this.blockedNumbers = new ArrayList<>(syncMessage.getBlockedList().get().getAddresses().size()); - for (SignalServiceAddress address : syncMessage.getBlockedList().get().getAddresses()) { - this.blockedNumbers.add(address.getLegacyIdentifier()); - } + final Base64.Encoder base64 = Base64.getEncoder(); + this.blockedNumbers = syncMessage.getBlockedList() + .get() + .getAddresses() + .stream() + .map(SignalServiceAddress::getLegacyIdentifier) + .collect(Collectors.toList()); + this.blockedGroupIds = syncMessage.getBlockedList() + .get() + .getGroupIds() + .stream() + .map(base64::encodeToString) + .collect(Collectors.toList()); + } else { + this.blockedNumbers = null; + this.blockedGroupIds = null; } if (syncMessage.getRead().isPresent()) { - this.readMessages = syncMessage.getRead().get(); + this.readMessages = syncMessage.getRead() + .get() + .stream() + .map(message -> new JsonSyncReadMessage(message.getSender().getLegacyIdentifier(), + message.getTimestamp())) + .collect(Collectors.toList()); + } else { + this.readMessages = null; } if (syncMessage.getContacts().isPresent()) { @@ -42,10 +79,16 @@ class JsonSyncMessage { this.type = JsonSyncMessageType.GROUPS_SYNC; } else if (syncMessage.getRequest().isPresent()) { this.type = JsonSyncMessageType.REQUEST_SYNC; + } else { + this.type = null; } } JsonSyncMessage(Signal.SyncMessageReceived messageReceived) { - sentMessage = new JsonSyncDataMessage(messageReceived); + this.sentMessage = new JsonSyncDataMessage(messageReceived); + this.blockedNumbers = null; + this.blockedGroupIds = null; + this.readMessages = null; + this.type = null; } } diff --git a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java new file mode 100644 index 00000000..d65b0672 --- /dev/null +++ b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java @@ -0,0 +1,17 @@ +package org.asamk.signal.json; + +import com.fasterxml.jackson.annotation.JsonProperty; + +class JsonSyncReadMessage { + + @JsonProperty + final String sender; + + @JsonProperty + final long timestamp; + + public JsonSyncReadMessage(final String sender, final long timestamp) { + this.sender = sender; + this.timestamp = timestamp; + } +}