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