package org.asamk.signal.json;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
import org.asamk.Signal;
-import org.whispersystems.signalservice.api.messages.SignalServiceContent;
-import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
-import org.whispersystems.signalservice.api.push.SignalServiceAddress;
+import org.asamk.signal.manager.Manager;
+import org.asamk.signal.manager.UntrustedIdentityException;
+import org.asamk.signal.manager.api.InvalidNumberException;
+import org.asamk.signal.manager.api.MessageEnvelope;
+import org.asamk.signal.manager.api.RecipientIdentifier;
-public class JsonMessageEnvelope {
+import java.util.List;
+import java.util.UUID;
- String source;
- int sourceDevice;
- String relay;
- long timestamp;
- boolean isReceipt;
- JsonDataMessage dataMessage;
- JsonSyncMessage syncMessage;
- JsonCallMessage callMessage;
- JsonReceiptMessage receiptMessage;
+public record JsonMessageEnvelope(
+ @Deprecated String source,
+ String sourceNumber,
+ String sourceUuid,
+ String sourceName,
+ Integer sourceDevice,
+ long timestamp,
+ @JsonInclude(JsonInclude.Include.NON_NULL) JsonDataMessage dataMessage,
+ @JsonInclude(JsonInclude.Include.NON_NULL) JsonSyncMessage syncMessage,
+ @JsonInclude(JsonInclude.Include.NON_NULL) JsonCallMessage callMessage,
+ @JsonInclude(JsonInclude.Include.NON_NULL) JsonReceiptMessage receiptMessage,
+ @JsonInclude(JsonInclude.Include.NON_NULL) JsonTypingMessage typingMessage
+) {
- public JsonMessageEnvelope(SignalServiceEnvelope envelope, SignalServiceContent content) {
- if (!envelope.isUnidentifiedSender() && envelope.hasSource()) {
- SignalServiceAddress source = envelope.getSourceAddress();
- this.source = source.getNumber().get();
- this.relay = source.getRelay().isPresent() ? source.getRelay().get() : null;
+ public static JsonMessageEnvelope from(
+ MessageEnvelope envelope, Throwable exception, Manager m
+ ) {
+ final String source;
+ final String sourceNumber;
+ final String sourceUuid;
+ final Integer sourceDevice;
+ if (envelope.sourceAddress().isPresent()) {
+ final var sourceAddress = envelope.sourceAddress().get();
+ source = sourceAddress.getLegacyIdentifier();
+ sourceNumber = sourceAddress.getNumber().orElse(null);
+ sourceUuid = sourceAddress.getUuid().map(UUID::toString).orElse(null);
+ sourceDevice = envelope.sourceDevice();
+ } else if (exception instanceof UntrustedIdentityException e) {
+ final var sender = e.getSender();
+ source = sender.getLegacyIdentifier();
+ sourceNumber = sender.getNumber().orElse(null);
+ sourceUuid = sender.getUuid().map(UUID::toString).orElse(null);
+ sourceDevice = e.getSenderDevice();
+ } else {
+ source = null;
+ sourceNumber = null;
+ sourceUuid = null;
+ sourceDevice = null;
}
- this.sourceDevice = envelope.getSourceDevice();
- this.timestamp = envelope.getTimestamp();
- this.isReceipt = envelope.isReceipt();
- if (content != null) {
- if (envelope.isUnidentifiedSender()) {
- this.source = content.getSender().getNumber().get();
- this.sourceDevice = content.getSenderDevice();
- }
- if (content.getDataMessage().isPresent()) {
- this.dataMessage = new JsonDataMessage(content.getDataMessage().get());
- }
- if (content.getSyncMessage().isPresent()) {
- this.syncMessage = new JsonSyncMessage(content.getSyncMessage().get());
- }
- if (content.getCallMessage().isPresent()) {
- this.callMessage = new JsonCallMessage(content.getCallMessage().get());
- }
- if (content.getReceiptMessage().isPresent()) {
- this.receiptMessage = new JsonReceiptMessage(content.getReceiptMessage().get());
- }
+ String name;
+ try {
+ name = m.getContactOrProfileName(RecipientIdentifier.Single.fromString(source, m.getSelfNumber()));
+ } catch (InvalidNumberException | NullPointerException e) {
+ name = null;
}
+ final var sourceName = name;
+ final var timestamp = envelope.timestamp();
+ final var receiptMessage = envelope.receipt().map(JsonReceiptMessage::from).orElse(null);
+ final var typingMessage = envelope.typing().map(JsonTypingMessage::from).orElse(null);
+
+ final var dataMessage = envelope.data().map(JsonDataMessage::from).orElse(null);
+ final var syncMessage = envelope.sync().map(JsonSyncMessage::from).orElse(null);
+ final var callMessage = envelope.call().map(JsonCallMessage::from).orElse(null);
+
+ return new JsonMessageEnvelope(source,
+ sourceNumber,
+ sourceUuid,
+ sourceName,
+ sourceDevice,
+ timestamp,
+ dataMessage,
+ syncMessage,
+ callMessage,
+ receiptMessage,
+ typingMessage);
}
- public JsonMessageEnvelope(Signal.MessageReceived messageReceived) {
- source = messageReceived.getSender();
- timestamp = messageReceived.getTimestamp();
- dataMessage = new JsonDataMessage(messageReceived);
+ public static JsonMessageEnvelope from(Signal.MessageReceived messageReceived) {
+ return new JsonMessageEnvelope(messageReceived.getSource(),
+ null,
+ null,
+ null,
+ null,
+ messageReceived.getTimestamp(),
+ JsonDataMessage.from(messageReceived),
+ null,
+ null,
+ null,
+ null);
}
- public JsonMessageEnvelope(Signal.ReceiptReceived receiptReceived) {
- source = receiptReceived.getSender();
- timestamp = receiptReceived.getTimestamp();
- isReceipt = true;
+ public static JsonMessageEnvelope from(Signal.ReceiptReceived receiptReceived) {
+ return new JsonMessageEnvelope(receiptReceived.getSender(),
+ null,
+ null,
+ null,
+ null,
+ receiptReceived.getTimestamp(),
+ null,
+ null,
+ null,
+ JsonReceiptMessage.deliveryReceipt(receiptReceived.getTimestamp(),
+ List.of(receiptReceived.getTimestamp())),
+ null);
}
- public JsonMessageEnvelope(Signal.SyncMessageReceived messageReceived) {
- source = messageReceived.getSource();
- timestamp = messageReceived.getTimestamp();
- syncMessage = new JsonSyncMessage(messageReceived);
+ public static JsonMessageEnvelope from(Signal.SyncMessageReceived messageReceived) {
+ return new JsonMessageEnvelope(messageReceived.getSource(),
+ null,
+ null,
+ null,
+ null,
+ messageReceived.getTimestamp(),
+ null,
+ JsonSyncMessage.from(messageReceived),
+ null,
+ null,
+ null);
}
}