Skip to content

Commit 56e681d

Browse files
authored
Save last update id in order to not reprocess commands
1 parent 8e0aa41 commit 56e681d

File tree

4 files changed

+117
-57
lines changed

4 files changed

+117
-57
lines changed

.dockerignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@
22
.build-cache
33
.idea
44
build
5-
README.md
5+
README.md
6+
*.dat
7+
*.db

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66
.settings
77
bin
88
build
9+
*.dat
910
*.db
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package com.annimon.similarimagesbot;
2+
3+
import java.io.IOException;
4+
import java.nio.file.Files;
5+
import java.nio.file.Path;
6+
import java.nio.file.Paths;
7+
import java.util.Arrays;
8+
import java.util.Comparator;
9+
import java.util.List;
10+
import java.util.Objects;
11+
import java.util.stream.Collectors;
12+
import com.pengrad.telegrambot.TelegramBot;
13+
import com.pengrad.telegrambot.UpdatesListener;
14+
import com.pengrad.telegrambot.model.Message;
15+
import com.pengrad.telegrambot.model.PhotoSize;
16+
import com.pengrad.telegrambot.model.Update;
17+
import com.pengrad.telegrambot.request.GetUpdates;
18+
19+
public abstract class BaseBotHandler {
20+
21+
private final Comparator<PhotoSize> photoSizeComparator = Comparator
22+
.comparingInt(ps -> ps.width() * ps.height());
23+
24+
private final Path uniqueIdPath = Paths.get("uniqueId.dat");
25+
26+
protected final TelegramBot bot;
27+
28+
public BaseBotHandler(String botToken) {
29+
bot = new TelegramBot.Builder(botToken)
30+
.updateListenerSleep(20_000L)
31+
.build();
32+
}
33+
34+
public void run() {
35+
int oldLastUpdateId = readLastUpdateId();
36+
bot.setUpdatesListener(updates -> {
37+
final var filteredUpdates = updates.stream()
38+
.filter(u -> u.updateId() > oldLastUpdateId)
39+
.collect(Collectors.toList());
40+
handleUpdates(filteredUpdates);
41+
int newLastUpdateId = getLastUpdateIdFromUpdatesList(updates, oldLastUpdateId);
42+
writeLastUpdateId(newLastUpdateId + 1);
43+
return UpdatesListener.CONFIRMED_UPDATES_ALL;
44+
});
45+
}
46+
47+
public void runOnce() {
48+
int oldLastUpdateId = readLastUpdateId();
49+
final var updates = bot.execute(new GetUpdates().offset(oldLastUpdateId)).updates();
50+
handleUpdates(updates);
51+
int newLastUpdateId = getLastUpdateIdFromUpdatesList(updates, oldLastUpdateId);
52+
writeLastUpdateId(newLastUpdateId + 1);
53+
}
54+
55+
protected abstract void handleUpdates(List<Update> updates);
56+
57+
protected List<Message> getChannelPostsWithPhotos(List<Update> updates) {
58+
return updates.stream()
59+
.map(Update::channelPost)
60+
.filter(Objects::nonNull)
61+
.filter(msg -> msg.photo() != null)
62+
.collect(Collectors.toList());
63+
}
64+
65+
protected PhotoSize getSmallestPhoto(PhotoSize[] photoSizes) {
66+
return Arrays.stream(photoSizes)
67+
.min(photoSizeComparator)
68+
.orElse(photoSizes[0]);
69+
}
70+
71+
protected PhotoSize getBiggestPhoto(PhotoSize[] photoSizes) {
72+
return Arrays.stream(photoSizes)
73+
.max(photoSizeComparator)
74+
.orElse(photoSizes[0]);
75+
}
76+
77+
private int getLastUpdateIdFromUpdatesList(List<Update> updates, int previousUpdateId) {
78+
return updates.stream()
79+
.mapToInt(Update::updateId)
80+
.max()
81+
.orElse(previousUpdateId);
82+
}
83+
84+
private int readLastUpdateId() {
85+
try {
86+
return Integer.parseInt(Files.readString(uniqueIdPath));
87+
} catch (IOException ioe) {
88+
return 0;
89+
}
90+
}
91+
92+
private void writeLastUpdateId(int updateId) {
93+
try {
94+
Files.writeString(uniqueIdPath, Integer.toString(updateId));
95+
} catch (IOException ignore) {}
96+
}}

src/main/java/com/annimon/similarimagesbot/BotHandler.java

Lines changed: 17 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,10 @@
11
package com.annimon.similarimagesbot;
22

