X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/b7005884fdcfa8d95f54e557ddbf2fe4201962f8..5cccf521032954d7ad8e3f70e3cbef2ce1293e85:/lib/src/main/java/org/asamk/signal/manager/MultiAccountManager.java diff --git a/lib/src/main/java/org/asamk/signal/manager/MultiAccountManager.java b/lib/src/main/java/org/asamk/signal/manager/MultiAccountManager.java index 7f041845..9f1cf2fd 100644 --- a/lib/src/main/java/org/asamk/signal/manager/MultiAccountManager.java +++ b/lib/src/main/java/org/asamk/signal/manager/MultiAccountManager.java @@ -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 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 getAccountNumbers(); + List getManagers(); + void addOnManagerAddedHandler(Consumer handler); void addOnManagerRemovedHandler(Consumer 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();