Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions library/src/main/java/com/pengrad/telegrambot/TelegramBot.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}

Expand All @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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<GetUpdates, GetUpdatesResponse>() {
@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<Update> 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<Update> updates) {
return updates.get(updates.size() - 1).updateId();
}

private void sleep() {
if (sleepTimeout <= 0L) return;
try {
Thread.sleep(sleepTimeout);
} catch (InterruptedException ignored) {
}
}
}
115 changes: 8 additions & 107 deletions library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java
Original file line number Diff line number Diff line change
@@ -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<GetUpdates, GetUpdatesResponse>() {
@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<Update> 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<Update> updates) {
return updates.get(updates.size() - 1).updateId();
}
void stop();

private void sleep() {
if (sleepTimeout <= 0L) return;
try {
Thread.sleep(sleepTimeout);
} catch (InterruptedException ignored) {
}
}
}
Loading