Skip to content

Commit 6c9ce4b

Browse files
authored
Merge pull request #429 from swat1x/updates-handler-split
splitting UpdatesHandler into an interface with an implementation
2 parents 33ade80 + 02cc8af commit 6c9ce4b

File tree

3 files changed

+135
-109
lines changed

3 files changed

+135
-109
lines changed

library/src/main/java/com/pengrad/telegrambot/TelegramBot.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.google.gson.Gson;
44
import com.pengrad.telegrambot.impl.FileApi;
55
import com.pengrad.telegrambot.impl.TelegramBotClient;
6+
import com.pengrad.telegrambot.impl.SleepUpdatesHandler;
67
import com.pengrad.telegrambot.impl.UpdatesHandler;
78
import com.pengrad.telegrambot.model.File;
89
import com.pengrad.telegrambot.request.BaseRequest;
@@ -117,7 +118,7 @@ public Builder(String botToken) {
117118
this.botToken = botToken;
118119
api = new TelegramBotClient(client(null), gson(), apiUrl(API_URL, botToken, useTestServer));
119120
fileApi = new FileApi(botToken);
120-
updatesHandler = new UpdatesHandler(100);
121+
updatesHandler = new SleepUpdatesHandler(100);
121122
requestPreprocessor = getEmptyRequestPreprocessor();
122123
}
123124

@@ -142,7 +143,12 @@ public Builder fileApiUrl(String fileApiUrl) {
142143
}
143144

144145
public Builder updateListenerSleep(long millis) {
145-
updatesHandler = new UpdatesHandler(millis);
146+
this.updatesHandler = new SleepUpdatesHandler(millis);
147+
return this;
148+
}
149+
150+
public Builder updateListener(UpdatesHandler updatesHandler) {
151+
this.updatesHandler = updatesHandler;
146152
return this;
147153
}
148154

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package com.pengrad.telegrambot.impl;
2+
3+
import com.pengrad.telegrambot.*;
4+
import com.pengrad.telegrambot.model.Update;
5+
import com.pengrad.telegrambot.request.GetUpdates;
6+
import com.pengrad.telegrambot.response.GetUpdatesResponse;
7+
8+
import java.io.IOException;
9+
import java.util.Collections;
10+
import java.util.List;
11+
import java.util.logging.Level;
12+
import java.util.logging.Logger;
13+
14+
import static com.pengrad.telegrambot.UpdatesListener.CONFIRMED_UPDATES_ALL;
15+
import static com.pengrad.telegrambot.UpdatesListener.CONFIRMED_UPDATES_NONE;
16+
17+
/**
18+
* Stas Parshin
19+
* 29 September 2016
20+
*/
21+
public class SleepUpdatesHandler implements UpdatesHandler {
22+
23+
private TelegramBot bot;
24+
private UpdatesListener listener;
25+
private ExceptionHandler exceptionHandler;
26+
private Cancellable pendingRequest;
27+
28+
private final long sleepTimeout;
29+
30+
public SleepUpdatesHandler(long sleepTimeout) {
31+
this.sleepTimeout = sleepTimeout;
32+
}
33+
34+
@Override
35+
public void start(TelegramBot bot, UpdatesListener listener, ExceptionHandler exceptionHandler, GetUpdates request) {
36+
this.bot = bot;
37+
this.listener = listener;
38+
this.exceptionHandler = exceptionHandler;
39+
getUpdates(request);
40+
}
41+
42+
@Override
43+
public void stop() {
44+
bot = null;
45+
listener = null;
46+
exceptionHandler = null;
47+
if (pendingRequest != null) {
48+
pendingRequest.cancel();
49+
pendingRequest = null;
50+
}
51+
}
52+
53+
private void getUpdates(GetUpdates request) {
54+
if (bot == null || listener == null) return;
55+
56+
pendingRequest = bot.execute(request, new Callback<GetUpdates, GetUpdatesResponse>() {
57+
@Override
58+
public void onResponse(GetUpdates request, GetUpdatesResponse response) {
59+
if (listener == null) return;
60+
61+
if (!response.isOk() || response.updates() == null || response.updates().size() <= 0) {
62+
if (!response.isOk()) {
63+
if (exceptionHandler != null) {
64+
String message = "GetUpdates failed with error_code " +
65+
response.errorCode() + " " + response.description();
66+
exceptionHandler.onException(new TelegramException(message, response));
67+
} else {
68+
Logger.getGlobal().log(Level.INFO,
69+
"Update listener error for request " + request.toWebhookResponse() +
70+
" with response " + response.errorCode() + " " + response.description());
71+
}
72+
}
73+
sleep();
74+
getUpdates(request);
75+
return;
76+
}
77+
78+
List<Update> updates = response.updates();
79+
if (updates == null) updates = Collections.emptyList();
80+
int lastConfirmedUpdate = listener.process(updates);
81+
82+
if (lastConfirmedUpdate != CONFIRMED_UPDATES_NONE) {
83+
int offset = lastConfirmedUpdate == CONFIRMED_UPDATES_ALL
84+
? lastUpdateId(updates) + 1
85+
: lastConfirmedUpdate + 1;
86+
request = request.offset(offset);
87+
}
88+
getUpdates(request);
89+
}
90+
91+
@Override
92+
public void onFailure(GetUpdates request, IOException e) {
93+
// TODO: better way to identify canceled request
94+
if (e.getMessage().equals("Canceled")) {
95+
return;
96+
}
97+
if (exceptionHandler != null) {
98+
exceptionHandler.onException(new TelegramException(e));
99+
} else {
100+
Logger.getGlobal().log(Level.INFO, "Update listener failure", e);
101+
}
102+
sleep();
103+
getUpdates(request);
104+
}
105+
});
106+
}
107+
108+
private int lastUpdateId(List<Update> updates) {
109+
return updates.get(updates.size() - 1).updateId();
110+
}
111+
112+
private void sleep() {
113+
if (sleepTimeout <= 0L) return;
114+
try {
115+
Thread.sleep(sleepTimeout);
116+
} catch (InterruptedException ignored) {
117+
}
118+
}
119+
}
Lines changed: 8 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,117 +1,18 @@
11
package com.pengrad.telegrambot.impl;
22

