From e31131b62cac2963bed0d4cf13f4b71c6512ff1d Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Tue, 12 Jul 2022 17:53:52 +0200 Subject: [PATCH] Load chats after startup --- .../main/java/it/tdlight/example/Example.java | 2 +- .../client/AuthorizationStateReadyGetMe.java | 21 ++++++-- .../AuthorizationStateReadyLoadChats.java | 52 +++++++++++++++++++ .../it/tdlight/client/CommandsHandler.java | 5 +- .../tdlight/client/SimpleTelegramClient.java | 26 ++++++++-- 5 files changed, 97 insertions(+), 9 deletions(-) create mode 100644 src/main/java/it/tdlight/client/AuthorizationStateReadyLoadChats.java diff --git a/example/src/main/java/it/tdlight/example/Example.java b/example/src/main/java/it/tdlight/example/Example.java index fbdda1d..cf0ffad 100644 --- a/example/src/main/java/it/tdlight/example/Example.java +++ b/example/src/main/java/it/tdlight/example/Example.java @@ -13,7 +13,7 @@ import java.nio.file.Paths; /** * Example class for TDLight Java *

- * The documentation of the TDLight functions can be found here: https://tdlight-team.github.io/tdlight-docs + * The documentation of the TDLight functions can be found here */ public final class Example { diff --git a/src/main/java/it/tdlight/client/AuthorizationStateReadyGetMe.java b/src/main/java/it/tdlight/client/AuthorizationStateReadyGetMe.java index 46e662b..09bf93a 100644 --- a/src/main/java/it/tdlight/client/AuthorizationStateReadyGetMe.java +++ b/src/main/java/it/tdlight/client/AuthorizationStateReadyGetMe.java @@ -1,11 +1,13 @@ package it.tdlight.client; import it.tdlight.common.TelegramClient; +import it.tdlight.jni.TdApi; import it.tdlight.jni.TdApi.AuthorizationStateReady; import it.tdlight.jni.TdApi.GetMe; import it.tdlight.jni.TdApi.UpdateAuthorizationState; import it.tdlight.jni.TdApi.User; import it.tdlight.jni.TdApi.Error; +import it.tdlight.jni.TdApi.UserTypeRegular; import java.util.concurrent.atomic.AtomicReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,11 +17,16 @@ final class AuthorizationStateReadyGetMe implements GenericUpdateHandler me; + private final AtomicReference me = new AtomicReference<>(); + private final AuthorizationStateReadyLoadChats mainChatsLoader; + private final AuthorizationStateReadyLoadChats archivedChatsLoader; - public AuthorizationStateReadyGetMe(TelegramClient client, AtomicReference me) { + public AuthorizationStateReadyGetMe(TelegramClient client, + AuthorizationStateReadyLoadChats mainChatsLoader, + AuthorizationStateReadyLoadChats archivedChatsLoader) { this.client = client; - this.me = me; + this.mainChatsLoader = mainChatsLoader; + this.archivedChatsLoader = archivedChatsLoader; } @Override @@ -30,7 +37,15 @@ final class AuthorizationStateReadyGetMe implements GenericUpdateHandler logger.warn("Failed to execute TdApi.GetMe()")); } } + + public User getMe() { + return me.get(); + } } diff --git a/src/main/java/it/tdlight/client/AuthorizationStateReadyLoadChats.java b/src/main/java/it/tdlight/client/AuthorizationStateReadyLoadChats.java new file mode 100644 index 0000000..00f2343 --- /dev/null +++ b/src/main/java/it/tdlight/client/AuthorizationStateReadyLoadChats.java @@ -0,0 +1,52 @@ +package it.tdlight.client; + +import it.tdlight.common.TelegramClient; +import it.tdlight.jni.TdApi; +import it.tdlight.jni.TdApi.AuthorizationStateReady; +import it.tdlight.jni.TdApi.ChatList; +import it.tdlight.jni.TdApi.ChatListMain; +import it.tdlight.jni.TdApi.Error; +import it.tdlight.jni.TdApi.GetMe; +import it.tdlight.jni.TdApi.LoadChats; +import it.tdlight.jni.TdApi.UpdateAuthorizationState; +import it.tdlight.jni.TdApi.User; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +final class AuthorizationStateReadyLoadChats implements GenericUpdateHandler { + + private static final Logger logger = LoggerFactory.getLogger(AuthorizationStateReadyLoadChats.class); + + private final TelegramClient client; + private final ChatList chatList; + + private boolean loaded; + + public AuthorizationStateReadyLoadChats(TelegramClient client, ChatList chatList) { + this.client = client; + this.chatList = chatList; + } + + @Override + public void onUpdate(UpdateAuthorizationState update) { + if (update.authorizationState.getConstructor() == AuthorizationStateReady.CONSTRUCTOR) { + client.send(new LoadChats(chatList, 2000), ok -> { + if (ok.getConstructor() == Error.CONSTRUCTOR) { + var error = (Error) ok; + if (error.code != 404) { + throw new TelegramError((Error) ok); + } + logger.debug("All {} chats have already been loaded", chatList); + } else { + logger.debug("All chats have been loaded"); + } + }, error -> logger.warn("Failed to execute TdApi.LoadChats()")); + } + } + + public boolean isLoaded() { + return loaded; + } +} diff --git a/src/main/java/it/tdlight/client/CommandsHandler.java b/src/main/java/it/tdlight/client/CommandsHandler.java index ab707a1..41a5d08 100644 --- a/src/main/java/it/tdlight/client/CommandsHandler.java +++ b/src/main/java/it/tdlight/client/CommandsHandler.java @@ -12,6 +12,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,11 +22,11 @@ final class CommandsHandler implements GenericUpdateHandler { private final TelegramClient client; private final Map> commandHandlers; - private final AtomicReference me; + private final Supplier me; public CommandsHandler(TelegramClient client, Map> commandHandlers, - AtomicReference me) { + Supplier me) { this.client = client; this.commandHandlers = commandHandlers; this.me = me; diff --git a/src/main/java/it/tdlight/client/SimpleTelegramClient.java b/src/main/java/it/tdlight/client/SimpleTelegramClient.java index 0148672..0f16bf3 100644 --- a/src/main/java/it/tdlight/client/SimpleTelegramClient.java +++ b/src/main/java/it/tdlight/client/SimpleTelegramClient.java @@ -10,6 +10,8 @@ import it.tdlight.common.internal.CommonClientManager; import it.tdlight.common.utils.CantLoadLibrary; import it.tdlight.common.utils.LibraryVersion; import it.tdlight.jni.TdApi; +import it.tdlight.jni.TdApi.ChatListArchive; +import it.tdlight.jni.TdApi.ChatListMain; import it.tdlight.jni.TdApi.Function; import it.tdlight.jni.TdApi.User; import java.io.IOException; @@ -56,6 +58,10 @@ public final class SimpleTelegramClient implements Authenticable { private final Set defaultExceptionHandlers = new ConcurrentHashMap().keySet( new Object()); + private final AuthorizationStateReadyGetMe meGetter; + private final AuthorizationStateReadyLoadChats mainChatsLoader; + private final AuthorizationStateReadyLoadChats archivedChatsLoader; + private final CountDownLatch closed = new CountDownLatch(1); public SimpleTelegramClient(TDLibSettings settings) { @@ -92,9 +98,11 @@ public final class SimpleTelegramClient implements Authenticable { ) ); this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitForExit(this.closed)); - AtomicReference me = new AtomicReference<>(); - this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateReadyGetMe(client, me)); - this.addUpdateHandler(TdApi.UpdateNewMessage.class, new CommandsHandler(client, this.commandHandlers, me)); + this.mainChatsLoader = new AuthorizationStateReadyLoadChats(client, new ChatListMain()); + this.archivedChatsLoader = new AuthorizationStateReadyLoadChats(client, new ChatListArchive()); + this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, + this.meGetter = new AuthorizationStateReadyGetMe(client, mainChatsLoader, archivedChatsLoader)); + this.addUpdateHandler(TdApi.UpdateNewMessage.class, new CommandsHandler(client, this.commandHandlers, this::getMe)); } private void handleUpdate(TdApi.Object update) { @@ -284,4 +292,16 @@ public final class SimpleTelegramClient implements Authenticable { } } } + + public User getMe() { + return meGetter.getMe(); + } + + public boolean isMainChatsListLoaded() { + return mainChatsLoader.isLoaded(); + } + + public boolean isArchivedChatsListLoaded() { + return archivedChatsLoader.isLoaded(); + } }