Refactor. Ability to run once

This commit is contained in:
Victor 2020-09-28 23:02:30 +03:00
parent 55743fbdda
commit 16e5f38a26
2 changed files with 42 additions and 26 deletions

View File

@ -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";

View File

@ -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) {