]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java
Add RecipientIdentifier as external Manager interface
[signal-cli] / src / main / java / org / asamk / signal / json / JsonMessageEnvelope.java
1 package org.asamk.signal.json;
2
3 import com.fasterxml.jackson.annotation.JsonInclude;
4 import com.fasterxml.jackson.annotation.JsonProperty;
5
6 import org.asamk.Signal;
7 import org.asamk.signal.manager.Manager;
8 import org.asamk.signal.manager.api.RecipientIdentifier;
9 import org.signal.libsignal.metadata.ProtocolUntrustedIdentityException;
10 import org.whispersystems.signalservice.api.messages.SignalServiceContent;
11 import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
12 import org.whispersystems.signalservice.api.util.InvalidNumberException;
13
14 import java.util.List;
15 import java.util.UUID;
16
17 import static org.asamk.signal.util.Util.getLegacyIdentifier;
18
19 public class JsonMessageEnvelope {
20
21 @JsonProperty
22 @Deprecated
23 final String source;
24
25 @JsonProperty
26 final String sourceNumber;
27
28 @JsonProperty
29 final String sourceUuid;
30
31 @JsonProperty
32 final String sourceName;
33
34 @JsonProperty
35 final Integer sourceDevice;
36
37 @JsonProperty
38 @JsonInclude(JsonInclude.Include.NON_NULL)
39 final String relay;
40
41 @JsonProperty
42 final long timestamp;
43
44 @JsonProperty
45 @JsonInclude(JsonInclude.Include.NON_NULL)
46 final JsonDataMessage dataMessage;
47
48 @JsonProperty
49 @JsonInclude(JsonInclude.Include.NON_NULL)
50 final JsonSyncMessage syncMessage;
51
52 @JsonProperty
53 @JsonInclude(JsonInclude.Include.NON_NULL)
54 final JsonCallMessage callMessage;
55
56 @JsonProperty
57 @JsonInclude(JsonInclude.Include.NON_NULL)
58 final JsonReceiptMessage receiptMessage;
59
60 @JsonProperty
61 @JsonInclude(JsonInclude.Include.NON_NULL)
62 final JsonTypingMessage typingMessage;
63
64 public JsonMessageEnvelope(
65 SignalServiceEnvelope envelope, SignalServiceContent content, Throwable exception, Manager m
66 ) {
67 if (!envelope.isUnidentifiedSender() && envelope.hasSource()) {
68 var source = envelope.getSourceAddress();
69 this.source = getLegacyIdentifier(source);
70 this.sourceNumber = source.getNumber().orNull();
71 this.sourceUuid = source.getUuid().transform(UUID::toString).orNull();
72 this.sourceDevice = envelope.getSourceDevice();
73 this.relay = source.getRelay().orNull();
74 } else if (envelope.isUnidentifiedSender() && content != null) {
75 final var source = content.getSender();
76 this.source = getLegacyIdentifier(source);
77 this.sourceNumber = source.getNumber().orNull();
78 this.sourceUuid = source.getUuid().transform(UUID::toString).orNull();
79 this.sourceDevice = content.getSenderDevice();
80 this.relay = null;
81 } else if (exception instanceof ProtocolUntrustedIdentityException) {
82 var e = (ProtocolUntrustedIdentityException) exception;
83 final var source = m.resolveSignalServiceAddress(e.getSender());
84 this.source = getLegacyIdentifier(source);
85 this.sourceNumber = source.getNumber().orNull();
86 this.sourceUuid = source.getUuid().transform(UUID::toString).orNull();
87 this.sourceDevice = e.getSenderDevice();
88 this.relay = null;
89 } else {
90 this.source = null;
91 this.sourceNumber = null;
92 this.sourceUuid = null;
93 this.sourceDevice = null;
94 this.relay = null;
95 }
96 String name;
97 try {
98 name = m.getContactOrProfileName(RecipientIdentifier.Single.fromString(this.source, m.getUsername()));
99 } catch (InvalidNumberException | NullPointerException e) {
100 name = null;
101 }
102 this.sourceName = name;
103 this.timestamp = envelope.getTimestamp();
104 if (envelope.isReceipt()) {
105 this.receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp));
106 } else if (content != null && content.getReceiptMessage().isPresent()) {
107 this.receiptMessage = new JsonReceiptMessage(content.getReceiptMessage().get());
108 } else {
109 this.receiptMessage = null;
110 }
111 this.typingMessage = content != null && content.getTypingMessage().isPresent()
112 ? new JsonTypingMessage(content.getTypingMessage().get())
113 : null;
114
115 this.dataMessage = content != null && content.getDataMessage().isPresent()
116 ? new JsonDataMessage(content.getDataMessage().get(), m)
117 : null;
118 this.syncMessage = content != null && content.getSyncMessage().isPresent()
119 ? new JsonSyncMessage(content.getSyncMessage().get(), m)
120 : null;
121 this.callMessage = content != null && content.getCallMessage().isPresent()
122 ? new JsonCallMessage(content.getCallMessage().get())
123 : null;
124 }
125
126 public JsonMessageEnvelope(Signal.MessageReceived messageReceived) {
127 source = messageReceived.getSender();
128 sourceNumber = null;
129 sourceUuid = null;
130 sourceName = null;
131 sourceDevice = null;
132 relay = null;
133 timestamp = messageReceived.getTimestamp();
134 receiptMessage = null;
135 dataMessage = new JsonDataMessage(messageReceived);
136 syncMessage = null;
137 callMessage = null;
138 typingMessage = null;
139 }
140
141 public JsonMessageEnvelope(Signal.ReceiptReceived receiptReceived) {
142 source = receiptReceived.getSender();
143 sourceNumber = null;
144 sourceUuid = null;
145 sourceName = null;
146 sourceDevice = null;
147 relay = null;
148 timestamp = receiptReceived.getTimestamp();
149 receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp));
150 dataMessage = null;
151 syncMessage = null;
152 callMessage = null;
153 typingMessage = null;
154 }
155
156 public JsonMessageEnvelope(Signal.SyncMessageReceived messageReceived) {
157 source = messageReceived.getSource();
158 sourceNumber = null;
159 sourceUuid = null;
160 sourceName = null;
161 sourceDevice = null;
162 relay = null;
163 timestamp = messageReceived.getTimestamp();
164 receiptMessage = null;
165 dataMessage = null;
166 syncMessage = new JsonSyncMessage(messageReceived);
167 callMessage = null;
168 typingMessage = null;
169 }
170 }