Skip to content

Commit ef68805

Browse files
committed
Improve code readability, add log to determine when a retry is needed, and added test to check on the new logic
1 parent 0e1ff52 commit ef68805

3 files changed

Lines changed: 42 additions & 3 deletions

File tree

src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.pengrad.telegrambot.TelegramBot;
2424
import com.pengrad.telegrambot.TelegramException;
2525
import com.pengrad.telegrambot.UpdatesListener;
26+
import com.pengrad.telegrambot.model.ResponseParameters;
2627
import com.pengrad.telegrambot.model.Update;
2728
import com.pengrad.telegrambot.model.request.ReplyParameters;
2829
import com.pengrad.telegrambot.model.request.richmessages.InputRichMessage;
@@ -33,6 +34,7 @@
3334
import com.pengrad.telegrambot.request.richmessages.SendRichMessage;
3435
import com.pengrad.telegrambot.request.richmessages.SendRichMessageDraft;
3536
import com.pengrad.telegrambot.response.BaseResponse;
37+
import org.jspecify.annotations.Nullable;
3638
import org.slf4j.event.Level;
3739

3840
import java.io.File;
@@ -231,10 +233,12 @@ private <T extends BaseRequest<T, R>, R extends BaseResponse> R execute(BaseRequ
231233
return response;
232234
}
233235

234-
for (int retry = 1; retry <= 3 && response.parameters() != null && response.parameters().retryAfter() != null; retry++) {
235-
var retryDelay = Duration.ofSeconds(response.parameters().retryAfter());
236+
for (int retry = 1; retry <= 3 && isRetriable(response.parameters()); retry++) {
237+
var retryDelay = response.parameters().retryAfter();
238+
LOGGER.at(Level.WARN).log("The {} request failed, retrying in {} seconds", request.getMethod(), retryDelay);
239+
236240
try {
237-
Thread.sleep(retryDelay);
241+
Thread.sleep(Duration.ofSeconds(retryDelay));
238242

239243
response = bot.execute(request);
240244

@@ -250,6 +254,10 @@ private <T extends BaseRequest<T, R>, R extends BaseResponse> R execute(BaseRequ
250254
throw new TelegramApiException(request.getMethod(), response.description());
251255
}
252256

257+
private static boolean isRetriable(@Nullable ResponseParameters parameters) {
258+
return parameters != null && parameters.retryAfter() != null && parameters.retryAfter() > 0;
259+
}
260+
253261
private static void deleteTempFiles(Set<Path> pathsToDelete) {
254262
for (var path : pathsToDelete) {
255263
try {

src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ public final class MockResponses {
1313
}
1414
""").build();
1515

16+
static final MockResponse FAILURE_RESPONSE = new MockResponse.Builder().body("""
17+
{
18+
ok: false,
19+
error_code: 429,
20+
description: "Too Many Requests: retry after 3",
21+
parameters: {
22+
retry_after: 3
23+
}
24+
}
25+
""").build();
26+
1627
static final MockResponse START_MESSAGE = new MockResponse.Builder().body("""
1728
{
1829
ok: true,

src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,4 +404,24 @@ void documentNotSupported() throws Exception {
404404
assertResponseContainsMarkdownMessage(sendRichMessage, Answer.ERROR);
405405
}
406406
}
407+
408+
@Test
409+
void retryApiCall() throws Exception {
410+
server.enqueue(MockResponses.HELP_MESSAGE);
411+
server.enqueue(MockResponses.FAILURE_RESPONSE);
412+
server.enqueue(MockResponses.SUCCESS_RESPONSE);
413+
414+
try (var _ = runBot()) {
415+
var getUpdates = server.takeRequest();
416+
assertEquals("/api/token/getUpdates", getUpdates.getTarget());
417+
418+
var firstSendRichMessage = server.takeRequest();
419+
assertEquals("/api/token/sendRichMessage", firstSendRichMessage.getTarget());
420+
421+
var secondSendRichMessage = server.takeRequest();
422+
assertEquals("/api/token/sendRichMessage", secondSendRichMessage.getTarget());
423+
424+
assertResponseContainsMarkdownMessage(secondSendRichMessage, Answer.HELP);
425+
}
426+
}
407427
}

0 commit comments

Comments
 (0)