]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java
Refactor 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.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) {
75 var e = (UntrustedIdentityException) exception;
76 final var source = m.resolveSignalServiceAddress(e.getSender());
77 this.source = getLegacyIdentifier(source);
78 this.sourceNumber = source.getNumber().orNull();
79 this.sourceUuid = source.getUuid().toString();
80 this.sourceDevice = e.getSenderDevice();
81 } else {
82 this.source = null;
83 this.sourceNumber = null;
84 this.sourceUuid = null;
85 this.sourceDevice = null;
86 }
87 String name;
88 try {
89 name = m.getContactOrProfileName(RecipientIdentifier.Single.fromString(this.source, m.getSelfNumber()));
90 } catch (InvalidNumberException | NullPointerException e) {
91 name = null;
92 }
93 this.sourceName = name;
94 this.timestamp = envelope.getTimestamp();
95 if (envelope.isReceipt()) {
96 this.receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp));
97 } else if (content != null && content.getReceiptMessage().isPresent()) {
98 this.receiptMessage = new JsonReceiptMessage(content.getReceiptMessage().get());
99 } else {
100 this.receiptMessage = null;
101 }
102 this.typingMessage = content != null && content.getTypingMessage().isPresent()
103 ? new JsonTypingMessage(content.getTypingMessage().get())
104 : null;
105
106 this.dataMessage = content != null && content.getDataMessage().isPresent()
107 ? new JsonDataMessage(content.getDataMessage().get(), m)
108 : null;
109 this.syncMessage = content != null && content.getSyncMessage().isPresent()
110 ? new JsonSyncMessage(content.getSyncMessage().get(), m)
111 : null;
112 this.callMessage = content != null && content.getCallMessage().isPresent()
113 ? new JsonCallMessage(content.getCallMessage().get())
114 : null;
115 }
116
117 public JsonMessageEnvelope(Signal.MessageReceived messageReceived) {
118 source = messageReceived.getSender();
119 sourceNumber = null;
120 sourceUuid = null;
121 sourceName = null;
122 sourceDevice = null;
123 timestamp = messageReceived.getTimestamp();
124 receiptMessage = null;
125 dataMessage = new JsonDataMessage(messageReceived);
126 syncMessage = null;
127 callMessage = null;
128 typingMessage = null;
129 }
130
131 public JsonMessageEnvelope(Signal.ReceiptReceived receiptReceived) {
132 source = receiptReceived.getSender();
133 sourceNumber = null;
134 sourceUuid = null;
135 sourceName = null;
136 sourceDevice = null;
137 timestamp = receiptReceived.getTimestamp();
138 receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp));
139 dataMessage = null;
140 syncMessage = null;
141 callMessage = null;
142 typingMessage = null;
143 }
144
145 public JsonMessageEnvelope(Signal.SyncMessageReceived messageReceived) {
146 source = messageReceived.getSource();
147 sourceNumber = null;
148 sourceUuid = null;
149 sourceName = null;
150 sourceDevice = null;
151 timestamp = messageReceived.getTimestamp();
152 receiptMessage = null;
153 dataMessage = null;
154 syncMessage = new JsonSyncMessage(messageReceived);
155 callMessage = null;
156 typingMessage = null;
157 }
158 }