mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-04-18 21:03:11 +00:00
[AB-154] split up private and guild message received handler, split handlers into async and sync handlers
adapting the tests and improving tests to reduce usage of MockUtils adding some util methods to message bean extending cache for cached messages enabling to build cached messages from messages in DM channels (they are not part of the message cache) splitting multiple listeners to different beans, for better overview (emote updated) adding convenience service for reactions specifically split cached reaction and cached reactions, singular only contains one user, while the later contains all users fixing liquibase configuration for assigned role user fixing assignable role not having a transaction moved caching update a bit earlier in various methods fixing bug that a manual unmute caused duplicate unmute notification fixing short scheduled unmute not checking the new mute state limiting parameters for roll
This commit is contained in:
@@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand
|
||||
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
|
||||
import dev.sheldan.abstracto.core.command.config.HelpInfo;
|
||||
import dev.sheldan.abstracto.core.command.config.Parameter;
|
||||
import dev.sheldan.abstracto.core.command.config.validator.MinIntegerValueValidator;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandResult;
|
||||
import dev.sheldan.abstracto.core.command.execution.ContextConverter;
|
||||
@@ -19,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
@@ -60,8 +62,8 @@ public class Roll extends AbstractConditionableCommand {
|
||||
@Override
|
||||
public CommandConfiguration getConfiguration() {
|
||||
List<Parameter> parameters = new ArrayList<>();
|
||||
parameters.add(Parameter.builder().name("high").type(Integer.class).templated(true).optional(true).build());
|
||||
parameters.add(Parameter.builder().name("low").type(Integer.class).templated(true).optional(true).build());
|
||||
parameters.add(Parameter.builder().name("high").type(Integer.class).templated(true).validators(Arrays.asList(MinIntegerValueValidator.min(2L))).optional(true).build());
|
||||
parameters.add(Parameter.builder().name("low").type(Integer.class).templated(true).validators(Arrays.asList(MinIntegerValueValidator.min(0L))).optional(true).build());
|
||||
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();
|
||||
return CommandConfiguration.builder()
|
||||
.name("roll")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.sheldan.abstracto.utility.config;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.ServerConfigListener;
|
||||
import dev.sheldan.abstracto.core.listener.sync.entity.ServerConfigListener;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
|
||||
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
|
||||
|
||||
@@ -2,7 +2,9 @@ package dev.sheldan.abstracto.utility.listener.embed;
|
||||
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
import dev.sheldan.abstracto.core.config.ListenerPriority;
|
||||
import dev.sheldan.abstracto.core.listener.MessageReceivedListener;
|
||||
import dev.sheldan.abstracto.core.listener.sync.jda.MessageReceivedListener;
|
||||
import dev.sheldan.abstracto.core.execution.result.ExecutionResult;
|
||||
import dev.sheldan.abstracto.core.execution.result.MessageReceivedListenerResult;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.service.MessageCache;
|
||||
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
|
||||
@@ -11,6 +13,7 @@ import dev.sheldan.abstracto.utility.models.MessageEmbedLink;
|
||||
import dev.sheldan.abstracto.utility.service.MessageEmbedService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
import net.dv8tion.jda.api.events.Event;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
@@ -36,7 +39,7 @@ public class MessageEmbedListener implements MessageReceivedListener {
|
||||
private MessageEmbedListener self;
|
||||
|
||||
@Override
|
||||
public void execute(Message message) {
|
||||
public MessageReceivedListenerResult execute(Message message) {
|
||||
String messageRaw = message.getContentRaw();
|
||||
List<MessageEmbedLink> links = messageEmbedService.getLinksInMessage(messageRaw);
|
||||
if(!links.isEmpty()) {
|
||||
@@ -59,7 +62,12 @@ public class MessageEmbedListener implements MessageReceivedListener {
|
||||
}
|
||||
if(StringUtils.isBlank(messageRaw) && !links.isEmpty()) {
|
||||
message.delete().queue();
|
||||
return MessageReceivedListenerResult.DELETED;
|
||||
}
|
||||
if(!links.isEmpty()) {
|
||||
return MessageReceivedListenerResult.PROCESSED;
|
||||
}
|
||||
return MessageReceivedListenerResult.IGNORED;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@@ -73,6 +81,11 @@ public class MessageEmbedListener implements MessageReceivedListener {
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldConsume(Event event, ExecutionResult result) {
|
||||
return result.equals(MessageReceivedListenerResult.DELETED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FeatureEnum getFeature() {
|
||||
return UtilityFeature.LINK_EMBEDS;
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
package dev.sheldan.abstracto.utility.listener.embed;
|
||||
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
import dev.sheldan.abstracto.core.config.ListenerPriority;
|
||||
import dev.sheldan.abstracto.core.listener.ReactedAddedListener;
|
||||
import dev.sheldan.abstracto.core.listener.async.jda.AsyncReactionAddedListener;
|
||||
import dev.sheldan.abstracto.core.models.ServerUser;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedReactions;
|
||||
import dev.sheldan.abstracto.core.models.database.AEmote;
|
||||
import dev.sheldan.abstracto.core.models.database.AUser;
|
||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import dev.sheldan.abstracto.core.service.BotService;
|
||||
import dev.sheldan.abstracto.core.service.EmoteService;
|
||||
import dev.sheldan.abstracto.core.service.MessageService;
|
||||
@@ -14,8 +13,6 @@ import dev.sheldan.abstracto.utility.config.features.UtilityFeature;
|
||||
import dev.sheldan.abstracto.utility.models.database.EmbeddedMessage;
|
||||
import dev.sheldan.abstracto.utility.service.management.MessageEmbedPostManagementService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.dv8tion.jda.api.entities.MessageReaction;
|
||||
import net.dv8tion.jda.api.events.message.guild.react.GuildMessageReactionAddEvent;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@@ -23,7 +20,7 @@ import java.util.Optional;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class MessageEmbedRemovalReactionListener implements ReactedAddedListener {
|
||||
public class MessageEmbedRemovalReactionListener implements AsyncReactionAddedListener {
|
||||
|
||||
public static final String REMOVAL_EMOTE = "removeEmbed";
|
||||
|
||||
@@ -39,19 +36,16 @@ public class MessageEmbedRemovalReactionListener implements ReactedAddedListener
|
||||
@Autowired
|
||||
private EmoteService emoteService;
|
||||
|
||||
|
||||
@Override
|
||||
public void executeReactionAdded(CachedMessage message, GuildMessageReactionAddEvent event, AUserInAServer userAdding) {
|
||||
public void executeReactionAdded(CachedMessage message, CachedReactions cachedReaction, ServerUser serverUser) {
|
||||
Long guildId = message.getServerId();
|
||||
AEmote aEmote = emoteService.getEmoteOrDefaultEmote(REMOVAL_EMOTE, guildId);
|
||||
MessageReaction.ReactionEmote reactionEmote = event.getReactionEmote();
|
||||
if(emoteService.isReactionEmoteAEmote(reactionEmote, aEmote)) {
|
||||
if(emoteService.compareCachedEmoteWithAEmote(cachedReaction.getEmote(), aEmote)) {
|
||||
Optional<EmbeddedMessage> embeddedMessageOptional = messageEmbedPostManagementService.findEmbeddedPostByMessageId(message.getMessageId());
|
||||
if(embeddedMessageOptional.isPresent()) {
|
||||
EmbeddedMessage embeddedMessage = embeddedMessageOptional.get();
|
||||
AUser userReacting = userAdding.getUserReference();
|
||||
if(embeddedMessage.getEmbeddedUser().getUserReference().getId().equals(userReacting.getId())
|
||||
|| embeddedMessage.getEmbeddingUser().getUserReference().getId().equals(userReacting.getId())
|
||||
if(embeddedMessage.getEmbeddedUser().getUserReference().getId().equals(serverUser.getUserId())
|
||||
|| embeddedMessage.getEmbeddingUser().getUserReference().getId().equals(serverUser.getUserId())
|
||||
) {
|
||||
log.info("Removing embed in message {} in channel {} in server {} because of a user reaction.", message.getMessageId(), message.getChannelId(), message.getServerId());
|
||||
messageService.deleteMessageInChannelInServer(message.getServerId(), message.getChannelId(), message.getMessageId()).thenAccept(aVoid ->{
|
||||
@@ -74,8 +68,4 @@ public class MessageEmbedRemovalReactionListener implements ReactedAddedListener
|
||||
return UtilityFeature.LINK_EMBEDS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getPriority() {
|
||||
return ListenerPriority.HIGH;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.sheldan.abstracto.utility.listener.repost;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.entity.ChannelGroupCreatedListener;
|
||||
import dev.sheldan.abstracto.core.listener.sync.entity.ChannelGroupCreatedListener;
|
||||
import dev.sheldan.abstracto.core.models.database.AChannelGroup;
|
||||
import dev.sheldan.abstracto.utility.service.RepostServiceBean;
|
||||
import dev.sheldan.abstracto.utility.service.management.RepostCheckChannelGroupManagement;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.sheldan.abstracto.utility.listener.repost;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.entity.ChannelGroupDeletedListener;
|
||||
import dev.sheldan.abstracto.core.listener.sync.entity.ChannelGroupDeletedListener;
|
||||
import dev.sheldan.abstracto.core.models.database.AChannelGroup;
|
||||
import dev.sheldan.abstracto.utility.service.RepostServiceBean;
|
||||
import dev.sheldan.abstracto.utility.service.management.RepostCheckChannelGroupManagement;
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
package dev.sheldan.abstracto.utility.listener.repost;
|
||||
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
import dev.sheldan.abstracto.core.config.ListenerPriority;
|
||||
import dev.sheldan.abstracto.core.listener.MessageEmbeddedListener;
|
||||
import dev.sheldan.abstracto.core.listener.async.jda.AsyncMessageEmbeddedListener;
|
||||
import dev.sheldan.abstracto.core.models.database.AChannel;
|
||||
import dev.sheldan.abstracto.core.models.listener.GuildMessageEmbedEventModel;
|
||||
import dev.sheldan.abstracto.core.service.BotService;
|
||||
import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
|
||||
import dev.sheldan.abstracto.utility.config.features.UtilityFeature;
|
||||
import dev.sheldan.abstracto.utility.service.RepostCheckChannelService;
|
||||
import dev.sheldan.abstracto.utility.service.RepostService;
|
||||
@@ -19,7 +21,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class RepostEmbedListener implements MessageEmbeddedListener {
|
||||
public class RepostEmbedListener implements AsyncMessageEmbeddedListener {
|
||||
|
||||
@Autowired
|
||||
private RepostCheckChannelService repostCheckChannelService;
|
||||
@@ -30,15 +32,22 @@ public class RepostEmbedListener implements MessageEmbeddedListener {
|
||||
@Autowired
|
||||
private PostedImageManagement repostManagement;
|
||||
|
||||
@Autowired
|
||||
private ChannelManagementService channelManagementService;
|
||||
|
||||
@Autowired
|
||||
private BotService botService;
|
||||
|
||||
@Override
|
||||
public void execute(GuildMessageEmbedEventModel eventModel) {
|
||||
if(repostCheckChannelService.duplicateCheckEnabledForChannel(eventModel.getChannel())) {
|
||||
AChannel channel = channelManagementService.loadChannel(eventModel.getChannelId());
|
||||
if(repostCheckChannelService.duplicateCheckEnabledForChannel(channel)) {
|
||||
if(repostManagement.messageEmbedsHaveBeenCovered(eventModel.getMessageId())) {
|
||||
log.info("The embeds of the message {} in channel {} in server {} have already been covered by repost check -- ignoring.",
|
||||
eventModel.getMessageId(), eventModel.getChannel().getIdLong(), eventModel.getChannel().getGuild().getIdLong());
|
||||
eventModel.getMessageId(), eventModel.getChannelId(), eventModel.getServerId());
|
||||
return;
|
||||
}
|
||||
eventModel.getChannel().retrieveMessageById(eventModel.getMessageId()).queue(message -> {
|
||||
botService.getTextChannelFromServer(eventModel.getServerId(), eventModel.getChannelId()).retrieveMessageById(eventModel.getMessageId()).queue(message -> {
|
||||
List<MessageEmbed> imageEmbeds = eventModel.getEmbeds().stream().filter(messageEmbed -> messageEmbed.getType().equals(EmbedType.IMAGE)).collect(Collectors.toList());
|
||||
repostService.processMessageEmbedsRepostCheck(imageEmbeds, message);
|
||||
});
|
||||
@@ -50,9 +59,4 @@ public class RepostEmbedListener implements MessageEmbeddedListener {
|
||||
return UtilityFeature.REPOST_DETECTION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getPriority() {
|
||||
return ListenerPriority.MEDIUM;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
package dev.sheldan.abstracto.utility.listener.repost;
|
||||
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
import dev.sheldan.abstracto.core.config.ListenerPriority;
|
||||
import dev.sheldan.abstracto.core.listener.MessageReceivedListener;
|
||||
import dev.sheldan.abstracto.core.listener.async.jda.AsyncMessageReceivedListener;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedEmbed;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.database.AChannel;
|
||||
import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
|
||||
import dev.sheldan.abstracto.utility.config.features.UtilityFeature;
|
||||
import dev.sheldan.abstracto.utility.service.RepostCheckChannelService;
|
||||
import dev.sheldan.abstracto.utility.service.RepostService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.dv8tion.jda.api.entities.EmbedType;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
import net.dv8tion.jda.api.entities.MessageEmbed;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@@ -19,7 +20,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class RepostMessageReceivedListener implements MessageReceivedListener {
|
||||
public class RepostMessageReceivedListener implements AsyncMessageReceivedListener {
|
||||
|
||||
@Autowired
|
||||
private RepostCheckChannelService repostCheckChannelService;
|
||||
@@ -27,11 +28,15 @@ public class RepostMessageReceivedListener implements MessageReceivedListener {
|
||||
@Autowired
|
||||
private RepostService repostService;
|
||||
|
||||
@Autowired
|
||||
private ChannelManagementService channelManagementService;
|
||||
|
||||
@Override
|
||||
public void execute(Message message) {
|
||||
if(repostCheckChannelService.duplicateCheckEnabledForChannel(message.getTextChannel())) {
|
||||
public void execute(CachedMessage message) {
|
||||
AChannel channel = channelManagementService.loadChannel(message.getChannelId());
|
||||
if(repostCheckChannelService.duplicateCheckEnabledForChannel(channel)) {
|
||||
repostService.processMessageAttachmentRepostCheck(message);
|
||||
List<MessageEmbed> imageEmbeds = message.getEmbeds().stream().filter(messageEmbed -> messageEmbed.getType().equals(EmbedType.IMAGE)).collect(Collectors.toList());
|
||||
List<CachedEmbed> imageEmbeds = message.getEmbeds().stream().filter(messageEmbed -> messageEmbed.getType().equals(EmbedType.IMAGE)).collect(Collectors.toList());
|
||||
repostService.processMessageEmbedsRepostCheck(imageEmbeds, message);
|
||||
}
|
||||
}
|
||||
@@ -41,8 +46,4 @@ public class RepostMessageReceivedListener implements MessageReceivedListener {
|
||||
return UtilityFeature.REPOST_DETECTION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getPriority() {
|
||||
return ListenerPriority.MEDIUM;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package dev.sheldan.abstracto.utility.listener.starboard;
|
||||
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
import dev.sheldan.abstracto.core.config.ListenerPriority;
|
||||
import dev.sheldan.abstracto.core.listener.ReactedAddedListener;
|
||||
import dev.sheldan.abstracto.core.listener.ReactedRemovedListener;
|
||||
import dev.sheldan.abstracto.core.listener.ReactionClearedListener;
|
||||
import dev.sheldan.abstracto.core.listener.async.jda.AsyncReactionAddedListener;
|
||||
import dev.sheldan.abstracto.core.listener.async.jda.AsyncReactionClearedListener;
|
||||
import dev.sheldan.abstracto.core.listener.async.jda.AsyncReactionRemovedListener;
|
||||
import dev.sheldan.abstracto.core.models.ServerUser;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedReaction;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedReactions;
|
||||
import dev.sheldan.abstracto.core.models.database.AEmote;
|
||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import dev.sheldan.abstracto.core.service.BotService;
|
||||
@@ -19,9 +19,6 @@ import dev.sheldan.abstracto.utility.service.StarboardService;
|
||||
import dev.sheldan.abstracto.utility.service.management.StarboardPostManagementService;
|
||||
import dev.sheldan.abstracto.utility.service.management.StarboardPostReactorManagementService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.dv8tion.jda.api.entities.MessageReaction;
|
||||
import net.dv8tion.jda.api.events.message.guild.react.GuildMessageReactionAddEvent;
|
||||
import net.dv8tion.jda.api.events.message.guild.react.GuildMessageReactionRemoveEvent;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -33,7 +30,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class StarboardListener implements ReactedAddedListener, ReactedRemovedListener, ReactionClearedListener {
|
||||
public class StarboardListener implements AsyncReactionAddedListener, AsyncReactionRemovedListener, AsyncReactionClearedListener {
|
||||
|
||||
public static final String STAR_EMOTE = "star";
|
||||
public static final String FIRST_LEVEL_THRESHOLD_KEY = "starLvl1";
|
||||
@@ -61,34 +58,34 @@ public class StarboardListener implements ReactedAddedListener, ReactedRemovedLi
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void executeReactionAdded(CachedMessage message, GuildMessageReactionAddEvent addedReaction, AUserInAServer userAdding) {
|
||||
if(userAdding.getUserReference().getId().equals(message.getAuthorId())) {
|
||||
public void executeReactionAdded(CachedMessage message, CachedReactions cachedReaction, ServerUser serverUser) {
|
||||
if(serverUser.getUserId().equals(message.getAuthor().getAuthorId())) {
|
||||
return;
|
||||
}
|
||||
Long guildId = message.getServerId();
|
||||
AEmote aEmote = emoteService.getEmoteOrDefaultEmote(STAR_EMOTE, guildId);
|
||||
MessageReaction.ReactionEmote reactionEmote = addedReaction.getReactionEmote();
|
||||
if(emoteService.isReactionEmoteAEmote(reactionEmote, aEmote)) {
|
||||
log.info("User {} in server {} reacted with star to put a message {} from channel {} on starboard.", userAdding.getUserReference().getId(), userAdding.getServerReference().getId(), message.getMessageId(), message.getChannelId());
|
||||
Optional<CachedReaction> reactionOptional = emoteService.getReactionFromMessageByEmote(message, aEmote);
|
||||
handleStarboardPostChange(message, reactionOptional.orElse(null), userAdding, true);
|
||||
if(emoteService.compareCachedEmoteWithAEmote(cachedReaction.getEmote(), aEmote)) {
|
||||
log.info("User {} in server {} reacted with star to put a message {} from channel {} on starboard.", serverUser.getUserId(), message.getServerId(), message.getMessageId(), message.getChannelId());
|
||||
Optional<CachedReactions> reactionOptional = emoteService.getReactionFromMessageByEmote(message, aEmote);
|
||||
handleStarboardPostChange(message, reactionOptional.orElse(null), serverUser, true);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleStarboardPostChange(CachedMessage message, CachedReaction reaction, AUserInAServer userReacting, boolean adding) {
|
||||
private void handleStarboardPostChange(CachedMessage message, CachedReactions reaction, ServerUser serverUser, boolean adding) {
|
||||
Optional<StarboardPost> starboardPostOptional = starboardPostManagementService.findByMessageId(message.getMessageId());
|
||||
if(reaction != null) {
|
||||
AUserInAServer author = userInServerManagementService.loadUser(message.getServerId(), message.getAuthorId());
|
||||
List<AUserInAServer> userExceptAuthor = getUsersExcept(reaction.getUserInServersIds(), author);
|
||||
AUserInAServer author = userInServerManagementService.loadUser(message.getServerId(), message.getAuthor().getAuthorId());
|
||||
List<AUserInAServer> userExceptAuthor = getUsersExcept(reaction.getUsers(), author);
|
||||
Long starMinimum = getFromConfig(FIRST_LEVEL_THRESHOLD_KEY, message.getServerId());
|
||||
AUserInAServer userAddingReaction = userInServerManagementService.loadUser(serverUser);
|
||||
if (userExceptAuthor.size() >= starMinimum) {
|
||||
log.info("Post reached starboard minimum. Message {} in channel {} in server {} will be starred/updated.",
|
||||
message.getMessageId(), message.getChannelId(), message.getServerId());
|
||||
if(starboardPostOptional.isPresent()) {
|
||||
updateStarboardPost(message, userReacting, adding, starboardPostOptional.get(), userExceptAuthor);
|
||||
updateStarboardPost(message, userAddingReaction, adding, starboardPostOptional.get(), userExceptAuthor);
|
||||
} else {
|
||||
log.info("Creating starboard post for message {} in channel {} in server {}", message.getMessageId(), message.getChannelId(), message.getServerId());
|
||||
starboardService.createStarboardPost(message, userExceptAuthor, userReacting, author);
|
||||
starboardService.createStarboardPost(message, userExceptAuthor, userAddingReaction, author);
|
||||
}
|
||||
} else {
|
||||
if(starboardPostOptional.isPresent()) {
|
||||
@@ -124,17 +121,16 @@ public class StarboardListener implements ReactedAddedListener, ReactedRemovedLi
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void executeReactionRemoved(CachedMessage message, GuildMessageReactionRemoveEvent removedReaction, AUserInAServer userRemoving) {
|
||||
if(message.getAuthorId().equals(userRemoving.getUserReference().getId())) {
|
||||
public void executeReactionRemoved(CachedMessage message, CachedReactions removedReaction, ServerUser userRemoving) {
|
||||
if(message.getAuthor().getAuthorId().equals(userRemoving.getUserId())) {
|
||||
return;
|
||||
}
|
||||
Long guildId = message.getServerId();
|
||||
AEmote aEmote = emoteService.getEmoteOrDefaultEmote(STAR_EMOTE, guildId);
|
||||
MessageReaction.ReactionEmote reactionEmote = removedReaction.getReactionEmote();
|
||||
if(emoteService.isReactionEmoteAEmote(reactionEmote, aEmote)) {
|
||||
if(emoteService.compareCachedEmoteWithAEmote(removedReaction.getEmote(), aEmote)) {
|
||||
log.info("User {} in server {} removed star reaction from message {} on starboard.",
|
||||
userRemoving.getUserReference().getId(), userRemoving.getServerReference().getId(), message.getMessageId());
|
||||
Optional<CachedReaction> reactionOptional = emoteService.getReactionFromMessageByEmote(message, aEmote);
|
||||
userRemoving.getUserId(), message.getServerId(), message.getMessageId());
|
||||
Optional<CachedReactions> reactionOptional = emoteService.getReactionFromMessageByEmote(message, aEmote);
|
||||
handleStarboardPostChange(message, reactionOptional.orElse(null), userRemoving, false);
|
||||
}
|
||||
}
|
||||
@@ -143,9 +139,9 @@ public class StarboardListener implements ReactedAddedListener, ReactedRemovedLi
|
||||
return configManagementService.loadConfig(guildId, key).getLongValue();
|
||||
}
|
||||
|
||||
private List<AUserInAServer> getUsersExcept(List<Long> users, AUserInAServer author) {
|
||||
return users.stream().filter(user -> !user.equals(author.getUserInServerId())).map(aLong -> {
|
||||
Optional<AUserInAServer> aUserInAServer = userInServerManagementService.loadUserConditional(aLong);
|
||||
private List<AUserInAServer> getUsersExcept(List<ServerUser> users, AUserInAServer author) {
|
||||
return users.stream().filter(user -> !(user.getServerId().equals(author.getServerReference().getId()) && user.getUserId().equals(author.getUserReference().getId()))).map(serverUser -> {
|
||||
Optional<AUserInAServer> aUserInAServer = userInServerManagementService.loadUserOptional(serverUser.getServerId(), serverUser.getUserId());
|
||||
return aUserInAServer.orElse(null);
|
||||
}).filter(Objects::nonNull).collect(Collectors.toList());
|
||||
}
|
||||
@@ -167,8 +163,4 @@ public class StarboardListener implements ReactedAddedListener, ReactedRemovedLi
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getPriority() {
|
||||
return ListenerPriority.HIGH;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
package dev.sheldan.abstracto.utility.listener.starboard;
|
||||
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
import dev.sheldan.abstracto.core.config.ListenerPriority;
|
||||
import dev.sheldan.abstracto.core.listener.MessageDeletedListener;
|
||||
import dev.sheldan.abstracto.core.models.AServerAChannelAUser;
|
||||
import dev.sheldan.abstracto.core.models.GuildChannelMember;
|
||||
import dev.sheldan.abstracto.core.listener.async.jda.AsyncMessageDeletedListener;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.utility.config.features.UtilityFeature;
|
||||
import dev.sheldan.abstracto.utility.models.database.StarboardPost;
|
||||
@@ -17,18 +14,18 @@ import java.util.Optional;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class StarboardPostDeletedListener implements MessageDeletedListener {
|
||||
public class StarboardPostDeletedListener implements AsyncMessageDeletedListener {
|
||||
|
||||
@Autowired
|
||||
private StarboardPostManagementService starboardPostManagementService;
|
||||
|
||||
@Override
|
||||
public void execute(CachedMessage messageBefore, AServerAChannelAUser authorUser, GuildChannelMember authorMember) {
|
||||
public void execute(CachedMessage messageBefore) {
|
||||
Optional<StarboardPost> byStarboardPostId = starboardPostManagementService.findByStarboardPostId(messageBefore.getMessageId());
|
||||
if(byStarboardPostId.isPresent()) {
|
||||
StarboardPost post = byStarboardPostId.get();
|
||||
log.info("Removing starboard post: message {}, channel {}, server {}, because the message was deleted",
|
||||
post.getPostMessageId(), post.getSourceChanel().getId(), post.getAuthor().getUserReference().getId());
|
||||
post.getPostMessageId(), post.getSourceChanel().getId(), messageBefore.getServerId());
|
||||
starboardPostManagementService.setStarboardPostIgnored(messageBefore.getMessageId(), true);
|
||||
}
|
||||
}
|
||||
@@ -38,8 +35,4 @@ public class StarboardPostDeletedListener implements MessageDeletedListener {
|
||||
return UtilityFeature.STARBOARD;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getPriority() {
|
||||
return ListenerPriority.HIGH;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
|
||||
@Override
|
||||
@Transactional
|
||||
public CompletableFuture<Void> embedLink(CachedMessage cachedMessage, TextChannel target, Long userEmbeddingUserInServerId, Message embeddingMessage) {
|
||||
Optional<AUserInAServer> causeOpt = userInServerManagementService.loadUserConditional(userEmbeddingUserInServerId);
|
||||
Optional<AUserInAServer> causeOpt = userInServerManagementService.loadUserOptional(userEmbeddingUserInServerId);
|
||||
if(causeOpt.isPresent()) {
|
||||
return buildTemplateParameter(embeddingMessage, cachedMessage).thenCompose(messageEmbeddedModel ->
|
||||
self.sendEmbeddingMessage(cachedMessage, target, userEmbeddingUserInServerId, messageEmbeddedModel)
|
||||
@@ -145,7 +145,7 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
|
||||
}
|
||||
|
||||
private CompletableFuture<MessageEmbeddedModel> buildTemplateParameter(Message message, CachedMessage embeddedMessage) {
|
||||
return botService.getMemberInServerAsync(embeddedMessage.getServerId(), embeddedMessage.getAuthorId()).thenApply(member ->
|
||||
return botService.getMemberInServerAsync(embeddedMessage.getServerId(), embeddedMessage.getAuthor().getAuthorId()).thenApply(member ->
|
||||
self.loadMessageEmbedModel(message, embeddedMessage, member)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
package dev.sheldan.abstracto.utility.service;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.AServerAChannelAUser;
|
||||
import dev.sheldan.abstracto.core.models.ServerChannelMessageUser;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedAttachment;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedEmbed;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import dev.sheldan.abstracto.core.service.FeatureModeService;
|
||||
@@ -85,10 +89,31 @@ public class RepostServiceBean implements RepostService {
|
||||
public static final String REPOST_MARKER_EMOTE_KEY = "repostMarker";
|
||||
|
||||
@Override
|
||||
public boolean isRepost(Message message, MessageEmbed messageEmbed, Integer index) {
|
||||
public boolean isRepost(CachedMessage message, CachedEmbed messageEmbed, Integer index) {
|
||||
return getRepostFor(message, messageEmbed, index).isPresent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<PostedImage> getRepostFor(CachedMessage message, CachedEmbed messageEmbed, Integer embedIndex) {
|
||||
if(messageEmbed.getCachedThumbnail() == null && messageEmbed.getCachedImageInfo() == null) {
|
||||
return Optional.empty();
|
||||
}
|
||||
String urlToUse = null;
|
||||
if(messageEmbed.getCachedThumbnail() != null) {
|
||||
urlToUse = messageEmbed.getCachedThumbnail().getProxyUrl();
|
||||
} else if (messageEmbed.getCachedImageInfo() != null) {
|
||||
urlToUse = messageEmbed.getCachedImageInfo().getProxyUrl();
|
||||
}
|
||||
ServerChannelMessageUser serverChannelMessageUser = ServerChannelMessageUser
|
||||
.builder()
|
||||
.serverId(message.getServerId())
|
||||
.channelId(message.getChannelId())
|
||||
.userId(message.getAuthor().getAuthorId())
|
||||
.messageId(message.getMessageId())
|
||||
.build();
|
||||
return checkForDuplicates(serverChannelMessageUser, EMBEDDED_LINK_POSITION_START_INDEX + embedIndex, urlToUse);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<PostedImage> getRepostFor(Message message, MessageEmbed messageEmbed, Integer embedIndex) {
|
||||
if(messageEmbed.getThumbnail() == null && messageEmbed.getImage() == null) {
|
||||
@@ -100,38 +125,52 @@ public class RepostServiceBean implements RepostService {
|
||||
} else if (messageEmbed.getImage() != null) {
|
||||
urlToUse = messageEmbed.getImage().getProxyUrl();
|
||||
}
|
||||
return checkForDuplicates(message, EMBEDDED_LINK_POSITION_START_INDEX + embedIndex, urlToUse);
|
||||
ServerChannelMessageUser serverChannelMessageUser = ServerChannelMessageUser
|
||||
.builder()
|
||||
.serverId(message.getGuild().getIdLong())
|
||||
.channelId(message.getChannel().getIdLong())
|
||||
.userId(message.getAuthor().getIdLong())
|
||||
.messageId(message.getIdLong())
|
||||
.build();
|
||||
return checkForDuplicates(serverChannelMessageUser, EMBEDDED_LINK_POSITION_START_INDEX + embedIndex, urlToUse);
|
||||
}
|
||||
|
||||
private Optional<PostedImage> checkForDuplicates(Message message, Integer index, String fileUrl) {
|
||||
String fileHash = calculateHashForPost(fileUrl, message.getGuild().getIdLong());
|
||||
AServer aServer = serverManagementService.loadServer(message.getGuild().getIdLong());
|
||||
private Optional<PostedImage> checkForDuplicates(ServerChannelMessageUser serverChannelMessageUser, Integer index, String fileUrl) {
|
||||
String fileHash = calculateHashForPost(fileUrl, serverChannelMessageUser.getServerId());
|
||||
AServer aServer = serverManagementService.loadServer(serverChannelMessageUser.getServerId());
|
||||
Optional<PostedImage> potentialRepost = postedImageManagement.getPostWithHash(fileHash, aServer);
|
||||
if(potentialRepost.isPresent()) {
|
||||
PostedImage existingRepost = potentialRepost.get();
|
||||
return existingRepost.getPostId().getMessageId() != message.getIdLong() ? Optional.of(existingRepost) : Optional.empty();
|
||||
return !existingRepost.getPostId().getMessageId().equals(serverChannelMessageUser.getMessageId()) ? Optional.of(existingRepost) : Optional.empty();
|
||||
} else {
|
||||
AUserInAServer aUserInAServer = userInServerManagementService.loadUser(message.getMember());
|
||||
AUserInAServer aUserInAServer = userInServerManagementService.loadUser(serverChannelMessageUser.getServerId(), serverChannelMessageUser.getUserId());
|
||||
AServerAChannelAUser cause = AServerAChannelAUser
|
||||
.builder()
|
||||
.aUserInAServer(aUserInAServer)
|
||||
.channel(channelManagementService.loadChannel(message.getTextChannel().getIdLong()))
|
||||
.channel(channelManagementService.loadChannel(serverChannelMessageUser.getChannelId()))
|
||||
.guild(aServer)
|
||||
.user(aUserInAServer.getUserReference())
|
||||
.build();
|
||||
postedImageManagement.createPost(cause, message, fileHash, index);
|
||||
postedImageManagement.createPost(cause, serverChannelMessageUser.getMessageId(), fileHash, index);
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRepost(Message message, Message.Attachment attachment, Integer index) {
|
||||
public boolean isRepost(CachedMessage message, CachedAttachment attachment, Integer index) {
|
||||
return getRepostFor(message, attachment, index).isPresent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<PostedImage> getRepostFor(Message message, Message.Attachment attachment, Integer index) {
|
||||
return checkForDuplicates(message, index, attachment.getProxyUrl());
|
||||
public Optional<PostedImage> getRepostFor(CachedMessage message, CachedAttachment attachment, Integer index) {
|
||||
ServerChannelMessageUser serverChannelMessageUser = ServerChannelMessageUser
|
||||
.builder()
|
||||
.serverId(message.getServerId())
|
||||
.channelId(message.getChannelId())
|
||||
.userId(message.getAuthor().getAuthorId())
|
||||
.messageId(message.getMessageId())
|
||||
.build();
|
||||
return checkForDuplicates(serverChannelMessageUser, index, attachment.getProxyUrl());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -159,31 +198,38 @@ public class RepostServiceBean implements RepostService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processMessageAttachmentRepostCheck(Message message) {
|
||||
public void processMessageAttachmentRepostCheck(CachedMessage message) {
|
||||
boolean canThereBeMultipleReposts = message.getAttachments().size() > 1;
|
||||
for (int imageIndex = 0; imageIndex < message.getAttachments().size(); imageIndex++) {
|
||||
executeRepostCheckForAttachment(message, message.getAttachments().get(imageIndex), imageIndex, canThereBeMultipleReposts);
|
||||
}
|
||||
}
|
||||
|
||||
private void executeRepostCheckForAttachment(Message message, Message.Attachment attachment, Integer index, boolean moreRepostsPossible) {
|
||||
private void executeRepostCheckForAttachment(CachedMessage message, CachedAttachment attachment, Integer index, boolean moreRepostsPossible) {
|
||||
Optional<PostedImage> originalPostOptional = getRepostFor(message, attachment, index);
|
||||
originalPostOptional.ifPresent(postedImage -> markMessageAndPersist(message, index, moreRepostsPossible, postedImage));
|
||||
ServerChannelMessageUser serverChannelMessageUser = ServerChannelMessageUser
|
||||
.builder()
|
||||
.serverId(message.getServerId())
|
||||
.channelId(message.getChannelId())
|
||||
.userId(message.getAuthor().getAuthorId())
|
||||
.messageId(message.getMessageId())
|
||||
.build();
|
||||
originalPostOptional.ifPresent(postedImage -> markMessageAndPersist(serverChannelMessageUser, index, moreRepostsPossible, postedImage));
|
||||
}
|
||||
|
||||
private void markMessageAndPersist(Message message, Integer index, boolean moreRepostsPossible, PostedImage originalPost) {
|
||||
log.info("Detected repost in message embed {} of message {} in channel {} in server {}.", index, message.getIdLong(), message.getTextChannel().getIdLong(), message.getGuild().getIdLong());
|
||||
CompletableFuture<Void> markerFuture = messageService.addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, message.getGuild().getIdLong(), message);
|
||||
private void markMessageAndPersist(ServerChannelMessageUser messageUser, Integer index, boolean moreRepostsPossible, PostedImage originalPost) {
|
||||
log.info("Detected repost in message embed {} of message {} in channel {} in server {}.", index, messageUser.getMessageId(), messageUser.getChannelId(), messageUser.getServerId());
|
||||
CompletableFuture<Void> markerFuture = messageService.addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, messageUser.getServerId(), messageUser.getChannelId(), messageUser.getMessageId());
|
||||
CompletableFuture<Void> counterFuture;
|
||||
if (moreRepostsPossible) {
|
||||
counterFuture = messageService.addDefaultReactionToMessageAsync(NUMBER_EMOJI.get(index), message);
|
||||
counterFuture = messageService.addDefaultReactionToMessageAsync(NUMBER_EMOJI.get(index), messageUser.getServerId(), messageUser.getChannelId(), messageUser.getMessageId());
|
||||
} else {
|
||||
counterFuture = CompletableFuture.completedFuture(null);
|
||||
}
|
||||
Long messageId = originalPost.getPostId().getMessageId();
|
||||
Integer position = originalPost.getPostId().getPosition();
|
||||
Long serverId = message.getGuild().getIdLong();
|
||||
Long userId = message.getAuthor().getIdLong();
|
||||
Long serverId = messageUser.getServerId();
|
||||
Long userId = messageUser.getUserId();
|
||||
CompletableFuture.allOf(markerFuture, counterFuture).thenAccept(unused ->
|
||||
self.persistRepost(messageId, position, serverId, userId)
|
||||
);
|
||||
@@ -202,6 +248,14 @@ public class RepostServiceBean implements RepostService {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processMessageEmbedsRepostCheck(List<CachedEmbed> embeds, CachedMessage message) {
|
||||
boolean canThereBeMultipleReposts = embeds.size() > 1 || !message.getAttachments().isEmpty();
|
||||
for (int imageIndex = 0; imageIndex < embeds.size(); imageIndex++) {
|
||||
executeRepostCheckForMessageEmbed(message, embeds.get(imageIndex), imageIndex + message.getAttachments().size(), canThereBeMultipleReposts);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processMessageEmbedsRepostCheck(List<MessageEmbed> embeds, Message message) {
|
||||
boolean canThereBeMultipleReposts = embeds.size() > 1 || !message.getAttachments().isEmpty();
|
||||
@@ -228,8 +282,27 @@ public class RepostServiceBean implements RepostService {
|
||||
repostManagementService.deleteRepostsFromServer(server);
|
||||
}
|
||||
|
||||
private void executeRepostCheckForMessageEmbed(CachedMessage message, CachedEmbed messageEmbed, Integer index, boolean moreRepostsPossible) {
|
||||
Optional<PostedImage> originalPostOptional = getRepostFor(message, messageEmbed, index);
|
||||
ServerChannelMessageUser serverChannelMessageUser = ServerChannelMessageUser
|
||||
.builder()
|
||||
.serverId(message.getServerId())
|
||||
.channelId(message.getChannelId())
|
||||
.userId(message.getAuthor().getAuthorId())
|
||||
.messageId(message.getMessageId())
|
||||
.build();
|
||||
originalPostOptional.ifPresent(postedImage -> markMessageAndPersist(serverChannelMessageUser, index, moreRepostsPossible, postedImage));
|
||||
}
|
||||
|
||||
private void executeRepostCheckForMessageEmbed(Message message, MessageEmbed messageEmbed, Integer index, boolean moreRepostsPossible) {
|
||||
Optional<PostedImage> originalPostOptional = getRepostFor(message, messageEmbed, index);
|
||||
originalPostOptional.ifPresent(postedImage -> markMessageAndPersist(message, index, moreRepostsPossible, postedImage));
|
||||
ServerChannelMessageUser serverChannelMessageUser = ServerChannelMessageUser
|
||||
.builder()
|
||||
.serverId(message.getGuild().getIdLong())
|
||||
.channelId(message.getChannel().getIdLong())
|
||||
.userId(message.getAuthor().getIdLong())
|
||||
.messageId(message.getIdLong())
|
||||
.build();
|
||||
originalPostOptional.ifPresent(postedImage -> markMessageAndPersist(serverChannelMessageUser, index, moreRepostsPossible, postedImage));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,7 +104,7 @@ public class StarboardServiceBean implements StarboardService {
|
||||
|
||||
@Transactional
|
||||
public void persistPost(CachedMessage message, List<Long> userExceptAuthorIds, List<CompletableFuture<Message>> completableFutures, Long starboardChannelId, Long starredUserId) {
|
||||
AUserInAServer innerStarredUser = userInServerManagementService.loadUserConditional(starredUserId).orElseThrow(() -> new UserInServerNotFoundException(starredUserId));
|
||||
AUserInAServer innerStarredUser = userInServerManagementService.loadUserOptional(starredUserId).orElseThrow(() -> new UserInServerNotFoundException(starredUserId));
|
||||
AChannel starboardChannel = channelManagementService.loadChannel(starboardChannelId);
|
||||
Message message1 = completableFutures.get(0).join();
|
||||
AServerAChannelMessage aServerAChannelMessage = AServerAChannelMessage
|
||||
@@ -119,17 +119,18 @@ public class StarboardServiceBean implements StarboardService {
|
||||
log.warn("There are no user ids except the author for the reactions in post {} in guild {} for message {} in channel {}.", starboardPost.getId(), message.getChannelId(), message.getMessageId(), message.getChannelId());
|
||||
}
|
||||
userExceptAuthorIds.forEach(aLong -> {
|
||||
AUserInAServer user = userInServerManagementService.loadUserConditional(aLong).orElseThrow(() -> new UserInServerNotFoundException(aLong));
|
||||
AUserInAServer user = userInServerManagementService.loadUserOptional(aLong).orElseThrow(() -> new UserInServerNotFoundException(aLong));
|
||||
starboardPostReactorManagementService.addReactor(starboardPost, user);
|
||||
});
|
||||
}
|
||||
|
||||
private CompletableFuture<StarboardPostModel> buildStarboardPostModel(CachedMessage message, Integer starCount) {
|
||||
return botService.getMemberInServerAsync(message.getServerId(), message.getAuthorId()).thenApply(member -> {
|
||||
return botService.getMemberInServerAsync(message.getServerId(), message.getAuthor().getAuthorId()).thenApply(member -> {
|
||||
Optional<TextChannel> channel = botService.getTextChannelFromServerOptional(message.getServerId(), message.getChannelId());
|
||||
Optional<Guild> guild = botService.getGuildByIdOptional(message.getServerId());
|
||||
// TODO use model objects instead of building entity models
|
||||
AChannel aChannel = AChannel.builder().id(message.getChannelId()).build();
|
||||
AUser user = AUser.builder().id(message.getAuthorId()).build();
|
||||
AUser user = AUser.builder().id(message.getAuthor().getAuthorId()).build();
|
||||
AServer server = AServer.builder().id(message.getServerId()).build();
|
||||
String starLevelEmote = getAppropriateEmote(message.getServerId(), starCount);
|
||||
return StarboardPostModel
|
||||
|
||||
@@ -44,7 +44,7 @@ public class MessageEmbedPostManagementServiceBean implements MessageEmbedPostMa
|
||||
}
|
||||
AChannel embeddingChannel = channelManagementService.loadChannel(messageContainingEmbed.getChannel().getIdLong());
|
||||
AChannel embeddedChannel = channelManagementService.loadChannel(embeddedMessage.getChannelId());
|
||||
AUserInAServer embeddedAuthor = userInServerManagementService.loadUser(embeddedMessage.getServerId(), embeddedMessage.getAuthorId());
|
||||
AUserInAServer embeddedAuthor = userInServerManagementService.loadUser(embeddedMessage.getServerId(), embeddedMessage.getAuthor().getAuthorId());
|
||||
EmbeddedMessage messageEmbedPost = EmbeddedMessage
|
||||
.builder()
|
||||
.embeddedMessageId(embeddedMessage.getMessageId())
|
||||
@@ -58,8 +58,8 @@ public class MessageEmbedPostManagementServiceBean implements MessageEmbedPostMa
|
||||
.build();
|
||||
|
||||
log.info("Saving embedded post: message {} by user {} in channel {} in server {} embedded message {} by user {} in channel {} in server {}.",
|
||||
messageContainingEmbed.getIdLong(), embeddingUser.getUserReference().getId(), embeddingChannel.getId(), embeddingUser.getServerReference().getId(),
|
||||
embeddedMessage.getMessageId(), embeddedMessage.getAuthorId(), embeddedMessage.getChannelId(), embeddedMessage.getServerId());
|
||||
messageContainingEmbed.getIdLong(), messageContainingEmbed.getAuthor().getIdLong(), embeddingChannel.getId(), messageContainingEmbed.getChannel().getIdLong(),
|
||||
embeddedMessage.getMessageId(), embeddedMessage.getAuthor().getAuthorId(), embeddedMessage.getChannelId(), embeddedMessage.getServerId());
|
||||
|
||||
embeddedMessageRepository.save(messageEmbedPost);
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ import dev.sheldan.abstracto.utility.models.database.PostedImage;
|
||||
import dev.sheldan.abstracto.utility.models.database.embed.PostIdentifier;
|
||||
import dev.sheldan.abstracto.utility.repository.PostedImageRepository;
|
||||
import dev.sheldan.abstracto.utility.service.RepostServiceBean;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@@ -25,11 +24,11 @@ public class PostedImageManagementBean implements PostedImageManagement {
|
||||
private RepostCheckChannelGroupManagement checkChannelBean;
|
||||
|
||||
@Override
|
||||
public PostedImage createPost(AServerAChannelAUser creation, Message source, String hash, Integer index) {
|
||||
public PostedImage createPost(AServerAChannelAUser creation, Long messageId, String hash, Integer index) {
|
||||
PostedImage post = PostedImage
|
||||
.builder()
|
||||
.imageHash(hash)
|
||||
.postId(new PostIdentifier(source.getIdLong(), index))
|
||||
.postId(new PostIdentifier(messageId, index))
|
||||
.poster(creation.getAUserInAServer())
|
||||
.server(creation.getGuild())
|
||||
.postedChannel(creation.getChannel())
|
||||
|
||||
@@ -1,22 +1,21 @@
|
||||
package dev.sheldan.abstracto.utility.listener.embed;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.ServerUser;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedEmote;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedReactions;
|
||||
import dev.sheldan.abstracto.core.models.database.AEmote;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import dev.sheldan.abstracto.core.models.database.AUser;
|
||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import dev.sheldan.abstracto.core.service.BotService;
|
||||
import dev.sheldan.abstracto.core.service.EmoteService;
|
||||
import dev.sheldan.abstracto.core.service.MessageService;
|
||||
import dev.sheldan.abstracto.core.test.MockUtils;
|
||||
import dev.sheldan.abstracto.utility.models.database.EmbeddedMessage;
|
||||
import dev.sheldan.abstracto.utility.service.management.MessageEmbedPostManagementService;
|
||||
import net.dv8tion.jda.api.entities.Emote;
|
||||
import net.dv8tion.jda.api.entities.MessageReaction;
|
||||
import net.dv8tion.jda.api.events.message.guild.react.GuildMessageReactionAddEvent;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.Mockito;
|
||||
import org.mockito.junit.MockitoJUnitRunner;
|
||||
|
||||
import java.util.Optional;
|
||||
@@ -27,12 +26,11 @@ import static org.mockito.Mockito.*;
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class MessageEmbedRemovalReactionListenerTest {
|
||||
|
||||
public static final long EMBEDDING_USER_ID = 6L;
|
||||
public static final long EMBEDDED_USER_ID = 7L;
|
||||
@InjectMocks
|
||||
private MessageEmbedRemovalReactionListener testUnit;
|
||||
|
||||
@Mock
|
||||
private BotService botService;
|
||||
|
||||
@Mock
|
||||
private MessageEmbedPostManagementService messageEmbedPostManagementService;
|
||||
|
||||
@@ -43,99 +41,111 @@ public class MessageEmbedRemovalReactionListenerTest {
|
||||
private EmoteService emoteService;
|
||||
|
||||
@Mock
|
||||
private GuildMessageReactionAddEvent messageReaction;
|
||||
private CachedReactions messageReaction;
|
||||
|
||||
@Mock
|
||||
private MessageReaction.ReactionEmote reactionEmote;
|
||||
private CachedEmote reactionEmote;
|
||||
|
||||
@Mock
|
||||
private Emote emote;
|
||||
private AUserInAServer embeddingUser;
|
||||
|
||||
@Mock
|
||||
private AUser embeddingAUser;
|
||||
|
||||
@Mock
|
||||
private AUserInAServer embeddedUser;
|
||||
|
||||
@Mock
|
||||
private AUser embeddedAUser;
|
||||
|
||||
@Mock
|
||||
private ServerUser reactingUser;
|
||||
|
||||
private static final Long SERVER_ID = 4L;
|
||||
private static final Long CHANNEL_ID = 5L;
|
||||
private static final Long MESSAGE_ID = 6L;
|
||||
private static final Long USER_ID = 3L;
|
||||
|
||||
@Test
|
||||
public void testAddingWrongEmote() {
|
||||
Long messageId = 4L;
|
||||
executeRemovalAddedTest(false, messageId);
|
||||
verify(messageEmbedPostManagementService, times(0)).findEmbeddedPostByMessageId(messageId);
|
||||
executeRemovalEmoteAddedTest(false);
|
||||
verify(messageEmbedPostManagementService, times(0)).findEmbeddedPostByMessageId(MESSAGE_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddingCorrectEmoteToWrongMessage() {
|
||||
Long messageId = 4L;
|
||||
when(messageEmbedPostManagementService.findEmbeddedPostByMessageId(messageId)).thenReturn(Optional.empty());
|
||||
executeRemovalAddedTest(true, messageId);
|
||||
when(messageEmbedPostManagementService.findEmbeddedPostByMessageId(MESSAGE_ID)).thenReturn(Optional.empty());
|
||||
executeRemovalEmoteAddedTest(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIncorrectUserAddingReaction() {
|
||||
Long serverId = 4L;
|
||||
AServer server = MockUtils.getServer(serverId);
|
||||
AUserInAServer embeddingUser = MockUtils.getUserObject(6L, server);
|
||||
AUserInAServer embeddedUser = MockUtils.getUserObject(7L, server);
|
||||
executeDeletionTest(serverId, 5L, embeddingUser, embeddedUser, MockUtils.getUserObject(5L, server), 0);
|
||||
when(embeddingUser.getUserReference()).thenReturn(embeddingAUser);
|
||||
when(embeddedUser.getUserReference()).thenReturn(embeddedAUser);
|
||||
when(embeddingAUser.getId()).thenReturn(USER_ID);
|
||||
when(embeddedAUser.getId()).thenReturn(USER_ID + 1);
|
||||
when(reactingUser.getUserId()).thenReturn(USER_ID + 2);
|
||||
executeDeletionTest(embeddingUser, embeddedUser, reactingUser, 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmbeddedUserAddingReaction() {
|
||||
Long serverId = 4L;
|
||||
AServer server = MockUtils.getServer(serverId);
|
||||
AUserInAServer embeddingUser = MockUtils.getUserObject(6L, server);
|
||||
AUserInAServer embeddedUser = MockUtils.getUserObject(7L, server);
|
||||
executeDeletionTest(serverId, 4L, embeddingUser, embeddedUser, embeddedUser, 1);
|
||||
when(embeddedUser.getUserReference()).thenReturn(embeddedAUser);
|
||||
when(embeddedAUser.getId()).thenReturn(USER_ID + 1);
|
||||
when(reactingUser.getUserId()).thenReturn(USER_ID + 1);
|
||||
executeDeletionTest(embeddingUser, embeddedUser, reactingUser, 1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmbeddingUserAddingReaction() {
|
||||
Long serverId = 4L;
|
||||
AServer server = MockUtils.getServer(serverId);
|
||||
AUserInAServer embeddingUser = MockUtils.getUserObject(6L, server);
|
||||
AUserInAServer embeddedUser = MockUtils.getUserObject(7L, server);
|
||||
executeDeletionTest(serverId, 5L, embeddingUser, embeddedUser, embeddingUser, 1);
|
||||
when(embeddingUser.getUserReference()).thenReturn(embeddingAUser);
|
||||
when(embeddedUser.getUserReference()).thenReturn(embeddedAUser);
|
||||
when(embeddingAUser.getId()).thenReturn(USER_ID);
|
||||
when(embeddedAUser.getId()).thenReturn(USER_ID + 1);
|
||||
when(reactingUser.getUserId()).thenReturn(USER_ID);
|
||||
executeDeletionTest(embeddingUser, embeddedUser, reactingUser, 1);
|
||||
}
|
||||
|
||||
private void executeDeletionTest(Long serverId, Long channelId, AUserInAServer embeddingUser, AUserInAServer embeddedUser, AUserInAServer userAddingReaction, int wantedDeletions) {
|
||||
Long messageId = 4L;
|
||||
private void executeDeletionTest(AUserInAServer embeddingUser, AUserInAServer embeddedUser, ServerUser userAddingReaction, int wantedDeletions) {
|
||||
CachedMessage cachedMessage = CachedMessage
|
||||
.builder()
|
||||
.serverId(serverId)
|
||||
.messageId(messageId)
|
||||
.channelId(channelId)
|
||||
.serverId(SERVER_ID)
|
||||
.messageId(MESSAGE_ID)
|
||||
.channelId(CHANNEL_ID)
|
||||
.build();
|
||||
AEmote reactedEmote = AEmote.builder().build();
|
||||
when(emoteService.getEmoteOrDefaultEmote(MessageEmbedRemovalReactionListener.REMOVAL_EMOTE, serverId)).thenReturn(reactedEmote);
|
||||
when(messageReaction.getReactionEmote()).thenReturn(reactionEmote);
|
||||
when(emoteService.isReactionEmoteAEmote(reactionEmote, reactedEmote)).thenReturn(true);
|
||||
when(emoteService.getEmoteOrDefaultEmote(MessageEmbedRemovalReactionListener.REMOVAL_EMOTE, SERVER_ID)).thenReturn(reactedEmote);
|
||||
when(messageReaction.getEmote()).thenReturn(reactionEmote);
|
||||
when(emoteService.compareCachedEmoteWithAEmote(reactionEmote, reactedEmote)).thenReturn(true);
|
||||
EmbeddedMessage message = EmbeddedMessage
|
||||
.builder()
|
||||
.embeddingUser(embeddingUser)
|
||||
.embeddedUser(embeddedUser)
|
||||
.build();
|
||||
when(messageEmbedPostManagementService.findEmbeddedPostByMessageId(messageId)).thenReturn(Optional.of(message));
|
||||
when(messageService.deleteMessageInChannelInServer(serverId, channelId, messageId)).thenReturn(CompletableFuture.completedFuture(null));
|
||||
when(messageEmbedPostManagementService.findEmbeddedPostByMessageId(messageId)).thenReturn(Optional.of(message));
|
||||
when(messageEmbedPostManagementService.findEmbeddedPostByMessageId(MESSAGE_ID)).thenReturn(Optional.of(message));
|
||||
when(messageService.deleteMessageInChannelInServer(SERVER_ID, CHANNEL_ID, MESSAGE_ID)).thenReturn(CompletableFuture.completedFuture(null));
|
||||
when(messageEmbedPostManagementService.findEmbeddedPostByMessageId(MESSAGE_ID)).thenReturn(Optional.of(message));
|
||||
testUnit.executeReactionAdded(cachedMessage, messageReaction, userAddingReaction);
|
||||
verify(messageService, times(wantedDeletions)).deleteMessageInChannelInServer(serverId, channelId, messageId);
|
||||
verify(messageService, times(wantedDeletions)).deleteMessageInChannelInServer(SERVER_ID, CHANNEL_ID, MESSAGE_ID);
|
||||
if(wantedDeletions > 0) {
|
||||
verify(messageEmbedPostManagementService, times(1)).deleteEmbeddedMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
private void executeRemovalAddedTest(boolean wasCorrectEmote, Long messageId) {
|
||||
Long serverId = 4L;
|
||||
AServer server = MockUtils.getServer(serverId);
|
||||
Long channelId = 5L;
|
||||
private void executeRemovalEmoteAddedTest(boolean wasCorrectEmote) {
|
||||
CachedMessage cachedMessage = CachedMessage
|
||||
.builder()
|
||||
.serverId(serverId)
|
||||
.messageId(messageId)
|
||||
.channelId(channelId)
|
||||
.serverId(SERVER_ID)
|
||||
.messageId(MESSAGE_ID)
|
||||
.channelId(CHANNEL_ID)
|
||||
.build();
|
||||
AUserInAServer userInAServer = MockUtils.getUserObject(5L, server);
|
||||
ServerUser serverUser = Mockito.mock(ServerUser.class);
|
||||
AEmote reactedEmote = AEmote.builder().build();
|
||||
when(emoteService.getEmoteOrDefaultEmote(MessageEmbedRemovalReactionListener.REMOVAL_EMOTE, serverId)).thenReturn(reactedEmote);
|
||||
when(messageReaction.getReactionEmote()).thenReturn(reactionEmote);
|
||||
when(emoteService.isReactionEmoteAEmote(reactionEmote, reactedEmote)).thenReturn(wasCorrectEmote);
|
||||
testUnit.executeReactionAdded(cachedMessage, messageReaction, userInAServer);
|
||||
verify(messageService, times(0)).deleteMessageInChannelInServer(serverId, channelId, messageId);
|
||||
when(emoteService.getEmoteOrDefaultEmote(MessageEmbedRemovalReactionListener.REMOVAL_EMOTE, SERVER_ID)).thenReturn(reactedEmote);
|
||||
when(messageReaction.getEmote()).thenReturn(reactionEmote);
|
||||
when(emoteService.compareCachedEmoteWithAEmote(reactionEmote, reactedEmote)).thenReturn(wasCorrectEmote);
|
||||
testUnit.executeReactionAdded(cachedMessage, messageReaction, serverUser);
|
||||
verify(messageService, times(0)).deleteMessageInChannelInServer(SERVER_ID, CHANNEL_ID, MESSAGE_ID);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package dev.sheldan.abstracto.utility.listener.repost;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.database.AChannel;
|
||||
import dev.sheldan.abstracto.core.models.listener.GuildMessageEmbedEventModel;
|
||||
import dev.sheldan.abstracto.core.service.BotService;
|
||||
import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
|
||||
import dev.sheldan.abstracto.utility.service.RepostCheckChannelService;
|
||||
import dev.sheldan.abstracto.utility.service.RepostService;
|
||||
import dev.sheldan.abstracto.utility.service.management.PostedImageManagement;
|
||||
@@ -33,6 +36,12 @@ public class RepostEmbedListenerTest {
|
||||
@Mock
|
||||
private PostedImageManagement repostManagement;
|
||||
|
||||
@Mock
|
||||
private ChannelManagementService channelManagementService;
|
||||
|
||||
@Mock
|
||||
private BotService botService;
|
||||
|
||||
@Mock
|
||||
private GuildMessageEmbedEventModel model;
|
||||
|
||||
@@ -42,6 +51,9 @@ public class RepostEmbedListenerTest {
|
||||
@Mock
|
||||
private Message message;
|
||||
|
||||
@Mock
|
||||
private AChannel channel;
|
||||
|
||||
@Captor
|
||||
private ArgumentCaptor<List<MessageEmbed>> embedListsParameterCaptor;
|
||||
|
||||
@@ -51,8 +63,7 @@ public class RepostEmbedListenerTest {
|
||||
|
||||
@Test
|
||||
public void testExecuteCheckDisabled() {
|
||||
when(model.getChannel()).thenReturn(textChannel);
|
||||
when(repostCheckChannelService.duplicateCheckEnabledForChannel(textChannel)).thenReturn(false);
|
||||
when(model.getChannelId()).thenReturn(CHANNEL_ID);
|
||||
testUnit.execute(model);
|
||||
verify(repostManagement, times(0)).messageEmbedsHaveBeenCovered(anyLong());
|
||||
}
|
||||
@@ -61,11 +72,8 @@ public class RepostEmbedListenerTest {
|
||||
public void testExecuteEmbedsHaveBeenCovered() {
|
||||
channelSetup();
|
||||
setupMessageHasBeenCovered(true);
|
||||
Guild guild = Mockito.mock(Guild.class);
|
||||
when(guild.getIdLong()).thenReturn(SERVER_ID);
|
||||
when(textChannel.getGuild()).thenReturn(guild);
|
||||
testUnit.execute(model);
|
||||
verify(repostService, times(0)).processMessageEmbedsRepostCheck(any(), any());
|
||||
verify(repostService, times(0)).processMessageEmbedsRepostCheck(anyList(), any(Message.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -75,7 +83,7 @@ public class RepostEmbedListenerTest {
|
||||
RestAction messageRestAction = Mockito.mock(RestAction.class);
|
||||
when(textChannel.retrieveMessageById(MESSAGE_ID)).thenReturn(messageRestAction);
|
||||
testUnit.execute(model);
|
||||
verify(repostService, times(0)).processMessageEmbedsRepostCheck(any(), any());
|
||||
verify(repostService, times(0)).processMessageEmbedsRepostCheck(anyList(), any(Message.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -132,9 +140,11 @@ public class RepostEmbedListenerTest {
|
||||
}
|
||||
|
||||
private void channelSetup() {
|
||||
when(model.getChannel()).thenReturn(textChannel);
|
||||
when(textChannel.getIdLong()).thenReturn(CHANNEL_ID);
|
||||
when(repostCheckChannelService.duplicateCheckEnabledForChannel(textChannel)).thenReturn(true);
|
||||
when(model.getChannelId()).thenReturn(CHANNEL_ID);
|
||||
when(model.getServerId()).thenReturn(SERVER_ID);
|
||||
when(channelManagementService.loadChannel(CHANNEL_ID)).thenReturn(channel);
|
||||
when(botService.getTextChannelFromServer(SERVER_ID, CHANNEL_ID)).thenReturn(textChannel);
|
||||
when(repostCheckChannelService.duplicateCheckEnabledForChannel(channel)).thenReturn(true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
package dev.sheldan.abstracto.utility.listener.repost;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedEmbed;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.database.AChannel;
|
||||
import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
|
||||
import dev.sheldan.abstracto.utility.service.RepostCheckChannelService;
|
||||
import dev.sheldan.abstracto.utility.service.RepostService;
|
||||
import net.dv8tion.jda.api.entities.EmbedType;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
import net.dv8tion.jda.api.entities.MessageEmbed;
|
||||
import net.dv8tion.jda.api.entities.TextChannel;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -26,17 +27,22 @@ public class RepostMessageReceivedListenerTest {
|
||||
@Mock
|
||||
private RepostCheckChannelService repostCheckChannelService;
|
||||
|
||||
@Mock
|
||||
private ChannelManagementService channelManagementService;
|
||||
|
||||
@Mock
|
||||
private RepostService repostService;
|
||||
|
||||
@Mock
|
||||
private Message message;
|
||||
private CachedMessage message;
|
||||
|
||||
@Mock
|
||||
private TextChannel textChannel;
|
||||
private AChannel channel;
|
||||
|
||||
@Captor
|
||||
private ArgumentCaptor<List<MessageEmbed>> embedListCaptor;
|
||||
private ArgumentCaptor<List<CachedEmbed>> embedListCaptor;
|
||||
|
||||
private static final Long CHANNEL_ID = 4L;
|
||||
|
||||
@Test
|
||||
public void testExecuteCheckDisabled() {
|
||||
@@ -57,7 +63,7 @@ public class RepostMessageReceivedListenerTest {
|
||||
@Test
|
||||
public void testExecuteOnlyMessageOneImageAttachment() {
|
||||
setupRepostCheckEnabled(true);
|
||||
MessageEmbed imageEmbed = Mockito.mock(MessageEmbed.class);
|
||||
CachedEmbed imageEmbed = Mockito.mock(CachedEmbed.class);
|
||||
when(imageEmbed.getType()).thenReturn(EmbedType.IMAGE);
|
||||
when(message.getEmbeds()).thenReturn(Arrays.asList(imageEmbed));
|
||||
testUnit.execute(message);
|
||||
@@ -67,9 +73,9 @@ public class RepostMessageReceivedListenerTest {
|
||||
@Test
|
||||
public void testExecuteOnlyMessageTwoEmbedsOneImageAttachment() {
|
||||
setupRepostCheckEnabled(true);
|
||||
MessageEmbed imageEmbed = Mockito.mock(MessageEmbed.class);
|
||||
CachedEmbed imageEmbed = Mockito.mock(CachedEmbed.class);
|
||||
when(imageEmbed.getType()).thenReturn(EmbedType.IMAGE);
|
||||
MessageEmbed nonImageEmbed = Mockito.mock(MessageEmbed.class);
|
||||
CachedEmbed nonImageEmbed = Mockito.mock(CachedEmbed.class);
|
||||
when(nonImageEmbed.getType()).thenReturn(EmbedType.LINK);
|
||||
when(message.getEmbeds()).thenReturn(Arrays.asList(imageEmbed, nonImageEmbed));
|
||||
testUnit.execute(message);
|
||||
@@ -77,14 +83,15 @@ public class RepostMessageReceivedListenerTest {
|
||||
}
|
||||
|
||||
private void setupRepostCheckEnabled(boolean b) {
|
||||
when(message.getTextChannel()).thenReturn(textChannel);
|
||||
when(repostCheckChannelService.duplicateCheckEnabledForChannel(textChannel)).thenReturn(b);
|
||||
when(message.getChannelId()).thenReturn(CHANNEL_ID);
|
||||
when(channelManagementService.loadChannel(CHANNEL_ID)).thenReturn(channel);
|
||||
when(repostCheckChannelService.duplicateCheckEnabledForChannel(channel)).thenReturn(b);
|
||||
}
|
||||
|
||||
private void verifySingleEmbed(MessageEmbed imageEmbed) {
|
||||
private void verifySingleEmbed(CachedEmbed imageEmbed) {
|
||||
verify(repostService, times(1)).processMessageAttachmentRepostCheck(message);
|
||||
verify(repostService, times(1)).processMessageEmbedsRepostCheck(embedListCaptor.capture(), eq(message));
|
||||
List<MessageEmbed> processedEmbeds = embedListCaptor.getValue();
|
||||
List<CachedEmbed> processedEmbeds = embedListCaptor.getValue();
|
||||
Assert.assertEquals(1, processedEmbeds.size());
|
||||
Assert.assertEquals(imageEmbed, processedEmbeds.get(0));
|
||||
}
|
||||
|
||||
@@ -1,27 +1,24 @@
|
||||
package dev.sheldan.abstracto.utility.listener.starboard;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.ServerUser;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedAuthor;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedEmote;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedReaction;
|
||||
import dev.sheldan.abstracto.core.models.database.AConfig;
|
||||
import dev.sheldan.abstracto.core.models.database.AEmote;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import dev.sheldan.abstracto.core.service.BotService;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedReactions;
|
||||
import dev.sheldan.abstracto.core.models.database.*;
|
||||
import dev.sheldan.abstracto.core.service.EmoteService;
|
||||
import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
|
||||
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
|
||||
import dev.sheldan.abstracto.core.test.MockUtils;
|
||||
import dev.sheldan.abstracto.utility.models.database.StarboardPost;
|
||||
import dev.sheldan.abstracto.utility.service.StarboardService;
|
||||
import dev.sheldan.abstracto.utility.service.management.StarboardPostManagementService;
|
||||
import dev.sheldan.abstracto.utility.service.management.StarboardPostReactorManagementService;
|
||||
import net.dv8tion.jda.api.entities.MessageReaction;
|
||||
import net.dv8tion.jda.api.events.message.guild.react.GuildMessageReactionAddEvent;
|
||||
import net.dv8tion.jda.api.events.message.guild.react.GuildMessageReactionRemoveEvent;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.Mockito;
|
||||
import org.mockito.junit.MockitoJUnitRunner;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -29,6 +26,7 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import static dev.sheldan.abstracto.utility.listener.starboard.StarboardListener.STAR_EMOTE;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
@@ -37,9 +35,6 @@ public class StarboardListenerTest {
|
||||
@InjectMocks
|
||||
private StarboardListener testUnit;
|
||||
|
||||
@Mock
|
||||
private BotService botService;
|
||||
|
||||
@Mock
|
||||
private ConfigManagementService configManagementService;
|
||||
|
||||
@@ -59,49 +54,74 @@ public class StarboardListenerTest {
|
||||
private EmoteService emoteService;
|
||||
|
||||
@Mock
|
||||
private GuildMessageReactionAddEvent addEvent;
|
||||
|
||||
@Mock
|
||||
private GuildMessageReactionRemoveEvent removeEvent;
|
||||
private CachedReactions cachedReaction;
|
||||
|
||||
@Mock
|
||||
private MessageReaction.ReactionEmote reactionEmote;
|
||||
|
||||
@Mock
|
||||
private CachedMessage cachedMessage;
|
||||
|
||||
@Mock
|
||||
private ServerUser serverUserActing;
|
||||
|
||||
@Mock
|
||||
private CachedAuthor cachedAuthor;
|
||||
|
||||
@Mock
|
||||
private AUserInAServer userInServerActing;
|
||||
|
||||
@Mock
|
||||
private AUser userActing;
|
||||
|
||||
@Mock
|
||||
private AUserInAServer userInAServer;
|
||||
|
||||
@Mock
|
||||
private AUser aUser;
|
||||
|
||||
@Mock
|
||||
private AServer server;
|
||||
|
||||
@Mock
|
||||
private StarboardPost post;
|
||||
|
||||
@Mock
|
||||
private CachedEmote cachedEmote;
|
||||
|
||||
@Mock
|
||||
private AEmote starEmote;
|
||||
|
||||
private static final Long MESSAGE_ID = 5L;
|
||||
private static final Long SERVER_ID = 6L;
|
||||
private static final Long AUTHOR_ID = 4L;
|
||||
private static final Long USER_ACTING_ID = 7L;
|
||||
|
||||
@Test
|
||||
public void testAuthorAddingStar() {
|
||||
Long serverId = 5L;
|
||||
Long authorId = 4L;
|
||||
CachedMessage cachedMessage = CachedMessage
|
||||
.builder()
|
||||
.authorId(authorId)
|
||||
.serverId(serverId)
|
||||
.build();
|
||||
AUserInAServer userAdding = MockUtils.getUserObject(authorId, MockUtils.getServer(serverId));
|
||||
testUnit.executeReactionAdded(cachedMessage, addEvent, userAdding);
|
||||
verify(emoteService, times(0)).getEmoteOrDefaultEmote(StarboardListener.STAR_EMOTE, serverId);
|
||||
when(cachedAuthor.getAuthorId()).thenReturn(AUTHOR_ID);
|
||||
when(cachedMessage.getAuthor()).thenReturn(cachedAuthor);
|
||||
when(serverUserActing.getUserId()).thenReturn(AUTHOR_ID);
|
||||
testUnit.executeReactionAdded(cachedMessage, cachedReaction, serverUserActing);
|
||||
verify(emoteService, times(0)).getEmoteOrDefaultEmote(STAR_EMOTE, SERVER_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddingWrongEmote() {
|
||||
Long serverId = 5L;
|
||||
Long authorId = 4L;
|
||||
Long reactionUserId = 7L;
|
||||
AEmote starEmote = AEmote.builder().build();
|
||||
AUserInAServer userAdding = MockUtils.getUserObject(reactionUserId, MockUtils.getServer(serverId));
|
||||
CachedMessage cachedMessage = setupWrongEmote(serverId, authorId, starEmote);
|
||||
testUnit.executeReactionAdded(cachedMessage, addEvent, userAdding);
|
||||
verify(emoteService, times(1)).getEmoteOrDefaultEmote(StarboardListener.STAR_EMOTE, serverId);
|
||||
when(serverUserActing.getUserId()).thenReturn(USER_ACTING_ID);
|
||||
setupWrongEmote(SERVER_ID, AUTHOR_ID, starEmote);
|
||||
when(cachedReaction.getEmote()).thenReturn(cachedEmote);
|
||||
when(emoteService.compareCachedEmoteWithAEmote(cachedEmote, starEmote)).thenReturn(false);
|
||||
testUnit.executeReactionAdded(cachedMessage, cachedReaction, serverUserActing);
|
||||
verify(emoteService, times(1)).getEmoteOrDefaultEmote(STAR_EMOTE, SERVER_ID);
|
||||
verify(emoteService, times(0)).getReactionFromMessageByEmote(any(CachedMessage.class), eq(starEmote));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddingEmoteToExistingPostButNowBelowThreshold() {
|
||||
Long requiredStars = 5L;
|
||||
AServer server = MockUtils.getServer();
|
||||
AUserInAServer userAdding = MockUtils.getUserObject(7L, server);
|
||||
AUserInAServer author = MockUtils.getUserObject(8L, server);
|
||||
StarboardPost post = StarboardPost.builder().build();
|
||||
executeAddingTest(userAdding, author, requiredStars, post);
|
||||
setupActingAndAuthor();
|
||||
executeAddingTest(requiredStars, post);
|
||||
verify(starboardService, times(1)).deleteStarboardMessagePost(post);
|
||||
verify(starboardPostManagementService, times(1)).removePost(post);
|
||||
}
|
||||
@@ -109,10 +129,8 @@ public class StarboardListenerTest {
|
||||
@Test
|
||||
public void testAddingEmoteBelowThreshold() {
|
||||
Long requiredStars = 5L;
|
||||
AServer server = MockUtils.getServer();
|
||||
AUserInAServer userAdding = MockUtils.getUserObject(7L, server);
|
||||
AUserInAServer author = MockUtils.getUserObject(8L, server);
|
||||
executeAddingTest(userAdding, author, requiredStars, null);
|
||||
setupActingAndAuthor();
|
||||
executeAddingTest(requiredStars, null);
|
||||
verify(starboardService, times(0)).deleteStarboardMessagePost(any(StarboardPost.class));
|
||||
verify(starboardPostManagementService, times(0)).removePost(any(StarboardPost.class));
|
||||
}
|
||||
@@ -120,61 +138,44 @@ public class StarboardListenerTest {
|
||||
@Test
|
||||
public void testAddingEmoteReachingThreshold() {
|
||||
Long requiredStars = 1L;
|
||||
AServer server = MockUtils.getServer();
|
||||
AUserInAServer userAdding = MockUtils.getUserObject(7L, server);
|
||||
AUserInAServer author = MockUtils.getUserObject(8L, server);
|
||||
executeAddingTest(userAdding, author, requiredStars, null);
|
||||
verify(starboardService, times(1)).createStarboardPost(any(CachedMessage.class), anyList(), eq(userAdding), eq(author));
|
||||
setupActingAndAuthor();
|
||||
executeAddingTest(requiredStars, null);
|
||||
verify(starboardService, times(1)).createStarboardPost(any(CachedMessage.class), anyList(), eq(userInServerActing), eq(userInAServer));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddingEmoteToExistingPost() {
|
||||
Long requiredStars = 1L;
|
||||
AServer server = MockUtils.getServer();
|
||||
AUserInAServer userAdding = MockUtils.getUserObject(7L, server);
|
||||
AUserInAServer author = MockUtils.getUserObject(8L, server);
|
||||
StarboardPost post = StarboardPost.builder().build();
|
||||
executeAddingTest(userAdding, author, requiredStars, post);
|
||||
setupActingAndAuthor();
|
||||
executeAddingTest(requiredStars, post);
|
||||
verify(starboardService, times(1)).updateStarboardPost(eq(post), any(CachedMessage.class), anyList());
|
||||
verify(starboardPostReactorManagementService, times(1)).addReactor(post, userAdding);
|
||||
verify(starboardPostReactorManagementService, times(1)).addReactor(post, userInServerActing);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAuthorRemovingReaction() {
|
||||
Long serverId = 5L;
|
||||
Long authorId = 4L;
|
||||
CachedMessage cachedMessage = CachedMessage
|
||||
.builder()
|
||||
.authorId(authorId)
|
||||
.serverId(serverId)
|
||||
.build();
|
||||
AUserInAServer userAdding = MockUtils.getUserObject(authorId, MockUtils.getServer(serverId));
|
||||
testUnit.executeReactionRemoved(cachedMessage, removeEvent, userAdding);
|
||||
verify(emoteService, times(0)).getEmoteOrDefaultEmote(StarboardListener.STAR_EMOTE, serverId);
|
||||
when(cachedAuthor.getAuthorId()).thenReturn(AUTHOR_ID);
|
||||
when(cachedMessage.getAuthor()).thenReturn(cachedAuthor);
|
||||
when(serverUserActing.getUserId()).thenReturn(AUTHOR_ID);
|
||||
testUnit.executeReactionRemoved(cachedMessage, cachedReaction, serverUserActing);
|
||||
verify(emoteService, times(0)).getEmoteOrDefaultEmote(STAR_EMOTE, SERVER_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemovingWrongEmote() {
|
||||
Long serverId = 5L;
|
||||
Long authorId = 4L;
|
||||
Long reactionUserId = 7L;
|
||||
AEmote starEmote = AEmote.builder().build();
|
||||
AUserInAServer userAdding = MockUtils.getUserObject(reactionUserId, MockUtils.getServer(serverId));
|
||||
CachedMessage cachedMessage = setupWrongEmote(serverId, authorId, starEmote);
|
||||
testUnit.executeReactionRemoved(cachedMessage, removeEvent, userAdding);
|
||||
verify(emoteService, times(1)).getEmoteOrDefaultEmote(StarboardListener.STAR_EMOTE, serverId);
|
||||
when(serverUserActing.getUserId()).thenReturn(USER_ACTING_ID);
|
||||
setupWrongEmote(SERVER_ID, AUTHOR_ID, starEmote);
|
||||
testUnit.executeReactionRemoved(cachedMessage, cachedReaction, serverUserActing);
|
||||
verify(emoteService, times(1)).getEmoteOrDefaultEmote(STAR_EMOTE, SERVER_ID);
|
||||
verify(emoteService, times(0)).getReactionFromMessageByEmote(any(CachedMessage.class), eq(starEmote));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemoveReactionFromExistingPostBelowThreshold() {
|
||||
Long requiredStars = 5L;
|
||||
AServer server = MockUtils.getServer();
|
||||
AUserInAServer userRemoving = MockUtils.getUserObject(7L, server);
|
||||
List<Long> remainingUsers = Arrays.asList(userRemoving.getUserReference().getId());
|
||||
AUserInAServer author = MockUtils.getUserObject(8L, server);
|
||||
StarboardPost post = StarboardPost.builder().build();
|
||||
executeRemovalTest(requiredStars, userRemoving, remainingUsers, userRemoving, author, post);
|
||||
List<ServerUser> remainingUsers = Arrays.asList(serverUserActing);
|
||||
setupActingAndAuthor();
|
||||
executeRemovalTest(requiredStars, remainingUsers);
|
||||
verify(starboardService, times(1)).deleteStarboardMessagePost(eq(post));
|
||||
verify(starboardPostManagementService, times(1)).removePost(eq(post));
|
||||
}
|
||||
@@ -182,13 +183,10 @@ public class StarboardListenerTest {
|
||||
@Test
|
||||
public void testRemoveReactionFromExistingPostAboveThreshold() {
|
||||
Long requiredStars = 0L;
|
||||
AServer server = MockUtils.getServer();
|
||||
AUserInAServer remainingUser = MockUtils.getUserObject(9L, server);
|
||||
List<Long> remainingUsers = Arrays.asList(remainingUser.getUserReference().getId());
|
||||
AUserInAServer userRemoving = MockUtils.getUserObject(7L, server);
|
||||
AUserInAServer author = MockUtils.getUserObject(8L, server);
|
||||
StarboardPost post = StarboardPost.builder().build();
|
||||
executeRemovalTest(requiredStars, remainingUser, remainingUsers, userRemoving, author, post);
|
||||
List<ServerUser> remainingUsers = Arrays.asList(serverUserActing);
|
||||
setupActingAndAuthor();
|
||||
when(userInServerManagementService.loadUser(serverUserActing)).thenReturn(userInServerActing);
|
||||
executeRemovalTest(requiredStars, remainingUsers);
|
||||
verify(starboardService, times(0)).deleteStarboardMessagePost(eq(post));
|
||||
verify(starboardPostManagementService, times(0)).removePost(eq(post));
|
||||
}
|
||||
@@ -196,12 +194,9 @@ public class StarboardListenerTest {
|
||||
@Test
|
||||
public void testRemoveReactionFromExistingPostTriggeringThreshold() {
|
||||
Long requiredStars = 1L;
|
||||
AServer server = MockUtils.getServer();
|
||||
ArrayList<Long> usersRemaining = new ArrayList<>();
|
||||
AUserInAServer userRemoving = MockUtils.getUserObject(7L, server);
|
||||
AUserInAServer author = MockUtils.getUserObject(8L, server);
|
||||
StarboardPost post = StarboardPost.builder().build();
|
||||
executeRemovalTest(requiredStars, userRemoving, usersRemaining, userRemoving, author, post);
|
||||
ArrayList<ServerUser> usersRemaining = new ArrayList<>();
|
||||
setupActingAndAuthor();
|
||||
executeRemovalTest(requiredStars, usersRemaining);
|
||||
verify(starboardService, times(1)).deleteStarboardMessagePost(eq(post));
|
||||
verify(starboardPostManagementService, times(1)).removePost(eq(post));
|
||||
}
|
||||
@@ -216,13 +211,19 @@ public class StarboardListenerTest {
|
||||
executeClearingTest(null);
|
||||
}
|
||||
|
||||
private void setupActingAndAuthor() {
|
||||
when(userInServerActing.getUserReference()).thenReturn(userActing);
|
||||
when(userActing.getId()).thenReturn(USER_ACTING_ID);
|
||||
when(userInAServer.getServerReference()).thenReturn(server);
|
||||
when(server.getId()).thenReturn(SERVER_ID);
|
||||
when(userInAServer.getUserReference()).thenReturn(aUser);
|
||||
when(aUser.getId()).thenReturn(AUTHOR_ID);
|
||||
}
|
||||
|
||||
|
||||
private void executeClearingTest(StarboardPost post) {
|
||||
Long messageId = 5L;
|
||||
CachedMessage cachedMessage = CachedMessage
|
||||
.builder()
|
||||
.messageId(messageId)
|
||||
.build();
|
||||
when(starboardPostManagementService.findByMessageId(messageId)).thenReturn(Optional.ofNullable(post));
|
||||
when(cachedMessage.getMessageId()).thenReturn(MESSAGE_ID);
|
||||
when(starboardPostManagementService.findByMessageId(MESSAGE_ID)).thenReturn(Optional.ofNullable(post));
|
||||
testUnit.executeReactionCleared(cachedMessage);
|
||||
int callCount = post != null ? 1 : 0;
|
||||
verify(starboardPostReactorManagementService, times(callCount)).removeReactors(post);
|
||||
@@ -231,63 +232,60 @@ public class StarboardListenerTest {
|
||||
}
|
||||
|
||||
|
||||
private void executeRemovalTest(Long requiredStars, AUserInAServer remainingUser, List<Long> remainingUsers, AUserInAServer userRemoving, AUserInAServer author, StarboardPost post) {
|
||||
Long messageId = 6L;
|
||||
Long serverId = userRemoving.getServerReference().getId();
|
||||
CachedMessage cachedMessage = CachedMessage
|
||||
.builder()
|
||||
.authorId(author.getUserReference().getId())
|
||||
.serverId(serverId)
|
||||
.messageId(messageId)
|
||||
.build();
|
||||
when(removeEvent.getReactionEmote()).thenReturn(reactionEmote);
|
||||
AEmote starEmote = AEmote.builder().build();
|
||||
when(emoteService.getEmoteOrDefaultEmote(StarboardListener.STAR_EMOTE, serverId)).thenReturn(starEmote);
|
||||
when(emoteService.isReactionEmoteAEmote(reactionEmote, starEmote)).thenReturn(true);
|
||||
CachedReaction reaction = CachedReaction.builder().userInServersIds(remainingUsers).build();
|
||||
private void executeRemovalTest(Long requiredStars, List<ServerUser> remainingUsers) {
|
||||
when(cachedMessage.getServerId()).thenReturn(SERVER_ID);
|
||||
when(cachedMessage.getMessageId()).thenReturn(MESSAGE_ID);
|
||||
when(cachedAuthor.getAuthorId()).thenReturn(AUTHOR_ID);
|
||||
when(cachedMessage.getAuthor()).thenReturn(cachedAuthor);
|
||||
when(cachedReaction.getEmote()).thenReturn(cachedEmote);
|
||||
when(emoteService.compareCachedEmoteWithAEmote(cachedEmote, starEmote)).thenReturn(true);
|
||||
when(emoteService.getEmoteOrDefaultEmote(STAR_EMOTE, SERVER_ID)).thenReturn(starEmote);
|
||||
CachedReactions reaction = Mockito.mock(CachedReactions.class);
|
||||
when(reaction.getUsers()).thenReturn(remainingUsers);
|
||||
when(emoteService.getReactionFromMessageByEmote(cachedMessage, starEmote)).thenReturn(Optional.of(reaction));
|
||||
when(starboardPostManagementService.findByMessageId(messageId)).thenReturn(Optional.ofNullable(post));
|
||||
when(userInServerManagementService.loadUser(serverId, author.getUserReference().getId())).thenReturn(author);
|
||||
when(userInServerManagementService.loadUserConditional(remainingUser.getUserReference().getId())).thenReturn(Optional.of(remainingUser));
|
||||
when(configManagementService.loadConfig(serverId, StarboardListener.FIRST_LEVEL_THRESHOLD_KEY)).thenReturn(AConfig.builder().longValue(requiredStars).build());
|
||||
testUnit.executeReactionRemoved(cachedMessage, removeEvent, userRemoving);
|
||||
verify(emoteService, times(1)).getEmoteOrDefaultEmote(StarboardListener.STAR_EMOTE, serverId);
|
||||
when(starboardPostManagementService.findByMessageId(MESSAGE_ID)).thenReturn(Optional.ofNullable(post));
|
||||
when(userInServerManagementService.loadUser(SERVER_ID, AUTHOR_ID)).thenReturn(userInAServer);
|
||||
when(serverUserActing.getUserId()).thenReturn(USER_ACTING_ID);
|
||||
when(serverUserActing.getServerId()).thenReturn(SERVER_ID);
|
||||
if(!remainingUsers.isEmpty()) {
|
||||
when(userInServerManagementService.loadUserOptional(SERVER_ID, USER_ACTING_ID)).thenReturn(Optional.of(userInServerActing));
|
||||
}
|
||||
when(configManagementService.loadConfig(SERVER_ID, StarboardListener.FIRST_LEVEL_THRESHOLD_KEY)).thenReturn(AConfig.builder().longValue(requiredStars).build());
|
||||
testUnit.executeReactionRemoved(cachedMessage, cachedReaction, serverUserActing);
|
||||
verify(emoteService, times(1)).getEmoteOrDefaultEmote(STAR_EMOTE, SERVER_ID);
|
||||
verify(emoteService, times(1)).getReactionFromMessageByEmote(cachedMessage, starEmote);
|
||||
}
|
||||
|
||||
private void executeAddingTest(AUserInAServer userAdding, AUserInAServer author, Long requiredStars, StarboardPost existingPost) {
|
||||
Long messageId = 6L;
|
||||
Long serverId = userAdding.getServerReference().getId();
|
||||
CachedMessage cachedMessage = CachedMessage
|
||||
.builder()
|
||||
.authorId(author.getUserReference().getId())
|
||||
.serverId(serverId)
|
||||
.messageId(messageId)
|
||||
.build();
|
||||
when(addEvent.getReactionEmote()).thenReturn(reactionEmote);
|
||||
AEmote starEmote = AEmote.builder().build();
|
||||
when(emoteService.getEmoteOrDefaultEmote(StarboardListener.STAR_EMOTE, serverId)).thenReturn(starEmote);
|
||||
when(emoteService.isReactionEmoteAEmote(reactionEmote, starEmote)).thenReturn(true);
|
||||
CachedReaction reaction = CachedReaction.builder().userInServersIds(Arrays.asList(userAdding.getUserReference().getId())).build();
|
||||
private void executeAddingTest(Long requiredStars, StarboardPost postToUse) {
|
||||
when(cachedMessage.getServerId()).thenReturn(SERVER_ID);
|
||||
when(cachedMessage.getMessageId()).thenReturn(MESSAGE_ID);
|
||||
when(cachedAuthor.getAuthorId()).thenReturn(AUTHOR_ID);
|
||||
when(cachedMessage.getAuthor()).thenReturn(cachedAuthor);
|
||||
when(cachedReaction.getEmote()).thenReturn(cachedEmote);
|
||||
when(emoteService.compareCachedEmoteWithAEmote(cachedEmote, starEmote)).thenReturn(true);
|
||||
when(emoteService.getEmoteOrDefaultEmote(STAR_EMOTE, SERVER_ID)).thenReturn(starEmote);
|
||||
CachedReactions reaction = Mockito.mock(CachedReactions.class);
|
||||
when(serverUserActing.getUserId()).thenReturn(USER_ACTING_ID);
|
||||
when(serverUserActing.getServerId()).thenReturn(SERVER_ID);
|
||||
when(reaction.getUsers()).thenReturn(Arrays.asList(serverUserActing));
|
||||
when(emoteService.getReactionFromMessageByEmote(cachedMessage, starEmote)).thenReturn(Optional.of(reaction));
|
||||
when(starboardPostManagementService.findByMessageId(messageId)).thenReturn(Optional.ofNullable(existingPost));
|
||||
when(userInServerManagementService.loadUser(serverId, author.getUserReference().getId())).thenReturn(author);
|
||||
when(userInServerManagementService.loadUserConditional(userAdding.getUserReference().getId())).thenReturn(Optional.of(userAdding));
|
||||
when(configManagementService.loadConfig(serverId, StarboardListener.FIRST_LEVEL_THRESHOLD_KEY)).thenReturn(AConfig.builder().longValue(requiredStars).build());
|
||||
testUnit.executeReactionAdded(cachedMessage, addEvent, userAdding);
|
||||
verify(emoteService, times(1)).getEmoteOrDefaultEmote(StarboardListener.STAR_EMOTE, serverId);
|
||||
when(starboardPostManagementService.findByMessageId(MESSAGE_ID)).thenReturn(Optional.ofNullable(postToUse));
|
||||
when(userInServerManagementService.loadUser(SERVER_ID, AUTHOR_ID)).thenReturn(userInAServer);
|
||||
when(userInServerManagementService.loadUser(serverUserActing)).thenReturn(userInServerActing);
|
||||
when(userInServerManagementService.loadUserOptional(SERVER_ID, USER_ACTING_ID)).thenReturn(Optional.of(userInServerActing));
|
||||
AConfig starRequirementConfig = Mockito.mock(AConfig.class);
|
||||
when(starRequirementConfig.getLongValue()).thenReturn(requiredStars);
|
||||
when(configManagementService.loadConfig(SERVER_ID, StarboardListener.FIRST_LEVEL_THRESHOLD_KEY)).thenReturn(starRequirementConfig);
|
||||
testUnit.executeReactionAdded(cachedMessage, cachedReaction, serverUserActing);
|
||||
verify(emoteService, times(1)).getEmoteOrDefaultEmote(STAR_EMOTE, SERVER_ID);
|
||||
verify(emoteService, times(1)).getReactionFromMessageByEmote(cachedMessage, starEmote);
|
||||
}
|
||||
|
||||
private CachedMessage setupWrongEmote(Long serverId, Long authorId, AEmote starEmote) {
|
||||
CachedMessage cachedMessage = CachedMessage
|
||||
.builder()
|
||||
.authorId(authorId)
|
||||
.serverId(serverId)
|
||||
.build();
|
||||
when(addEvent.getReactionEmote()).thenReturn(reactionEmote);
|
||||
when(emoteService.getEmoteOrDefaultEmote(StarboardListener.STAR_EMOTE, serverId)).thenReturn(starEmote);
|
||||
when(emoteService.isReactionEmoteAEmote(reactionEmote, starEmote)).thenReturn(false);
|
||||
return cachedMessage;
|
||||
private void setupWrongEmote(Long serverId, Long authorId, AEmote starEmote) {
|
||||
when(cachedMessage.getServerId()).thenReturn(serverId);
|
||||
when(cachedAuthor.getAuthorId()).thenReturn(authorId);
|
||||
when(cachedMessage.getAuthor()).thenReturn(cachedAuthor);
|
||||
when(cachedReaction.getEmote()).thenReturn(cachedEmote);
|
||||
when(emoteService.getEmoteOrDefaultEmote(STAR_EMOTE, serverId)).thenReturn(starEmote);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
package dev.sheldan.abstracto.utility.listener.starboard;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.AServerAChannelAUser;
|
||||
import dev.sheldan.abstracto.core.models.GuildChannelMember;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.database.AChannel;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import dev.sheldan.abstracto.core.test.MockUtils;
|
||||
import dev.sheldan.abstracto.utility.models.database.StarboardPost;
|
||||
import dev.sheldan.abstracto.utility.service.management.StarboardPostManagementService;
|
||||
import org.junit.Test;
|
||||
@@ -33,31 +28,26 @@ public class StarboardPostDeletedListenerTest {
|
||||
public void deleteNonStarboardPost() {
|
||||
Long messageId = 4L;
|
||||
when(starboardPostManagementService.findByStarboardPostId(messageId)).thenReturn(Optional.empty());
|
||||
CachedMessage cachedMessage = CachedMessage
|
||||
.builder()
|
||||
.messageId(messageId)
|
||||
.build();
|
||||
AServerAChannelAUser user = Mockito.mock(AServerAChannelAUser.class);
|
||||
GuildChannelMember member = Mockito.mock(GuildChannelMember.class);
|
||||
testUnit.execute(cachedMessage, user, member);
|
||||
CachedMessage cachedMessage = Mockito.mock(CachedMessage.class);
|
||||
when(cachedMessage.getMessageId()).thenReturn(messageId);
|
||||
testUnit.execute(cachedMessage);
|
||||
verify( starboardPostManagementService, times(0)).setStarboardPostIgnored(messageId, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void deleteStarboardPost() {
|
||||
Long messageId = 4L;
|
||||
AServer server = MockUtils.getServer();
|
||||
AUserInAServer author = MockUtils.getUserObject(4L, server);
|
||||
AChannel sourceChannel = MockUtils.getTextChannel(server, 6L);
|
||||
StarboardPost post = StarboardPost.builder().author(author).postMessageId(5L).sourceChanel(sourceChannel).build();
|
||||
Long postMessageId = 5L;
|
||||
Long serverId = 3L;
|
||||
AChannel sourceChannel = Mockito.mock(AChannel.class);
|
||||
StarboardPost post = Mockito.mock(StarboardPost.class);
|
||||
when(post.getSourceChanel()) .thenReturn(sourceChannel);
|
||||
when(post.getPostMessageId()).thenReturn(postMessageId);
|
||||
when(starboardPostManagementService.findByStarboardPostId(messageId)).thenReturn(Optional.of(post));
|
||||
CachedMessage cachedMessage = CachedMessage
|
||||
.builder()
|
||||
.messageId(messageId)
|
||||
.build();
|
||||
AServerAChannelAUser user = Mockito.mock(AServerAChannelAUser.class);
|
||||
GuildChannelMember member = Mockito.mock(GuildChannelMember.class);
|
||||
testUnit.execute(cachedMessage, user, member);
|
||||
CachedMessage cachedMessage = Mockito.mock(CachedMessage.class);
|
||||
when(cachedMessage.getServerId()).thenReturn(serverId);
|
||||
when(cachedMessage.getMessageId()).thenReturn(messageId);
|
||||
testUnit.execute(cachedMessage);
|
||||
verify( starboardPostManagementService, times(1)).setStarboardPostIgnored(messageId, true);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package dev.sheldan.abstracto.utility.service;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedAuthor;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import dev.sheldan.abstracto.core.models.template.listener.MessageEmbeddedModel;
|
||||
@@ -80,6 +81,7 @@ public class MessageEmbedServiceBeanTest {
|
||||
|
||||
private static final Long EMBEDDING_USER_IN_SERVER_ID = 8L;
|
||||
private static final Long SERVER_ID = 8L;
|
||||
private static final Long CHANNEL_ID = 10L;
|
||||
private static final Long USER_ID = 9L;
|
||||
|
||||
@Mock
|
||||
@@ -145,11 +147,10 @@ public class MessageEmbedServiceBeanTest {
|
||||
public void testEmbedSingularLink() {
|
||||
List<MessageEmbedLink> linksToEmbed = new ArrayList<>();
|
||||
Long channelId = 6L;
|
||||
Long serverId = 4L;
|
||||
Long firstMessageId = 6L;
|
||||
linksToEmbed.add(MessageEmbedLink.builder().serverId(serverId).channelId(channelId).messageId(firstMessageId).build());
|
||||
CachedMessage firstCachedMessage = CachedMessage.builder().serverId(serverId).channelId(channelId).messageId(firstMessageId).build();
|
||||
when(messageCache.getMessageFromCache(serverId,channelId, firstMessageId)).thenReturn(CompletableFuture.completedFuture(firstCachedMessage));
|
||||
linksToEmbed.add(MessageEmbedLink.builder().serverId(SERVER_ID).channelId(channelId).messageId(firstMessageId).build());
|
||||
CachedMessage firstCachedMessage = CachedMessage.builder().serverId(SERVER_ID).channelId(channelId).messageId(firstMessageId).build();
|
||||
when(messageCache.getMessageFromCache(SERVER_ID,channelId, firstMessageId)).thenReturn(CompletableFuture.completedFuture(firstCachedMessage));
|
||||
Long embeddingUserId = 5L;
|
||||
testUnit.embedLinks(linksToEmbed, textChannel, embeddingUserId, embeddingMessage);
|
||||
verify( self, times(1)).embedLink(eq(firstCachedMessage), eq(textChannel), eq(embeddingUserId) , eq(embeddingMessage));
|
||||
@@ -158,16 +159,16 @@ public class MessageEmbedServiceBeanTest {
|
||||
@Test
|
||||
public void testEmbedMultipleLinks() {
|
||||
List<MessageEmbedLink> linksToEmbed = new ArrayList<>();
|
||||
Long channelId = 6L;
|
||||
Long serverId = 4L;
|
||||
Long firstMessageId = 6L;
|
||||
Long secondMessageId = 7L;
|
||||
linksToEmbed.add(MessageEmbedLink.builder().serverId(serverId).channelId(channelId).messageId(firstMessageId).build());
|
||||
linksToEmbed.add(MessageEmbedLink.builder().serverId(serverId).channelId(channelId).messageId(secondMessageId).build());
|
||||
CachedMessage firstCachedMessage = CachedMessage.builder().serverId(serverId).channelId(channelId).messageId(firstMessageId).build();
|
||||
CachedMessage secondCacheMessage = CachedMessage.builder().serverId(serverId).channelId(channelId).messageId(secondMessageId).build();
|
||||
when(messageCache.getMessageFromCache(serverId,channelId, firstMessageId)).thenReturn(CompletableFuture.completedFuture(firstCachedMessage));
|
||||
when(messageCache.getMessageFromCache(serverId,channelId, secondMessageId)).thenReturn(CompletableFuture.completedFuture(secondCacheMessage));
|
||||
MessageEmbedLink messageEmbedLink = mockMessageEmbedLink(firstMessageId);
|
||||
linksToEmbed.add(messageEmbedLink);
|
||||
MessageEmbedLink secondMessageEmbedLink = mockMessageEmbedLink(secondMessageId);
|
||||
linksToEmbed.add(secondMessageEmbedLink);
|
||||
CachedMessage firstCachedMessage = mockCachedMessage(firstMessageId);
|
||||
CachedMessage secondCacheMessage = mockCachedMessage(secondMessageId);
|
||||
when(messageCache.getMessageFromCache(SERVER_ID,CHANNEL_ID, firstMessageId)).thenReturn(CompletableFuture.completedFuture(firstCachedMessage));
|
||||
when(messageCache.getMessageFromCache(SERVER_ID,CHANNEL_ID, secondMessageId)).thenReturn(CompletableFuture.completedFuture(secondCacheMessage));
|
||||
Long embeddingUserId = 5L;
|
||||
testUnit.embedLinks(linksToEmbed, textChannel, embeddingUserId, embeddingMessage);
|
||||
verify( self, times(2)).embedLink(cachedMessageArgumentCaptor.capture(), eq(textChannel), eq(embeddingUserId) , eq(embeddingMessage));
|
||||
@@ -175,37 +176,54 @@ public class MessageEmbedServiceBeanTest {
|
||||
List<CachedMessage> cachedMessages = cachedMessageArgumentCaptor.getAllValues();
|
||||
Assert.assertEquals(2, cachedMessages.size());
|
||||
CachedMessage firstEmbeddedMessage = cachedMessages.get(0);
|
||||
Assert.assertEquals(serverId, firstEmbeddedMessage.getServerId());
|
||||
Assert.assertEquals(channelId, firstEmbeddedMessage.getChannelId());
|
||||
Assert.assertEquals(SERVER_ID, firstEmbeddedMessage.getServerId());
|
||||
Assert.assertEquals(CHANNEL_ID, firstEmbeddedMessage.getChannelId());
|
||||
Assert.assertEquals(firstMessageId, firstEmbeddedMessage.getMessageId());
|
||||
|
||||
CachedMessage secondEmbeddedMessage = cachedMessages.get(1);
|
||||
Assert.assertEquals(serverId, secondEmbeddedMessage.getServerId());
|
||||
Assert.assertEquals(channelId, secondEmbeddedMessage.getChannelId());
|
||||
Assert.assertEquals(SERVER_ID, secondEmbeddedMessage.getServerId());
|
||||
Assert.assertEquals(CHANNEL_ID, secondEmbeddedMessage.getChannelId());
|
||||
Assert.assertEquals(secondMessageId, secondEmbeddedMessage.getMessageId());
|
||||
}
|
||||
|
||||
private MessageEmbedLink mockMessageEmbedLink(Long messageId) {
|
||||
MessageEmbedLink secondMessageEmbedLink = Mockito.mock(MessageEmbedLink.class);
|
||||
when(secondMessageEmbedLink.getServerId()).thenReturn(SERVER_ID);
|
||||
when(secondMessageEmbedLink.getChannelId()).thenReturn(CHANNEL_ID);
|
||||
when(secondMessageEmbedLink.getMessageId()).thenReturn(messageId);
|
||||
return secondMessageEmbedLink;
|
||||
}
|
||||
|
||||
private CachedMessage mockCachedMessage(Long secondMessageId) {
|
||||
CachedMessage secondCacheMessage = Mockito.mock(CachedMessage.class);
|
||||
when(secondCacheMessage.getServerId()).thenReturn(SERVER_ID);
|
||||
when(secondCacheMessage.getChannelId()).thenReturn(CHANNEL_ID);
|
||||
when(secondCacheMessage.getMessageId()).thenReturn(secondMessageId);
|
||||
return secondCacheMessage;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLoadingEmbeddingModel() {
|
||||
CachedMessage cachedMessage = Mockito.mock(CachedMessage.class);
|
||||
when(cachedMessage.getServerId()).thenReturn(SERVER_ID);
|
||||
when(cachedMessage.getAuthorId()).thenReturn(USER_ID);
|
||||
when(userInServerManagementService.loadUserConditional(EMBEDDING_USER_IN_SERVER_ID)).thenReturn(Optional.of(embeddingUser));
|
||||
CachedAuthor cachedAuthor = Mockito.mock(CachedAuthor.class);
|
||||
when(cachedAuthor.getAuthorId()).thenReturn(USER_ID);
|
||||
when(cachedMessage.getAuthor()).thenReturn(cachedAuthor);
|
||||
when(userInServerManagementService.loadUserOptional(EMBEDDING_USER_IN_SERVER_ID)).thenReturn(Optional.of(embeddingUser));
|
||||
when(botService.getMemberInServerAsync(SERVER_ID, USER_ID)).thenReturn(CompletableFuture.completedFuture(embeddingMember));
|
||||
MessageEmbeddedModel model = Mockito.mock(MessageEmbeddedModel.class);
|
||||
when(self.loadMessageEmbedModel(embeddingMessage, cachedMessage, embeddingMember)).thenReturn(model);
|
||||
when(self.sendEmbeddingMessage(cachedMessage, textChannel, EMBEDDING_USER_IN_SERVER_ID, model)).thenReturn(CompletableFuture.completedFuture(null));
|
||||
testUnit.embedLink(cachedMessage, textChannel, EMBEDDING_USER_IN_SERVER_ID, embeddingMessage).join();
|
||||
CompletableFuture<Void> embedFuture = testUnit.embedLink(cachedMessage, textChannel, EMBEDDING_USER_IN_SERVER_ID, embeddingMessage);
|
||||
Assert.assertTrue(embedFuture.isDone());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNotFoundUserEmbeddingLink() {
|
||||
Long channelId = 6L;
|
||||
Long serverId = 4L;
|
||||
Long firstMessageId = 6L;
|
||||
CachedMessage cachedMessage = CachedMessage.builder().serverId(serverId).channelId(channelId).messageId(firstMessageId).build();
|
||||
CachedMessage cachedMessage = mockCachedMessage(firstMessageId);
|
||||
Long userEmbeddingUserInServerId = 5L;
|
||||
when(userInServerManagementService.loadUserConditional(userEmbeddingUserInServerId)).thenReturn(Optional.empty());
|
||||
when(userInServerManagementService.loadUserOptional(userEmbeddingUserInServerId)).thenReturn(Optional.empty());
|
||||
testUnit.embedLink(cachedMessage, textChannel, userEmbeddingUserInServerId, embeddingMessage);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package dev.sheldan.abstracto.utility.service;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.AServerAChannelAUser;
|
||||
import dev.sheldan.abstracto.core.models.cache.*;
|
||||
import dev.sheldan.abstracto.core.models.database.AChannel;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import dev.sheldan.abstracto.core.models.database.AUser;
|
||||
@@ -107,16 +108,10 @@ public class RepostServiceBeanTest {
|
||||
private Repost repost;
|
||||
|
||||
@Mock
|
||||
private Message message;
|
||||
private CachedMessage message;
|
||||
|
||||
@Mock
|
||||
private TextChannel textChannel;
|
||||
|
||||
@Mock
|
||||
private Member member;
|
||||
|
||||
@Mock
|
||||
private User jdaUser;
|
||||
private CachedAuthor author;
|
||||
|
||||
private static final Long SERVER_ID = 4L;
|
||||
private static final Long CHANNEL_ID = 8L;
|
||||
@@ -213,35 +208,38 @@ public class RepostServiceBeanTest {
|
||||
public void testProcessMessageAttachmentRepostCheckNoAttachment() {
|
||||
when(message.getAttachments()).thenReturn(new ArrayList<>());
|
||||
testUnit.processMessageAttachmentRepostCheck(message);
|
||||
verify(message, times(0)).getTextChannel();
|
||||
verify(message, times(0)).getChannelId();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProcessMessageAttachmentRepostCheckOneAttachmentNotExistingPost() {
|
||||
generalSetupForRepostTest();
|
||||
when(message.getMember()).thenReturn(member);
|
||||
Message.Attachment attachment = Mockito.mock(Message.Attachment.class);
|
||||
when(message.getServerId()).thenReturn(SERVER_ID);
|
||||
when(author.getAuthorId()).thenReturn(USER_ID);
|
||||
when(message.getAuthor()).thenReturn(author);
|
||||
when(message.getMessageId()).thenReturn(MESSAGE_ID);
|
||||
CachedAttachment attachment = Mockito.mock(CachedAttachment.class);
|
||||
when(message.getAttachments()).thenReturn(Arrays.asList(attachment));
|
||||
when(attachment.getProxyUrl()).thenReturn(URL);
|
||||
setupSingleRepost();
|
||||
testUnit.processMessageAttachmentRepostCheck(message);
|
||||
verify(postedImageManagement, times(1)).createPost(any(AServerAChannelAUser.class), eq(message), eq(HASH), eq(0));
|
||||
verify(messageService, times(0)).addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, SERVER_ID, message);
|
||||
verify(postedImageManagement, times(1)).createPost(any(AServerAChannelAUser.class), eq(MESSAGE_ID), eq(HASH), eq(0));
|
||||
verify(messageService, times(0)).addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, SERVER_ID, CHANNEL_ID, MESSAGE_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProcessMessageAttachmentRepostCheckOneAttachmentIsRepost() {
|
||||
generalSetupForRepostTest();
|
||||
setupForRepostCreation();
|
||||
Message.Attachment attachment = Mockito.mock(Message.Attachment.class);
|
||||
CachedAttachment attachment = Mockito.mock(CachedAttachment.class);
|
||||
when(message.getAttachments()).thenReturn(Arrays.asList(attachment));
|
||||
when(attachment.getProxyUrl()).thenReturn(URL);
|
||||
setupSingleHash(postedImage);
|
||||
Long originalPostMessageId = MESSAGE_ID + 1;
|
||||
when(postedImage.getPostId()).thenReturn(new PostIdentifier(originalPostMessageId, POSITION));
|
||||
when(messageService.addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, SERVER_ID, message)).thenReturn(CompletableFuture.completedFuture(null));
|
||||
when(messageService.addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, SERVER_ID, CHANNEL_ID, MESSAGE_ID)).thenReturn(CompletableFuture.completedFuture(null));
|
||||
testUnit.processMessageAttachmentRepostCheck(message);
|
||||
verify(messageService, times(0)).addDefaultReactionToMessageAsync(anyString(), eq(message));
|
||||
verify(messageService, times(0)).addDefaultReactionToMessageAsync(anyString(), eq(SERVER_ID), eq(CHANNEL_ID), eq(MESSAGE_ID));
|
||||
verify(self, times(1)).persistRepost(originalPostMessageId, POSITION, SERVER_ID, USER_ID);
|
||||
}
|
||||
|
||||
@@ -249,9 +247,10 @@ public class RepostServiceBeanTest {
|
||||
public void testProcessMessageAttachmentRepostCheckTwoAttachmentsOneIsRepost() {
|
||||
generalSetupForRepostTest();
|
||||
setupForRepostCreation();
|
||||
when(message.getMember()).thenReturn(member);
|
||||
Message.Attachment attachment = Mockito.mock(Message.Attachment.class);
|
||||
Message.Attachment attachment2 = Mockito.mock(Message.Attachment.class);
|
||||
when(message.getServerId()).thenReturn(SERVER_ID);
|
||||
when(message.getAuthor().getAuthorId()).thenReturn(USER_ID);
|
||||
CachedAttachment attachment = Mockito.mock(CachedAttachment.class);
|
||||
CachedAttachment attachment2 = Mockito.mock(CachedAttachment.class);
|
||||
when(message.getAttachments()).thenReturn(Arrays.asList(attachment, attachment2));
|
||||
when(attachment.getProxyUrl()).thenReturn(URL);
|
||||
setupSingleRepost();
|
||||
@@ -262,30 +261,28 @@ public class RepostServiceBeanTest {
|
||||
when(postedImageManagement.getPostWithHash(secondAttachmentHash, server)).thenReturn(Optional.of(postedImage));
|
||||
Long originalPostMessageId = MESSAGE_ID + 1;
|
||||
when(postedImage.getPostId()).thenReturn(new PostIdentifier(originalPostMessageId, POSITION));
|
||||
when(messageService.addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, SERVER_ID, message)).thenReturn(CompletableFuture.completedFuture(null));
|
||||
when(messageService.addDefaultReactionToMessageAsync(anyString(), eq(message))).thenReturn(CompletableFuture.completedFuture(null));
|
||||
when(messageService.addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, SERVER_ID, CHANNEL_ID, MESSAGE_ID)).thenReturn(CompletableFuture.completedFuture(null));
|
||||
when(messageService.addDefaultReactionToMessageAsync(anyString(), eq(SERVER_ID), eq(CHANNEL_ID), eq(MESSAGE_ID))).thenReturn(CompletableFuture.completedFuture(null));
|
||||
testUnit.processMessageAttachmentRepostCheck(message);
|
||||
verify(postedImageManagement, times(1)).createPost(any(AServerAChannelAUser.class), eq(message), eq(HASH), eq(0));
|
||||
verify(postedImageManagement, times(1)).createPost(any(AServerAChannelAUser.class), eq(MESSAGE_ID), eq(HASH), eq(0));
|
||||
verify(self, times(1)).persistRepost(originalPostMessageId, POSITION, SERVER_ID, USER_ID);
|
||||
}
|
||||
|
||||
private void setupForRepostCreation() {
|
||||
when(message.getIdLong()).thenReturn(MESSAGE_ID);
|
||||
when(message.getAuthor()).thenReturn(jdaUser);
|
||||
when(jdaUser.getIdLong()).thenReturn(USER_ID);
|
||||
when(message.getMessageId()).thenReturn(MESSAGE_ID);
|
||||
when(message.getServerId()).thenReturn(SERVER_ID);
|
||||
when(message.getAuthor()).thenReturn(author);
|
||||
when(author.getAuthorId()).thenReturn(USER_ID);
|
||||
when(message.getChannelId()).thenReturn(CHANNEL_ID);
|
||||
}
|
||||
|
||||
private void generalSetupForRepostTest() {
|
||||
when(message.getTextChannel()).thenReturn(textChannel);
|
||||
when(textChannel.getIdLong()).thenReturn(CHANNEL_ID);
|
||||
when(message.getGuild()).thenReturn(guild);
|
||||
when(guild.getIdLong()).thenReturn(SERVER_ID);
|
||||
when(userInServerManagementService.loadUser(SERVER_ID, USER_ID)).thenReturn(userInAServer);
|
||||
when(serverManagementService.loadServer(SERVER_ID)).thenReturn(server);
|
||||
}
|
||||
|
||||
private void setupSingleRepost() {
|
||||
setupSingleHash(null);
|
||||
when(userInServerManagementService.loadUser(member)).thenReturn(userInAServer);
|
||||
when(userInAServer.getUserReference()).thenReturn(user);
|
||||
when(channelManagementService.loadChannel(CHANNEL_ID)).thenReturn(channel);
|
||||
}
|
||||
@@ -299,56 +296,62 @@ public class RepostServiceBeanTest {
|
||||
@Test
|
||||
public void testProcessMessageEmbedsRepostCheckWithNotRepostedThumbnailNoAttachments() {
|
||||
generalSetupForRepostTest();
|
||||
MessageEmbed firstEmbed = Mockito.mock(MessageEmbed.class);
|
||||
MessageEmbed.Thumbnail thumbnail = Mockito.mock(MessageEmbed.Thumbnail.class);
|
||||
CachedEmbed firstEmbed = Mockito.mock(CachedEmbed.class);
|
||||
CachedThumbnail thumbnail = Mockito.mock(CachedThumbnail.class);
|
||||
when(thumbnail.getProxyUrl()).thenReturn(URL);
|
||||
when(firstEmbed.getThumbnail()).thenReturn(thumbnail);
|
||||
List<MessageEmbed> messageEmbeds = Arrays.asList(firstEmbed);
|
||||
when(message.getMember()).thenReturn(member);
|
||||
when(firstEmbed.getCachedThumbnail()).thenReturn(thumbnail);
|
||||
List<CachedEmbed> messageEmbeds = Arrays.asList(firstEmbed);
|
||||
when(message.getServerId()).thenReturn(SERVER_ID);
|
||||
when(message.getAuthor()).thenReturn(author);
|
||||
when(author.getAuthorId()).thenReturn(USER_ID);
|
||||
when(message.getMessageId()).thenReturn(MESSAGE_ID);
|
||||
when(message.getAttachments()).thenReturn(new ArrayList<>());
|
||||
setupSingleRepost();
|
||||
testUnit.processMessageEmbedsRepostCheck(messageEmbeds, message);
|
||||
verify(postedImageManagement, times(1)).createPost(any(AServerAChannelAUser.class), eq(message), eq(HASH), eq(EMBEDDED_LINK_POSITION_START_INDEX));
|
||||
verify(messageService, times(0)).addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, SERVER_ID, message);
|
||||
verify(postedImageManagement, times(1)).createPost(any(AServerAChannelAUser.class), eq(MESSAGE_ID), eq(HASH), eq(EMBEDDED_LINK_POSITION_START_INDEX));
|
||||
verify(messageService, times(0)).addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, SERVER_ID, CHANNEL_ID, MESSAGE_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProcessMessageEmbedsRepostCheckWithNotRepostedEmbedImageNoAttachments() {
|
||||
generalSetupForRepostTest();
|
||||
MessageEmbed firstEmbed = Mockito.mock(MessageEmbed.class);
|
||||
MessageEmbed.ImageInfo thumbnail = Mockito.mock(MessageEmbed.ImageInfo.class);
|
||||
when(thumbnail.getProxyUrl()).thenReturn(URL);
|
||||
when(firstEmbed.getImage()).thenReturn(thumbnail);
|
||||
List<MessageEmbed> messageEmbeds = Arrays.asList(firstEmbed);
|
||||
when(message.getMember()).thenReturn(member);
|
||||
CachedEmbed firstEmbed = Mockito.mock(CachedEmbed.class);
|
||||
CachedImageInfo image = Mockito.mock(CachedImageInfo.class);
|
||||
when(image.getProxyUrl()).thenReturn(URL);
|
||||
when(firstEmbed.getCachedImageInfo()).thenReturn(image);
|
||||
List<CachedEmbed> messageEmbeds = Arrays.asList(firstEmbed);
|
||||
when(message.getServerId()).thenReturn(SERVER_ID);
|
||||
when(author.getAuthorId()).thenReturn(USER_ID);
|
||||
when(message.getAuthor()).thenReturn(author);
|
||||
when(message.getMessageId()).thenReturn(MESSAGE_ID);
|
||||
when(message.getAttachments()).thenReturn(new ArrayList<>());
|
||||
setupSingleRepost();
|
||||
testUnit.processMessageEmbedsRepostCheck(messageEmbeds, message);
|
||||
verify(postedImageManagement, times(1)).createPost(any(AServerAChannelAUser.class), eq(message), eq(HASH), eq(EMBEDDED_LINK_POSITION_START_INDEX));
|
||||
verify(messageService, times(0)).addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, SERVER_ID, message);
|
||||
verify(postedImageManagement, times(1)).createPost(any(AServerAChannelAUser.class), eq(MESSAGE_ID), eq(HASH), eq(EMBEDDED_LINK_POSITION_START_INDEX));
|
||||
verify(messageService, times(0)).addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, SERVER_ID, CHANNEL_ID, MESSAGE_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProcessMessageEmbedsRepostCheckWithRepostedThumbnailNoAttachments() {
|
||||
generalSetupForRepostTest();
|
||||
setupForRepostCreation();
|
||||
MessageEmbed firstEmbed = Mockito.mock(MessageEmbed.class);
|
||||
MessageEmbed.Thumbnail thumbnail = Mockito.mock(MessageEmbed.Thumbnail.class);
|
||||
CachedEmbed firstEmbed = Mockito.mock(CachedEmbed.class);
|
||||
CachedThumbnail thumbnail = Mockito.mock(CachedThumbnail.class);
|
||||
when(thumbnail.getProxyUrl()).thenReturn(URL);
|
||||
when(firstEmbed.getThumbnail()).thenReturn(thumbnail);
|
||||
List<MessageEmbed> messageEmbeds = Arrays.asList(firstEmbed);
|
||||
when(firstEmbed.getCachedThumbnail()).thenReturn(thumbnail);
|
||||
List<CachedEmbed> messageEmbeds = Arrays.asList(firstEmbed);
|
||||
when(message.getAttachments()).thenReturn(new ArrayList<>());
|
||||
setupSingleHash(postedImage);
|
||||
Long originalPostMessageId = MESSAGE_ID + 1;
|
||||
when(postedImage.getPostId()).thenReturn(new PostIdentifier(originalPostMessageId, POSITION));
|
||||
when(messageService.addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, SERVER_ID, message)).thenReturn(CompletableFuture.completedFuture(null));
|
||||
when(messageService.addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, SERVER_ID, CHANNEL_ID, MESSAGE_ID)).thenReturn(CompletableFuture.completedFuture(null));
|
||||
testUnit.processMessageEmbedsRepostCheck(messageEmbeds, message);
|
||||
verify(self, times(1)).persistRepost(originalPostMessageId, POSITION, SERVER_ID, USER_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsRepostEmptyEmbedMessage() {
|
||||
MessageEmbed messageEmbed = Mockito.mock(MessageEmbed.class);
|
||||
CachedEmbed messageEmbed = Mockito.mock(CachedEmbed.class);
|
||||
Optional<PostedImage> emptyOptional = testUnit.getRepostFor(message, messageEmbed, POSITION);
|
||||
Assert.assertFalse(emptyOptional.isPresent());
|
||||
}
|
||||
@@ -364,7 +367,7 @@ public class RepostServiceBeanTest {
|
||||
}
|
||||
|
||||
private void executeGetRepostForWithMessageId(Long originalPostMessageId, boolean shouldBePresent) {
|
||||
MessageEmbed messageEmbed = setupSimpleRepostCheck(originalPostMessageId);
|
||||
CachedEmbed messageEmbed = setupSimpleRepostCheck(originalPostMessageId);
|
||||
Optional<PostedImage> optional = testUnit.getRepostFor(message, messageEmbed, POSITION);
|
||||
Assert.assertEquals(shouldBePresent, optional.isPresent());
|
||||
if(shouldBePresent && optional.isPresent()) {
|
||||
@@ -372,27 +375,27 @@ public class RepostServiceBeanTest {
|
||||
}
|
||||
}
|
||||
|
||||
private MessageEmbed setupSimpleRepostCheck(Long originalPostMessageId) {
|
||||
private CachedEmbed setupSimpleRepostCheck(Long originalPostMessageId) {
|
||||
generalSetupForRepostTest();
|
||||
setupForRepostCreation();
|
||||
setupSingleHash(postedImage);
|
||||
when(postedImage.getPostId()).thenReturn(new PostIdentifier(originalPostMessageId, POSITION));
|
||||
MessageEmbed messageEmbed = Mockito.mock(MessageEmbed.class);
|
||||
MessageEmbed.Thumbnail thumbnail = Mockito.mock(MessageEmbed.Thumbnail.class);
|
||||
CachedEmbed messageEmbed = Mockito.mock(CachedEmbed.class);
|
||||
CachedThumbnail thumbnail = Mockito.mock(CachedThumbnail.class);
|
||||
when(thumbnail.getProxyUrl()).thenReturn(URL);
|
||||
when(messageEmbed.getThumbnail()).thenReturn(thumbnail);
|
||||
when(messageEmbed.getCachedThumbnail()).thenReturn(thumbnail);
|
||||
return messageEmbed;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsRepostWithRepost() {
|
||||
MessageEmbed messageEmbed = setupSimpleRepostCheck(MESSAGE_ID + 1);
|
||||
CachedEmbed messageEmbed = setupSimpleRepostCheck(MESSAGE_ID + 1);
|
||||
Assert.assertTrue(testUnit.isRepost(message, messageEmbed, POSITION));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsRepostWithSameMessage() {
|
||||
MessageEmbed messageEmbed = setupSimpleRepostCheck(MESSAGE_ID);
|
||||
CachedEmbed messageEmbed = setupSimpleRepostCheck(MESSAGE_ID);
|
||||
Assert.assertFalse(testUnit.isRepost(message, messageEmbed, POSITION));
|
||||
}
|
||||
|
||||
@@ -402,8 +405,11 @@ public class RepostServiceBeanTest {
|
||||
setupSingleRepost();
|
||||
setupSingleHash(postedImage);
|
||||
when(postedImage.getPostId()).thenReturn(new PostIdentifier(MESSAGE_ID + 1, POSITION));
|
||||
Message.Attachment attachment = Mockito.mock(Message.Attachment.class);
|
||||
CachedAttachment attachment = Mockito.mock(CachedAttachment.class);
|
||||
when(attachment.getProxyUrl()).thenReturn(URL);
|
||||
when(message.getServerId()).thenReturn(SERVER_ID);
|
||||
when(author.getAuthorId()).thenReturn(USER_ID);
|
||||
when(message.getAuthor()).thenReturn(author);
|
||||
Assert.assertTrue(testUnit.isRepost(message, attachment, POSITION));
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package dev.sheldan.abstracto.utility.service;
|
||||
|
||||
import dev.sheldan.abstracto.core.exception.UserInServerNotFoundException;
|
||||
import dev.sheldan.abstracto.core.models.AServerAChannelMessage;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedAuthor;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.database.*;
|
||||
import dev.sheldan.abstracto.core.service.BotService;
|
||||
@@ -14,7 +15,6 @@ import dev.sheldan.abstracto.core.service.management.PostTargetManagement;
|
||||
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
|
||||
import dev.sheldan.abstracto.templating.model.MessageToSend;
|
||||
import dev.sheldan.abstracto.templating.service.TemplateService;
|
||||
import dev.sheldan.abstracto.core.test.MockUtils;
|
||||
import dev.sheldan.abstracto.utility.config.posttargets.StarboardPostTarget;
|
||||
import dev.sheldan.abstracto.utility.models.database.StarboardPost;
|
||||
import dev.sheldan.abstracto.utility.models.database.StarboardPostReaction;
|
||||
@@ -102,10 +102,17 @@ public class StarboardServiceBeanTest {
|
||||
|
||||
@Mock
|
||||
private MessageToSend messageToSend;
|
||||
|
||||
@Mock
|
||||
private AServer server;
|
||||
|
||||
private static final Long STARRED_USER_ID = 5L;
|
||||
private static final Long STARRED_SERVER_USER_ID = 2L;
|
||||
private static final Long SERVER_ID = 6L;
|
||||
private static final Long STARBOARD_CHANNEL_ID = 8L;
|
||||
private static final Long FIRST_USER_IN_SERVER_ID = 3L;
|
||||
private static final Long SECOND_USER_IN_SERVER_ID = 9L;
|
||||
private static final Long CHANNEL_ID = 10L;
|
||||
|
||||
@Captor
|
||||
private ArgumentCaptor<AUserInAServer> userInAServerArgumentCaptor;
|
||||
@@ -115,31 +122,33 @@ public class StarboardServiceBeanTest {
|
||||
|
||||
@Test
|
||||
public void testCreateStarboardPost() {
|
||||
AServer server = MockUtils.getServer();
|
||||
List<AUserInAServer > userExceptAuthor = new ArrayList<>();
|
||||
userExceptAuthor.add(MockUtils.getUserObject(2L, server));
|
||||
userExceptAuthor.add(MockUtils.getUserObject(10L, server));
|
||||
AUserInAServer userReacting = MockUtils.getUserObject(4L, server);
|
||||
AUserInAServer starredUser = MockUtils.getUserObject(5L, server);
|
||||
Long channelId = 10L;
|
||||
Long starredUserId = starredUser.getUserReference().getId();
|
||||
CachedMessage message = CachedMessage
|
||||
.builder()
|
||||
.authorId(starredUserId)
|
||||
.serverId(server.getId())
|
||||
.channelId(channelId)
|
||||
.build();
|
||||
List<AUserInAServer> userExceptAuthor = new ArrayList<>();
|
||||
AUserInAServer firstUserExceptAuthor = Mockito.mock(AUserInAServer.class);
|
||||
userExceptAuthor.add(firstUserExceptAuthor);
|
||||
AUserInAServer secondUserExceptAuthor = Mockito.mock(AUserInAServer.class);
|
||||
userExceptAuthor.add(secondUserExceptAuthor);
|
||||
AUserInAServer userReacting = Mockito.mock(AUserInAServer.class);
|
||||
AUserInAServer starredUser = Mockito.mock(AUserInAServer.class);
|
||||
when(starredUser.getUserInServerId()).thenReturn(STARRED_SERVER_USER_ID);
|
||||
CachedAuthor cachedAuthor = Mockito.mock(CachedAuthor.class);
|
||||
when(cachedAuthor.getAuthorId()).thenReturn(STARRED_USER_ID);
|
||||
CachedMessage message = Mockito.mock(CachedMessage.class);
|
||||
when(message.getAuthor()).thenReturn(cachedAuthor);
|
||||
when(message.getServerId()).thenReturn(SERVER_ID);
|
||||
when(message.getChannelId()).thenReturn(CHANNEL_ID);
|
||||
Member authorMember = Mockito.mock(Member.class);
|
||||
when(botService.getMemberInServerAsync(message.getServerId(), message.getAuthorId())).thenReturn(CompletableFuture.completedFuture(authorMember));
|
||||
when(botService.getTextChannelFromServerOptional(server.getId(), channelId)).thenReturn(Optional.of(mockedTextChannel));
|
||||
when(botService.getGuildByIdOptional(server.getId())).thenReturn(Optional.of(guild));
|
||||
ADefaultConfig config = ADefaultConfig.builder().longValue(3L).build();
|
||||
when(botService.getMemberInServerAsync(SERVER_ID, STARRED_USER_ID)).thenReturn(CompletableFuture.completedFuture(authorMember));
|
||||
when(botService.getTextChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.of(mockedTextChannel));
|
||||
when(botService.getGuildByIdOptional(SERVER_ID)).thenReturn(Optional.of(guild));
|
||||
ADefaultConfig config = Mockito.mock(ADefaultConfig.class);
|
||||
when(config.getLongValue()).thenReturn(3L);
|
||||
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
|
||||
when(configService.getLongValue("starLvl3", server.getId())).thenReturn(3L);
|
||||
when(configService.getLongValue("starLvl2", server.getId())).thenReturn(2L);
|
||||
when(emoteService.getUsableEmoteOrDefault(server.getId(), "star2")).thenReturn("b");
|
||||
when(self.sendStarboardPostAndStore(eq(message), eq(starredUserId), anyList(), any())).thenReturn(CompletableFuture.completedFuture(null));
|
||||
testUnit.createStarboardPost(message, userExceptAuthor, userReacting, starredUser).join();
|
||||
when(configService.getLongValue("starLvl3", SERVER_ID)).thenReturn(3L);
|
||||
when(configService.getLongValue("starLvl2", SERVER_ID)).thenReturn(2L);
|
||||
when(emoteService.getUsableEmoteOrDefault(SERVER_ID, "star2")).thenReturn("b");
|
||||
when(self.sendStarboardPostAndStore(eq(message), eq(STARRED_SERVER_USER_ID), anyList(), any())).thenReturn(CompletableFuture.completedFuture(null));
|
||||
CompletableFuture<Void> createPostFuture = testUnit.createStarboardPost(message, userExceptAuthor, userReacting, starredUser);
|
||||
Assert.assertTrue(createPostFuture.isDone());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -159,116 +168,116 @@ public class StarboardServiceBeanTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPersistPost() {
|
||||
AServer server = MockUtils.getServer();
|
||||
AUserInAServer userReacting = MockUtils.getUserObject(4L, server);
|
||||
AUserInAServer starredUser = MockUtils.getUserObject(5L, server);
|
||||
Long channelId = 10L;
|
||||
CachedMessage message = CachedMessage
|
||||
.builder()
|
||||
.authorId(starredUser.getUserReference().getId())
|
||||
.serverId(server.getId())
|
||||
.channelId(channelId)
|
||||
.build();
|
||||
Long secondStarrerUserId = 2L;
|
||||
List<Long> userExceptAuthorIds = Arrays.asList(secondStarrerUserId, userReacting.getUserReference().getId());
|
||||
public void testPersistPostWithTwoReactors() {
|
||||
AUserInAServer userReacting = Mockito.mock(AUserInAServer.class);
|
||||
AUserInAServer starredUser = Mockito.mock(AUserInAServer.class);
|
||||
CachedMessage message = Mockito.mock(CachedMessage.class);
|
||||
List<Long> userExceptAuthorIds = Arrays.asList(FIRST_USER_IN_SERVER_ID, SECOND_USER_IN_SERVER_ID);
|
||||
List<CompletableFuture<Message>> futures = Arrays.asList(CompletableFuture.completedFuture(sendPost));
|
||||
when(userInServerManagementService.loadUserConditional(starredUser.getUserInServerId())).thenReturn(Optional.of(starredUser));
|
||||
when(userInServerManagementService.loadUserConditional(userReacting.getUserInServerId())).thenReturn(Optional.of(userReacting));
|
||||
AChannel channel = MockUtils.getTextChannel(server, channelId);
|
||||
when(channelManagementService.loadChannel(channelId)).thenReturn(channel);
|
||||
StarboardPost post = StarboardPost.builder().build();
|
||||
when(userInServerManagementService.loadUserOptional(STARRED_SERVER_USER_ID)).thenReturn(Optional.of(starredUser));
|
||||
when(userInServerManagementService.loadUserOptional(FIRST_USER_IN_SERVER_ID)).thenReturn(Optional.of(userReacting));
|
||||
when(userReacting.getUserInServerId()).thenReturn(FIRST_USER_IN_SERVER_ID);
|
||||
AChannel channel = Mockito.mock(AChannel.class);
|
||||
when(channelManagementService.loadChannel(CHANNEL_ID)).thenReturn(channel);
|
||||
StarboardPost post = Mockito.mock(StarboardPost.class);
|
||||
when(starboardPostManagementService.createStarboardPost(eq(message), eq(starredUser), any(AServerAChannelMessage.class))).thenReturn(post);
|
||||
AUserInAServer secondStarrerUserObj = MockUtils.getUserObject(secondStarrerUserId, server);
|
||||
when(userInServerManagementService.loadUserConditional(secondStarrerUserId)).thenReturn(Optional.of(secondStarrerUserObj));
|
||||
when(userInServerManagementService.loadUserConditional(userReacting.getUserInServerId())).thenReturn(Optional.of(userReacting));
|
||||
testUnit.persistPost(message, userExceptAuthorIds, futures, channelId, starredUser.getUserInServerId());
|
||||
AUserInAServer secondStarrerUserObj = Mockito.mock(AUserInAServer.class);
|
||||
when(userInServerManagementService.loadUserOptional(SECOND_USER_IN_SERVER_ID)).thenReturn(Optional.of(secondStarrerUserObj));
|
||||
when(secondStarrerUserObj.getUserInServerId()).thenReturn(SECOND_USER_IN_SERVER_ID);
|
||||
testUnit.persistPost(message, userExceptAuthorIds, futures, CHANNEL_ID, STARRED_SERVER_USER_ID);
|
||||
verify(starboardPostReactorManagementService, times(2)).addReactor(eq(post), userInAServerArgumentCaptor.capture());
|
||||
List<AUserInAServer> addedReactors = userInAServerArgumentCaptor.getAllValues();
|
||||
Assert.assertEquals(secondStarrerUserId, addedReactors.get(0).getUserInServerId());
|
||||
Assert.assertEquals(userReacting.getUserInServerId(), addedReactors.get(1).getUserInServerId());
|
||||
Assert.assertEquals(FIRST_USER_IN_SERVER_ID, addedReactors.get(0).getUserInServerId());
|
||||
Assert.assertEquals(SECOND_USER_IN_SERVER_ID, addedReactors.get(1).getUserInServerId());
|
||||
Assert.assertEquals(2, addedReactors.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateStarboardPost() {
|
||||
AServer server = MockUtils.getServer();
|
||||
Long postMessageId = 25L;
|
||||
Long newPostId= 37L;
|
||||
Long newPostId = 37L;
|
||||
Long oldPostId = 36L;
|
||||
AUserInAServer starredUser = MockUtils.getUserObject(5L, server);
|
||||
Long channelId = 10L;
|
||||
AChannel sourceChannel = Mockito.mock(AChannel.class);
|
||||
when(sourceChannel.getServer()).thenReturn(server);
|
||||
CachedMessage message = CachedMessage
|
||||
.builder()
|
||||
.authorId(starredUser.getUserReference().getId())
|
||||
.serverId(server.getId())
|
||||
.channelId(channelId)
|
||||
.build();
|
||||
CachedMessage message = Mockito.mock(CachedMessage.class);
|
||||
when(message.getChannelId()).thenReturn(CHANNEL_ID);
|
||||
when(message.getServerId()).thenReturn(SERVER_ID);
|
||||
CachedAuthor author = Mockito.mock(CachedAuthor.class);
|
||||
when(author.getAuthorId()).thenReturn(STARRED_USER_ID);
|
||||
when(message.getAuthor()).thenReturn(author);
|
||||
Long starboardPostId = 47L;
|
||||
StarboardPost post = StarboardPost.builder().postMessageId(postMessageId).starboardMessageId(oldPostId).sourceChanel(sourceChannel).id(starboardPostId).build();
|
||||
MessageToSend postMessage = MessageToSend.builder().build();
|
||||
StarboardPost post = Mockito.mock(StarboardPost.class);
|
||||
when(post.getStarboardMessageId()).thenReturn(oldPostId);
|
||||
when(post.getSourceChanel()).thenReturn(sourceChannel);
|
||||
when(post.getId()).thenReturn(starboardPostId);
|
||||
MessageToSend postMessage = Mockito.mock(MessageToSend.class);
|
||||
when(templateService.renderEmbedTemplate(eq(STARBOARD_POST_TEMPLATE), starboardPostModelArgumentCaptor.capture())).thenReturn(postMessage);
|
||||
when(postTargetService.editOrCreatedInPostTarget(oldPostId, postMessage, StarboardPostTarget.STARBOARD, server.getId())).thenReturn(Arrays.asList(CompletableFuture.completedFuture(sendPost)));
|
||||
when(postTargetService.editOrCreatedInPostTarget(oldPostId, postMessage, StarboardPostTarget.STARBOARD, SERVER_ID)).thenReturn(Arrays.asList(CompletableFuture.completedFuture(sendPost)));
|
||||
when(sendPost.getIdLong()).thenReturn(newPostId);
|
||||
ADefaultConfig config = ADefaultConfig.builder().longValue(4L).build();
|
||||
ADefaultConfig config = Mockito.mock(ADefaultConfig.class);
|
||||
when(config.getLongValue()).thenReturn(4L);
|
||||
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
|
||||
when(starboardPostManagementService.findByStarboardPostId(starboardPostId)).thenReturn(Optional.of(post));
|
||||
when(botService.getMemberInServerAsync(server.getId(), starredUser.getUserReference().getId())).thenReturn(CompletableFuture.completedFuture(starredMember));
|
||||
when(botService.getMemberInServerAsync(SERVER_ID, STARRED_USER_ID)).thenReturn(CompletableFuture.completedFuture(starredMember));
|
||||
List<AUserInAServer > userExceptAuthor = new ArrayList<>();
|
||||
testUnit.updateStarboardPost(post, message, userExceptAuthor);
|
||||
verify(postTargetService, times(1)).editOrCreatedInPostTarget(oldPostId, postMessage, StarboardPostTarget.STARBOARD, server.getId());
|
||||
verify(postTargetService, times(1)).editOrCreatedInPostTarget(oldPostId, postMessage, StarboardPostTarget.STARBOARD, SERVER_ID);
|
||||
verify(starboardPostManagementService, times(1)).setStarboardPostMessageId(post, newPostId);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteStarboardMessagePost() {
|
||||
AServer server = MockUtils.getServer();
|
||||
AChannel channel = MockUtils.getTextChannel(server, 4L);
|
||||
Long messageId = 4L;
|
||||
StarboardPost post = StarboardPost
|
||||
.builder()
|
||||
.starboardChannel(channel)
|
||||
.sourceChanel(channel)
|
||||
.starboardMessageId(messageId)
|
||||
.build();
|
||||
StarboardPost post = Mockito.mock(StarboardPost.class);
|
||||
when(post.getStarboardMessageId()).thenReturn(messageId);
|
||||
AChannel channel = Mockito.mock(AChannel.class);
|
||||
when(channel.getServer()).thenReturn(server);
|
||||
when(server.getId()).thenReturn(SERVER_ID);
|
||||
when(channel.getId()).thenReturn(CHANNEL_ID);
|
||||
when(post.getSourceChanel()).thenReturn(channel);
|
||||
when(post.getStarboardChannel()).thenReturn(channel);
|
||||
testUnit.deleteStarboardMessagePost(post);
|
||||
verify(botService, times(1)).deleteMessage(server.getId(), channel.getId(), messageId);
|
||||
verify(botService, times(1)).deleteMessage(SERVER_ID, CHANNEL_ID, messageId);
|
||||
}
|
||||
|
||||
@Test(expected = UserInServerNotFoundException.class)
|
||||
public void testPersistingOfNotFoundStarredUser() {
|
||||
AServer server = MockUtils.getServer();
|
||||
AUserInAServer userReacting = MockUtils.getUserObject(4L, server);
|
||||
AUserInAServer starredUser = MockUtils.getUserObject(5L, server);
|
||||
when(userInServerManagementService.loadUserConditional(starredUser.getUserInServerId())).thenReturn(Optional.empty());
|
||||
executeLoadErrorTest(server, userReacting, starredUser, 10L);
|
||||
when(userInServerManagementService.loadUserOptional(SECOND_USER_IN_SERVER_ID)).thenReturn(Optional.empty());
|
||||
CachedMessage message = Mockito.mock(CachedMessage.class);
|
||||
List<Long> userExceptAuthorIds = Arrays.asList(FIRST_USER_IN_SERVER_ID);
|
||||
List<CompletableFuture<Message>> futures = Arrays.asList(CompletableFuture.completedFuture(sendPost));
|
||||
testUnit.persistPost(message, userExceptAuthorIds, futures, CHANNEL_ID, SECOND_USER_IN_SERVER_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRetrieveStarStats() {
|
||||
AServer server = MockUtils.getServer();
|
||||
Integer limit = 3;
|
||||
AChannel channel = MockUtils.getTextChannel(server, 4L);
|
||||
AChannel channel = Mockito.mock(AChannel.class);
|
||||
when(channel.getServer()).thenReturn(server);
|
||||
when(server.getId()).thenReturn(SERVER_ID);
|
||||
Long firstPostMessageId = 50L;
|
||||
Long secondPostMessageId = 51L;
|
||||
StarboardPostReaction reaction = StarboardPostReaction.builder().build();
|
||||
StarboardPost post1 = StarboardPost.builder().starboardChannel(channel).postMessageId(firstPostMessageId).reactions(Arrays.asList(reaction)).build();
|
||||
StarboardPost post2 = StarboardPost.builder().starboardChannel(channel).postMessageId(secondPostMessageId).reactions(new ArrayList<>()).build();
|
||||
StarboardPostReaction reaction = Mockito.mock(StarboardPostReaction.class);
|
||||
StarboardPost post1 = Mockito.mock(StarboardPost.class);
|
||||
when(post1.getReactions()).thenReturn(Arrays.asList(reaction));
|
||||
when(post1.getPostMessageId()).thenReturn(firstPostMessageId);
|
||||
when(post1.getStarboardChannel()).thenReturn(channel);
|
||||
StarboardPost post2 = Mockito.mock(StarboardPost.class);
|
||||
when(post2.getPostMessageId()).thenReturn(secondPostMessageId);
|
||||
when(post2.getReactions()).thenReturn(new ArrayList<>());
|
||||
when(post2.getStarboardChannel()).thenReturn(channel);
|
||||
List<StarboardPost> topPosts = Arrays.asList(post1, post2);
|
||||
when(starboardPostManagementService.retrieveTopPosts(server.getId(), limit)).thenReturn(topPosts);
|
||||
when(starboardPostManagementService.retrieveTopPosts(SERVER_ID, limit)).thenReturn(topPosts);
|
||||
CompletableFuture<StarStatsUser> statsUser = CompletableFuture.completedFuture(Mockito.mock(StarStatsUser.class));
|
||||
CompletableFuture<StarStatsUser> statsUser2 = CompletableFuture.completedFuture(Mockito.mock(StarStatsUser.class));
|
||||
List<CompletableFuture<StarStatsUser>> topGiver = Arrays.asList(statsUser, statsUser2);
|
||||
when(starboardPostReactorManagementService.retrieveTopStarGiver(server.getId(), limit)).thenReturn(topGiver);
|
||||
when(starboardPostReactorManagementService.retrieveTopStarReceiver(server.getId(), limit)).thenReturn(topGiver);
|
||||
when(starboardPostManagementService.getPostCount(server.getId())).thenReturn(50);
|
||||
when(starboardPostReactorManagementService.getStarCount(server.getId())).thenReturn(500);
|
||||
when(emoteService.getUsableEmoteOrDefault(server.getId(), "starboardBadge1")).thenReturn("1");
|
||||
when(emoteService.getUsableEmoteOrDefault(server.getId(), "starboardBadge2")).thenReturn("2");
|
||||
when(emoteService.getUsableEmoteOrDefault(server.getId(), "starboardBadge3")).thenReturn("3");
|
||||
CompletableFuture<StarStatsModel> modelFuture = testUnit.retrieveStarStats(server.getId());
|
||||
when(starboardPostReactorManagementService.retrieveTopStarGiver(SERVER_ID, limit)).thenReturn(topGiver);
|
||||
when(starboardPostReactorManagementService.retrieveTopStarReceiver(SERVER_ID, limit)).thenReturn(topGiver);
|
||||
when(starboardPostManagementService.getPostCount(SERVER_ID)).thenReturn(50);
|
||||
when(starboardPostReactorManagementService.getStarCount(SERVER_ID)).thenReturn(500);
|
||||
when(emoteService.getUsableEmoteOrDefault(SERVER_ID, "starboardBadge1")).thenReturn("1");
|
||||
when(emoteService.getUsableEmoteOrDefault(SERVER_ID, "starboardBadge2")).thenReturn("2");
|
||||
when(emoteService.getUsableEmoteOrDefault(SERVER_ID, "starboardBadge3")).thenReturn("3");
|
||||
CompletableFuture<StarStatsModel> modelFuture = testUnit.retrieveStarStats(SERVER_ID);
|
||||
StarStatsModel model = modelFuture.join();
|
||||
List<String> badgeEmotes = model.getBadgeEmotes();
|
||||
Assert.assertEquals(limit.intValue(), badgeEmotes.size());
|
||||
@@ -278,28 +287,16 @@ public class StarboardServiceBeanTest {
|
||||
Assert.assertEquals(500, model.getTotalStars().intValue());
|
||||
Assert.assertEquals(50, model.getStarredMessages().intValue());
|
||||
StarStatsPost topPost = model.getTopPosts().get(0);
|
||||
Assert.assertEquals(server.getId(), topPost.getServerId());
|
||||
Assert.assertEquals(SERVER_ID, topPost.getServerId());
|
||||
Assert.assertEquals(channel.getId(), topPost.getChannelId());
|
||||
Assert.assertEquals(firstPostMessageId, topPost.getMessageId());
|
||||
Assert.assertEquals(1, topPost.getStarCount().intValue());
|
||||
StarStatsPost secondTopPost = model.getTopPosts().get(1);
|
||||
Assert.assertEquals(server.getId(), secondTopPost.getServerId());
|
||||
Assert.assertEquals(SERVER_ID, secondTopPost.getServerId());
|
||||
Assert.assertEquals(channel.getId(), secondTopPost.getChannelId());
|
||||
Assert.assertEquals(secondPostMessageId, secondTopPost.getMessageId());
|
||||
Assert.assertEquals(0, secondTopPost.getStarCount().intValue());
|
||||
|
||||
}
|
||||
|
||||
private void executeLoadErrorTest(AServer server, AUserInAServer userReacting, AUserInAServer starredUser, Long channelId) {
|
||||
CachedMessage message = CachedMessage
|
||||
.builder()
|
||||
.authorId(starredUser.getUserReference().getId())
|
||||
.serverId(server.getId())
|
||||
.channelId(channelId)
|
||||
.build();
|
||||
Long secondStarrerUserId = 2L;
|
||||
List<Long> userExceptAuthorIds = Arrays.asList(secondStarrerUserId, userReacting.getUserReference().getId());
|
||||
List<CompletableFuture<Message>> futures = Arrays.asList(CompletableFuture.completedFuture(sendPost));
|
||||
testUnit.persistPost(message, userExceptAuthorIds, futures, channelId, starredUser.getUserInServerId());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package dev.sheldan.abstracto.utility.service.management;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedAuthor;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.database.AChannel;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
@@ -11,9 +12,7 @@ import dev.sheldan.abstracto.core.test.MockUtils;
|
||||
import dev.sheldan.abstracto.utility.exception.CrossServerEmbedException;
|
||||
import dev.sheldan.abstracto.utility.models.database.EmbeddedMessage;
|
||||
import dev.sheldan.abstracto.utility.repository.EmbeddedMessageRepository;
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
import net.dv8tion.jda.api.entities.MessageChannel;
|
||||
import net.dv8tion.jda.api.entities.*;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -45,43 +44,53 @@ public class MessageEmbedPostManagementServiceBeanTest {
|
||||
@Captor
|
||||
private ArgumentCaptor<EmbeddedMessage> messageArgumentCaptor;
|
||||
|
||||
private static final Long SERVER_ID = 1L;
|
||||
private static final Long EMBEDDING_CHANNEL_ID = 2L;
|
||||
private static final Long EMBEDDED_MESSAGE_ID = 5L;
|
||||
private static final Long EMBEDDING_MESSAGE_ID = 7L;
|
||||
private static final Long EMBEDDED_USER_ID = 8L;
|
||||
private static final Long EMBEDDING_USER_ID = 9L;
|
||||
|
||||
@Test
|
||||
public void testCreateCorrectEmbed(){
|
||||
AServer server = MockUtils.getServer();
|
||||
AUserInAServer embeddingUser = MockUtils.getUserObject(5L, server);
|
||||
AUserInAServer embeddedUser = MockUtils.getUserObject(7L, server);
|
||||
AChannel channel = MockUtils.getTextChannel(server, 8L);
|
||||
when(serverManagementService.loadOrCreate(server.getId())).thenReturn(server);
|
||||
when(channelManagementService.loadChannel(channel.getId())).thenReturn(channel);
|
||||
Long embeddedMessageId = 5L;
|
||||
Long embeddingMessageId = 7L;
|
||||
CachedMessage cachedMessage = CachedMessage
|
||||
.builder()
|
||||
.messageId(embeddedMessageId)
|
||||
.channelId(channel.getId())
|
||||
.serverId(server.getId())
|
||||
.authorId(embeddedUser.getUserReference().getId())
|
||||
.build();
|
||||
Message message = Mockito.mock(Message.class);
|
||||
public void testCreateCorrectEmbed() {
|
||||
AUserInAServer embeddingUser = Mockito.mock(AUserInAServer.class);
|
||||
AUserInAServer embeddedUser = Mockito.mock(AUserInAServer.class);
|
||||
AChannel channel = Mockito.mock(AChannel.class);
|
||||
AServer server = Mockito.mock(AServer.class);
|
||||
when(server.getId()).thenReturn(SERVER_ID);
|
||||
when(serverManagementService.loadOrCreate(SERVER_ID)).thenReturn(server);
|
||||
when(channelManagementService.loadChannel(EMBEDDING_CHANNEL_ID)).thenReturn(channel);
|
||||
CachedMessage cachedMessage = Mockito.mock(CachedMessage.class);
|
||||
when(cachedMessage.getMessageId()).thenReturn(EMBEDDED_MESSAGE_ID);
|
||||
when(cachedMessage.getServerId()).thenReturn(SERVER_ID);
|
||||
when(cachedMessage.getChannelId()).thenReturn(EMBEDDING_CHANNEL_ID);
|
||||
CachedAuthor cachedAuthor = Mockito.mock(CachedAuthor.class);
|
||||
when(cachedAuthor.getAuthorId()).thenReturn(EMBEDDED_USER_ID);
|
||||
when(cachedMessage.getAuthor()).thenReturn(cachedAuthor);
|
||||
when(cachedMessage.getServerId()).thenReturn(SERVER_ID);
|
||||
Message embeddingMessage = Mockito.mock(Message.class);
|
||||
MessageChannel embeddingChannel = Mockito.mock(MessageChannel.class);
|
||||
when(embeddingChannel.getIdLong()).thenReturn(EMBEDDING_CHANNEL_ID);
|
||||
when(embeddingMessage.getChannel()).thenReturn(embeddingChannel);
|
||||
User embeddingJdaUser = Mockito.mock(User.class);
|
||||
when(embeddingJdaUser.getIdLong()).thenReturn(EMBEDDING_USER_ID);
|
||||
when(embeddingMessage.getAuthor()).thenReturn(embeddingJdaUser);
|
||||
Guild guild = Mockito.mock(Guild.class);
|
||||
MessageChannel embeddedChannel = Mockito.mock(MessageChannel.class);
|
||||
when(message.getChannel()).thenReturn(embeddedChannel);
|
||||
when(message.getGuild()).thenReturn(guild);
|
||||
when(guild.getIdLong()).thenReturn(server.getId());
|
||||
when(message.getIdLong()).thenReturn(embeddingMessageId);
|
||||
when(embeddedChannel.getIdLong()).thenReturn(channel.getId());
|
||||
when(userInServerManagementService.loadUser(server.getId(), embeddedUser.getUserReference().getId())).thenReturn(embeddedUser);
|
||||
testUnit.createMessageEmbed(cachedMessage, message, embeddingUser);
|
||||
when(embeddingMessage.getGuild()).thenReturn(guild);
|
||||
when(guild.getIdLong()).thenReturn(SERVER_ID);
|
||||
when(embeddingMessage.getIdLong()).thenReturn(EMBEDDING_MESSAGE_ID);
|
||||
when(userInServerManagementService.loadUser(SERVER_ID, EMBEDDED_USER_ID)).thenReturn(embeddedUser);
|
||||
testUnit.createMessageEmbed(cachedMessage, embeddingMessage, embeddingUser);
|
||||
verify(embeddedMessageRepository, times(1)).save(messageArgumentCaptor.capture());
|
||||
EmbeddedMessage savedMessage = messageArgumentCaptor.getValue();
|
||||
Assert.assertEquals(embeddedMessageId, savedMessage.getEmbeddedMessageId());
|
||||
Assert.assertEquals(EMBEDDED_MESSAGE_ID, savedMessage.getEmbeddedMessageId());
|
||||
Assert.assertEquals(channel, savedMessage.getEmbeddedChannel());
|
||||
Assert.assertEquals(channel, savedMessage.getEmbeddingChannel());
|
||||
Assert.assertEquals(embeddedUser, savedMessage.getEmbeddedUser());
|
||||
Assert.assertEquals(embeddingUser, savedMessage.getEmbeddingUser());
|
||||
Assert.assertEquals(server, savedMessage.getEmbeddedServer());
|
||||
Assert.assertEquals(server, savedMessage.getEmbeddingServer());
|
||||
Assert.assertEquals(embeddingMessageId, savedMessage.getEmbeddingMessageId());
|
||||
Assert.assertEquals(EMBEDDING_MESSAGE_ID, savedMessage.getEmbeddingMessageId());
|
||||
}
|
||||
|
||||
@Test(expected = CrossServerEmbedException.class)
|
||||
|
||||
@@ -9,7 +9,6 @@ import dev.sheldan.abstracto.utility.models.database.PostedImage;
|
||||
import dev.sheldan.abstracto.utility.models.database.embed.PostIdentifier;
|
||||
import dev.sheldan.abstracto.utility.repository.PostedImageRepository;
|
||||
import dev.sheldan.abstracto.utility.service.RepostServiceBean;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -53,12 +52,10 @@ public class PostedImageManagementBeanTest {
|
||||
public void testCreatePost() {
|
||||
AServerAChannelAUser serverAChannelAUser = Mockito.mock(AServerAChannelAUser.class);
|
||||
AChannel channel = Mockito.mock(AChannel.class);
|
||||
Message message = Mockito.mock(Message.class);
|
||||
when(message.getIdLong()).thenReturn(MESSAGE_ID);
|
||||
when(serverAChannelAUser.getGuild()).thenReturn(server);
|
||||
when(serverAChannelAUser.getChannel()).thenReturn(channel);
|
||||
when(serverAChannelAUser.getAUserInAServer()).thenReturn(aUserInAServer);
|
||||
PostedImage createdPost = testUnit.createPost(serverAChannelAUser, message, HASH, INDEX);
|
||||
PostedImage createdPost = testUnit.createPost(serverAChannelAUser, MESSAGE_ID, HASH, INDEX);
|
||||
Assert.assertEquals(HASH, createdPost.getImageHash());
|
||||
Assert.assertEquals(INDEX, createdPost.getPostId().getPosition());
|
||||
Assert.assertEquals(MESSAGE_ID, createdPost.getPostId().getMessageId());
|
||||
|
||||
Reference in New Issue
Block a user