fixed link embedding not properly working with sessions

This commit is contained in:
Sheldan
2020-05-12 08:59:08 +02:00
parent 5639ca20b5
commit 1634f5e9cc
4 changed files with 29 additions and 16 deletions

View File

@@ -3,7 +3,6 @@ package dev.sheldan.abstracto.utility.listener.embed;
import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.listener.MessageReceivedListener; import dev.sheldan.abstracto.core.listener.MessageReceivedListener;
import dev.sheldan.abstracto.core.models.cache.CachedMessage; import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.MessageCache; import dev.sheldan.abstracto.core.service.MessageCache;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.utility.models.MessageEmbedLink; import dev.sheldan.abstracto.utility.models.MessageEmbedLink;
@@ -31,16 +30,18 @@ public class MessageEmbedListener implements MessageReceivedListener {
@Autowired @Autowired
private MessageEmbedService messageEmbedService; private MessageEmbedService messageEmbedService;
@Autowired
private MessageEmbedListener self;
@Override @Override
public void execute(Message message) { public void execute(Message message) {
String messageRaw = message.getContentRaw(); String messageRaw = message.getContentRaw();
List<MessageEmbedLink> links = messageEmbedService.getLinksInMessage(messageRaw); List<MessageEmbedLink> links = messageEmbedService.getLinksInMessage(messageRaw);
for (MessageEmbedLink messageEmbedLink : links) { for (MessageEmbedLink messageEmbedLink : links) {
messageRaw = messageRaw.replace(messageEmbedLink.getWholeUrl(), ""); messageRaw = messageRaw.replace(messageEmbedLink.getWholeUrl(), "");
Long cause = userInServerManagementService.loadUser(message.getMember()).getUserInServerId(); Long userEmbeddingUserInServerId = userInServerManagementService.loadUser(message.getMember()).getUserInServerId();
Consumer<CachedMessage> cachedMessageConsumer = cachedMessage -> { Consumer<CachedMessage> cachedMessageConsumer = cachedMessage -> {
AUserInAServer userInAServer = userInServerManagementService.loadUser(cause); self.loadUserAndEmbed(message, userEmbeddingUserInServerId, cachedMessage);
messageEmbedService.embedLink(cachedMessage, message.getTextChannel(), userInAServer , message);
}; };
messageCache.getMessageFromCache(messageEmbedLink.getServerId(), messageEmbedLink.getChannelId(), messageEmbedLink.getMessageId()).thenAccept(cachedMessageConsumer) messageCache.getMessageFromCache(messageEmbedLink.getServerId(), messageEmbedLink.getChannelId(), messageEmbedLink.getMessageId()).thenAccept(cachedMessageConsumer)
.exceptionally(throwable -> { .exceptionally(throwable -> {
@@ -53,6 +54,10 @@ public class MessageEmbedListener implements MessageReceivedListener {
} }
} }
public void loadUserAndEmbed(Message message, Long cause, CachedMessage cachedMessage) {
messageEmbedService.embedLink(cachedMessage, message.getTextChannel(), cause , message);
}
@Override @Override
public FeatureEnum getFeature() { public FeatureEnum getFeature() {
return UtilityFeature.LINK_EMBEDS; return UtilityFeature.LINK_EMBEDS;

View File

@@ -96,13 +96,11 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
} }
@Override @Override
public void embedLinks(List<MessageEmbedLink> linksToEmbed, TextChannel target, AUserInAServer reason, Message embeddingMessage) { public void embedLinks(List<MessageEmbedLink> linksToEmbed, TextChannel target, Long userEmbeddingUserInServerId, Message embeddingMessage) {
linksToEmbed.forEach(messageEmbedLink -> { linksToEmbed.forEach(messageEmbedLink -> {
Long userInServerId = reason.getUserInServerId();
messageCache.getMessageFromCache(messageEmbedLink.getServerId(), messageEmbedLink.getChannelId(), messageEmbedLink.getMessageId()) messageCache.getMessageFromCache(messageEmbedLink.getServerId(), messageEmbedLink.getChannelId(), messageEmbedLink.getMessageId())
.thenAccept(cachedMessage -> { .thenAccept(cachedMessage -> {
AUserInAServer cause = userInServerManagementService.loadUser(userInServerId); self.embedLink(cachedMessage, target, userEmbeddingUserInServerId, embeddingMessage);
self.embedLink(cachedMessage, target, cause, embeddingMessage);
} }
).exceptionally(throwable -> { ).exceptionally(throwable -> {
log.error("Message retrieval from cache failed for message {}.", messageEmbedLink.getMessageId(), throwable); log.error("Message retrieval from cache failed for message {}.", messageEmbedLink.getMessageId(), throwable);
@@ -113,7 +111,8 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
@Override @Override
@Transactional @Transactional
public void embedLink(CachedMessage cachedMessage, TextChannel target, AUserInAServer cause, Message embeddingMessage) { public void embedLink(CachedMessage cachedMessage, TextChannel target, Long userEmbeddingUserInServerId, Message embeddingMessage) {
AUserInAServer cause = userInServerManagementService.loadUser(userEmbeddingUserInServerId);
MessageEmbeddedModel messageEmbeddedModel = buildTemplateParameter(embeddingMessage, cachedMessage); MessageEmbeddedModel messageEmbeddedModel = buildTemplateParameter(embeddingMessage, cachedMessage);
MessageToSend embed = templateService.renderEmbedTemplate(MESSAGE_EMBED_TEMPLATE, messageEmbeddedModel); MessageToSend embed = templateService.renderEmbedTemplate(MESSAGE_EMBED_TEMPLATE, messageEmbeddedModel);
List<CompletableFuture<Message>> completableFutures = channelService.sendMessageToSendToChannel(embed, target); List<CompletableFuture<Message>> completableFutures = channelService.sendMessageToSendToChannel(embed, target);

View File

@@ -1,7 +1,6 @@
package dev.sheldan.abstracto.utility.service; package dev.sheldan.abstracto.utility.service;
import dev.sheldan.abstracto.core.models.cache.CachedMessage; import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.utility.models.MessageEmbedLink; import dev.sheldan.abstracto.utility.models.MessageEmbedLink;
import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.entities.TextChannel;
@@ -10,6 +9,6 @@ import java.util.List;
public interface MessageEmbedService { public interface MessageEmbedService {
List<MessageEmbedLink> getLinksInMessage(String message); List<MessageEmbedLink> getLinksInMessage(String message);
void embedLinks(List<MessageEmbedLink> linksToEmbed, TextChannel target, AUserInAServer reason, Message embeddingMessage); void embedLinks(List<MessageEmbedLink> linksToEmbed, TextChannel target, Long userEmbeddingUserInServerId, Message embeddingMessage);
void embedLink(CachedMessage cachedMessage, TextChannel target, AUserInAServer cause, Message embeddingMessage); void embedLink(CachedMessage cachedMessage, TextChannel target, Long userEmbeddingUserInServerId, Message embeddingMessage);
} }

View File

@@ -14,8 +14,8 @@ import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.awt.*; import java.awt.*;
import java.time.Instant; import java.time.Instant;
@@ -44,6 +44,11 @@ public class MessageCacheBean implements MessageCache {
// needs to be lazy, because of circular dependency // needs to be lazy, because of circular dependency
private MessageCache self; private MessageCache self;
@Autowired
@Lazy
// needs to be lazy, because of circular dependency
private MessageCacheBean concreteSelf;
@Override @Override
@CachePut(key = "#message.id") @CachePut(key = "#message.id")
public CompletableFuture<CachedMessage> putMessageInCache(Message message) { public CompletableFuture<CachedMessage> putMessageInCache(Message message) {
@@ -155,9 +160,7 @@ public class MessageCacheBean implements MessageCache {
List<Long> ausers = new ArrayList<>(); List<Long> ausers = new ArrayList<>();
users.forEachAsync(user -> { users.forEachAsync(user -> {
if(reaction.getGuild() != null) { concreteSelf.loadUser(reaction, ausers, user);
ausers.add(userInServerManagementService.loadUser(reaction.getGuild().getIdLong(), user.getIdLong()).getUserInServerId());
}
return false; return false;
}).thenAccept(o -> future.complete(builder.build())) }).thenAccept(o -> future.complete(builder.build()))
.exceptionally(throwable -> { .exceptionally(throwable -> {
@@ -168,6 +171,13 @@ public class MessageCacheBean implements MessageCache {
builder.emote(emoteService.buildAEmoteFromReaction(reaction.getReactionEmote())); builder.emote(emoteService.buildAEmoteFromReaction(reaction.getReactionEmote()));
} }
@Transactional
public void loadUser(MessageReaction reaction, List<Long> ausers, User user) {
if(reaction.getGuild() != null) {
ausers.add(userInServerManagementService.loadUser(reaction.getGuild().getIdLong(), user.getIdLong()).getUserInServerId());
}
}
private CachedEmbed getCachedEmbedFromEmbed(MessageEmbed embed) { private CachedEmbed getCachedEmbedFromEmbed(MessageEmbed embed) {
CachedEmbed.CachedEmbedBuilder builder = CachedEmbed CachedEmbed.CachedEmbedBuilder builder = CachedEmbed
.builder(); .builder();