]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/api/RecipientIdentifier.java
Update libsignal-service
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / api / RecipientIdentifier.java
index aa7ab54789fc0fde3469eb839e44214fd781386f..b1a3ad61d04c98f90ecf349268926320657b4805 100644 (file)
@@ -1,50 +1,67 @@
 package org.asamk.signal.manager.api;
 
-import org.asamk.signal.manager.groups.GroupId;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
+import org.asamk.signal.manager.util.PhoneNumberFormatter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
 import org.whispersystems.signalservice.api.util.UuidUtil;
 
 import java.util.UUID;
 
 public sealed interface RecipientIdentifier {
 
+    String getIdentifier();
+
     record NoteToSelf() implements RecipientIdentifier {
 
-        public static NoteToSelf INSTANCE = new NoteToSelf();
+        public static final NoteToSelf INSTANCE = new NoteToSelf();
+
+        @Override
+        public String getIdentifier() {
+            return "Note-To-Self";
+        }
     }
 
     sealed interface Single extends RecipientIdentifier {
 
         static Single fromString(String identifier, String localNumber) throws InvalidNumberException {
-            try {
-                if (UuidUtil.isUuid(identifier)) {
-                    return new Uuid(UUID.fromString(identifier));
-                }
+            if (UuidUtil.isUuid(identifier)) {
+                return new Uuid(UUID.fromString(identifier));
+            }
 
-                final var normalizedNumber = PhoneNumberFormatter.formatNumber(identifier, localNumber);
-                if (!normalizedNumber.equals(identifier)) {
-                    final Logger logger = LoggerFactory.getLogger(RecipientIdentifier.class);
-                    logger.debug("Normalized number {} to {}.", identifier, normalizedNumber);
+            if (identifier.startsWith("PNI:")) {
+                final var pni = identifier.substring(4);
+                if (!UuidUtil.isUuid(pni)) {
+                    throw new InvalidNumberException("Invalid PNI");
                 }
-                return new Number(normalizedNumber);
-            } catch (org.whispersystems.signalservice.api.util.InvalidNumberException e) {
-                throw new InvalidNumberException(e.getMessage(), e);
+                return new Pni(UUID.fromString(pni));
+            }
+
+            if (identifier.startsWith("u:")) {
+                return new Username(identifier.substring(2));
+            }
+
+            final var normalizedNumber = PhoneNumberFormatter.formatNumber(identifier, localNumber);
+            if (!normalizedNumber.equals(identifier)) {
+                final Logger logger = LoggerFactory.getLogger(RecipientIdentifier.class);
+                logger.debug("Normalized number {} to {}.", identifier, normalizedNumber);
             }
+            return new Number(normalizedNumber);
         }
 
         static Single fromAddress(RecipientAddress address) {
             if (address.number().isPresent()) {
                 return new Number(address.number().get());
-            } else if (address.uuid().isPresent()) {
-                return new Uuid(address.uuid().get());
+            } else if (address.aci().isPresent()) {
+                return new Uuid(UUID.fromString(address.aci().get()));
+            } else if (address.pni().isPresent()) {
+                return new Pni(UUID.fromString(address.pni().get().substring(4)));
+            } else if (address.username().isPresent()) {
+                return new Username(address.username().get());
             }
             throw new AssertionError("RecipientAddress without identifier");
         }
 
-        String getIdentifier();
+        RecipientAddress toPartialRecipientAddress();
     }
 
     record Uuid(UUID uuid) implements Single {
@@ -53,6 +70,24 @@ public sealed interface RecipientIdentifier {
         public String getIdentifier() {
             return uuid.toString();
         }
+
+        @Override
+        public RecipientAddress toPartialRecipientAddress() {
+            return new RecipientAddress(uuid);
+        }
+    }
+
+    record Pni(UUID pni) implements Single {
+
+        @Override
+        public String getIdentifier() {
+            return "PNI:" + pni.toString();
+        }
+
+        @Override
+        public RecipientAddress toPartialRecipientAddress() {
+            return new RecipientAddress(null, getIdentifier(), null, null);
+        }
     }
 
     record Number(String number) implements Single {
@@ -61,7 +96,31 @@ public sealed interface RecipientIdentifier {
         public String getIdentifier() {
             return number;
         }
+
+        @Override
+        public RecipientAddress toPartialRecipientAddress() {
+            return new RecipientAddress(number);
+        }
+    }
+
+    record Username(String username) implements Single {
+
+        @Override
+        public String getIdentifier() {
+            return "u:" + username;
+        }
+
+        @Override
+        public RecipientAddress toPartialRecipientAddress() {
+            return new RecipientAddress(null, null, null, username);
+        }
     }
 
-    record Group(GroupId groupId) implements RecipientIdentifier {}
+    record Group(GroupId groupId) implements RecipientIdentifier {
+
+        @Override
+        public String getIdentifier() {
+            return groupId.toBase64();
+        }
+    }
 }