diff --git a/library/src/main/java/com/pengrad/telegrambot/TelegramBot.java b/library/src/main/java/com/pengrad/telegrambot/TelegramBot.java index e8d36b2c..bcf9c0ff 100644 --- a/library/src/main/java/com/pengrad/telegrambot/TelegramBot.java +++ b/library/src/main/java/com/pengrad/telegrambot/TelegramBot.java @@ -3,6 +3,7 @@ import com.google.gson.Gson; import com.pengrad.telegrambot.impl.FileApi; import com.pengrad.telegrambot.impl.TelegramBotClient; +import com.pengrad.telegrambot.impl.SleepUpdatesHandler; import com.pengrad.telegrambot.impl.UpdatesHandler; import com.pengrad.telegrambot.model.File; import com.pengrad.telegrambot.request.BaseRequest; @@ -117,7 +118,7 @@ public Builder(String botToken) { this.botToken = botToken; api = new TelegramBotClient(client(null), gson(), apiUrl(API_URL, botToken, useTestServer)); fileApi = new FileApi(botToken); - updatesHandler = new UpdatesHandler(100); + updatesHandler = new SleepUpdatesHandler(100); requestPreprocessor = getEmptyRequestPreprocessor(); } @@ -142,7 +143,12 @@ public Builder fileApiUrl(String fileApiUrl) { } public Builder updateListenerSleep(long millis) { - updatesHandler = new UpdatesHandler(millis); + this.updatesHandler = new SleepUpdatesHandler(millis); + return this; + } + + public Builder updateListener(UpdatesHandler updatesHandler) { + this.updatesHandler = updatesHandler; return this; } diff --git a/library/src/main/java/com/pengrad/telegrambot/impl/SleepUpdatesHandler.java b/library/src/main/java/com/pengrad/telegrambot/impl/SleepUpdatesHandler.java new file mode 100644 index 00000000..a2fd24dc --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/impl/SleepUpdatesHandler.java @@ -0,0 +1,119 @@ +package com.pengrad.telegrambot.impl; + +import com.pengrad.telegrambot.*; +import com.pengrad.telegrambot.model.Update; +import com.pengrad.telegrambot.request.GetUpdates; +import com.pengrad.telegrambot.response.GetUpdatesResponse; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static com.pengrad.telegrambot.UpdatesListener.CONFIRMED_UPDATES_ALL; +import static com.pengrad.telegrambot.UpdatesListener.CONFIRMED_UPDATES_NONE; + +/** + * Stas Parshin + * 29 September 2016 + */ +public class SleepUpdatesHandler implements UpdatesHandler { + + private TelegramBot bot; + private UpdatesListener listener; + private ExceptionHandler exceptionHandler; + private Cancellable pendingRequest; + + private final long sleepTimeout; + + public SleepUpdatesHandler(long sleepTimeout) { + this.sleepTimeout = sleepTimeout; + } + + @Override + public void start(TelegramBot bot, UpdatesListener listener, ExceptionHandler exceptionHandler, GetUpdates request) { + this.bot = bot; + this.listener = listener; + this.exceptionHandler = exceptionHandler; + getUpdates(request); + } + + @Override + public void stop() { + bot = null; + listener = null; + exceptionHandler = null; + if (pendingRequest != null) { + pendingRequest.cancel(); + pendingRequest = null; + } + } + + private void getUpdates(GetUpdates request) { + if (bot == null || listener == null) return; + + pendingRequest = bot.execute(request, new Callback() { + @Override + public void onResponse(GetUpdates request, GetUpdatesResponse response) { + if (listener == null) return; + + if (!response.isOk() || response.updates() == null || response.updates().size() <= 0) { + if (!response.isOk()) { + if (exceptionHandler != null) { + String message = "GetUpdates failed with error_code " + + response.errorCode() + " " + response.description(); + exceptionHandler.onException(new TelegramException(message, response)); + } else { + Logger.getGlobal().log(Level.INFO, + "Update listener error for request " + request.toWebhookResponse() + + " with response " + response.errorCode() + " " + response.description()); + } + } + sleep(); + getUpdates(request); + return; + } + + List updates = response.updates(); + if (updates == null) updates = Collections.emptyList(); + int lastConfirmedUpdate = listener.process(updates); + + if (lastConfirmedUpdate != CONFIRMED_UPDATES_NONE) { + int offset = lastConfirmedUpdate == CONFIRMED_UPDATES_ALL + ? lastUpdateId(updates) + 1 + : lastConfirmedUpdate + 1; + request = request.offset(offset); + } + getUpdates(request); + } + + @Override + public void onFailure(GetUpdates request, IOException e) { + // TODO: better way to identify canceled request + if (e.getMessage().equals("Canceled")) { + return; + } + if (exceptionHandler != null) { + exceptionHandler.onException(new TelegramException(e)); + } else { + Logger.getGlobal().log(Level.INFO, "Update listener failure", e); + } + sleep(); + getUpdates(request); + } + }); + } + + private int lastUpdateId(List updates) { + return updates.get(updates.size() - 1).updateId(); + } + + private void sleep() { + if (sleepTimeout <= 0L) return; + try { + Thread.sleep(sleepTimeout); + } catch (InterruptedException ignored) { + } + } +} diff --git a/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java b/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java index 4a0f43fe..7bab4648 100644 --- a/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java +++ b/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java @@ -1,117 +1,18 @@ package com.pengrad.telegrambot.impl; -import com.pengrad.telegrambot.*; -import com.pengrad.telegrambot.model.Update; +import com.pengrad.telegrambot.ExceptionHandler; +import com.pengrad.telegrambot.TelegramBot; +import com.pengrad.telegrambot.UpdatesListener; import com.pengrad.telegrambot.request.GetUpdates; -import com.pengrad.telegrambot.response.GetUpdatesResponse; - -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static com.pengrad.telegrambot.UpdatesListener.CONFIRMED_UPDATES_ALL; -import static com.pengrad.telegrambot.UpdatesListener.CONFIRMED_UPDATES_NONE; /** - * Stas Parshin - * 29 September 2016 + * @author swat1x (Vadim Smyshlyaev) + * Created at 31.12.2025 */ -public class UpdatesHandler { - - private TelegramBot bot; - private UpdatesListener listener; - private ExceptionHandler exceptionHandler; - private Cancellable pendingRequest; - - private final long sleepTimeout; - - public UpdatesHandler(long sleepTimeout) { - this.sleepTimeout = sleepTimeout; - } - - public void start(TelegramBot bot, UpdatesListener listener, ExceptionHandler exceptionHandler, GetUpdates request) { - this.bot = bot; - this.listener = listener; - this.exceptionHandler = exceptionHandler; - getUpdates(request); - } - - public void stop() { - bot = null; - listener = null; - exceptionHandler = null; - if (pendingRequest != null) { - pendingRequest.cancel(); - pendingRequest = null; - } - } - - private void getUpdates(GetUpdates request) { - if (bot == null || listener == null) return; - - pendingRequest = bot.execute(request, new Callback() { - @Override - public void onResponse(GetUpdates request, GetUpdatesResponse response) { - if (listener == null) return; - - if (!response.isOk() || response.updates() == null || response.updates().size() <= 0) { - if (!response.isOk()) { - if (exceptionHandler != null) { - String message = "GetUpdates failed with error_code " + - response.errorCode() + " " + response.description(); - exceptionHandler.onException(new TelegramException(message, response)); - } else { - Logger.getGlobal().log(Level.INFO, - "Update listener error for request " + request.toWebhookResponse() + - " with response " + response.errorCode() + " " + response.description()); - } - } - sleep(); - getUpdates(request); - return; - } - - List updates = response.updates(); - if (updates == null) updates = Collections.emptyList(); - int lastConfirmedUpdate = listener.process(updates); - - if (lastConfirmedUpdate != CONFIRMED_UPDATES_NONE) { - int offset = lastConfirmedUpdate == CONFIRMED_UPDATES_ALL - ? lastUpdateId(updates) + 1 - : lastConfirmedUpdate + 1; - request = request.offset(offset); - } - getUpdates(request); - } +public interface UpdatesHandler { - @Override - public void onFailure(GetUpdates request, IOException e) { - // TODO: better way to identify canceled request - if (e.getMessage().equals("Canceled")) { - return; - } - if (exceptionHandler != null) { - exceptionHandler.onException(new TelegramException(e)); - } else { - Logger.getGlobal().log(Level.INFO, "Update listener failure", e); - } - sleep(); - getUpdates(request); - } - }); - } + void start(TelegramBot bot, UpdatesListener listener, ExceptionHandler exceptionHandler, GetUpdates request); - private int lastUpdateId(List updates) { - return updates.get(updates.size() - 1).updateId(); - } + void stop(); - private void sleep() { - if (sleepTimeout <= 0L) return; - try { - Thread.sleep(sleepTimeout); - } catch (InterruptedException ignored) { - } - } }