diff --git a/example/src/main/java/it.tdlight.example/Example.java b/example/src/main/java/it.tdlight.example/Example.java index 9439ce5..5fae159 100644 --- a/example/src/main/java/it.tdlight.example/Example.java +++ b/example/src/main/java/it.tdlight.example/Example.java @@ -159,7 +159,8 @@ public final class Example { case TdApi.AuthorizationStateClosed.CONSTRUCTOR: print("Closed"); if (!needQuit) { - client = ClientManager.create(new UpdateHandler(), new ErrorHandler(), new ErrorHandler()); // recreate client after previous has closed + client = ClientManager.create(); // recreate client after previous has closed + client.initialize(new UpdateHandler(), new ErrorHandler(), new ErrorHandler()); } else { canQuit = true; } @@ -282,7 +283,7 @@ public final class Example { java.util.Iterator iter = mainChatList.iterator(); System.out.println(); System.out.println("First " + limit + " chat(s) out of " + mainChatList.size() + " known chat(s):"); - for (int i = 0; i < limit; i++) { + for (int i = 0; i < limit && iter.hasNext(); i++) { long chatId = iter.next().chatId; TdApi.Chat chat = chats.get(chatId); synchronized (chat) { @@ -306,7 +307,8 @@ public final class Example { // create client Init.start(); - client = ClientManager.create(new UpdateHandler(), new ErrorHandler(), new ErrorHandler()); + client = ClientManager.create(); + client.initialize(new UpdateHandler(), new ErrorHandler(), new ErrorHandler()); client.execute(new TdApi.SetLogVerbosityLevel(0)); // disable TDLib log diff --git a/src/main/java/it/tdlight/common/CommonClientManager.java b/src/main/java/it/tdlight/common/CommonClientManager.java index 401280b..25cffde 100644 --- a/src/main/java/it/tdlight/common/CommonClientManager.java +++ b/src/main/java/it/tdlight/common/CommonClientManager.java @@ -1,7 +1,5 @@ package it.tdlight.common; -import it.tdlight.jni.TdApi; - public abstract class CommonClientManager { private static InternalClientManager getClientManager(String implementationName) { @@ -9,33 +7,12 @@ public abstract class CommonClientManager { return InternalClientManager.get(implementationName); } - protected static TelegramClient create(String implementationName, - ResultHandler updateHandler, - ExceptionHandler updateExceptionHandler, - ExceptionHandler defaultExceptionHandler) { - InternalClient client = new InternalClient(getClientManager(implementationName), - updateHandler, - updateExceptionHandler, - defaultExceptionHandler - ); - return create(client); - } - - protected static TelegramClient create(String implementationName, - UpdatesHandler updatesHandler, - ExceptionHandler updateExceptionHandler, - ExceptionHandler defaultExceptionHandler) { - InternalClient client = new InternalClient(getClientManager(implementationName), - updatesHandler, - updateExceptionHandler, - defaultExceptionHandler - ); + protected static TelegramClient create(String implementationName) { + InternalClient client = new InternalClient(getClientManager(implementationName)); return create(client); } private static TelegramClient create(InternalClient internalClient) { - // Send a dummy request because @levlam is too lazy to fix race conditions in a better way - internalClient.send(new TdApi.GetAuthorizationState(), (result) -> {}, ex -> {}); return internalClient; } } diff --git a/src/main/java/it/tdlight/common/InternalClient.java b/src/main/java/it/tdlight/common/InternalClient.java index 6973a92..76678a4 100644 --- a/src/main/java/it/tdlight/common/InternalClient.java +++ b/src/main/java/it/tdlight/common/InternalClient.java @@ -13,38 +13,16 @@ public class InternalClient implements ClientEventsHandler, TelegramClient { private final ConcurrentHashMap handlers = new ConcurrentHashMap(); - private final int clientId; + private int clientId; private final InternalClientManager clientManager; - private final Handler updateHandler; - private final MultiHandler updatesHandler; - private final ExceptionHandler defaultExceptionHandler; + private Handler updateHandler; + private MultiHandler updatesHandler; + private ExceptionHandler defaultExceptionHandler; private final AtomicBoolean isClosed = new AtomicBoolean(); - public InternalClient(InternalClientManager clientManager, - ResultHandler updateHandler, - ExceptionHandler updateExceptionHandler, - ExceptionHandler defaultExceptionHandler) { - this.updateHandler = new Handler(updateHandler, updateExceptionHandler); - this.updatesHandler = null; - this.defaultExceptionHandler = defaultExceptionHandler; + public InternalClient(InternalClientManager clientManager) { this.clientManager = clientManager; - this.clientId = NativeClientAccess.create(); - - clientManager.registerClient(clientId, this); - } - - public InternalClient(InternalClientManager clientManager, - UpdatesHandler updatesHandler, - ExceptionHandler updateExceptionHandler, - ExceptionHandler defaultExceptionHandler) { - this.updateHandler = null; - this.updatesHandler = new MultiHandler(updatesHandler, updateExceptionHandler); - this.clientManager = clientManager; - this.defaultExceptionHandler = defaultExceptionHandler; - this.clientId = NativeClientAccess.create(); - - clientManager.registerClient(clientId, this); } @Override @@ -131,6 +109,35 @@ public class InternalClient implements ClientEventsHandler, TelegramClient { } } + @Override + public void initialize(UpdatesHandler updatesHandler, + ExceptionHandler updateExceptionHandler, + ExceptionHandler defaultExceptionHandler) { + this.updateHandler = null; + this.updatesHandler = new MultiHandler(updatesHandler, updateExceptionHandler); + this.defaultExceptionHandler = defaultExceptionHandler; + + clientManager.registerClient(clientId, this); + + // Send a dummy request because @levlam is too lazy to fix race conditions in a better way + this.send(new TdApi.GetAuthorizationState(), (result) -> {}, ex -> {}); + } + + @Override + public void initialize(ResultHandler updateHandler, + ExceptionHandler updateExceptionHandler, + ExceptionHandler defaultExceptionHandler) { + this.updateHandler = new Handler(updateHandler, updateExceptionHandler); + this.updatesHandler = null; + this.defaultExceptionHandler = defaultExceptionHandler; + + this.clientId = NativeClientAccess.create(); + clientManager.registerClient(clientId, this); + + // Send a dummy request because @levlam is too lazy to fix race conditions in a better way + this.send(new TdApi.GetAuthorizationState(), (result) -> {}, ex -> {}); + } + @Override public void send(Function query, ResultHandler resultHandler, ExceptionHandler exceptionHandler) { if (isClosedAndMaybeThrow(query)) { diff --git a/src/main/java/it/tdlight/common/TelegramClient.java b/src/main/java/it/tdlight/common/TelegramClient.java index 284cd4d..355e999 100644 --- a/src/main/java/it/tdlight/common/TelegramClient.java +++ b/src/main/java/it/tdlight/common/TelegramClient.java @@ -4,6 +4,31 @@ import it.tdlight.jni.TdApi; public interface TelegramClient { + /** + * Initialize the client synchronously. + * @param updatesHandler Handler in which the updates are received + * @param updateExceptionHandler Handler in which the errors from updates are received + * @param defaultExceptionHandler Handler that receives exceptions triggered in a handler + */ + void initialize(UpdatesHandler updatesHandler, + ExceptionHandler updateExceptionHandler, + ExceptionHandler defaultExceptionHandler); + + /** + * Initialize the client synchronously. + * @param updateHandler Handler in which the updates are received + * @param updateExceptionHandler Handler in which the errors from updates are received + * @param defaultExceptionHandler Handler that receives exceptions triggered in a handler + */ + default void initialize(ResultHandler updateHandler, + ExceptionHandler updateExceptionHandler, + ExceptionHandler defaultExceptionHandler) { + this.initialize((UpdatesHandler) updates -> updates.forEach(updateHandler::onResult), + updateExceptionHandler, + defaultExceptionHandler + ); + } + /** * Sends a request to the TDLib. * diff --git a/src/main/java/it/tdlight/tdlib/ClientManager.java b/src/main/java/it/tdlight/tdlib/ClientManager.java index ba41dfc..01ce649 100644 --- a/src/main/java/it/tdlight/tdlib/ClientManager.java +++ b/src/main/java/it/tdlight/tdlib/ClientManager.java @@ -1,10 +1,7 @@ package it.tdlight.tdlib; import it.tdlight.common.CommonClientManager; -import it.tdlight.common.ExceptionHandler; -import it.tdlight.common.ResultHandler; import it.tdlight.common.TelegramClient; -import it.tdlight.common.UpdatesHandler; /** * Interface for interaction with TDLib. @@ -13,17 +10,7 @@ public class ClientManager extends CommonClientManager { private static final String implementationName = "tdlib"; - public static TelegramClient create( - ResultHandler updateHandler, - ExceptionHandler updateExceptionHandler, - ExceptionHandler defaultExceptionHandler) { - return CommonClientManager.create(implementationName, updateHandler, updateExceptionHandler, defaultExceptionHandler); - } - - public static TelegramClient create( - UpdatesHandler updatesHandler, - ExceptionHandler updateExceptionHandler, - ExceptionHandler defaultExceptionHandler) { - return CommonClientManager.create(implementationName, updatesHandler, updateExceptionHandler, defaultExceptionHandler); + public static TelegramClient create() { + return CommonClientManager.create(implementationName); } } diff --git a/src/main/java/it/tdlight/tdlight/ClientManager.java b/src/main/java/it/tdlight/tdlight/ClientManager.java index 4d4f4fa..add8b32 100644 --- a/src/main/java/it/tdlight/tdlight/ClientManager.java +++ b/src/main/java/it/tdlight/tdlight/ClientManager.java @@ -1,10 +1,7 @@ package it.tdlight.tdlight; import it.tdlight.common.CommonClientManager; -import it.tdlight.common.ExceptionHandler; -import it.tdlight.common.ResultHandler; import it.tdlight.common.TelegramClient; -import it.tdlight.common.UpdatesHandler; /** * Interface for interaction with TDLight. @@ -13,17 +10,7 @@ public class ClientManager extends CommonClientManager { private static final String implementationName = "tdlight"; - public static TelegramClient create( - ResultHandler updateHandler, - ExceptionHandler updateExceptionHandler, - ExceptionHandler defaultExceptionHandler) { - return CommonClientManager.create(implementationName, updateHandler, updateExceptionHandler, defaultExceptionHandler); - } - - public static TelegramClient create( - UpdatesHandler updatesHandler, - ExceptionHandler updateExceptionHandler, - ExceptionHandler defaultExceptionHandler) { - return CommonClientManager.create(implementationName, updatesHandler, updateExceptionHandler, defaultExceptionHandler); + public static TelegramClient create() { + return CommonClientManager.create(implementationName); } } diff --git a/tdlib/pom.xml b/tdlib/pom.xml index d3652d0..a30ff4e 100644 --- a/tdlib/pom.xml +++ b/tdlib/pom.xml @@ -2,7 +2,7 @@ 4.0.0 it.tdlight tdlib-java - 3.171.${revision} + 4.171.${revision} TDLib Java Wrapper jar diff --git a/tdlight/pom.xml b/tdlight/pom.xml index f511286..ac3298e 100644 --- a/tdlight/pom.xml +++ b/tdlight/pom.xml @@ -2,7 +2,7 @@ 4.0.0 it.tdlight tdlight-java - 3.171.${revision} + 4.171.${revision} TDLight Java Wrapper jar