diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/async/jda/AsyncReactionAddedListenerBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/async/jda/AsyncReactionAddedListenerBean.java index 68ee38db7..50c1448f4 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/async/jda/AsyncReactionAddedListenerBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/async/jda/AsyncReactionAddedListenerBean.java @@ -6,7 +6,9 @@ import dev.sheldan.abstracto.core.models.cache.CachedMessage; import dev.sheldan.abstracto.core.models.cache.CachedReactions; import dev.sheldan.abstracto.core.models.listener.ReactionAddedModel; import dev.sheldan.abstracto.core.service.*; +import dev.sheldan.abstracto.core.utils.FutureUtils; import lombok.extern.slf4j.Slf4j; +import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.events.message.guild.react.GuildMessageReactionAddEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import org.springframework.beans.factory.annotation.Autowired; @@ -16,6 +18,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Nonnull; +import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -53,15 +56,15 @@ public class AsyncReactionAddedListenerBean extends ListenerAdapter { if(event.getUserIdLong() == event.getJDA().getSelfUser().getIdLong()) { return; } + CompletableFuture memberFuture = event.retrieveMember().submit(); CompletableFuture asyncMessageFromCache = messageCache.getMessageFromCache(event.getGuild().getIdLong(), event.getChannel().getIdLong(), event.getMessageIdLong()); - asyncMessageFromCache.thenAccept(cachedMessage -> - cacheEntityService.getCachedReactionFromReaction(event.getReaction()).thenAccept(reaction -> - self.callAddedListeners(event, cachedMessage, reaction) - ).exceptionally(throwable -> { - log.error("Failed to handle add reaction to message {} ", event.getMessageIdLong(), throwable); - return null; - }) - ).exceptionally(throwable -> { + CompletableFuture reactionCacheFuture = cacheEntityService.getCachedReactionFromReaction(event.getReaction()); + FutureUtils.toSingleFuture(Arrays.asList(asyncMessageFromCache, memberFuture, reactionCacheFuture)).thenAccept(aVoid -> { + CachedMessage cachedMessage = asyncMessageFromCache.join(); + CachedReactions reaction = reactionCacheFuture.join(); + Member member = memberFuture.join(); + self.callAddedListeners(event, cachedMessage, reaction, member); + }).exceptionally(throwable -> { log.error("Message retrieval {} from cache failed. ", event.getMessageIdLong(), throwable); return null; }); @@ -83,20 +86,20 @@ public class AsyncReactionAddedListenerBean extends ListenerAdapter { } @Transactional - public void callAddedListeners(GuildMessageReactionAddEvent event, CachedMessage cachedMessage, CachedReactions reaction) { + public void callAddedListeners(GuildMessageReactionAddEvent event, CachedMessage cachedMessage, CachedReactions reaction, Member member) { ServerUser serverUser = ServerUser.builder().serverId(event.getGuild().getIdLong()).userId(event.getUserIdLong()).build(); addReactionIfNotThere(cachedMessage, reaction, serverUser); - ReactionAddedModel model = getModel(event, cachedMessage, serverUser); + ReactionAddedModel model = getModel(event, cachedMessage, serverUser, member); messageCache.putMessageInCache(cachedMessage); listenerList.forEach(asyncReactionAddedListener -> listenerService.executeFeatureAwareListener(asyncReactionAddedListener, model, reactionAddedTaskExecutor)); } - private ReactionAddedModel getModel(GuildMessageReactionAddEvent event, CachedMessage cachedMessage, ServerUser userReacting) { + private ReactionAddedModel getModel(GuildMessageReactionAddEvent event, CachedMessage cachedMessage, ServerUser userReacting, Member member) { return ReactionAddedModel .builder() .reaction(event.getReaction()) .message(cachedMessage) - .memberReacting(event.getMember()) + .memberReacting(member) .userReacting(userReacting) .build(); } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/sync/jda/ReactionAddedListenerBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/sync/jda/ReactionAddedListenerBean.java index 32056683d..4fd507517 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/sync/jda/ReactionAddedListenerBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/sync/jda/ReactionAddedListenerBean.java @@ -8,7 +8,9 @@ import dev.sheldan.abstracto.core.models.listener.ReactionAddedModel; import dev.sheldan.abstracto.core.service.*; import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.core.utils.BeanUtils; +import dev.sheldan.abstracto.core.utils.FutureUtils; import lombok.extern.slf4j.Slf4j; +import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.events.message.guild.react.GuildMessageReactionAddEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import org.springframework.beans.factory.annotation.Autowired; @@ -17,6 +19,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Nonnull; import javax.annotation.PostConstruct; +import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -59,16 +62,16 @@ public class ReactionAddedListenerBean extends ListenerAdapter { if(event.getUserIdLong() == botService.getInstance().getSelfUser().getIdLong()) { return; } + CompletableFuture memberFuture = event.retrieveMember().submit(); CompletableFuture asyncMessageFromCache = messageCache.getMessageFromCache(event.getGuild().getIdLong(), event.getChannel().getIdLong(), event.getMessageIdLong()); - asyncMessageFromCache.thenAccept(cachedMessage -> - cacheEntityService.getCachedReactionFromReaction(event.getReaction()).thenAccept(reaction -> { - self.callAddedListeners(event, cachedMessage, reaction); - messageCache.putMessageInCache(cachedMessage); - }).exceptionally(throwable -> { - log.error("Failed to handle add reaction to message {} ", event.getMessageIdLong(), throwable); - return null; - }) - ).exceptionally(throwable -> { + CompletableFuture reactionCacheFuture = cacheEntityService.getCachedReactionFromReaction(event.getReaction()); + FutureUtils.toSingleFuture(Arrays.asList(asyncMessageFromCache, memberFuture, reactionCacheFuture)).thenAccept(aVoid -> { + CachedMessage cachedMessage = asyncMessageFromCache.join(); + CachedReactions reaction = reactionCacheFuture.join(); + Member member = memberFuture.join(); + self.callAddedListeners(event, cachedMessage, reaction, member); + messageCache.putMessageInCache(cachedMessage); + }).exceptionally(throwable -> { log.error("Message retrieval {} from cache failed. ", event.getMessageIdLong(), throwable); return null; }); @@ -90,19 +93,19 @@ public class ReactionAddedListenerBean extends ListenerAdapter { } @Transactional - public void callAddedListeners(@Nonnull GuildMessageReactionAddEvent event, CachedMessage cachedMessage, CachedReactions reaction) { + public void callAddedListeners(@Nonnull GuildMessageReactionAddEvent event, CachedMessage cachedMessage, CachedReactions reaction, Member member) { ServerUser serverUser = ServerUser.builder().serverId(cachedMessage.getServerId()).userId(event.getUserIdLong()).build(); addReactionIfNotThere(cachedMessage, reaction, serverUser); - ReactionAddedModel model = getModel(event, cachedMessage, serverUser); + ReactionAddedModel model = getModel(event, cachedMessage, serverUser, member); addedListenerList.forEach(reactedAddedListener -> listenerService.executeFeatureAwareListener(reactedAddedListener, model)); } - private ReactionAddedModel getModel(GuildMessageReactionAddEvent event, CachedMessage cachedMessage, ServerUser userReacting) { + private ReactionAddedModel getModel(GuildMessageReactionAddEvent event, CachedMessage cachedMessage, ServerUser userReacting, Member member) { return ReactionAddedModel .builder() .reaction(event.getReaction()) .message(cachedMessage) - .memberReacting(event.getMember()) + .memberReacting(member) .userReacting(userReacting) .build(); }