]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/helper/RecipientHelper.java
Extend getUserStatus command for usernames
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / helper / RecipientHelper.java
index 905bbd5a3d67a848a1794dfd67c74c21c50848a9..1581c1a5112aa7bace07330de18ecfdfe6a364d5 100644 (file)
@@ -91,28 +91,51 @@ public class RecipientHelper {
             });
         } else if (recipient instanceof RecipientIdentifier.Username usernameRecipient) {
             var username = usernameRecipient.username();
-            try {
-                UsernameLinkUrl usernameLinkUrl = UsernameLinkUrl.fromUri(username);
-                final var components = usernameLinkUrl.getComponents();
-                final var encryptedUsername = dependencies.getAccountManager()
-                        .getEncryptedUsernameFromLinkServerId(components.getServerId());
-                final var link = new Username.UsernameLink(components.getEntropy(), encryptedUsername);
+            return resolveRecipientByUsernameOrLink(username, false);
+        }
+        throw new AssertionError("Unexpected RecipientIdentifier: " + recipient);
+    }
 
-                username = Username.fromLink(link).getUsername();
-            } catch (UsernameLinkUrl.InvalidUsernameLinkException e) {
-            } catch (IOException | BaseUsernameException e) {
-                throw new RuntimeException(e);
+    public RecipientId resolveRecipientByUsernameOrLink(
+            String username, boolean forceRefresh
+    ) throws UnregisteredRecipientException {
+        final Username finalUsername;
+        try {
+            finalUsername = getUsernameFromUsernameOrLink(username);
+        } catch (IOException | BaseUsernameException e) {
+            throw new RuntimeException(e);
+        }
+        if (forceRefresh) {
+            try {
+                final var aci = dependencies.getAccountManager().getAciByUsername(finalUsername);
+                return account.getRecipientStore().resolveRecipientTrusted(aci, finalUsername.getUsername());
+            } catch (IOException e) {
+                throw new UnregisteredRecipientException(new org.asamk.signal.manager.api.RecipientAddress(null,
+                        null,
+                        username));
             }
-            final String finalUsername = username;
-            return account.getRecipientStore().resolveRecipientByUsername(finalUsername, () -> {
-                try {
-                    return getRegisteredUserByUsername(finalUsername);
-                } catch (Exception e) {
-                    return null;
-                }
-            });
         }
-        throw new AssertionError("Unexpected RecipientIdentifier: " + recipient);
+        return account.getRecipientStore().resolveRecipientByUsername(finalUsername.getUsername(), () -> {
+            try {
+                return dependencies.getAccountManager().getAciByUsername(finalUsername);
+            } catch (Exception e) {
+                return null;
+            }
+        });
+    }
+
+    private Username getUsernameFromUsernameOrLink(String username) throws BaseUsernameException, IOException {
+        try {
+            final var usernameLinkUrl = UsernameLinkUrl.fromUri(username);
+            final var components = usernameLinkUrl.getComponents();
+            final var encryptedUsername = dependencies.getAccountManager()
+                    .getEncryptedUsernameFromLinkServerId(components.getServerId());
+            final var link = new Username.UsernameLink(components.getEntropy(), encryptedUsername);
+
+            return Username.fromLink(link);
+        } catch (UsernameLinkUrl.InvalidUsernameLinkException e) {
+            return new Username(username);
+        }
     }
 
     public Optional<RecipientId> resolveRecipientOptional(final RecipientIdentifier.Single recipient) {
@@ -246,10 +269,6 @@ public class RecipientHelper {
         return registeredUsers;
     }
 
-    private ACI getRegisteredUserByUsername(String username) throws IOException, BaseUsernameException {
-        return dependencies.getAccountManager().getAciByUsername(new Username(username));
-    }
-
     public record RegisteredUser(Optional<ACI> aci, Optional<PNI> pni) {
 
         public RegisteredUser {