]> nmode's Git Repositories - signal-cli/blob - 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
1 package org.asamk.signal.manager;
2
3 import org.asamk.signal.manager.api.AccountCheckException;
4 import org.asamk.signal.manager.api.NotRegisteredException;
5 import org.asamk.signal.manager.config.ServiceEnvironment;
6 import org.asamk.signal.manager.storage.identities.TrustNewIdentity;
7 import org.slf4j.LoggerFactory;
8 import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
9
10 import java.io.File;
11 import java.io.IOException;
12 import java.net.URI;
13 import java.util.Arrays;
14 import java.util.List;
15 import java.util.Objects;
16 import java.util.concurrent.TimeoutException;
17 import java.util.function.Consumer;
18
19 public interface MultiAccountManager extends AutoCloseable {
20
21 static MultiAccountManager init(
22 final File settingsPath,
23 final ServiceEnvironment serviceEnvironment,
24 final String userAgent,
25 final TrustNewIdentity trustNewIdentity
26 ) {
27 final var logger = LoggerFactory.getLogger(MultiAccountManager.class);
28 final var managers = getAllLocalAccountNumbers(settingsPath).stream().map(a -> {
29 try {
30 return Manager.init(a, settingsPath, serviceEnvironment, userAgent, trustNewIdentity);
31 } catch (NotRegisteredException | IOException | AccountCheckException e) {
32 logger.warn("Ignoring {}: {} ({})", a, e.getMessage(), e.getClass().getSimpleName());
33 return null;
34 }
35 }).filter(Objects::nonNull).toList();
36
37 return new MultiAccountManagerImpl(managers, settingsPath, serviceEnvironment, userAgent);
38 }
39
40 static List<String> getAllLocalAccountNumbers(File settingsPath) {
41 var pathConfig = PathConfig.createDefault(settingsPath);
42 final var dataPath = pathConfig.dataPath();
43 final var files = dataPath.listFiles();
44
45 if (files == null) {
46 return List.of();
47 }
48
49 return Arrays.stream(files)
50 .filter(File::isFile)
51 .map(File::getName)
52 .filter(file -> PhoneNumberFormatter.isValidNumber(file, null))
53 .toList();
54 }
55
56 List<String> getAccountNumbers();
57
58 List<Manager> getManagers();
59
60 void addOnManagerAddedHandler(Consumer<Manager> handler);
61
62 void addOnManagerRemovedHandler(Consumer<Manager> handler);
63
64 Manager getManager(String phoneNumber);
65
66 URI getNewProvisioningDeviceLinkUri() throws TimeoutException, IOException;
67
68 ProvisioningManager getProvisioningManagerFor(URI deviceLinkUri);
69
70 RegistrationManager getNewRegistrationManager(String account) throws IOException;
71
72 @Override
73 void close();
74 }