diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ActivateAssignableRolePlace.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ActivateAssignableRolePlace.java index 0071b5756..3818d62f5 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ActivateAssignableRolePlace.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ActivateAssignableRolePlace.java @@ -23,7 +23,6 @@ public class ActivateAssignableRolePlace extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); service.activateAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name); diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/AddRoleToAssignableRolePost.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/AddRoleToAssignableRolePost.java index bb8827a07..7a79b9c46 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/AddRoleToAssignableRolePost.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/AddRoleToAssignableRolePost.java @@ -32,7 +32,6 @@ public class AddRoleToAssignableRolePost extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); FullEmote emote = (FullEmote) parameters.get(1); diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/CreateAssignableRolePost.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/CreateAssignableRolePost.java index dc927e268..d24cc08c1 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/CreateAssignableRolePost.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/CreateAssignableRolePost.java @@ -33,7 +33,6 @@ public class CreateAssignableRolePost extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); MessageChannel channel = (TextChannel) parameters.get(1); diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/DeactivateAssignableRolePlace.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/DeactivateAssignableRolePlace.java index 40565fa2e..360a12835 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/DeactivateAssignableRolePlace.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/DeactivateAssignableRolePlace.java @@ -23,7 +23,6 @@ public class DeactivateAssignableRolePlace extends AbstractConditionableCommand @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); service.deactivateAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name); diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/DeleteAssignableRolePlace.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/DeleteAssignableRolePlace.java index 1d0524bd6..ebfb2c22e 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/DeleteAssignableRolePlace.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/DeleteAssignableRolePlace.java @@ -24,7 +24,6 @@ public class DeleteAssignableRolePlace extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); return service.deleteAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name) diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/EditAssignableRolePlaceText.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/EditAssignableRolePlaceText.java index c52efd3fa..ad1770e40 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/EditAssignableRolePlaceText.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/EditAssignableRolePlaceText.java @@ -29,7 +29,6 @@ public class EditAssignableRolePlaceText extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); String newText = (String) parameters.get(1); diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/MoveAssignableRolePlace.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/MoveAssignableRolePlace.java index b8e86f2fc..e52f10142 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/MoveAssignableRolePlace.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/MoveAssignableRolePlace.java @@ -24,7 +24,6 @@ public class MoveAssignableRolePlace extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); TextChannel newChannel = (TextChannel) parameters.get(1); diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/RemoveRoleFromAssignableRolePlace.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/RemoveRoleFromAssignableRolePlace.java index 308ae8fc8..84fa066e0 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/RemoveRoleFromAssignableRolePlace.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/RemoveRoleFromAssignableRolePlace.java @@ -25,7 +25,6 @@ public class RemoveRoleFromAssignableRolePlace extends AbstractConditionableComm @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); FullEmote emote = (FullEmote) parameters.get(1); diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/SetAssignableRolePosition.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/SetAssignableRolePosition.java index 8a337ca99..18c4a6e18 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/SetAssignableRolePosition.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/SetAssignableRolePosition.java @@ -24,7 +24,6 @@ public class SetAssignableRolePosition extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); FullEmote emote = (FullEmote) parameters.get(1); diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/SetupAssignableRolePlace.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/SetupAssignableRolePlace.java index 22126d343..6c425e592 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/SetupAssignableRolePlace.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/SetupAssignableRolePlace.java @@ -30,7 +30,6 @@ public class SetupAssignableRolePlace extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); return service.setupAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name) diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ShowAssignableRolePlaceConfig.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ShowAssignableRolePlaceConfig.java index f23e91f43..8ab29506a 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ShowAssignableRolePlaceConfig.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ShowAssignableRolePlaceConfig.java @@ -24,7 +24,6 @@ public class ShowAssignableRolePlaceConfig extends AbstractConditionableCommand @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); // TODO refactor to return something to be posted in this command here instead of relying it to be posted somewhere else diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/SwapAssignableRolePosition.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/SwapAssignableRolePosition.java index 7b82e6e91..47afe3ece 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/SwapAssignableRolePosition.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/SwapAssignableRolePosition.java @@ -30,7 +30,6 @@ public class SwapAssignableRolePosition extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); FullEmote firstEmote = (FullEmote) parameters.get(1); diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/TestAssignableRolePlace.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/TestAssignableRolePlace.java index fd64cda53..314cde4a3 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/TestAssignableRolePlace.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/TestAssignableRolePlace.java @@ -24,7 +24,6 @@ public class TestAssignableRolePlace extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); return service.testAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name, commandContext.getChannel()) diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/service/AssignableRolePlaceServiceBean.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/service/AssignableRolePlaceServiceBean.java index 6abbc2d8a..03707575b 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/service/AssignableRolePlaceServiceBean.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/service/AssignableRolePlaceServiceBean.java @@ -14,7 +14,7 @@ import dev.sheldan.abstracto.assignableroles.service.management.AssignableRolePl import dev.sheldan.abstracto.assignableroles.service.management.AssignableRolePlacePostManagementService; import dev.sheldan.abstracto.core.command.exception.AbstractoTemplatedException; import dev.sheldan.abstracto.core.command.exception.CommandParameterKeyValueWrongTypeException; -import dev.sheldan.abstracto.core.exception.ChannelNotFoundException; +import dev.sheldan.abstracto.core.exception.ChannelNotInGuildException; import dev.sheldan.abstracto.core.exception.EmoteNotUsableException; import dev.sheldan.abstracto.core.models.FullEmote; import dev.sheldan.abstracto.core.models.database.*; @@ -185,7 +185,7 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic return addNewMessageToAssignableRolePlace(placeId, fakeEmote, description, roleId, serverId, messageToSend, textChannel); } } else { - throw new ChannelNotFoundException(latestPost.getUsedChannel().getId()); + throw new ChannelNotInGuildException(latestPost.getUsedChannel().getId()); } } else { log.trace("Added emote to assignable place {} in server {}, but no message post yet.", placeId, serverId); @@ -374,7 +374,7 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic log.info("Refreshing text for assignable role place {} in channel {} in post {}.", place.getId(), channelId, firstPost.getId()); return channelService.editEmbedMessageInAChannel(renderedMessage.getEmbeds().get(0), channelOptional.get(), firstPost.getId()).thenCompose(message -> CompletableFuture.completedFuture(null)); } - throw new ChannelNotFoundException(channelId); + throw new ChannelNotInGuildException(channelId); } return CompletableFuture.completedFuture(null); } diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/DisableExpForRole.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/DisableExpForRole.java index d51a2a4af..225f26617 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/DisableExpForRole.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/DisableExpForRole.java @@ -31,7 +31,6 @@ public class DisableExpForRole extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); ARole role = (ARole) parameters.get(0); ARole actualRole = roleManagementService.findRole(role.getId()); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/DisableExpGain.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/DisableExpGain.java index 9863ef81d..d30b08186 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/DisableExpGain.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/DisableExpGain.java @@ -32,7 +32,6 @@ public class DisableExpGain extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); Member para = (Member) commandContext.getParameters().getParameters().get(0); AUserInAServer userInAServer = userInServerManagementService.loadUser(para); aUserExperienceService.disableExperienceForUser(userInAServer); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/EnableExpForRole.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/EnableExpForRole.java index c2cdd870f..28c7353e5 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/EnableExpForRole.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/EnableExpForRole.java @@ -31,7 +31,6 @@ public class EnableExpForRole extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); ARole role = (ARole) commandContext.getParameters().getParameters().get(0); ARole actualRole = roleManagementService.findRole(role.getId()); if(disabledExpRoleManagementService.isExperienceDisabledForRole(actualRole)) { diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/EnableExpGain.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/EnableExpGain.java index 5a1c90c67..86e6756b7 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/EnableExpGain.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/EnableExpGain.java @@ -32,7 +32,6 @@ public class EnableExpGain extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); Member para = (Member) commandContext.getParameters().getParameters().get(0); AUserInAServer userInAServer = userInServerManagementService.loadUser(para); aUserExperienceService.enableExperienceForUser(userInAServer); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/ExpScale.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/ExpScale.java index 43dd328ce..bb3d47c7a 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/ExpScale.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/ExpScale.java @@ -30,7 +30,6 @@ public class ExpScale extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); Double scale = (Double) commandContext.getParameters().getParameters().get(0); Long guildId = commandContext.getGuild().getIdLong(); configService.setDoubleValue(EXP_MULTIPLIER_KEY, guildId, scale); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/LeaderBoardCommand.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/LeaderBoardCommand.java index 2805f8064..f010eb0c5 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/LeaderBoardCommand.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/LeaderBoardCommand.java @@ -54,7 +54,6 @@ public class LeaderBoardCommand extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); // parameter is optional, in case its not present, we default to the 0th page Integer page = !parameters.isEmpty() ? (Integer) parameters.get(0) : 1; diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/ListDisabledExperienceRoles.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/ListDisabledExperienceRoles.java index 86a426439..44a6a08e1 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/ListDisabledExperienceRoles.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/ListDisabledExperienceRoles.java @@ -42,7 +42,6 @@ public class ListDisabledExperienceRoles extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List disabledRolesForServer = disabledExpRoleManagementService.getDisabledRolesForServer(commandContext.getUserInitiatedContext().getServer()); DisabledExperienceRolesModel disabledExperienceRolesModel = (DisabledExperienceRolesModel) ContextConverter.fromCommandContext(commandContext, DisabledExperienceRolesModel.class); disabledRolesForServer.forEach(aDisabledExpRole -> { diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/Rank.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/Rank.java index 563776ce5..d70196fcb 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/Rank.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/Rank.java @@ -66,7 +66,6 @@ public class Rank extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); RankModel rankModel = (RankModel) ContextConverter.slimFromCommandContext(commandContext, RankModel.class); LeaderBoardEntry userRank = userExperienceService.getRankOfUserInServer(commandContext.getUserInitiatedContext().getAUserInAServer()); CompletableFuture future = converter.fromLeaderBoardEntry(userRank); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/SetExpRole.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/SetExpRole.java index e0f47120f..776c87b31 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/SetExpRole.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/SetExpRole.java @@ -41,7 +41,6 @@ public class SetExpRole extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); Integer level = (Integer) commandContext.getParameters().getParameters().get(0); Role role = (Role) commandContext.getParameters().getParameters().get(1); log.info("Setting role {} to be used for level {} on server {}", role.getId(), level, role.getGuild().getId()); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/UnSetExpRole.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/UnSetExpRole.java index 4c61ab0d3..a645b9dd8 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/UnSetExpRole.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/UnSetExpRole.java @@ -33,7 +33,6 @@ public class UnSetExpRole extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); ARole role = (ARole) commandContext.getParameters().getParameters().get(0); ARole actualRole = roleManagementService.findRole(role.getId()); // do not check for the existence of the role, because if the role was deleted, users should be able diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/DisableExpForRoleTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/DisableExpForRoleTest.java index 4cb66ed89..376c616d9 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/DisableExpForRoleTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/DisableExpForRoleTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.experience.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.database.ARole; @@ -34,16 +32,6 @@ public class DisableExpForRoleTest { @Mock private DisabledExpRoleManagementService disabledExpRoleManagementService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTest(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void testExecuteCommandForNotDisabledRole() { executeDisableExpForRoleTest(false, 1); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/DisableExpGainTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/DisableExpGainTest.java index c5ba4d65e..99262c6db 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/DisableExpGainTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/DisableExpGainTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.experience.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.database.AUserInAServer; @@ -34,16 +32,6 @@ public class DisableExpGainTest { @Mock private UserInServerManagementService userInServerManagementService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTest(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void testDisableExpForMember() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/EnableExpForRoleTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/EnableExpForRoleTest.java index d4abfac74..a2443ed4c 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/EnableExpForRoleTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/EnableExpForRoleTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.experience.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.database.ARole; @@ -32,16 +30,6 @@ public class EnableExpForRoleTest { @Mock private RoleManagementService roleManagementService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTest(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void testExecuteCommandForNotDisabledRole() { executeEnableExpForRoleTest(false, 0); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/EnableExpGainTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/EnableExpGainTest.java index cb189efef..ae293ae9a 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/EnableExpGainTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/EnableExpGainTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.experience.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.database.AUserInAServer; @@ -34,16 +32,6 @@ public class EnableExpGainTest { @Mock private UserInServerManagementService userInServerManagementService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTest(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void testEnableExpForMember() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/ExpScaleTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/ExpScaleTest.java index 655b5eb71..e3f4b85dd 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/ExpScaleTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/ExpScaleTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.experience.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.service.ConfigService; @@ -26,16 +24,6 @@ public class ExpScaleTest { @Mock private ConfigService configService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTest(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void testSetExpScaleForGuild() { double newScale = 4.5; diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/LeaderBoardCommandTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/LeaderBoardCommandTest.java index f253b1920..1ce0a79ce 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/LeaderBoardCommandTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/LeaderBoardCommandTest.java @@ -1,6 +1,5 @@ package dev.sheldan.abstracto.experience.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.service.ChannelService; @@ -44,11 +43,6 @@ public class LeaderBoardCommandTest { @Mock private LeaderBoardModelConverter converter; - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void testLeaderBoardWithNoParameter() { testLeaderBoardCommand(CommandTestUtilities.getNoParameters(), 1); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/SetExpRoleTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/SetExpRoleTest.java index 073772df8..85ca51fa8 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/SetExpRoleTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/SetExpRoleTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.experience.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.service.RoleService; @@ -37,28 +35,6 @@ public class SetExpRoleTest { @Mock private RoleManagementService roleManagementService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = InsufficientParametersException.class) - public void testRoleMissing() { - CommandContext context = CommandTestUtilities.getWithParameters(Arrays.asList(4)); - testUnit.executeAsync(context); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testLevelProvidedButNotRole() { - CommandContext context = CommandTestUtilities.getWithParameters(Arrays.asList(4, "")); - testUnit.executeAsync(context); - } - @Test public void setExpRole() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/UnSetExpRoleTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/UnSetExpRoleTest.java index 3aa7dacb6..600008bd0 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/UnSetExpRoleTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/UnSetExpRoleTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.experience.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.database.ARole; @@ -34,16 +32,6 @@ public class UnSetExpRoleTest { @Mock private RoleManagementService roleManagementService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void setUnSetExpRole() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Ban.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Ban.java index ee83878fb..5ae9e6011 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Ban.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Ban.java @@ -34,7 +34,6 @@ public class Ban extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Member member = (Member) parameters.get(0); String defaultReason = templateService.renderSimpleTemplate(BAN_DEFAULT_REASON_TEMPLATE); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/BanId.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/BanId.java index 990aaa626..10f45e6d7 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/BanId.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/BanId.java @@ -29,7 +29,6 @@ public class BanId extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Long userId = (Long) parameters.get(0); String defaultReason = templateService.renderSimpleTemplate(Ban.BAN_DEFAULT_REASON_TEMPLATE); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DecayAllWarnings.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DecayAllWarnings.java index 6cce342f4..98d3633ee 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DecayAllWarnings.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DecayAllWarnings.java @@ -25,7 +25,6 @@ public class DecayAllWarnings extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); return warnService.decayAllWarningsForServer(commandContext.getUserInitiatedContext().getServer()) .thenApply(aVoid -> CommandResult.fromSuccess()); } diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DeleteNote.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DeleteNote.java index f90259cd9..51f1a7484 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DeleteNote.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DeleteNote.java @@ -34,7 +34,6 @@ public class DeleteNote extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); Long id = (Long) commandContext.getParameters().getParameters().get(0); if(userNoteManagementService.noteExists(id, commandContext.getUserInitiatedContext().getServer())) { userNoteManagementService.deleteNote(id, commandContext.getUserInitiatedContext().getServer()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DeleteWarning.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DeleteWarning.java index 341293850..3d0acd23d 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DeleteWarning.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DeleteWarning.java @@ -29,7 +29,6 @@ public class DeleteWarning extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); Long warnId = (Long) commandContext.getParameters().getParameters().get(0); Optional optional = warnManagementService.findByIdOptional(warnId, commandContext.getGuild().getIdLong()); optional.ifPresent(warning -> warnManagementService.deleteWarning(warning)); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Kick.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Kick.java index f643a3e74..ebbd25903 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Kick.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Kick.java @@ -32,7 +32,6 @@ public class Kick extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Member member = (Member) parameters.get(0); String defaultReason = templateService.renderSimpleTemplate(KICK_DEFAULT_REASON_TEMPLATE); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Purge.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Purge.java index 00325f1ad..d01165fdf 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Purge.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Purge.java @@ -37,7 +37,6 @@ public class Purge extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); Integer amountOfMessages = (Integer) commandContext.getParameters().getParameters().get(0); Member memberToPurgeMessagesOf = null; if(commandContext.getParameters().getParameters().size() == 2) { diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/SlowMode.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/SlowMode.java index ee4f691f3..4b67eb946 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/SlowMode.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/SlowMode.java @@ -28,7 +28,6 @@ public class SlowMode extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); TextChannel channel; String durationString = (String) commandContext.getParameters().getParameters().get(0); Duration duration; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNoteCommand.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNoteCommand.java index 6865bb5e1..ceb6a2b96 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNoteCommand.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNoteCommand.java @@ -30,7 +30,6 @@ public class UserNoteCommand extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Member member = (Member) parameters.get(0); String text = (String) parameters.get(1); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNotes.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNotes.java index 2630be5cc..e541cbb96 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNotes.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNotes.java @@ -49,7 +49,6 @@ public class UserNotes extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); List userNotes; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Warn.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Warn.java index 65fa33fb2..0a9728110 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Warn.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Warn.java @@ -34,7 +34,6 @@ public class Warn extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Member member = (Member) parameters.get(0); String defaultReason = templateService.renderSimpleTemplate(WARN_DEFAULT_REASON_TEMPLATE); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Warnings.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Warnings.java index 2decc2bae..980e80d6a 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Warnings.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Warnings.java @@ -52,7 +52,6 @@ public class Warnings extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List warnsToDisplay; if(!commandContext.getParameters().getParameters().isEmpty()) { Member member = (Member) commandContext.getParameters().getParameters().get(0); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/mute/Mute.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/mute/Mute.java index 3c4d11df5..e8b7f312f 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/mute/Mute.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/mute/Mute.java @@ -31,7 +31,6 @@ public class Mute extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Member member = (Member) parameters.get(0); Duration duration = (Duration) parameters.get(1); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/mute/SetMuteRole.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/mute/SetMuteRole.java index c3f1ba9a8..f0cae086a 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/mute/SetMuteRole.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/mute/SetMuteRole.java @@ -30,7 +30,6 @@ public class SetMuteRole extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); Role jdaRole = (Role) commandContext.getParameters().getParameters().get(0); ARole role = roleManagementService.findRole(jdaRole.getIdLong()); muteRoleManagementService.setMuteRoleForServer(commandContext.getUserInitiatedContext().getServer(), role); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/mute/UnMute.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/mute/UnMute.java index 2c46d0e1c..ada9e0fe3 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/mute/UnMute.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/mute/UnMute.java @@ -39,7 +39,6 @@ public class UnMute extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Member member = (Member) parameters.get(0); AUserInAServer userToUnMute = userInServerManagementService.loadUser(member); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBean.java index b629694d8..67a6765bd 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBean.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBean.java @@ -1,6 +1,6 @@ package dev.sheldan.abstracto.moderation.service; -import dev.sheldan.abstracto.core.exception.ChannelNotFoundException; +import dev.sheldan.abstracto.core.exception.ChannelNotInGuildException; import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.service.BotService; import lombok.extern.slf4j.Slf4j; @@ -41,7 +41,7 @@ public class SlowModeServiceBean implements SlowModeService { TextChannel textChannel = textChannelOptional.get(); return this.setSlowMode(textChannel, duration); } else { - throw new ChannelNotFoundException(channel.getId()); + throw new ChannelNotInGuildException(channel.getId()); } } } diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/BanIdTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/BanIdTest.java index f311300fe..993ee588c 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/BanIdTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/BanIdTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.moderation.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.moderation.models.template.commands.BanIdLog; @@ -69,18 +67,6 @@ public class BanIdTest { CommandTestUtilities.checkSuccessfulCompletionAsync(result); } - - - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/BanTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/BanTest.java index 1accb8437..cc69d5149 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/BanTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/BanTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.moderation.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.moderation.models.template.commands.BanLog; @@ -68,16 +66,6 @@ public class BanTest { CommandTestUtilities.checkSuccessfulCompletionAsync(result); } - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DeleteNoteTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DeleteNoteTest.java index 81c048585..959a1c44e 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DeleteNoteTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DeleteNoteTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.moderation.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.execution.ResultState; @@ -53,16 +51,6 @@ public class DeleteNoteTest { Assert.assertNotNull(result.getMessage()); } - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTest(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DeleteWarningTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DeleteWarningTest.java index 6a508914c..1c867bf09 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DeleteWarningTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DeleteWarningTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.moderation.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.database.AServer; @@ -52,17 +50,6 @@ public class DeleteWarningTest { CommandTestUtilities.checkSuccessfulCompletion(result); } - - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTest(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/KickTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/KickTest.java index 5bfc14f69..a3b30e43c 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/KickTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/KickTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.moderation.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.moderation.models.template.commands.KickLogModel; @@ -70,17 +68,6 @@ public class KickTest { CommandTestUtilities.checkSuccessfulCompletionAsync(result); } - - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/PurgeTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/PurgeTest.java index b987b361d..15a34a59e 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/PurgeTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/PurgeTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.moderation.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.execution.ResultState; @@ -54,16 +52,6 @@ public class PurgeTest { Assert.assertEquals(ResultState.SELF_DESTRUCT, result.join().getResult()); } - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/SlowModeTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/SlowModeTest.java index 06e6c8113..e2298cae8 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/SlowModeTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/SlowModeTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.moderation.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.moderation.service.SlowModeService; @@ -68,16 +66,6 @@ public class SlowModeTest { CommandTestUtilities.checkSuccessfulCompletionAsync(result); } - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/UserNoteCommandTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/UserNoteCommandTest.java index 1e9035ff2..c967b817e 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/UserNoteCommandTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/UserNoteCommandTest.java @@ -1,6 +1,5 @@ package dev.sheldan.abstracto.moderation.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.database.AServer; @@ -47,11 +46,6 @@ public class UserNoteCommandTest { CommandTestUtilities.checkSuccessfulCompletion(result); } - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/UserNotesTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/UserNotesTest.java index 757e8d08d..e13e87ab5 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/UserNotesTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/UserNotesTest.java @@ -1,6 +1,5 @@ package dev.sheldan.abstracto.moderation.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.database.AUserInAServer; @@ -106,11 +105,6 @@ public class UserNotesTest { CommandTestUtilities.checkSuccessfulCompletionAsync(result); } - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/WarnTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/WarnTest.java index 4b80c9450..aede5ad55 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/WarnTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/WarnTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.moderation.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.moderation.models.template.commands.WarnContext; @@ -66,16 +64,6 @@ public class WarnTest { CommandTestUtilities.checkSuccessfulCompletionAsync(result); } - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/WarningsTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/WarningsTest.java index 957ecb4ee..cc826bab1 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/WarningsTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/WarningsTest.java @@ -2,7 +2,6 @@ package dev.sheldan.abstracto.moderation.commands; import com.jagrosh.jdautilities.commons.waiter.EventWaiter; import com.jagrosh.jdautilities.menu.Paginator; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.database.AUserInAServer; @@ -108,11 +107,6 @@ public class WarningsTest { } - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/mute/MuteTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/mute/MuteTest.java index 887668884..0b6bd73de 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/mute/MuteTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/mute/MuteTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.moderation.commands.mute; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.moderation.models.template.commands.MuteContext; @@ -47,16 +45,6 @@ public class MuteTest { Assert.assertEquals(parameters.getAuthor(), muteLog.getMutingUser()); } - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/mute/SetMuteRoleTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/mute/SetMuteRoleTest.java index cf9a8e0b1..7c691b8ac 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/mute/SetMuteRoleTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/mute/SetMuteRoleTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.moderation.commands.mute; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.database.ARole; @@ -46,16 +44,6 @@ public class SetMuteRoleTest { CommandTestUtilities.checkSuccessfulCompletion(result); } - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTest(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/mute/UnMuteTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/mute/UnMuteTest.java index 440c79be5..a3b939df9 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/mute/UnMuteTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/mute/UnMuteTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.moderation.commands.mute; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.database.AUserInAServer; @@ -65,16 +63,6 @@ public class UnMuteTest { testUnit.executeAsync(parameters); } - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void validateCommand() { CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/PurgeServiceBeanTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/PurgeServiceBeanTest.java index 8ebe71204..7fc804355 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/PurgeServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/PurgeServiceBeanTest.java @@ -22,8 +22,8 @@ import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; +import static dev.sheldan.abstracto.core.test.MockUtils.mockQueueDoubleVoidConsumer; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) @@ -114,7 +114,7 @@ public class PurgeServiceBeanTest { setupFirstMessageHistoryMocks(); setupStatusMessageMocks(); - mockConsumer(deleteMessagesAction); + mockQueueDoubleVoidConsumer(deleteMessagesAction); CompletableFuture futures = testUnit.purgeMessagesInChannel(amountToDelete, textChannel, START_MESSAGE_ID, null); futures.whenComplete((aVoid, throwable) -> Assert.assertNull(throwable)); verify(deleteStatusAction, times(1)).queueAfter(5, TimeUnit.SECONDS); @@ -136,7 +136,7 @@ public class PurgeServiceBeanTest { setupStatusMessageMocks(); AuditableRestAction auditableRestAction = Mockito.mock(AuditableRestAction.class); when(firstMessage.delete()).thenReturn(auditableRestAction); - mockConsumer(auditableRestAction); + mockQueueDoubleVoidConsumer(auditableRestAction); CompletableFuture futures = testUnit.purgeMessagesInChannel(amountToDelete, textChannel, START_MESSAGE_ID, purgedMember); futures.whenComplete((aVoid, throwable) -> Assert.assertNull(throwable)); verify(deleteStatusAction, times(1)).queueAfter(5, TimeUnit.SECONDS); @@ -194,7 +194,7 @@ public class PurgeServiceBeanTest { when(textChannel.deleteMessages(secondMessagesToDelete)).thenReturn(secondDeleteMessagesAction); - mockConsumer(secondDeleteMessagesAction); + mockQueueDoubleVoidConsumer(secondDeleteMessagesAction); CompletableFuture futures = testUnit.purgeMessagesInChannel(amountToDelete, textChannel, START_MESSAGE_ID, purgedMember); futures.whenComplete((aVoid, throwable) -> Assert.assertNull(throwable)); verify(deleteStatusAction, times(1)).queueAfter(5, TimeUnit.SECONDS); @@ -233,7 +233,7 @@ public class PurgeServiceBeanTest { setupFirstMessages(firstMessage, deletableMessageId, secondMessage, deletableMessageId2, messageAuthor); setupMembersWithAuthorId(); setupFirstMessageHistoryMocks(); - mockConsumer(deleteMessagesAction); + mockQueueDoubleVoidConsumer(deleteMessagesAction); setupStatusMessageMocks(); } @@ -261,16 +261,7 @@ public class PurgeServiceBeanTest { when(secondMessageToMock.getAuthor()).thenReturn(author); } - private void mockConsumer(RestAction secondDeleteMessagesAction) { - doAnswer(invocationOnMock -> { - Object consumerObj = invocationOnMock.getArguments()[0]; - if(consumerObj instanceof Consumer) { - Consumer consumer = (Consumer) consumerObj; - consumer.accept(null); - } - return null; - }).when(secondDeleteMessagesAction).queue(any(Consumer.class), any(Consumer.class)); - } + private Long getDeletableMessageId() { return TimeUtil.getDiscordTimestamp((System.currentTimeMillis() - (7 * 24 * 60 * 60 * 1000))); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBeanTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBeanTest.java index a5ee265eb..489166d9d 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBeanTest.java @@ -1,6 +1,6 @@ package dev.sheldan.abstracto.moderation.service; -import dev.sheldan.abstracto.core.exception.ChannelNotFoundException; +import dev.sheldan.abstracto.core.exception.ChannelNotInGuildException; import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.BotService; @@ -79,7 +79,7 @@ public class SlowModeServiceBeanTest { testUnit.setSlowMode(channel, duration); } - @Test(expected = ChannelNotFoundException.class) + @Test(expected = ChannelNotInGuildException.class) public void testSlowModeInAChannelNotFound() { AServer server = MockUtils.getServer(); AChannel aChannel = MockUtils.getTextChannel(server, 5L); diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/DeleteTrackedEmote.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/DeleteTrackedEmote.java index bce2aa429..5ad6a1dfb 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/DeleteTrackedEmote.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/DeleteTrackedEmote.java @@ -32,7 +32,6 @@ public class DeleteTrackedEmote extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); TrackedEmote fakeTrackedEmote = (TrackedEmote) parameters.get(0); // need to actually load the TrackedEmote diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/DeletedEmoteStats.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/DeletedEmoteStats.java index b18f0ec3b..ab80ef3c2 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/DeletedEmoteStats.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/DeletedEmoteStats.java @@ -43,7 +43,6 @@ public class DeletedEmoteStats extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); // default is 1.1.1970 Instant statsSince = Instant.EPOCH; diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/DisableEmoteTracking.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/DisableEmoteTracking.java index 38843fc96..504866a3d 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/DisableEmoteTracking.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/DisableEmoteTracking.java @@ -32,7 +32,6 @@ public class DisableEmoteTracking extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); if(!parameters.isEmpty()) { TrackedEmote fakeTrackedEmote = (TrackedEmote) parameters.get(0); diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/EmoteStats.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/EmoteStats.java index 047f7d13f..900e64c09 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/EmoteStats.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/EmoteStats.java @@ -44,7 +44,6 @@ public class EmoteStats extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); // default is 1.1.1970 Instant statsSince = Instant.EPOCH; diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ExportEmoteStats.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ExportEmoteStats.java index 4663261ab..420dd7533 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ExportEmoteStats.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ExportEmoteStats.java @@ -65,7 +65,6 @@ public class ExportEmoteStats extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Instant statsSince = Instant.EPOCH; // default is 1.1.1970 diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ExternalEmoteStats.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ExternalEmoteStats.java index c07ef1cf5..d64f6dca9 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ExternalEmoteStats.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ExternalEmoteStats.java @@ -46,7 +46,6 @@ public class ExternalEmoteStats extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); // default is 1.1.1970 Instant statsSince = Instant.EPOCH; diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/PurgeEmoteStats.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/PurgeEmoteStats.java index f237ecd67..1b0e2df69 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/PurgeEmoteStats.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/PurgeEmoteStats.java @@ -35,7 +35,6 @@ public class PurgeEmoteStats extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); TrackedEmote fakeTrackedEmote = (TrackedEmote) parameters.get(0); TrackedEmote trackedEmote = trackedEmoteManagementService.loadByTrackedEmoteServer(fakeTrackedEmote.getTrackedEmoteId()); diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ShowExternalTrackedEmote.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ShowExternalTrackedEmote.java index e7aaed916..62493a4ea 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ShowExternalTrackedEmote.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ShowExternalTrackedEmote.java @@ -40,7 +40,6 @@ public class ShowExternalTrackedEmote extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); TrackedEmote fakeTrackedEmote = (TrackedEmote) parameters.get(0); // load the actual TrackedEmote instance diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ShowTrackedEmotes.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ShowTrackedEmotes.java index f8d8aa7cf..6c9894d84 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ShowTrackedEmotes.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/ShowTrackedEmotes.java @@ -50,7 +50,6 @@ public class ShowTrackedEmotes extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); // per default, do not show TrackedEmote for which tracking has been disabled Boolean showTrackingDisabled = false; diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/TrackEmote.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/TrackEmote.java index ff3b36dd5..ea0246c56 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/TrackEmote.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emotes/command/TrackEmote.java @@ -44,7 +44,6 @@ public class TrackEmote extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); TrackEmoteParameter emoteToTrack = (TrackEmoteParameter) commandContext.getParameters().getParameters().get(0); Long emoteId = emoteToTrack.getTrackedEmote().getTrackedEmoteId().getId(); long serverId = commandContext.getGuild().getIdLong(); diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/DeleteTrackedEmoteTest.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/DeleteTrackedEmoteTest.java index dbe4a38bf..e72a54caa 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/DeleteTrackedEmoteTest.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/DeleteTrackedEmoteTest.java @@ -1,9 +1,8 @@ package dev.sheldan.abstracto.statistic.emotes.command; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.ServerSpecificId; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import dev.sheldan.abstracto.statistic.config.StatisticFeatures; import dev.sheldan.abstracto.statistic.emotes.exception.TrackedEmoteNotFoundException; @@ -34,16 +33,6 @@ public class DeleteTrackedEmoteTest { @Mock private TrackedEmoteService trackedEmoteService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTest(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void testExecuteWithExistingTrackedEmote() { TrackedEmote fakedEmote = Mockito.mock(TrackedEmote.class); @@ -69,4 +58,10 @@ public class DeleteTrackedEmoteTest { public void testFeature() { Assert.assertEquals(StatisticFeatures.EMOTE_TRACKING, testUnit.getFeature()); } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + } diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/DeletedEmoteStatsTest.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/DeletedEmoteStatsTest.java index 0df4c9799..080becfe8 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/DeletedEmoteStatsTest.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/DeletedEmoteStatsTest.java @@ -1,8 +1,8 @@ package dev.sheldan.abstracto.statistic.emotes.command; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import dev.sheldan.abstracto.statistic.config.StatisticFeatures; import dev.sheldan.abstracto.statistic.emotes.model.EmoteStatsModel; @@ -38,11 +38,6 @@ public class DeletedEmoteStatsTest { @Mock private ChannelService channelService; - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void testWithoutParameterStaticEmotes() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); @@ -94,4 +89,9 @@ public class DeletedEmoteStatsTest { Assert.assertEquals(StatisticFeatures.EMOTE_TRACKING, testUnit.getFeature()); } + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + } diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/DisableEmoteTrackingTest.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/DisableEmoteTrackingTest.java index 7e9c77f54..31fc1eb70 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/DisableEmoteTrackingTest.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/DisableEmoteTrackingTest.java @@ -1,8 +1,8 @@ package dev.sheldan.abstracto.statistic.emotes.command; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.models.ServerSpecificId; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import dev.sheldan.abstracto.statistic.config.StatisticFeatures; import dev.sheldan.abstracto.statistic.emotes.model.database.TrackedEmote; @@ -32,11 +32,6 @@ public class DisableEmoteTrackingTest { @Mock private TrackedEmoteManagementService trackedEmoteManagementService; - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void testDisableAllTracking() { CommandContext commandContext = CommandTestUtilities.getNoParameters(); @@ -60,4 +55,10 @@ public class DisableEmoteTrackingTest { public void testFeature() { Assert.assertEquals(StatisticFeatures.EMOTE_TRACKING, testUnit.getFeature()); } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + } diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/EmoteStatsTest.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/EmoteStatsTest.java index 3f8af6e53..f808610d3 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/EmoteStatsTest.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/EmoteStatsTest.java @@ -1,8 +1,8 @@ package dev.sheldan.abstracto.statistic.emotes.command; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import dev.sheldan.abstracto.statistic.config.StatisticFeatures; import dev.sheldan.abstracto.statistic.emotes.model.EmoteStatsModel; @@ -38,11 +38,6 @@ public class EmoteStatsTest { @Mock private ChannelService channelService; - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void testWithoutParameterStaticEmotes() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); @@ -93,4 +88,10 @@ public class EmoteStatsTest { public void testFeature() { Assert.assertEquals(StatisticFeatures.EMOTE_TRACKING, testUnit.getFeature()); } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + } diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ExportEmoteStatsTest.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ExportEmoteStatsTest.java index 3e88e518f..3e64cf943 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ExportEmoteStatsTest.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ExportEmoteStatsTest.java @@ -1,12 +1,12 @@ package dev.sheldan.abstracto.statistic.emotes.command; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import dev.sheldan.abstracto.core.utils.FileUtils; import dev.sheldan.abstracto.statistic.config.StatisticFeatures; @@ -67,10 +67,6 @@ public class ExportEmoteStatsTest { private static final String FILE_NAME = "name"; private static final String FILE_CONTENT = "content"; - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } @Test public void testExportAllEmoteStats() throws IOException { @@ -176,4 +172,10 @@ public class ExportEmoteStatsTest { when(templateService.renderTemplate(eq(DOWNLOAD_EMOTE_STATS_FILE_NAME_TEMPLATE_KEY), modelArgumentCaptor.capture())).thenReturn(FILE_NAME); when(templateService.renderTemplate(eq(DOWNLOAD_EMOTE_STATS_FILE_CONTENT_TEMPLATE_KEY), any())).thenReturn(FILE_CONTENT); } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + } diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ExternalEmoteStatsTest.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ExternalEmoteStatsTest.java index 92a54ef5c..9ae5be24c 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ExternalEmoteStatsTest.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ExternalEmoteStatsTest.java @@ -1,8 +1,8 @@ package dev.sheldan.abstracto.statistic.emotes.command; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import dev.sheldan.abstracto.statistic.config.StatisticFeatures; import dev.sheldan.abstracto.statistic.emotes.model.EmoteStatsModel; @@ -38,11 +38,6 @@ public class ExternalEmoteStatsTest { @Mock private ChannelService channelService; - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void testWithoutParameterStaticEmotes() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); @@ -93,4 +88,10 @@ public class ExternalEmoteStatsTest { public void testFeature() { Assert.assertEquals(StatisticFeatures.EMOTE_TRACKING, testUnit.getFeature()); } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + } diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/PurgeEmoteStatsTest.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/PurgeEmoteStatsTest.java index bfaf8850b..834f2b27c 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/PurgeEmoteStatsTest.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/PurgeEmoteStatsTest.java @@ -1,8 +1,8 @@ package dev.sheldan.abstracto.statistic.emotes.command; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.models.ServerSpecificId; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import dev.sheldan.abstracto.statistic.config.StatisticFeatures; import dev.sheldan.abstracto.statistic.emotes.model.database.TrackedEmote; @@ -34,11 +34,6 @@ public class PurgeEmoteStatsTest { @Mock private UsedEmoteService usedEmoteService; - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void testPurgeEntireTimeLineOfEmote() { TrackedEmote fakeTrackedEmote = Mockito.mock(TrackedEmote.class); @@ -63,10 +58,15 @@ public class PurgeEmoteStatsTest { verify(usedEmoteService, times(1)).purgeEmoteUsagesSince(eq(actualTrackedEmote), any(Instant.class)); } - @Test public void testFeature() { Assert.assertEquals(StatisticFeatures.EMOTE_TRACKING, testUnit.getFeature()); } + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + + } diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ShowExternalTrackedEmoteTest.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ShowExternalTrackedEmoteTest.java index b69f279fb..36f502816 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ShowExternalTrackedEmoteTest.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ShowExternalTrackedEmoteTest.java @@ -1,12 +1,11 @@ package dev.sheldan.abstracto.statistic.emotes.command; import dev.sheldan.abstracto.core.command.exception.AbstractoTemplatedException; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.ServerSpecificId; import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import dev.sheldan.abstracto.statistic.config.StatisticFeatures; import dev.sheldan.abstracto.statistic.emotes.config.EmoteTrackingMode; @@ -38,16 +37,6 @@ public class ShowExternalTrackedEmoteTest { @Mock private TrackedEmoteManagementService trackedEmoteManagementService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void testShowExternalEmote() { TrackedEmote fakeTrackedEmote = Mockito.mock(TrackedEmote.class); @@ -84,4 +73,10 @@ public class ShowExternalTrackedEmoteTest { public void testFeatureModeLimitations() { Assert.assertTrue(testUnit.getFeatureModeLimitations().contains(EmoteTrackingMode.EXTERNAL_EMOTES)); } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + } diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ShowTrackedEmotesTest.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ShowTrackedEmotesTest.java index 3c8924b27..64dbd27fa 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ShowTrackedEmotesTest.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/ShowTrackedEmotesTest.java @@ -1,10 +1,10 @@ package dev.sheldan.abstracto.statistic.emotes.command; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.FeatureModeService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import dev.sheldan.abstracto.statistic.config.StatisticFeatures; import dev.sheldan.abstracto.statistic.emotes.config.EmoteTrackingMode; @@ -45,11 +45,6 @@ public class ShowTrackedEmotesTest { private static final Long SERVER_ID = 4L; - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void testShowTrackedEmotesNoStats() { CommandContext commandContext = CommandTestUtilities.getNoParameters(); @@ -230,4 +225,10 @@ public class ShowTrackedEmotesTest { Assert.assertEquals(StatisticFeatures.EMOTE_TRACKING, testUnit.getFeature()); } + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + + } diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/TrackEmoteTest.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/TrackEmoteTest.java index 3627d4320..2ab5ca0ba 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/TrackEmoteTest.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emotes/command/TrackEmoteTest.java @@ -1,14 +1,13 @@ package dev.sheldan.abstracto.statistic.emotes.command; import dev.sheldan.abstracto.core.command.exception.IncorrectParameterException; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.exception.IncorrectFeatureModeException; import dev.sheldan.abstracto.core.models.ServerSpecificId; import dev.sheldan.abstracto.core.service.EmoteService; import dev.sheldan.abstracto.core.service.FeatureModeService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import dev.sheldan.abstracto.statistic.config.StatisticFeatures; import dev.sheldan.abstracto.statistic.emotes.command.parameter.TrackEmoteParameter; @@ -53,16 +52,6 @@ public class TrackEmoteTest { private static final Long EMOTE_ID = 4L; private static final Long SERVER_ID = 5L; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTest(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void testReTrackTrackedEmote(){ CommandContext commandContext = CommandTestUtilities.getWithParameters(Arrays.asList(trackEmoteParameter)); @@ -124,4 +113,10 @@ public class TrackEmoteTest { public void testFeature() { Assert.assertEquals(StatisticFeatures.EMOTE_TRACKING, testUnit.getFeature()); } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + } diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/ShowAvatar.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/ShowAvatar.java index 91d8c30d4..39262fb5a 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/ShowAvatar.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/ShowAvatar.java @@ -32,7 +32,6 @@ public class ShowAvatar extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Member memberToShow = parameters.size() == 1 ? (Member) parameters.get(0) : commandContext.getUserInitiatedContext().getMember(); ShowAvatarModel model = (ShowAvatarModel) ContextConverter.fromCommandContext(commandContext, ShowAvatarModel.class); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/ShowEmote.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/ShowEmote.java index b5e26bf49..fa6742fc8 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/ShowEmote.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/ShowEmote.java @@ -29,7 +29,6 @@ public class ShowEmote extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Emote emoteParameter = (Emote) parameters.get(0); ShowEmoteLog emoteLog = (ShowEmoteLog) ContextConverter.fromCommandContext(commandContext, ShowEmoteLog.class); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/UserInfo.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/UserInfo.java index f5b533847..228406468 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/UserInfo.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/UserInfo.java @@ -39,7 +39,6 @@ public class UserInfo extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Member memberToShow = parameters.size() == 1 ? (Member) parameters.get(0) : commandContext.getAuthor(); UserInfoModel model = (UserInfoModel) ContextConverter.slimFromCommandContext(commandContext, UserInfoModel.class); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/Remind.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/Remind.java index c978e3cb4..5a1841dd5 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/Remind.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/Remind.java @@ -37,7 +37,6 @@ public class Remind extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Duration remindTime = (Duration) parameters.get(0); String text = (String) parameters.get(1); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/UnRemind.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/UnRemind.java index b263e1a7f..2cebff915 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/UnRemind.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/UnRemind.java @@ -29,7 +29,6 @@ public class UnRemind extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); Long reminderId = (Long) commandContext.getParameters().getParameters().get(0); reminderService.unRemind(reminderId, commandContext.getUserInitiatedContext().getAUserInAServer()); return CommandResult.fromSuccess(); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/DisableRepostCheck.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/DisableRepostCheck.java new file mode 100644 index 000000000..0794f6376 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/DisableRepostCheck.java @@ -0,0 +1,67 @@ +package dev.sheldan.abstracto.utility.commands.repost; + +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.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.config.FeatureEnum; +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ChannelGroupManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.utility.config.RepostDetectionModuleInterface; +import dev.sheldan.abstracto.utility.config.features.UtilityFeature; +import dev.sheldan.abstracto.utility.service.RepostCheckChannelService; +import dev.sheldan.abstracto.utility.service.RepostServiceBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +@Component +public class DisableRepostCheck extends AbstractConditionableCommand { + + @Autowired + private RepostCheckChannelService repostCheckChannelService; + + @Autowired + private ChannelGroupManagementService channelGroupManagementService; + + @Autowired + private ServerManagementService serverManagementService; + + @Override + public CommandResult execute(CommandContext commandContext) { + List parameters = commandContext.getParameters().getParameters(); + AChannelGroup fakeChannelGroup = (AChannelGroup) parameters.get(0); + AServer actualServer = serverManagementService.loadServer(commandContext.getGuild().getIdLong()); + AChannelGroup actualChannelGroup = channelGroupManagementService.findByNameAndServerAndType(fakeChannelGroup.getGroupName(), actualServer, RepostServiceBean.REPOST_CHECK_CHANNEL_GROUP_TYPE); + repostCheckChannelService.setRepostCheckDisabledForChannelGroup(actualChannelGroup); + return CommandResult.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + Parameter channelToSet = Parameter.builder().name("channelGroup").type(AChannelGroup.class).templated(true).build(); + List parameters = Arrays.asList(channelToSet); + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("disableRepostCheck") + .module(RepostDetectionModuleInterface.REPOST_DETECTION) + .templated(true) + .async(false) + .supportsEmbedException(true) + .causesReaction(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return UtilityFeature.REPOST_DETECTION; + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/EnableRepostCheck.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/EnableRepostCheck.java new file mode 100644 index 000000000..d27210d8e --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/EnableRepostCheck.java @@ -0,0 +1,67 @@ +package dev.sheldan.abstracto.utility.commands.repost; + +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.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.config.FeatureEnum; +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ChannelGroupManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.utility.config.RepostDetectionModuleInterface; +import dev.sheldan.abstracto.utility.config.features.UtilityFeature; +import dev.sheldan.abstracto.utility.service.RepostCheckChannelService; +import dev.sheldan.abstracto.utility.service.RepostServiceBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +@Component +public class EnableRepostCheck extends AbstractConditionableCommand { + + @Autowired + private RepostCheckChannelService repostCheckChannelService; + + @Autowired + private ChannelGroupManagementService channelGroupManagementService; + + @Autowired + private ServerManagementService serverManagementService; + + @Override + public CommandResult execute(CommandContext commandContext) { + List parameters = commandContext.getParameters().getParameters(); + AChannelGroup fakeChannelGroup = (AChannelGroup) parameters.get(0); + AServer actualServer = serverManagementService.loadServer(commandContext.getGuild().getIdLong()); + AChannelGroup actualChannelGroup = channelGroupManagementService.findByNameAndServerAndType(fakeChannelGroup.getGroupName(), actualServer, RepostServiceBean.REPOST_CHECK_CHANNEL_GROUP_TYPE); + repostCheckChannelService.setRepostCheckEnabledForChannelGroup(actualChannelGroup); + return CommandResult.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + Parameter channelToSet = Parameter.builder().name("channelGroup").type(AChannelGroup.class).templated(true).build(); + List parameters = Arrays.asList(channelToSet); + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("enableRepostCheck") + .module(RepostDetectionModuleInterface.REPOST_DETECTION) + .templated(true) + .async(false) + .supportsEmbedException(true) + .causesReaction(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return UtilityFeature.REPOST_DETECTION; + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/PurgeImagePosts.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/PurgeImagePosts.java new file mode 100644 index 000000000..f418ddb6d --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/PurgeImagePosts.java @@ -0,0 +1,64 @@ +package dev.sheldan.abstracto.utility.commands.repost; + +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.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.config.FeatureEnum; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.utility.config.RepostDetectionModuleInterface; +import dev.sheldan.abstracto.utility.config.features.UtilityFeature; +import dev.sheldan.abstracto.utility.service.PostedImageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +@Component +public class PurgeImagePosts extends AbstractConditionableCommand { + + @Autowired + private PostedImageService postedImageService; + + @Autowired + private UserInServerManagementService userInServerManagementService; + + @Override + public CommandResult execute(CommandContext commandContext) { + List parameters = commandContext.getParameters().getParameters(); + if(!parameters.isEmpty()) { + AUserInAServer fakeUser = (AUserInAServer) parameters.get(0); + AUserInAServer actualUser = userInServerManagementService.loadUser(fakeUser.getUserInServerId()); + postedImageService.purgePostedImages(actualUser); + } else { + postedImageService.purgePostedImages(commandContext.getGuild()); + } + return CommandResult.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + Parameter channelToSet = Parameter.builder().name("member").type(AUserInAServer.class).templated(true).optional(true).build(); + List parameters = Arrays.asList(channelToSet); + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("purgeImagePosts") + .module(RepostDetectionModuleInterface.REPOST_DETECTION) + .templated(true) + .async(false) + .supportsEmbedException(true) + .causesReaction(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return UtilityFeature.REPOST_DETECTION; + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/PurgeReposts.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/PurgeReposts.java new file mode 100644 index 000000000..072d69295 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/PurgeReposts.java @@ -0,0 +1,64 @@ +package dev.sheldan.abstracto.utility.commands.repost; + +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.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.config.FeatureEnum; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.utility.config.RepostDetectionModuleInterface; +import dev.sheldan.abstracto.utility.config.features.UtilityFeature; +import dev.sheldan.abstracto.utility.service.RepostService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +@Component +public class PurgeReposts extends AbstractConditionableCommand { + + @Autowired + private UserInServerManagementService userInServerManagementService; + + @Autowired + private RepostService repostService; + + @Override + public CommandResult execute(CommandContext commandContext) { + List parameters = commandContext.getParameters().getParameters(); + if(!parameters.isEmpty()) { + AUserInAServer fakeUser = (AUserInAServer) parameters.get(0); + AUserInAServer actualUser = userInServerManagementService.loadUser(fakeUser.getUserInServerId()); + repostService.purgeReposts(actualUser); + } else { + repostService.purgeReposts(commandContext.getGuild()); + } + return CommandResult.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + Parameter channelToSet = Parameter.builder().name("member").type(AUserInAServer.class).templated(true).optional(true).build(); + List parameters = Arrays.asList(channelToSet); + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("purgeReposts") + .module(RepostDetectionModuleInterface.REPOST_DETECTION) + .templated(true) + .async(false) + .supportsEmbedException(true) + .causesReaction(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return UtilityFeature.REPOST_DETECTION; + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/RepostLeaderboard.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/RepostLeaderboard.java new file mode 100644 index 000000000..ef52a3e83 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/RepostLeaderboard.java @@ -0,0 +1,102 @@ +package dev.sheldan.abstracto.utility.commands.repost; + +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.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.config.FeatureEnum; +import dev.sheldan.abstracto.core.config.FeatureMode; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.core.utils.FutureUtils; +import dev.sheldan.abstracto.templating.service.TemplateService; +import dev.sheldan.abstracto.utility.config.RepostDetectionModuleInterface; +import dev.sheldan.abstracto.utility.config.features.RepostDetectionFeatureMode; +import dev.sheldan.abstracto.utility.config.features.UtilityFeature; +import dev.sheldan.abstracto.utility.converter.RepostLeaderBoardConverter; +import dev.sheldan.abstracto.utility.models.RepostLeaderboardEntryModel; +import dev.sheldan.abstracto.utility.models.RepostLeaderboardModel; +import dev.sheldan.abstracto.utility.models.database.result.RepostLeaderboardResult; +import dev.sheldan.abstracto.utility.service.RepostService; +import dev.sheldan.abstracto.utility.service.management.RepostManagementService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +@Component +public class RepostLeaderboard extends AbstractConditionableCommand { + + public static final String REPOST_LEADERBOARD_RESPONSE_TEMPLATE_KEY = "repostLeaderboard_response"; + @Autowired + private RepostService repostService; + + @Autowired + private RepostManagementService repostManagementService; + + @Autowired + private TemplateService templateService; + + @Autowired + private ChannelService channelService; + + @Autowired + private RepostLeaderBoardConverter converter; + + @Autowired + private UserInServerManagementService userInServerManagementService; + + @Override + public CompletableFuture executeAsync(CommandContext commandContext) { + List parameters = commandContext.getParameters().getParameters(); + Integer page = !parameters.isEmpty() ? (Integer) parameters.get(0) : 1; + AUserInAServer aUserInAServer = userInServerManagementService.loadUser(commandContext.getAuthor()); + List topRepostingUsersOfServer = repostManagementService.findTopRepostingUsersOfServer(commandContext.getGuild().getIdLong(), page, 5); + RepostLeaderboardResult resultOfUser = repostManagementService.getRepostRankOfUser(aUserInAServer); + CompletableFuture> leaderBoardFuture = converter.fromLeaderBoardResults(topRepostingUsersOfServer); + CompletableFuture userFuture = converter.convertSingleUser(resultOfUser); + return CompletableFuture.allOf(leaderBoardFuture, userFuture).thenCompose(unused -> { + List entries = leaderBoardFuture.join(); + RepostLeaderboardModel model = RepostLeaderboardModel + .builder() + .guild(commandContext.getGuild()) + .entries(entries) + .userExecuting(userFuture.join()) + .member(commandContext.getAuthor()) + .build(); + return FutureUtils.toSingleFutureGeneric(channelService.sendEmbedTemplateInChannel(REPOST_LEADERBOARD_RESPONSE_TEMPLATE_KEY, model, commandContext.getChannel())); + }).thenApply(o -> CommandResult.fromIgnored()); + } + + @Override + public CommandConfiguration getConfiguration() { + Parameter channelToSet = Parameter.builder().name("page").type(Integer.class).templated(true).optional(true).build(); + List parameters = Arrays.asList(channelToSet); + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("repostLeaderboard") + .module(RepostDetectionModuleInterface.REPOST_DETECTION) + .templated(true) + .async(true) + .supportsEmbedException(true) + .causesReaction(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return UtilityFeature.REPOST_DETECTION; + } + + @Override + public List getFeatureModeLimitations() { + return Arrays.asList(RepostDetectionFeatureMode.LEADERBOARD); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/ShowRepostCheckChannels.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/ShowRepostCheckChannels.java new file mode 100644 index 000000000..3de08c74c --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/repost/ShowRepostCheckChannels.java @@ -0,0 +1,62 @@ +package dev.sheldan.abstracto.utility.commands.repost; + +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.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.config.FeatureEnum; +import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.utils.FutureUtils; +import dev.sheldan.abstracto.utility.config.RepostDetectionModuleInterface; +import dev.sheldan.abstracto.utility.config.features.UtilityFeature; +import dev.sheldan.abstracto.utility.converter.RepostCheckChannelModelConverter; +import dev.sheldan.abstracto.utility.models.database.RepostCheckChannelGroup; +import dev.sheldan.abstracto.utility.models.template.commands.RepostCheckChannelsModel; +import dev.sheldan.abstracto.utility.service.RepostCheckChannelService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.concurrent.CompletableFuture; + +@Component +public class ShowRepostCheckChannels extends AbstractConditionableCommand { + + public static final String SHOW_REPOST_CHECK_CHANNELS_RESPONSE_TEMPLATE_KEY = "showRepostCheckChannels_response"; + @Autowired + private RepostCheckChannelModelConverter converter; + + @Autowired + private RepostCheckChannelService checkChannelService; + + @Autowired + private ChannelService channelService; + + @Override + public CompletableFuture executeAsync(CommandContext commandContext) { + List channelGroups = checkChannelService.getChannelGroupsWithEnabledCheck(commandContext.getGuild().getIdLong()); + RepostCheckChannelsModel model = converter.fromRepostCheckChannelGroups(channelGroups, commandContext.getGuild()); + return FutureUtils.toSingleFutureGeneric(channelService.sendEmbedTemplateInChannel(SHOW_REPOST_CHECK_CHANNELS_RESPONSE_TEMPLATE_KEY, model, commandContext.getChannel())) + .thenApply(unused -> CommandResult.fromIgnored()); + } + + @Override + public CommandConfiguration getConfiguration() { + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("showRepostCheckChannels") + .module(RepostDetectionModuleInterface.REPOST_DETECTION) + .templated(true) + .async(true) + .supportsEmbedException(true) + .causesReaction(false) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return UtilityFeature.REPOST_DETECTION; + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/suggest/Accept.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/suggest/Accept.java index 2fd0eb9e4..91c203895 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/suggest/Accept.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/suggest/Accept.java @@ -30,7 +30,6 @@ public class Accept extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Long suggestionId = (Long) parameters.get(0); String text = parameters.size() == 2 ? (String) parameters.get(1) : ""; diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/suggest/Reject.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/suggest/Reject.java index b93d7a6e8..5d866455f 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/suggest/Reject.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/suggest/Reject.java @@ -30,7 +30,6 @@ public class Reject extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); Long suggestionId = (Long) parameters.get(0); String text = parameters.size() == 2 ? (String) parameters.get(1) : ""; diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/suggest/Suggest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/suggest/Suggest.java index 4f88e2dcf..8917b746a 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/suggest/Suggest.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/suggest/Suggest.java @@ -25,7 +25,6 @@ public class Suggest extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List parameters = commandContext.getParameters().getParameters(); String text = (String) parameters.get(0); SuggestionLog suggestLogModel = (SuggestionLog) ContextConverter.fromCommandContext(commandContext, SuggestionLog.class); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/converter/RepostCheckChannelModelConverter.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/converter/RepostCheckChannelModelConverter.java new file mode 100644 index 000000000..a6b1d850a --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/converter/RepostCheckChannelModelConverter.java @@ -0,0 +1,42 @@ +package dev.sheldan.abstracto.utility.converter; + +import dev.sheldan.abstracto.core.models.FullChannel; +import dev.sheldan.abstracto.core.service.BotService; +import dev.sheldan.abstracto.utility.models.database.RepostCheckChannelGroup; +import dev.sheldan.abstracto.utility.models.template.commands.RepostCheckChannelGroupDisplayModel; +import dev.sheldan.abstracto.utility.models.template.commands.RepostCheckChannelsModel; +import net.dv8tion.jda.api.entities.Guild; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class RepostCheckChannelModelConverter { + + @Autowired + private BotService botService; + + public RepostCheckChannelsModel fromRepostCheckChannelGroups(List channelGroups, Guild guild) { + List repostCheckChannelGroups = new ArrayList<>(); + channelGroups.forEach(repostCheckChannelGroup -> { + List fullChannels = repostCheckChannelGroup.getChannelGroup().getChannels().stream().map(channel -> + FullChannel + .builder() + .channel(channel) + .serverChannel(botService.getTextChannelFromServerNullable(guild, channel.getId())) + .build() + ).collect(Collectors.toList()); + repostCheckChannelGroups.add( + RepostCheckChannelGroupDisplayModel + .builder() + .channelGroup(repostCheckChannelGroup) + .channels(fullChannels) + .build()); + }); + return RepostCheckChannelsModel.builder().repostCheckChannelGroups(repostCheckChannelGroups).build(); + } + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/converter/RepostLeaderBoardConverter.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/converter/RepostLeaderBoardConverter.java new file mode 100644 index 000000000..6536cda4e --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/converter/RepostLeaderBoardConverter.java @@ -0,0 +1,62 @@ +package dev.sheldan.abstracto.utility.converter; + +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.BotService; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.core.utils.FutureUtils; +import dev.sheldan.abstracto.utility.models.RepostLeaderboardEntryModel; +import dev.sheldan.abstracto.utility.models.database.result.RepostLeaderboardResult; +import net.dv8tion.jda.api.entities.Member; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +@Component +public class RepostLeaderBoardConverter { + + @Autowired + private UserInServerManagementService userInServerManagementService; + + @Autowired + private BotService botService; + + @Autowired + private RepostLeaderBoardConverter self; + + public CompletableFuture> fromLeaderBoardResults(List results) { + if(results.isEmpty()) { + return CompletableFuture.completedFuture(new ArrayList<>()); + } + List> modelFutures = + results.stream().map(this::convertSingleUser).collect(Collectors.toList()); + return FutureUtils.toSingleFutureGeneric(modelFutures).thenApply(unused -> + modelFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()) + ); + } + + public CompletableFuture convertSingleUser(RepostLeaderboardResult result) { + AUserInAServer user = userInServerManagementService.loadUser(result.getUserInServerId()); + Integer count = result.getRepostCount(); + Long userInServerId = result.getUserInServerId(); + Integer rank = result.getRank(); + return botService.getMemberInServerAsync(user).thenApply(member -> + self.loadUserFromDatabase(member, count, userInServerId, rank) + ); + } + + @Transactional + public RepostLeaderboardEntryModel loadUserFromDatabase(Member member, Integer count, Long userInServerId, Integer rank) { + return RepostLeaderboardEntryModel + .builder() + .member(member) + .user(userInServerManagementService.loadUser(userInServerId)) + .count(count) + .rank(rank) + .build(); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/listener/repost/RepostCheckChannelGroupCreatedListener.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/listener/repost/RepostCheckChannelGroupCreatedListener.java new file mode 100644 index 000000000..66ec97cdb --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/listener/repost/RepostCheckChannelGroupCreatedListener.java @@ -0,0 +1,22 @@ +package dev.sheldan.abstracto.utility.listener.repost; + +import dev.sheldan.abstracto.core.listener.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; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class RepostCheckChannelGroupCreatedListener implements ChannelGroupCreatedListener { + + @Autowired + private RepostCheckChannelGroupManagement checkChannelGroupManagement; + + @Override + public void channelGroupCreated(AChannelGroup channelGroup) { + if(channelGroup.getChannelGroupType().getGroupTypeKey().equals(RepostServiceBean.REPOST_CHECK_CHANNEL_GROUP_TYPE)) { + checkChannelGroupManagement.createRepostCheckChannelGroup(channelGroup); + } + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/listener/repost/RepostCheckChannelGroupDeletedListener.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/listener/repost/RepostCheckChannelGroupDeletedListener.java new file mode 100644 index 000000000..f35dfc598 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/listener/repost/RepostCheckChannelGroupDeletedListener.java @@ -0,0 +1,22 @@ +package dev.sheldan.abstracto.utility.listener.repost; + +import dev.sheldan.abstracto.core.listener.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; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class RepostCheckChannelGroupDeletedListener implements ChannelGroupDeletedListener { + + @Autowired + private RepostCheckChannelGroupManagement checkChannelGroupManagement; + + @Override + public void channelGroupDeleted(AChannelGroup channelGroup) { + if(channelGroup.getChannelGroupType().getGroupTypeKey().equals(RepostServiceBean.REPOST_CHECK_CHANNEL_GROUP_TYPE)) { + checkChannelGroupManagement.deleteRepostCheckChannelGroup(channelGroup); + } + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/listener/repost/RepostEmbedListener.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/listener/repost/RepostEmbedListener.java new file mode 100644 index 000000000..3147e67c3 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/listener/repost/RepostEmbedListener.java @@ -0,0 +1,58 @@ +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.models.listener.GuildMessageEmbedEventModel; +import dev.sheldan.abstracto.utility.config.features.UtilityFeature; +import dev.sheldan.abstracto.utility.service.RepostCheckChannelService; +import dev.sheldan.abstracto.utility.service.RepostService; +import dev.sheldan.abstracto.utility.service.management.PostedImageManagement; +import lombok.extern.slf4j.Slf4j; +import net.dv8tion.jda.api.entities.EmbedType; +import net.dv8tion.jda.api.entities.MessageEmbed; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +@Slf4j +public class RepostEmbedListener implements MessageEmbeddedListener { + + @Autowired + private RepostCheckChannelService repostCheckChannelService; + + @Autowired + private RepostService repostService; + + @Autowired + private PostedImageManagement repostManagement; + + @Override + public void execute(GuildMessageEmbedEventModel eventModel) { + if(repostCheckChannelService.duplicateCheckEnabledForChannel(eventModel.getChannel())) { + 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()); + return; + } + eventModel.getChannel().retrieveMessageById(eventModel.getMessageId()).queue(message -> { + List imageEmbeds = eventModel.getEmbeds().stream().filter(messageEmbed -> messageEmbed.getType().equals(EmbedType.IMAGE)).collect(Collectors.toList()); + repostService.processMessageEmbedsRepostCheck(imageEmbeds, message); + }); + } + } + + @Override + public FeatureEnum getFeature() { + return UtilityFeature.REPOST_DETECTION; + } + + @Override + public Integer getPriority() { + return ListenerPriority.MEDIUM; + } + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/listener/repost/RepostMessageReceivedListener.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/listener/repost/RepostMessageReceivedListener.java new file mode 100644 index 000000000..64e63f1a3 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/listener/repost/RepostMessageReceivedListener.java @@ -0,0 +1,48 @@ +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.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; + +import java.util.List; +import java.util.stream.Collectors; + + +@Component +@Slf4j +public class RepostMessageReceivedListener implements MessageReceivedListener { + + @Autowired + private RepostCheckChannelService repostCheckChannelService; + + @Autowired + private RepostService repostService; + + @Override + public void execute(Message message) { + if(repostCheckChannelService.duplicateCheckEnabledForChannel(message.getTextChannel())) { + repostService.processMessageAttachmentRepostCheck(message); + List imageEmbeds = message.getEmbeds().stream().filter(messageEmbed -> messageEmbed.getType().equals(EmbedType.IMAGE)).collect(Collectors.toList()); + repostService.processMessageEmbedsRepostCheck(imageEmbeds, message); + } + } + + @Override + public FeatureEnum getFeature() { + return UtilityFeature.REPOST_DETECTION; + } + + @Override + public Integer getPriority() { + return ListenerPriority.MEDIUM; + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/PostedImageRepository.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/PostedImageRepository.java new file mode 100644 index 000000000..7209ffe89 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/PostedImageRepository.java @@ -0,0 +1,22 @@ +package dev.sheldan.abstracto.utility.repository; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.utility.models.database.PostedImage; +import dev.sheldan.abstracto.utility.models.database.embed.PostIdentifier; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface PostedImageRepository extends JpaRepository { + boolean existsByImageHashAndServerId(String hash, Long serverId); + Optional findByImageHashAndServerId(String hash, Long serverId); + boolean existsByPostId_MessageId(Long messageId); + boolean existsByPostId_MessageIdAndPostId_PositionGreaterThan(Long messageId, Integer position); + List findByPostId_MessageId(Long messageId); + void deleteByServer(AServer server); + void deleteByPoster(AUserInAServer aUserInAServer); +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/RepostCheckChannelRepository.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/RepostCheckChannelRepository.java new file mode 100644 index 000000000..c7cb20485 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/RepostCheckChannelRepository.java @@ -0,0 +1,9 @@ +package dev.sheldan.abstracto.utility.repository; + +import dev.sheldan.abstracto.utility.models.database.RepostCheckChannelGroup; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface RepostCheckChannelRepository extends JpaRepository { +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/RepostRepository.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/RepostRepository.java new file mode 100644 index 000000000..71bbfb87e --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/RepostRepository.java @@ -0,0 +1,55 @@ +package dev.sheldan.abstracto.utility.repository; + +import dev.sheldan.abstracto.utility.models.database.Repost; +import dev.sheldan.abstracto.utility.models.database.embed.RepostIdentifier; +import dev.sheldan.abstracto.utility.models.database.result.RepostLeaderboardResult; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface RepostRepository extends JpaRepository { + + @Query(value = "WITH repost_rank AS " + + "( " + + "SELECT user_in_server_id as user_in_server_id, SUM(count) as repost_count, ROW_NUMBER() OVER ( ORDER BY SUM(count) DESC ) \n" + + "FROM repost \n" + + "WHERE server_id = :server_id " + + "GROUP BY user_in_server_id \n" + + "ORDER BY SUM(count) DESC \n" + + " )" + + "SELECT rank.user_in_server_id as userInServerId, rank.repost_count as repostCount, rank.row_number as rank " + + "FROM repost_rank rank ", + countQuery = "SELECT COUNT(1) FROM repost WHERE server_id = :server_id GROUP BY user_in_server_id", + nativeQuery = true) + List findTopRepostingUsers(@Param("server_id") Long serverId, Pageable pageable); + + @Query(value = "WITH repost_rank AS " + + "( " + + "SELECT user_in_server_id as user_in_server_id, SUM(count) as repost_count, ROW_NUMBER() OVER ( ORDER BY SUM(count) DESC ) \n" + + "FROM repost \n" + + "WHERE server_id = :server_id " + + "GROUP BY user_in_server_id \n" + + "ORDER BY SUM(count) DESC \n" + + " )" + + "SELECT rank.user_in_server_id as userInServerId, rank.repost_count as repostCount, rank.row_number as rank " + + "FROM repost_rank rank " + + "WHERE rank.user_in_server_id = :user_in_server_id " + + "UNION ALL " + + "SELECT :user_in_server_id as userInServerId, 0 as repostCount, 0 as rank " + + "WHERE NOT EXISTS " + + "(SELECT 1 " + + "FROM repost_rank rank WHERE rank.user_in_server_id = :user_in_server_id" + + ")", + nativeQuery = true) + RepostLeaderboardResult getRepostRankOfUserInServer(@Param("user_in_server_id") Long useInServerId, @Param("server_id") Long serverId); + + void deleteByServerId(Long serverId); + + void deleteByRepostId_UserInServerIdAndServerId(Long userInServerId, Long serverId); + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/converter/StarStatsUserConverter.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/converter/StarStatsUserConverter.java index 14e7b0409..813f8fefa 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/converter/StarStatsUserConverter.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/converter/StarStatsUserConverter.java @@ -37,6 +37,7 @@ public class StarStatsUserConverter { .builder() .starCount(starStatsUserResult.getStarCount()) .member(member) + // TODO properly load this instance instead of just building one .user(AUser.builder().id(starStatsUserResult.getUserId()).build()) .build() ); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/PostedImageServiceBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/PostedImageServiceBean.java new file mode 100644 index 000000000..b682f377f --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/PostedImageServiceBean.java @@ -0,0 +1,30 @@ +package dev.sheldan.abstracto.utility.service; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.utility.service.management.PostedImageManagement; +import net.dv8tion.jda.api.entities.Guild; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class PostedImageServiceBean implements PostedImageService { + + @Autowired + private PostedImageManagement postedImageManagement; + + @Autowired + private ServerManagementService serverManagementService; + + @Override + public void purgePostedImages(AUserInAServer aUserInAServer) { + postedImageManagement.removePostedImagesOf(aUserInAServer); + } + + @Override + public void purgePostedImages(Guild guild) { + AServer server = serverManagementService.loadServer(guild.getIdLong()); + postedImageManagement.removedPostedImagesIn(server); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RepostCheckChannelServiceBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RepostCheckChannelServiceBean.java new file mode 100644 index 000000000..b9b467497 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RepostCheckChannelServiceBean.java @@ -0,0 +1,104 @@ +package dev.sheldan.abstracto.utility.service; + +import dev.sheldan.abstracto.core.models.database.AChannel; +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.ChannelGroupService; +import dev.sheldan.abstracto.core.service.management.ChannelGroupManagementService; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; +import dev.sheldan.abstracto.utility.models.database.RepostCheckChannelGroup; +import dev.sheldan.abstracto.utility.service.management.RepostCheckChannelGroupManagement; +import net.dv8tion.jda.api.entities.TextChannel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static dev.sheldan.abstracto.utility.service.RepostServiceBean.REPOST_CHECK_CHANNEL_GROUP_TYPE; + +@Component +public class RepostCheckChannelServiceBean implements RepostCheckChannelService { + + @Autowired + private RepostCheckChannelGroupManagement repostCheckChannelManagement; + + @Autowired + private ChannelManagementService channelManagementService; + + @Autowired + private ChannelGroupService channelGroupService; + + @Autowired + private ChannelGroupManagementService channelGroupManagementService; + + @Override + public void setRepostCheckEnabledForChannelGroup(AChannelGroup channelGroup) { + RepostCheckChannelGroup group = repostCheckChannelManagement.loadRepostChannelGroupByChannelGroup(channelGroup); + setRepostCheckEnabledForChannelGroup(group); + } + + @Override + public void setRepostCheckEnabledForChannelGroup(RepostCheckChannelGroup channelGroup) { + channelGroup.setCheckEnabled(true); + } + + @Override + public void setRepostCheckDisabledForChannelGroup(AChannelGroup channelGroup) { + RepostCheckChannelGroup group = repostCheckChannelManagement.loadRepostChannelGroupByChannelGroup(channelGroup); + setRepostCheckDisabledForChannelGroup(group); + } + + @Override + public void setRepostCheckDisabledForChannelGroup(RepostCheckChannelGroup channelGroup) { + channelGroup.setCheckEnabled(false); + } + + @Override + public boolean duplicateCheckEnabledForChannel(TextChannel textChannel) { + AChannel channel = channelManagementService.loadChannel(textChannel.getIdLong()); + return duplicateCheckEnabledForChannel(channel); + } + + @Override + public boolean duplicateCheckEnabledForChannel(AChannel channel) { + List channelGroups = channelGroupService.getChannelGroupsOfChannelWithType(channel, REPOST_CHECK_CHANNEL_GROUP_TYPE); + if(!channelGroups.isEmpty()) { + List repostChannelGroups = channelGroups.stream().map(aChannelGroup -> + repostCheckChannelManagement.loadRepostChannelGroupById(aChannelGroup.getId()) + ).collect(Collectors.toList()); + return repostChannelGroups.stream().anyMatch(RepostCheckChannelGroup::getCheckEnabled); + } + return false; + } + + @Override + public List getRepostCheckChannelGroupsForServer(AServer server) { + return getRepostCheckChannelGroupsForServer(server.getId()); + } + + @Override + public List getRepostCheckChannelGroupsForServer(Long serverId) { + List channelGroups = channelGroupManagementService.findAllInServerWithType(serverId, REPOST_CHECK_CHANNEL_GROUP_TYPE); + if(!channelGroups.isEmpty()) { + return channelGroups.stream().map(aChannelGroup -> + repostCheckChannelManagement.loadRepostChannelGroupById(aChannelGroup.getId()) + ).collect(Collectors.toList()); + } + return new ArrayList<>(); + } + + @Override + public List getChannelGroupsWithEnabledCheck(AServer server) { + return getChannelGroupsWithEnabledCheck(server.getId()); + } + + @Override + public List getChannelGroupsWithEnabledCheck(Long serverId) { + return getRepostCheckChannelGroupsForServer(serverId) + .stream() + .filter(RepostCheckChannelGroup::getCheckEnabled) + .collect(Collectors.toList()); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RepostServiceBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RepostServiceBean.java new file mode 100644 index 000000000..c42e3efe9 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RepostServiceBean.java @@ -0,0 +1,235 @@ +package dev.sheldan.abstracto.utility.service; + +import dev.sheldan.abstracto.core.models.AServerAChannelAUser; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.FeatureModeService; +import dev.sheldan.abstracto.core.service.HashService; +import dev.sheldan.abstracto.core.service.HttpService; +import dev.sheldan.abstracto.core.service.MessageService; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.core.utils.FileUtils; +import dev.sheldan.abstracto.utility.config.features.RepostDetectionFeatureMode; +import dev.sheldan.abstracto.utility.config.features.UtilityFeature; +import dev.sheldan.abstracto.utility.converter.RepostLeaderBoardConverter; +import dev.sheldan.abstracto.utility.models.RepostLeaderboardEntryModel; +import dev.sheldan.abstracto.utility.models.database.PostedImage; +import dev.sheldan.abstracto.utility.models.database.Repost; +import dev.sheldan.abstracto.utility.models.database.result.RepostLeaderboardResult; +import dev.sheldan.abstracto.utility.service.management.PostedImageManagement; +import dev.sheldan.abstracto.utility.service.management.RepostManagementService; +import lombok.extern.slf4j.Slf4j; +import net.dv8tion.jda.api.entities.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +@Component +@Slf4j +public class RepostServiceBean implements RepostService { + + public static final Integer LEADER_BOARD_PAGE_SIZE = 5; + @Autowired + private HttpService httpService; + + @Autowired + private HashService hashService; + + @Autowired + private FileUtils fileUtils; + + @Autowired + private PostedImageManagement postedImageManagement; + + @Autowired + private ServerManagementService serverManagementService; + + @Autowired + private ChannelManagementService channelManagementService; + + @Autowired + private UserInServerManagementService userInServerManagementService; + + @Autowired + private MessageService messageService; + + @Autowired + private FeatureModeService featureModeService; + + @Autowired + private RepostManagementService repostManagementService; + + @Autowired + private RepostLeaderBoardConverter leaderBoardConverter; + + @Autowired + private RepostServiceBean self; + + public static final List NUMBER_EMOJI = Arrays.asList("\u0031\u20e3", "\u0032\u20e3", "\u0033\u20e3", + "\u0034\u20e3", "\u0035\u20e3", "\u0036\u20e3", + "\u0037\u20e3", "\u0038\u20e3", "\u0039\u20e3"); + + public static final String REPOST_CHECK_CHANNEL_GROUP_TYPE = "repostDetection"; + + // any embedded post will create an repost instance with a position higher than this + public static final Integer EMBEDDED_LINK_POSITION_START_INDEX = 1000; + public static final String REPOST_MARKER_EMOTE_KEY = "repostMarker"; + + @Override + public boolean isRepost(Message message, MessageEmbed messageEmbed, Integer index) { + return getRepostFor(message, messageEmbed, index).isPresent(); + } + + @Override + public Optional getRepostFor(Message message, MessageEmbed messageEmbed, Integer embedIndex) { + if(messageEmbed.getThumbnail() == null && messageEmbed.getImage() == null) { + return Optional.empty(); + } + String urlToUse = null; + if(messageEmbed.getThumbnail() != null) { + urlToUse = messageEmbed.getThumbnail().getProxyUrl(); + } else if (messageEmbed.getImage() != null) { + urlToUse = messageEmbed.getImage().getProxyUrl(); + } + return checkForDuplicates(message, EMBEDDED_LINK_POSITION_START_INDEX + embedIndex, urlToUse); + } + + private Optional checkForDuplicates(Message message, Integer index, String fileUrl) { + String fileHash = calculateHashForPost(fileUrl, message.getGuild().getIdLong()); + AServer aServer = serverManagementService.loadServer(message.getGuild().getIdLong()); + Optional potentialRepost = postedImageManagement.getPostWithHash(fileHash, aServer); + if(potentialRepost.isPresent()) { + PostedImage existingRepost = potentialRepost.get(); + return existingRepost.getPostId().getMessageId() != message.getIdLong() ? Optional.of(existingRepost) : Optional.empty(); + } else { + AUserInAServer aUserInAServer = userInServerManagementService.loadUser(message.getMember()); + AServerAChannelAUser cause = AServerAChannelAUser + .builder() + .aUserInAServer(aUserInAServer) + .channel(channelManagementService.loadChannel(message.getTextChannel().getIdLong())) + .guild(aServer) + .user(aUserInAServer.getUserReference()) + .build(); + postedImageManagement.createPost(cause, message, fileHash, index); + return Optional.empty(); + } + } + + @Override + public boolean isRepost(Message message, Message.Attachment attachment, Integer index) { + return getRepostFor(message, attachment, index).isPresent(); + } + + @Override + public Optional getRepostFor(Message message, Message.Attachment attachment, Integer index) { + return checkForDuplicates(message, index, attachment.getProxyUrl()); + } + + @Override + public String calculateHashForPost(String url, Long serverId) { + File downloadedFile = null; + try { + if(featureModeService.featureModeActive(UtilityFeature.REPOST_DETECTION, serverId, RepostDetectionFeatureMode.DOWNLOAD)) { + downloadedFile = httpService.downloadFileToTempFile(url); + return hashService.sha256HashFileContent(downloadedFile); + } else { + return hashService.sha256HashString(url); + } + } catch (IOException e) { + log.error("Failed to download attachment for repost check.", e); + } finally { + if(downloadedFile != null) { + try { + fileUtils.safeDelete(downloadedFile); + } catch (IOException e) { + log.error("Failed to delete downloaded repost check file.", e); + } + } + } + return null; + } + + @Override + public void processMessageAttachmentRepostCheck(Message 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) { + Optional originalPostOptional = getRepostFor(message, attachment, index); + originalPostOptional.ifPresent(postedImage -> markMessageAndPersist(message, 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 markerFuture = messageService.addReactionToMessageWithFuture(REPOST_MARKER_EMOTE_KEY, message.getGuild().getIdLong(), message); + CompletableFuture counterFuture; + if (moreRepostsPossible) { + counterFuture = messageService.addDefaultReactionToMessageAsync(NUMBER_EMOJI.get(index), message); + } 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(); + CompletableFuture.allOf(markerFuture, counterFuture).thenAccept(unused -> + self.persistRepost(messageId, position, serverId, userId) + ); + } + + @Transactional + public void persistRepost(Long messageId, Integer position, Long serverId, Long userId) { + PostedImage postedImage = postedImageManagement.getPostFromMessageAndPosition(messageId, position); + AUserInAServer userInAServer = userInServerManagementService.loadUser(serverId, userId); + Optional existingPost = repostManagementService.findRepostOptional(postedImage, userInAServer); + if(existingPost.isPresent()) { + Repost previousRepost = existingPost.get(); + existingPost.get().setCount(previousRepost.getCount() + 1); + } else { + repostManagementService.createRepost(postedImage, userInAServer); + } + } + + @Override + public void processMessageEmbedsRepostCheck(List embeds, Message 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 CompletableFuture> retrieveRepostLeaderboard(Guild guild, Integer page) { + AServer server = serverManagementService.loadServer(guild.getIdLong()); + List topRepostingUsersOfServer = repostManagementService.findTopRepostingUsersOfServer(server, page, LEADER_BOARD_PAGE_SIZE); + return leaderBoardConverter.fromLeaderBoardResults(topRepostingUsersOfServer); + } + + @Override + public void purgeReposts(AUserInAServer userInAServer) { + repostManagementService.deleteRepostsFromUser(userInAServer); + } + + @Override + public void purgeReposts(Guild guild) { + AServer server = serverManagementService.loadServer(guild.getIdLong()); + repostManagementService.deleteRepostsFromServer(server); + } + + private void executeRepostCheckForMessageEmbed(Message message, MessageEmbed messageEmbed, Integer index, boolean moreRepostsPossible) { + Optional originalPostOptional = getRepostFor(message, messageEmbed, index); + originalPostOptional.ifPresent(postedImage -> markMessageAndPersist(message, index, moreRepostsPossible, postedImage)); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/PostedImageManagementBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/PostedImageManagementBean.java new file mode 100644 index 000000000..dc28bb93f --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/PostedImageManagementBean.java @@ -0,0 +1,86 @@ +package dev.sheldan.abstracto.utility.service.management; + +import dev.sheldan.abstracto.core.models.AServerAChannelAUser; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.utility.exception.PostedImageNotFoundException; +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; + +import java.util.List; +import java.util.Optional; + +@Component +public class PostedImageManagementBean implements PostedImageManagement { + + @Autowired + private PostedImageRepository postedImageRepository; + + @Autowired + private RepostCheckChannelGroupManagement checkChannelBean; + + @Override + public PostedImage createPost(AServerAChannelAUser creation, Message source, String hash, Integer index) { + PostedImage post = PostedImage + .builder() + .imageHash(hash) + .postId(new PostIdentifier(source.getIdLong(), index)) + .poster(creation.getAUserInAServer()) + .server(creation.getGuild()) + .postedChannel(creation.getChannel()) + .build(); + + postedImageRepository.save(post); + return post; + } + + @Override + public boolean postWitHashExists(String hash, AServer server) { + return postedImageRepository.existsByImageHashAndServerId(hash, server.getId()); + } + + @Override + public Optional getPostWithHash(String hash, AServer server) { + return postedImageRepository.findByImageHashAndServerId(hash, server.getId()); + } + + @Override + public boolean messageHasBeenCovered(Long messageId) { + return postedImageRepository.existsByPostId_MessageId(messageId); + } + + @Override + public boolean messageEmbedsHaveBeenCovered(Long messageId) { + return postedImageRepository.existsByPostId_MessageIdAndPostId_PositionGreaterThan(messageId, RepostServiceBean.EMBEDDED_LINK_POSITION_START_INDEX - 1); + } + + @Override + public List getAllFromMessage(Long messageId) { + return postedImageRepository.findByPostId_MessageId(messageId); + } + + @Override + public Optional getPostFromMessageAndPositionOptional(Long messageId, Integer position) { + return postedImageRepository.findById(new PostIdentifier(messageId, position)); + } + + @Override + public PostedImage getPostFromMessageAndPosition(Long messageId, Integer position) { + return getPostFromMessageAndPositionOptional(messageId, position).orElseThrow(() -> new PostedImageNotFoundException(messageId, position)); + } + + @Override + public void removePostedImagesOf(AUserInAServer poster) { + postedImageRepository.deleteByPoster(poster); + } + + @Override + public void removedPostedImagesIn(AServer aServer) { + postedImageRepository.deleteByServer(aServer); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/RepostCheckChannelGroupManagementBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/RepostCheckChannelGroupManagementBean.java new file mode 100644 index 000000000..5d0bcd9cd --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/RepostCheckChannelGroupManagementBean.java @@ -0,0 +1,61 @@ +package dev.sheldan.abstracto.utility.service.management; + +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.utility.exception.RepostCheckChannelGroupNotFoundException; +import dev.sheldan.abstracto.utility.models.database.RepostCheckChannelGroup; +import dev.sheldan.abstracto.utility.repository.RepostCheckChannelRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +@Component +public class RepostCheckChannelGroupManagementBean implements RepostCheckChannelGroupManagement { + + @Autowired + private RepostCheckChannelRepository repository; + + @Override + public RepostCheckChannelGroup loadRepostChannelGroupById(Long channelGroupId) { + return loadRepostChanelGroupByIdOptional(channelGroupId).orElseThrow(() -> new RepostCheckChannelGroupNotFoundException(channelGroupId)); + } + + @Override + public Optional loadRepostChanelGroupByIdOptional(Long channelGroupId) { + return repository.findById(channelGroupId); + } + + @Override + public boolean repostCheckChannelGroupExists(Long channelGroupId) { + return loadRepostChanelGroupByIdOptional(channelGroupId).isPresent(); + } + + @Override + public Optional loadRepostChannelGroupByChannelGroupOptional(AChannelGroup channelGroup) { + return loadRepostChanelGroupByIdOptional(channelGroup.getId()); + } + + @Override + public RepostCheckChannelGroup loadRepostChannelGroupByChannelGroup(AChannelGroup channelGroup) { + return loadRepostChannelGroupById(channelGroup.getId()); + } + + @Override + public RepostCheckChannelGroup createRepostCheckChannelGroup(AChannelGroup channelGroup) { + RepostCheckChannelGroup repostCheckChannelGroup = RepostCheckChannelGroup + .builder() + .checkEnabled(true) + .channelGroup(channelGroup) + .id(channelGroup.getId()) + .build(); + + repository.save(repostCheckChannelGroup); + return repostCheckChannelGroup; + } + + @Override + public void deleteRepostCheckChannelGroup(AChannelGroup channelGroup) { + RepostCheckChannelGroup repostCheckChannelGroup = loadRepostChannelGroupByChannelGroup(channelGroup); + repository.delete(repostCheckChannelGroup); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/RepostManagementServiceBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/RepostManagementServiceBean.java new file mode 100644 index 000000000..cbdd26ec2 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/RepostManagementServiceBean.java @@ -0,0 +1,85 @@ +package dev.sheldan.abstracto.utility.service.management; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.utility.exception.RepostNotFoundException; +import dev.sheldan.abstracto.utility.models.database.PostedImage; +import dev.sheldan.abstracto.utility.models.database.Repost; +import dev.sheldan.abstracto.utility.models.database.embed.RepostIdentifier; +import dev.sheldan.abstracto.utility.models.database.result.RepostLeaderboardResult; +import dev.sheldan.abstracto.utility.repository.RepostRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Optional; + +@Component +public class RepostManagementServiceBean implements RepostManagementService { + + @Autowired + private RepostRepository repostRepository; + + @Override + public Repost createRepost(PostedImage postedImage, AUserInAServer poster) { + Repost repost = Repost + .builder() + .originalPost(postedImage) + .poster(poster) + .repostId(buildRepostIdentifier(postedImage, poster)) + .server(postedImage.getServer()) + .count(1) + .build(); + + repostRepository.save(repost); + return repost; + } + + @Override + public Repost setRepostCount(PostedImage postedImage, AUserInAServer poster, Integer newCount) { + Repost repost = findRepost(postedImage, poster); + repost.setCount(newCount); + return repost; + } + + @Override + public Repost findRepost(PostedImage postedImage, AUserInAServer poster) { + return findRepostOptional(postedImage, poster) + .orElseThrow(() -> new RepostNotFoundException(postedImage.getPostId().getMessageId(), postedImage.getPostId().getPosition(), poster.getUserInServerId())); + } + + @Override + public Optional findRepostOptional(PostedImage postedImage, AUserInAServer poster) { + return repostRepository.findById(buildRepostIdentifier(postedImage, poster)); + } + + @Override + public List findTopRepostingUsersOfServer(AServer server, Integer page, Integer pageSize) { + return findTopRepostingUsersOfServer(server.getId(), page, pageSize); + } + + @Override + public List findTopRepostingUsersOfServer(Long serverId, Integer page, Integer pageSize) { + return repostRepository.findTopRepostingUsers(serverId, PageRequest.of(page - 1, pageSize)); + } + + @Override + public RepostLeaderboardResult getRepostRankOfUser(AUserInAServer aUserInAServer) { + return repostRepository.getRepostRankOfUserInServer(aUserInAServer.getUserInServerId(), aUserInAServer.getServerReference().getId()); + } + + @Override + public void deleteRepostsFromUser(AUserInAServer aUserInAServer) { + repostRepository.deleteByRepostId_UserInServerIdAndServerId(aUserInAServer.getUserInServerId(), aUserInAServer.getServerReference().getId()); + } + + @Override + public void deleteRepostsFromServer(AServer server) { + repostRepository.deleteByServerId(server.getId()); + } + + private RepostIdentifier buildRepostIdentifier(PostedImage postedImage, AUserInAServer poster) { + return new RepostIdentifier(postedImage.getPostId().getMessageId(), postedImage.getPostId().getPosition(), poster.getUserInServerId()); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/channel_group_types.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/channel_group_types.xml new file mode 100644 index 000000000..2aeae2281 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/channel_group_types.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/command.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/command.xml index 1b13ad7a4..9dbfa6948 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/command.xml +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/command.xml @@ -7,10 +7,12 @@ http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" > + + @@ -87,6 +89,43 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/data.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/data.xml index 60cf47fa6..b2415df12 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/data.xml +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/data.xml @@ -13,4 +13,6 @@ + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/default_emote.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/default_emote.xml index f342c16df..31f37df0e 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/default_emote.xml +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/default_emote.xml @@ -63,5 +63,10 @@ + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/default_feature_flag.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/default_feature_flag.xml index 5ccc46649..c630ab1ba 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/default_feature_flag.xml +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/default_feature_flag.xml @@ -11,6 +11,7 @@ + @@ -38,5 +39,10 @@ + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/default_feature_mode.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/default_feature_mode.xml new file mode 100644 index 000000000..ee6f2a38c --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/default_feature_mode.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/feature.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/feature.xml index 55395780e..09ab43679 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/feature.xml +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/feature.xml @@ -28,5 +28,9 @@ + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/module.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/module.xml new file mode 100644 index 000000000..dfe9c04f9 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-seedData/module.xml @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/posted_image.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/posted_image.xml new file mode 100644 index 000000000..5d57727bd --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/posted_image.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/repost.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/repost.xml new file mode 100644 index 000000000..8dcd8685b --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/repost.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/repost_check_channel_group.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/repost_check_channel_group.xml new file mode 100644 index 000000000..e7192275b --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/repost_check_channel_group.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/starboard.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/starboard.xml deleted file mode 100644 index 84f261125..000000000 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/starboard.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/starboard_post.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/starboard_post.xml index 6cb2e6e47..84f261125 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/starboard_post.xml +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/starboard_post.xml @@ -6,23 +6,37 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" > - - + + - + - + + + + + + + + + + + + - - - + + - - + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/starboard_post_reaction.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/starboard_post_reaction.xml new file mode 100644 index 000000000..6cb2e6e47 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/starboard_post_reaction.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/tables.xml b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/tables.xml index ac88749b5..5dadc7e01 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/tables.xml +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/migrations/1.0-utility/utility-tables/tables.xml @@ -8,7 +8,10 @@ http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" > - + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/ShowAvatarTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/ShowAvatarTest.java index 5c28c4aac..2052373da 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/ShowAvatarTest.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/ShowAvatarTest.java @@ -1,6 +1,5 @@ package dev.sheldan.abstracto.utility.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.service.ChannelService; @@ -31,11 +30,6 @@ public class ShowAvatarTest { @Captor private ArgumentCaptor argumentCaptor; - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void executeWithoutParameter() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/ShowEmoteTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/ShowEmoteTest.java index fde8b6de2..7a9f4062b 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/ShowEmoteTest.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/ShowEmoteTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.utility.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.service.ChannelService; @@ -32,16 +30,6 @@ public class ShowEmoteTest { @Captor private ArgumentCaptor emoteLogArgumentCaptor; - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - @Test public void executeCommandWithOneEmote() { Emote emote = Mockito.mock(Emote.class); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/UserInfoTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/UserInfoTest.java index 53f98808e..0a55a0e83 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/UserInfoTest.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/UserInfoTest.java @@ -1,6 +1,5 @@ package dev.sheldan.abstracto.utility.commands; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.service.BotService; @@ -39,11 +38,6 @@ public class UserInfoTest { @Captor private ArgumentCaptor modelArgumentCaptor; - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void executeWithoutParameterAndLoadedMember() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/remind/RemindTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/remind/RemindTest.java index c32903c5a..2b59f8694 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/remind/RemindTest.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/remind/RemindTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.utility.commands.remind; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.service.ChannelService; @@ -39,22 +37,6 @@ public class RemindTest { @Captor private ArgumentCaptor captor; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - - @Test(expected = InsufficientParametersException.class) - public void testOnlyRemindDateParameter() { - CommandContext durationParameter = CommandTestUtilities.getWithParameters(Arrays.asList(Duration.ofDays(4))); - testUnit.executeAsync(durationParameter); - } - @Test public void executeCommand() { String reminderText = "text"; diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/remind/UnRemindTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/remind/UnRemindTest.java index 19bc5ff78..62ab0d2f3 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/remind/UnRemindTest.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/remind/UnRemindTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.utility.commands.remind; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; @@ -26,16 +24,6 @@ public class UnRemindTest { @Mock private ReminderService reminderService; - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTest(testUnit); - } - @Test public void testExecuteCommand() { Long reminderId = 6L; diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/DisableRepostCheckTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/DisableRepostCheckTest.java new file mode 100644 index 000000000..86ad90c47 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/DisableRepostCheckTest.java @@ -0,0 +1,61 @@ +package dev.sheldan.abstracto.utility.commands.repost; + +import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ChannelGroupManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; +import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; +import dev.sheldan.abstracto.utility.service.RepostCheckChannelService; +import dev.sheldan.abstracto.utility.service.RepostServiceBean; +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.Arrays; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class DisableRepostCheckTest { + + @InjectMocks + private DisableRepostCheck testUnit; + + @Mock + private ServerManagementService serverManagementService; + + @Mock + private ChannelGroupManagementService channelGroupManagementService; + + @Mock + private RepostCheckChannelService repostCheckChannelService; + + @Test + public void executeCommandWithChannelGroupParameter() { + AChannelGroup channelGroup = Mockito.mock(AChannelGroup.class); + AChannelGroup actualChannelGroup = Mockito.mock(AChannelGroup.class); + Long serverId = 2L; + AServer server = Mockito.mock(AServer.class); + String channelGroupName = "test"; + when(channelGroup.getGroupName()).thenReturn(channelGroupName); + when(serverManagementService.loadServer(serverId)).thenReturn(server); + when(channelGroupManagementService.findByNameAndServerAndType(channelGroupName, server, RepostServiceBean.REPOST_CHECK_CHANNEL_GROUP_TYPE)).thenReturn(actualChannelGroup); + CommandContext channelGroupParameters = CommandTestUtilities.getWithParameters(Arrays.asList(channelGroup)); + when(channelGroupParameters.getGuild().getIdLong()).thenReturn(serverId); + CommandResult result = testUnit.execute(channelGroupParameters); + CommandTestUtilities.checkSuccessfulCompletion(result); + verify(repostCheckChannelService, times(1)).setRepostCheckDisabledForChannelGroup(actualChannelGroup); + } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/EnableRepostCheckTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/EnableRepostCheckTest.java new file mode 100644 index 000000000..f189123a3 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/EnableRepostCheckTest.java @@ -0,0 +1,61 @@ +package dev.sheldan.abstracto.utility.commands.repost; + +import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ChannelGroupManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; +import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; +import dev.sheldan.abstracto.utility.service.RepostCheckChannelService; +import dev.sheldan.abstracto.utility.service.RepostServiceBean; +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.Arrays; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class EnableRepostCheckTest { + + @InjectMocks + private EnableRepostCheck testUnit; + + @Mock + private ServerManagementService serverManagementService; + + @Mock + private ChannelGroupManagementService channelGroupManagementService; + + @Mock + private RepostCheckChannelService repostCheckChannelService; + + @Test + public void executeCommandWithChannelGroupParameter() { + AChannelGroup channelGroup = Mockito.mock(AChannelGroup.class); + AChannelGroup actualChannelGroup = Mockito.mock(AChannelGroup.class); + Long serverId = 2L; + AServer server = Mockito.mock(AServer.class); + String channelGroupName = "test"; + when(channelGroup.getGroupName()).thenReturn(channelGroupName); + when(serverManagementService.loadServer(serverId)).thenReturn(server); + when(channelGroupManagementService.findByNameAndServerAndType(channelGroupName, server, RepostServiceBean.REPOST_CHECK_CHANNEL_GROUP_TYPE)).thenReturn(actualChannelGroup); + CommandContext channelGroupParameters = CommandTestUtilities.getWithParameters(Arrays.asList(channelGroup)); + when(channelGroupParameters.getGuild().getIdLong()).thenReturn(serverId); + CommandResult result = testUnit.execute(channelGroupParameters); + CommandTestUtilities.checkSuccessfulCompletion(result); + verify(repostCheckChannelService, times(1)).setRepostCheckEnabledForChannelGroup(actualChannelGroup); + } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/PurgeImagePostsTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/PurgeImagePostsTest.java new file mode 100644 index 000000000..1b4075b97 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/PurgeImagePostsTest.java @@ -0,0 +1,58 @@ +package dev.sheldan.abstracto.utility.commands.repost; + +import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; +import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; +import dev.sheldan.abstracto.utility.service.PostedImageService; +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.Arrays; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class PurgeImagePostsTest { + + @InjectMocks + private PurgeImagePosts testUnit; + + @Mock + private UserInServerManagementService userInServerManagementService; + + @Mock + private PostedImageService postedImageService; + + @Test + public void testPurgeImagePostsFromMember(){ + AUserInAServer fakeUser = Mockito.mock(AUserInAServer.class); + AUserInAServer actualUser = Mockito.mock(AUserInAServer.class); + Long userInServerId = 1L; + when(fakeUser.getUserInServerId()).thenReturn(userInServerId); + CommandContext purgeImagePostsParameters = CommandTestUtilities.getWithParameters(Arrays.asList(fakeUser)); + when(userInServerManagementService.loadUser(userInServerId)).thenReturn(actualUser); + CommandResult result = testUnit.execute(purgeImagePostsParameters); + CommandTestUtilities.checkSuccessfulCompletion(result); + verify(postedImageService, times(1)).purgePostedImages(actualUser); + } + + @Test + public void testPurgeImagePostsFromServer(){ + CommandContext noParameters = CommandTestUtilities.getNoParameters(); + CommandResult result = testUnit.execute(noParameters); + CommandTestUtilities.checkSuccessfulCompletion(result); + verify(postedImageService, times(1)).purgePostedImages(noParameters.getGuild()); + } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/PurgeRepostsTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/PurgeRepostsTest.java new file mode 100644 index 000000000..95b67828b --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/PurgeRepostsTest.java @@ -0,0 +1,58 @@ +package dev.sheldan.abstracto.utility.commands.repost; + +import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; +import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; +import dev.sheldan.abstracto.utility.service.RepostService; +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.Arrays; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class PurgeRepostsTest { + + @InjectMocks + private PurgeReposts testUnit; + + @Mock + private UserInServerManagementService userInServerManagementService; + + @Mock + private RepostService repostService; + + @Test + public void testPurgeImagePostsFromMember(){ + AUserInAServer fakeUser = Mockito.mock(AUserInAServer.class); + AUserInAServer actualUser = Mockito.mock(AUserInAServer.class); + Long userInServerId = 1L; + when(fakeUser.getUserInServerId()).thenReturn(userInServerId); + CommandContext purgeImagePostsParameters = CommandTestUtilities.getWithParameters(Arrays.asList(fakeUser)); + when(userInServerManagementService.loadUser(userInServerId)).thenReturn(actualUser); + CommandResult result = testUnit.execute(purgeImagePostsParameters); + CommandTestUtilities.checkSuccessfulCompletion(result); + verify(repostService, times(1)).purgeReposts(actualUser); + } + + @Test + public void testPurgeImagePostsFromServer(){ + CommandContext noParameters = CommandTestUtilities.getNoParameters(); + CommandResult result = testUnit.execute(noParameters); + CommandTestUtilities.checkSuccessfulCompletion(result); + verify(repostService, times(1)).purgeReposts(noParameters.getGuild()); + } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/RepostLeaderboardTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/RepostLeaderboardTest.java new file mode 100644 index 000000000..509c03265 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/RepostLeaderboardTest.java @@ -0,0 +1,109 @@ +package dev.sheldan.abstracto.utility.commands.repost; + +import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; +import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; +import dev.sheldan.abstracto.templating.service.TemplateService; +import dev.sheldan.abstracto.utility.converter.RepostLeaderBoardConverter; +import dev.sheldan.abstracto.utility.models.RepostLeaderboardEntryModel; +import dev.sheldan.abstracto.utility.models.RepostLeaderboardModel; +import dev.sheldan.abstracto.utility.models.database.result.RepostLeaderboardResult; +import dev.sheldan.abstracto.utility.service.management.RepostManagementService; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import static dev.sheldan.abstracto.utility.commands.repost.RepostLeaderboard.REPOST_LEADERBOARD_RESPONSE_TEMPLATE_KEY; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class RepostLeaderboardTest { + + @InjectMocks + private RepostLeaderboard testUnit; + + @Mock + private RepostManagementService repostManagementService; + + @Mock + private TemplateService templateService; + + @Mock + private ChannelService channelService; + + @Mock + private RepostLeaderBoardConverter converter; + + @Mock + private UserInServerManagementService userInServerManagementService; + + @Mock + private AUserInAServer aUserInAServer; + + @Mock + private RepostLeaderboardResult result; + + @Mock + private RepostLeaderboardResult userResult; + + @Mock + private RepostLeaderboardEntryModel convertedResult; + + @Mock + private RepostLeaderboardEntryModel convertedUserResult; + + private static final Long SERVER_ID = 1L; + + @Captor + private ArgumentCaptor modelCaptor; + + @Test + public void testExecuteWithoutParameter() { + executeRepostLeaderboardTest(1, CommandTestUtilities.getNoParameters()); + } + + @Test + public void testExecuteWithPageParameter() { + Integer page = 2; + CommandContext noParameters = CommandTestUtilities.getWithParameters(Arrays.asList(page)); + executeRepostLeaderboardTest(page, noParameters); + } + + public void executeRepostLeaderboardTest(Integer page, CommandContext noParameters) { + when(noParameters.getGuild().getIdLong()).thenReturn(SERVER_ID); + when(userInServerManagementService.loadUser(noParameters.getAuthor())).thenReturn(aUserInAServer); + when(repostManagementService.getRepostRankOfUser(aUserInAServer)).thenReturn(userResult); + List resultList = Arrays.asList(result); + when(repostManagementService.findTopRepostingUsersOfServer(SERVER_ID, page, 5)).thenReturn(resultList); + List convertedList = Arrays.asList(convertedResult); + when(converter.fromLeaderBoardResults(resultList)).thenReturn(CompletableFuture.completedFuture(convertedList)); + when(converter.convertSingleUser(userResult)).thenReturn(CompletableFuture.completedFuture(convertedUserResult)); + CompletableFuture resultFuture = testUnit.executeAsync(noParameters); + CommandTestUtilities.checkSuccessfulCompletionAsync(resultFuture); + verify(channelService, times(1)).sendEmbedTemplateInChannel(eq(REPOST_LEADERBOARD_RESPONSE_TEMPLATE_KEY), modelCaptor.capture(), eq(noParameters.getChannel())); + RepostLeaderboardModel model = modelCaptor.getValue(); + Assert.assertEquals(noParameters.getGuild(), model.getGuild()); + Assert.assertEquals(convertedList, model.getEntries()); + Assert.assertEquals(convertedUserResult, model.getUserExecuting()); + Assert.assertEquals(noParameters.getAuthor(), model.getMember()); + } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/ShowRepostCheckChannelsTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/ShowRepostCheckChannelsTest.java new file mode 100644 index 000000000..79ceb0502 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/repost/ShowRepostCheckChannelsTest.java @@ -0,0 +1,62 @@ +package dev.sheldan.abstracto.utility.commands.repost; + +import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; +import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; +import dev.sheldan.abstracto.utility.converter.RepostCheckChannelModelConverter; +import dev.sheldan.abstracto.utility.models.database.RepostCheckChannelGroup; +import dev.sheldan.abstracto.utility.models.template.commands.RepostCheckChannelsModel; +import dev.sheldan.abstracto.utility.service.RepostCheckChannelService; +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.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import static dev.sheldan.abstracto.utility.commands.repost.ShowRepostCheckChannels.SHOW_REPOST_CHECK_CHANNELS_RESPONSE_TEMPLATE_KEY; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class ShowRepostCheckChannelsTest { + + @InjectMocks + private ShowRepostCheckChannels testUnit; + + @Mock + private RepostCheckChannelModelConverter converter; + + @Mock + private RepostCheckChannelService checkChannelService; + + @Mock + private ChannelService channelService; + + @Test + public void testExecuteCommand() { + Long serverId = 1L; + CommandContext noParameters = CommandTestUtilities.getNoParameters(); + when(noParameters.getGuild().getIdLong()).thenReturn(serverId); + RepostCheckChannelGroup group = Mockito.mock(RepostCheckChannelGroup.class); + List groupList = Arrays.asList(group); + when(checkChannelService.getChannelGroupsWithEnabledCheck(serverId)).thenReturn(groupList); + RepostCheckChannelsModel model = Mockito.mock(RepostCheckChannelsModel.class); + when(converter.fromRepostCheckChannelGroups(groupList, noParameters.getGuild())).thenReturn(model); + CompletableFuture futureResult = testUnit.executeAsync(noParameters); + CommandTestUtilities.checkSuccessfulCompletionAsync(futureResult); + verify(channelService, times(1)).sendEmbedTemplateInChannel(SHOW_REPOST_CHECK_CHANNELS_RESPONSE_TEMPLATE_KEY, model, noParameters.getChannel()); + } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/suggest/AcceptTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/suggest/AcceptTest.java index 1684fc187..b10586b89 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/suggest/AcceptTest.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/suggest/AcceptTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.utility.commands.suggest; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; @@ -31,16 +29,6 @@ public class AcceptTest { @Mock private SuggestionService suggestionService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void testExecuteCommand() throws ExecutionException, InterruptedException { String text = "text"; diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/suggest/RejectTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/suggest/RejectTest.java index d6a67950e..7cbef6e9e 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/suggest/RejectTest.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/suggest/RejectTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.utility.commands.suggest; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; @@ -31,15 +29,6 @@ public class RejectTest { @Mock private SuggestionService suggestionService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } @Test public void testExecuteCommand() throws ExecutionException, InterruptedException { String text = "text"; diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/suggest/SuggestTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/suggest/SuggestTest.java index fc70350c0..b48447d19 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/suggest/SuggestTest.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/suggest/SuggestTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.utility.commands.suggest; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; @@ -29,16 +27,6 @@ public class SuggestTest { @Mock private SuggestionService suggestionService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTestAsync(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void testExecuteCommand() throws ExecutionException, InterruptedException { String text = "text"; diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/converter/RepostCheckChannelModelConverterTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/converter/RepostCheckChannelModelConverterTest.java new file mode 100644 index 000000000..941b4920f --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/converter/RepostCheckChannelModelConverterTest.java @@ -0,0 +1,83 @@ +package dev.sheldan.abstracto.utility.converter; + +import dev.sheldan.abstracto.core.models.FullChannel; +import dev.sheldan.abstracto.core.models.database.AChannel; +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.core.service.BotService; +import dev.sheldan.abstracto.utility.models.database.RepostCheckChannelGroup; +import dev.sheldan.abstracto.utility.models.template.commands.RepostCheckChannelGroupDisplayModel; +import dev.sheldan.abstracto.utility.models.template.commands.RepostCheckChannelsModel; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.TextChannel; +import org.junit.Assert; +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; +import java.util.Arrays; + +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class RepostCheckChannelModelConverterTest { + + @InjectMocks + private RepostCheckChannelModelConverter testUnit; + + @Mock + private BotService botService; + + @Mock + private Guild guild; + + @Test + public void testConvertEmptyList() { + RepostCheckChannelsModel model = testUnit.fromRepostCheckChannelGroups(new ArrayList<>(), guild); + Assert.assertEquals(0, model.getRepostCheckChannelGroups().size()); + } + + @Test + public void testConvertChannelGroupNoChannels() { + RepostCheckChannelGroup element = Mockito.mock(RepostCheckChannelGroup.class); + AChannelGroup group = Mockito.mock(AChannelGroup.class); + when(element.getChannelGroup()).thenReturn(group); + when(group.getChannels()).thenReturn(new ArrayList<>()); + RepostCheckChannelsModel model = testUnit.fromRepostCheckChannelGroups(Arrays.asList(element), guild); + Assert.assertEquals(1, model.getRepostCheckChannelGroups().size()); + RepostCheckChannelGroupDisplayModel displayModel = model.getRepostCheckChannelGroups().get(0); + Assert.assertEquals(element, displayModel.getChannelGroup()); + Assert.assertEquals(0, displayModel.getChannels().size()); + } + + @Test + public void testConvertChannelGroupWithChannelsOneDeleted() { + RepostCheckChannelGroup element = Mockito.mock(RepostCheckChannelGroup.class); + AChannelGroup group = Mockito.mock(AChannelGroup.class); + when(element.getChannelGroup()).thenReturn(group); + Long channelId1 = 1L; + AChannel channel1 = Mockito.mock(AChannel.class); + when(channel1.getId()).thenReturn(channelId1); + TextChannel textChannel = Mockito.mock(TextChannel.class); + when(botService.getTextChannelFromServerNullable(guild, channelId1)).thenReturn(textChannel); + Long channelId2 = 2L; + AChannel channel2 = Mockito.mock(AChannel.class); + when(channel2.getId()).thenReturn(channelId2); + when(botService.getTextChannelFromServerNullable(guild, channelId2)).thenReturn(null); + when(group.getChannels()).thenReturn(Arrays.asList(channel1, channel2)); + RepostCheckChannelsModel model = testUnit.fromRepostCheckChannelGroups(Arrays.asList(element), guild); + Assert.assertEquals(1, model.getRepostCheckChannelGroups().size()); + RepostCheckChannelGroupDisplayModel displayModel = model.getRepostCheckChannelGroups().get(0); + Assert.assertEquals(element, displayModel.getChannelGroup()); + Assert.assertEquals(2, displayModel.getChannels().size()); + FullChannel firstFullChannel = displayModel.getChannels().get(0); + Assert.assertEquals(channel1, firstFullChannel.getChannel()); + Assert.assertEquals(textChannel, firstFullChannel.getServerChannel()); + FullChannel secondFullChannel = displayModel.getChannels().get(1); + Assert.assertEquals(channel2, secondFullChannel.getChannel()); + Assert.assertNull(secondFullChannel.getServerChannel()); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/converter/RepostLeaderBoardConverterTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/converter/RepostLeaderBoardConverterTest.java new file mode 100644 index 000000000..be7f21d27 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/converter/RepostLeaderBoardConverterTest.java @@ -0,0 +1,110 @@ +package dev.sheldan.abstracto.utility.converter; + +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.BotService; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.utility.models.RepostLeaderboardEntryModel; +import dev.sheldan.abstracto.utility.models.database.result.RepostLeaderboardResult; +import net.dv8tion.jda.api.entities.Member; +import org.junit.Assert; +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; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class RepostLeaderBoardConverterTest { + + @InjectMocks + private RepostLeaderBoardConverter testUnit; + + @Mock + private UserInServerManagementService userInServerManagementService; + + @Mock + private BotService botService; + + @Mock + private RepostLeaderBoardConverter self; + + @Mock + private AUserInAServer aUserInAServer; + + @Mock + private Member member; + + private static final Long USER_IN_SERVER_ID = 1L; + private static final Integer REPOST_COUNT = 1; + private static final Integer RANK = 2; + + @Test + public void testConvertEmptyList() { + CompletableFuture> future = testUnit.fromLeaderBoardResults(new ArrayList<>()); + Assert.assertTrue(future.isDone()); + Assert.assertEquals(0, future.join().size()); + } + + @Test + public void testConvertOneResult() { + RepostLeaderboardResult result = setupFirstResult(); + CompletableFuture> future = testUnit.fromLeaderBoardResults(Arrays.asList(result)); + Assert.assertTrue(future.isDone()); + Assert.assertEquals(1, future.join().size()); + verifyFirstResultConversion(); + } + + @Test + public void testConvertTwoResults() { + RepostLeaderboardResult result = setupFirstResult(); + RepostLeaderboardResult result2 = Mockito.mock(RepostLeaderboardResult.class); + Long secondUserInServerId = USER_IN_SERVER_ID + 1; + when(result2.getUserInServerId()).thenReturn(secondUserInServerId); + Integer secondRepostCount = REPOST_COUNT + 1; + when(result2.getRepostCount()).thenReturn(secondRepostCount); + Integer secondRank = RANK + 1; + when(result2.getRank()).thenReturn(secondRank); + AUserInAServer secondAUserInAServer = Mockito.mock(AUserInAServer.class); + when(userInServerManagementService.loadUser(secondUserInServerId)).thenReturn(secondAUserInAServer); + Member secondMember = Mockito.mock(Member.class); + when(botService.getMemberInServerAsync(secondAUserInAServer)).thenReturn(CompletableFuture.completedFuture(secondMember)); + CompletableFuture> future = testUnit.fromLeaderBoardResults(Arrays.asList(result, result2)); + Assert.assertTrue(future.isDone()); + Assert.assertEquals(2, future.join().size()); + verifyFirstResultConversion(); + verify(self, times(1)).loadUserFromDatabase(secondMember, secondRepostCount, secondUserInServerId, secondRank); + } + + private void verifyFirstResultConversion() { + verify(self, times(1)).loadUserFromDatabase(member, REPOST_COUNT, USER_IN_SERVER_ID, RANK); + } + + private RepostLeaderboardResult setupFirstResult() { + RepostLeaderboardResult result = Mockito.mock(RepostLeaderboardResult.class); + when(result.getUserInServerId()).thenReturn(USER_IN_SERVER_ID); + when(result.getRepostCount()).thenReturn(REPOST_COUNT); + when(result.getRank()).thenReturn(RANK); + when(userInServerManagementService.loadUser(USER_IN_SERVER_ID)).thenReturn(aUserInAServer); + when(botService.getMemberInServerAsync(aUserInAServer)).thenReturn(CompletableFuture.completedFuture(member)); + return result; + } + + @Test + public void testLoadUserFromDatabase() { + when(userInServerManagementService.loadUser(USER_IN_SERVER_ID)).thenReturn(aUserInAServer); + RepostLeaderboardEntryModel loadedModel = testUnit.loadUserFromDatabase(member, REPOST_COUNT, USER_IN_SERVER_ID, RANK); + Assert.assertEquals(REPOST_COUNT, loadedModel.getCount()); + Assert.assertEquals(RANK, loadedModel.getRank()); + Assert.assertEquals(member, loadedModel.getMember()); + Assert.assertEquals(aUserInAServer, loadedModel.getUser()); + } + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/listener/repost/RepostCheckChannelGroupCreatedListenerTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/listener/repost/RepostCheckChannelGroupCreatedListenerTest.java new file mode 100644 index 000000000..fb1568a72 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/listener/repost/RepostCheckChannelGroupCreatedListenerTest.java @@ -0,0 +1,47 @@ +package dev.sheldan.abstracto.utility.listener.repost; + +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.core.models.database.ChannelGroupType; +import dev.sheldan.abstracto.utility.service.management.RepostCheckChannelGroupManagement; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import static dev.sheldan.abstracto.utility.service.RepostServiceBean.REPOST_CHECK_CHANNEL_GROUP_TYPE; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class RepostCheckChannelGroupCreatedListenerTest { + + @InjectMocks + private RepostCheckChannelGroupCreatedListener testUnit; + + @Mock + private RepostCheckChannelGroupManagement checkChannelGroupManagement; + + @Mock + private AChannelGroup channelGroup; + + @Mock + private ChannelGroupType channelGroupType; + + private static final String INCORRECT_TYPE = "incorrectType"; + + @Test + public void testChannelGroupCreated() { + when(channelGroup.getChannelGroupType()).thenReturn(channelGroupType); + when(channelGroupType.getGroupTypeKey()).thenReturn(REPOST_CHECK_CHANNEL_GROUP_TYPE); + testUnit.channelGroupCreated(channelGroup); + verify(checkChannelGroupManagement, times(1)).createRepostCheckChannelGroup(channelGroup); + } + + @Test + public void testChannelGroupCreatedIncorrectType() { + when(channelGroup.getChannelGroupType()).thenReturn(channelGroupType); + when(channelGroupType.getGroupTypeKey()).thenReturn(INCORRECT_TYPE); + testUnit.channelGroupCreated(channelGroup); + verify(checkChannelGroupManagement, times(0)).createRepostCheckChannelGroup(channelGroup); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/listener/repost/RepostCheckChannelGroupDeletedListenerTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/listener/repost/RepostCheckChannelGroupDeletedListenerTest.java new file mode 100644 index 000000000..a96d27ccb --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/listener/repost/RepostCheckChannelGroupDeletedListenerTest.java @@ -0,0 +1,47 @@ +package dev.sheldan.abstracto.utility.listener.repost; + +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.core.models.database.ChannelGroupType; +import dev.sheldan.abstracto.utility.service.management.RepostCheckChannelGroupManagement; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import static dev.sheldan.abstracto.utility.service.RepostServiceBean.REPOST_CHECK_CHANNEL_GROUP_TYPE; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class RepostCheckChannelGroupDeletedListenerTest { + + @InjectMocks + private RepostCheckChannelGroupDeletedListener testUnit; + + @Mock + private RepostCheckChannelGroupManagement checkChannelGroupManagement; + + @Mock + private AChannelGroup channelGroup; + + @Mock + private ChannelGroupType channelGroupType; + + private static final String INCORRECT_TYPE = "incorrectType"; + + @Test + public void testChannelGroupDeleted() { + when(channelGroup.getChannelGroupType()).thenReturn(channelGroupType); + when(channelGroupType.getGroupTypeKey()).thenReturn(REPOST_CHECK_CHANNEL_GROUP_TYPE); + testUnit.channelGroupDeleted(channelGroup); + verify(checkChannelGroupManagement, times(1)).deleteRepostCheckChannelGroup(channelGroup); + } + + @Test + public void testChannelGroupDeletedIncorrectType() { + when(channelGroup.getChannelGroupType()).thenReturn(channelGroupType); + when(channelGroupType.getGroupTypeKey()).thenReturn(INCORRECT_TYPE); + testUnit.channelGroupDeleted(channelGroup); + verify(checkChannelGroupManagement, times(0)).deleteRepostCheckChannelGroup(channelGroup); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/listener/repost/RepostEmbedListenerTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/listener/repost/RepostEmbedListenerTest.java new file mode 100644 index 000000000..529c2e330 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/listener/repost/RepostEmbedListenerTest.java @@ -0,0 +1,141 @@ +package dev.sheldan.abstracto.utility.listener.repost; + +import dev.sheldan.abstracto.core.models.listener.GuildMessageEmbedEventModel; +import dev.sheldan.abstracto.utility.service.RepostCheckChannelService; +import dev.sheldan.abstracto.utility.service.RepostService; +import dev.sheldan.abstracto.utility.service.management.PostedImageManagement; +import net.dv8tion.jda.api.entities.*; +import net.dv8tion.jda.api.requests.RestAction; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.*; +import org.mockito.junit.MockitoJUnitRunner; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class RepostEmbedListenerTest { + + @InjectMocks + private RepostEmbedListener testUnit; + + @Mock + private RepostCheckChannelService repostCheckChannelService; + + @Mock + private RepostService repostService; + + @Mock + private PostedImageManagement repostManagement; + + @Mock + private GuildMessageEmbedEventModel model; + + @Mock + private TextChannel textChannel; + + @Mock + private Message message; + + @Captor + private ArgumentCaptor> embedListsParameterCaptor; + + private static final Long MESSAGE_ID = 1L; + private static final Long CHANNEL_ID = 2L; + private static final Long SERVER_ID = 3L; + + @Test + public void testExecuteCheckDisabled() { + when(model.getChannel()).thenReturn(textChannel); + when(repostCheckChannelService.duplicateCheckEnabledForChannel(textChannel)).thenReturn(false); + testUnit.execute(model); + verify(repostManagement, times(0)).messageEmbedsHaveBeenCovered(anyLong()); + } + + @Test + 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()); + } + + @Test + public void testExecuteNoEmbeds() { + channelSetup(); + setupMessageHasBeenCovered(false); + RestAction messageRestAction = Mockito.mock(RestAction.class); + when(textChannel.retrieveMessageById(MESSAGE_ID)).thenReturn(messageRestAction); + testUnit.execute(model); + verify(repostService, times(0)).processMessageEmbedsRepostCheck(any(), any()); + } + + @Test + public void testExecuteOneImageEmbed() { + channelSetup(); + setupMessageHasBeenCovered(false); + RestAction messageRestAction = Mockito.mock(RestAction.class); + MessageEmbed imageEmbed = Mockito.mock(MessageEmbed.class); + when(imageEmbed.getType()).thenReturn(EmbedType.IMAGE); + when(model.getEmbeds()).thenReturn(Arrays.asList(imageEmbed)); + mockMessageConsumer(messageRestAction, message); + when(textChannel.retrieveMessageById(MESSAGE_ID)).thenReturn(messageRestAction); + testUnit.execute(model); + verifySingleEmbedProcessed(imageEmbed); + } + + @Test + public void testExecuteMultipleEmbedsOneImage() { + channelSetup(); + setupMessageHasBeenCovered(false); + RestAction messageRestAction = Mockito.mock(RestAction.class); + MessageEmbed imageEmbed = Mockito.mock(MessageEmbed.class); + MessageEmbed nonImageEmbed = Mockito.mock(MessageEmbed.class); + when(imageEmbed.getType()).thenReturn(EmbedType.IMAGE); + when(nonImageEmbed.getType()).thenReturn(EmbedType.LINK); + when(model.getEmbeds()).thenReturn(Arrays.asList(imageEmbed, nonImageEmbed)); + mockMessageConsumer(messageRestAction, message); + when(textChannel.retrieveMessageById(MESSAGE_ID)).thenReturn(messageRestAction); + testUnit.execute(model); + verifySingleEmbedProcessed(imageEmbed); + } + + private void setupMessageHasBeenCovered(boolean covered) { + when(model.getMessageId()).thenReturn(MESSAGE_ID); + when(repostManagement.messageEmbedsHaveBeenCovered(MESSAGE_ID)).thenReturn(covered); + } + + private void verifySingleEmbedProcessed(MessageEmbed imageEmbed) { + verify(repostService, times(1)).processMessageEmbedsRepostCheck(embedListsParameterCaptor.capture(), eq(message)); + List embeds = embedListsParameterCaptor.getValue(); + Assert.assertEquals(1, embeds.size()); + Assert.assertEquals(imageEmbed, embeds.get(0)); + } + + private void mockMessageConsumer(RestAction action, Message message) { + doAnswer(invocationOnMock -> { + Object consumerObj = invocationOnMock.getArguments()[0]; + if(consumerObj instanceof Consumer) { + Consumer consumer = (Consumer) consumerObj; + consumer.accept(message); + } + return null; + }).when(action).queue(any(Consumer.class)); + } + + private void channelSetup() { + when(model.getChannel()).thenReturn(textChannel); + when(textChannel.getIdLong()).thenReturn(CHANNEL_ID); + when(repostCheckChannelService.duplicateCheckEnabledForChannel(textChannel)).thenReturn(true); + } + + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/listener/repost/RepostMessageReceivedListenerTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/listener/repost/RepostMessageReceivedListenerTest.java new file mode 100644 index 000000000..f939631c4 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/listener/repost/RepostMessageReceivedListenerTest.java @@ -0,0 +1,92 @@ +package dev.sheldan.abstracto.utility.listener.repost; + +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; +import org.mockito.*; +import org.mockito.junit.MockitoJUnitRunner; + +import java.util.Arrays; +import java.util.List; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class RepostMessageReceivedListenerTest { + + @InjectMocks + private RepostMessageReceivedListener testUnit; + + @Mock + private RepostCheckChannelService repostCheckChannelService; + + @Mock + private RepostService repostService; + + @Mock + private Message message; + + @Mock + private TextChannel textChannel; + + @Captor + private ArgumentCaptor> embedListCaptor; + + @Test + public void testExecuteCheckDisabled() { + setupRepostCheckEnabled(false); + testUnit.execute(message); + verify(repostService, times(0)).processMessageAttachmentRepostCheck(message); + } + + @Test + public void testExecuteOnlyMessage() { + setupRepostCheckEnabled(true); + testUnit.execute(message); + verify(repostService, times(1)).processMessageAttachmentRepostCheck(message); + verify(repostService, times(1)).processMessageEmbedsRepostCheck(embedListCaptor.capture(), eq(message)); + Assert.assertEquals(0, embedListCaptor.getValue().size()); + } + + @Test + public void testExecuteOnlyMessageOneImageAttachment() { + setupRepostCheckEnabled(true); + MessageEmbed imageEmbed = Mockito.mock(MessageEmbed.class); + when(imageEmbed.getType()).thenReturn(EmbedType.IMAGE); + when(message.getEmbeds()).thenReturn(Arrays.asList(imageEmbed)); + testUnit.execute(message); + verifySingleEmbed(imageEmbed); + } + + @Test + public void testExecuteOnlyMessageTwoEmbedsOneImageAttachment() { + setupRepostCheckEnabled(true); + MessageEmbed imageEmbed = Mockito.mock(MessageEmbed.class); + when(imageEmbed.getType()).thenReturn(EmbedType.IMAGE); + MessageEmbed nonImageEmbed = Mockito.mock(MessageEmbed.class); + when(nonImageEmbed.getType()).thenReturn(EmbedType.LINK); + when(message.getEmbeds()).thenReturn(Arrays.asList(imageEmbed, nonImageEmbed)); + testUnit.execute(message); + verifySingleEmbed(imageEmbed); + } + + private void setupRepostCheckEnabled(boolean b) { + when(message.getTextChannel()).thenReturn(textChannel); + when(repostCheckChannelService.duplicateCheckEnabledForChannel(textChannel)).thenReturn(b); + } + + private void verifySingleEmbed(MessageEmbed imageEmbed) { + verify(repostService, times(1)).processMessageAttachmentRepostCheck(message); + verify(repostService, times(1)).processMessageEmbedsRepostCheck(embedListCaptor.capture(), eq(message)); + List processedEmbeds = embedListCaptor.getValue(); + Assert.assertEquals(1, processedEmbeds.size()); + Assert.assertEquals(imageEmbed, processedEmbeds.get(0)); + } + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/PostedImageServiceBeanTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/PostedImageServiceBeanTest.java new file mode 100644 index 000000000..3a16f5bd1 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/PostedImageServiceBeanTest.java @@ -0,0 +1,57 @@ +package dev.sheldan.abstracto.utility.service; + +import dev.sheldan.abstracto.core.exception.GuildNotFoundException; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.utility.service.management.PostedImageManagement; +import net.dv8tion.jda.api.entities.Guild; +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 static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class PostedImageServiceBeanTest { + + @InjectMocks + private PostedImageServiceBean testUnit; + + @Mock + private PostedImageManagement postedImageManagement; + + @Mock + private ServerManagementService serverManagementService; + + @Test + public void testPurgePostedImagesOfAUserInAServer() { + AUserInAServer aUserInAServer = Mockito.mock(AUserInAServer.class); + testUnit.purgePostedImages(aUserInAServer); + verify(postedImageManagement, times(1)).removePostedImagesOf(aUserInAServer); + } + + @Test + public void testPurgePostedImagesInGuild() { + Guild guild = Mockito.mock(Guild.class); + Long serverId = 5L; + when(guild.getIdLong()).thenReturn(serverId); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(serverId)).thenReturn(server); + testUnit.purgePostedImages(guild); + verify(postedImageManagement, times(1)).removedPostedImagesIn(server); + } + + @Test(expected = GuildNotFoundException.class) + public void testPurgePostedImagesNotExistingServer() { + Guild guild = Mockito.mock(Guild.class); + Long serverId = 5L; + when(guild.getIdLong()).thenReturn(serverId); + when(serverManagementService.loadServer(serverId)).thenThrow(new GuildNotFoundException(serverId)); + testUnit.purgePostedImages(guild); + } + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/RepostCheckChannelServiceBeanTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/RepostCheckChannelServiceBeanTest.java new file mode 100644 index 000000000..23411d984 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/RepostCheckChannelServiceBeanTest.java @@ -0,0 +1,257 @@ +package dev.sheldan.abstracto.utility.service; + +import dev.sheldan.abstracto.core.models.database.AChannel; +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.ChannelGroupService; +import dev.sheldan.abstracto.core.service.management.ChannelGroupManagementService; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; +import dev.sheldan.abstracto.utility.exception.RepostCheckChannelGroupNotFoundException; +import dev.sheldan.abstracto.utility.models.database.RepostCheckChannelGroup; +import dev.sheldan.abstracto.utility.service.management.RepostCheckChannelGroupManagement; +import net.dv8tion.jda.api.entities.TextChannel; +import org.junit.Assert; +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; +import java.util.Arrays; +import java.util.List; + +import static dev.sheldan.abstracto.utility.service.RepostServiceBean.REPOST_CHECK_CHANNEL_GROUP_TYPE; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class RepostCheckChannelServiceBeanTest { + + public static final long SERVER_ID = 1L; + @InjectMocks + private RepostCheckChannelServiceBean testUnit; + + @Mock + private RepostCheckChannelGroupManagement repostCheckChannelManagement; + + @Mock + private ChannelManagementService channelManagementService; + + @Mock + private ChannelGroupService channelGroupService; + + @Mock + private ChannelGroupManagementService channelGroupManagementService; + + @Test + public void testSetCheckEnabledForCheckGroup() { + RepostCheckChannelGroup group = Mockito.mock(RepostCheckChannelGroup.class); + testUnit.setRepostCheckEnabledForChannelGroup(group); + verify(group, times(1)).setCheckEnabled(true); + } + + @Test + public void testSetCheckEnabledForChannelGroup() { + AChannelGroup channelGroup = Mockito.mock(AChannelGroup.class); + RepostCheckChannelGroup group = Mockito.mock(RepostCheckChannelGroup.class); + when(repostCheckChannelManagement.loadRepostChannelGroupByChannelGroup(channelGroup)).thenReturn(group); + testUnit.setRepostCheckEnabledForChannelGroup(channelGroup); + verify(group, times(1)).setCheckEnabled(true); + } + + @Test + public void testSetCheckDisabledForCheckGroup() { + RepostCheckChannelGroup group = Mockito.mock(RepostCheckChannelGroup.class); + testUnit.setRepostCheckDisabledForChannelGroup(group); + verify(group, times(1)).setCheckEnabled(false); + } + + @Test + public void testSetCheckDisabledForChannelGroup() { + AChannelGroup channelGroup = Mockito.mock(AChannelGroup.class); + RepostCheckChannelGroup group = Mockito.mock(RepostCheckChannelGroup.class); + when(repostCheckChannelManagement.loadRepostChannelGroupByChannelGroup(channelGroup)).thenReturn(group); + testUnit.setRepostCheckDisabledForChannelGroup(channelGroup); + verify(group, times(1)).setCheckEnabled(false); + } + + @Test + public void testCheckDuplicateCheckEnabledAChannel() { + AChannel channel = mock(AChannel.class); + setupEnabledCheck(channel); + boolean enabled = testUnit.duplicateCheckEnabledForChannel(channel); + Assert.assertTrue(enabled); + } + + @Test + public void testCheckDuplicateCheckDisabledAChannel() { + AChannel channel = mock(AChannel.class); + setupDisabledCheck(channel); + boolean enabled = testUnit.duplicateCheckEnabledForChannel(channel); + Assert.assertFalse(enabled); + } + + @Test + public void testCheckDuplicateCheckEnabledTextChannel() { + TextChannel textChannel = Mockito.mock(TextChannel.class); + AChannel channel = Mockito.mock(AChannel.class); + Long channelID = 3L; + when(textChannel.getIdLong()).thenReturn(channelID); + when(channelManagementService.loadChannel(channelID)).thenReturn(channel); + setupEnabledCheck(channel); + boolean enabled = testUnit.duplicateCheckEnabledForChannel(textChannel); + Assert.assertTrue(enabled); + } + + @Test + public void testCheckDuplicateCheckDisabledTextChannel() { + TextChannel textChannel = Mockito.mock(TextChannel.class); + AChannel channel = Mockito.mock(AChannel.class); + Long channelID = 3L; + when(textChannel.getIdLong()).thenReturn(channelID); + when(channelManagementService.loadChannel(channelID)).thenReturn(channel); + setupDisabledCheck(channel); + boolean enabled = testUnit.duplicateCheckEnabledForChannel(textChannel); + Assert.assertFalse(enabled); + } + + @Test + public void testCheckDuplicateCheckNoChannelGroupsChannel() { + AChannel channel = Mockito.mock(AChannel.class); + when(channelGroupService.getChannelGroupsOfChannelWithType(channel, REPOST_CHECK_CHANNEL_GROUP_TYPE)).thenReturn(new ArrayList<>()); + boolean enabled = testUnit.duplicateCheckEnabledForChannel(channel); + Assert.assertFalse(enabled); + } + + @Test + public void testCheckDuplicateCheckNoChannelGroupsTextChannel() { + TextChannel textChannel = Mockito.mock(TextChannel.class); + AChannel channel = Mockito.mock(AChannel.class); + Long channelID = 3L; + when(textChannel.getIdLong()).thenReturn(channelID); + when(channelManagementService.loadChannel(channelID)).thenReturn(channel); + when(channelGroupService.getChannelGroupsOfChannelWithType(channel, REPOST_CHECK_CHANNEL_GROUP_TYPE)).thenReturn(new ArrayList<>()); + boolean enabled = testUnit.duplicateCheckEnabledForChannel(textChannel); + Assert.assertFalse(enabled); + } + + public void setupEnabledCheck(AChannel channel) { + setupRepostEnabledTest(channel, true, false); + } + + public void setupDisabledCheck(AChannel channel) { + setupRepostEnabledTest(channel, false, false); + } + + public void setupRepostEnabledTest(AChannel channel, boolean firstGroupState, boolean secondGroupSate) { + AChannelGroup firstGroup = Mockito.mock(AChannelGroup.class); + Long firstChannelGroupId = 1L; + Long secondChannelGroupId = 2L; + when(firstGroup.getId()).thenReturn(firstChannelGroupId); + AChannelGroup secondGroup = Mockito.mock(AChannelGroup.class); + when(secondGroup.getId()).thenReturn(secondChannelGroupId); + RepostCheckChannelGroup firstRepostCheckChannelGroup = Mockito.mock(RepostCheckChannelGroup.class); + when(firstRepostCheckChannelGroup.getCheckEnabled()).thenReturn(secondGroupSate); + RepostCheckChannelGroup secondRepostCheckChannelGroup = Mockito.mock(RepostCheckChannelGroup.class); + when(secondRepostCheckChannelGroup.getCheckEnabled()).thenReturn(firstGroupState); + when(repostCheckChannelManagement.loadRepostChannelGroupById(firstChannelGroupId)).thenReturn(firstRepostCheckChannelGroup); + when(repostCheckChannelManagement.loadRepostChannelGroupById(secondChannelGroupId)).thenReturn(secondRepostCheckChannelGroup); + when(channelGroupService.getChannelGroupsOfChannelWithType(channel, REPOST_CHECK_CHANNEL_GROUP_TYPE)).thenReturn(Arrays.asList(firstGroup, secondGroup)); + } + + @Test + public void testGetRepostCheckChannelGroupsForServerNoChannelGroups() { + when(channelGroupManagementService.findAllInServerWithType(SERVER_ID, REPOST_CHECK_CHANNEL_GROUP_TYPE)).thenReturn(new ArrayList<>()); + List groups = testUnit.getRepostCheckChannelGroupsForServer(SERVER_ID); + Assert.assertEquals(0, groups.size()); + } + + @Test + public void testGetRepostCheckChannelGroupsForServerTwoChannelGroups() { + List mockedGroups = setupGetRepostCheckChannelGroupsTest(); + List groups = testUnit.getRepostCheckChannelGroupsForServer(SERVER_ID); + Assert.assertEquals(2, groups.size()); + Assert.assertEquals(mockedGroups.get(0), groups.get(0)); + Assert.assertEquals(mockedGroups.get(1), groups.get(1)); + } + + @Test + public void testGetRepostCheckChannelGroupsForServerTwoChannelGroupsAServer() { + AServer server = Mockito.mock(AServer.class); + when(server.getId()).thenReturn(SERVER_ID); + List mockedGroups = setupGetRepostCheckChannelGroupsTest(); + List groups = testUnit.getRepostCheckChannelGroupsForServer(server); + Assert.assertEquals(2, groups.size()); + Assert.assertEquals(mockedGroups.get(0), groups.get(0)); + Assert.assertEquals(mockedGroups.get(1), groups.get(1)); + } + + public List setupGetRepostCheckChannelGroupsTest() { + Long firstChannelGroupId = 1L; + Long secondChannelGroupId = 2L; + AChannelGroup firstGroup = Mockito.mock(AChannelGroup.class); + when(firstGroup.getId()).thenReturn(firstChannelGroupId); + AChannelGroup secondGroup = Mockito.mock(AChannelGroup.class); + when(secondGroup.getId()).thenReturn(secondChannelGroupId); + when(channelGroupManagementService.findAllInServerWithType(SERVER_ID, REPOST_CHECK_CHANNEL_GROUP_TYPE)).thenReturn(Arrays.asList(firstGroup, secondGroup)); + RepostCheckChannelGroup firstRepostCheckChannelGroup = Mockito.mock(RepostCheckChannelGroup.class); + RepostCheckChannelGroup secondRepostCheckChannelGroup = Mockito.mock(RepostCheckChannelGroup.class); + when(repostCheckChannelManagement.loadRepostChannelGroupById(firstChannelGroupId)).thenReturn(firstRepostCheckChannelGroup); + when(repostCheckChannelManagement.loadRepostChannelGroupById(secondChannelGroupId)).thenReturn(secondRepostCheckChannelGroup); + return Arrays.asList(firstRepostCheckChannelGroup, secondRepostCheckChannelGroup); + } + + @Test(expected = RepostCheckChannelGroupNotFoundException.class) + public void testGetRepostCheckChannelGroupsNotExisting() { + Long channelGroupId = 1L; + AChannelGroup firstGroup = Mockito.mock(AChannelGroup.class); + when(firstGroup.getId()).thenReturn(channelGroupId); + when(channelGroupManagementService.findAllInServerWithType(SERVER_ID, REPOST_CHECK_CHANNEL_GROUP_TYPE)).thenReturn(Arrays.asList(firstGroup)); + when(repostCheckChannelManagement.loadRepostChannelGroupById(channelGroupId)).thenThrow(new RepostCheckChannelGroupNotFoundException(channelGroupId)); + testUnit.getRepostCheckChannelGroupsForServer(SERVER_ID); + } + + @Test + public void testGetChannelGroupsWithEnabledCheckNoGroups() { + when(channelGroupManagementService.findAllInServerWithType(SERVER_ID, REPOST_CHECK_CHANNEL_GROUP_TYPE)).thenReturn(new ArrayList<>()); + List groups = testUnit.getChannelGroupsWithEnabledCheck(SERVER_ID); + Assert.assertEquals(0, groups.size()); + } + + @Test + public void testGetChannelGroupsWithEnabledCheckAServer() { + AServer server = Mockito.mock(AServer.class); + when(server.getId()).thenReturn(SERVER_ID); + List checkGroups = setupGetChannelGroupsTest(); + List groups = testUnit.getChannelGroupsWithEnabledCheck(server); + Assert.assertEquals(1, groups.size()); + Assert.assertEquals(checkGroups.get(0), groups.get(0)); + } + + @Test + public void testGetChannelGroupsWithEnabledCheck() { + List checkGroups = setupGetChannelGroupsTest(); + List groups = testUnit.getChannelGroupsWithEnabledCheck(SERVER_ID); + Assert.assertEquals(1, groups.size()); + Assert.assertEquals(checkGroups.get(0), groups.get(0)); + } + + public List setupGetChannelGroupsTest() { + Long firstChannelGroupId = 1L; + Long secondChannelGroupId = 2L; + AChannelGroup firstGroup = Mockito.mock(AChannelGroup.class); + when(firstGroup.getId()).thenReturn(firstChannelGroupId); + AChannelGroup secondGroup = Mockito.mock(AChannelGroup.class); + when(secondGroup.getId()).thenReturn(secondChannelGroupId); + when(channelGroupManagementService.findAllInServerWithType(SERVER_ID, REPOST_CHECK_CHANNEL_GROUP_TYPE)).thenReturn(Arrays.asList(firstGroup, secondGroup)); + RepostCheckChannelGroup firstRepostCheckChannelGroup = Mockito.mock(RepostCheckChannelGroup.class); + when(firstRepostCheckChannelGroup.getCheckEnabled()).thenReturn(true); + RepostCheckChannelGroup secondRepostCheckChannelGroup = Mockito.mock(RepostCheckChannelGroup.class); + when(secondRepostCheckChannelGroup.getCheckEnabled()).thenReturn(false); + when(repostCheckChannelManagement.loadRepostChannelGroupById(firstChannelGroupId)).thenReturn(firstRepostCheckChannelGroup); + when(repostCheckChannelManagement.loadRepostChannelGroupById(secondChannelGroupId)).thenReturn(secondRepostCheckChannelGroup); + return Arrays.asList(firstRepostCheckChannelGroup, secondRepostCheckChannelGroup); + } + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/RepostServiceBeanTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/RepostServiceBeanTest.java new file mode 100644 index 000000000..af3bc1bea --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/RepostServiceBeanTest.java @@ -0,0 +1,411 @@ +package dev.sheldan.abstracto.utility.service; + +import dev.sheldan.abstracto.core.models.AServerAChannelAUser; +import dev.sheldan.abstracto.core.models.database.AChannel; +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.FeatureModeService; +import dev.sheldan.abstracto.core.service.HashService; +import dev.sheldan.abstracto.core.service.HttpService; +import dev.sheldan.abstracto.core.service.MessageService; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.core.utils.FileUtils; +import dev.sheldan.abstracto.utility.config.features.RepostDetectionFeatureMode; +import dev.sheldan.abstracto.utility.config.features.UtilityFeature; +import dev.sheldan.abstracto.utility.converter.RepostLeaderBoardConverter; +import dev.sheldan.abstracto.utility.models.RepostLeaderboardEntryModel; +import dev.sheldan.abstracto.utility.models.database.PostedImage; +import dev.sheldan.abstracto.utility.models.database.Repost; +import dev.sheldan.abstracto.utility.models.database.embed.PostIdentifier; +import dev.sheldan.abstracto.utility.models.database.result.RepostLeaderboardResult; +import dev.sheldan.abstracto.utility.service.management.PostedImageManagement; +import dev.sheldan.abstracto.utility.service.management.RepostManagementService; +import net.dv8tion.jda.api.entities.*; +import org.junit.Assert; +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.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +import static dev.sheldan.abstracto.utility.service.RepostServiceBean.*; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class RepostServiceBeanTest { + + @InjectMocks + private RepostServiceBean testUnit; + + @Mock + private HttpService httpService; + + @Mock + private HashService hashService; + + @Mock + private FileUtils fileUtils; + + @Mock + private PostedImageManagement postedImageManagement; + + @Mock + private ServerManagementService serverManagementService; + + @Mock + private ChannelManagementService channelManagementService; + + @Mock + private UserInServerManagementService userInServerManagementService; + + @Mock + private MessageService messageService; + + @Mock + private FeatureModeService featureModeService; + + @Mock + private RepostManagementService repostManagementService; + + @Mock + private RepostLeaderBoardConverter leaderBoardConverter; + + @Mock + private RepostServiceBean self; + + @Mock + private AUserInAServer userInAServer; + + @Mock + private AUser user; + + @Mock + private Guild guild; + + @Mock + private AServer server; + + @Mock + private AChannel channel; + + @Mock + private PostedImage postedImage; + + @Mock + private Repost repost; + + @Mock + private Message message; + + @Mock + private TextChannel textChannel; + + @Mock + private Member member; + + @Mock + private User jdaUser; + + private static final Long SERVER_ID = 4L; + private static final Long CHANNEL_ID = 8L; + private static final Long MESSAGE_ID = 5L; + private static final Integer POSITION = 6; + private static final Long USER_ID = 7L; + private static final String URL = "url"; + private static final String HASH = "hash"; + + @Test + public void testPurgeRepostsForUser() { + testUnit.purgeReposts(userInAServer); + verify(repostManagementService, times(1)).deleteRepostsFromUser(userInAServer); + } + + @Test + public void testPurgeRepostsForServer() { + when(guild.getIdLong()).thenReturn(SERVER_ID); + when(serverManagementService.loadServer(SERVER_ID)).thenReturn(server); + testUnit.purgeReposts(guild); + verify(repostManagementService, times(1)).deleteRepostsFromServer(server); + } + + @Test + public void testRetrieveRepostLeaderboard() { + Integer page = 4; + when(guild.getIdLong()).thenReturn(SERVER_ID); + when(serverManagementService.loadServer(SERVER_ID)).thenReturn(server); + RepostLeaderboardResult result = Mockito.mock(RepostLeaderboardResult.class); + List resultList = Arrays.asList(result); + when(repostManagementService.findTopRepostingUsersOfServer(server, page, LEADER_BOARD_PAGE_SIZE)).thenReturn(resultList); + RepostLeaderboardEntryModel firstModel = Mockito.mock(RepostLeaderboardEntryModel.class); + RepostLeaderboardEntryModel secondModel = Mockito.mock(RepostLeaderboardEntryModel.class); + List entries = Arrays.asList(firstModel, secondModel); + when(leaderBoardConverter.fromLeaderBoardResults(resultList)).thenReturn(CompletableFuture.completedFuture(entries)); + CompletableFuture> future = testUnit.retrieveRepostLeaderboard(guild, page); + Assert.assertTrue(future.isDone()); + List futureList = future.join(); + Assert.assertEquals(2, futureList.size()); + Assert.assertEquals(firstModel, futureList.get(0)); + Assert.assertEquals(secondModel, futureList.get(1)); + } + + @Test + public void testPersistRepostWithExisting() { + Integer count = 4; + when(postedImageManagement.getPostFromMessageAndPosition(MESSAGE_ID, POSITION)).thenReturn(postedImage); + when(userInServerManagementService.loadUser(SERVER_ID, USER_ID)).thenReturn(userInAServer); + when(repost.getCount()).thenReturn(count); + when(repostManagementService.findRepostOptional(postedImage, userInAServer)).thenReturn(Optional.of(repost)); + testUnit.persistRepost(MESSAGE_ID, POSITION, SERVER_ID, USER_ID); + verify(repost, times(1)).setCount(count + 1); + } + + @Test + public void testPersistRepostWithoutExisting() { + when(postedImageManagement.getPostFromMessageAndPosition(MESSAGE_ID, POSITION)).thenReturn(postedImage); + when(userInServerManagementService.loadUser(SERVER_ID, USER_ID)).thenReturn(userInAServer); + when(repostManagementService.findRepostOptional(postedImage, userInAServer)).thenReturn(Optional.empty()); + testUnit.persistRepost(MESSAGE_ID, POSITION, SERVER_ID, USER_ID); + verify(repostManagementService, times(1)).createRepost(postedImage, userInAServer); + } + + @Test + public void testCalculateHashForPostWithImage() throws IOException { + File file = Mockito.mock(File.class); + when(featureModeService.featureModeActive(UtilityFeature.REPOST_DETECTION, SERVER_ID, RepostDetectionFeatureMode.DOWNLOAD)).thenReturn(true); + when(httpService.downloadFileToTempFile(URL)).thenReturn(file); + when(hashService.sha256HashFileContent(file)).thenReturn(HASH); + String calculatedHash = testUnit.calculateHashForPost(URL, SERVER_ID); + Assert.assertEquals(HASH, calculatedHash); + verify(fileUtils, times(1)).safeDelete(file); + } + + @Test + public void testCalculateHashForPostWithImageException() throws IOException { + File file = Mockito.mock(File.class); + when(featureModeService.featureModeActive(UtilityFeature.REPOST_DETECTION, SERVER_ID, RepostDetectionFeatureMode.DOWNLOAD)).thenReturn(true); + when(httpService.downloadFileToTempFile(URL)).thenReturn(file); + when(hashService.sha256HashFileContent(file)).thenThrow(new IOException()); + testUnit.calculateHashForPost(URL, SERVER_ID); + verify(fileUtils, times(1)).safeDelete(file); + } + + @Test + public void testCalculateHashForPostWithUrl() { + when(featureModeService.featureModeActive(UtilityFeature.REPOST_DETECTION, SERVER_ID, RepostDetectionFeatureMode.DOWNLOAD)).thenReturn(false); + when(hashService.sha256HashString(URL)).thenReturn(HASH); + String calculatedHash = testUnit.calculateHashForPost(URL, SERVER_ID); + Assert.assertEquals(HASH, calculatedHash); + } + + @Test + public void testProcessMessageAttachmentRepostCheckNoAttachment() { + when(message.getAttachments()).thenReturn(new ArrayList<>()); + testUnit.processMessageAttachmentRepostCheck(message); + verify(message, times(0)).getTextChannel(); + } + + @Test + public void testProcessMessageAttachmentRepostCheckOneAttachmentNotExistingPost() { + generalSetupForRepostTest(); + when(message.getMember()).thenReturn(member); + Message.Attachment attachment = Mockito.mock(Message.Attachment.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); + } + + @Test + public void testProcessMessageAttachmentRepostCheckOneAttachmentIsRepost() { + generalSetupForRepostTest(); + setupForRepostCreation(); + Message.Attachment attachment = Mockito.mock(Message.Attachment.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)); + testUnit.processMessageAttachmentRepostCheck(message); + verify(messageService, times(0)).addDefaultReactionToMessageAsync(anyString(), eq(message)); + verify(self, times(1)).persistRepost(originalPostMessageId, POSITION, SERVER_ID, USER_ID); + } + + @Test + 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.getAttachments()).thenReturn(Arrays.asList(attachment, attachment2)); + when(attachment.getProxyUrl()).thenReturn(URL); + setupSingleRepost(); + String secondAttachmentUrl = URL + "2"; + when(attachment2.getProxyUrl()).thenReturn(secondAttachmentUrl); + String secondAttachmentHash = HASH + "2"; + when(hashService.sha256HashString(secondAttachmentUrl)).thenReturn(secondAttachmentHash); + 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)); + testUnit.processMessageAttachmentRepostCheck(message); + verify(postedImageManagement, times(1)).createPost(any(AServerAChannelAUser.class), eq(message), 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); + } + + 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(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); + } + + private void setupSingleHash(PostedImage postedImage) { + when(featureModeService.featureModeActive(UtilityFeature.REPOST_DETECTION, SERVER_ID, RepostDetectionFeatureMode.DOWNLOAD)).thenReturn(false); + when(hashService.sha256HashString(URL)).thenReturn(HASH); + when(postedImageManagement.getPostWithHash(HASH, server)).thenReturn(Optional.ofNullable(postedImage)); + } + + @Test + public void testProcessMessageEmbedsRepostCheckWithNotRepostedThumbnailNoAttachments() { + generalSetupForRepostTest(); + MessageEmbed firstEmbed = Mockito.mock(MessageEmbed.class); + MessageEmbed.Thumbnail thumbnail = Mockito.mock(MessageEmbed.Thumbnail.class); + when(thumbnail.getProxyUrl()).thenReturn(URL); + when(firstEmbed.getThumbnail()).thenReturn(thumbnail); + List messageEmbeds = Arrays.asList(firstEmbed); + when(message.getMember()).thenReturn(member); + 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); + } + + @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 messageEmbeds = Arrays.asList(firstEmbed); + when(message.getMember()).thenReturn(member); + 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); + } + + @Test + public void testProcessMessageEmbedsRepostCheckWithRepostedThumbnailNoAttachments() { + generalSetupForRepostTest(); + setupForRepostCreation(); + MessageEmbed firstEmbed = Mockito.mock(MessageEmbed.class); + MessageEmbed.Thumbnail thumbnail = Mockito.mock(MessageEmbed.Thumbnail.class); + when(thumbnail.getProxyUrl()).thenReturn(URL); + when(firstEmbed.getThumbnail()).thenReturn(thumbnail); + List 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)); + 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); + Optional emptyOptional = testUnit.getRepostFor(message, messageEmbed, POSITION); + Assert.assertFalse(emptyOptional.isPresent()); + } + + @Test + public void testGetRepostForWithRepostSameMessage() { + executeGetRepostForWithMessageId(MESSAGE_ID, false); + } + + @Test + public void testGetRepostForWithRepost() { + executeGetRepostForWithMessageId(MESSAGE_ID + 1, true); + } + + private void executeGetRepostForWithMessageId(Long originalPostMessageId, boolean shouldBePresent) { + MessageEmbed messageEmbed = setupSimpleRepostCheck(originalPostMessageId); + Optional optional = testUnit.getRepostFor(message, messageEmbed, POSITION); + Assert.assertEquals(shouldBePresent, optional.isPresent()); + if(shouldBePresent && optional.isPresent()) { + Assert.assertEquals(postedImage, optional.get()); + } + } + + private MessageEmbed 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); + when(thumbnail.getProxyUrl()).thenReturn(URL); + when(messageEmbed.getThumbnail()).thenReturn(thumbnail); + return messageEmbed; + } + + @Test + public void testIsRepostWithRepost() { + MessageEmbed messageEmbed = setupSimpleRepostCheck(MESSAGE_ID + 1); + Assert.assertTrue(testUnit.isRepost(message, messageEmbed, POSITION)); + } + + @Test + public void testIsRepostWithSameMessage() { + MessageEmbed messageEmbed = setupSimpleRepostCheck(MESSAGE_ID); + Assert.assertFalse(testUnit.isRepost(message, messageEmbed, POSITION)); + } + + @Test + public void testIsRepostWithRepostInAttachment() { + generalSetupForRepostTest(); + setupSingleRepost(); + setupSingleHash(postedImage); + when(postedImage.getPostId()).thenReturn(new PostIdentifier(MESSAGE_ID + 1, POSITION)); + Message.Attachment attachment = Mockito.mock(Message.Attachment.class); + when(attachment.getProxyUrl()).thenReturn(URL); + Assert.assertTrue(testUnit.isRepost(message, attachment, POSITION)); + } + + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/SuggestionServiceBeanTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/SuggestionServiceBeanTest.java index ddef83247..347ef41ee 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/SuggestionServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/SuggestionServiceBeanTest.java @@ -1,6 +1,6 @@ package dev.sheldan.abstracto.utility.service; -import dev.sheldan.abstracto.core.exception.ChannelNotFoundException; +import dev.sheldan.abstracto.core.exception.ChannelNotInGuildException; import dev.sheldan.abstracto.core.models.ServerSpecificId; import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AServer; @@ -139,7 +139,7 @@ public class SuggestionServiceBeanTest { executeAcceptWithMember(null); } - @Test(expected = ChannelNotFoundException.class) + @Test(expected = ChannelNotInGuildException.class) public void testAcceptSuggestionInNoTextChannel() { setupForNoTextChannel(); testUnit.acceptSuggestion(SUGGESTION_ID, CLOSING_TEXT, SuggestionLog.builder().build()); @@ -157,7 +157,7 @@ public class SuggestionServiceBeanTest { .build(); when(server.getId()).thenReturn(SERVER_ID); when(channel.getId()).thenReturn(CHANNEL_ID); - when(botService.getTextChannelFromServer(SERVER_ID, CHANNEL_ID)).thenThrow(new ChannelNotFoundException(CHANNEL_ID)); + when(botService.getTextChannelFromServer(SERVER_ID, CHANNEL_ID)).thenThrow(new ChannelNotInGuildException(CHANNEL_ID)); when(suggestionManagementService.getSuggestion(SUGGESTION_ID)).thenReturn(Optional.of(suggestionToAccept)); } @@ -199,7 +199,7 @@ public class SuggestionServiceBeanTest { executeRejectWithMember(null); } - @Test(expected = ChannelNotFoundException.class) + @Test(expected = ChannelNotInGuildException.class) public void testRejectSuggestionInNoTextChannel() { setupForNoTextChannel(); testUnit.rejectSuggestion(SUGGESTION_ID, CLOSING_TEXT, SuggestionLog.builder().build()); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/management/PostedImageManagementBeanTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/management/PostedImageManagementBeanTest.java new file mode 100644 index 000000000..4ce5bc5e7 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/management/PostedImageManagementBeanTest.java @@ -0,0 +1,148 @@ +package dev.sheldan.abstracto.utility.service.management; + +import dev.sheldan.abstracto.core.models.AServerAChannelAUser; +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.utility.exception.PostedImageNotFoundException; +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; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class PostedImageManagementBeanTest { + + @InjectMocks + private PostedImageManagementBean testUnit; + + @Mock + private PostedImageRepository postedImageRepository; + + @Mock + private AUserInAServer aUserInAServer; + + @Mock + private AServer server; + + @Mock + private PostedImage postedImage; + + private static final String HASH = "hash"; + private static final Integer INDEX = 1; + private static final Long MESSAGE_ID = 4L; + private static final Long SERVER_ID = 3L; + private static final Integer POSITION = 5; + + @Test + 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); + Assert.assertEquals(HASH, createdPost.getImageHash()); + Assert.assertEquals(INDEX, createdPost.getPostId().getPosition()); + Assert.assertEquals(MESSAGE_ID, createdPost.getPostId().getMessageId()); + verify(postedImageRepository, times(1)).save(createdPost); + } + + @Test + public void testPostWitHashExists() { + when(server.getId()).thenReturn(SERVER_ID); + when(postedImageRepository.existsByImageHashAndServerId(HASH, SERVER_ID)).thenReturn(true); + Assert.assertTrue(testUnit.postWitHashExists(HASH, server)); + } + + @Test + public void testGetPostWithHash() { + when(server.getId()).thenReturn(SERVER_ID); + when(postedImageRepository.findByImageHashAndServerId(HASH, SERVER_ID)).thenReturn(Optional.of(postedImage)); + java.util.Optional optionalPostedImage = testUnit.getPostWithHash(HASH, server); + Assert.assertTrue(optionalPostedImage.isPresent()); + optionalPostedImage.ifPresent(optionalPostedImageObj -> + Assert.assertEquals(postedImage, optionalPostedImageObj) + ); + } + + @Test + public void testMessageHasBeenCovered() { + when(postedImageRepository.existsByPostId_MessageId(MESSAGE_ID)).thenReturn(true); + Assert.assertTrue(testUnit.messageHasBeenCovered(MESSAGE_ID)); + } + + @Test + public void testMessageEmbedsHaveBeenCovered() { + when(postedImageRepository.existsByPostId_MessageIdAndPostId_PositionGreaterThan(MESSAGE_ID, RepostServiceBean.EMBEDDED_LINK_POSITION_START_INDEX - 1)).thenReturn(true); + Assert.assertTrue(testUnit.messageEmbedsHaveBeenCovered(MESSAGE_ID)); + } + + @Test + public void testGetAllFromMessage() { + when(postedImageRepository.findByPostId_MessageId(MESSAGE_ID)).thenReturn(Arrays.asList(postedImage)); + List foundPosts = testUnit.getAllFromMessage(MESSAGE_ID); + Assert.assertEquals(1, foundPosts.size()); + Assert.assertEquals(postedImage, foundPosts.get(0)); + } + + @Test + public void testGetAllFromMessageEmpty() { + when(postedImageRepository.findByPostId_MessageId(MESSAGE_ID)).thenReturn(new ArrayList<>()); + List foundPosts = testUnit.getAllFromMessage(MESSAGE_ID); + Assert.assertEquals(0, foundPosts.size()); + } + + @Test + public void testGetPostFromMessageAndPositionOptional() { + when(postedImageRepository.findById(new PostIdentifier(MESSAGE_ID, POSITION))).thenReturn(Optional.of(postedImage)); + Optional foundPostedImage = testUnit.getPostFromMessageAndPositionOptional(MESSAGE_ID, POSITION); + Assert.assertTrue(foundPostedImage.isPresent()); + foundPostedImage.ifPresent(optionalPostedImageObj -> + Assert.assertEquals(postedImage, optionalPostedImageObj) + ); + } + + @Test(expected = PostedImageNotFoundException.class) + public void testGetPostFromMessageAndPositionNotFound() { + when(postedImageRepository.findById(new PostIdentifier(MESSAGE_ID, POSITION))).thenReturn(Optional.empty()); + testUnit.getPostFromMessageAndPosition(MESSAGE_ID, POSITION); + } + + + @Test + public void testGetPostFromMessageAndPositionFound() { + when(postedImageRepository.findById(new PostIdentifier(MESSAGE_ID, POSITION))).thenReturn(Optional.of(postedImage)); + PostedImage foundPostedImage = testUnit.getPostFromMessageAndPosition(MESSAGE_ID, POSITION); + Assert.assertEquals(postedImage, foundPostedImage); + } + + @Test + public void testRemovePostedImagesOf() { + testUnit.removePostedImagesOf(aUserInAServer); + verify(postedImageRepository, times(1)).deleteByPoster(aUserInAServer); + } + + @Test + public void testRemovePostedImagesIn() { + testUnit.removedPostedImagesIn(server); + verify(postedImageRepository, times(1)).deleteByServer(server); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/management/RepostCheckChannelGroupManagementBeanTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/management/RepostCheckChannelGroupManagementBeanTest.java new file mode 100644 index 000000000..69c26c77c --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/management/RepostCheckChannelGroupManagementBeanTest.java @@ -0,0 +1,130 @@ +package dev.sheldan.abstracto.utility.service.management; + +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.utility.exception.RepostCheckChannelGroupNotFoundException; +import dev.sheldan.abstracto.utility.models.database.RepostCheckChannelGroup; +import dev.sheldan.abstracto.utility.repository.RepostCheckChannelRepository; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import java.util.Optional; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class RepostCheckChannelGroupManagementBeanTest { + + @InjectMocks + private RepostCheckChannelGroupManagementBean testUnit; + + @Mock + private RepostCheckChannelRepository repository; + + @Mock + private RepostCheckChannelGroup checkChannelGroup; + + @Mock + private AChannelGroup aChannelGroup; + + @Captor + private ArgumentCaptor checkChannelGroupArgumentCaptor; + + private static final Long CHANNEL_GROUP_ID = 1L; + + @Test(expected = RepostCheckChannelGroupNotFoundException.class) + public void testLoadRepostChannelGroupByIdNotFound() { + when(repository.findById(CHANNEL_GROUP_ID)).thenReturn(Optional.empty()); + testUnit.loadRepostChannelGroupById(CHANNEL_GROUP_ID); + } + + @Test + public void testLoadRepostChannelGroupById() { + when(repository.findById(CHANNEL_GROUP_ID)).thenReturn(Optional.of(checkChannelGroup)); + RepostCheckChannelGroup resultChannelGroup = testUnit.loadRepostChannelGroupById(CHANNEL_GROUP_ID); + Assert.assertEquals(checkChannelGroup, resultChannelGroup); + } + + @Test + public void testLoadRepostChannelGroupByIdOptional() { + when(repository.findById(CHANNEL_GROUP_ID)).thenReturn(Optional.of(checkChannelGroup)); + Optional resultChannelGroupOptional = testUnit.loadRepostChanelGroupByIdOptional(CHANNEL_GROUP_ID); + Assert.assertTrue(resultChannelGroupOptional.isPresent()); + resultChannelGroupOptional.ifPresent(repostCheckChannelGroup -> Assert.assertEquals(checkChannelGroup, repostCheckChannelGroup)); + } + + @Test + public void testRepostCheckChannelGroupExistsNot() { + when(repository.findById(CHANNEL_GROUP_ID)).thenReturn(Optional.empty()); + Assert.assertFalse(testUnit.repostCheckChannelGroupExists(CHANNEL_GROUP_ID)); + } + + @Test + public void testRepostCheckChannelGroupExists() { + when(repository.findById(CHANNEL_GROUP_ID)).thenReturn(Optional.of(checkChannelGroup)); + Assert.assertTrue(testUnit.repostCheckChannelGroupExists(CHANNEL_GROUP_ID)); + } + + @Test + public void testLoadRepostChannelGroupByChannelGroupOptionalPresent() { + when(aChannelGroup.getId()).thenReturn(CHANNEL_GROUP_ID); + when(repository.findById(CHANNEL_GROUP_ID)).thenReturn(Optional.of(checkChannelGroup)); + Optional resultChannelGroupOptional = testUnit.loadRepostChannelGroupByChannelGroupOptional(aChannelGroup); + Assert.assertTrue(resultChannelGroupOptional.isPresent()); + resultChannelGroupOptional.ifPresent(repostCheckChannelGroup -> Assert.assertEquals(checkChannelGroup, repostCheckChannelGroup)); + } + + @Test + public void testLoadRepostChannelGroupByChannelGroupOptionalNotPresent() { + when(aChannelGroup.getId()).thenReturn(CHANNEL_GROUP_ID); + when(repository.findById(CHANNEL_GROUP_ID)).thenReturn(Optional.empty()); + Optional resultChannelGroupOptional = testUnit.loadRepostChannelGroupByChannelGroupOptional(aChannelGroup); + Assert.assertFalse(resultChannelGroupOptional.isPresent()); + } + + @Test + public void testLoadRepostChannelGroupByChannelGroup() { + when(aChannelGroup.getId()).thenReturn(CHANNEL_GROUP_ID); + when(repository.findById(CHANNEL_GROUP_ID)).thenReturn(Optional.of(checkChannelGroup)); + RepostCheckChannelGroup repostCheckChannelGroup = testUnit.loadRepostChannelGroupByChannelGroup(aChannelGroup); + Assert.assertEquals(checkChannelGroup, repostCheckChannelGroup); + } + + @Test(expected = RepostCheckChannelGroupNotFoundException.class) + public void testLoadRepostChannelGroupByChannelGroupNotFound() { + when(aChannelGroup.getId()).thenReturn(CHANNEL_GROUP_ID); + when(repository.findById(CHANNEL_GROUP_ID)).thenReturn(Optional.empty()); + testUnit.loadRepostChannelGroupByChannelGroup(aChannelGroup); + } + + @Test + public void testCreateRepostCheckChannelGroup() { + when(aChannelGroup.getId()).thenReturn(CHANNEL_GROUP_ID); + RepostCheckChannelGroup createdCheckChannelGroup = testUnit.createRepostCheckChannelGroup(aChannelGroup); + verify(repository, times(1)).save(checkChannelGroupArgumentCaptor.capture()); + Assert.assertEquals(checkChannelGroupArgumentCaptor.getValue(), createdCheckChannelGroup); + Assert.assertTrue(createdCheckChannelGroup.getCheckEnabled()); + Assert.assertEquals(CHANNEL_GROUP_ID, createdCheckChannelGroup.getId()); + Assert.assertEquals(aChannelGroup, createdCheckChannelGroup.getChannelGroup()); + } + + @Test(expected = RepostCheckChannelGroupNotFoundException.class) + public void testDeleteRepostCheckChannelGroupNotExisting(){ + when(aChannelGroup.getId()).thenReturn(CHANNEL_GROUP_ID); + when(repository.findById(CHANNEL_GROUP_ID)).thenReturn(Optional.empty()); + testUnit.deleteRepostCheckChannelGroup(aChannelGroup); + } + + @Test + public void testDeleteRepostCheckChannelGroup(){ + when(aChannelGroup.getId()).thenReturn(CHANNEL_GROUP_ID); + when(repository.findById(CHANNEL_GROUP_ID)).thenReturn(Optional.of(checkChannelGroup)); + testUnit.deleteRepostCheckChannelGroup(aChannelGroup); + verify(repository, times(1)).delete(checkChannelGroup); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/management/RepostManagementServiceBeanTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/management/RepostManagementServiceBeanTest.java new file mode 100644 index 000000000..510865065 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/service/management/RepostManagementServiceBeanTest.java @@ -0,0 +1,185 @@ +package dev.sheldan.abstracto.utility.service.management; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.utility.exception.RepostNotFoundException; +import dev.sheldan.abstracto.utility.models.database.PostedImage; +import dev.sheldan.abstracto.utility.models.database.Repost; +import dev.sheldan.abstracto.utility.models.database.embed.PostIdentifier; +import dev.sheldan.abstracto.utility.models.database.embed.RepostIdentifier; +import dev.sheldan.abstracto.utility.models.database.result.RepostLeaderboardResult; +import dev.sheldan.abstracto.utility.repository.RepostRepository; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.*; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.data.domain.Pageable; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class RepostManagementServiceBeanTest { + + @InjectMocks + private RepostManagementServiceBean testUnit; + + @Mock + private RepostRepository repostRepository; + + @Mock + private PostedImage postedImage; + + @Mock + private AUserInAServer poster; + + @Mock + private PostIdentifier postIdentifier; + + @Mock + private Repost repost; + + @Mock + private AServer server; + + @Captor + private ArgumentCaptor repostArgumentCaptor; + + @Captor + private ArgumentCaptor pageableArgumentCaptor; + + private static final Long MESSAGE_ID = 1L; + private static final Integer POSITION = 2; + private static final Long USER_IN_SERVER_ID = 3L; + private static final Integer COUNT = 4; + private static final Long SERVER_ID = 5L; + private static final Integer PAGE = 6; + private static final Integer PAGE_SIZE = 7; + + @Test + public void testCreateRepost() { + setupPostIdentifier(); + testUnit.createRepost(postedImage, poster); + verify(repostRepository, times(1)).save(repostArgumentCaptor.capture()); + + Repost capturedRepost = repostArgumentCaptor.getValue(); + Assert.assertEquals(poster, capturedRepost.getPoster()); + Assert.assertEquals(postedImage, capturedRepost.getOriginalPost()); + Assert.assertEquals(MESSAGE_ID, capturedRepost.getRepostId().getMessageId()); + Assert.assertEquals(POSITION, capturedRepost.getRepostId().getPosition()); + Assert.assertEquals(USER_IN_SERVER_ID, capturedRepost.getRepostId().getUserInServerId()); + } + + @Test + public void testFindRepostOptional() { + setupPostIdentifier(); + when(repostRepository.findById(any(RepostIdentifier.class))).thenReturn(Optional.of(repost)); + Optional repostOptional = testUnit.findRepostOptional(postedImage, poster); + Assert.assertTrue(repostOptional.isPresent()); + repostOptional.ifPresent(foundRepost -> Assert.assertEquals(repost, foundRepost)); + } + + @Test + public void testFindRepostOptionalNotPresent() { + setupPostIdentifier(); + when(repostRepository.findById(any(RepostIdentifier.class))).thenReturn(Optional.empty()); + Optional repostOptional = testUnit.findRepostOptional(postedImage, poster); + Assert.assertFalse(repostOptional.isPresent()); + } + + @Test + public void testSetRepostCount() { + setupPostIdentifier(); + when(repostRepository.findById(any(RepostIdentifier.class))).thenReturn(Optional.of(repost)); + Repost updatedRepost = testUnit.setRepostCount(postedImage, poster, COUNT); + verify(repost, times(1)).setCount(4); + Assert.assertEquals(repost, updatedRepost); + } + + @Test(expected = RepostNotFoundException.class) + public void testSetRepostCountNotFound() { + setupPostIdentifier(); + when(repostRepository.findById(any(RepostIdentifier.class))).thenReturn(Optional.empty()); + testUnit.setRepostCount(postedImage, poster, COUNT); + } + + @Test(expected = RepostNotFoundException.class) + public void testFindRepostNotFound() { + setupPostIdentifier(); + when(repostRepository.findById(any(RepostIdentifier.class))).thenReturn(Optional.empty()); + testUnit.findRepost(postedImage, poster); + } + + @Test + public void testFindRepost() { + setupPostIdentifier(); + when(repostRepository.findById(any(RepostIdentifier.class))).thenReturn(Optional.of(repost)); + Repost foundRepost = testUnit.findRepost(postedImage, poster); + Assert.assertEquals(repost, foundRepost); + } + + @Test + public void testFindTopRepostingUsersOfServer() { + RepostLeaderboardResult singleResult = Mockito.mock(RepostLeaderboardResult.class); + when(repostRepository.findTopRepostingUsers(eq(SERVER_ID), pageableArgumentCaptor.capture())).thenReturn(Arrays.asList(singleResult)); + List foundResult = testUnit.findTopRepostingUsersOfServer(SERVER_ID, PAGE, PAGE_SIZE); + checkLeaderboardResult(singleResult, foundResult); + } + + @Test + public void testFindTopRepostingUsersOfServerAServer() { + when(server.getId()).thenReturn(SERVER_ID); + RepostLeaderboardResult singleResult = Mockito.mock(RepostLeaderboardResult.class); + when(repostRepository.findTopRepostingUsers(eq(SERVER_ID), pageableArgumentCaptor.capture())).thenReturn(Arrays.asList(singleResult)); + List foundResult = testUnit.findTopRepostingUsersOfServer(server, PAGE, PAGE_SIZE); + checkLeaderboardResult(singleResult, foundResult); + } + + @Test + public void testGetRepostRankOfUser() { + setupPoster(); + RepostLeaderboardResult singleResult = Mockito.mock(RepostLeaderboardResult.class); + when(repostRepository.getRepostRankOfUserInServer(USER_IN_SERVER_ID, SERVER_ID)).thenReturn(singleResult); + RepostLeaderboardResult foundRank = testUnit.getRepostRankOfUser(poster); + Assert.assertEquals(singleResult, foundRank); + } + + @Test + public void testDeleteRepostsFromUser() { + setupPoster(); + testUnit.deleteRepostsFromUser(poster); + verify(repostRepository, times(1)).deleteByRepostId_UserInServerIdAndServerId(USER_IN_SERVER_ID, SERVER_ID); + } + + @Test + public void testDeleteRepostsFromServer() { + when(server.getId()).thenReturn(SERVER_ID); + testUnit.deleteRepostsFromServer(server); + verify(repostRepository, times(1)).deleteByServerId(SERVER_ID); + } + + private void setupPoster() { + when(poster.getServerReference()).thenReturn(server); + when(server.getId()).thenReturn(SERVER_ID); + when(poster.getUserInServerId()).thenReturn(USER_IN_SERVER_ID); + } + + private void checkLeaderboardResult(RepostLeaderboardResult singleResult, List foundResult) { + Pageable usedPaging = pageableArgumentCaptor.getValue(); + Assert.assertEquals(PAGE - 1, usedPaging.getPageNumber()); + Assert.assertEquals(PAGE_SIZE.intValue(), usedPaging.getPageSize()); + Assert.assertEquals(1, foundResult.size()); + Assert.assertEquals(singleResult, foundResult.get(0)); + } + + private void setupPostIdentifier() { + when(postedImage.getPostId()).thenReturn(postIdentifier); + when(postIdentifier.getMessageId()).thenReturn(MESSAGE_ID); + when(postIdentifier.getPosition()).thenReturn(POSITION); + when(poster.getUserInServerId()).thenReturn(USER_IN_SERVER_ID); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/config/RepostDetectionModuleInterface.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/config/RepostDetectionModuleInterface.java new file mode 100644 index 000000000..4e8e511ed --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/config/RepostDetectionModuleInterface.java @@ -0,0 +1,22 @@ +package dev.sheldan.abstracto.utility.config; + +import dev.sheldan.abstracto.core.command.UtilityModuleInterface; +import dev.sheldan.abstracto.core.command.config.ModuleInfo; +import dev.sheldan.abstracto.core.command.config.ModuleInterface; +import org.springframework.stereotype.Component; + +@Component +public class RepostDetectionModuleInterface implements ModuleInterface { + + public static final String REPOST_DETECTION = "repostDetection"; + + @Override + public ModuleInfo getInfo() { + return ModuleInfo.builder().name(REPOST_DETECTION).description("Commands related to repost detection").build(); + } + + @Override + public String getParentModule() { + return UtilityModuleInterface.UTILITY; + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/config/features/RepostDetectionFeature.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/config/features/RepostDetectionFeature.java new file mode 100644 index 000000000..fb8ffecb8 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/config/features/RepostDetectionFeature.java @@ -0,0 +1,21 @@ +package dev.sheldan.abstracto.utility.config.features; + +import dev.sheldan.abstracto.core.config.FeatureConfig; +import dev.sheldan.abstracto.core.config.FeatureEnum; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +@Component +public class RepostDetectionFeature implements FeatureConfig { + @Override + public FeatureEnum getFeature() { + return UtilityFeature.REPOST_DETECTION; + } + + @Override + public List getRequiredEmotes() { + return Arrays.asList("repostMarker"); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/config/features/RepostDetectionFeatureMode.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/config/features/RepostDetectionFeatureMode.java new file mode 100644 index 000000000..78f3bf421 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/config/features/RepostDetectionFeatureMode.java @@ -0,0 +1,15 @@ +package dev.sheldan.abstracto.utility.config.features; + +import dev.sheldan.abstracto.core.config.FeatureMode; +import lombok.Getter; + +@Getter +public enum RepostDetectionFeatureMode implements FeatureMode { + DOWNLOAD("download"), LEADERBOARD("leaderboard"); + + private final String key; + + RepostDetectionFeatureMode(String key) { + this.key = key; + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/config/features/UtilityFeature.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/config/features/UtilityFeature.java index d01d4133c..2b7cfd595 100644 --- a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/config/features/UtilityFeature.java +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/config/features/UtilityFeature.java @@ -5,7 +5,8 @@ import lombok.Getter; @Getter public enum UtilityFeature implements FeatureEnum { - REMIND("remind"), STARBOARD("starboard"), SUGGEST("suggestion"), UTILITY("utility"), LINK_EMBEDS("link_embeds"); + REMIND("remind"), STARBOARD("starboard"), SUGGEST("suggestion"), UTILITY("utility"), + LINK_EMBEDS("link_embeds"), REPOST_DETECTION("repostDetection"); private String key; diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/exception/PostedImageNotFoundException.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/exception/PostedImageNotFoundException.java new file mode 100644 index 000000000..f68693437 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/exception/PostedImageNotFoundException.java @@ -0,0 +1,10 @@ +package dev.sheldan.abstracto.utility.exception; + +import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException; + +public class PostedImageNotFoundException extends AbstractoRunTimeException { + + public PostedImageNotFoundException(Long postedMessageId, Integer position) { + super(String.format("Posted message with id %s and position %s was not found.", postedMessageId, position)); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/exception/RepostCheckChannelGroupNotFoundException.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/exception/RepostCheckChannelGroupNotFoundException.java new file mode 100644 index 000000000..7ada205ed --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/exception/RepostCheckChannelGroupNotFoundException.java @@ -0,0 +1,21 @@ +package dev.sheldan.abstracto.utility.exception; + +import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException; +import dev.sheldan.abstracto.templating.Templatable; + +public class RepostCheckChannelGroupNotFoundException extends AbstractoRunTimeException implements Templatable { + + public RepostCheckChannelGroupNotFoundException(Long channelGroupId) { + super(String.format("Repost check channel with id %s does not exist", channelGroupId)); + } + + @Override + public String getTemplateName() { + return "repost_check_check_channel_not_found"; + } + + @Override + public Object getTemplateModel() { + return new Object(); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/exception/RepostNotFoundException.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/exception/RepostNotFoundException.java new file mode 100644 index 000000000..cd90783cb --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/exception/RepostNotFoundException.java @@ -0,0 +1,9 @@ +package dev.sheldan.abstracto.utility.exception; + +import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException; + +public class RepostNotFoundException extends AbstractoRunTimeException { + public RepostNotFoundException(Long originalPostId, Integer originalPositionId, Long userInServerId) { + super(String.format("Repost with image post id %s and position %s from user %s was not found.", originalPostId, originalPositionId, userInServerId)); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/RepostLeaderboardEntryModel.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/RepostLeaderboardEntryModel.java new file mode 100644 index 000000000..3f5186df0 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/RepostLeaderboardEntryModel.java @@ -0,0 +1,18 @@ +package dev.sheldan.abstracto.utility.models; + + +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import net.dv8tion.jda.api.entities.Member; + +@Getter +@Setter +@Builder +public class RepostLeaderboardEntryModel { + private Member member; + private AUserInAServer user; + private Integer count; + private Integer rank; +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/RepostLeaderboardModel.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/RepostLeaderboardModel.java new file mode 100644 index 000000000..2b3537fcc --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/RepostLeaderboardModel.java @@ -0,0 +1,19 @@ +package dev.sheldan.abstracto.utility.models; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.Member; + +import java.util.List; + +@Getter +@Setter +@Builder +public class RepostLeaderboardModel { + private List entries; + private Guild guild; + private RepostLeaderboardEntryModel userExecuting; + private Member member; +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/EmbeddedMessage.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/EmbeddedMessage.java index b533f0258..df048f394 100644 --- a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/EmbeddedMessage.java +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/EmbeddedMessage.java @@ -66,6 +66,4 @@ public class EmbeddedMessage implements Serializable { private void onInsert() { this.created = Instant.now(); } - - } diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/PostedImage.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/PostedImage.java new file mode 100644 index 000000000..3912f8ba5 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/PostedImage.java @@ -0,0 +1,64 @@ +package dev.sheldan.abstracto.utility.models.database; + +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.utility.models.database.embed.PostIdentifier; +import lombok.*; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +import javax.persistence.*; +import java.time.Instant; +import java.util.List; + +@Entity +@Table(name = "posted_image") +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +@EqualsAndHashCode +@Cacheable +@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class PostedImage { + + @Getter + @ManyToOne + @JoinColumn(name = "posting_user_id", nullable = false) + private AUserInAServer poster; + + @Getter + @ManyToOne + @JoinColumn(name = "server_id", nullable = false) + private AServer server; + + @Getter + @ManyToOne + @JoinColumn(name = "posted_channel_id", nullable = false) + private AChannel postedChannel; + + @EmbeddedId + @Getter + @Setter + private PostIdentifier postId; + + @Column(name = "image_hash") + private String imageHash; + + @Column(name = "created") + private Instant created; + + @Getter + @OneToMany(fetch = FetchType.LAZY, + orphanRemoval = true, + cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}, + mappedBy = "originalPost") + @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + private List reposts; + + @PrePersist + private void onInsert() { + this.created = Instant.now(); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/Repost.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/Repost.java new file mode 100644 index 000000000..eacf33a4d --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/Repost.java @@ -0,0 +1,67 @@ +package dev.sheldan.abstracto.utility.models.database; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.utility.models.database.embed.RepostIdentifier; +import lombok.*; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +import javax.persistence.*; +import java.time.Instant; + +@Entity +@Table(name = "repost") +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +@EqualsAndHashCode +@Cacheable +@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class Repost { + + @EmbeddedId + @Getter + @Setter + private RepostIdentifier repostId; + + @Getter + @ManyToOne + @MapsId("userInServerId") + @JoinColumn(name = "user_in_server_id", referencedColumnName = "user_in_server_id", nullable = false) + private AUserInAServer poster; + + @Getter + @ManyToOne + @JoinColumn(name = "server_id", nullable = false) + private AServer server; + + @Column(name = "count") + private Integer count; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumns( + { + @JoinColumn(updatable = false, insertable = false, name = "message_id", referencedColumnName = "message_id"), + @JoinColumn(updatable = false, insertable = false, name = "position", referencedColumnName = "position") + }) + private PostedImage originalPost; + + @Column(name = "created") + private Instant created; + + @PrePersist + private void onInsert() { + this.created = Instant.now(); + } + + @Column(name = "updated") + private Instant updated; + + @PreUpdate + private void onUpdate() { + this.updated = Instant.now(); + } + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/RepostCheckChannelGroup.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/RepostCheckChannelGroup.java new file mode 100644 index 000000000..8e1353810 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/RepostCheckChannelGroup.java @@ -0,0 +1,47 @@ +package dev.sheldan.abstracto.utility.models.database; + +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import lombok.*; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +import javax.persistence.*; +import java.time.Instant; + +@Builder +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "repost_check_channel_group") +@Getter +@Setter +@EqualsAndHashCode +@Cacheable +@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class RepostCheckChannelGroup { + + @Id + private Long id; + + @OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) + @PrimaryKeyJoinColumn + private AChannelGroup channelGroup; + + @Column(name = "enabled") + private Boolean checkEnabled; + + @Column(name = "created") + private Instant created; + + @PrePersist + private void onInsert() { + this.created = Instant.now(); + } + + @Column(name = "updated") + private Instant updated; + + @PreUpdate + private void onUpdate() { + this.updated = Instant.now(); + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/embed/PostIdentifier.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/embed/PostIdentifier.java new file mode 100644 index 000000000..1dde263fd --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/embed/PostIdentifier.java @@ -0,0 +1,20 @@ +package dev.sheldan.abstracto.utility.models.database.embed; + +import lombok.*; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.io.Serializable; + +@Embeddable +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode +public class PostIdentifier implements Serializable { + @Column(name = "message_id") + private Long messageId; + @Column(name = "position") + private Integer position; +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/embed/RepostIdentifier.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/embed/RepostIdentifier.java new file mode 100644 index 000000000..33966294e --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/embed/RepostIdentifier.java @@ -0,0 +1,22 @@ +package dev.sheldan.abstracto.utility.models.database.embed; + +import lombok.*; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.io.Serializable; + +@Embeddable +@Getter +@Setter +@EqualsAndHashCode +@NoArgsConstructor +@AllArgsConstructor +public class RepostIdentifier implements Serializable { + @Column(name = "message_id") + private Long messageId; + @Column(name = "position") + private Integer position; + @Column(name = "user_in_server_id") + private Long userInServerId; +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/result/RepostLeaderboardResult.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/result/RepostLeaderboardResult.java new file mode 100644 index 000000000..0072e009d --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/result/RepostLeaderboardResult.java @@ -0,0 +1,10 @@ +package dev.sheldan.abstracto.utility.models.database.result; + +public interface RepostLeaderboardResult { + + Long getUserInServerId(); + + Integer getRepostCount(); + + Integer getRank(); +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/RepostCheckChannelGroupDisplayModel.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/RepostCheckChannelGroupDisplayModel.java new file mode 100644 index 000000000..9e9b5cf70 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/RepostCheckChannelGroupDisplayModel.java @@ -0,0 +1,17 @@ +package dev.sheldan.abstracto.utility.models.template.commands; + +import dev.sheldan.abstracto.core.models.FullChannel; +import dev.sheldan.abstracto.utility.models.database.RepostCheckChannelGroup; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +@Builder +public class RepostCheckChannelGroupDisplayModel { + private RepostCheckChannelGroup channelGroup; + private List channels; +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/RepostCheckChannelsModel.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/RepostCheckChannelsModel.java new file mode 100644 index 000000000..6a13fd7f2 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/RepostCheckChannelsModel.java @@ -0,0 +1,14 @@ +package dev.sheldan.abstracto.utility.models.template.commands; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +@Builder +public class RepostCheckChannelsModel { + private List repostCheckChannelGroups; +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/PostedImageService.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/PostedImageService.java new file mode 100644 index 000000000..114c756d1 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/PostedImageService.java @@ -0,0 +1,9 @@ +package dev.sheldan.abstracto.utility.service; + +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import net.dv8tion.jda.api.entities.Guild; + +public interface PostedImageService { + void purgePostedImages(AUserInAServer member); + void purgePostedImages(Guild guild); +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/RepostCheckChannelService.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/RepostCheckChannelService.java new file mode 100644 index 000000000..df78b0873 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/RepostCheckChannelService.java @@ -0,0 +1,29 @@ +package dev.sheldan.abstracto.utility.service; + +import dev.sheldan.abstracto.core.models.database.AChannel; +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.utility.models.database.RepostCheckChannelGroup; +import net.dv8tion.jda.api.entities.TextChannel; + +import java.util.List; + +public interface RepostCheckChannelService { + void setRepostCheckEnabledForChannelGroup(AChannelGroup channelGroup); + void setRepostCheckEnabledForChannelGroup(RepostCheckChannelGroup channelGroup); + + void setRepostCheckDisabledForChannelGroup(AChannelGroup channelGroup); + void setRepostCheckDisabledForChannelGroup(RepostCheckChannelGroup channelGroup); + + boolean duplicateCheckEnabledForChannel(TextChannel textChannel); + boolean duplicateCheckEnabledForChannel(AChannel channel); + + List getRepostCheckChannelGroupsForServer(AServer server); + + List getRepostCheckChannelGroupsForServer(Long serverId); + + List getChannelGroupsWithEnabledCheck(AServer server); + List getChannelGroupsWithEnabledCheck(Long serverId); + + +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/RepostService.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/RepostService.java new file mode 100644 index 000000000..e45a3a214 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/RepostService.java @@ -0,0 +1,23 @@ +package dev.sheldan.abstracto.utility.service; + +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.utility.models.RepostLeaderboardEntryModel; +import dev.sheldan.abstracto.utility.models.database.PostedImage; +import net.dv8tion.jda.api.entities.*; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +public interface RepostService { + boolean isRepost(Message message, MessageEmbed messageEmbed, Integer embedIndex); + Optional getRepostFor(Message message, MessageEmbed messageEmbed, Integer embedIndex); + boolean isRepost(Message message, Message.Attachment attachment, Integer index); + Optional getRepostFor(Message message, Message.Attachment attachment, Integer index); + String calculateHashForPost(String url, Long serverId); + void processMessageAttachmentRepostCheck(Message message); + void processMessageEmbedsRepostCheck(List embeds, Message message); + CompletableFuture> retrieveRepostLeaderboard(Guild guild, Integer page); + void purgeReposts(AUserInAServer userInAServer); + void purgeReposts(Guild guild); +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/PostedImageManagement.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/PostedImageManagement.java new file mode 100644 index 000000000..347fedde8 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/PostedImageManagement.java @@ -0,0 +1,23 @@ +package dev.sheldan.abstracto.utility.service.management; + +import dev.sheldan.abstracto.core.models.AServerAChannelAUser; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.utility.models.database.PostedImage; +import net.dv8tion.jda.api.entities.Message; + +import java.util.List; +import java.util.Optional; + +public interface PostedImageManagement { + PostedImage createPost(AServerAChannelAUser creation, Message source, String hash, Integer index); + boolean postWitHashExists(String hash, AServer server); + Optional getPostWithHash(String hash, AServer server); + boolean messageHasBeenCovered(Long messageId); + boolean messageEmbedsHaveBeenCovered(Long messageId); + List getAllFromMessage(Long messageId); + Optional getPostFromMessageAndPositionOptional(Long messageId, Integer position); + PostedImage getPostFromMessageAndPosition(Long messageId, Integer position); + void removePostedImagesOf(AUserInAServer aUserInAServer); + void removedPostedImagesIn(AServer aServer); +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/RepostCheckChannelGroupManagement.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/RepostCheckChannelGroupManagement.java new file mode 100644 index 000000000..1db96c209 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/RepostCheckChannelGroupManagement.java @@ -0,0 +1,16 @@ +package dev.sheldan.abstracto.utility.service.management; + +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.utility.models.database.RepostCheckChannelGroup; + +import java.util.Optional; + +public interface RepostCheckChannelGroupManagement { + RepostCheckChannelGroup loadRepostChannelGroupById(Long channelGroupId); + Optional loadRepostChanelGroupByIdOptional(Long channelGroupId); + boolean repostCheckChannelGroupExists(Long channelGroupId); + Optional loadRepostChannelGroupByChannelGroupOptional(AChannelGroup channelGroup); + RepostCheckChannelGroup loadRepostChannelGroupByChannelGroup(AChannelGroup channelGroup); + RepostCheckChannelGroup createRepostCheckChannelGroup(AChannelGroup channelGroup); + void deleteRepostCheckChannelGroup(AChannelGroup channelGroup); +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/RepostManagementService.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/RepostManagementService.java new file mode 100644 index 000000000..8836bb0fa --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/RepostManagementService.java @@ -0,0 +1,22 @@ +package dev.sheldan.abstracto.utility.service.management; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.utility.models.database.PostedImage; +import dev.sheldan.abstracto.utility.models.database.Repost; +import dev.sheldan.abstracto.utility.models.database.result.RepostLeaderboardResult; + +import java.util.List; +import java.util.Optional; + +public interface RepostManagementService { + Repost createRepost(PostedImage postedImage, AUserInAServer poster); + Repost setRepostCount(PostedImage postedImage, AUserInAServer poster, Integer newCount); + Repost findRepost(PostedImage postedImage, AUserInAServer poster); + Optional findRepostOptional(PostedImage postedImage, AUserInAServer poster); + List findTopRepostingUsersOfServer(AServer server, Integer page, Integer pageSize); + List findTopRepostingUsersOfServer(Long serverId, Integer page, Integer pageSize); + RepostLeaderboardResult getRepostRankOfUser(AUserInAServer aUserInAServer); + void deleteRepostsFromUser(AUserInAServer aUserInAServer); + void deleteRepostsFromServer(AServer server); +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/CommandReceivedHandler.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/CommandReceivedHandler.java index a8be6b1e6..3e700a87d 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/CommandReceivedHandler.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/CommandReceivedHandler.java @@ -14,6 +14,7 @@ import dev.sheldan.abstracto.core.command.service.ExceptionService; import dev.sheldan.abstracto.core.command.service.PostCommandExecution; import dev.sheldan.abstracto.core.command.execution.*; import dev.sheldan.abstracto.core.command.execution.UnParsedCommandParameter; +import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException; import dev.sheldan.abstracto.core.models.database.*; import dev.sheldan.abstracto.core.service.EmoteService; import dev.sheldan.abstracto.core.service.RoleService; @@ -108,10 +109,6 @@ public class CommandReceivedHandler extends ListenerAdapter { parsingFuture.thenAccept(parsedParameters -> self.executeCommand(event, foundCommand, parsedParameters) ).exceptionally(throwable -> { - reportException(event, foundCommand, throwable, "Exception when executing command."); - return null; - }); - parsingFuture.exceptionally(throwable -> { self.reportException(event, foundCommand, throwable, "Exception when parsing command."); return null; }); @@ -255,9 +252,9 @@ public class CommandReceivedHandler extends ListenerAdapter { boolean handlerMatched = false; for (CommandParameterHandler handler : orderedHandlers) { try { - if(handler.handles(param.getType())) { + if (handler.handles(param.getType())) { handlerMatched = true; - if(handler.async()) { + if (handler.async()) { CompletableFuture future = handler.handleAsync(value, iterators, param.getType(), message); futures.add(future); parsedParameters.add(future); @@ -266,6 +263,8 @@ public class CommandReceivedHandler extends ListenerAdapter { } break; } + } catch (AbstractoRunTimeException abstractoRunTimeException) { + throw abstractoRunTimeException; } catch (Exception e) { log.warn("Failed to parse parameter with exception.", e); throw new IncorrectParameterException(command, param.getName()); @@ -286,7 +285,9 @@ public class CommandReceivedHandler extends ListenerAdapter { } if(!futures.isEmpty()) { - return FutureUtils.toSingleFuture(futures).thenApply(aVoid -> { + CompletableFuture multipleFuturesFuture = new CompletableFuture<>(); + CompletableFuture combinedFuture = FutureUtils.toSingleFuture(futures); + combinedFuture.thenAccept(aVoid -> { List usableParameters = parsedParameters.stream().map(o -> { if(o instanceof CompletableFuture) { return ((CompletableFuture) o).join(); @@ -294,8 +295,14 @@ public class CommandReceivedHandler extends ListenerAdapter { return o; } }).collect(Collectors.toList()); - return Parameters.builder().parameters(usableParameters).build(); + multipleFuturesFuture.complete(Parameters.builder().parameters(usableParameters).build()); }); + + combinedFuture.exceptionally(throwable -> { + multipleFuturesFuture.completeExceptionally(throwable); + return null; + }); + return multipleFuturesFuture; } else { Parameters parameters = Parameters.builder().parameters(parsedParameters).build(); return CompletableFuture.completedFuture(parameters); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/handler/AChannelParameterHandlerImpl.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/handler/AChannelParameterHandlerImpl.java index 3548ca1e0..546dc2794 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/handler/AChannelParameterHandlerImpl.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/handler/AChannelParameterHandlerImpl.java @@ -1,17 +1,18 @@ package dev.sheldan.abstracto.core.command.handler; import dev.sheldan.abstracto.core.command.CommandConstants; -import dev.sheldan.abstracto.core.command.handler.provided.AChanelParameterHandler; +import dev.sheldan.abstracto.core.command.handler.provided.AChannelParameterHandler; import dev.sheldan.abstracto.core.command.handler.provided.TextChannelParameterHandler; import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.TextChannel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class AChannelParameterHandlerImpl implements AChanelParameterHandler { +public class AChannelParameterHandlerImpl implements AChannelParameterHandler { @Autowired private TextChannelParameterHandler textChannelParameterHandler; @@ -19,6 +20,9 @@ public class AChannelParameterHandlerImpl implements AChanelParameterHandler { @Autowired private ChannelService channelService; + @Autowired + private ChannelManagementService channelManagementService; + @Override public boolean handles(Class clazz) { return clazz.equals(AChannel.class); @@ -27,7 +31,13 @@ public class AChannelParameterHandlerImpl implements AChanelParameterHandler { @Override public Object handle(String input, CommandParameterIterators iterators, Class clazz, Message context) { TextChannel textChannel = (TextChannel) textChannelParameterHandler.handle(input, iterators, clazz, context); - return channelService.getFakeChannelFromTextChannel(textChannel); + if(textChannel == null) { + Long channelId = Long.parseLong(input); + AChannel actualInstance = channelManagementService.loadChannel(channelId); + return AChannel.builder().fake(true).id(actualInstance.getId()).build(); + } else { + return channelService.getFakeChannelFromTextChannel(textChannel); + } } @Override diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/handler/AUserInAServerParameterHandlerImpl.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/handler/AUserInAServerParameterHandlerImpl.java new file mode 100644 index 000000000..ce4561929 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/handler/AUserInAServerParameterHandlerImpl.java @@ -0,0 +1,62 @@ +package dev.sheldan.abstracto.core.command.handler; + +import dev.sheldan.abstracto.core.command.CommandConstants; +import dev.sheldan.abstracto.core.command.handler.provided.AUserInAServerParameterHandler; +import dev.sheldan.abstracto.core.command.handler.provided.MemberParameterHandler; +import dev.sheldan.abstracto.core.exception.UserInServerNotFoundException; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.Message; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.concurrent.CompletableFuture; + +@Component +public class AUserInAServerParameterHandlerImpl implements AUserInAServerParameterHandler { + + @Autowired + private MemberParameterHandler memberParameterHandler; + + @Autowired + private UserInServerManagementService userInServerManagementService; + + @Override + public CompletableFuture handleAsync(String input, CommandParameterIterators iterators, Class clazz, Message context) { + CompletableFuture future = new CompletableFuture<>(); + memberParameterHandler.handleAsync(input, iterators, Member.class, context).whenComplete((o, throwable) -> { + try { + AUserInAServer actualInstance; + if (throwable == null) { + Member member = (Member) o; + actualInstance = userInServerManagementService.loadUser(member); + } else { + Long userId = Long.parseLong(input); + actualInstance = userInServerManagementService.loadAUserInAServerOptional(context.getGuild().getIdLong(), userId).orElseThrow(() -> new UserInServerNotFoundException(0L)); + } + future.complete(AUserInAServer.builder().userInServerId(actualInstance.getUserInServerId()).build()); + } catch (Exception e) { + // we need to do it like this, because when complete only returns the exception it got in case two exceptions happen + // so if the first exception happens in handleAsync, and we also throw one, it will _not_ get reported, because the other exception overshadows it + future.completeExceptionally(e); + } + }); + return future; + } + + @Override + public boolean handles(Class clazz) { + return clazz.equals(AUserInAServer.class); + } + + @Override + public boolean async() { + return true; + } + + @Override + public Integer getPriority() { + return CommandConstants.CORE_HANDLER_PRIORITY; + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/handler/ChannelGroupParameterHandlerImpl.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/handler/ChannelGroupParameterHandlerImpl.java new file mode 100644 index 000000000..e19a35a63 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/handler/ChannelGroupParameterHandlerImpl.java @@ -0,0 +1,51 @@ +package dev.sheldan.abstracto.core.command.handler; + +import dev.sheldan.abstracto.core.command.CommandConstants; +import dev.sheldan.abstracto.core.command.exception.ChannelGroupNotFoundException; +import dev.sheldan.abstracto.core.command.handler.provided.ChannelGroupParameterHandler; +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.ChannelGroupType; +import dev.sheldan.abstracto.core.service.management.ChannelGroupManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import net.dv8tion.jda.api.entities.Message; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class ChannelGroupParameterHandlerImpl implements ChannelGroupParameterHandler { + + @Autowired + private ChannelGroupManagementService channelGroupManagementService; + + @Autowired + private ServerManagementService serverManagementService; + + @Override + public Object handle(String input, CommandParameterIterators iterators, Class clazz, Message context) { + AServer server = serverManagementService.loadServer(context.getGuild().getIdLong()); + AChannelGroup actualInstance = channelGroupManagementService.findByNameAndServerOptional(input, server) + .orElseThrow(() -> new ChannelGroupNotFoundException(input, channelGroupManagementService.getAllAvailableAsString(server))); + ChannelGroupType channelGroupType = ChannelGroupType + .builder() + .id(actualInstance.getChannelGroupType().getId()) + .groupTypeKey(actualInstance.getChannelGroupType().getGroupTypeKey()) + .build(); + return AChannelGroup + .builder() + .id(actualInstance.getId()) + .groupName(actualInstance.getGroupName()) + .channelGroupType(channelGroupType) + .build(); + } + + @Override + public boolean handles(Class clazz) { + return clazz.equals(AChannelGroup.class); + } + + @Override + public Integer getPriority() { + return CommandConstants.CORE_HANDLER_PRIORITY; + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/handler/ChannelGroupTypeParameterHandlerImpl.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/handler/ChannelGroupTypeParameterHandlerImpl.java new file mode 100644 index 000000000..64fb52ad4 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/handler/ChannelGroupTypeParameterHandlerImpl.java @@ -0,0 +1,40 @@ +package dev.sheldan.abstracto.core.command.handler; + +import dev.sheldan.abstracto.core.command.CommandConstants; +import dev.sheldan.abstracto.core.command.handler.provided.ChannelGroupTypeParameterHandler; +import dev.sheldan.abstracto.core.models.database.ChannelGroupType; +import dev.sheldan.abstracto.core.service.management.ChannelGroupTypeManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import net.dv8tion.jda.api.entities.Message; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class ChannelGroupTypeParameterHandlerImpl implements ChannelGroupTypeParameterHandler { + + @Autowired + private ChannelGroupTypeManagementService channelGroupTypeManagementService; + + @Autowired + private ServerManagementService serverManagementService; + + @Override + public boolean handles(Class clazz) { + return clazz.equals(ChannelGroupType.class); + } + + @Override + public Object handle(String input, CommandParameterIterators iterators, Class clazz, Message context) { + ChannelGroupType actualGroupType = channelGroupTypeManagementService.findChannelGroupTypeByKey(input); + return ChannelGroupType + .builder() + .groupTypeKey(actualGroupType.getGroupTypeKey()) + .id(actualGroupType.getId()) + .build(); + } + + @Override + public Integer getPriority() { + return CommandConstants.CORE_HANDLER_PRIORITY; + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/service/CommandManager.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/service/CommandManager.java index cdc962622..748821658 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/service/CommandManager.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/service/CommandManager.java @@ -3,9 +3,9 @@ package dev.sheldan.abstracto.core.command.service; import dev.sheldan.abstracto.core.command.Command; import dev.sheldan.abstracto.core.command.config.ModuleInterface; import dev.sheldan.abstracto.core.command.exception.CommandNotFoundException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.config.CommandConfiguration; import dev.sheldan.abstracto.core.command.config.Parameter; +import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.UnParsedCommandParameter; import dev.sheldan.abstracto.core.service.ConfigService; import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService; diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/CreateChannelGroup.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/CreateChannelGroup.java index 760d369e1..76a2e201e 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/CreateChannelGroup.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/CreateChannelGroup.java @@ -8,7 +8,9 @@ import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.config.Parameter; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.command.config.features.CoreFeatures; +import dev.sheldan.abstracto.core.models.database.ChannelGroupType; import dev.sheldan.abstracto.core.service.ChannelGroupService; +import dev.sheldan.abstracto.core.service.management.ChannelGroupTypeManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -21,17 +23,24 @@ public class CreateChannelGroup extends AbstractConditionableCommand { @Autowired private ChannelGroupService channelGroupService; + @Autowired + private ChannelGroupTypeManagementService channelGroupTypeManagementService; + @Override public CommandResult execute(CommandContext commandContext) { - String groupName = (String) commandContext.getParameters().getParameters().get(0); - channelGroupService.createChannelGroup(groupName, commandContext.getGuild().getIdLong()); + List parameters = commandContext.getParameters().getParameters(); + String groupName = (String) parameters.get(0); + ChannelGroupType fakeChannelGroupType = (ChannelGroupType) parameters.get(1); + ChannelGroupType actualChannelGroupType = channelGroupTypeManagementService.findChannelGroupTypeByKey(fakeChannelGroupType.getGroupTypeKey()); + channelGroupService.createChannelGroup(groupName, commandContext.getGuild().getIdLong(), actualChannelGroupType); return CommandResult.fromSuccess(); } @Override public CommandConfiguration getConfiguration() { Parameter channelGroupName = Parameter.builder().name("name").type(String.class).templated(true).build(); - List parameters = Arrays.asList(channelGroupName); + Parameter channelGroupType = Parameter.builder().name("groupType").type(ChannelGroupType.class).templated(true).build(); + List parameters = Arrays.asList(channelGroupName, channelGroupType); List aliases = Arrays.asList("+ChGroup"); HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); return CommandConfiguration.builder() diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/ListChannelGroups.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/ListChannelGroups.java index f3360d4f7..e80918090 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/ListChannelGroups.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/ListChannelGroups.java @@ -65,6 +65,7 @@ public class ListChannelGroups extends AbstractConditionableCommand { ChannelGroupModel channelGroup = ChannelGroupModel .builder() .name(group.getGroupName()) + .typeKey(group.getChannelGroupType().getGroupTypeKey()) .channels(convertedChannels) .build(); converted.add(channelGroup); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/RemoveFromChannelGroup.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/RemoveFromChannelGroup.java index 524c99f7c..1a83b38c9 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/RemoveFromChannelGroup.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/RemoveFromChannelGroup.java @@ -8,8 +8,9 @@ import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.config.Parameter; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.command.config.features.CoreFeatures; +import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.service.ChannelGroupService; -import net.dv8tion.jda.api.entities.TextChannel; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -19,22 +20,25 @@ import java.util.List; @Component public class RemoveFromChannelGroup extends AbstractConditionableCommand { - @Autowired private ChannelGroupService channelGroupService; + @Autowired + private ChannelManagementService channelManagementService; + @Override public CommandResult execute(CommandContext commandContext) { String name = (String) commandContext.getParameters().getParameters().get(0); - TextChannel channel = (TextChannel) commandContext.getParameters().getParameters().get(1); - channelGroupService.removeChannelFromChannelGroup(name, channel); + AChannel fakeChannel = (AChannel) commandContext.getParameters().getParameters().get(1); + AChannel actualChannel = channelManagementService.loadChannel(fakeChannel.getId()); + channelGroupService.removeChannelFromChannelGroup(name, actualChannel); return CommandResult.fromSuccess(); } @Override public CommandConfiguration getConfiguration() { Parameter channelGroupName = Parameter.builder().name("name").type(String.class).build(); - Parameter channelToAdd = Parameter.builder().name("channel").type(TextChannel.class).build(); + Parameter channelToAdd = Parameter.builder().name("channel").type(AChannel.class).build(); List parameters = Arrays.asList(channelGroupName, channelToAdd); List aliases = Arrays.asList("rmChChgrp", "chGrpCh-"); HelpInfo helpInfo = HelpInfo.builder().templated(true).hasExample(true).build(); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableMode.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableMode.java index df99b35ac..eda8a94e2 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableMode.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableMode.java @@ -41,7 +41,6 @@ public class DisableMode extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); String featureName = (String) commandContext.getParameters().getParameters().get(0); String modeName = (String) commandContext.getParameters().getParameters().get(1); FeatureEnum featureEnum = featureConfigService.getFeatureEnum(featureName); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableMode.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableMode.java index bcd7fd324..de66f7552 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableMode.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableMode.java @@ -41,7 +41,6 @@ public class EnableMode extends AbstractConditionableCommand { @Override public CommandResult execute(CommandContext commandContext) { - checkParameters(commandContext); String featureName = (String) commandContext.getParameters().getParameters().get(0); String modeName = (String) commandContext.getParameters().getParameters().get(1); FeatureEnum featureEnum = featureConfigService.getFeatureEnum(featureName); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/FeatureModes.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/FeatureModes.java index de11df062..e53ca0157 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/FeatureModes.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/FeatureModes.java @@ -42,7 +42,6 @@ public class FeatureModes extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { - checkParameters(commandContext); List featureModes; if(commandContext.getParameters().getParameters().isEmpty()) { featureModes = featureModeService.getEffectiveFeatureModes(commandContext.getUserInitiatedContext().getServer()); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/config/CoreConfig.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/config/CoreConfig.java index f4499179f..1071c3159 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/config/CoreConfig.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/config/CoreConfig.java @@ -4,6 +4,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.jagrosh.jdautilities.commons.waiter.EventWaiter; import dev.sheldan.abstracto.core.service.BotService; +import okhttp3.OkHttpClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -36,4 +37,9 @@ public class CoreConfig { Executors.newScheduledThreadPool(threadCount); return new EventWaiter(scheduledExecutorService, true); } + + @Bean + public OkHttpClient client() { + return new OkHttpClient(); + } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/MessageDeletedListenerBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/MessageDeletedListenerBean.java index 04245893b..50abe527f 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/MessageDeletedListenerBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/MessageDeletedListenerBean.java @@ -2,7 +2,7 @@ package dev.sheldan.abstracto.core.listener; import dev.sheldan.abstracto.core.config.FeatureConfig; import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException; -import dev.sheldan.abstracto.core.exception.ChannelNotFoundException; +import dev.sheldan.abstracto.core.exception.ChannelNotInGuildException; import dev.sheldan.abstracto.core.models.AServerAChannelAUser; import dev.sheldan.abstracto.core.models.GuildChannelMember; import dev.sheldan.abstracto.core.models.cache.CachedMessage; @@ -82,7 +82,7 @@ public class MessageDeletedListenerBean extends ListenerAdapter { GuildChannelMember authorMember = GuildChannelMember .builder() .guild(botService.getGuildById(cachedMessage.getServerId())) - .textChannel(botService.getTextChannelFromServerOptional(cachedMessage.getServerId(), cachedMessage.getChannelId()).orElseThrow(() -> new ChannelNotFoundException(cachedMessage.getChannelId()))) + .textChannel(botService.getTextChannelFromServerOptional(cachedMessage.getServerId(), cachedMessage.getChannelId()).orElseThrow(() -> new ChannelNotInGuildException(cachedMessage.getChannelId()))) .member(botService.getMemberInServer(cachedMessage.getServerId(), cachedMessage.getAuthorId())) .build(); listener.forEach(messageDeletedListener -> { diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/MessageEmbeddedListenerBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/MessageEmbeddedListenerBean.java new file mode 100644 index 000000000..f770e5865 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/MessageEmbeddedListenerBean.java @@ -0,0 +1,84 @@ +package dev.sheldan.abstracto.core.listener; + +import dev.sheldan.abstracto.core.command.service.ExceptionService; +import dev.sheldan.abstracto.core.config.FeatureConfig; +import dev.sheldan.abstracto.core.models.listener.GuildMessageEmbedEventModel; +import dev.sheldan.abstracto.core.service.BotService; +import dev.sheldan.abstracto.core.service.FeatureConfigService; +import dev.sheldan.abstracto.core.service.FeatureFlagService; +import dev.sheldan.abstracto.core.service.MessageCache; +import lombok.extern.slf4j.Slf4j; +import net.dv8tion.jda.api.events.message.guild.GuildMessageEmbedEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; +import java.util.Comparator; +import java.util.List; + +@Component +@Slf4j +public class MessageEmbeddedListenerBean extends ListenerAdapter { + + @Autowired + private MessageCache messageCache; + + @Autowired + private List listenerList; + + @Autowired + private FeatureConfigService featureConfigService; + + @Autowired + private FeatureFlagService featureFlagService; + + @Autowired + private BotService botService; + + @Autowired + private ExceptionService exceptionService; + + @Autowired + private MessageEmbeddedListenerBean self; + + @Override + public void onGuildMessageEmbed(@NotNull GuildMessageEmbedEvent event) { + GuildMessageEmbedEventModel model = buildModel(event); + listenerList.forEach(messageReceivedListener -> { + try { + FeatureConfig feature = featureConfigService.getFeatureDisplayForFeature(messageReceivedListener.getFeature()); + if(!featureFlagService.isFeatureEnabled(feature, event.getGuild().getIdLong())) { + return; + } + self.executeIndividualGuildMessageReceivedListener(model, messageReceivedListener); + } catch (Exception e) { + log.error("Listener {} had exception when executing.", messageReceivedListener, e); + // exceptionService.reportExceptionToGuildMessageReceivedContext(e, event); + } + }); + } + + private GuildMessageEmbedEventModel buildModel(GuildMessageEmbedEvent event) { + return GuildMessageEmbedEventModel + .builder() + .channel(event.getChannel()) + .embeds(event.getMessageEmbeds()) + .messageId(event.getMessageIdLong()) + .build(); + } + + @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE) + public void executeIndividualGuildMessageReceivedListener(GuildMessageEmbedEventModel model, MessageEmbeddedListener messageReceivedListener) { + messageReceivedListener.execute(model); + } + + @PostConstruct + public void postConstruct() { + listenerList.sort(Comparator.comparing(Prioritized::getPriority).reversed()); + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/entity/ChannelGroupCreatedListenerManager.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/entity/ChannelGroupCreatedListenerManager.java new file mode 100644 index 000000000..313533575 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/entity/ChannelGroupCreatedListenerManager.java @@ -0,0 +1,23 @@ +package dev.sheldan.abstracto.core.listener.entity; + +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class ChannelGroupCreatedListenerManager { + @Autowired + private List listener; + + @Autowired + private ChannelGroupCreatedListenerManager self; + + public void executeListener(AChannelGroup createdGroup){ + listener.forEach(channelGroupCreatedListener -> + channelGroupCreatedListener.channelGroupCreated(createdGroup) + ); + } + +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/entity/ChannelGroupDeletedListenerManager.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/entity/ChannelGroupDeletedListenerManager.java new file mode 100644 index 000000000..229067434 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/entity/ChannelGroupDeletedListenerManager.java @@ -0,0 +1,20 @@ +package dev.sheldan.abstracto.core.listener.entity; + +import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class ChannelGroupDeletedListenerManager { + @Autowired + private List listener; + + public void executeListener(AChannelGroup createdGroup){ + listener.forEach(channelGroupCreatedListener -> + channelGroupCreatedListener.channelGroupDeleted(createdGroup) + ); + } + +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/repository/ChannelGroupRepository.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/repository/ChannelGroupRepository.java index 8c71d4053..be770360a 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/repository/ChannelGroupRepository.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/repository/ChannelGroupRepository.java @@ -1,5 +1,6 @@ package dev.sheldan.abstracto.core.repository; +import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AChannelGroup; import dev.sheldan.abstracto.core.models.database.AServer; import org.springframework.data.jpa.repository.JpaRepository; @@ -7,15 +8,24 @@ import org.springframework.data.jpa.repository.QueryHints; import javax.persistence.QueryHint; import java.util.List; +import java.util.Optional; public interface ChannelGroupRepository extends JpaRepository { @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) - AChannelGroup findByGroupNameAndServer(String name, AServer server); + Optional findByGroupNameAndServer(String name, AServer server); + + @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) + Optional findByGroupNameAndServerAndChannelGroupType_GroupTypeKey(String name, AServer server, String groupTyeKey); + + @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) + List findByServerAndChannelGroupType_GroupTypeKey(AServer server, String groupTyeKey); @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) List findByServer(AServer server); @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) boolean existsByGroupNameAndServer(String name, AServer server); + + List findAllByChannels(AChannel channel); } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/repository/ChannelGroupTypeRepository.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/repository/ChannelGroupTypeRepository.java new file mode 100644 index 000000000..1fe304c6c --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/repository/ChannelGroupTypeRepository.java @@ -0,0 +1,12 @@ +package dev.sheldan.abstracto.core.repository; + +import dev.sheldan.abstracto.core.models.database.ChannelGroupType; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface ChannelGroupTypeRepository extends JpaRepository { + Optional findByGroupTypeKey(String key); +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/repository/UserInServerRepository.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/repository/UserInServerRepository.java index dd050d1d1..b176697d1 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/repository/UserInServerRepository.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/repository/UserInServerRepository.java @@ -9,12 +9,13 @@ import org.springframework.stereotype.Repository; import javax.persistence.QueryHint; import java.util.List; +import java.util.Optional; @Repository public interface UserInServerRepository extends JpaRepository { @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) - AUserInAServer findByServerReferenceAndUserReference(AServer serverId, AUser userId); + Optional findByServerReferenceAndUserReference(AServer serverId, AUser userId); @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) boolean existsByServerReferenceAndUserReference(AServer server, AUser user); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/BotServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/BotServiceBean.java index 83c39f42c..aa63cb034 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/BotServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/BotServiceBean.java @@ -1,6 +1,6 @@ package dev.sheldan.abstracto.core.service; -import dev.sheldan.abstracto.core.exception.ChannelNotFoundException; +import dev.sheldan.abstracto.core.exception.ChannelNotInGuildException; import dev.sheldan.abstracto.core.exception.GuildNotFoundException; import dev.sheldan.abstracto.core.models.GuildChannelMember; import dev.sheldan.abstracto.core.models.database.AEmote; @@ -57,7 +57,7 @@ public class BotServiceBean implements BotService { Member member = guild.getMemberById(userId); return GuildChannelMember.builder().guild(guild).textChannel(textChannel).member(member).build(); } else { - throw new ChannelNotFoundException(channelId); + throw new ChannelNotInGuildException(channelId); } } @@ -182,7 +182,12 @@ public class BotServiceBean implements BotService { @Override public TextChannel getTextChannelFromServer(Guild guild, Long textChannelId) { - return getTextChannelFromServerOptional(guild, textChannelId).orElseThrow(() -> new ChannelNotFoundException(textChannelId)); + return getTextChannelFromServerOptional(guild, textChannelId).orElseThrow(() -> new ChannelNotInGuildException(textChannelId)); + } + + @Override + public TextChannel getTextChannelFromServerNullable(Guild guild, Long textChannelId) { + return getTextChannelFromServerOptional(guild, textChannelId).orElse(null); } @Override @@ -197,7 +202,7 @@ public class BotServiceBean implements BotService { @Override public TextChannel getTextChannelFromServer(Long serverId, Long textChannelId) { - return getTextChannelFromServerOptional(serverId, textChannelId).orElseThrow(() -> new ChannelNotFoundException(textChannelId)); + return getTextChannelFromServerOptional(serverId, textChannelId).orElseThrow(() -> new ChannelNotInGuildException(textChannelId)); } @Override @@ -217,6 +222,6 @@ public class BotServiceBean implements BotService { @Override public Member getBotInGuild(AServer server) { Guild guild = getGuildById(server.getId()); - return guild.getMemberById(instance.getSelfUser().getId()); + return guild.getSelfMember(); } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelGroupServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelGroupServiceBean.java index 3068a265f..fdf275a56 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelGroupServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelGroupServiceBean.java @@ -8,6 +8,7 @@ import dev.sheldan.abstracto.core.command.service.management.CommandManagementSe import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AChannelGroup; import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.ChannelGroupType; import dev.sheldan.abstracto.core.service.management.ChannelGroupManagementService; import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.core.service.management.ServerManagementService; @@ -15,6 +16,9 @@ import net.dv8tion.jda.api.entities.TextChannel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.List; +import java.util.stream.Collectors; + @Component public class ChannelGroupServiceBean implements ChannelGroupService { @@ -33,10 +37,11 @@ public class ChannelGroupServiceBean implements ChannelGroupService { @Autowired private ServerManagementService serverManagementService; + @Override - public AChannelGroup createChannelGroup(String name, Long serverId) { + public AChannelGroup createChannelGroup(String name, Long serverId, ChannelGroupType channelGroupType) { AServer server = serverManagementService.loadOrCreate(serverId); - return channelGroupManagementService.createChannelGroup(name, server); + return channelGroupManagementService.createChannelGroup(name, server, channelGroupType); } @Override @@ -120,4 +125,13 @@ public class ChannelGroupServiceBean implements ChannelGroupService { AServer server = serverManagementService.loadOrCreate(serverId); return channelGroupManagementService.findByNameAndServer(groupName, server) != null; } + + @Override + public List getChannelGroupsOfChannelWithType(AChannel channel, String groupTypeKey) { + List channelGroups = channelGroupManagementService.getAllChannelGroupsOfChannel(channel); + return channelGroups + .stream() + .filter(aChannelGroup -> aChannelGroup.getChannelGroupType().getGroupTypeKey().equals(groupTypeKey)) + .collect(Collectors.toList()); + } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java index fdfffef70..e0e689282 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java @@ -1,7 +1,7 @@ package dev.sheldan.abstracto.core.service; import dev.sheldan.abstracto.core.exception.CategoryNotFoundException; -import dev.sheldan.abstracto.core.exception.ChannelNotFoundException; +import dev.sheldan.abstracto.core.exception.ChannelNotInGuildException; import dev.sheldan.abstracto.core.exception.GuildNotFoundException; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.templating.model.MessageToSend; @@ -50,7 +50,7 @@ public class ChannelServiceBean implements ChannelService { return sendTextToChannel(text, textChannel); } else { log.error("Channel {} to post towards was not found in server {}", channel.getId(), channel.getServer().getId()); - throw new ChannelNotFoundException(channel.getId()); + throw new ChannelNotInGuildException(channel.getId()); } } else { log.error("Guild {} was not found when trying to post a message", channel.getServer().getId()); @@ -65,7 +65,7 @@ public class ChannelServiceBean implements ChannelService { TextChannel textChannel = textChannelOpt.get(); return sendMessageToChannel(message, textChannel); } - throw new ChannelNotFoundException(channel.getId()); + throw new ChannelNotInGuildException(channel.getId()); } @Override @@ -90,7 +90,7 @@ public class ChannelServiceBean implements ChannelService { return sendEmbedToChannel(embed, textChannel); } else { log.error("Channel {} to post towards was not found in server {}", channel.getId(), channel.getServer().getId()); - throw new ChannelNotFoundException(channel.getId()); + throw new ChannelNotInGuildException(channel.getId()); } } else { log.error("Guild {} was not found when trying to post a message", channel.getServer().getId()); @@ -115,7 +115,7 @@ public class ChannelServiceBean implements ChannelService { if(textChannelFromServer.isPresent()) { return sendMessageToSendToChannel(messageToSend, textChannelFromServer.get()); } - throw new ChannelNotFoundException(channel.getId()); + throw new ChannelNotInGuildException(channel.getId()); } @Override @@ -166,7 +166,7 @@ public class ChannelServiceBean implements ChannelService { TextChannel textChannel = textChannelFromServer.get(); editMessageInAChannel(messageToSend, textChannel, messageId); } else { - throw new ChannelNotFoundException(channel.getId()); + throw new ChannelNotInGuildException(channel.getId()); } } @@ -244,7 +244,7 @@ public class ChannelServiceBean implements ChannelService { log.info("Deleting channel {} on server {}.", channelId, serverId); return textChannelById.delete().submit(); } - throw new ChannelNotFoundException(channelId); + throw new ChannelNotInGuildException(channelId); } @Override diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureSetupServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureSetupServiceBean.java index d411f6dfb..4aaa663b6 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureSetupServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureSetupServiceBean.java @@ -1,7 +1,7 @@ package dev.sheldan.abstracto.core.service; import dev.sheldan.abstracto.core.command.service.ExceptionService; -import dev.sheldan.abstracto.core.exception.ChannelNotFoundException; +import dev.sheldan.abstracto.core.exception.ChannelNotInGuildException; import dev.sheldan.abstracto.core.interactive.DelayedActionConfig; import dev.sheldan.abstracto.core.config.FeatureConfig; import dev.sheldan.abstracto.core.interactive.*; @@ -106,7 +106,7 @@ public class FeatureSetupServiceBean implements FeatureSetupService { channelService.sendTextToChannel(text, textChannel); return executeFeatureSetup(featureConfig, steps, user, new ArrayList<>()); } - throw new ChannelNotFoundException(user.getChannelId()); + throw new ChannelNotInGuildException(user.getChannelId()); } @Override diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/HashServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/HashServiceBean.java new file mode 100644 index 000000000..4d6cc01df --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/HashServiceBean.java @@ -0,0 +1,22 @@ +package dev.sheldan.abstracto.core.service; + +import com.google.common.hash.Hashing; +import com.google.common.io.Files; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +@Component +public class HashServiceBean implements HashService { + @Override + public String sha256HashFileContent(File file) throws IOException { + return Files.asByteSource(file).hash(Hashing.sha256()).toString(); + } + + @Override + public String sha256HashString(String text) { + return Hashing.sha256().hashString(text, StandardCharsets.UTF_8).toString(); + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/HttpServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/HttpServiceBean.java new file mode 100644 index 000000000..b5dbc0bd7 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/HttpServiceBean.java @@ -0,0 +1,31 @@ +package dev.sheldan.abstracto.core.service; + + +import dev.sheldan.abstracto.core.utils.FileUtils; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.IOException; + +@Component +public class HttpServiceBean implements HttpService { + + @Autowired + private OkHttpClient client; + + @Autowired + private FileUtils fileUtils; + + @Override + public File downloadFileToTempFile(String url) throws IOException { + Request request = new Request.Builder().url(url).get().build(); + File tempFile = fileUtils.createTempFile(Math.random() + ""); + Response execute = client.newCall(request).execute(); + fileUtils.writeBytesToFile(tempFile, execute.body().bytes()); + return tempFile; + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/MessageCacheBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/MessageCacheBean.java index 8882d2ff7..fb189708f 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/MessageCacheBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/MessageCacheBean.java @@ -1,6 +1,6 @@ package dev.sheldan.abstracto.core.service; -import dev.sheldan.abstracto.core.exception.ChannelNotFoundException; +import dev.sheldan.abstracto.core.exception.ChannelNotInGuildException; import dev.sheldan.abstracto.core.exception.GuildNotFoundException; import dev.sheldan.abstracto.core.models.cache.CachedMessage; import dev.sheldan.abstracto.core.models.cache.CachedReaction; @@ -94,7 +94,7 @@ public class MessageCacheBean implements MessageCache { ); } else { log.error("Not able to load message {} in channel {} in guild {}. Text channel not found.", messageId, textChannelId, guildId); - future.completeExceptionally(new ChannelNotFoundException(textChannelId)); + future.completeExceptionally(new ChannelNotInGuildException(textChannelId)); } } else { log.error("Not able to load message {} in channel {} in guild {}. Guild not found.", messageId, textChannelId, guildId); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/MessageServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/MessageServiceBean.java index c83a49d90..122d5ebf9 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/MessageServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/MessageServiceBean.java @@ -46,6 +46,16 @@ public class MessageServiceBean implements MessageService { addReactionToMessageWithFuture(emoteKey, serverId, message); } + @Override + public void addDefaultReactionToMessage(String unicode, Message message) { + addDefaultReactionToMessageAsync(unicode, message); + } + + @Override + public CompletableFuture addDefaultReactionToMessageAsync(String unicode, Message message) { + return message.addReaction(unicode).submit(); + } + @Override public CompletableFuture addReactionToMessageWithFuture(String emoteKey, Long serverId, Message message) { Guild guild = botService.getGuildById(serverId); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PostTargetServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PostTargetServiceBean.java index f12964a21..9a9e90a3f 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PostTargetServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PostTargetServiceBean.java @@ -2,10 +2,7 @@ package dev.sheldan.abstracto.core.service; import dev.sheldan.abstracto.core.config.FeatureConfig; import dev.sheldan.abstracto.core.config.PostTargetEnum; -import dev.sheldan.abstracto.core.exception.ChannelNotFoundException; -import dev.sheldan.abstracto.core.exception.GuildNotFoundException; -import dev.sheldan.abstracto.core.exception.PostTargetNotFoundException; -import dev.sheldan.abstracto.core.exception.PostTargetNotValidException; +import dev.sheldan.abstracto.core.exception.*; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.management.DefaultPostTargetManagementService; import dev.sheldan.abstracto.core.service.management.PostTargetManagement; @@ -70,7 +67,7 @@ public class PostTargetServiceBean implements PostTargetService { } else { log.error("Incorrect post target configuration: {} points to {} on server {}", target.getName(), target.getChannelReference().getId(), target.getServerReference().getId()); - throw new ChannelNotFoundException(target.getChannelReference().getId()); + throw new ChannelNotInGuildException(target.getChannelReference().getId()); } } else { throw new GuildNotFoundException(target.getServerReference().getId()); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupManagementServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupManagementServiceBean.java index 035b74e20..ad5886e0d 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupManagementServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupManagementServiceBean.java @@ -4,15 +4,19 @@ import dev.sheldan.abstracto.core.command.exception.ChannelAlreadyInChannelGroup import dev.sheldan.abstracto.core.command.exception.ChannelGroupExistsException; import dev.sheldan.abstracto.core.command.exception.ChannelGroupNotFoundException; import dev.sheldan.abstracto.core.command.exception.ChannelNotInChannelGroupException; +import dev.sheldan.abstracto.core.listener.entity.ChannelGroupCreatedListenerManager; +import dev.sheldan.abstracto.core.listener.entity.ChannelGroupDeletedListenerManager; import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AChannelGroup; import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.ChannelGroupType; import dev.sheldan.abstracto.core.repository.ChannelGroupRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; +import java.util.Optional; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -26,8 +30,14 @@ public class ChannelGroupManagementServiceBean implements ChannelGroupManagement @Autowired private ServerManagementService serverManagementService; + @Autowired + private ChannelGroupDeletedListenerManager deletedListenerManager; + + @Autowired + private ChannelGroupCreatedListenerManager createdListenerManager; + @Override - public AChannelGroup createChannelGroup(String name, AServer server) { + public AChannelGroup createChannelGroup(String name, AServer server, ChannelGroupType channelGroupType) { name = name.toLowerCase(); if(doesChannelGroupExist(name, server)) { throw new ChannelGroupExistsException(name); @@ -35,10 +45,12 @@ public class ChannelGroupManagementServiceBean implements ChannelGroupManagement AChannelGroup channelGroup = AChannelGroup .builder() .groupName(name) + .channelGroupType(channelGroupType) .server(server) .build(); log.info("Creating new channel group in server {}.", server.getId()); channelGroupRepository.save(channelGroup); + createdListenerManager.executeListener(channelGroup); return channelGroup; } @@ -55,6 +67,7 @@ public class ChannelGroupManagementServiceBean implements ChannelGroupManagement throw new ChannelGroupNotFoundException(name, getAllAvailableAsString(server)); } log.info("Deleting channel group {} in server {}.", existing.getId(), server.getId()); + deletedListenerManager.executeListener(existing); channelGroupRepository.delete(existing); } @@ -83,10 +96,26 @@ public class ChannelGroupManagementServiceBean implements ChannelGroupManagement @Override public AChannelGroup findByNameAndServer(String name, AServer server) { - name = name.toLowerCase(); + String lowerCaseName = name.toLowerCase(); + return channelGroupRepository.findByGroupNameAndServer(lowerCaseName, server) + .orElseThrow(() -> new ChannelGroupNotFoundException(name, getAllAvailableAsString(server))); + } + + @Override + public Optional findByNameAndServerOptional(String name, AServer server) { return channelGroupRepository.findByGroupNameAndServer(name, server); } + @Override + public AChannelGroup findByNameAndServerAndType(String name, AServer server, String expectedType) { + String lowerName = name.toLowerCase(); + Optional channelOptional = channelGroupRepository.findByGroupNameAndServerAndChannelGroupType_GroupTypeKey(lowerName, server, expectedType); + return channelOptional.orElseThrow( () -> { + List channelGroupNames = extractChannelGroupNames(findAllInServerWithType(server.getId(), expectedType)); + return new ChannelGroupNotFoundException(name.toLowerCase(), channelGroupNames); + }); + } + @Override public List findAllInServer(AServer server) { return channelGroupRepository.findByServer(server); @@ -94,7 +123,12 @@ public class ChannelGroupManagementServiceBean implements ChannelGroupManagement @Override public List getAllAvailableAsString(AServer server) { - return findAllInServer(server).stream().map(AChannelGroup::getGroupName).collect(Collectors.toList()); + List allInServer = findAllInServer(server); + return extractChannelGroupNames(allInServer); + } + + private List extractChannelGroupNames(List allInServer) { + return allInServer.stream().map(AChannelGroup::getGroupName).collect(Collectors.toList()); } @Override @@ -102,4 +136,15 @@ public class ChannelGroupManagementServiceBean implements ChannelGroupManagement AServer server = serverManagementService.loadOrCreate(serverId); return findAllInServer(server); } + + @Override + public List getAllChannelGroupsOfChannel(AChannel channel) { + return channelGroupRepository.findAllByChannels(channel); + } + + @Override + public List findAllInServerWithType(Long serverId, String type) { + AServer server = serverManagementService.loadServer(serverId); + return channelGroupRepository.findByServerAndChannelGroupType_GroupTypeKey(server, type); + } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupTypeManagementServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupTypeManagementServiceBean.java new file mode 100644 index 000000000..2979845eb --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupTypeManagementServiceBean.java @@ -0,0 +1,43 @@ +package dev.sheldan.abstracto.core.service.management; + +import dev.sheldan.abstracto.core.exception.ChannelGroupTypeNotFound; +import dev.sheldan.abstracto.core.models.database.ChannelGroupType; +import dev.sheldan.abstracto.core.repository.ChannelGroupTypeRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Component +public class ChannelGroupTypeManagementServiceBean implements ChannelGroupTypeManagementService { + + @Autowired + private ChannelGroupTypeRepository repository; + + @Override + public Optional findChannelGroupTypeByKeyOptional(String key) { + return repository.findByGroupTypeKey(key); + } + + @Override + public ChannelGroupType findChannelGroupTypeByKey(String key) { + return findChannelGroupTypeByKeyOptional(key).orElseThrow(() -> new ChannelGroupTypeNotFound(getAllChannelGroupTypesAsString())); + } + + @Override + public boolean doesChannelGroupTypeExist(String key) { + return findChannelGroupTypeByKeyOptional(key).isPresent(); + } + + @Override + public List getAllChannelGroupTypes() { + return repository.findAll(); + } + + @Override + public List getAllChannelGroupTypesAsString() { + return getAllChannelGroupTypes().stream().map(ChannelGroupType::getGroupTypeKey).collect(Collectors.toList()); + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/UserInServerManagementServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/UserInServerManagementServiceBean.java index 162d52cec..331ac51f5 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/UserInServerManagementServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/UserInServerManagementServiceBean.java @@ -37,7 +37,7 @@ public class UserInServerManagementServiceBean implements UserInServerManagement @Override public AUserInAServer loadUser(AServer server, AUser user) { if(userInServerRepository.existsByServerReferenceAndUserReference(server, user)) { - return userInServerRepository.findByServerReferenceAndUserReference(server, user); + return userInServerRepository.findByServerReferenceAndUserReference(server, user).orElseThrow(() -> new UserInServerNotFoundException(0L)); } else { return this.createUserInServer(server.getId(), user.getId()); } @@ -76,4 +76,11 @@ public class UserInServerManagementServiceBean implements UserInServerManagement AUser user = userManagementService.loadUser(userId); return userInServerRepository.findByUserReference(user); } + + @Override + public Optional loadAUserInAServerOptional(Long serverId, Long userId) { + AUser user = userManagementService.loadUser(userId); + AServer server = serverManagementService.loadServer(serverId); + return userInServerRepository.findByServerReferenceAndUserReference(server, user); + } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/UserManagementServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/UserManagementServiceBean.java index c5325acfb..a97e021c4 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/UserManagementServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/UserManagementServiceBean.java @@ -31,7 +31,12 @@ public class UserManagementServiceBean implements UserManagementService { @Override public AUser loadUser(Long userId) { - Optional optional = userRepository.findById(userId); + Optional optional = loadUserOptional(userId); return optional.orElseGet(() -> this.createUser(userId)); } + + @Override + public Optional loadUserOptional(Long userId) { + return userRepository.findById(userId); + } } diff --git a/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/channel_group.xml b/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/channel_group.xml index 5cd9eb25a..0ebcc9c57 100644 --- a/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/channel_group.xml +++ b/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/channel_group.xml @@ -13,11 +13,19 @@ - + + + + + + + + + @@ -51,9 +59,6 @@ - - - diff --git a/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/channel_group_type.xml b/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/channel_group_type.xml new file mode 100644 index 000000000..5fb51d943 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/channel_group_type.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/tables.xml b/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/tables.xml index 4cdf817f8..70565e44d 100644 --- a/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/tables.xml +++ b/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/tables.xml @@ -17,6 +17,7 @@ + diff --git a/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/commands/config/features/DisableFeatureModeTest.java b/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/commands/config/features/DisableFeatureModeTest.java index 1fb5496e9..5d4eaa982 100644 --- a/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/commands/config/features/DisableFeatureModeTest.java +++ b/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/commands/config/features/DisableFeatureModeTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.core.commands.config.features; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.config.FeatureEnum; @@ -10,6 +8,7 @@ import dev.sheldan.abstracto.core.exception.FeatureModeNotFoundException; import dev.sheldan.abstracto.core.exception.FeatureNotFoundException; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureModeService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import org.junit.Test; import org.junit.runner.RunWith; @@ -35,16 +34,6 @@ public class DisableFeatureModeTest { @Mock private FeatureModeService featureModeService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTest(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void testExecuteDisable() { String featureName = "text"; @@ -79,4 +68,10 @@ public class DisableFeatureModeTest { testUnit.execute(context); } + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + + } \ No newline at end of file diff --git a/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/commands/config/features/EnableFeatureModeTest.java b/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/commands/config/features/EnableFeatureModeTest.java index 1a1bac107..de96a1073 100644 --- a/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/commands/config/features/EnableFeatureModeTest.java +++ b/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/commands/config/features/EnableFeatureModeTest.java @@ -1,7 +1,5 @@ package dev.sheldan.abstracto.core.commands.config.features; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; -import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.config.FeatureEnum; @@ -10,6 +8,7 @@ import dev.sheldan.abstracto.core.exception.FeatureModeNotFoundException; import dev.sheldan.abstracto.core.exception.FeatureNotFoundException; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureModeService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import org.junit.Test; import org.junit.runner.RunWith; @@ -37,16 +36,6 @@ public class EnableFeatureModeTest { @Mock private FeatureModeService featureModeService; - @Test(expected = InsufficientParametersException.class) - public void testTooLittleParameters() { - CommandTestUtilities.executeNoParametersTest(testUnit); - } - - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTest(testUnit); - } - @Test public void testExecuteDisable() { String featureName = "text"; @@ -80,4 +69,10 @@ public class EnableFeatureModeTest { CommandContext context = CommandTestUtilities.getWithParameters(Arrays.asList(featureName, modeName)); testUnit.execute(context); } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + } \ No newline at end of file diff --git a/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/commands/config/features/FeatureModesTest.java b/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/commands/config/features/FeatureModesTest.java index ee63943a8..98fcd2ea8 100644 --- a/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/commands/config/features/FeatureModesTest.java +++ b/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/commands/config/features/FeatureModesTest.java @@ -1,6 +1,5 @@ package dev.sheldan.abstracto.core.commands.config.features; -import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeException; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.service.management.FeatureManagementService; @@ -12,6 +11,7 @@ import dev.sheldan.abstracto.core.models.template.commands.FeatureModesModel; import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureModeService; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import org.junit.Assert; import org.junit.Test; @@ -51,11 +51,6 @@ public class FeatureModesTest { private static final String FEATURE_NAME = "feature"; - @Test(expected = IncorrectParameterTypeException.class) - public void testIncorrectParameterType() { - CommandTestUtilities.executeWrongParametersTestAsync(testUnit); - } - @Test public void testExecuteNoParameters() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); @@ -96,4 +91,10 @@ public class FeatureModesTest { CommandContext context = CommandTestUtilities.getWithParameters(Arrays.asList(FEATURE_NAME)); testUnit.executeAsync(context); } + + @Test + public void validateCommand() { + CommandConfigValidator.validateCommandConfiguration(testUnit.getConfiguration()); + } + } \ No newline at end of file diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/CommandParameterHandler.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/CommandParameterHandler.java index 8934d5ea9..2b1c6fac6 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/CommandParameterHandler.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/CommandParameterHandler.java @@ -9,6 +9,6 @@ public interface CommandParameterHandler { boolean handles(Class clazz); default boolean async() { return false; } default Object handle(String input, CommandParameterIterators iterators, Class clazz, Message context) { return new Object();} - default CompletableFuture handleAsync(String input, CommandParameterIterators iterators, Class clazz, Message context) { return CompletableFuture.completedFuture(null); } + default CompletableFuture handleAsync(String input, CommandParameterIterators iterators, Class clazz, Message context) { return CompletableFuture.completedFuture(null); } Integer getPriority(); } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/AChanelParameterHandler.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/AChannelParameterHandler.java similarity index 64% rename from abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/AChanelParameterHandler.java rename to abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/AChannelParameterHandler.java index 91656058e..ed4ea276d 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/AChanelParameterHandler.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/AChannelParameterHandler.java @@ -2,5 +2,5 @@ package dev.sheldan.abstracto.core.command.handler.provided; import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler; -public interface AChanelParameterHandler extends CommandParameterHandler { +public interface AChannelParameterHandler extends CommandParameterHandler { } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/AUserInAServerParameterHandler.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/AUserInAServerParameterHandler.java new file mode 100644 index 000000000..7f4d09f10 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/AUserInAServerParameterHandler.java @@ -0,0 +1,6 @@ +package dev.sheldan.abstracto.core.command.handler.provided; + +import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler; + +public interface AUserInAServerParameterHandler extends CommandParameterHandler { +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/ChannelGroupParameterHandler.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/ChannelGroupParameterHandler.java new file mode 100644 index 000000000..1e7774666 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/ChannelGroupParameterHandler.java @@ -0,0 +1,6 @@ +package dev.sheldan.abstracto.core.command.handler.provided; + +import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler; + +public interface ChannelGroupParameterHandler extends CommandParameterHandler { +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/ChannelGroupTypeParameterHandler.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/ChannelGroupTypeParameterHandler.java new file mode 100644 index 000000000..41b523eb4 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/handler/provided/ChannelGroupTypeParameterHandler.java @@ -0,0 +1,6 @@ +package dev.sheldan.abstracto.core.command.handler.provided; + +import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler; + +public interface ChannelGroupTypeParameterHandler extends CommandParameterHandler { +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/ChannelGroupTypeNotFound.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/ChannelGroupTypeNotFound.java new file mode 100644 index 000000000..8be851ac7 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/ChannelGroupTypeNotFound.java @@ -0,0 +1,25 @@ +package dev.sheldan.abstracto.core.exception; + +import dev.sheldan.abstracto.core.models.exception.ChannelGroupTypeNotFoundExceptionModel; +import dev.sheldan.abstracto.templating.Templatable; + +import java.util.List; + +public class ChannelGroupTypeNotFound extends AbstractoRunTimeException implements Templatable { + + private final ChannelGroupTypeNotFoundExceptionModel model; + + public ChannelGroupTypeNotFound(List channelGroupTypeKeys) { + this.model = ChannelGroupTypeNotFoundExceptionModel.builder().availableGroupTypeKeys(channelGroupTypeKeys).build(); + } + + @Override + public String getTemplateName() { + return "channel_group_type_not_found_exception"; + } + + @Override + public Object getTemplateModel() { + return this.model; + } +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/ChannelNotInGuildException.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/ChannelNotInGuildException.java new file mode 100644 index 000000000..8e16d1cee --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/ChannelNotInGuildException.java @@ -0,0 +1,24 @@ +package dev.sheldan.abstracto.core.exception; + +import dev.sheldan.abstracto.core.models.exception.ChannelNotFoundExceptionModel; +import dev.sheldan.abstracto.templating.Templatable; + +public class ChannelNotInGuildException extends AbstractoRunTimeException implements Templatable { + + private final ChannelNotFoundExceptionModel model; + + public ChannelNotInGuildException(Long channelId) { + super("Channel not found in guild"); + this.model = ChannelNotFoundExceptionModel.builder().channelId(channelId).build(); + } + + @Override + public String getTemplateName() { + return "channel_not_in_guild_exception"; + } + + @Override + public Object getTemplateModel() { + return model; + } +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/listener/MessageEmbeddedListener.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/listener/MessageEmbeddedListener.java new file mode 100644 index 000000000..9e49b0d47 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/listener/MessageEmbeddedListener.java @@ -0,0 +1,7 @@ +package dev.sheldan.abstracto.core.listener; + +import dev.sheldan.abstracto.core.models.listener.GuildMessageEmbedEventModel; + +public interface MessageEmbeddedListener extends FeatureAware, Prioritized { + void execute(GuildMessageEmbedEventModel eventModel); +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/listener/entity/ChannelGroupCreatedListener.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/listener/entity/ChannelGroupCreatedListener.java new file mode 100644 index 000000000..92ed71101 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/listener/entity/ChannelGroupCreatedListener.java @@ -0,0 +1,7 @@ +package dev.sheldan.abstracto.core.listener.entity; + +import dev.sheldan.abstracto.core.models.database.AChannelGroup; + +public interface ChannelGroupCreatedListener { + void channelGroupCreated(AChannelGroup channelGroup); +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/listener/entity/ChannelGroupDeletedListener.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/listener/entity/ChannelGroupDeletedListener.java new file mode 100644 index 000000000..7374804b0 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/listener/entity/ChannelGroupDeletedListener.java @@ -0,0 +1,7 @@ +package dev.sheldan.abstracto.core.listener.entity; + +import dev.sheldan.abstracto.core.models.database.AChannelGroup; + +public interface ChannelGroupDeletedListener { + void channelGroupDeleted(AChannelGroup channelGroup); +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/FullChannel.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/FullChannel.java new file mode 100644 index 000000000..633eba56f --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/FullChannel.java @@ -0,0 +1,25 @@ +package dev.sheldan.abstracto.core.models; + +import dev.sheldan.abstracto.core.models.database.AChannel; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import net.dv8tion.jda.api.entities.TextChannel; + +import java.io.Serializable; + +@Getter +@Setter +@Builder +public class FullChannel implements Serializable { + private AChannel channel; + private transient TextChannel serverChannel; + + public String getChannelRepr() { + if(serverChannel != null) { + return serverChannel.getAsMention(); + } else { + return channel.getId().toString(); + } + } +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/AChannelGroup.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/AChannelGroup.java index 6dbac2924..a52946d68 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/AChannelGroup.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/AChannelGroup.java @@ -9,7 +9,7 @@ import java.time.Instant; import java.util.List; @Entity -@Table(name="channelGroup") +@Table(name="channel_group") @Builder @AllArgsConstructor @NoArgsConstructor @@ -28,11 +28,15 @@ public class AChannelGroup implements Serializable { private String groupName; @ManyToOne(fetch = FetchType.LAZY) - @Getter @Setter - @JoinColumn(name = "group_server", nullable = false) + @JoinColumn(name = "server_id", nullable = false) private AServer server; + @ManyToOne(fetch = FetchType.LAZY) + @Setter + @JoinColumn(name = "group_type_id") + private ChannelGroupType channelGroupType; + @Column(name = "created") private Instant created; diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/AUserInAServer.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/AUserInAServer.java index 53a59c01d..be348e1c3 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/AUserInAServer.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/AUserInAServer.java @@ -21,6 +21,7 @@ public class AUserInAServer implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "user_in_server_id") private Long userInServerId; @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/ChannelGroupType.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/ChannelGroupType.java new file mode 100644 index 000000000..9e87a9773 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/ChannelGroupType.java @@ -0,0 +1,27 @@ +package dev.sheldan.abstracto.core.models.database; + +import lombok.*; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +import javax.persistence.*; + +@Entity +@Table(name = "channel_group_type") +@Getter +@Builder +@Setter +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode +@Cacheable +@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class ChannelGroupType { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Integer id; + + @Column(name = "group_type_key") + private String groupTypeKey; +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/exception/ChannelGroupTypeNotFoundExceptionModel.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/exception/ChannelGroupTypeNotFoundExceptionModel.java new file mode 100644 index 000000000..ec79ad5f7 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/exception/ChannelGroupTypeNotFoundExceptionModel.java @@ -0,0 +1,17 @@ +package dev.sheldan.abstracto.core.models.exception; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@Setter +@Getter +@Builder +public class ChannelGroupTypeNotFoundExceptionModel implements Serializable { + @Builder.Default + private List availableGroupTypeKeys = new ArrayList<>(); +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/listener/GuildMessageEmbedEventModel.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/listener/GuildMessageEmbedEventModel.java new file mode 100644 index 000000000..f288b85a4 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/listener/GuildMessageEmbedEventModel.java @@ -0,0 +1,20 @@ +package dev.sheldan.abstracto.core.models.listener; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import net.dv8tion.jda.api.entities.MessageEmbed; +import net.dv8tion.jda.api.entities.TextChannel; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Setter +@Builder +public class GuildMessageEmbedEventModel { + @Builder.Default + private List embeds = new ArrayList<>(); + private Long messageId; + private TextChannel channel; +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/template/commands/ChannelGroupModel.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/template/commands/ChannelGroupModel.java index 3ebafd0ca..c819e238b 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/template/commands/ChannelGroupModel.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/template/commands/ChannelGroupModel.java @@ -11,5 +11,6 @@ import java.util.List; @Builder public class ChannelGroupModel { private String name; + private String typeKey; private List channels; } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/BotService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/BotService.java index 28a064211..682316e5e 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/BotService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/BotService.java @@ -32,7 +32,8 @@ public interface BotService { Optional getEmote(Long serverId, AEmote emote); Optional getEmote(AEmote emote); Optional getTextChannelFromServerOptional(Guild serverId, Long textChannelId); - TextChannel getTextChannelFromServer(Guild serverId, Long textChannelId); + TextChannel getTextChannelFromServer(Guild guild, Long textChannelId); + TextChannel getTextChannelFromServerNullable(Guild guild, Long textChannelId); Optional getTextChannelFromServerOptional(Long serverId, Long textChannelId); TextChannel getTextChannelFromServer(Long serverId, Long textChannelId); Optional getGuildByIdOptional(Long serverId); diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/ChannelGroupService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/ChannelGroupService.java index caeff6259..31d386734 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/ChannelGroupService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/ChannelGroupService.java @@ -2,10 +2,13 @@ package dev.sheldan.abstracto.core.service; import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AChannelGroup; +import dev.sheldan.abstracto.core.models.database.ChannelGroupType; import net.dv8tion.jda.api.entities.TextChannel; +import java.util.List; + public interface ChannelGroupService { - AChannelGroup createChannelGroup(String name, Long serverId); + AChannelGroup createChannelGroup(String name, Long serverId, ChannelGroupType channelGroupType); void deleteChannelGroup(String name, Long serverId); void addChannelToChannelGroup(String channelGroupName, TextChannel textChannel); void addChannelToChannelGroup(String channelGroupName, Long channelId, Long serverId); @@ -16,4 +19,5 @@ public interface ChannelGroupService { void disableCommandInChannelGroup(String commandName, String channelGroupName, Long serverId); void enableCommandInChannelGroup(String commandName, String channelGroupName, Long serverId); boolean doesGroupExist(String groupName, Long serverId); + List getChannelGroupsOfChannelWithType(AChannel channel, String groupTypeKey); } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/HashService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/HashService.java new file mode 100644 index 000000000..a32e95669 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/HashService.java @@ -0,0 +1,9 @@ +package dev.sheldan.abstracto.core.service; + +import java.io.File; +import java.io.IOException; + +public interface HashService { + String sha256HashFileContent(File file) throws IOException; + String sha256HashString(String text); +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/HttpService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/HttpService.java new file mode 100644 index 000000000..a994f5c1f --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/HttpService.java @@ -0,0 +1,8 @@ +package dev.sheldan.abstracto.core.service; + +import java.io.File; +import java.io.IOException; + +public interface HttpService { + File downloadFileToTempFile(String url) throws IOException; +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/MessageService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/MessageService.java index 3baf78cc2..fe6668196 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/MessageService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/MessageService.java @@ -11,6 +11,8 @@ import java.util.concurrent.CompletableFuture; public interface MessageService { void addReactionToMessage(String emoteKey, Long serverId, Message message); + void addDefaultReactionToMessage(String unicode, Message message); + CompletableFuture addDefaultReactionToMessageAsync(String unicode, Message message); CompletableFuture addReactionToMessageWithFuture(String emoteKey, Long serverId, Message message); CompletableFuture addReactionToMessageWithFuture(String emoteKey, Guild guild, Message message); CompletableFuture addReactionToMessageWithFuture(AEmote emote, Long serverId, Message message); diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupManagementService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupManagementService.java index fd41abee4..e0ff437b2 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupManagementService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupManagementService.java @@ -3,17 +3,23 @@ package dev.sheldan.abstracto.core.service.management; import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AChannelGroup; import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.ChannelGroupType; import java.util.List; +import java.util.Optional; public interface ChannelGroupManagementService { - AChannelGroup createChannelGroup(String name, AServer server); + AChannelGroup createChannelGroup(String name, AServer server, ChannelGroupType channelGroupType); boolean doesChannelGroupExist(String name, AServer server); void deleteChannelGroup(String name, AServer server); AChannelGroup addChannelToChannelGroup(AChannelGroup channelGroup, AChannel channel); void removeChannelFromChannelGroup(AChannelGroup channelGroup, AChannel channel); AChannelGroup findByNameAndServer(String name, AServer server); + Optional findByNameAndServerOptional(String name, AServer server); + AChannelGroup findByNameAndServerAndType(String name, AServer server, String expectedType); List findAllInServer(AServer server); List getAllAvailableAsString(AServer server); List findAllInServer(Long serverId); + List getAllChannelGroupsOfChannel(AChannel channel); + List findAllInServerWithType(Long serverId, String type); } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupTypeManagementService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupTypeManagementService.java new file mode 100644 index 000000000..565bc3181 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelGroupTypeManagementService.java @@ -0,0 +1,14 @@ +package dev.sheldan.abstracto.core.service.management; + +import dev.sheldan.abstracto.core.models.database.ChannelGroupType; + +import java.util.List; +import java.util.Optional; + +public interface ChannelGroupTypeManagementService { + Optional findChannelGroupTypeByKeyOptional(String key); + ChannelGroupType findChannelGroupTypeByKey(String key); + boolean doesChannelGroupTypeExist(String key); + List getAllChannelGroupTypes(); + List getAllChannelGroupTypesAsString(); +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/UserInServerManagementService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/UserInServerManagementService.java index 6d00ff094..c74c2839b 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/UserInServerManagementService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/UserInServerManagementService.java @@ -17,4 +17,5 @@ public interface UserInServerManagementService { AUserInAServer createUserInServer(Member member); AUserInAServer createUserInServer(Long guildId, Long userId); List getUserInAllServers(Long userId); + Optional loadAUserInAServerOptional(Long serverId, Long userId); } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/UserManagementService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/UserManagementService.java index 102aef6d3..6569491e2 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/UserManagementService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/UserManagementService.java @@ -3,8 +3,11 @@ package dev.sheldan.abstracto.core.service.management; import dev.sheldan.abstracto.core.models.database.AUser; import net.dv8tion.jda.api.entities.Member; +import java.util.Optional; + public interface UserManagementService { AUser createUser(Member member); AUser createUser(Long userId); AUser loadUser(Long userId); + Optional loadUserOptional(Long userId); } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/utils/FileUtils.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/utils/FileUtils.java index 41bbdb288..a05d7950f 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/utils/FileUtils.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/utils/FileUtils.java @@ -14,7 +14,10 @@ public class FileUtils { fw.write(content); fw.flush(); } + } + public void writeBytesToFile(File file, byte[] content) throws IOException { + Files.write(content, file); } public File createTempFile(String fileName) { diff --git a/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/test/MockUtils.java b/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/test/MockUtils.java index e2dd898a8..342341555 100644 --- a/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/test/MockUtils.java +++ b/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/test/MockUtils.java @@ -1,6 +1,12 @@ package dev.sheldan.abstracto.core.test; import dev.sheldan.abstracto.core.models.database.*; +import net.dv8tion.jda.api.requests.RestAction; + +import java.util.function.Consumer; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; public class MockUtils { @@ -30,4 +36,26 @@ public class MockUtils { public static ARole getRole(Long id, AServer server) { return ARole.builder().server(server).id(id).build(); } + + public static void mockQueueDoubleVoidConsumer(RestAction action) { + doAnswer(invocationOnMock -> { + Object consumerObj = invocationOnMock.getArguments()[0]; + if(consumerObj instanceof Consumer) { + Consumer consumer = (Consumer) consumerObj; + consumer.accept(null); + } + return null; + }).when(action).queue(any(Consumer.class), any(Consumer.class)); + } + + public static void mockQueueVoidConsumer(RestAction action) { + doAnswer(invocationOnMock -> { + Object consumerObj = invocationOnMock.getArguments()[0]; + if(consumerObj instanceof Consumer) { + Consumer consumer = (Consumer) consumerObj; + consumer.accept(null); + } + return null; + }).when(action).queue(any(Consumer.class)); + } } diff --git a/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/test/command/CommandTestUtilities.java b/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/test/command/CommandTestUtilities.java index 53413e8f5..d6e0a44ac 100644 --- a/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/test/command/CommandTestUtilities.java +++ b/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/test/command/CommandTestUtilities.java @@ -42,28 +42,6 @@ public class CommandTestUtilities { com.execute(context); } - public static void executeNoParametersTestAsync(Command com) { - CommandContext context = CommandTestUtilities.getNoParameters(); - com.executeAsync(context); - } - - public static void executeWrongParametersTest(Command com) { - executeWrongParametersTest(com, new ArrayList<>()); - } - - public static void executeWrongParametersTest(Command com, Object value) { - CommandContext context = CommandTestUtilities.getWithParameters(Arrays.asList(value)); - com.execute(context); - } - - public static void executeWrongParametersTestAsync(Command com) { - executeWrongParametersTestAsync(com, new ArrayList<>()); - } - - public static void executeWrongParametersTestAsync(Command com, Object value) { - CommandContext context = CommandTestUtilities.getWithParameters(Arrays.asList(value)); - com.executeAsync(context); - } public static CommandContext getNoParameters() { AServer server = MockUtils.getServer(); diff --git a/abstracto-application/documentation/src/main/docs/asciidoc/modules/utility.adoc b/abstracto-application/documentation/src/main/docs/asciidoc/modules/utility.adoc index 1288024d5..31346720f 100644 --- a/abstracto-application/documentation/src/main/docs/asciidoc/modules/utility.adoc +++ b/abstracto-application/documentation/src/main/docs/asciidoc/modules/utility.adoc @@ -71,14 +71,14 @@ Feature key: `suggestion` ==== Commands Creating a suggestion:: -* Usage `suggest ` +* Usage: `suggest ` * Description: Posts the text to the `suggest` post target and places the emotes for up and down voting. Accepting a suggestion:: -* Usage `accept [note]` +* Usage: `accept [note]` * Description: Re-posts the suggestion identified by `suggestionId` and marks the suggestion as accepted. The optional `note` will be used in this re-post, if provided. * Example: `accept 1 okay` in order to accept the suggestion `1` with the reason `okay` Rejecting a suggestion:: -* Usage `reject [note]` +* Usage: `reject [note]` * Description: Re-posts the suggestion identified by `suggestionId` and marks the suggestion as denied. The optional `note` will be used in this re-post, if provided. * Example: `deny 1 not okay` in order to reject the suggestion `1` with the reason `not okay` @@ -90,7 +90,7 @@ Feature key: `utility` ==== Commands Retrieving the URL of an emote:: -* Usage `showEmote ` +* Usage: `showEmote ` * Description: Posts the name of the emote accompanied with the URL where the image of the emote is stored. Displaying the avatar or a member:: @@ -101,7 +101,7 @@ Displaying information about members:: * Usage: `userInfo [member]` * Description: Displays information about a member including: username, ID, activity, nickname (if any), date joined the server and date registered on discord. -Displaying information about server:: +Displaying information about the server:: * Usage: `serverInfo` * Description: Displays information about the server including: ID, server name, owner, member count, creation date, role count, server features and custom emotes of the server. @@ -114,4 +114,48 @@ This feature enables the automatic embedding of messages containing a message li If a message contains a link to a discord message this will create an embed containing the the message content. This supports image attachments, but not videos or files. A reaction is placed on the embedded message which can be used to delete this embed. Only the original author and the person creating the embed can delete the embed this way. -Feature key: `link_embeds` \ No newline at end of file +Feature key: `link_embeds` + +=== Repost detection and tracking + +This feature can be used to detect whether an image has been posted before on the server. Images are compared by the hash stored in the database, which makes it very strict. +In order to calculate the hash, the image needs to be downloaded. It is possible to show a leaderboard of the most reposting users. Both of these features can be changed via feature modes. +If a reaction has been detected a reaction will be added to the post. If a message contains multiple or the detected repost is not the first image in the message a reaction containing digit indicating the position of the repost will be added. +For example if the repost is the second image in a message, a reaction representing the digit two will be added. + +While it can be configured that the feature is only active in certain channels, the detection whether an image is a repost checks all previously posted images from the server (given they have been posted in a channel where the repost check is active). + +Feature key: `repostDetection` + +==== Feature modes +`download`:: If this is enabled, the images in the configured channels will be downloaded and the hash is calculated basd on the file content. The images are deleted immediately afterwards. If this is disabled, the proxy URL of the image will be used to calculate the hash. Enabled by default. +`leaderboard`:: If this is enabled, the command `repostLeaderboard` will be available. This command shows the leaderboard of the user with the most reposts. Disabled by default. + +==== Emotes +* `repostMarker` to indicate that a post has been identified as a repost + +==== Commands +Remove stored image posts and reposts of whole server or specific member:: +* Usage: `purgeImagePosts [member]` +* Description: If `member` is provided, this will delete all stored image hashes (and their reposts) from the database. If `member` is not provided, this will delete all stored image hashes (and their reposts) from the whole server. + +Remove reposts of whole server or specific member:: +* Usage: `purgeReposts [member]` +* Description: If `member` is provided, this will delete all reposts of the given member. If `member` is not provided, this will delete all reposts in the whole server. + +Show the leaderboard of reposts:: +* Usage: `repostLeaderboard [page]` +* Description: Shows the rank and the amount of reposts for a provided `page`, if `page` is not provided, it will show five users with the highest a mount of reposts. `page` is 1-indexed. It will also show the amount and rank of the user executing. +* Mode Restriction: This command is only available when the feature mode `leaderboard` is enabled. + +Enable repost check for a channel group:: +* Usage: `enableRepostCheck ` +* Description: Enables the repost checking for all channels in the channel group identified by `groupName`. This channel group needs to be of type `repostCheck`. + +Disable repost check for a channel group:: +* Usage: `disableRepostCheck ` +* Description: Disables the repost checking for all channels in the channel group identified by `groupName`. This channel group needs to be of type `repostCheck`. + +Show the channels for which repost check has been enabled:: +* Usage: `showRepostCheckChannels` +* Description: Shows the channel groups with their respective channels for which the repost check has been enabled. These can only be channel groups of type `repostCheck`. It can still be enabled if there are now channels in the channel group. \ No newline at end of file