]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/MultiAccountManagerImpl.java
Add MultiAccountManager
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / MultiAccountManagerImpl.java
1 package org.asamk.signal.manager;
2
3 import org.asamk.signal.manager.config.ServiceEnvironment;
4 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory;
6
7 import java.io.File;
8 import java.io.IOException;
9 import java.util.Collection;
10 import java.util.HashSet;
11 import java.util.List;
12 import java.util.Set;
13 import java.util.function.Consumer;
14 import java.util.stream.Collectors;
15
16 public class MultiAccountManagerImpl implements MultiAccountManager {
17
18 private final static Logger logger = LoggerFactory.getLogger(MultiAccountManagerImpl.class);
19
20 private final Set<Consumer<Manager>> onManagerAddedHandlers = new HashSet<>();
21 private final Set<Consumer<Manager>> onManagerRemovedHandlers = new HashSet<>();
22 private final Set<Manager> managers = new HashSet<>();
23 private final File dataPath;
24 private final ServiceEnvironment serviceEnvironment;
25 private final String userAgent;
26
27 public MultiAccountManagerImpl(
28 final Collection<Manager> managers,
29 final File dataPath,
30 final ServiceEnvironment serviceEnvironment,
31 final String userAgent
32 ) {
33 this.managers.addAll(managers);
34 this.dataPath = dataPath;
35 this.serviceEnvironment = serviceEnvironment;
36 this.userAgent = userAgent;
37 }
38
39 @Override
40 public List<String> getAccountNumbers() {
41 synchronized (managers) {
42 return managers.stream().map(Manager::getSelfNumber).collect(Collectors.toList());
43 }
44 }
45
46 void addManager(final Manager m) {
47 synchronized (managers) {
48 if (managers.contains(m)) {
49 return;
50 }
51 managers.add(m);
52 }
53 synchronized (onManagerAddedHandlers) {
54 for (final var handler : onManagerAddedHandlers) {
55 handler.accept(m);
56 }
57 }
58 }
59
60 @Override
61 public void addOnManagerAddedHandler(final Consumer<Manager> handler) {
62 synchronized (onManagerAddedHandlers) {
63 onManagerAddedHandlers.add(handler);
64 }
65 }
66
67 @Override
68 public void addOnManagerRemovedHandler(final Consumer<Manager> handler) {
69 synchronized (onManagerRemovedHandlers) {
70 onManagerRemovedHandlers.add(handler);
71 }
72 }
73
74 @Override
75 public Manager getManager(final String account) {
76 synchronized (managers) {
77 return managers.stream().filter(m -> m.getSelfNumber().equals(account)).findFirst().orElse(null);
78 }
79 }
80
81 @Override
82 public ProvisioningManager getNewProvisioningManager() {
83 return ProvisioningManager.init(dataPath, serviceEnvironment, userAgent, this::addManager);
84 }
85
86 @Override
87 public RegistrationManager getNewRegistrationManager(String account) throws IOException {
88 return RegistrationManager.init(account, dataPath, serviceEnvironment, userAgent, this::addManager);
89 }
90
91 @Override
92 public void close() {
93 synchronized (managers) {
94 for (var m : managers) {
95 try {
96 m.close();
97 } catch (IOException e) {
98 logger.warn("Cleanup failed", e);
99 }
100 }
101 managers.clear();
102 }
103 }
104 }