mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-03-24 13:44:33 +00:00
[AB-209] adding cleanup job for old embedded messages, this job deletes the entries from the database and removes reactions
reducing thread count for listener executor and scheduling fixing channel deletion listener not being part of a transaction
This commit is contained in:
@@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.core.task.TaskExecutor;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.transaction.event.TransactionalEventListener;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
@@ -32,8 +33,16 @@ public class AsyncAChannelDeletedListenerBean extends ListenerAdapter {
|
||||
@Qualifier("aChannelDeletedExecutor")
|
||||
private TaskExecutor channelDeletedExecutor;
|
||||
|
||||
@Autowired
|
||||
private AsyncAChannelDeletedListenerBean self;
|
||||
|
||||
@Override
|
||||
public void onTextChannelDelete(@Nonnull TextChannelDeleteEvent event) {
|
||||
self.deleteChannelInDb(event);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void deleteChannelInDb(TextChannelDeleteEvent event) {
|
||||
channelManagementService.markAsDeleted(event.getChannel().getIdLong());
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.core.service;
|
||||
import dev.sheldan.abstracto.core.metric.service.CounterMetric;
|
||||
import dev.sheldan.abstracto.core.metric.service.MetricService;
|
||||
import dev.sheldan.abstracto.core.metric.service.MetricTag;
|
||||
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.database.AChannel;
|
||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
@@ -18,8 +19,12 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static dev.sheldan.abstracto.core.config.MetricConstants.DISCORD_API_INTERACTION_METRIC;
|
||||
import static dev.sheldan.abstracto.core.config.MetricConstants.INTERACTION_TYPE;
|
||||
@@ -40,6 +45,9 @@ public class MessageServiceBean implements MessageService {
|
||||
@Autowired
|
||||
private MetricService metricService;
|
||||
|
||||
@Autowired
|
||||
private GuildService guildService;
|
||||
|
||||
public static final CounterMetric MESSAGE_SEND_METRIC = CounterMetric
|
||||
.builder()
|
||||
.name(DISCORD_API_INTERACTION_METRIC)
|
||||
@@ -110,6 +118,26 @@ public class MessageServiceBean implements MessageService {
|
||||
.thenCompose(o -> channelService.sendTextToChannel(text, o));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CompletableFuture<Message>> retrieveMessages(List<ServerChannelMessage> messages) {
|
||||
List<CompletableFuture<Message>> messageFutures = new ArrayList<>();
|
||||
Map<Long, List<ServerChannelMessage>> serverMessages = messages
|
||||
.stream()
|
||||
.collect(Collectors.groupingBy(ServerChannelMessage::getServerId));
|
||||
serverMessages.forEach((serverId, channelMessagesNonGrouped) -> {
|
||||
Guild guild = guildService.getGuildById(serverId);
|
||||
Map<Long, List<ServerChannelMessage>> channelMessages = channelMessagesNonGrouped
|
||||
.stream()
|
||||
.collect(Collectors.groupingBy(ServerChannelMessage::getChannelId));
|
||||
channelMessages.forEach((channelId, serverChannelMessages) -> {
|
||||
MessageChannel channel = guild.getTextChannelById(channelId);
|
||||
serverChannelMessages.forEach(serverChannelMessage ->
|
||||
messageFutures.add(channelService.retrieveMessageInChannel(channel, serverChannelMessage.getMessageId())));
|
||||
});
|
||||
});
|
||||
return messageFutures;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Message> sendTemplateToUser(User user, String template, Object model) {
|
||||
String message = templateService.renderTemplate(template, model);
|
||||
|
||||
@@ -11,6 +11,7 @@ import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedReaction;
|
||||
import dev.sheldan.abstracto.core.models.database.AEmote;
|
||||
import dev.sheldan.abstracto.core.service.management.EmoteManagementService;
|
||||
import dev.sheldan.abstracto.core.utils.CompletableFutureList;
|
||||
import dev.sheldan.abstracto.core.utils.FutureUtils;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.dv8tion.jda.api.entities.*;
|
||||
@@ -316,6 +317,15 @@ public class ReactionServiceBean implements ReactionService {
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> removeReactionOfUserFromMessageWithFuture(AEmote emote, Long serverId, Long channelId, Long messageId) {
|
||||
Integer emoteId = emote.getId();
|
||||
CompletableFuture<Message> messageFuture = channelService.retrieveMessageInChannel(serverId, channelId, messageId);
|
||||
return messageFuture.thenCompose(message ->
|
||||
self.removeReactionFromMessageWithFuture(emoteId, message)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> removeReactionOfUserFromMessageWithFuture(AEmote emote, Long serverId, Long channelId, Long messageId, Member member) {
|
||||
Integer emoteId = emote.getId();
|
||||
@@ -374,6 +384,44 @@ public class ReactionServiceBean implements ReactionService {
|
||||
return futures;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CompletableFuture<Void>> removeReactionFromMessagesWithFuture(List<Message> messages, Integer emoteId) {
|
||||
AEmote emote = emoteManagementService.loadEmote(emoteId);
|
||||
return removeReactionFromMessagesWithFuture(messages, emote);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CompletableFuture<Void>> removeReactionFromMessagesWithFuture(List<Message> messages, AEmote emote) {
|
||||
List<CompletableFuture<Void>> removalFutures = new ArrayList<>();
|
||||
messages.forEach(message -> removalFutures.add(removeReactionFromMessageWithFuture(emote, message)));
|
||||
return removalFutures;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFutureList<Void> removeReactionFromMessagesWithFutureWithFutureList(List<Message> messages, Integer emoteId) {
|
||||
List<CompletableFuture<Void>> allFutures = removeReactionFromMessagesWithFuture(messages, emoteId);
|
||||
return new CompletableFutureList<>(allFutures);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFutureList<Void> removeReactionFromMessagesWithFutureWithFutureList(List<Message> messages, String emoteKey) {
|
||||
List<CompletableFuture<Void>> allFutures = removeReactionFromMessagesWithFuture(messages, emoteKey);
|
||||
return new CompletableFutureList<>(allFutures);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CompletableFuture<Void>> removeReactionFromMessagesWithFuture(List<Message> messages, String emoteKey) {
|
||||
AEmote emote = emoteService.getEmoteOrDefaultEmote(emoteKey, messages.get(0).getGuild().getIdLong());
|
||||
return removeReactionFromMessagesWithFuture(messages, emote);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFutureList<Void> removeReactionFromMessagesWithFutureWithFutureList(List<Message> messages, AEmote emote) {
|
||||
List<CompletableFuture<Void>> removalFutures = new ArrayList<>();
|
||||
messages.forEach(message -> removalFutures.add(removeReactionFromMessageWithFuture(emote, message)));
|
||||
return new CompletableFutureList<>(removalFutures);
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void postConstruct() {
|
||||
metricService.registerCounter(REACTION_ADDED_METRIC, "Reactions added");
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
abstracto.listener.default.maxPoolSize=5
|
||||
abstracto.listener.default.maxPoolSize=2
|
||||
abstracto.listener.default.corePoolSize=1
|
||||
abstracto.listener.default.keepAliveSeconds=60
|
||||
|
||||
|
||||
abstracto.listener.joinListener.maxPoolSize=5
|
||||
abstracto.listener.joinListener.corePoolSize=1
|
||||
abstracto.listener.joinListener.keepAliveSeconds=60
|
||||
Reference in New Issue
Block a user