Ability to auto remove same posts

This commit is contained in:
aNNiMON 2023-10-27 23:36:03 +03:00
parent 651ed41f2c
commit 636ee56996
3 changed files with 73 additions and 19 deletions

View File

@ -16,6 +16,7 @@ import java.util.stream.Collectors;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import com.annimon.similarimagesbot.data.ImageResult; import com.annimon.similarimagesbot.data.ImageResult;
import com.annimon.similarimagesbot.data.Post; import com.annimon.similarimagesbot.data.Post;
import com.annimon.similarimagesbot.data.Settings;
import com.annimon.similarimagesbot.data.SimilarImagesInfo; import com.annimon.similarimagesbot.data.SimilarImagesInfo;
import com.pengrad.telegrambot.model.Message; import com.pengrad.telegrambot.model.Message;
import com.pengrad.telegrambot.model.PhotoSize; import com.pengrad.telegrambot.model.PhotoSize;
@ -36,15 +37,14 @@ public class BotHandler extends BaseBotHandler {
private final Pattern comparePattern = Pattern.compile("/cmp([^-]+)_([^-]+)_(.*)"); private final Pattern comparePattern = Pattern.compile("/cmp([^-]+)_([^-]+)_(.*)");
private final ImageIndexer indexer; private final ImageIndexer indexer;
private long adminId; private final long adminId;
private final boolean autoRemove;
public BotHandler(String botToken, ImageIndexer indexer) { public BotHandler(Settings settings, ImageIndexer indexer) {
super(botToken); super(settings.getBotToken());
this.indexer = indexer; this.indexer = indexer;
} adminId = settings.getAdminId();
autoRemove = settings.isAutoRemove();
public void setAdminId(long adminId) {
this.adminId = adminId;
} }
protected void handleUpdates(List<Update> updates) { protected void handleUpdates(List<Update> updates) {
@ -74,6 +74,11 @@ public class BotHandler extends BaseBotHandler {
} }
final var channelId = parseChannelIdForCommand(m.group(1)); final var channelId = parseChannelIdForCommand(m.group(1));
final var messageId = Integer.parseInt(m.group(2), RADIX); 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); LOGGER.debug("Delete message {} in {}", messageId, channelId);
bot.execute(new DeleteMessage(channelId, messageId)); bot.execute(new DeleteMessage(channelId, messageId));
try { try {
@ -81,7 +86,6 @@ public class BotHandler extends BaseBotHandler {
} catch (SQLException ex) { } catch (SQLException ex) {
LOGGER.error("Cannot delete image in db", ex); LOGGER.error("Cannot delete image in db", ex);
} }
return Optional.of(new Post(channelId, messageId));
} }
private Optional<Post> processCompareCommand(Matcher m) { private Optional<Post> processCompareCommand(Matcher m) {
@ -142,9 +146,20 @@ public class BotHandler extends BaseBotHandler {
private void sendReport(List<SimilarImagesInfo> infos) { private void sendReport(List<SimilarImagesInfo> infos) {
String report = infos.stream().map(info -> { String report = infos.stream().map(info -> {
final var originalPost = info.getOriginalPost(); final var newPost = info.getOriginalPost();
final var channelId = formatChannelIdForCommands(originalPost.getChannelId());
String text = "For originalPost " + formatPostLink(originalPost) + " found:\n"; 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 // Matching results
text += info.getResults().stream() text += info.getResults().stream()
.map(r -> String.format(" %s, dst: %.2f", formatPostLink(r.getPost()), r.getDistance())) .map(r -> String.format(" %s, dst: %.2f", formatPostLink(r.getPost()), r.getDistance()))
@ -152,10 +167,10 @@ public class BotHandler extends BaseBotHandler {
// /compare command // /compare command
text += info.getResults().stream() text += info.getResults().stream()
.map(ImageResult::getPost) .map(ImageResult::getPost)
.map(p -> formatCompareCommand(channelId, originalPost, p)) .map(p -> formatCompareCommand(channelId, newPost, p))
.collect(Collectors.joining()); .collect(Collectors.joining());
// /del command // /del command
text += formatDelCommand(channelId, originalPost); text += formatDelCommand(channelId, newPost);
return text; return text;
}).collect(Collectors.joining("\n\n")); }).collect(Collectors.joining("\n\n"));

View File

@ -1,6 +1,7 @@
package com.annimon.similarimagesbot; package com.annimon.similarimagesbot;
import java.util.Optional; import java.util.Optional;
import com.annimon.similarimagesbot.data.Settings;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -11,10 +12,16 @@ public class Main {
public static void main(String[] args) { public static void main(String[] args) {
final String botToken = stringProp("BOT_TOKEN") final String botToken = stringProp("BOT_TOKEN")
.orElseThrow(() -> new IllegalArgumentException("BOT_TOKEN is required")); .orElseThrow(() -> new IllegalArgumentException("BOT_TOKEN is required"));
final ImageIndexer indexer = new ImageIndexer(); final long adminId = longProp("ADMIN_ID").orElse(0L);
final var handler = new BotHandler(botToken, indexer); final boolean isOnceMode = isOnceMode() || (args.length == 1 && args[0].equalsIgnoreCase("once"));
handler.setAdminId(longProp("ADMIN_ID").orElse(0L)); final boolean autoRemove = stringProp("AUTO_REMOVE")
if (isOnceMode() || (args.length == 1 && args[0].equalsIgnoreCase("once"))) { .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"); LOGGER.info("Started in once mode");
handler.runOnce(); handler.runOnce();
} else { } else {
@ -24,8 +31,9 @@ public class Main {
} }
private static boolean isOnceMode() { private static boolean isOnceMode() {
final var mode = stringProp("MODE").orElse("once"); return stringProp("MODE")
return mode.equalsIgnoreCase("once"); .map(s -> s.equalsIgnoreCase("once"))
.orElse(true);
} }
private static Optional<String> stringProp(String name) { private static Optional<String> stringProp(String name) {

View File

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