mirror of
https://github.com/annimon-tutorials/Similar-Images-Bot.git
synced 2024-09-20 03:34:19 +03:00
Refactor. Ability to run once
This commit is contained in:
parent
55743fbdda
commit
16e5f38a26
@ -9,6 +9,7 @@ import com.pengrad.telegrambot.model.PhotoSize;
|
|||||||
import com.pengrad.telegrambot.model.Update;
|
import com.pengrad.telegrambot.model.Update;
|
||||||
import com.pengrad.telegrambot.model.request.ParseMode;
|
import com.pengrad.telegrambot.model.request.ParseMode;
|
||||||
import com.pengrad.telegrambot.request.GetFile;
|
import com.pengrad.telegrambot.request.GetFile;
|
||||||
|
import com.pengrad.telegrambot.request.GetUpdates;
|
||||||
import com.pengrad.telegrambot.request.SendMessage;
|
import com.pengrad.telegrambot.request.SendMessage;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -41,35 +42,46 @@ public class BotHandler {
|
|||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
bot.setUpdatesListener(updates -> {
|
bot.setUpdatesListener(updates -> {
|
||||||
final List<Message> channelPosts = updates.stream()
|
processUpdates(updates);
|
||||||
.map(Update::channelPost)
|
|
||||||
.filter(Objects::nonNull)
|
|
||||||
.filter(msg -> msg.photo() != null)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
|
|
||||||
final var similarImagesInfos = new ArrayList<SimilarImagesInfo>();
|
|
||||||
for (var post : channelPosts) {
|
|
||||||
final PhotoSize photo = getSmallestPhoto(post.photo());
|
|
||||||
try {
|
|
||||||
final var tgFile = bot.execute(new GetFile(photo.fileId())).file();
|
|
||||||
final var url = new URL(bot.getFullFilePath(tgFile));
|
|
||||||
final BufferedImage image = ImageIO.read(url);
|
|
||||||
final var originalPost = new Post(post.chat().id(), post.messageId());
|
|
||||||
final SimilarImagesInfo info = indexer.processImage(originalPost, image);
|
|
||||||
if (info.hasResults()) {
|
|
||||||
similarImagesInfos.add(info);
|
|
||||||
}
|
|
||||||
} catch (IOException | SQLException e) {
|
|
||||||
System.err.format("Error while processing photo in %s%n", linkToMessage(post));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!similarImagesInfos.isEmpty()) {
|
|
||||||
sendReport(similarImagesInfos);
|
|
||||||
}
|
|
||||||
return UpdatesListener.CONFIRMED_UPDATES_ALL;
|
return UpdatesListener.CONFIRMED_UPDATES_ALL;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void runOnce() {
|
||||||
|
processUpdates(bot.execute(new GetUpdates()).updates());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processUpdates(List<Update> updates) {
|
||||||
|
final List<Message> channelPosts = getChannelPostsWithPhotos(updates);
|
||||||
|
final var similarImagesInfos = new ArrayList<SimilarImagesInfo>();
|
||||||
|
for (var post : channelPosts) {
|
||||||
|
final PhotoSize photo = getSmallestPhoto(post.photo());
|
||||||
|
try {
|
||||||
|
final var tgFile = bot.execute(new GetFile(photo.fileId())).file();
|
||||||
|
final var url = new URL(bot.getFullFilePath(tgFile));
|
||||||
|
final BufferedImage image = ImageIO.read(url);
|
||||||
|
final var originalPost = new Post(post.chat().id(), post.messageId());
|
||||||
|
final SimilarImagesInfo info = indexer.processImage(originalPost, image);
|
||||||
|
if (info.hasResults()) {
|
||||||
|
similarImagesInfos.add(info);
|
||||||
|
}
|
||||||
|
} catch (IOException | SQLException e) {
|
||||||
|
System.err.format("Error while processing photo in %s%n", linkToMessage(post));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!similarImagesInfos.isEmpty()) {
|
||||||
|
sendReport(similarImagesInfos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Message> getChannelPostsWithPhotos(List<Update> updates) {
|
||||||
|
return updates.stream()
|
||||||
|
.map(Update::channelPost)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.filter(msg -> msg.photo() != null)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
private void sendReport(List<SimilarImagesInfo> infos) {
|
private void sendReport(List<SimilarImagesInfo> infos) {
|
||||||
String report = infos.stream().map(info -> {
|
String report = infos.stream().map(info -> {
|
||||||
String text = "For post " + formatPostLink(info.getOriginalPost()) + " found:\n";
|
String text = "For post " + formatPostLink(info.getOriginalPost()) + " found:\n";
|
||||||
|
@ -10,7 +10,11 @@ public class Main {
|
|||||||
final ImageIndexer indexer = new ImageIndexer();
|
final ImageIndexer indexer = new ImageIndexer();
|
||||||
final var handler = new BotHandler(botToken, indexer);
|
final var handler = new BotHandler(botToken, indexer);
|
||||||
handler.setAdminId(longProp("ADMIN_ID").orElse(0L));
|
handler.setAdminId(longProp("ADMIN_ID").orElse(0L));
|
||||||
handler.run();
|
if (args.length == 1 && args[0].equalsIgnoreCase("once")) {
|
||||||
|
handler.runOnce();
|
||||||
|
} else {
|
||||||
|
handler.run();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Optional<String> stringProp(String name) {
|
private static Optional<String> stringProp(String name) {
|
||||||
|
Loading…
Reference in New Issue
Block a user