]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java
Implement sending message quotes
[signal-cli] / src / main / java / org / asamk / signal / json / JsonMessageEnvelope.java
index 3279d9419482206a9575777ac52bb7a0f664012a..b7e1cf2ac600147b74627c2834d3d455fce4f9e1 100644 (file)
@@ -1,66 +1,79 @@
 package org.asamk.signal.json;
 
-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 com.fasterxml.jackson.annotation.JsonInclude;
 
-public class JsonMessageEnvelope {
+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;
 
-    String source;
-    int sourceDevice;
-    String relay;
-    long timestamp;
-    boolean isReceipt;
-    JsonDataMessage dataMessage;
-    JsonSyncMessage syncMessage;
-    JsonCallMessage callMessage;
-    JsonReceiptMessage receiptMessage;
+import java.util.UUID;
 
-    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 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 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);
 
-    public JsonMessageEnvelope(Signal.MessageReceived messageReceived) {
-        source = messageReceived.getSender();
-        timestamp = messageReceived.getTimestamp();
-        dataMessage = new JsonDataMessage(messageReceived);
-    }
-
-    public JsonMessageEnvelope(Signal.ReceiptReceived receiptReceived) {
-        source = receiptReceived.getSender();
-        timestamp = receiptReceived.getTimestamp();
-        isReceipt = true;
-    }
+        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);
 
-    public JsonMessageEnvelope(Signal.SyncMessageReceived messageReceived) {
-        source = messageReceived.getSource();
-        timestamp = messageReceived.getTimestamp();
-        syncMessage = new JsonSyncMessage(messageReceived);
+        return new JsonMessageEnvelope(source,
+                sourceNumber,
+                sourceUuid,
+                sourceName,
+                sourceDevice,
+                timestamp,
+                dataMessage,
+                syncMessage,
+                callMessage,
+                receiptMessage,
+                typingMessage);
     }
 }