[AB-219] fixing cached message content not being updated

merging message updated listeners
adding clearing message cache to clear cache listener
This commit is contained in:
Sheldan
2021-04-04 22:28:21 +02:00
parent d088a161ef
commit ff676b29e6
5 changed files with 61 additions and 72 deletions

View File

@@ -0,0 +1,23 @@
package dev.sheldan.abstracto.core.listener;
import dev.sheldan.abstracto.core.listener.async.entity.AsyncCacheClearingListener;
import dev.sheldan.abstracto.core.models.listener.VoidListenerModel;
import dev.sheldan.abstracto.core.service.MessageCache;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class ClearMessageCacheListener implements AsyncCacheClearingListener {
@Autowired
private MessageCache messageCache;
@Override
public DefaultListenerResult execute(VoidListenerModel model) {
log.debug("Executing clear message cache listener.");
messageCache.clearCache();
return DefaultListenerResult.PROCESSED;
}
}

View File

@@ -1,6 +1,7 @@
package dev.sheldan.abstracto.core.listener.sync.jda;
package dev.sheldan.abstracto.core.listener;
import dev.sheldan.abstracto.core.listener.ListenerService;
import dev.sheldan.abstracto.core.listener.async.jda.AsyncMessageTextUpdatedListener;
import dev.sheldan.abstracto.core.listener.sync.jda.MessageTextUpdatedListener;
import dev.sheldan.abstracto.core.metric.service.CounterMetric;
import dev.sheldan.abstracto.core.metric.service.MetricService;
import dev.sheldan.abstracto.core.metric.service.MetricTag;
@@ -13,6 +14,8 @@ import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.events.message.guild.GuildMessageUpdateEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
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;
@@ -40,6 +43,13 @@ public class MessageUpdatedListenerBean extends ListenerAdapter {
@Autowired
private ListenerService listenerService;
@Autowired(required = false)
private List<AsyncMessageTextUpdatedListener> asyncListenerList;
@Autowired
@Qualifier("messageUpdatedExecutor")
private TaskExecutor messageUpdatedExecutor;
@Autowired
private MetricService metricService;
@@ -53,11 +63,17 @@ public class MessageUpdatedListenerBean extends ListenerAdapter {
@Transactional
public void onGuildMessageUpdate(@Nonnull GuildMessageUpdateEvent event) {
metricService.incrementCounter(MESSAGE_UPDATED_COUNTER);
if(listenerList == null) return;
Message message = event.getMessage();
messageCache.getMessageFromCache(message.getGuild().getIdLong(), message.getTextChannel().getIdLong(), event.getMessageIdLong()).thenAccept(cachedMessage -> {
self.executeListener(cachedMessage, event);
messageCache.putMessageInCache(message);
try {
executeAsyncListeners(event, cachedMessage);
if (listenerList != null) {
self.executeListener(cachedMessage, event);
}
} finally {
cachedMessage.setContent(message.getContentRaw());
messageCache.putMessageInCache(cachedMessage);
}
}).exceptionally(throwable -> {
log.error("Message retrieval {} from cache failed. ", event.getMessage().getId(), throwable);
return null;
@@ -67,6 +83,7 @@ public class MessageUpdatedListenerBean extends ListenerAdapter {
@Transactional
public void executeListener(CachedMessage cachedMessage, GuildMessageUpdateEvent event) {
if(listenerList == null) return;
MessageTextUpdatedModel model = getModel(event, cachedMessage);
listenerList.forEach(messageTextUpdatedListener -> listenerService.executeFeatureAwareListener(messageTextUpdatedListener, model));
}
@@ -79,6 +96,14 @@ public class MessageUpdatedListenerBean extends ListenerAdapter {
.build();
}
private void executeAsyncListeners(GuildMessageUpdateEvent event, CachedMessage oldMessage) {
if(asyncListenerList == null) return;
MessageTextUpdatedModel model = getModel(event, oldMessage);
asyncListenerList.forEach(messageTextUpdatedListener ->
listenerService.executeFeatureAwareListener(messageTextUpdatedListener, model, messageUpdatedExecutor)
);
}
@PostConstruct
public void postConstruct() {
metricService.registerCounter(MESSAGE_UPDATED_COUNTER, "Messages updated");

View File

@@ -1,67 +0,0 @@
package dev.sheldan.abstracto.core.listener.async.jda;
import dev.sheldan.abstracto.core.listener.ListenerService;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.models.listener.MessageTextUpdatedModel;
import dev.sheldan.abstracto.core.service.MessageCache;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.events.message.guild.GuildMessageUpdateEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
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 java.util.List;
@Component
@Slf4j
public class AsyncMessageUpdatedListenerBean extends ListenerAdapter {
@Autowired(required = false)
private List<AsyncMessageTextUpdatedListener> listener;
@Autowired
private MessageCache messageCache;
@Autowired
private AsyncMessageUpdatedListenerBean self;
@Autowired
@Qualifier("messageUpdatedExecutor")
private TaskExecutor messageUpdatedExecutor;
@Autowired
private ListenerService listenerService;
@Override
@Transactional
public void onGuildMessageUpdate(GuildMessageUpdateEvent event) {
if(listener == null) return;
Message message = event.getMessage();
messageCache.getMessageFromCache(message.getGuild().getIdLong(), message.getTextChannel().getIdLong(), event.getMessageIdLong())
.thenAcceptBoth(messageCache.putMessageInCache(message), (oldCache, newCache) -> self.executeListeners(event, oldCache))
.exceptionally(throwable -> {
log.error("Message retrieval {} from cache failed. ", event.getMessage().getId(), throwable);
return null;
});
}
public void executeListeners(GuildMessageUpdateEvent event, CachedMessage oldMessage) {
MessageTextUpdatedModel model = getModel(event, oldMessage);
listener.forEach(messageTextUpdatedListener ->
listenerService.executeFeatureAwareListener(messageTextUpdatedListener, model, messageUpdatedExecutor)
);
}
private MessageTextUpdatedModel getModel(GuildMessageUpdateEvent event, CachedMessage oldMessage) {
return MessageTextUpdatedModel
.builder()
.after(event.getMessage())
.before(oldMessage)
.build();
}
}

View File

@@ -9,6 +9,7 @@ import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Lazy;
@@ -102,5 +103,11 @@ public class MessageCacheBean implements MessageCache {
return future;
}
@Override
@CacheEvict(allEntries = true)
public void clearCache() {
log.info("Clearing message cache.");
}
}

View File

@@ -11,4 +11,5 @@ public interface MessageCache {
CompletableFuture<CachedMessage> getMessageFromCache(Message message);
CompletableFuture<CachedMessage> putMessageInCache(CachedMessage message);
CompletableFuture<CachedMessage> loadMessage(Long guildId, Long textChannelId, Long messageId);
void clearCache();
}