"queryAllDeclaredMethods":true,
"queryAllDeclaredConstructors":true,
"methods":[
+ {"name":"<init>","parameterTypes":["java.lang.String","java.lang.String","org.asamk.signal.manager.storage.stickerPacks.JsonStickerPack$JsonSticker","java.util.List"] },
{"name":"author","parameterTypes":[] },
{"name":"cover","parameterTypes":[] },
{"name":"stickers","parameterTypes":[] },
"queryAllDeclaredMethods":true,
"queryAllDeclaredConstructors":true,
"methods":[
+ {"name":"<init>","parameterTypes":["java.lang.Integer","java.lang.String","java.lang.String","java.lang.String"] },
{"name":"contentType","parameterTypes":[] },
{"name":"emoji","parameterTypes":[] },
{"name":"file","parameterTypes":[] },
}
public MultiAccountManager initMultiAccountManager() {
- final var managers = getAllLocalAccountNumbers().stream().map(a -> {
+ final var managers = accountsStore.getAllAccounts().parallelStream().map(a -> {
try {
- return initManager(a);
+ return initManager(a.path());
} catch (NotRegisteredException | IOException | AccountCheckException e) {
- logger.warn("Ignoring {}: {} ({})", a, e.getMessage(), e.getClass().getSimpleName());
+ logger.warn("Ignoring {}: {} ({})", a.number(), e.getMessage(), e.getClass().getSimpleName());
return null;
}
}).filter(Objects::nonNull).toList();
public Manager initManager(String number) throws IOException, NotRegisteredException, AccountCheckException {
final var accountPath = accountsStore.getPathByNumber(number);
- if (accountPath == null || !SignalAccount.accountFileExists(pathConfig.dataPath(), accountPath)) {
+ return this.initManager(number, accountPath);
+ }
+
+ private Manager initManager(
+ String number, String accountPath
+ ) throws IOException, NotRegisteredException, AccountCheckException {
+ if (accountPath == null) {
+ throw new NotRegisteredException();
+ }
+ if (!SignalAccount.accountFileExists(pathConfig.dataPath(), accountPath)) {
throw new NotRegisteredException();
}
import java.util.List;
-record AccountsStorage(List<Account> accounts) {
+public record AccountsStorage(List<Account> accounts) {
- record Account(String path, String number, String uuid) {}
+ public record Account(String path, String number, String uuid) {}
}
}
}
- public Set<String> getAllNumbers() {
+ public synchronized Set<String> getAllNumbers() {
return readAccounts().stream()
.map(AccountsStorage.Account::number)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
}
- public String getPathByNumber(String number) {
+ public synchronized Set<AccountsStorage.Account> getAllAccounts() {
+ return readAccounts().stream().filter(a -> a.number() != null).collect(Collectors.toSet());
+ }
+
+ public synchronized String getPathByNumber(String number) {
return readAccounts().stream()
.filter(a -> number.equals(a.number()))
.map(AccountsStorage.Account::path)
.orElse(null);
}
- public String getPathByAci(ACI aci) {
+ public synchronized String getPathByAci(ACI aci) {
return readAccounts().stream()
.filter(a -> aci.toString().equals(a.uuid()))
.map(AccountsStorage.Account::path)
.orElse(null);
}
- public void updateAccount(String path, String number, ACI aci) {
+ public synchronized void updateAccount(String path, String number, ACI aci) {
updateAccounts(accounts -> accounts.stream().map(a -> {
if (path.equals(a.path())) {
return new AccountsStorage.Account(a.path(), number, aci == null ? null : aci.toString());
}).toList());
}
- public String addAccount(String number, ACI aci) {
+ public synchronized String addAccount(String number, ACI aci) {
final var accountPath = generateNewAccountPath();
final var account = new AccountsStorage.Account(accountPath, number, aci == null ? null : aci.toString());
updateAccounts(accounts -> {