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