1 package org
.asamk
.signal
.json
;
3 import com
.fasterxml
.jackson
.annotation
.JsonInclude
;
4 import com
.fasterxml
.jackson
.annotation
.JsonProperty
;
6 import org
.asamk
.Signal
;
7 import org
.asamk
.signal
.manager
.Manager
;
8 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceContent
;
9 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceEnvelope
;
10 import org
.whispersystems
.signalservice
.api
.util
.InvalidNumberException
;
12 import java
.util
.List
;
13 import java
.util
.UUID
;
15 import static org
.asamk
.signal
.util
.Util
.getLegacyIdentifier
;
17 public class JsonMessageEnvelope
{
24 final String sourceNumber
;
27 final String sourceUuid
;
30 final String sourceName
;
33 final Integer sourceDevice
;
36 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
43 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
44 final JsonDataMessage dataMessage
;
47 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
48 final JsonSyncMessage syncMessage
;
51 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
52 final JsonCallMessage callMessage
;
55 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
56 final JsonReceiptMessage receiptMessage
;
59 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
60 final JsonTypingMessage typingMessage
;
62 public JsonMessageEnvelope(SignalServiceEnvelope envelope
, SignalServiceContent content
, Manager m
) {
63 if (!envelope
.isUnidentifiedSender() && envelope
.hasSource()) {
64 var source
= envelope
.getSourceAddress();
65 this.source
= getLegacyIdentifier(source
);
66 this.sourceNumber
= source
.getNumber().orNull();
67 this.sourceUuid
= source
.getUuid().transform(UUID
::toString
).orNull();
68 this.sourceDevice
= envelope
.getSourceDevice();
69 this.relay
= source
.getRelay().orNull();
70 } else if (envelope
.isUnidentifiedSender() && content
!= null) {
71 final var source
= content
.getSender();
72 this.source
= getLegacyIdentifier(source
);
73 this.sourceNumber
= source
.getNumber().orNull();
74 this.sourceUuid
= source
.getUuid().transform(UUID
::toString
).orNull();
75 this.sourceDevice
= content
.getSenderDevice();
79 this.sourceNumber
= null;
80 this.sourceUuid
= null;
81 this.sourceDevice
= null;
86 name
= m
.getContactOrProfileName(this.source
);
87 } catch (InvalidNumberException
| NullPointerException e
) {
90 this.sourceName
= name
;
91 this.timestamp
= envelope
.getTimestamp();
92 if (envelope
.isReceipt()) {
93 this.receiptMessage
= JsonReceiptMessage
.deliveryReceipt(timestamp
, List
.of(timestamp
));
94 } else if (content
!= null && content
.getReceiptMessage().isPresent()) {
95 this.receiptMessage
= new JsonReceiptMessage(content
.getReceiptMessage().get());
97 this.receiptMessage
= null;
99 this.typingMessage
= content
!= null && content
.getTypingMessage().isPresent()
100 ?
new JsonTypingMessage(content
.getTypingMessage().get())
103 this.dataMessage
= content
!= null && content
.getDataMessage().isPresent()
104 ?
new JsonDataMessage(content
.getDataMessage().get(), m
)
106 this.syncMessage
= content
!= null && content
.getSyncMessage().isPresent()
107 ?
new JsonSyncMessage(content
.getSyncMessage().get(), m
)
109 this.callMessage
= content
!= null && content
.getCallMessage().isPresent()
110 ?
new JsonCallMessage(content
.getCallMessage().get())
114 public JsonMessageEnvelope(Signal
.MessageReceived messageReceived
) {
115 source
= messageReceived
.getSender();
121 timestamp
= messageReceived
.getTimestamp();
122 receiptMessage
= null;
123 dataMessage
= new JsonDataMessage(messageReceived
);
126 typingMessage
= null;
129 public JsonMessageEnvelope(Signal
.ReceiptReceived receiptReceived
) {
130 source
= receiptReceived
.getSender();
136 timestamp
= receiptReceived
.getTimestamp();
137 receiptMessage
= JsonReceiptMessage
.deliveryReceipt(timestamp
, List
.of(timestamp
));
141 typingMessage
= null;
144 public JsonMessageEnvelope(Signal
.SyncMessageReceived messageReceived
) {
145 source
= messageReceived
.getSource();
151 timestamp
= messageReceived
.getTimestamp();
152 receiptMessage
= null;
154 syncMessage
= new JsonSyncMessage(messageReceived
);
156 typingMessage
= null;