From 636ee56996f7d607157e479c5bb11c10ddac89e2 Mon Sep 17 00:00:00 2001 From: aNNiMON Date: Fri, 27 Oct 2023 23:36:03 +0300 Subject: [PATCH] Ability to auto remove same posts --- .../annimon/similarimagesbot/BotHandler.java | 41 +++++++++++++------ .../com/annimon/similarimagesbot/Main.java | 20 ++++++--- .../similarimagesbot/data/Settings.java | 31 ++++++++++++++ 3 files changed, 73 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/annimon/similarimagesbot/data/Settings.java diff --git a/src/main/java/com/annimon/similarimagesbot/BotHandler.java b/src/main/java/com/annimon/similarimagesbot/BotHandler.java index 65c34d8..8bfce95 100644 --- a/src/main/java/com/annimon/similarimagesbot/BotHandler.java +++ b/src/main/java/com/annimon/similarimagesbot/BotHandler.java @@ -16,6 +16,7 @@ import java.util.stream.Collectors; import javax.imageio.ImageIO; import com.annimon.similarimagesbot.data.ImageResult; import com.annimon.similarimagesbot.data.Post; +import com.annimon.similarimagesbot.data.Settings; import com.annimon.similarimagesbot.data.SimilarImagesInfo; import com.pengrad.telegrambot.model.Message; import com.pengrad.telegrambot.model.PhotoSize; @@ -36,15 +37,14 @@ public class BotHandler extends BaseBotHandler { private final Pattern comparePattern = Pattern.compile("/cmp([^-]+)_([^-]+)_(.*)"); private final ImageIndexer indexer; - private long adminId; + private final long adminId; + private final boolean autoRemove; - public BotHandler(String botToken, ImageIndexer indexer) { - super(botToken); + public BotHandler(Settings settings, ImageIndexer indexer) { + super(settings.getBotToken()); this.indexer = indexer; - } - - public void setAdminId(long adminId) { - this.adminId = adminId; + adminId = settings.getAdminId(); + autoRemove = settings.isAutoRemove(); } protected void handleUpdates(List updates) { @@ -74,6 +74,11 @@ public class BotHandler extends BaseBotHandler { } final var channelId = parseChannelIdForCommand(m.group(1)); final var messageId = Integer.parseInt(m.group(2), RADIX); + deletePost(channelId, messageId); + return Optional.of(new Post(channelId, messageId)); + } + + private void deletePost(long channelId, int messageId) { LOGGER.debug("Delete message {} in {}", messageId, channelId); bot.execute(new DeleteMessage(channelId, messageId)); try { @@ -81,7 +86,6 @@ public class BotHandler extends BaseBotHandler { } catch (SQLException ex) { LOGGER.error("Cannot delete image in db", ex); } - return Optional.of(new Post(channelId, messageId)); } private Optional processCompareCommand(Matcher m) { @@ -142,9 +146,20 @@ public class BotHandler extends BaseBotHandler { private void sendReport(List infos) { String report = infos.stream().map(info -> { - final var originalPost = info.getOriginalPost(); - final var channelId = formatChannelIdForCommands(originalPost.getChannelId()); - String text = "For originalPost " + formatPostLink(originalPost) + " found:\n"; + final var newPost = info.getOriginalPost(); + + final var equalMatch = info.getResults().stream() + .filter(r -> r.getDistance() < 1.0) + .findAny(); + if (autoRemove && equalMatch.isPresent()) { + final var match = equalMatch.orElseThrow(); + deletePost(newPost.getChannelId(), newPost.getMessageId()); + return String.format("Removed new post #%d as it's equal to %s", + newPost.getMessageId(), formatPostLink(match.getPost())); + } + + final var channelId = formatChannelIdForCommands(newPost.getChannelId()); + String text = "For new post " + formatPostLink(newPost) + " found:\n"; // Matching results text += info.getResults().stream() .map(r -> String.format(" %s, dst: %.2f", formatPostLink(r.getPost()), r.getDistance())) @@ -152,10 +167,10 @@ public class BotHandler extends BaseBotHandler { // /compare command text += info.getResults().stream() .map(ImageResult::getPost) - .map(p -> formatCompareCommand(channelId, originalPost, p)) + .map(p -> formatCompareCommand(channelId, newPost, p)) .collect(Collectors.joining()); // /del command - text += formatDelCommand(channelId, originalPost); + text += formatDelCommand(channelId, newPost); return text; }).collect(Collectors.joining("\n\n")); diff --git a/src/main/java/com/annimon/similarimagesbot/Main.java b/src/main/java/com/annimon/similarimagesbot/Main.java index 911262b..3155daf 100644 --- a/src/main/java/com/annimon/similarimagesbot/Main.java +++ b/src/main/java/com/annimon/similarimagesbot/Main.java @@ -1,6 +1,7 @@ package com.annimon.similarimagesbot; import java.util.Optional; +import com.annimon.similarimagesbot.data.Settings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -11,10 +12,16 @@ public class Main { public static void main(String[] args) { final String botToken = stringProp("BOT_TOKEN") .orElseThrow(() -> new IllegalArgumentException("BOT_TOKEN is required")); - final ImageIndexer indexer = new ImageIndexer(); - final var handler = new BotHandler(botToken, indexer); - handler.setAdminId(longProp("ADMIN_ID").orElse(0L)); - if (isOnceMode() || (args.length == 1 && args[0].equalsIgnoreCase("once"))) { + final long adminId = longProp("ADMIN_ID").orElse(0L); + final boolean isOnceMode = isOnceMode() || (args.length == 1 && args[0].equalsIgnoreCase("once")); + final boolean autoRemove = stringProp("AUTO_REMOVE") + .map(s -> s.equalsIgnoreCase("true")) + .orElse(false); + + final var settings = new Settings(botToken, adminId, isOnceMode, autoRemove); + final var indexer = new ImageIndexer(); + final var handler = new BotHandler(settings, indexer); + if (isOnceMode) { LOGGER.info("Started in once mode"); handler.runOnce(); } else { @@ -24,8 +31,9 @@ public class Main { } private static boolean isOnceMode() { - final var mode = stringProp("MODE").orElse("once"); - return mode.equalsIgnoreCase("once"); + return stringProp("MODE") + .map(s -> s.equalsIgnoreCase("once")) + .orElse(true); } private static Optional stringProp(String name) { diff --git a/src/main/java/com/annimon/similarimagesbot/data/Settings.java b/src/main/java/com/annimon/similarimagesbot/data/Settings.java new file mode 100644 index 0000000..682e8e5 --- /dev/null +++ b/src/main/java/com/annimon/similarimagesbot/data/Settings.java @@ -0,0 +1,31 @@ +package com.annimon.similarimagesbot.data; + +public class Settings { + private final String botToken; + private final long adminId; + private final boolean onceMode; + private final boolean autoRemove; + + public Settings(String botToken, long adminId, boolean onceMode, boolean autoRemove) { + this.botToken = botToken;; + this.adminId = adminId; + this.onceMode = onceMode; + this.autoRemove = autoRemove; + } + + public String getBotToken() { + return botToken; + } + + public long getAdminId() { + return adminId; + } + + public boolean isOnceMode() { + return onceMode; + } + + public boolean isAutoRemove() { + return autoRemove; + } +}