mirror of
https://github.com/annimon-tutorials/Similar-Images-Bot.git
synced 2024-09-20 03:34:19 +03:00
Ability to auto remove same posts
This commit is contained in:
parent
651ed41f2c
commit
636ee56996
@ -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<Update> 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<Post> processCompareCommand(Matcher m) {
|
||||
@ -142,9 +146,20 @@ public class BotHandler extends BaseBotHandler {
|
||||
|
||||
private void sendReport(List<SimilarImagesInfo> 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"));
|
||||
|
||||
|
@ -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<String> stringProp(String name) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user