mirror of
https://github.com/annimon-tutorials/Similar-Images-Bot.git
synced 2024-09-20 03:34:19 +03:00
Ability to remove image from index and post from channel
This commit is contained in:
parent
16e5f38a26
commit
2f81307caf
@ -8,6 +8,7 @@ import com.pengrad.telegrambot.model.Message;
|
||||
import com.pengrad.telegrambot.model.PhotoSize;
|
||||
import com.pengrad.telegrambot.model.Update;
|
||||
import com.pengrad.telegrambot.model.request.ParseMode;
|
||||
import com.pengrad.telegrambot.request.DeleteMessage;
|
||||
import com.pengrad.telegrambot.request.GetFile;
|
||||
import com.pengrad.telegrambot.request.GetUpdates;
|
||||
import com.pengrad.telegrambot.request.SendMessage;
|
||||
@ -20,6 +21,7 @@ import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
@ -42,13 +44,37 @@ public class BotHandler {
|
||||
|
||||
public void run() {
|
||||
bot.setUpdatesListener(updates -> {
|
||||
processAdminCommands(updates);
|
||||
processUpdates(updates);
|
||||
return UpdatesListener.CONFIRMED_UPDATES_ALL;
|
||||
});
|
||||
}
|
||||
|
||||
public void runOnce() {
|
||||
processUpdates(bot.execute(new GetUpdates()).updates());
|
||||
final var updates = bot.execute(new GetUpdates()).updates();
|
||||
processAdminCommands(updates);
|
||||
processUpdates(updates);
|
||||
}
|
||||
|
||||
private void processAdminCommands(List<Update> updates) {
|
||||
final var delPattern = Pattern.compile("/del(\\d+)m(\\d+)");
|
||||
updates.stream()
|
||||
.map(Update::message)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(msg -> msg.chat().id() == adminId)
|
||||
.map(Message::text)
|
||||
.filter(Objects::nonNull)
|
||||
.forEach(command -> {
|
||||
final var m = delPattern.matcher(command);
|
||||
if (m.find()) {
|
||||
final var channelId = Long.parseLong("-100" + m.group(1));
|
||||
final var messageId = Integer.parseInt(m.group(2));
|
||||
bot.execute(new DeleteMessage(channelId, messageId));
|
||||
try {
|
||||
indexer.deleteImage(channelId, messageId);
|
||||
} catch (SQLException ignored) {}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void processUpdates(List<Update> updates) {
|
||||
@ -84,10 +110,14 @@ public class BotHandler {
|
||||
|
||||
private void sendReport(List<SimilarImagesInfo> infos) {
|
||||
String report = infos.stream().map(info -> {
|
||||
String text = "For post " + formatPostLink(info.getOriginalPost()) + " found:\n";
|
||||
final var post = info.getOriginalPost();
|
||||
String text = "For post " + formatPostLink(post) + " found:\n";
|
||||
text += info.getResults().stream()
|
||||
.map(r -> String.format(" %s, dst: %.2f", formatPostLink(r.getPost()), r.getDistance()))
|
||||
.collect(Collectors.joining("\n"));
|
||||
text += String.format("%n/del%sm%d",
|
||||
post.getChannelId().toString().replace("-100", ""),
|
||||
post.getMessageId());
|
||||
return text;
|
||||
}).collect(Collectors.joining("\n\n"));
|
||||
|
||||
|
@ -5,7 +5,6 @@ import com.annimon.similarimagesbot.data.Post;
|
||||
import com.annimon.similarimagesbot.data.SimilarImagesInfo;
|
||||
import com.github.kilianB.hashAlgorithms.DifferenceHash;
|
||||
import com.github.kilianB.hashAlgorithms.PerceptiveHash;
|
||||
import com.github.kilianB.matcher.persistent.database.H2DatabaseImageMatcher;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.SQLException;
|
||||
@ -17,7 +16,7 @@ import static com.github.kilianB.hashAlgorithms.DifferenceHash.Precision;
|
||||
|
||||
public class ImageIndexer {
|
||||
|
||||
private final Map<Long, H2DatabaseImageMatcher> databases = new HashMap<>(5);
|
||||
private final Map<Long, SimilarImagesH2DatabaseMatcher> databases = new HashMap<>(5);
|
||||
private final DifferenceHash differenceHash = new DifferenceHash(32, Precision.Double);
|
||||
private final PerceptiveHash perceptiveHash = new PerceptiveHash(32);
|
||||
|
||||
@ -41,14 +40,21 @@ public class ImageIndexer {
|
||||
return new SimilarImagesInfo(originalPost, results);
|
||||
}
|
||||
|
||||
private H2DatabaseImageMatcher getDatabaseForChannel(Long channelId) throws SQLException {
|
||||
|
||||
public void deleteImage(Long channelId, Integer messageId) throws SQLException {
|
||||
final String uniqueId = messageId.toString();
|
||||
final var db = getDatabaseForChannel(channelId);
|
||||
db.removeImage(uniqueId);
|
||||
}
|
||||
|
||||
private SimilarImagesH2DatabaseMatcher getDatabaseForChannel(Long channelId) throws SQLException {
|
||||
var db = databases.get(channelId);
|
||||
if (db != null) {
|
||||
return db;
|
||||
}
|
||||
var jdbcUrl = "jdbc:h2:./imagesdb_" + channelId;
|
||||
var conn = DriverManager.getConnection(jdbcUrl, "root", "");
|
||||
db = new H2DatabaseImageMatcher(conn);
|
||||
db = new SimilarImagesH2DatabaseMatcher(conn);
|
||||
db.addHashingAlgorithm(differenceHash, 0.4);
|
||||
db.addHashingAlgorithm(perceptiveHash, 0.2);
|
||||
databases.put(channelId, db);
|
||||
|
@ -0,0 +1,22 @@
|
||||
package com.annimon.similarimagesbot;
|
||||
|
||||
import com.github.kilianB.matcher.persistent.database.H2DatabaseImageMatcher;
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
|
||||
public class SimilarImagesH2DatabaseMatcher extends H2DatabaseImageMatcher {
|
||||
|
||||
public SimilarImagesH2DatabaseMatcher(Connection dbConnection) throws SQLException {
|
||||
super(dbConnection);
|
||||
}
|
||||
|
||||
public void removeImage(String uniqueId) throws SQLException {
|
||||
for (var algo : steps.keySet()) {
|
||||
try (var stmt = conn
|
||||
.prepareStatement("DELETE FROM " + resolveTableName(algo) + " WHERE URL = ?")) {
|
||||
stmt.setString(1, uniqueId);
|
||||
stmt.execute();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user