3-
import com.annimon.similarimagesbot.data.ImageResult;
4-
import com.annimon.similarimagesbot.data.Post;
5-
import com.annimon.similarimagesbot.data.SimilarImagesInfo;
6-
import com.pengrad.telegrambot.TelegramBot;
7-
import com.pengrad.telegrambot.UpdatesListener;
8-
import com.pengrad.telegrambot.model.Message;
9-
import com.pengrad.telegrambot.model.PhotoSize;
10-
import com.pengrad.telegrambot.model.Update;
11-
import com.pengrad.telegrambot.model.request.InputMediaPhoto;
12-
import com.pengrad.telegrambot.model.request.ParseMode;
13-
import com.pengrad.telegrambot.request.DeleteMessage;
14-
import com.pengrad.telegrambot.request.ForwardMessage;
15-
import com.pengrad.telegrambot.request.GetFile;
16-
import com.pengrad.telegrambot.request.GetUpdates;
17-
import com.pengrad.telegrambot.request.SendMediaGroup;
18-
import com.pengrad.telegrambot.request.SendMessage;
19-
import com.pengrad.telegrambot.response.SendResponse;
203
import java.awt.image.BufferedImage;
214
import java.io.IOException;
225
import java.net.URL;
236
import java.sql.SQLException;
247
import java.util.ArrayList;
25-
import java.util.Arrays;
26-
import java.util.Comparator;
278
import java.util.List;
289
import java.util.Objects;
2910
import java.util.Optional;
@@ -33,39 +14,39 @@
3314
import java.util.regex.Pattern;
3415
import java.util.stream.Collectors;
3516
import javax.imageio.ImageIO;
17+
import com.annimon.similarimagesbot.data.ImageResult;
18+
import com.annimon.similarimagesbot.data.Post;
19+
import com.annimon.similarimagesbot.data.SimilarImagesInfo;
20+
import com.pengrad.telegrambot.model.Message;
21+
import com.pengrad.telegrambot.model.PhotoSize;
22+
import com.pengrad.telegrambot.model.Update;
23+
import com.pengrad.telegrambot.model.request.InputMediaPhoto;
24+
import com.pengrad.telegrambot.model.request.ParseMode;
25+
import com.pengrad.telegrambot.request.DeleteMessage;
26+
import com.pengrad.telegrambot.request.ForwardMessage;
27+
import com.pengrad.telegrambot.request.GetFile;
28+
import com.pengrad.telegrambot.request.SendMediaGroup;
29+
import com.pengrad.telegrambot.request.SendMessage;
30+
import com.pengrad.telegrambot.response.SendResponse;
3631

37-
public class BotHandler {
32+
public class BotHandler extends BaseBotHandler {
3833

39-
private final Comparator<PhotoSize> photoSizeComparator = Comparator
40-
.comparingInt(ps -> ps.width() * ps.height());
4134
private final Pattern delPattern = Pattern.compile("/del(\\d+)m(\\d+)");
4235
private final Pattern comparePattern = Pattern.compile("/compare(\\d+)m(\\d+)x(\\d+)");
4336

44-
private final TelegramBot bot;
4537
private final ImageIndexer indexer;
4638
private long adminId;
4739

4840
public BotHandler(String botToken, ImageIndexer indexer) {
49-
bot = new TelegramBot.Builder(botToken)
50-
.updateListenerSleep(20_000L)
51-
.build();
41+
super(botToken);
5242
this.indexer = indexer;
5343
}
5444

5545
public void setAdminId(long adminId) {
5646
this.adminId = adminId;
5747
}
5848

59-
public void run() {
60-
bot.setUpdatesListener(updates -> {
61-
final var removedPosts = processAdminCommands(updates);
62-
processUpdates(updates, removedPosts);
63-
return UpdatesListener.CONFIRMED_UPDATES_ALL;
64-
});
65-
}
66-
67-
public void runOnce() {
68-
final var updates = bot.execute(new GetUpdates()).updates();
49+
protected void handleUpdates(List<Update> updates) {
6950
final var removedPosts = processAdminCommands(updates);
7051
processUpdates(updates, removedPosts);
7152
}
@@ -154,14 +135,6 @@ private void processUpdates(List<Update> updates, Set<Post> ignoredPosts) {
154135
}
155136
}
156137

157-
private List<Message> getChannelPostsWithPhotos(List<Update> updates) {
158-
return updates.stream()
159-
.map(Update::channelPost)
160-
.filter(Objects::nonNull)
161-
.filter(msg -> msg.photo() != null)
162-
.collect(Collectors.toList());
163-
}
164-
165138
private void sendReport(List<SimilarImagesInfo> infos) {
166139
String report = infos.stream().map(info -> {
167140
final var post = info.getOriginalPost();
@@ -201,16 +174,4 @@ private String linkToMessage(Message msg) {
201174
private String linkToMessage(Long chatId, Integer messageId) {
202175
return "https://t.me/c/" + chatId.toString().replace("-100", "") + "/" + messageId;
203176
}
204-
205-
private PhotoSize getSmallestPhoto(PhotoSize[] photoSizes) {
206-
return Arrays.stream(photoSizes)
207-
.min(photoSizeComparator)
208-
.orElse(photoSizes[0]);
209-
}
210-
211-
private PhotoSize getBiggestPhoto(PhotoSize[] photoSizes) {
212-
return Arrays.stream(photoSizes)
213-
.max(photoSizeComparator)
214-
.orElse(photoSizes[0]);
215-
}
216177
}

0 commit comments

Comments
 (0)