3-
import com.pengrad.telegrambot.*;
4-
import com.pengrad.telegrambot.model.Update;
3+
import com.pengrad.telegrambot.ExceptionHandler;
4+
import com.pengrad.telegrambot.TelegramBot;
5+
import com.pengrad.telegrambot.UpdatesListener;
56
import com.pengrad.telegrambot.request.GetUpdates;
6-
import com.pengrad.telegrambot.response.GetUpdatesResponse;
7-
8-
import java.io.IOException;
9-
import java.util.Collections;
10-
import java.util.List;
11-
import java.util.logging.Level;
12-
import java.util.logging.Logger;
13-
14-
import static com.pengrad.telegrambot.UpdatesListener.CONFIRMED_UPDATES_ALL;
15-
import static com.pengrad.telegrambot.UpdatesListener.CONFIRMED_UPDATES_NONE;
167

178
/**
18-
* Stas Parshin
19-
* 29 September 2016
9+
* @author swat1x (Vadim Smyshlyaev)
10+
* Created at 31.12.2025
2011
*/
21-
public class UpdatesHandler {
22-
23-
private TelegramBot bot;
24-
private UpdatesListener listener;
25-
private ExceptionHandler exceptionHandler;
26-
private Cancellable pendingRequest;
27-
28-
private final long sleepTimeout;
29-
30-
public UpdatesHandler(long sleepTimeout) {
31-
this.sleepTimeout = sleepTimeout;
32-
}
33-
34-
public void start(TelegramBot bot, UpdatesListener listener, ExceptionHandler exceptionHandler, GetUpdates request) {
35-
this.bot = bot;
36-
this.listener = listener;
37-
this.exceptionHandler = exceptionHandler;
38-
getUpdates(request);
39-
}
40-
41-
public void stop() {
42-
bot = null;
43-
listener = null;
44-
exceptionHandler = null;
45-
if (pendingRequest != null) {
46-
pendingRequest.cancel();
47-
pendingRequest = null;
48-
}
49-
}
50-
51-
private void getUpdates(GetUpdates request) {
52-
if (bot == null || listener == null) return;
53-
54-
pendingRequest = bot.execute(request, new Callback<GetUpdates, GetUpdatesResponse>() {
55-
@Override
56-
public void onResponse(GetUpdates request, GetUpdatesResponse response) {
57-
if (listener == null) return;
58-
59-
if (!response.isOk() || response.updates() == null || response.updates().size() <= 0) {
60-
if (!response.isOk()) {
61-
if (exceptionHandler != null) {
62-
String message = "GetUpdates failed with error_code " +
63-
response.errorCode() + " " + response.description();
64-
exceptionHandler.onException(new TelegramException(message, response));
65-
} else {
66-
Logger.getGlobal().log(Level.INFO,
67-
"Update listener error for request " + request.toWebhookResponse() +
68-
" with response " + response.errorCode() + " " + response.description());
69-
}
70-
}
71-
sleep();
72-
getUpdates(request);
73-
return;
74-
}
75-
76-
List<Update> updates = response.updates();
77-
if (updates == null) updates = Collections.emptyList();
78-
int lastConfirmedUpdate = listener.process(updates);
79-
80-
if (lastConfirmedUpdate != CONFIRMED_UPDATES_NONE) {
81-
int offset = lastConfirmedUpdate == CONFIRMED_UPDATES_ALL
82-
? lastUpdateId(updates) + 1
83-
: lastConfirmedUpdate + 1;
84-
request = request.offset(offset);
85-
}
86-
getUpdates(request);
87-
}
12+
public interface UpdatesHandler {
8813

89-
@Override
90-
public void onFailure(GetUpdates request, IOException e) {
91-
// TODO: better way to identify canceled request
92-
if (e.getMessage().equals("Canceled")) {
93-
return;
94-
}
95-
if (exceptionHandler != null) {
96-
exceptionHandler.onException(new TelegramException(e));
97-
} else {
98-
Logger.getGlobal().log(Level.INFO, "Update listener failure", e);
99-
}
100-
sleep();
101-
getUpdates(request);
102-
}
103-
});
104-
}
14+
void start(TelegramBot bot, UpdatesListener listener, ExceptionHandler exceptionHandler, GetUpdates request);
10515

106-
private int lastUpdateId(List<Update> updates) {
107-
return updates.get(updates.size() - 1).updateId();
108-
}
16+
void stop();
10917

110-
private void sleep() {
111-
if (sleepTimeout <= 0L) return;
112-
try {
113-
Thread.sleep(sleepTimeout);
114-
} catch (InterruptedException ignored) {
115-
}
116-
}
11718
}

0 commit comments

Comments
 (0)