diff --git a/src/main/java/com/annimon/similarimagesbot/BotHandler.java b/src/main/java/com/annimon/similarimagesbot/BotHandler.java index aea36ba..189c313 100644 --- a/src/main/java/com/annimon/similarimagesbot/BotHandler.java +++ b/src/main/java/com/annimon/similarimagesbot/BotHandler.java @@ -9,6 +9,7 @@ import com.pengrad.telegrambot.model.PhotoSize; import com.pengrad.telegrambot.model.Update; import com.pengrad.telegrambot.model.request.ParseMode; import com.pengrad.telegrambot.request.GetFile; +import com.pengrad.telegrambot.request.GetUpdates; import com.pengrad.telegrambot.request.SendMessage; import java.awt.image.BufferedImage; import java.io.IOException; @@ -41,35 +42,46 @@ public class BotHandler { public void run() { bot.setUpdatesListener(updates -> { - final List channelPosts = updates.stream() - .map(Update::channelPost) - .filter(Objects::nonNull) - .filter(msg -> msg.photo() != null) - .collect(Collectors.toList()); - - final var similarImagesInfos = new ArrayList(); - 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); - } + processUpdates(updates); return UpdatesListener.CONFIRMED_UPDATES_ALL; }); } + public void runOnce() { + processUpdates(bot.execute(new GetUpdates()).updates()); + } + + private void processUpdates(List updates) { + final List channelPosts = getChannelPostsWithPhotos(updates); + final var similarImagesInfos = new ArrayList(); + 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 getChannelPostsWithPhotos(List updates) { + return updates.stream() + .map(Update::channelPost) + .filter(Objects::nonNull) + .filter(msg -> msg.photo() != null) + .collect(Collectors.toList()); + } + private void sendReport(List infos) { String report = infos.stream().map(info -> { String text = "For post " + formatPostLink(info.getOriginalPost()) + " found:\n"; diff --git a/src/main/java/com/annimon/similarimagesbot/Main.java b/src/main/java/com/annimon/similarimagesbot/Main.java index 298b8cd..6ca2119 100644 --- a/src/main/java/com/annimon/similarimagesbot/Main.java +++ b/src/main/java/com/annimon/similarimagesbot/Main.java @@ -10,7 +10,11 @@ public class Main { final ImageIndexer indexer = new ImageIndexer(); final var handler = new BotHandler(botToken, indexer); 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 stringProp(String name) {