]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/MultiAccountManager.java
Cleanup manager package
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / MultiAccountManager.java
index 7f041845d0e16e161ff0e87a64f4b5c32a00f008..9f1cf2fd4035aa7d76e460d86f6664eb1ba8a1a3 100644 (file)
@@ -1,15 +1,62 @@
 package org.asamk.signal.manager;
 
+import org.asamk.signal.manager.api.AccountCheckException;
+import org.asamk.signal.manager.api.NotRegisteredException;
+import org.asamk.signal.manager.config.ServiceEnvironment;
+import org.asamk.signal.manager.storage.identities.TrustNewIdentity;
+import org.slf4j.LoggerFactory;
+import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
+
+import java.io.File;
 import java.io.IOException;
 import java.net.URI;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.TimeoutException;
 import java.util.function.Consumer;
 
 public interface MultiAccountManager extends AutoCloseable {
 
+    static MultiAccountManager init(
+            final File settingsPath,
+            final ServiceEnvironment serviceEnvironment,
+            final String userAgent,
+            final TrustNewIdentity trustNewIdentity
+    ) {
+        final var logger = LoggerFactory.getLogger(MultiAccountManager.class);
+        final var managers = getAllLocalAccountNumbers(settingsPath).stream().map(a -> {
+            try {
+                return Manager.init(a, settingsPath, serviceEnvironment, userAgent, trustNewIdentity);
+            } catch (NotRegisteredException | IOException | AccountCheckException e) {
+                logger.warn("Ignoring {}: {} ({})", a, e.getMessage(), e.getClass().getSimpleName());
+                return null;
+            }
+        }).filter(Objects::nonNull).toList();
+
+        return new MultiAccountManagerImpl(managers, settingsPath, serviceEnvironment, userAgent);
+    }
+
+    static List<String> getAllLocalAccountNumbers(File settingsPath) {
+        var pathConfig = PathConfig.createDefault(settingsPath);
+        final var dataPath = pathConfig.dataPath();
+        final var files = dataPath.listFiles();
+
+        if (files == null) {
+            return List.of();
+        }
+
+        return Arrays.stream(files)
+                .filter(File::isFile)
+                .map(File::getName)
+                .filter(file -> PhoneNumberFormatter.isValidNumber(file, null))
+                .toList();
+    }
+
     List<String> getAccountNumbers();
 
+    List<Manager> getManagers();
+
     void addOnManagerAddedHandler(Consumer<Manager> handler);
 
     void addOnManagerRemovedHandler(Consumer<Manager> handler);
@@ -20,9 +67,7 @@ public interface MultiAccountManager extends AutoCloseable {
 
     ProvisioningManager getProvisioningManagerFor(URI deviceLinkUri);
 
-    ProvisioningManager getNewProvisioningManager();
-
-    RegistrationManager getNewRegistrationManager(String username) throws IOException;
+    RegistrationManager getNewRegistrationManager(String account) throws IOException;
 
     @Override
     void close();