From 2a2a3aea7001bc3e68c7de1f8fdc3ecf5f4d8412 Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Sat, 23 Jan 2021 15:33:00 +0100 Subject: [PATCH] [AB-68] adding invite filter with commands to allow/disallow invites, remove stored filtered invite links and show filtered invite links removing database entities from command context --- .../command/ActivateAssignableRolePlace.java | 8 +- .../command/AddRoleToAssignableRolePost.java | 10 +- .../ChangeAssignableRolePlaceConfig.java | 9 +- .../command/CreateAssignableRolePost.java | 8 +- .../DeactivateAssignableRolePlace.java | 8 +- .../command/DeleteAssignableRolePlace.java | 8 +- .../command/EditAssignableRolePlaceText.java | 8 +- .../command/MoveAssignableRolePlace.java | 8 +- .../RemoveRoleFromAssignableRolePlace.java | 8 +- .../command/SetAssignableRolePosition.java | 8 +- .../command/SetupAssignableRolePlace.java | 8 +- .../ShowAssignableRolePlaceConfig.java | 8 +- .../command/ShowAssignableRolePlaces.java | 8 +- .../command/SwapAssignableRolePosition.java | 6 +- .../command/TestAssignableRolePlace.java | 8 +- .../commands/LeaderBoardCommand.java | 16 +- .../commands/ListDisabledExperienceRoles.java | 8 +- .../abstracto/experience/commands/Rank.java | 3 +- .../experience/commands/SetExpRole.java | 2 +- .../experience/commands/SyncRoles.java | 8 +- .../experience/commands/UnSetExpRole.java | 2 +- .../service/AUserExperienceServiceBean.java | 14 +- .../service/ExperienceRoleServiceBean.java | 13 +- .../commands/DisableExpGainTest.java | 3 +- .../commands/EnableExpGainTest.java | 3 +- .../commands/LeaderBoardCommandTest.java | 21 ++- .../ListDisabledExperienceRolesTest.java | 10 +- .../experience/commands/RankTest.java | 3 +- .../experience/commands/SetExpRoleTest.java | 5 +- .../experience/commands/SyncRolesTest.java | 19 +- .../experience/commands/UnSetExpRoleTest.java | 8 +- .../AUserExperienceServiceBeanTest.java | 12 +- .../ExperienceRoleServiceBeanTest.java | 17 +- .../service/AUserExperienceService.java | 2 +- .../service/ExperienceRoleService.java | 5 +- .../moderation/commands/DecayAllWarnings.java | 8 +- .../moderation/commands/DecayWarnings.java | 8 +- .../moderation/commands/DeleteNote.java | 10 +- .../moderation/commands/MyWarnings.java | 10 +- .../moderation/commands/UserNotes.java | 8 +- .../moderation/commands/Warnings.java | 8 +- .../commands/invite/AllowInvite.java | 52 +++++ .../commands/invite/DisAllowInvite.java | 52 +++++ .../invite/RemoveTrackedInviteLinks.java | 65 +++++++ .../invite/ShowTrackedInviteLinks.java | 86 +++++++++ .../moderation/commands/mute/SetMuteRole.java | 8 +- .../async/InviteLinkFilterListener.java | 114 +++++++++++ .../{ => async}/MessageDeleteLogListener.java | 2 +- .../{ => async}/MessageEditedListener.java | 2 +- .../AllowedInviteLinkRepository.java | 20 ++ .../FilteredInviteLinkRepository.java | 27 +++ .../moderation/service/BanServiceBean.java | 2 +- .../service/InviteLinkFilterServiceBean.java | 112 +++++++++++ .../moderation/service/KickServiceBean.java | 2 +- .../moderation/service/MuteServiceBean.java | 5 +- .../moderation/service/WarnServiceBean.java | 5 +- .../AllowedInviteLinkManagementBean.java | 48 +++++ .../FilteredInviteLinkManagementBean.java | 64 +++++++ .../moderation-seedData/command.xml | 28 +++ .../moderation-seedData/default_config.xml | 1 - .../default_feature_flag.xml | 6 + .../default_feature_mode.xml | 13 ++ .../default_posttarget.xml | 4 + .../moderation-seedData/feature.xml | 4 + .../moderation-tables/allowed_invite_link.xml | 30 +++ .../filtered_invite_link.xml | 34 ++++ .../moderation-tables/tables.xml | 2 + .../moderation/commands/BanIdTest.java | 11 +- .../commands/DecayAllWarningsTest.java | 10 +- .../commands/DecayWarningsTest.java | 10 +- .../moderation/commands/DeleteNoteTest.java | 16 +- .../moderation/commands/MyWarningsTest.java | 16 +- .../moderation/commands/UserNotesTest.java | 12 +- .../moderation/commands/WarningsTest.java | 9 +- .../commands/invite/AllowInviteTest.java | 43 +++++ .../commands/invite/DisAllowInviteTest.java | 43 +++++ .../invite/RemoveTrackedInviteLinksTest.java | 51 +++++ .../invite/ShowTrackedInviteLinksTest.java | 71 +++++++ .../commands/mute/SetMuteRoleTest.java | 9 +- .../async/InviteLinkFilterListenerTest.java | 177 ++++++++++++++++++ .../listener/{ => async}/JoinLoggerTest.java | 3 +- .../{ => async}/JoinMuteListenerTest.java | 3 +- .../listener/{ => async}/LeaveLoggerTest.java | 3 +- .../MessageDeleteLogListenerTest.java | 2 +- .../MessageEditedListenerTest.java | 2 +- .../service/BanServiceBeanTest.java | 2 +- .../InviteLinkFilterServiceBeanTest.java | 155 +++++++++++++++ .../service/KickServiceBeanTest.java | 2 +- .../service/MuteServiceBeanTest.java | 2 +- .../service/WarnServiceBeanTest.java | 7 +- .../AllowedInviteLinkManagementBeanTest.java | 98 ++++++++++ .../FilteredInviteLinkManagementBeanTest.java | 102 ++++++++++ .../config/features/InviteFilterFeature.java | 24 +++ .../config/features/ModerationFeature.java | 1 + .../config/features/ModerationFeatures.java | 8 +- .../config/features/MutingFeature.java | 1 + .../config/features/WarningDecayFeature.java | 1 + .../config/features/WarningFeature.java | 1 + .../features/mode/InviteFilterMode.java | 16 ++ .../features/{ => mode}/ModerationMode.java | 2 +- .../features/{ => mode}/MutingMode.java | 2 +- .../features/{ => mode}/WarnDecayMode.java | 2 +- .../features/{ => mode}/WarningMode.java | 2 +- .../posttargets/InviteFilterPostTarget.java | 16 ++ .../exception/AllowedInviteLinkNotFound.java | 21 +++ .../exception/InvalidInviteException.java | 21 +++ .../models/database/AllowedInviteLink.java | 41 ++++ .../models/database/FilteredInviteLink.java | 54 ++++++ .../commands/TrackedInviteLinksModel.java | 16 ++ .../template/listener/InviteDeletedModel.java | 22 +++ .../service/InviteLinkFilterService.java | 19 ++ .../AllowedInviteLinkManagement.java | 14 ++ .../FilteredInviteLinkManagement.java | 18 ++ .../abstracto/modmail/commands/AnonReply.java | 8 +- .../abstracto/modmail/commands/Close.java | 7 +- .../modmail/commands/CloseNoLog.java | 8 +- .../modmail/commands/CloseSilently.java | 9 +- .../abstracto/modmail/commands/Reply.java | 8 +- .../abstracto/modmail/commands/Subscribe.java | 6 +- .../modmail/commands/UnSubscribe.java | 8 +- .../condition/RequiresModMailCondition.java | 6 +- .../emotes/command/DeletedEmoteStats.java | 8 +- .../statistic/emotes/command/EmoteStats.java | 8 +- .../emotes/command/ExternalEmoteStats.java | 8 +- .../emotes/command/DeletedEmoteStatsTest.java | 20 +- .../emotes/command/EmoteStatsTest.java | 20 +- .../command/ExternalEmoteStatsTest.java | 20 +- .../utility/commands/remind/Remind.java | 6 +- .../utility/commands/remind/Reminders.java | 5 +- .../utility/commands/remind/UnRemind.java | 6 +- .../service/MessageEmbedServiceBean.java | 9 - .../utility/service/StarboardServiceBean.java | 2 - .../service/SuggestionServiceBean.java | 13 +- .../1.0-utility/utility-seedData/command.xml | 6 + .../1.0-utility/utility-seedData/data.xml | 1 + .../utility/commands/StarStatsTest.java | 1 - .../utility/commands/remind/RemindTest.java | 14 +- .../commands/remind/RemindersTest.java | 14 +- .../utility/commands/remind/UnRemindTest.java | 10 +- .../service/SuggestionServiceBeanTest.java | 19 +- .../core/command/CommandReceivedHandler.java | 7 - .../repository/CommandInServerRepository.java | 3 + .../ChannelGroupCommandServiceBean.java | 9 + .../command/service/ExceptionServiceBean.java | 2 +- .../CommandInServerManagementServiceBean.java | 5 + .../commands/channels/ListChannelGroups.java | 8 +- .../commands/channels/PostTargetCommand.java | 6 +- .../core/commands/config/features/Allow.java | 10 +- .../config/features/DisableFeature.java | 7 +- .../commands/config/features/DisableMode.java | 8 +- .../config/features/EnableFeature.java | 12 +- .../commands/config/features/EnableMode.java | 8 +- .../config/features/FeatureModes.java | 10 +- .../commands/config/features/Features.java | 8 +- .../commands/config/features/Restrict.java | 10 +- .../abstracto/core/commands/help/Help.java | 2 +- .../repository/UserInServerRepository.java | 3 + .../core/service/PostTargetServiceBean.java | 5 + .../ChannelManagementServiceBean.java | 6 + .../ServerManagementServiceBean.java | 6 + .../UserInServerManagementServiceBean.java | 6 +- .../features/DisableFeatureModeTest.java | 9 +- .../features/EnableFeatureModeTest.java | 12 +- .../config/features/FeatureModesTest.java | 13 +- .../condition/CommandDisabledCondition.java | 2 +- .../condition/CommandDisallowedCondition.java | 2 +- .../condition/FeatureModeCondition.java | 2 +- .../condition/ImmuneUserCondition.java | 2 +- .../command/execution/ContextConverter.java | 4 - .../service/ChannelGroupCommandService.java | 1 + .../CommandInServerManagementService.java | 1 + .../core/models/cache/CachedMessage.java | 5 + .../core/models/context/ServerContext.java | 2 - .../context/UserInitiatedServerContext.java | 6 - .../core/service/PostTargetService.java | 1 + .../management/ChannelManagementService.java | 2 + .../management/ServerManagementService.java | 2 + .../abstracto/core/utils/ContextUtils.java | 16 +- .../condition/FeatureModeConditionTest.java | 16 +- .../test/command/CommandTestUtilities.java | 10 - .../core/utils/ContextUtilsTest.java | 67 ------- .../docs/asciidoc/modules/moderation.adoc | 34 ++++ 182 files changed, 2571 insertions(+), 325 deletions(-) create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/AllowInvite.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/DisAllowInvite.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/RemoveTrackedInviteLinks.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/ShowTrackedInviteLinks.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/async/InviteLinkFilterListener.java rename abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/{ => async}/MessageDeleteLogListener.java (98%) rename abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/{ => async}/MessageEditedListener.java (98%) create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/repository/AllowedInviteLinkRepository.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/repository/FilteredInviteLinkRepository.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/InviteLinkFilterServiceBean.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/AllowedInviteLinkManagementBean.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/FilteredInviteLinkManagementBean.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-tables/allowed_invite_link.xml create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-tables/filtered_invite_link.xml create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/invite/AllowInviteTest.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/invite/DisAllowInviteTest.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/invite/RemoveTrackedInviteLinksTest.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/invite/ShowTrackedInviteLinksTest.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/InviteLinkFilterListenerTest.java rename abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/{ => async}/JoinLoggerTest.java (94%) rename abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/{ => async}/JoinMuteListenerTest.java (94%) rename abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/{ => async}/LeaveLoggerTest.java (94%) rename abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/{ => async}/MessageDeleteLogListenerTest.java (99%) rename abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/{ => async}/MessageEditedListenerTest.java (98%) create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/InviteLinkFilterServiceBeanTest.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/management/AllowedInviteLinkManagementBeanTest.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/management/FilteredInviteLinkManagementBeanTest.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/InviteFilterFeature.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/InviteFilterMode.java rename abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/{ => mode}/ModerationMode.java (82%) rename abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/{ => mode}/MutingMode.java (84%) rename abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/{ => mode}/WarnDecayMode.java (82%) rename abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/{ => mode}/WarningMode.java (82%) create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/posttargets/InviteFilterPostTarget.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/exception/AllowedInviteLinkNotFound.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/exception/InvalidInviteException.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/database/AllowedInviteLink.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/database/FilteredInviteLink.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/commands/TrackedInviteLinksModel.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/listener/InviteDeletedModel.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/InviteLinkFilterService.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/management/AllowedInviteLinkManagement.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/management/FilteredInviteLinkManagement.java delete mode 100644 abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/utils/ContextUtilsTest.java 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 3818d62f5..cb7827859 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 @@ -9,6 +9,8 @@ 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.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -21,11 +23,15 @@ public class ActivateAssignableRolePlace extends AbstractConditionableCommand { @Autowired private AssignableRolePlaceService service; + @Autowired + private ServerManagementService serverManagementService; + @Override public CommandResult execute(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); - service.activateAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + service.activateAssignableRolePlace(server, name); return CommandResult.fromSuccess(); } 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 7a79b9c46..4af2c3c2c 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 @@ -13,7 +13,9 @@ import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.models.FullEmote; import dev.sheldan.abstracto.core.models.FullRole; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.RoleService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -30,6 +32,9 @@ public class AddRoleToAssignableRolePost extends AbstractConditionableCommand { @Autowired private RoleService roleService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); @@ -37,13 +42,14 @@ public class AddRoleToAssignableRolePost extends AbstractConditionableCommand { FullEmote emote = (FullEmote) parameters.get(1); String description = (String) parameters.get(2); FullRole role = (FullRole) parameters.get(3); - if(service.hasAssignableRolePlaceEmote(commandContext.getUserInitiatedContext().getServer(), name, emote.getFakeEmote())) { + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + if(service.hasAssignableRolePlaceEmote(server, name, emote.getFakeEmote())) { throw new AssignableRoleAlreadyDefinedException(emote, name); } if(!roleService.canBotInteractWithRole(role.getRole())) { throw new AssignableRoleNotUsableException(role, commandContext.getGuild()); } - return service.addRoleToAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name, role.getRole(), emote, description) + return service.addRoleToAssignableRolePlace(server, name, role.getRole(), emote, description) .thenApply(aVoid -> CommandResult.fromSuccess()); } diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ChangeAssignableRolePlaceConfig.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ChangeAssignableRolePlaceConfig.java index fd9a43649..4cb64d67d 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ChangeAssignableRolePlaceConfig.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ChangeAssignableRolePlaceConfig.java @@ -10,6 +10,8 @@ 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.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -25,13 +27,18 @@ public class ChangeAssignableRolePlaceConfig extends AbstractConditionableComman @Autowired private AssignableRolePlaceService service; + @Autowired + private ServerManagementService serverManagementService; + + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); AssignableRolePlaceParameterKey configKey = (AssignableRolePlaceParameterKey) parameters.get(1); Object parameterValue = parameters.get(2); - return service.changeConfiguration(commandContext.getUserInitiatedContext().getServer(), name, configKey, parameterValue) + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + return service.changeConfiguration(server, name, configKey, parameterValue) .thenApply(aVoid -> CommandResult.fromSuccess()); } 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 d24cc08c1..ee76d85bc 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 @@ -13,7 +13,9 @@ 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.AChannel; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.management.ChannelManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import net.dv8tion.jda.api.entities.MessageChannel; import net.dv8tion.jda.api.entities.TextChannel; import org.springframework.beans.factory.annotation.Autowired; @@ -31,6 +33,9 @@ public class CreateAssignableRolePost extends AbstractConditionableCommand { @Autowired private ChannelManagementService channelManagementService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CommandResult execute(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); @@ -38,7 +43,8 @@ public class CreateAssignableRolePost extends AbstractConditionableCommand { MessageChannel channel = (TextChannel) parameters.get(1); String text = (String) parameters.get(2); AChannel chosenChannel = channelManagementService.loadChannel(channel.getIdLong()); - service.createAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name, chosenChannel, text); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + service.createAssignableRolePlace(server, name, chosenChannel, text); return CommandResult.fromSuccess(); } 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 360a12835..7abc373e2 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 @@ -9,6 +9,8 @@ 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.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -21,11 +23,15 @@ public class DeactivateAssignableRolePlace extends AbstractConditionableCommand @Autowired private AssignableRolePlaceService service; + @Autowired + private ServerManagementService serverManagementService; + @Override public CommandResult execute(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); - service.deactivateAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + service.deactivateAssignableRolePlace(server, name); return CommandResult.fromSuccess(); } 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 ebfb2c22e..c2d8dd8cc 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 @@ -9,6 +9,8 @@ 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.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -22,11 +24,15 @@ public class DeleteAssignableRolePlace extends AbstractConditionableCommand { @Autowired private AssignableRolePlaceService service; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); - return service.deleteAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name) + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + return service.deleteAssignableRolePlace(server, name) .thenApply(aVoid -> CommandResult.fromSuccess()); } 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 ad1770e40..1c8ea261e 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 @@ -12,6 +12,8 @@ import dev.sheldan.abstracto.core.command.config.validator.MaxStringLengthValida 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.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -26,14 +28,16 @@ public class EditAssignableRolePlaceText extends AbstractConditionableCommand { @Autowired private AssignableRolePlaceService service; + @Autowired + private ServerManagementService serverManagementService; @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); String newText = (String) parameters.get(1); - - return service.changeText(commandContext.getUserInitiatedContext().getServer(), name, newText) + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + return service.changeText(server, name, newText) .thenApply(aVoid -> CommandResult.fromSuccess()); } 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 e52f10142..d4965afb6 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 @@ -9,6 +9,8 @@ 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.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import net.dv8tion.jda.api.entities.TextChannel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -22,12 +24,16 @@ public class MoveAssignableRolePlace extends AbstractConditionableCommand { @Autowired private AssignableRolePlaceService placeManagementService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CommandResult execute(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); TextChannel newChannel = (TextChannel) parameters.get(1); - placeManagementService.moveAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name, newChannel); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + placeManagementService.moveAssignableRolePlace(server, name, newChannel); return CommandResult.fromSuccess(); } 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 84fa066e0..a7e57b572 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 @@ -10,6 +10,8 @@ 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.FullEmote; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -23,12 +25,16 @@ public class RemoveRoleFromAssignableRolePlace extends AbstractConditionableComm @Autowired private AssignableRolePlaceService service; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); FullEmote emote = (FullEmote) parameters.get(1); - return service.removeRoleFromAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name, emote) + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + return service.removeRoleFromAssignableRolePlace(server, name, emote) .thenApply(aVoid -> CommandResult.fromSuccess()); } 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 18c4a6e18..d75178572 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 @@ -10,6 +10,8 @@ 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.FullEmote; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -22,13 +24,17 @@ public class SetAssignableRolePosition extends AbstractConditionableCommand { @Autowired private AssignableRolePlaceService service; + @Autowired + private ServerManagementService serverManagementService; + @Override public CommandResult execute(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); FullEmote emote = (FullEmote) parameters.get(1); Integer newPosition = (Integer) parameters.get(2); - service.setEmoteToPosition(commandContext.getUserInitiatedContext().getServer(), name, emote, newPosition); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + service.setEmoteToPosition(server, name, emote, newPosition); return CommandResult.fromSuccess(); } 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 6c425e592..6f0727971 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 @@ -9,7 +9,9 @@ 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.AServer; import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -28,11 +30,15 @@ public class SetupAssignableRolePlace extends AbstractConditionableCommand { @Autowired private ChannelService channelService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); - return service.setupAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name) + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + return service.setupAssignableRolePlace(server, name) .thenApply(aVoid -> CommandResult.fromSuccess()); } 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 8ab29506a..f0e9b9125 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 @@ -9,6 +9,8 @@ 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.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -22,12 +24,16 @@ public class ShowAssignableRolePlaceConfig extends AbstractConditionableCommand @Autowired private AssignableRolePlaceService service; + @Autowired + private ServerManagementService serverManagementService; + @Override public CommandResult execute(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); // TODO refactor to return something to be posted in this command here instead of relying it to be posted somewhere else - service.showAssignablePlaceConfig(commandContext.getUserInitiatedContext().getServer(), name, commandContext.getChannel()); + service.showAssignablePlaceConfig(server, name, commandContext.getChannel()); return CommandResult.fromIgnored(); } diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ShowAssignableRolePlaces.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ShowAssignableRolePlaces.java index 7a628a119..fe16329ec 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ShowAssignableRolePlaces.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/command/ShowAssignableRolePlaces.java @@ -8,6 +8,8 @@ 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.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -20,9 +22,13 @@ public class ShowAssignableRolePlaces extends AbstractConditionableCommand { @Autowired private AssignableRolePlaceService service; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { - return service.showAllAssignableRolePlaces(commandContext.getUserInitiatedContext().getServer(), commandContext.getChannel()) + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + return service.showAllAssignableRolePlaces(server, commandContext.getChannel()) .thenApply(aVoid -> CommandResult.fromIgnored()); } 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 47afe3ece..8c3178580 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 @@ -13,6 +13,7 @@ import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.models.FullEmote; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.EmoteService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -28,13 +29,16 @@ public class SwapAssignableRolePosition extends AbstractConditionableCommand { @Autowired private EmoteService emoteService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CommandResult execute(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); FullEmote firstEmote = (FullEmote) parameters.get(1); FullEmote secondEmote = (FullEmote) parameters.get(2); - AServer server = commandContext.getUserInitiatedContext().getServer(); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); if(emoteService.compareAEmote(firstEmote.getFakeEmote(), secondEmote.getFakeEmote())) { return CommandResult.fromError("You cannot swap the same emote"); } 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 314cde4a3..818eb8489 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 @@ -9,6 +9,8 @@ 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.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -22,11 +24,15 @@ public class TestAssignableRolePlace extends AbstractConditionableCommand { @Autowired private AssignableRolePlaceService service; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String name = (String) parameters.get(0); - return service.testAssignableRolePlace(commandContext.getUserInitiatedContext().getServer(), name, commandContext.getChannel()) + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + return service.testAssignableRolePlace(server, name, commandContext.getChannel()) .thenApply(aVoid -> CommandResult.fromIgnored()); } 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 f010eb0c5..0d338e73e 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 @@ -10,7 +10,11 @@ import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.execution.ContextConverter; import dev.sheldan.abstracto.core.config.FeatureEnum; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.experience.config.features.ExperienceFeature; import dev.sheldan.abstracto.experience.converter.LeaderBoardModelConverter; @@ -51,20 +55,26 @@ public class LeaderBoardCommand extends AbstractConditionableCommand { @Autowired private LeaderBoardModelConverter converter; + @Autowired + private ServerManagementService serverManagementService; + + @Autowired + private UserInServerManagementService userInServerManagementService; @Override public CompletableFuture executeAsync(CommandContext 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; - LeaderBoard leaderBoard = userExperienceService.findLeaderBoardData(commandContext.getUserInitiatedContext().getServer(), page); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + LeaderBoard leaderBoard = userExperienceService.findLeaderBoardData(server, page); LeaderBoardModel leaderBoardModel = (LeaderBoardModel) ContextConverter.slimFromCommandContext(commandContext, LeaderBoardModel.class); List> futures = new ArrayList<>(); List> completableFutures = converter.fromLeaderBoard(leaderBoard); futures.addAll(completableFutures); log.info("Rendering leaderboard for page {} in server {} for user {}.", page, commandContext.getAuthor().getId(), commandContext.getGuild().getId()); - - LeaderBoardEntry userRank = userExperienceService.getRankOfUserInServer(commandContext.getUserInitiatedContext().getAUserInAServer()); + AUserInAServer aUserInAServer = userInServerManagementService.loadUser(commandContext.getAuthor()); + LeaderBoardEntry userRank = userExperienceService.getRankOfUserInServer(aUserInAServer); CompletableFuture userRankFuture = converter.fromLeaderBoardEntry(userRank); futures.add(userRankFuture); return FutureUtils.toSingleFutureGeneric(futures).thenCompose(aVoid -> { 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 44a6a08e1..ff1ea68ca 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 @@ -9,8 +9,10 @@ import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.execution.ContextConverter; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.models.FullRole; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.RoleService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.experience.config.features.ExperienceFeature; import dev.sheldan.abstracto.experience.models.database.ADisabledExpRole; @@ -40,9 +42,13 @@ public class ListDisabledExperienceRoles extends AbstractConditionableCommand { @Autowired private ChannelService channelService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { - List disabledRolesForServer = disabledExpRoleManagementService.getDisabledRolesForServer(commandContext.getUserInitiatedContext().getServer()); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + List disabledRolesForServer = disabledExpRoleManagementService.getDisabledRolesForServer(server); DisabledExperienceRolesModel disabledExperienceRolesModel = (DisabledExperienceRolesModel) ContextConverter.fromCommandContext(commandContext, DisabledExperienceRolesModel.class); disabledRolesForServer.forEach(aDisabledExpRole -> { FullRole role = FullRole 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 d70196fcb..040a0a8f8 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 @@ -67,7 +67,8 @@ public class Rank extends AbstractConditionableCommand { @Override public CompletableFuture executeAsync(CommandContext commandContext) { RankModel rankModel = (RankModel) ContextConverter.slimFromCommandContext(commandContext, RankModel.class); - LeaderBoardEntry userRank = userExperienceService.getRankOfUserInServer(commandContext.getUserInitiatedContext().getAUserInAServer()); + AUserInAServer aUserInAServer = userInServerManagementService.loadUser(commandContext.getAuthor()); + LeaderBoardEntry userRank = userExperienceService.getRankOfUserInServer(aUserInAServer); CompletableFuture future = converter.fromLeaderBoardEntry(userRank); return future.thenCompose(leaderBoardEntryModel -> self.renderAndSendRank(commandContext, rankModel, leaderBoardEntryModel) 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 776c87b31..4059a674c 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 @@ -44,7 +44,7 @@ public class SetExpRole extends AbstractConditionableCommand { 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()); - return experienceRoleService.setRoleToLevel(role, level, commandContext.getUserInitiatedContext().getChannel()) + return experienceRoleService.setRoleToLevel(role, level, commandContext.getChannel().getIdLong()) .thenApply(aVoid -> CommandResult.fromSuccess()); } diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/SyncRoles.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/SyncRoles.java index 9c273c1fd..23bef42ae 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/SyncRoles.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/commands/SyncRoles.java @@ -8,6 +8,7 @@ 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.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.experience.config.features.ExperienceFeature; import dev.sheldan.abstracto.experience.service.AUserExperienceService; import lombok.extern.slf4j.Slf4j; @@ -31,11 +32,14 @@ public class SyncRoles extends AbstractConditionableCommand { @Autowired private AUserExperienceService userExperienceService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { - AServer server = commandContext.getUserInitiatedContext().getServer(); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); log.info("Synchronizing roles on server {}", server.getId()); - return userExperienceService.syncUserRolesWithFeedback(server, commandContext.getUserInitiatedContext().getChannel()) + return userExperienceService.syncUserRolesWithFeedback(server, commandContext.getChannel().getIdLong()) .thenApply(aVoid -> CommandResult.fromIgnored()); } 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 a645b9dd8..e8b5cb410 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 @@ -37,7 +37,7 @@ public class UnSetExpRole extends AbstractConditionableCommand { 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 // to get rid of it in the configuration - return experienceRoleService.unsetRole(actualRole, commandContext.getUserInitiatedContext().getChannel()) + return experienceRoleService.unsetRole(actualRole, commandContext.getChannel().getIdLong()) .thenApply(aVoid -> CommandResult.fromSuccess()); } diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBean.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBean.java index c0d938979..4f393a1fd 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBean.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBean.java @@ -4,10 +4,8 @@ import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.ARole; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.database.AUserInAServer; -import dev.sheldan.abstracto.core.service.BotService; -import dev.sheldan.abstracto.core.service.ConfigService; -import dev.sheldan.abstracto.core.service.MessageService; -import dev.sheldan.abstracto.core.service.RoleService; +import dev.sheldan.abstracto.core.service.*; +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.CompletableFutureList; @@ -79,6 +77,9 @@ public class AUserExperienceServiceBean implements AUserExperienceService { @Autowired private ServerManagementService serverManagementService; + @Autowired + private ChannelManagementService channelManagementService; + @Autowired private AUserExperienceServiceBean self; @@ -403,10 +404,11 @@ public class AUserExperienceServiceBean implements AUserExperienceService { /** * Synchronizes the roles of all the users and provides feedback to the user executing * @param server The {@link AServer} to update users for - * @param channel The {@link AChannel} in which the {@link dev.sheldan.abstracto.experience.models.templates.UserSyncStatusModel} + * @param channelId The ID of the channel in which the {@link dev.sheldan.abstracto.experience.models.templates.UserSyncStatusModel} should be posted to */ @Override - public CompletableFuture syncUserRolesWithFeedback(AServer server, AChannel channel) { + public CompletableFuture syncUserRolesWithFeedback(AServer server, Long channelId) { + AChannel channel = channelManagementService.loadChannel(channelId); List aUserExperiences = userExperienceManagementService.loadAllUsers(server); log.info("Found {} users to synchronize", aUserExperiences.size()); List roles = experienceRoleManagementService.getExperienceRolesForServer(server); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceRoleServiceBean.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceRoleServiceBean.java index 33a2b6dbd..b0d90c8f6 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceRoleServiceBean.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceRoleServiceBean.java @@ -3,6 +3,7 @@ package dev.sheldan.abstracto.experience.service; import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.ARole; import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.core.service.management.RoleManagementService; import dev.sheldan.abstracto.core.utils.CompletableFutureList; import dev.sheldan.abstracto.experience.models.RoleCalculationResult; @@ -42,6 +43,9 @@ public class ExperienceRoleServiceBean implements ExperienceRoleService { @Autowired private RoleManagementService roleManagementService; + @Autowired + private ChannelManagementService channelManagementService; + /** * UnSets the current configuration for the passed level, and sets the {@link ARole} to be used for this level * in the given {@link AServer} @@ -49,10 +53,10 @@ public class ExperienceRoleServiceBean implements ExperienceRoleService { * @param level The level the {@link ARole} should be awarded at */ @Override - public CompletableFuture setRoleToLevel(Role role, Integer level, AChannel feedbackChannel) { + public CompletableFuture setRoleToLevel(Role role, Integer level, Long channelId) { Long roleId = role.getIdLong(); ARole aRole = roleManagementService.findRole(roleId); - return unsetRole(aRole, feedbackChannel).thenAccept(aVoid -> + return unsetRole(aRole, channelId).thenAccept(aVoid -> self.unsetRoleInDb(level, roleId) ); } @@ -73,7 +77,8 @@ public class ExperienceRoleServiceBean implements ExperienceRoleService { * configuration */ @Override - public CompletableFuture unsetRole(ARole role, AChannel feedbackChannel) { + public CompletableFuture unsetRole(ARole role, Long feedbackChannelId) { + AChannel channel = channelManagementService.loadChannel(feedbackChannelId); Optional roleInServerOptional = experienceRoleManagementService.getRoleInServerOptional(role); if(roleInServerOptional.isPresent()) { AExperienceRole roleInServer = roleInServerOptional.get(); @@ -82,7 +87,7 @@ public class ExperienceRoleServiceBean implements ExperienceRoleService { List roles = experienceRoleManagementService.getExperienceRolesForServer(role.getServer()); roles.removeIf(role1 -> role1.getId().equals(roleInServer.getId())); Long roleId = role.getId(); - CompletableFutureList calculationResults = userExperienceService.executeActionOnUserExperiencesWithFeedBack(roleInServer.getUsers(), feedbackChannel, + CompletableFutureList calculationResults = userExperienceService.executeActionOnUserExperiencesWithFeedBack(roleInServer.getUsers(), channel, (AUserExperience ex) -> userExperienceService.updateUserRole(ex, roles, ex.getLevelOrDefault())); return calculationResults.getMainFuture().thenAccept(aVoid -> self.persistData(calculationResults, roleId) 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 99262c6db..c44d7fd48 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 @@ -5,7 +5,6 @@ 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.experience.service.AUserExperienceService; -import dev.sheldan.abstracto.core.test.MockUtils; import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import net.dv8tion.jda.api.entities.Member; @@ -35,7 +34,7 @@ public class DisableExpGainTest { @Test public void testDisableExpForMember() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); - AUserInAServer parameterUser = MockUtils.getUserObject(4L, noParameters.getUserInitiatedContext().getServer()); + AUserInAServer parameterUser = Mockito.mock(AUserInAServer.class); Member member = Mockito.mock(Member.class); CommandContext context = CommandTestUtilities.enhanceWithParameters(noParameters, Arrays.asList(member)); when(userInServerManagementService.loadUser(member)).thenReturn(parameterUser); 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 ae293ae9a..ea9f63667 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 @@ -5,7 +5,6 @@ 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.experience.service.AUserExperienceService; -import dev.sheldan.abstracto.core.test.MockUtils; import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import net.dv8tion.jda.api.entities.Member; @@ -35,7 +34,7 @@ public class EnableExpGainTest { @Test public void testEnableExpForMember() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); - AUserInAServer parameterUser = MockUtils.getUserObject(4L, noParameters.getUserInitiatedContext().getServer()); + AUserInAServer parameterUser = Mockito.mock(AUserInAServer.class); Member member = Mockito.mock(Member.class); CommandContext context = CommandTestUtilities.enhanceWithParameters(noParameters, Arrays.asList(member)); when(userInServerManagementService.loadUser(member)).thenReturn(parameterUser); 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 1ce0a79ce..ff1f96a1b 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 @@ -2,7 +2,11 @@ package dev.sheldan.abstracto.experience.commands; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.experience.converter.LeaderBoardModelConverter; import dev.sheldan.abstracto.experience.models.LeaderBoard; import dev.sheldan.abstracto.experience.models.LeaderBoardEntry; @@ -17,6 +21,7 @@ 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; @@ -43,6 +48,12 @@ public class LeaderBoardCommandTest { @Mock private LeaderBoardModelConverter converter; + @Mock + private UserInServerManagementService userInServerManagementService; + + @Mock + private ServerManagementService serverManagementService; + @Test public void testLeaderBoardWithNoParameter() { testLeaderBoardCommand(CommandTestUtilities.getNoParameters(), 1); @@ -54,11 +65,15 @@ public class LeaderBoardCommandTest { } private void testLeaderBoardCommand(CommandContext context, int expectedPage) { - LeaderBoard leaderBoard = LeaderBoard.builder().build(); - when(userExperienceService.findLeaderBoardData(context.getUserInitiatedContext().getServer(), expectedPage)).thenReturn(leaderBoard); + LeaderBoard leaderBoard = Mockito.mock(LeaderBoard.class); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(context.getGuild())).thenReturn(server); + AUserInAServer userInAServer = Mockito.mock(AUserInAServer.class); + when(userInServerManagementService.loadUser(context.getAuthor())).thenReturn(userInAServer); + when(userExperienceService.findLeaderBoardData(server, expectedPage)).thenReturn(leaderBoard); when(converter.fromLeaderBoard(leaderBoard)).thenReturn(new ArrayList<>()); LeaderBoardEntry executingUserRank = LeaderBoardEntry.builder().build(); - when(userExperienceService.getRankOfUserInServer(context.getUserInitiatedContext().getAUserInAServer())).thenReturn(executingUserRank); + when(userExperienceService.getRankOfUserInServer(userInAServer)).thenReturn(executingUserRank); LeaderBoardEntryModel leaderBoardEntryModel = LeaderBoardEntryModel.builder().build(); when(converter.fromLeaderBoardEntry(executingUserRank)).thenReturn(CompletableFuture.completedFuture(leaderBoardEntryModel)); MessageToSend messageToSend = MessageToSend.builder().build(); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/ListDisabledExperienceRolesTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/ListDisabledExperienceRolesTest.java index ce5ae13ae..ff3a290d2 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/ListDisabledExperienceRolesTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/ListDisabledExperienceRolesTest.java @@ -6,6 +6,7 @@ import dev.sheldan.abstracto.core.models.database.ARole; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.RoleService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.experience.models.database.ADisabledExpRole; import dev.sheldan.abstracto.experience.models.templates.DisabledExperienceRolesModel; import dev.sheldan.abstracto.experience.service.management.DisabledExpRoleManagementService; @@ -41,10 +42,14 @@ public class ListDisabledExperienceRolesTest { @Mock private ChannelService channelService; + @Mock + private ServerManagementService serverManagementService; + @Test public void testCommandExecutionNoRolesFound() { CommandContext context = CommandTestUtilities.getNoParameters(); - AServer server = context.getUserInitiatedContext().getServer(); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(context.getGuild())).thenReturn(server); when(disabledExpRoleManagementService.getDisabledRolesForServer(server)).thenReturn(new ArrayList<>()); when(channelService.sendEmbedTemplateInChannel(eq("list_disabled_experience_roles"), any(DisabledExperienceRolesModel.class), eq(context.getChannel()))).thenReturn(CommandTestUtilities.messageFutureList()); @@ -56,7 +61,7 @@ public class ListDisabledExperienceRolesTest { @Test public void testCommandExecutionRolesFound() { CommandContext context = CommandTestUtilities.getNoParameters(); - AServer server = context.getUserInitiatedContext().getServer(); + AServer server = Mockito.mock(AServer.class); ADisabledExpRole disabledExpRole1 = ADisabledExpRole.builder().role(MockUtils.getRole(4L, server)).build(); ADisabledExpRole disabledExpRole2 = ADisabledExpRole.builder().role(MockUtils.getRole(6L, server)).build(); when(disabledExpRoleManagementService.getDisabledRolesForServer(server)).thenReturn(Arrays.asList(disabledExpRole1, disabledExpRole2)); @@ -64,6 +69,7 @@ public class ListDisabledExperienceRolesTest { Role role2 = Mockito.mock(Role.class); when(roleService.getRoleFromGuild(disabledExpRole1.getRole())).thenReturn(role1); when(roleService.getRoleFromGuild(disabledExpRole2.getRole())).thenReturn(role2); + when(serverManagementService.loadServer(context.getGuild())).thenReturn(server); when(channelService.sendEmbedTemplateInChannel(eq("list_disabled_experience_roles"), any(DisabledExperienceRolesModel.class), eq(context.getChannel()))).thenReturn(CommandTestUtilities.messageFutureList()); CompletableFuture result = testUnit.executeAsync(context); diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/RankTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/RankTest.java index c663c55ed..0c272266b 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/RankTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/RankTest.java @@ -68,7 +68,8 @@ public class RankTest { public void testRankExecution() { CommandContext context = CommandTestUtilities.getNoParameters(); LeaderBoardEntry leaderBoardEntry = Mockito.mock(LeaderBoardEntry.class); - when(userExperienceService.getRankOfUserInServer(context.getUserInitiatedContext().getAUserInAServer())).thenReturn(leaderBoardEntry); + when(userInServerManagementService.loadUser(context.getAuthor())).thenReturn(aUserInAServer); + when(userExperienceService.getRankOfUserInServer(aUserInAServer)).thenReturn(leaderBoardEntry); LeaderBoardEntryModel leaderBoardEntryModel = Mockito.mock(LeaderBoardEntryModel.class); when(converter.fromLeaderBoardEntry(leaderBoardEntry)).thenReturn(CompletableFuture.completedFuture(leaderBoardEntryModel)); when(self.renderAndSendRank(eq(context), any(RankModel.class), eq(leaderBoardEntryModel))).thenReturn(CompletableFuture.completedFuture(null)); 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 85ca51fa8..757b4981c 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 @@ -35,14 +35,17 @@ public class SetExpRoleTest { @Mock private RoleManagementService roleManagementService; + private static final Long CHANNEL_ID = 4L; + @Test public void setExpRole() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); Role roleToChange = Mockito.mock(Role.class); when(roleToChange.getGuild()).thenReturn(noParameters.getGuild()); Integer levelToSetTo = 4; + when(noParameters.getChannel().getIdLong()).thenReturn(CHANNEL_ID); CommandContext context = CommandTestUtilities.enhanceWithParameters(noParameters, Arrays.asList(levelToSetTo, roleToChange)); - when(experienceRoleService.setRoleToLevel(roleToChange, levelToSetTo, context.getUserInitiatedContext().getChannel())).thenReturn(CompletableFuture.completedFuture(null)); + when(experienceRoleService.setRoleToLevel(roleToChange, levelToSetTo, CHANNEL_ID)).thenReturn(CompletableFuture.completedFuture(null)); CompletableFuture result = testUnit.executeAsync(context); CommandTestUtilities.checkSuccessfulCompletionAsync(result); } diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/SyncRolesTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/SyncRolesTest.java index 7f276a1bd..aa5fa3af8 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/SyncRolesTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/commands/SyncRolesTest.java @@ -2,8 +2,9 @@ package dev.sheldan.abstracto.experience.commands; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; -import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.experience.service.AUserExperienceService; import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; @@ -11,6 +12,7 @@ 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.concurrent.CompletableFuture; @@ -26,12 +28,21 @@ public class SyncRolesTest { @Mock private AUserExperienceService userExperienceService; + @Mock + private ChannelManagementService channelManagementService; + + @Mock + private ServerManagementService serverManagementService; + + private static final Long CHANNEL_ID = 4L; + @Test public void executeCommand() { CommandContext context = CommandTestUtilities.getNoParameters(); - AServer server = context.getUserInitiatedContext().getServer(); - AChannel channel = context.getUserInitiatedContext().getChannel(); - when(userExperienceService.syncUserRolesWithFeedback(server, channel)).thenReturn(CompletableFuture.completedFuture(null)); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(context.getGuild())).thenReturn(server); + when(context.getChannel().getIdLong()).thenReturn(CHANNEL_ID); + when(userExperienceService.syncUserRolesWithFeedback(server, CHANNEL_ID)).thenReturn(CompletableFuture.completedFuture(null)); CompletableFuture result = testUnit.executeAsync(context); CommandTestUtilities.checkSuccessfulCompletionAsync(result); } 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 600008bd0..c6b8838fd 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 @@ -5,7 +5,6 @@ import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.database.ARole; import dev.sheldan.abstracto.core.service.management.RoleManagementService; import dev.sheldan.abstracto.experience.service.ExperienceRoleService; -import dev.sheldan.abstracto.core.test.MockUtils; import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import org.junit.Test; @@ -32,14 +31,17 @@ public class UnSetExpRoleTest { @Mock private RoleManagementService roleManagementService; + private static final Long CHANNEL_ID = 4L; + @Test public void setUnSetExpRole() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); - ARole changedRole = MockUtils.getRole(4L, noParameters.getUserInitiatedContext().getServer()); + ARole changedRole = Mockito.mock(ARole.class); CommandContext context = CommandTestUtilities.enhanceWithParameters(noParameters, Arrays.asList(changedRole)); + when(context.getChannel().getIdLong()).thenReturn(CHANNEL_ID); ARole actualRole = Mockito.mock(ARole.class); when(roleManagementService.findRole(changedRole.getId())).thenReturn(actualRole); - when(experienceRoleService.unsetRole(actualRole, context.getUserInitiatedContext().getChannel())).thenReturn(CompletableFuture.completedFuture(null)); + when(experienceRoleService.unsetRole(actualRole, CHANNEL_ID)).thenReturn(CompletableFuture.completedFuture(null)); CompletableFuture result = testUnit.executeAsync(context); CommandTestUtilities.checkSuccessfulCompletionAsync(result); } diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBeanTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBeanTest.java index bc977771c..a247767ed 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBeanTest.java @@ -5,6 +5,7 @@ import dev.sheldan.abstracto.core.service.BotService; import dev.sheldan.abstracto.core.service.ConfigService; import dev.sheldan.abstracto.core.service.MessageService; import dev.sheldan.abstracto.core.service.RoleService; +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.experience.ExperienceRelatedTest; @@ -67,6 +68,9 @@ public class AUserExperienceServiceBeanTest extends ExperienceRelatedTest { @Mock private TemplateService templateService; + @Mock + private ChannelManagementService channelManagementService; + @Mock private DisabledExpRoleManagementService disabledExpRoleManagementService; @@ -124,6 +128,7 @@ public class AUserExperienceServiceBeanTest extends ExperienceRelatedTest { private static final Long USER_IN_SERVER_ID = 4L; private static final Long USER_ID = 8L; private static final Long SERVER_ID = 9L; + private static final Long CHANNEL_ID = 7L; @Test public void testCalculateLevelTooLow() { @@ -583,7 +588,7 @@ public class AUserExperienceServiceBeanTest extends ExperienceRelatedTest { @Test public void testSyncRolesWithFeedBack() { - AChannel channel = AChannel.builder().id(2L).build(); + AChannel channel = Mockito.mock(AChannel.class); List experiences = getUserExperiences(25, server); checkStatusMessages(server, channel, experiences, 13); @@ -591,7 +596,7 @@ public class AUserExperienceServiceBeanTest extends ExperienceRelatedTest { @Test public void testSyncRolesWithNoUsers() { - AChannel channel = AChannel.builder().id(2L).build(); + AChannel channel = Mockito.mock(AChannel.class); List experiences = new ArrayList<>(); checkStatusMessages(server, channel, experiences, 1); @@ -631,7 +636,8 @@ public class AUserExperienceServiceBeanTest extends ExperienceRelatedTest { Message statusMessageJDA = Mockito.mock(Message.class); when(statusMessageJDA.getIdLong()).thenReturn(messageId); when(messageService.createStatusMessage(statusMessage, channel)).thenReturn(CompletableFuture.completedFuture(statusMessageJDA)); - testUnit.syncUserRolesWithFeedback(server, channel); + when(channelManagementService.loadChannel(CHANNEL_ID)).thenReturn(channel); + testUnit.syncUserRolesWithFeedback(server, CHANNEL_ID); verify(messageService, times(messageCount)).updateStatusMessage(channel, messageId, statusMessage); } diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/service/ExperienceRoleServiceBeanTest.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/service/ExperienceRoleServiceBeanTest.java index c5f27c6f9..ec1b6b0d8 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/service/ExperienceRoleServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/test/java/dev/sheldan/abstracto/experience/service/ExperienceRoleServiceBeanTest.java @@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AChannelType; import dev.sheldan.abstracto.core.models.database.ARole; import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.core.service.management.RoleManagementService; import dev.sheldan.abstracto.core.utils.CompletableFutureList; import dev.sheldan.abstracto.experience.ExperienceRelatedTest; @@ -48,17 +49,21 @@ public class ExperienceRoleServiceBeanTest extends ExperienceRelatedTest { @Mock private RoleManagementService roleManagementService; + @Mock + private ChannelManagementService channelManagementService; + @Mock private ExperienceRoleServiceBean self; @Mock private AServer server; + private static final Long CHANNEL_ID = 4L; @Test public void testSettingRoleToLevelWithoutOldUsers() { Integer levelCount = 10; - AExperienceLevel level = AExperienceLevel.builder().experienceNeeded(10L).level(levelCount).build(); + AExperienceLevel level = Mockito.mock(AExperienceLevel.class); Role roleToChange = Mockito.mock(Role.class); ARole role = Mockito.mock(ARole.class); Long roleId = 5L; @@ -66,10 +71,11 @@ public class ExperienceRoleServiceBeanTest extends ExperienceRelatedTest { when(roleManagementService.findRole(roleId)).thenReturn(role); AExperienceRole previousExperienceRole = AExperienceRole.builder().role(role).roleServer(server).level(level).build(); when(experienceRoleManagementService.getRoleInServerOptional(role)).thenReturn(Optional.of(previousExperienceRole)); - CompletableFuture future = testingUnit.setRoleToLevel(roleToChange, levelCount, getFeedbackChannel(server)); + CompletableFuture future = testingUnit.setRoleToLevel(roleToChange, levelCount, CHANNEL_ID); future.join(); verify(experienceRoleManagementService, times(1)).unsetRole(previousExperienceRole); + verify(self, times(1)).unsetRoleInDb(levelCount, roleId); } @Test @@ -105,12 +111,13 @@ public class ExperienceRoleServiceBeanTest extends ExperienceRelatedTest { AExperienceRole newExperienceRole = AExperienceRole.builder().role(newRoleToAward).id(newRoleToAward.getId()).roleServer(server).level(level).build(); when(experienceRoleManagementService.getRoleInServerOptional(role)).thenReturn(Optional.of(previousExperienceRole)); when(experienceRoleManagementService.getExperienceRolesForServer(server)).thenReturn(new ArrayList<>(Arrays.asList(newExperienceRole, previousExperienceRole))); - AChannel feedBackChannel = getFeedbackChannel(server); List> futures = new ArrayList<>(); futures.add(CompletableFuture.completedFuture(null)); + AChannel feedbackChannel = Mockito.mock(AChannel.class); + when(channelManagementService.loadChannel(CHANNEL_ID)).thenReturn(feedbackChannel); CompletableFutureList futuresList = new CompletableFutureList<>(futures); - when(userExperienceService.executeActionOnUserExperiencesWithFeedBack(eq(users), eq(feedBackChannel), any())).thenReturn(futuresList); - CompletableFuture future = testingUnit.setRoleToLevel(roleToChange, levelCount, feedBackChannel); + when(userExperienceService.executeActionOnUserExperiencesWithFeedBack(eq(users), eq(feedbackChannel), any())).thenReturn(futuresList); + CompletableFuture future = testingUnit.setRoleToLevel(roleToChange, levelCount, CHANNEL_ID); future.join(); verify(experienceRoleManagementService, times(0)).unsetRole(previousExperienceRole); } diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceService.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceService.java index c3ce219f2..0076c4c23 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceService.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceService.java @@ -88,7 +88,7 @@ public interface AUserExperienceService { * @param channel The {@link AChannel} in which the {@link dev.sheldan.abstracto.experience.models.templates.UserSyncStatusModel} * should be posted to */ - CompletableFuture syncUserRolesWithFeedback(AServer server, AChannel channel); + CompletableFuture syncUserRolesWithFeedback(AServer server, Long channelId); /** * Recalculates the role of a single user in a server and synchronize the {@link net.dv8tion.jda.api.entities.Role} diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceRoleService.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceRoleService.java index 540951edb..d4253a6c5 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceRoleService.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/src/main/java/dev/sheldan/abstracto/experience/service/ExperienceRoleService.java @@ -1,6 +1,5 @@ package dev.sheldan.abstracto.experience.service; -import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.ARole; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.experience.models.database.AExperienceLevel; @@ -21,14 +20,14 @@ public interface ExperienceRoleService { * @param role The {@link ARole} to set the level to * @param level The level the {@link ARole} should be awarded at */ - CompletableFuture setRoleToLevel(Role role, Integer level, AChannel channel); + CompletableFuture setRoleToLevel(Role role, Integer level, Long channelId); /** * Removes the role from the {@link dev.sheldan.abstracto.experience.models.database.AExperienceRole} configuration * @param role The {@link ARole} to remove from the {@link dev.sheldan.abstracto.experience.models.database.AExperienceRole} * configuration */ - CompletableFuture unsetRole(ARole role, AChannel feedbackChannel); + CompletableFuture unsetRole(ARole role, Long channelId); /** * Calculates the appropriate {@link AExperienceRole} based on the provided list of {@link AExperienceRole} 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 98d3633ee..ebfe43f9d 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 @@ -7,6 +7,8 @@ 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.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.moderation.config.ModerationModule; import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; import dev.sheldan.abstracto.moderation.service.WarnService; @@ -23,9 +25,13 @@ public class DecayAllWarnings extends AbstractConditionableCommand { @Autowired private WarnService warnService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { - return warnService.decayAllWarningsForServer(commandContext.getUserInitiatedContext().getServer()) + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + return warnService.decayAllWarningsForServer(server) .thenApply(aVoid -> CommandResult.fromSuccess()); } diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DecayWarnings.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DecayWarnings.java index 3287546ab..4e5c2e31c 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DecayWarnings.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DecayWarnings.java @@ -7,6 +7,8 @@ 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.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.moderation.config.ModerationModule; import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; import dev.sheldan.abstracto.moderation.service.WarnService; @@ -23,9 +25,13 @@ public class DecayWarnings extends AbstractConditionableCommand { @Autowired private WarnService warnService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { - return warnService.decayWarningsForServer(commandContext.getUserInitiatedContext().getServer()) + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + return warnService.decayWarningsForServer(server) .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 51f1a7484..afeafe1c2 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 @@ -9,6 +9,8 @@ import dev.sheldan.abstracto.core.command.config.validator.MinIntegerValueValida 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.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.moderation.config.ModerationModule; import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; import dev.sheldan.abstracto.moderation.service.management.UserNoteManagementService; @@ -30,13 +32,15 @@ public class DeleteNote extends AbstractConditionableCommand { @Autowired private TemplateService templateService; - + @Autowired + private ServerManagementService serverManagementService; @Override public CommandResult execute(CommandContext commandContext) { Long id = (Long) commandContext.getParameters().getParameters().get(0); - if(userNoteManagementService.noteExists(id, commandContext.getUserInitiatedContext().getServer())) { - userNoteManagementService.deleteNote(id, commandContext.getUserInitiatedContext().getServer()); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + if(userNoteManagementService.noteExists(id, server)) { + userNoteManagementService.deleteNote(id, server); } else { // TODO replace with exception return CommandResult.fromError(templateService.renderSimpleTemplate(NOTE_NOT_FOUND_EXCEPTION_TEMPLATE)); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/MyWarnings.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/MyWarnings.java index 8327eee76..67a9da360 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/MyWarnings.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/MyWarnings.java @@ -8,7 +8,9 @@ import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.execution.ContextConverter; import dev.sheldan.abstracto.core.config.FeatureEnum; +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.moderation.config.ModerationModule; import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; import dev.sheldan.abstracto.moderation.models.template.commands.MyWarningsModel; @@ -30,12 +32,16 @@ public class MyWarnings extends AbstractConditionableCommand { @Autowired private WarnManagementService warnManagementService; + @Autowired + private UserInServerManagementService userInServerManagementService; + @Override public CommandResult execute(CommandContext commandContext) { MyWarningsModel model = (MyWarningsModel) ContextConverter.fromCommandContext(commandContext, MyWarningsModel.class); - Long currentWarnCount = warnManagementService.getActiveWarnsForUser(commandContext.getUserInitiatedContext().getAUserInAServer()); + AUserInAServer userInAServer = userInServerManagementService.loadUser(commandContext.getAuthor()); + Long currentWarnCount = warnManagementService.getActiveWarnsForUser(userInAServer); model.setCurrentWarnCount(currentWarnCount); - Long totalWarnCount = warnManagementService.getTotalWarnsForUser(commandContext.getUserInitiatedContext().getAUserInAServer()); + Long totalWarnCount = warnManagementService.getTotalWarnsForUser(userInAServer); model.setTotalWarnCount(totalWarnCount); channelService.sendEmbedTemplateInChannel(MY_WARNINGS_RESPONSE_EMBED_TEMPLATE, model, commandContext.getChannel()); return CommandResult.fromIgnored(); 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 e541cbb96..a3c310309 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 @@ -9,8 +9,10 @@ import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.execution.ContextConverter; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.models.FullUserInServer; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.moderation.config.ModerationModule; @@ -47,6 +49,9 @@ public class UserNotes extends AbstractConditionableCommand { @Autowired private UserNotesConverter userNotesConverter; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); @@ -64,7 +69,8 @@ public class UserNotes extends AbstractConditionableCommand { .build(); model.setSpecifiedUser(specifiedUser); } else { - userNotes = userNoteManagementService.loadNotesForServer(commandContext.getUserInitiatedContext().getServer()); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + userNotes = userNoteManagementService.loadNotesForServer(server); } CompletableFuture> listCompletableFuture = userNotesConverter.fromNotes(userNotes); return listCompletableFuture.thenCompose(noteEntryModels -> { 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 980e80d6a..bcaf3a525 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 @@ -10,7 +10,9 @@ import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.execution.ContextConverter; import dev.sheldan.abstracto.core.config.FeatureEnum; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.PaginatorService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.moderation.config.ModerationModule; import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; @@ -47,6 +49,9 @@ public class Warnings extends AbstractConditionableCommand { @Autowired private EventWaiter eventWaiter; + @Autowired + private ServerManagementService serverManagementService; + @Autowired private Warnings self; @@ -57,7 +62,8 @@ public class Warnings extends AbstractConditionableCommand { Member member = (Member) commandContext.getParameters().getParameters().get(0); warnsToDisplay = warnManagementService.getAllWarnsForUser(userInServerManagementService.loadUser(member)); } else { - warnsToDisplay = warnManagementService.getAllWarningsOfServer(commandContext.getUserInitiatedContext().getServer()); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + warnsToDisplay = warnManagementService.getAllWarningsOfServer(server); } return warnEntryConverter.fromWarnings(warnsToDisplay).thenApply(warnEntries -> { self.renderWarnings(commandContext, warnEntries); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/AllowInvite.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/AllowInvite.java new file mode 100644 index 000000000..51c8a223b --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/AllowInvite.java @@ -0,0 +1,52 @@ +package dev.sheldan.abstracto.moderation.commands.invite; + +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.moderation.config.ModerationModule; +import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; +import dev.sheldan.abstracto.moderation.service.InviteLinkFilterServiceBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class AllowInvite extends AbstractConditionableCommand { + + @Autowired + private InviteLinkFilterServiceBean inviteLinkFilterServiceBean; + + @Override + public CommandResult execute(CommandContext commandContext) { + String inviteLink = (String) commandContext.getParameters().getParameters().get(0); + inviteLinkFilterServiceBean.allowInvite(inviteLink, commandContext.getGuild().getIdLong()); + return CommandResult.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + List parameters = new ArrayList<>(); + parameters.add(Parameter.builder().name("invite").type(String.class).templated(true).build()); + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("allowInvite") + .module(ModerationModule.MODERATION) + .templated(true) + .supportsEmbedException(true) + .causesReaction(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return ModerationFeatures.INVITE_FILTER; + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/DisAllowInvite.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/DisAllowInvite.java new file mode 100644 index 000000000..46051d91e --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/DisAllowInvite.java @@ -0,0 +1,52 @@ +package dev.sheldan.abstracto.moderation.commands.invite; + +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.moderation.config.ModerationModule; +import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; +import dev.sheldan.abstracto.moderation.service.InviteLinkFilterServiceBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class DisAllowInvite extends AbstractConditionableCommand { + + @Autowired + private InviteLinkFilterServiceBean inviteLinkFilterServiceBean; + + @Override + public CommandResult execute(CommandContext commandContext) { + String inviteLink = (String) commandContext.getParameters().getParameters().get(0); + inviteLinkFilterServiceBean.disAllowInvite(inviteLink, commandContext.getGuild().getIdLong()); + return CommandResult.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + List parameters = new ArrayList<>(); + parameters.add(Parameter.builder().name("invite").type(String.class).templated(true).build()); + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("disAllowInvite") + .module(ModerationModule.MODERATION) + .templated(true) + .supportsEmbedException(true) + .causesReaction(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return ModerationFeatures.INVITE_FILTER; + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/RemoveTrackedInviteLinks.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/RemoveTrackedInviteLinks.java new file mode 100644 index 000000000..6aedf1564 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/RemoveTrackedInviteLinks.java @@ -0,0 +1,65 @@ +package dev.sheldan.abstracto.moderation.commands.invite; + +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.moderation.config.ModerationModule; +import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; +import dev.sheldan.abstracto.moderation.config.features.mode.InviteFilterMode; +import dev.sheldan.abstracto.moderation.service.InviteLinkFilterService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Component +public class RemoveTrackedInviteLinks extends AbstractConditionableCommand { + + @Autowired + private InviteLinkFilterService inviteLinkFilterService; + + @Override + public CommandResult execute(CommandContext commandContext) { + List parameters = commandContext.getParameters().getParameters(); + if(!parameters.isEmpty()) { + String invite = (String) parameters.get(0); + inviteLinkFilterService.clearAllUses(invite, commandContext.getGuild().getIdLong()); + } else { + inviteLinkFilterService.clearAllTrackedInviteCodes(commandContext.getGuild().getIdLong()); + } + return CommandResult.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + List parameters = new ArrayList<>(); + parameters.add(Parameter.builder().name("invite").type(String.class).optional(true).templated(true).build()); + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("removeTrackedInviteLinks") + .module(ModerationModule.MODERATION) + .templated(true) + .supportsEmbedException(true) + .causesReaction(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return ModerationFeatures.INVITE_FILTER; + } + + @Override + public List getFeatureModeLimitations() { + return Arrays.asList(InviteFilterMode.TRACK_USES); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/ShowTrackedInviteLinks.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/ShowTrackedInviteLinks.java new file mode 100644 index 000000000..19fb15dc3 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/invite/ShowTrackedInviteLinks.java @@ -0,0 +1,86 @@ +package dev.sheldan.abstracto.moderation.commands.invite; + +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.command.execution.ContextConverter; +import dev.sheldan.abstracto.core.config.FeatureEnum; +import dev.sheldan.abstracto.core.config.FeatureMode; +import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.utils.FutureUtils; +import dev.sheldan.abstracto.moderation.config.ModerationModule; +import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; +import dev.sheldan.abstracto.moderation.config.features.mode.InviteFilterMode; +import dev.sheldan.abstracto.moderation.models.database.FilteredInviteLink; +import dev.sheldan.abstracto.moderation.models.template.commands.TrackedInviteLinksModel; +import dev.sheldan.abstracto.moderation.service.InviteLinkFilterService; +import dev.sheldan.abstracto.templating.model.MessageToSend; +import dev.sheldan.abstracto.templating.service.TemplateService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +@Component +public class ShowTrackedInviteLinks extends AbstractConditionableCommand { + + @Autowired + private InviteLinkFilterService inviteLinkFilterService; + + @Autowired + private ChannelService channelService; + + @Autowired + private TemplateService templateService; + + public static final String TRACKED_INVITE_LINKS_EMBED_TEMPLATE_KEY = "showTrackedInviteLinks_response"; + + @Override + public CompletableFuture executeAsync(CommandContext commandContext) { + TrackedInviteLinksModel model = (TrackedInviteLinksModel) ContextConverter.slimFromCommandContext(commandContext, TrackedInviteLinksModel.class); + List parameters = commandContext.getParameters().getParameters(); + List inviteLinks; + if(!parameters.isEmpty()) { + Integer count = (Integer) parameters.get(0); + inviteLinks = inviteLinkFilterService.getTopFilteredInviteLinks(commandContext.getGuild().getIdLong(), count); + } else { + inviteLinks = inviteLinkFilterService.getTopFilteredInviteLinks(commandContext.getGuild().getIdLong()); + } + model.setInviteLinks(inviteLinks); + MessageToSend messageToSend = templateService.renderEmbedTemplate(TRACKED_INVITE_LINKS_EMBED_TEMPLATE_KEY, model); + return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel())) + .thenApply(unused -> CommandResult.fromSuccess()); + } + + @Override + public CommandConfiguration getConfiguration() { + List parameters = new ArrayList<>(); + parameters.add(Parameter.builder().name("amount").type(Integer.class).optional(true).templated(true).build()); + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("showTrackedInviteLinks") + .module(ModerationModule.MODERATION) + .templated(true) + .async(true) + .supportsEmbedException(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return ModerationFeatures.INVITE_FILTER; + } + + @Override + public List getFeatureModeLimitations() { + return Arrays.asList(InviteFilterMode.TRACK_USES); + } +} 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 f0cae086a..9b5abaffd 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 @@ -8,7 +8,9 @@ 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.ARole; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.management.RoleManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.moderation.config.ModerationModule; import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; import dev.sheldan.abstracto.moderation.service.management.MuteRoleManagementService; @@ -28,11 +30,15 @@ public class SetMuteRole extends AbstractConditionableCommand { @Autowired private RoleManagementService roleManagementService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CommandResult execute(CommandContext commandContext) { Role jdaRole = (Role) commandContext.getParameters().getParameters().get(0); ARole role = roleManagementService.findRole(jdaRole.getIdLong()); - muteRoleManagementService.setMuteRoleForServer(commandContext.getUserInitiatedContext().getServer(), role); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + muteRoleManagementService.setMuteRoleForServer(server, role); return CommandResult.fromSuccess(); } diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/async/InviteLinkFilterListener.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/async/InviteLinkFilterListener.java new file mode 100644 index 000000000..bf6189150 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/async/InviteLinkFilterListener.java @@ -0,0 +1,114 @@ +package dev.sheldan.abstracto.moderation.listener.async; + +import dev.sheldan.abstracto.core.config.FeatureEnum; +import dev.sheldan.abstracto.core.config.ListenerPriority; +import dev.sheldan.abstracto.core.execution.result.MessageReceivedListenerResult; +import dev.sheldan.abstracto.core.listener.sync.jda.MessageReceivedListener; +import dev.sheldan.abstracto.core.models.ServerUser; +import dev.sheldan.abstracto.core.service.FeatureModeService; +import dev.sheldan.abstracto.core.service.PostTargetService; +import dev.sheldan.abstracto.core.utils.FutureUtils; +import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; +import dev.sheldan.abstracto.moderation.config.features.mode.InviteFilterMode; +import dev.sheldan.abstracto.moderation.config.posttargets.InviteFilterPostTarget; +import dev.sheldan.abstracto.moderation.models.template.listener.InviteDeletedModel; +import dev.sheldan.abstracto.moderation.service.InviteLinkFilterService; +import dev.sheldan.abstracto.templating.model.MessageToSend; +import dev.sheldan.abstracto.templating.service.TemplateService; +import lombok.extern.slf4j.Slf4j; +import net.dv8tion.jda.api.entities.Message; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.regex.Matcher; + +@Component +@Slf4j +public class InviteLinkFilterListener implements MessageReceivedListener { + + @Autowired + private InviteLinkFilterService inviteLinkFilterService; + + @Autowired + private FeatureModeService featureModeService; + + @Autowired + private PostTargetService postTargetService; + + @Autowired + private TemplateService templateService; + + public static final String INVITE_LINK_DELETED_NOTIFICATION_EMBED_TEMPLATE_KEY = "invite_link_deleted_notification"; + + @Override + public MessageReceivedListenerResult execute(Message message) { + Long serverId = message.getGuild().getIdLong(); + Matcher matcher = Message.INVITE_PATTERN.matcher(message.getContentRaw()); + ServerUser author = ServerUser.builder().userId(message.getAuthor().getIdLong()).serverId(message.getGuild().getIdLong()).build(); + boolean toDelete = false; + List codesToTrack = new ArrayList<>(); + while(matcher.find()) { + String code = matcher.group("code"); + boolean codeFiltered = inviteLinkFilterService.isCodeFiltered(code, author); + if(codeFiltered) { + codesToTrack.add(code); + toDelete = true; + } + } + + if(toDelete) { + message.delete().queue(); + boolean trackUsages = featureModeService.featureModeActive(ModerationFeatures.INVITE_FILTER, serverId, InviteFilterMode.TRACK_USES); + if(trackUsages) { + codesToTrack.forEach(s -> inviteLinkFilterService.storeFilteredInviteLinkUsage(s, author)); + } + boolean sendNotification = featureModeService.featureModeActive(ModerationFeatures.INVITE_FILTER, serverId, InviteFilterMode.FILTER_NOTIFICATIONS); + if(sendNotification) { + sendDeletionNotification(codesToTrack, message); + } + return MessageReceivedListenerResult.DELETED; + } else { + return MessageReceivedListenerResult.PROCESSED; + } + } + + private void sendDeletionNotification(List codes, Message message) { + Long serverId = message.getGuild().getIdLong(); + if(!postTargetService.postTargetDefinedInServer(InviteFilterPostTarget.INVITE_DELETE_LOG, serverId)) { + log.info("Post target {} not defined for server {} - not sending invite link deletion notification.", InviteFilterPostTarget.INVITE_DELETE_LOG.getKey(), serverId); + return; + } + InviteDeletedModel model = InviteDeletedModel + .builder() + .author(message.getMember()) + .guild(message.getGuild()) + .message(message) + .channel(message.getTextChannel()) + .invites(codes) + .build(); + log.info("Sending notification about {} deleted invite links in guild {} from user {} in channel {} in message {}.", + codes.size(), serverId, message.getAuthor().getIdLong(), message.getTextChannel().getIdLong(), message.getIdLong()); + MessageToSend messageToSend = templateService.renderEmbedTemplate(INVITE_LINK_DELETED_NOTIFICATION_EMBED_TEMPLATE_KEY, model); + List> messageFutures = postTargetService.sendEmbedInPostTarget(messageToSend, InviteFilterPostTarget.INVITE_DELETE_LOG, serverId); + FutureUtils.toSingleFutureGeneric(messageFutures).thenAccept(unused -> + log.trace("Successfully send notification about deleted invite link in message {}.", message.getIdLong()) + ).exceptionally(throwable -> { + log.error("Failed to send notification about deleted invite link in message {}.", message.getIdLong()); + return null; + }); + + } + + @Override + public FeatureEnum getFeature() { + return ModerationFeatures.INVITE_FILTER; + } + + @Override + public Integer getPriority() { + return ListenerPriority.HIGH; + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MessageDeleteLogListener.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/async/MessageDeleteLogListener.java similarity index 98% rename from abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MessageDeleteLogListener.java rename to abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/async/MessageDeleteLogListener.java index a37004940..74bc30f8f 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MessageDeleteLogListener.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/async/MessageDeleteLogListener.java @@ -1,4 +1,4 @@ -package dev.sheldan.abstracto.moderation.listener; +package dev.sheldan.abstracto.moderation.listener.async; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.listener.async.jda.AsyncMessageDeletedListener; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MessageEditedListener.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/async/MessageEditedListener.java similarity index 98% rename from abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MessageEditedListener.java rename to abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/async/MessageEditedListener.java index 22facb910..824078fa6 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MessageEditedListener.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/async/MessageEditedListener.java @@ -1,4 +1,4 @@ -package dev.sheldan.abstracto.moderation.listener; +package dev.sheldan.abstracto.moderation.listener.async; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.listener.async.jda.AsyncMessageTextUpdatedListener; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/repository/AllowedInviteLinkRepository.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/repository/AllowedInviteLinkRepository.java new file mode 100644 index 000000000..efa340b12 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/repository/AllowedInviteLinkRepository.java @@ -0,0 +1,20 @@ +package dev.sheldan.abstracto.moderation.repository; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.moderation.models.database.AllowedInviteLink; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.QueryHints; +import org.springframework.stereotype.Repository; + +import javax.persistence.QueryHint; +import java.util.Optional; + +@Repository +public interface AllowedInviteLinkRepository extends JpaRepository { + + @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) + Optional findByCodeAndServer(String code, AServer server); + + @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) + Optional findByCodeAndServer_Id(String code, Long serverId); +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/repository/FilteredInviteLinkRepository.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/repository/FilteredInviteLinkRepository.java new file mode 100644 index 000000000..09dc2e057 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/repository/FilteredInviteLinkRepository.java @@ -0,0 +1,27 @@ +package dev.sheldan.abstracto.moderation.repository; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.moderation.models.database.FilteredInviteLink; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.QueryHints; +import org.springframework.stereotype.Repository; + +import javax.persistence.QueryHint; +import java.util.List; +import java.util.Optional; + +@Repository +public interface FilteredInviteLinkRepository extends JpaRepository { + @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) + Optional findByCodeAndServer(String code, AServer server); + + @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) + Optional findByCodeAndServer_Id(String code, Long serverId); + + void deleteByServer_Id(Long serverId); + + void deleteByCodeAndServer_Id(String code, Long serverId); + + List findAllByServer_IdOrderByUsesDesc(Long serverId, Pageable pageable); +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/BanServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/BanServiceBean.java index d8bcd3efb..9e0877cf8 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/BanServiceBean.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/BanServiceBean.java @@ -7,7 +7,7 @@ import dev.sheldan.abstracto.core.service.FeatureModeService; import dev.sheldan.abstracto.core.service.PostTargetService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; -import dev.sheldan.abstracto.moderation.config.features.ModerationMode; +import dev.sheldan.abstracto.moderation.config.features.mode.ModerationMode; import dev.sheldan.abstracto.moderation.config.posttargets.ModerationPostTarget; import dev.sheldan.abstracto.templating.model.MessageToSend; import dev.sheldan.abstracto.templating.service.TemplateService; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/InviteLinkFilterServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/InviteLinkFilterServiceBean.java new file mode 100644 index 000000000..6e4caa85b --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/InviteLinkFilterServiceBean.java @@ -0,0 +1,112 @@ +package dev.sheldan.abstracto.moderation.service; + +import dev.sheldan.abstracto.core.models.ServerUser; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.moderation.exception.InvalidInviteException; +import dev.sheldan.abstracto.moderation.models.database.FilteredInviteLink; +import dev.sheldan.abstracto.moderation.service.management.AllowedInviteLinkManagement; +import dev.sheldan.abstracto.moderation.service.management.FilteredInviteLinkManagement; +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; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Component +public class InviteLinkFilterServiceBean implements InviteLinkFilterService { + + @Autowired + private AllowedInviteLinkManagement allowedInviteLinkManagement; + + @Autowired + private FilteredInviteLinkManagement filteredInviteLinkManagement; + + @Autowired + private ServerManagementService serverManagementService; + + private static final Pattern INVITE_CODE_PATTERN = Pattern.compile("(?[a-z0-9-]+)", Pattern.CASE_INSENSITIVE); + + @Override + public boolean isCodeFiltered(String code, ServerUser serverUser) { + return !isCodeAllowed(code, serverUser); + } + + @Override + public boolean isCodeAllowed(String code, ServerUser serverUser) { + return allowedInviteLinkManagement.allowedInviteLinkExists(serverUser, code); + } + + @Override + public boolean isCodeAllowed(String code, Long serverId) { + return allowedInviteLinkManagement.allowedInviteLinkExists(serverId, code); + } + + @Override + public void storeFilteredInviteLinkUsage(String code, ServerUser serverUser) { + Optional inviteLinkOptional = filteredInviteLinkManagement.findInviteLinkViaCode(serverUser.getServerId(), code); + if(inviteLinkOptional.isPresent()) { + inviteLinkOptional.ifPresent(filteredInviteLink -> filteredInviteLink.setUses(filteredInviteLink.getUses() + 1)); + } else { + AServer server = serverManagementService.loadServer(serverUser.getServerId()); + filteredInviteLinkManagement.createFilteredInviteLink(server, code); + } + } + + @Override + public void allowInvite(String invite, Long serverId) { + String inviteCode = extractCode(invite); + if(isCodeAllowed(inviteCode, serverId)) { + return; + } + AServer server = serverManagementService.loadServer(serverId); + allowedInviteLinkManagement.createAllowedInviteLink(server, inviteCode); + } + + private String extractCode(String invite) { + Matcher matcher = Message.INVITE_PATTERN.matcher(invite); + String inviteCode; + if(matcher.find()) { + inviteCode = matcher.group("code"); + } else { + Matcher codeOnlyMatcher = INVITE_CODE_PATTERN.matcher(invite); + if(codeOnlyMatcher.find()) { + inviteCode = codeOnlyMatcher.group("code"); + } else { + throw new InvalidInviteException("Invalid invite was provided."); + } + } + return inviteCode; + } + + @Override + public void disAllowInvite(String invite, Long serverId) { + String inviteCode = extractCode(invite); + AServer server = serverManagementService.loadServer(serverId); + allowedInviteLinkManagement.removeAllowedInviteLink(server, inviteCode); + } + + @Override + public void clearAllTrackedInviteCodes(Long serverId) { + filteredInviteLinkManagement.clearFilteredInviteLinks(serverId); + } + + @Override + public void clearAllUses(String code, Long serverId) { + String inviteCode = extractCode(code); + filteredInviteLinkManagement.clearFilteredInviteLink(inviteCode, serverId); + } + + @Override + public List getTopFilteredInviteLinks(Long serverId, Integer count) { + return filteredInviteLinkManagement.getTopFilteredInviteLink(serverId, count); + } + + @Override + public List getTopFilteredInviteLinks(Long serverId) { + return getTopFilteredInviteLinks(serverId, 5); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/KickServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/KickServiceBean.java index 23dc9332e..f64d22ad1 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/KickServiceBean.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/KickServiceBean.java @@ -4,7 +4,7 @@ import dev.sheldan.abstracto.core.service.FeatureModeService; import dev.sheldan.abstracto.core.service.PostTargetService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; -import dev.sheldan.abstracto.moderation.config.features.ModerationMode; +import dev.sheldan.abstracto.moderation.config.features.mode.ModerationMode; import dev.sheldan.abstracto.moderation.config.posttargets.ModerationPostTarget; import dev.sheldan.abstracto.moderation.models.template.commands.KickLogModel; import dev.sheldan.abstracto.templating.model.MessageToSend; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/MuteServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/MuteServiceBean.java index 41f2f4dcd..7908ca658 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/MuteServiceBean.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/MuteServiceBean.java @@ -12,7 +12,7 @@ import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; -import dev.sheldan.abstracto.moderation.config.features.MutingMode; +import dev.sheldan.abstracto.moderation.config.features.mode.MutingMode; import dev.sheldan.abstracto.moderation.config.posttargets.MutingPostTarget; import dev.sheldan.abstracto.moderation.exception.MuteRoleNotSetupException; import dev.sheldan.abstracto.moderation.exception.NoMuteFoundException; @@ -252,7 +252,7 @@ public class MuteServiceBean implements MuteService { if(featureModeService.featureModeActive(ModerationFeatures.MUTING, server, MutingMode.MUTE_LOGGING)) { log.trace("Sending unMute log for mute {} to the mute posttarget in server {}", muteLogModel.getMute().getMuteId().getId(), server.getId()); MessageToSend message = templateService.renderEmbedTemplate(UN_MUTE_LOG_TEMPLATE, muteLogModel); - List> completableFutures = postTargetService.sendEmbedInPostTarget(message, MutingPostTarget.MUTE_LOG, muteLogModel.getServer().getId()); + List> completableFutures = postTargetService.sendEmbedInPostTarget(message, MutingPostTarget.MUTE_LOG, server.getId()); completableFuture = FutureUtils.toSingleFutureGeneric(completableFutures); } else { completableFuture = CompletableFuture.completedFuture(null); @@ -338,7 +338,6 @@ public class MuteServiceBean implements MuteService { .mutingUser(mutingMemberFuture.join()) .unMutedUser(mutedMemberFuture.join()) .guild(guild) - .server(mutingServer) .build(); CompletableFuture notificationFuture = sendUnMuteLogMessage(unMuteLog, mutingServer); return CompletableFuture.allOf(notificationFuture).thenAccept(aVoid -> diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/WarnServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/WarnServiceBean.java index 118c9e5bc..a106f8462 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/WarnServiceBean.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/WarnServiceBean.java @@ -7,9 +7,9 @@ import dev.sheldan.abstracto.core.service.*; import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; -import dev.sheldan.abstracto.moderation.config.features.WarnDecayMode; +import dev.sheldan.abstracto.moderation.config.features.mode.WarnDecayMode; import dev.sheldan.abstracto.moderation.config.features.WarningDecayFeature; -import dev.sheldan.abstracto.moderation.config.features.WarningMode; +import dev.sheldan.abstracto.moderation.config.features.mode.WarningMode; import dev.sheldan.abstracto.moderation.config.posttargets.WarnDecayPostTarget; import dev.sheldan.abstracto.moderation.config.posttargets.WarningPostTarget; import dev.sheldan.abstracto.moderation.models.template.job.WarnDecayLogModel; @@ -215,7 +215,6 @@ public class WarnServiceBean implements WarnService { WarnDecayLogModel warnDecayLogModel = WarnDecayLogModel .builder() .guild(botService.getGuildById(server.getId())) - .server(server) .warnings(warnDecayWarnings) .build(); MessageToSend messageToSend = templateService.renderEmbedTemplate(WARN_DECAY_LOG_TEMPLATE_KEY, warnDecayLogModel); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/AllowedInviteLinkManagementBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/AllowedInviteLinkManagementBean.java new file mode 100644 index 000000000..f7233a7b1 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/AllowedInviteLinkManagementBean.java @@ -0,0 +1,48 @@ +package dev.sheldan.abstracto.moderation.service.management; + +import dev.sheldan.abstracto.core.models.ServerUser; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.moderation.exception.AllowedInviteLinkNotFound; +import dev.sheldan.abstracto.moderation.models.database.AllowedInviteLink; +import dev.sheldan.abstracto.moderation.repository.AllowedInviteLinkRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AllowedInviteLinkManagementBean implements AllowedInviteLinkManagement { + + @Autowired + private AllowedInviteLinkRepository repository; + + @Override + public AllowedInviteLink createAllowedInviteLink(AServer server, String code) { + AllowedInviteLink inviteLink = AllowedInviteLink.builder().code(code).server(server).build(); + return repository.save(inviteLink); + } + + @Override + public void removeAllowedInviteLink(AServer server, String code) { + AllowedInviteLink existingCode = findAllowedInviteLinkByCode(server, code); + repository.delete(existingCode); + } + + @Override + public AllowedInviteLink findAllowedInviteLinkByCode(AServer server, String code) { + return repository.findByCodeAndServer(code, server).orElseThrow(() -> new AllowedInviteLinkNotFound("Allowed invite code not found.")); + } + + @Override + public boolean allowedInviteLinkExists(AServer server, String code) { + return repository.findByCodeAndServer(code, server).isPresent(); + } + + @Override + public boolean allowedInviteLinkExists(Long serverId, String code) { + return repository.findByCodeAndServer_Id(code, serverId).isPresent(); + } + + @Override + public boolean allowedInviteLinkExists(ServerUser serverUser, String code) { + return repository.findByCodeAndServer_Id(code, serverUser.getServerId()).isPresent(); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/FilteredInviteLinkManagementBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/FilteredInviteLinkManagementBean.java new file mode 100644 index 000000000..b691f646d --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/FilteredInviteLinkManagementBean.java @@ -0,0 +1,64 @@ +package dev.sheldan.abstracto.moderation.service.management; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.moderation.models.database.FilteredInviteLink; +import dev.sheldan.abstracto.moderation.repository.FilteredInviteLinkRepository; +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 FilteredInviteLinkManagementBean implements FilteredInviteLinkManagement { + + @Autowired + private FilteredInviteLinkRepository repository; + + @Override + public FilteredInviteLink createFilteredInviteLink(AServer server, String code) { + FilteredInviteLink inviteLink = FilteredInviteLink + .builder() + .code(code) + .server(server) + .uses(1L) + .build(); + return repository.save(inviteLink); + } + + @Override + public Optional findInviteLinkViaCode(AServer server, String code) { + return repository.findByCodeAndServer(code, server); + } + + @Override + public Optional findInviteLinkViaCode(Long serverId, String code) { + return repository.findByCodeAndServer_Id(code, serverId); + } + + @Override + public void clearFilteredInviteLinks(Long serverId) { + repository.deleteByServer_Id(serverId); + } + + @Override + public void clearFilteredInviteLinks(AServer server) { + clearFilteredInviteLinks(server.getId()); + } + + @Override + public void clearFilteredInviteLink(String code, Long serverId) { + repository.deleteByCodeAndServer_Id(code, serverId); + } + + @Override + public void clearFilteredInviteLink(String code, AServer server) { + clearFilteredInviteLink(code, server.getId()); + } + + @Override + public List getTopFilteredInviteLink(Long serverId, Integer count) { + return repository.findAllByServer_IdOrderByUsesDesc(serverId, PageRequest.of(0, count)); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/command.xml b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/command.xml index 0e4d8e295..a5a2886c6 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/command.xml +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/command.xml @@ -13,6 +13,7 @@ + @@ -131,4 +132,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_config.xml b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_config.xml index 20688b7f5..e8a40d977 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_config.xml +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_config.xml @@ -13,7 +13,6 @@ - \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_feature_flag.xml b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_feature_flag.xml index 41f860c80..f31332b07 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_feature_flag.xml +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_feature_flag.xml @@ -12,6 +12,7 @@ + @@ -44,5 +45,10 @@ + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_feature_mode.xml b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_feature_mode.xml index d269b17ab..0e7e75a44 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_feature_mode.xml +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_feature_mode.xml @@ -10,6 +10,7 @@ + @@ -60,5 +61,17 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_posttarget.xml b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_posttarget.xml index 65e27ade8..2e16ca447 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_posttarget.xml +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/default_posttarget.xml @@ -44,5 +44,9 @@ + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/feature.xml b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/feature.xml index 28256b976..c53913f42 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/feature.xml +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-seedData/feature.xml @@ -32,5 +32,9 @@ + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-tables/allowed_invite_link.xml b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-tables/allowed_invite_link.xml new file mode 100644 index 000000000..0907f3599 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-tables/allowed_invite_link.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-tables/filtered_invite_link.xml b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-tables/filtered_invite_link.xml new file mode 100644 index 000000000..402db04db --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-tables/filtered_invite_link.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-tables/tables.xml b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-tables/tables.xml index ede063caa..8f5e1628c 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-tables/tables.xml +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/migrations/1.0-moderation/moderation-tables/tables.xml @@ -10,4 +10,6 @@ + + \ No newline at end of file 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 993ee588c..8f161399d 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 @@ -35,14 +35,14 @@ public class BanIdTest { private static final String REASON = "reason"; private static final Long BANNED_USER_ID = 4L; + private static final Long SERVER_ID = 3L; @Test public void testBanIdWithDefaultReason() { CommandContext parameters = CommandTestUtilities.getWithParameters(Arrays.asList(BANNED_USER_ID)); - Long guildId = parameters.getUserInitiatedContext().getServer().getId(); when(templateService.renderSimpleTemplate(Ban.BAN_DEFAULT_REASON_TEMPLATE)).thenReturn(REASON); - when(parameters.getGuild().getIdLong()).thenReturn(guildId); - when(banService.banUserViaId(eq(guildId), eq(BANNED_USER_ID), eq(REASON), banLogModelCaptor.capture())).thenReturn(CompletableFuture.completedFuture(null)); + when(parameters.getGuild().getIdLong()).thenReturn(SERVER_ID); + when(banService.banUserViaId(eq(SERVER_ID), eq(BANNED_USER_ID), eq(REASON), banLogModelCaptor.capture())).thenReturn(CompletableFuture.completedFuture(null)); CompletableFuture result = testUnit.executeAsync(parameters); BanIdLog usedModel = banLogModelCaptor.getValue(); Assert.assertEquals(REASON, usedModel.getReason()); @@ -55,10 +55,9 @@ public class BanIdTest { public void testBanWithReason() { String customReason = "reason2"; CommandContext parameters = CommandTestUtilities.getWithParameters(Arrays.asList(BANNED_USER_ID, customReason)); - Long guildId = parameters.getUserInitiatedContext().getServer().getId(); - when(parameters.getGuild().getIdLong()).thenReturn(guildId); + when(parameters.getGuild().getIdLong()).thenReturn(SERVER_ID); when(templateService.renderSimpleTemplate(Ban.BAN_DEFAULT_REASON_TEMPLATE)).thenReturn(REASON); - when(banService.banUserViaId(eq(guildId), eq(BANNED_USER_ID), eq(customReason), banLogModelCaptor.capture())).thenReturn(CompletableFuture.completedFuture(null)); + when(banService.banUserViaId(eq(SERVER_ID), eq(BANNED_USER_ID), eq(customReason), banLogModelCaptor.capture())).thenReturn(CompletableFuture.completedFuture(null)); CompletableFuture result = testUnit.executeAsync(parameters); BanIdLog usedModel = banLogModelCaptor.getValue(); Assert.assertEquals(customReason, usedModel.getReason()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DecayAllWarningsTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DecayAllWarningsTest.java index 67fdd3004..1f1895e90 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DecayAllWarningsTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DecayAllWarningsTest.java @@ -2,6 +2,8 @@ package dev.sheldan.abstracto.moderation.commands; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.moderation.service.WarnService; import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; @@ -9,6 +11,7 @@ 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.concurrent.CompletableFuture; @@ -24,10 +27,15 @@ public class DecayAllWarningsTest { @Mock private WarnService warnService; + @Mock + private ServerManagementService serverManagementService; + @Test public void testDecayAllWarnings() { CommandContext commandContext = CommandTestUtilities.getNoParameters(); - when(warnService.decayAllWarningsForServer(commandContext.getUserInitiatedContext().getServer())).thenReturn(CompletableFuture.completedFuture(null)); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(commandContext.getGuild())).thenReturn(server); + when(warnService.decayAllWarningsForServer(server)).thenReturn(CompletableFuture.completedFuture(null)); CompletableFuture result = testUnit.executeAsync(commandContext); CommandTestUtilities.checkSuccessfulCompletionAsync(result); } diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DecayWarningsTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DecayWarningsTest.java index 3baa42d49..fc9016d90 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DecayWarningsTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/DecayWarningsTest.java @@ -2,6 +2,8 @@ package dev.sheldan.abstracto.moderation.commands; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.moderation.service.WarnService; import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; @@ -10,6 +12,7 @@ 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.concurrent.CompletableFuture; @@ -26,10 +29,15 @@ public class DecayWarningsTest { @Mock private WarnService warnService; + @Mock + private ServerManagementService serverManagementService; + @Test public void testExecuteCommand() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); - when(warnService.decayWarningsForServer(noParameters.getUserInitiatedContext().getServer())).thenReturn(CompletableFuture.completedFuture(null)); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(warnService.decayWarningsForServer(server)).thenReturn(CompletableFuture.completedFuture(null)); CompletableFuture result = testUnit.executeAsync(noParameters); CommandTestUtilities.checkSuccessfulCompletionAsync(result); } 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 959a1c44e..bf4e5f27b 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 @@ -3,6 +3,8 @@ package dev.sheldan.abstracto.moderation.commands; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.execution.ResultState; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.moderation.service.management.UserNoteManagementService; import dev.sheldan.abstracto.templating.service.TemplateService; import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; @@ -12,6 +14,7 @@ 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; @@ -30,21 +33,28 @@ public class DeleteNoteTest { @Mock private TemplateService templateService; + @Mock + private ServerManagementService serverManagementService; + private static final Long NOTE_ID = 5L; @Test public void testDeleteExistingNote() { CommandContext parameters = CommandTestUtilities.getWithParameters(Arrays.asList(NOTE_ID)); - when(userNoteManagementService.noteExists(NOTE_ID, parameters.getUserInitiatedContext().getServer())).thenReturn(true); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(parameters.getGuild())).thenReturn(server); + when(userNoteManagementService.noteExists(NOTE_ID, server)).thenReturn(true); CommandResult result = testUnit.execute(parameters); CommandTestUtilities.checkSuccessfulCompletion(result); - verify(userNoteManagementService, times(1)).deleteNote(NOTE_ID, parameters.getUserInitiatedContext().getServer()); + verify(userNoteManagementService, times(1)).deleteNote(NOTE_ID, server); } @Test public void testDeleteNotExistingNote() { CommandContext parameters = CommandTestUtilities.getWithParameters(Arrays.asList(NOTE_ID)); - when(userNoteManagementService.noteExists(NOTE_ID, parameters.getUserInitiatedContext().getServer())).thenReturn(false); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(parameters.getGuild())).thenReturn(server); + when(userNoteManagementService.noteExists(NOTE_ID, server)).thenReturn(false); when(templateService.renderSimpleTemplate(DeleteNote.NOTE_NOT_FOUND_EXCEPTION_TEMPLATE)).thenReturn("error"); CommandResult result = testUnit.execute(parameters); Assert.assertEquals(ResultState.ERROR, result.getResult()); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/MyWarningsTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/MyWarningsTest.java index 126553158..7b495b1c6 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/MyWarningsTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/MyWarningsTest.java @@ -2,8 +2,10 @@ package dev.sheldan.abstracto.moderation.commands; 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.FeatureFlagService; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.moderation.config.features.WarningDecayFeature; import dev.sheldan.abstracto.moderation.models.template.commands.MyWarningsModel; import dev.sheldan.abstracto.moderation.service.management.WarnManagementService; @@ -12,10 +14,7 @@ import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; 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.*; import org.mockito.junit.MockitoJUnitRunner; import static org.mockito.Mockito.*; @@ -38,6 +37,9 @@ public class MyWarningsTest { @Mock private WarningDecayFeature warningDecayFeature; + @Mock + private UserInServerManagementService userInServerManagementService; + @Captor private ArgumentCaptor argumentCaptor; @@ -45,9 +47,11 @@ public class MyWarningsTest { public void testExecuteMyWarningsCommand() { CommandContext noParameter = CommandTestUtilities.getNoParameters(); Long activeWarnCount = 8L; - when(warnManagementService.getActiveWarnsForUser(noParameter.getUserInitiatedContext().getAUserInAServer())).thenReturn(activeWarnCount); + AUserInAServer aUserInAServer = Mockito.mock(AUserInAServer.class); + when(userInServerManagementService.loadUser(noParameter.getAuthor())).thenReturn(aUserInAServer); + when(warnManagementService.getActiveWarnsForUser(aUserInAServer)).thenReturn(activeWarnCount); Long totalWarnCount = 10L; - when(warnManagementService.getTotalWarnsForUser(noParameter.getUserInitiatedContext().getAUserInAServer())).thenReturn(totalWarnCount); + when(warnManagementService.getTotalWarnsForUser(aUserInAServer)).thenReturn(totalWarnCount); CommandResult result = testUnit.execute(noParameter); verify(channelService, times(1)).sendEmbedTemplateInChannel(eq(MyWarnings.MY_WARNINGS_RESPONSE_EMBED_TEMPLATE), argumentCaptor.capture(), eq(noParameter.getChannel())); CommandTestUtilities.checkSuccessfulCompletion(result); 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 e13e87ab5..6f7f22c89 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 @@ -2,8 +2,10 @@ package dev.sheldan.abstracto.moderation.commands; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.moderation.converter.UserNotesConverter; import dev.sheldan.abstracto.moderation.models.database.UserNote; @@ -48,6 +50,9 @@ public class UserNotesTest { @Mock private UserNotesConverter userNotesConverter; + @Mock + private ServerManagementService serverManagementService; + @Captor private ArgumentCaptor captor; @@ -55,7 +60,8 @@ public class UserNotesTest { public void testExecuteUserNotesCommandForMember() { Member member = Mockito.mock(Member.class); CommandContext parameters = CommandTestUtilities.getWithParameters(Arrays.asList(member)); - AUserInAServer userNoteUser = MockUtils.getUserObject(4L, parameters.getUserInitiatedContext().getServer()); + AServer server = Mockito.mock(AServer.class); + AUserInAServer userNoteUser = MockUtils.getUserObject(4L, server); when(userInServerManagementService.loadUser(member)).thenReturn(userNoteUser); UserNote firstNote = UserNote.builder().build(); UserNote secondNote = UserNote.builder().build(); @@ -86,7 +92,9 @@ public class UserNotesTest { UserNote firstNote = UserNote.builder().build(); UserNote secondNote = UserNote.builder().build(); List userNotes = Arrays.asList(firstNote, secondNote); - when(userNoteManagementService.loadNotesForServer(parameters.getUserInitiatedContext().getServer())).thenReturn(userNotes); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(parameters.getGuild())).thenReturn(server); + when(userNoteManagementService.loadNotesForServer(server)).thenReturn(userNotes); NoteEntryModel firstConvertedNote = NoteEntryModel.builder().build(); NoteEntryModel secondConvertedNote = NoteEntryModel.builder().build(); CompletableFuture> convertedNotes = CompletableFuture.completedFuture(Arrays.asList(firstConvertedNote, secondConvertedNote)); 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 cc826bab1..7a79a5f86 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 @@ -4,8 +4,10 @@ import com.jagrosh.jdautilities.commons.waiter.EventWaiter; import com.jagrosh.jdautilities.menu.Paginator; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.service.PaginatorService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.moderation.converter.WarnEntryConverter; import dev.sheldan.abstracto.moderation.models.database.Warning; @@ -45,6 +47,9 @@ public class WarningsTest { @Mock private PaginatorService paginatorService; + @Mock + private ServerManagementService serverManagementService; + @Mock private EventWaiter eventWaiter; @@ -63,7 +68,9 @@ public class WarningsTest { WarnEntry secondModelWarning = Mockito.mock(WarnEntry.class); List warningsToDisplay = Arrays.asList(firstWarning, secondWarning); List modelWarnings = Arrays.asList(firstModelWarning, secondModelWarning); - when(warnManagementService.getAllWarningsOfServer(noParams.getUserInitiatedContext().getServer())).thenReturn(warningsToDisplay); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(noParams.getGuild())).thenReturn(server); + when(warnManagementService.getAllWarningsOfServer(server)).thenReturn(warningsToDisplay); when(warnEntryConverter.fromWarnings(warningsToDisplay)).thenReturn(CompletableFuture.completedFuture(modelWarnings)); CompletableFuture result = testUnit.executeAsync(noParams); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/invite/AllowInviteTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/invite/AllowInviteTest.java new file mode 100644 index 000000000..31e9e94ac --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/invite/AllowInviteTest.java @@ -0,0 +1,43 @@ +package dev.sheldan.abstracto.moderation.commands.invite; + +import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; +import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; +import dev.sheldan.abstracto.moderation.service.InviteLinkFilterServiceBean; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import java.util.Arrays; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@RunWith(MockitoJUnitRunner.class) +public class AllowInviteTest { + + @InjectMocks + private AllowInvite testUnit; + + @Mock + private InviteLinkFilterServiceBean inviteLinkFilterServiceBean; + + private static final String INVITE_STRING = "invite"; + + @Test + public void testExecuteCommand() { + CommandContext parameters = CommandTestUtilities.getWithParameters(Arrays.asList(INVITE_STRING)); + CommandResult result = testUnit.execute(parameters); + CommandTestUtilities.checkSuccessfulCompletion(result); + verify(inviteLinkFilterServiceBean, times(1)).allowInvite(INVITE_STRING, parameters.getGuild().getIdLong()); + } + + @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/invite/DisAllowInviteTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/invite/DisAllowInviteTest.java new file mode 100644 index 000000000..d05075062 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/invite/DisAllowInviteTest.java @@ -0,0 +1,43 @@ +package dev.sheldan.abstracto.moderation.commands.invite; + +import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; +import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; +import dev.sheldan.abstracto.moderation.service.InviteLinkFilterServiceBean; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import java.util.Arrays; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@RunWith(MockitoJUnitRunner.class) +public class DisAllowInviteTest { + + @InjectMocks + private DisAllowInvite testUnit; + + @Mock + private InviteLinkFilterServiceBean inviteLinkFilterServiceBean; + + private static final String INVITE_STRING = "invite"; + + @Test + public void testExecuteCommand() { + CommandContext parameters = CommandTestUtilities.getWithParameters(Arrays.asList(INVITE_STRING)); + CommandResult result = testUnit.execute(parameters); + CommandTestUtilities.checkSuccessfulCompletion(result); + verify(inviteLinkFilterServiceBean, times(1)).disAllowInvite(INVITE_STRING, parameters.getGuild().getIdLong()); + } + + @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/invite/RemoveTrackedInviteLinksTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/invite/RemoveTrackedInviteLinksTest.java new file mode 100644 index 000000000..cd8d3ec70 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/invite/RemoveTrackedInviteLinksTest.java @@ -0,0 +1,51 @@ +package dev.sheldan.abstracto.moderation.commands.invite; + +import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; +import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; +import dev.sheldan.abstracto.moderation.service.InviteLinkFilterService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import java.util.Arrays; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@RunWith(MockitoJUnitRunner.class) +public class RemoveTrackedInviteLinksTest { + + @InjectMocks + private RemoveTrackedInviteLinks testUnit; + + @Mock + private InviteLinkFilterService inviteLinkFilterService; + + private static final String INVITE_STRING = "invite"; + + @Test + public void testExecuteCommandNoParameter() { + CommandContext parameters = CommandTestUtilities.getNoParameters(); + CommandResult result = testUnit.execute(parameters); + CommandTestUtilities.checkSuccessfulCompletion(result); + verify(inviteLinkFilterService, times(1)).clearAllTrackedInviteCodes(parameters.getGuild().getIdLong()); + } + + @Test + public void testExecuteCommandForSpecificInvite() { + CommandContext parameters = CommandTestUtilities.getWithParameters(Arrays.asList(INVITE_STRING)); + CommandResult result = testUnit.execute(parameters); + CommandTestUtilities.checkSuccessfulCompletion(result); + verify(inviteLinkFilterService, times(1)).clearAllUses(INVITE_STRING, parameters.getGuild().getIdLong()); + } + + @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/invite/ShowTrackedInviteLinksTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/invite/ShowTrackedInviteLinksTest.java new file mode 100644 index 000000000..5063dc81a --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/commands/invite/ShowTrackedInviteLinksTest.java @@ -0,0 +1,71 @@ +package dev.sheldan.abstracto.moderation.commands.invite; + +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.moderation.models.database.FilteredInviteLink; +import dev.sheldan.abstracto.moderation.models.template.commands.TrackedInviteLinksModel; +import dev.sheldan.abstracto.moderation.service.InviteLinkFilterService; +import dev.sheldan.abstracto.templating.model.MessageToSend; +import dev.sheldan.abstracto.templating.service.TemplateService; +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.concurrent.CompletableFuture; + +import static dev.sheldan.abstracto.moderation.commands.invite.ShowTrackedInviteLinks.TRACKED_INVITE_LINKS_EMBED_TEMPLATE_KEY; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class ShowTrackedInviteLinksTest { + + @InjectMocks + private ShowTrackedInviteLinks testUnit; + + @Mock + private InviteLinkFilterService inviteLinkFilterService; + + @Mock + private ChannelService channelService; + + @Mock + private TemplateService templateService; + + @Test + public void testExecuteCommandNoParameter() { + CommandContext parameters = CommandTestUtilities.getNoParameters(); + FilteredInviteLink filteredInviteLink = Mockito.mock(FilteredInviteLink.class); + when(inviteLinkFilterService.getTopFilteredInviteLinks(parameters.getGuild().getIdLong())).thenReturn(Arrays.asList(filteredInviteLink)); + MessageToSend messageToSend = Mockito.mock(MessageToSend.class); + when(templateService.renderEmbedTemplate(eq(TRACKED_INVITE_LINKS_EMBED_TEMPLATE_KEY), any(TrackedInviteLinksModel.class))).thenReturn(messageToSend); + when(channelService.sendMessageToSendToChannel(messageToSend, parameters.getChannel())).thenReturn(CommandTestUtilities.messageFutureList()); + CompletableFuture resultFuture = testUnit.executeAsync(parameters); + CommandTestUtilities.checkSuccessfulCompletionAsync(resultFuture); + } + + @Test + public void testExecuteCommandAmountParameter() { + Integer amount = 4; + CommandContext parameters = CommandTestUtilities.getWithParameters(Arrays.asList(amount)); + FilteredInviteLink filteredInviteLink = Mockito.mock(FilteredInviteLink.class); + when(inviteLinkFilterService.getTopFilteredInviteLinks(parameters.getGuild().getIdLong(), amount)).thenReturn(Arrays.asList(filteredInviteLink)); + MessageToSend messageToSend = Mockito.mock(MessageToSend.class); + when(templateService.renderEmbedTemplate(eq(TRACKED_INVITE_LINKS_EMBED_TEMPLATE_KEY), any(TrackedInviteLinksModel.class))).thenReturn(messageToSend); + when(channelService.sendMessageToSendToChannel(messageToSend, parameters.getChannel())).thenReturn(CommandTestUtilities.messageFutureList()); + CompletableFuture resultFuture = testUnit.executeAsync(parameters); + CommandTestUtilities.checkSuccessfulCompletionAsync(resultFuture); + } + + @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 7c691b8ac..f0509f9ca 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 @@ -3,7 +3,9 @@ package dev.sheldan.abstracto.moderation.commands.mute; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.models.database.ARole; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.management.RoleManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.moderation.service.management.MuteRoleManagementService; import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; @@ -31,6 +33,9 @@ public class SetMuteRoleTest { @Mock private RoleManagementService roleManagementService; + @Mock + private ServerManagementService serverManagementService; + @Test public void testExecuteCommand() { Role role = Mockito.mock(Role.class); @@ -39,8 +44,10 @@ public class SetMuteRoleTest { ARole aRole = Mockito.mock(ARole.class); when(roleManagementService.findRole(roleId)).thenReturn(aRole); CommandContext parameters = CommandTestUtilities.getWithParameters(Arrays.asList(role)); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(parameters.getGuild())).thenReturn(server); CommandResult result = testUnit.execute(parameters); - verify(muteRoleManagementService, times(1)).setMuteRoleForServer(parameters.getUserInitiatedContext().getServer(), aRole); + verify(muteRoleManagementService, times(1)).setMuteRoleForServer(server, aRole); CommandTestUtilities.checkSuccessfulCompletion(result); } diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/InviteLinkFilterListenerTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/InviteLinkFilterListenerTest.java new file mode 100644 index 000000000..896ec1327 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/InviteLinkFilterListenerTest.java @@ -0,0 +1,177 @@ +package dev.sheldan.abstracto.moderation.listener.async; + +import dev.sheldan.abstracto.core.execution.result.MessageReceivedListenerResult; +import dev.sheldan.abstracto.core.models.ServerUser; +import dev.sheldan.abstracto.core.service.FeatureModeService; +import dev.sheldan.abstracto.core.service.PostTargetService; +import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; +import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; +import dev.sheldan.abstracto.moderation.config.features.mode.InviteFilterMode; +import dev.sheldan.abstracto.moderation.config.posttargets.InviteFilterPostTarget; +import dev.sheldan.abstracto.moderation.models.template.listener.InviteDeletedModel; +import dev.sheldan.abstracto.moderation.service.InviteLinkFilterService; +import dev.sheldan.abstracto.templating.model.MessageToSend; +import dev.sheldan.abstracto.templating.service.TemplateService; +import net.dv8tion.jda.api.entities.*; +import net.dv8tion.jda.api.requests.restaction.AuditableRestAction; +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 static dev.sheldan.abstracto.moderation.listener.async.InviteLinkFilterListener.INVITE_LINK_DELETED_NOTIFICATION_EMBED_TEMPLATE_KEY; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class InviteLinkFilterListenerTest { + + @InjectMocks + private InviteLinkFilterListener testUnit; + + @Mock + private InviteLinkFilterService inviteLinkFilterService; + + @Mock + private FeatureModeService featureModeService; + + @Mock + private PostTargetService postTargetService; + + @Mock + private TemplateService templateService; + + @Mock + private Message message; + + @Mock + private User author; + + @Mock + private TextChannel textChannel; + + @Mock + private Guild guild; + + private static final Long SERVER_ID = 1L; + private static final Long CHANNEL_ID = 2L; + private static final Long USER_ID = 3L; + private static final Long MESSAGE_ID = 4L; + private static final String INVITE_CODE = "asdf"; + private static final String INVITE_LINK = "discord.gg/" + INVITE_CODE; + + @Test + public void testExecutionWithNoInvite() { + when(message.getContentRaw()).thenReturn("text"); + setupBasicMessage(); + MessageReceivedListenerResult result = testUnit.execute(message); + Assert.assertEquals(MessageReceivedListenerResult.PROCESSED, result); + } + + @Test + public void testExecutionWithOneAllowedInvite() { + when(message.getContentRaw()).thenReturn(INVITE_LINK); + when(inviteLinkFilterService.isCodeFiltered(eq(INVITE_CODE), any(ServerUser.class))).thenReturn(false); + setupBasicMessage(); + MessageReceivedListenerResult result = testUnit.execute(message); + Assert.assertEquals(MessageReceivedListenerResult.PROCESSED, result); + } + + @Test + public void testExecutionWithOneNotAllowedInviteNoTrackNoNotification() { + when(message.getContentRaw()).thenReturn(INVITE_LINK); + AuditableRestAction auditableRestAction = Mockito.mock(AuditableRestAction.class); + when(message.delete()).thenReturn(auditableRestAction); + when(inviteLinkFilterService.isCodeFiltered(eq(INVITE_CODE), any(ServerUser.class))).thenReturn(true); + when(featureModeService.featureModeActive(ModerationFeatures.INVITE_FILTER, SERVER_ID, InviteFilterMode.TRACK_USES)).thenReturn(false); + when(featureModeService.featureModeActive(ModerationFeatures.INVITE_FILTER, SERVER_ID, InviteFilterMode.FILTER_NOTIFICATIONS)).thenReturn(false); + setupBasicMessage(); + MessageReceivedListenerResult result = testUnit.execute(message); + Assert.assertEquals(MessageReceivedListenerResult.DELETED, result); + } + + @Test + public void testExecutionWithOneNotAllowedInviteTrackNoNotification() { + when(message.getContentRaw()).thenReturn(INVITE_LINK); + AuditableRestAction auditableRestAction = Mockito.mock(AuditableRestAction.class); + when(message.delete()).thenReturn(auditableRestAction); + when(inviteLinkFilterService.isCodeFiltered(eq(INVITE_CODE), any(ServerUser.class))).thenReturn(true); + when(featureModeService.featureModeActive(ModerationFeatures.INVITE_FILTER, SERVER_ID, InviteFilterMode.TRACK_USES)).thenReturn(true); + when(featureModeService.featureModeActive(ModerationFeatures.INVITE_FILTER, SERVER_ID, InviteFilterMode.FILTER_NOTIFICATIONS)).thenReturn(false); + setupBasicMessage(); + MessageReceivedListenerResult result = testUnit.execute(message); + Assert.assertEquals(MessageReceivedListenerResult.DELETED, result); + verifyTracking(); + } + + @Test + public void testExecutionWithOneNotAllowedInviteTrackNotification() { + when(message.getContentRaw()).thenReturn(INVITE_LINK); + AuditableRestAction auditableRestAction = Mockito.mock(AuditableRestAction.class); + when(message.delete()).thenReturn(auditableRestAction); + when(inviteLinkFilterService.isCodeFiltered(eq(INVITE_CODE), any(ServerUser.class))).thenReturn(true); + when(featureModeService.featureModeActive(ModerationFeatures.INVITE_FILTER, SERVER_ID, InviteFilterMode.TRACK_USES)).thenReturn(true); + when(featureModeService.featureModeActive(ModerationFeatures.INVITE_FILTER, SERVER_ID, InviteFilterMode.FILTER_NOTIFICATIONS)).thenReturn(true); + setupForNotification(); + setupBasicMessage(); + MessageReceivedListenerResult result = testUnit.execute(message); + Assert.assertEquals(MessageReceivedListenerResult.DELETED, result); + verifyTracking(); + } + + @Test + public void testExecutionWithOneNotAllowedInviteNoTrackNotification() { + when(message.getContentRaw()).thenReturn(INVITE_LINK); + AuditableRestAction auditableRestAction = Mockito.mock(AuditableRestAction.class); + when(message.delete()).thenReturn(auditableRestAction); + when(inviteLinkFilterService.isCodeFiltered(eq(INVITE_CODE), any(ServerUser.class))).thenReturn(true); + when(featureModeService.featureModeActive(ModerationFeatures.INVITE_FILTER, SERVER_ID, InviteFilterMode.TRACK_USES)).thenReturn(false); + when(featureModeService.featureModeActive(ModerationFeatures.INVITE_FILTER, SERVER_ID, InviteFilterMode.FILTER_NOTIFICATIONS)).thenReturn(true); + setupForNotification(); + setupBasicMessage(); + MessageReceivedListenerResult result = testUnit.execute(message); + Assert.assertEquals(MessageReceivedListenerResult.DELETED, result); + verify(inviteLinkFilterService, times(0)).storeFilteredInviteLinkUsage(eq(INVITE_CODE), any(ServerUser.class)); + } + + @Test + public void testExecutionWithOneNotAllowedInviteNoTrackNotificationNoPostTarget() { + when(message.getContentRaw()).thenReturn(INVITE_LINK); + AuditableRestAction auditableRestAction = Mockito.mock(AuditableRestAction.class); + when(message.delete()).thenReturn(auditableRestAction); + when(inviteLinkFilterService.isCodeFiltered(eq(INVITE_CODE), any(ServerUser.class))).thenReturn(true); + when(featureModeService.featureModeActive(ModerationFeatures.INVITE_FILTER, SERVER_ID, InviteFilterMode.TRACK_USES)).thenReturn(false); + when(featureModeService.featureModeActive(ModerationFeatures.INVITE_FILTER, SERVER_ID, InviteFilterMode.FILTER_NOTIFICATIONS)).thenReturn(true); + when(postTargetService.postTargetDefinedInServer(InviteFilterPostTarget.INVITE_DELETE_LOG, SERVER_ID)).thenReturn(false); + setupBasicMessage(); + MessageReceivedListenerResult result = testUnit.execute(message); + Assert.assertEquals(MessageReceivedListenerResult.DELETED, result); + verify(inviteLinkFilterService, times(0)).storeFilteredInviteLinkUsage(eq(INVITE_CODE), any(ServerUser.class)); + verify(templateService, times(0)).renderEmbedTemplate(eq(INVITE_LINK_DELETED_NOTIFICATION_EMBED_TEMPLATE_KEY), any(InviteDeletedModel.class)); + } + + private void verifyTracking() { + verify(inviteLinkFilterService, times(1)).storeFilteredInviteLinkUsage(eq(INVITE_CODE), any(ServerUser.class)); + } + + private void setupForNotification() { + when(postTargetService.postTargetDefinedInServer(InviteFilterPostTarget.INVITE_DELETE_LOG, SERVER_ID)).thenReturn(true); + MessageToSend messageToSend = Mockito.mock(MessageToSend.class); + when(templateService.renderEmbedTemplate(eq(INVITE_LINK_DELETED_NOTIFICATION_EMBED_TEMPLATE_KEY), any(InviteDeletedModel.class))).thenReturn(messageToSend); + when(postTargetService.sendEmbedInPostTarget(messageToSend, InviteFilterPostTarget.INVITE_DELETE_LOG, SERVER_ID)).thenReturn(CommandTestUtilities.messageFutureList()); + when(textChannel.getIdLong()).thenReturn(CHANNEL_ID); + when(message.getIdLong()).thenReturn(MESSAGE_ID); + when(message.getTextChannel()).thenReturn(textChannel); + } + + private void setupBasicMessage() { + when(message.getAuthor()).thenReturn(author); + when(author.getIdLong()).thenReturn(USER_ID); + when(message.getGuild()).thenReturn(guild); + when(guild.getIdLong()).thenReturn(SERVER_ID); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/JoinLoggerTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/JoinLoggerTest.java similarity index 94% rename from abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/JoinLoggerTest.java rename to abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/JoinLoggerTest.java index 5d773a632..f20c979d2 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/JoinLoggerTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/JoinLoggerTest.java @@ -1,10 +1,9 @@ -package dev.sheldan.abstracto.moderation.listener; +package dev.sheldan.abstracto.moderation.listener.async; import dev.sheldan.abstracto.core.models.ServerUser; import dev.sheldan.abstracto.core.service.BotService; import dev.sheldan.abstracto.core.service.PostTargetService; import dev.sheldan.abstracto.moderation.config.posttargets.LoggingPostTarget; -import dev.sheldan.abstracto.moderation.listener.async.JoinLogger; import dev.sheldan.abstracto.templating.service.TemplateService; import net.dv8tion.jda.api.entities.Member; import org.junit.Test; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/JoinMuteListenerTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/JoinMuteListenerTest.java similarity index 94% rename from abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/JoinMuteListenerTest.java rename to abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/JoinMuteListenerTest.java index 43d5c48f3..fedf08fbd 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/JoinMuteListenerTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/JoinMuteListenerTest.java @@ -1,9 +1,8 @@ -package dev.sheldan.abstracto.moderation.listener; +package dev.sheldan.abstracto.moderation.listener.async; import dev.sheldan.abstracto.core.models.ServerUser; import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; -import dev.sheldan.abstracto.moderation.listener.async.JoinMuteListener; import dev.sheldan.abstracto.moderation.service.MuteService; import dev.sheldan.abstracto.moderation.service.management.MuteManagementService; import net.dv8tion.jda.api.entities.Guild; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/LeaveLoggerTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/LeaveLoggerTest.java similarity index 94% rename from abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/LeaveLoggerTest.java rename to abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/LeaveLoggerTest.java index 416ce7b6e..65c3ab5c1 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/LeaveLoggerTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/LeaveLoggerTest.java @@ -1,10 +1,9 @@ -package dev.sheldan.abstracto.moderation.listener; +package dev.sheldan.abstracto.moderation.listener.async; import dev.sheldan.abstracto.core.models.ServerUser; import dev.sheldan.abstracto.core.service.BotService; import dev.sheldan.abstracto.core.service.PostTargetService; import dev.sheldan.abstracto.moderation.config.posttargets.LoggingPostTarget; -import dev.sheldan.abstracto.moderation.listener.async.LeaveLogger; import dev.sheldan.abstracto.templating.service.TemplateService; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.User; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/MessageDeleteLogListenerTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/MessageDeleteLogListenerTest.java similarity index 99% rename from abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/MessageDeleteLogListenerTest.java rename to abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/MessageDeleteLogListenerTest.java index 3b173035c..86fc86ca2 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/MessageDeleteLogListenerTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/MessageDeleteLogListenerTest.java @@ -1,4 +1,4 @@ -package dev.sheldan.abstracto.moderation.listener; +package dev.sheldan.abstracto.moderation.listener.async; import dev.sheldan.abstracto.core.models.cache.CachedAttachment; import dev.sheldan.abstracto.core.models.cache.CachedAuthor; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/MessageEditedListenerTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/MessageEditedListenerTest.java similarity index 98% rename from abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/MessageEditedListenerTest.java rename to abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/MessageEditedListenerTest.java index c808efbe0..725b8d4e7 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/MessageEditedListenerTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/async/MessageEditedListenerTest.java @@ -1,4 +1,4 @@ -package dev.sheldan.abstracto.moderation.listener; +package dev.sheldan.abstracto.moderation.listener.async; import dev.sheldan.abstracto.core.models.cache.CachedAuthor; import dev.sheldan.abstracto.core.models.cache.CachedMessage; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/BanServiceBeanTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/BanServiceBeanTest.java index e3d873714..cd55ff231 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/BanServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/BanServiceBeanTest.java @@ -6,7 +6,7 @@ import dev.sheldan.abstracto.core.service.BotService; import dev.sheldan.abstracto.core.service.FeatureModeService; import dev.sheldan.abstracto.core.service.PostTargetService; import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; -import dev.sheldan.abstracto.moderation.config.features.ModerationMode; +import dev.sheldan.abstracto.moderation.config.features.mode.ModerationMode; import dev.sheldan.abstracto.moderation.config.posttargets.ModerationPostTarget; import dev.sheldan.abstracto.templating.model.MessageToSend; import dev.sheldan.abstracto.templating.service.TemplateService; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/InviteLinkFilterServiceBeanTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/InviteLinkFilterServiceBeanTest.java new file mode 100644 index 000000000..3036ca2c7 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/InviteLinkFilterServiceBeanTest.java @@ -0,0 +1,155 @@ +package dev.sheldan.abstracto.moderation.service; + +import dev.sheldan.abstracto.core.models.ServerUser; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.moderation.exception.InvalidInviteException; +import dev.sheldan.abstracto.moderation.models.database.FilteredInviteLink; +import dev.sheldan.abstracto.moderation.service.management.AllowedInviteLinkManagement; +import dev.sheldan.abstracto.moderation.service.management.FilteredInviteLinkManagement; +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.Arrays; +import java.util.List; +import java.util.Optional; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class InviteLinkFilterServiceBeanTest { + + @InjectMocks + private InviteLinkFilterServiceBean testUnit; + + @Mock + private AllowedInviteLinkManagement allowedInviteLinkManagement; + + @Mock + private FilteredInviteLinkManagement filteredInviteLinkManagement; + + @Mock + private ServerManagementService serverManagementService; + + @Mock + private AServer server; + + @Mock + private ServerUser serverUser; + + private static final String INVITE_CODE = "asdf"; + private static final String FULL_INVITE = "discord.gg/" + INVITE_CODE; + private static final Long SERVER_ID = 1L; + + @Test + public void testIsCodeAllowedViaId() { + when(allowedInviteLinkManagement.allowedInviteLinkExists(SERVER_ID, FULL_INVITE)).thenReturn(true); + boolean codeAllowed = testUnit.isCodeAllowed(FULL_INVITE, SERVER_ID); + Assert.assertTrue(codeAllowed); + } + + @Test + public void testIsCodeAllowed() { + when(allowedInviteLinkManagement.allowedInviteLinkExists(serverUser, FULL_INVITE)).thenReturn(true); + boolean codeAllowed = testUnit.isCodeAllowed(FULL_INVITE, serverUser); + Assert.assertTrue(codeAllowed); + } + + @Test + public void testIsCodeFiltered() { + when(allowedInviteLinkManagement.allowedInviteLinkExists(serverUser, FULL_INVITE)).thenReturn(true); + boolean codeAllowed = testUnit.isCodeFiltered(FULL_INVITE, serverUser); + Assert.assertFalse(codeAllowed); + } + + @Test + public void testStoreFilteredInviteLinkUsage() { + when(serverUser.getServerId()).thenReturn(SERVER_ID); + FilteredInviteLink mockedFilteredInviteLink = Mockito.mock(FilteredInviteLink.class); + when(mockedFilteredInviteLink.getUses()).thenReturn(1L); + when(filteredInviteLinkManagement.findInviteLinkViaCode(SERVER_ID, FULL_INVITE)).thenReturn(Optional.of(mockedFilteredInviteLink)); + testUnit.storeFilteredInviteLinkUsage(FULL_INVITE, serverUser); + verify(mockedFilteredInviteLink, times(1)).setUses(2L); + } + + @Test + public void testStoreFilteredInviteLinkUsageNotPresent() { + when(serverUser.getServerId()).thenReturn(SERVER_ID); + when(serverManagementService.loadServer(SERVER_ID)).thenReturn(server); + when(filteredInviteLinkManagement.findInviteLinkViaCode(SERVER_ID, FULL_INVITE)).thenReturn(Optional.empty()); + testUnit.storeFilteredInviteLinkUsage(FULL_INVITE, serverUser); + verify(filteredInviteLinkManagement, times(1)).createFilteredInviteLink(server, FULL_INVITE); + } + + @Test + public void testAllowInvite() { + when(allowedInviteLinkManagement.allowedInviteLinkExists(SERVER_ID, INVITE_CODE)).thenReturn(false); + when(serverManagementService.loadServer(SERVER_ID)).thenReturn(server); + testUnit.allowInvite(FULL_INVITE, SERVER_ID); + verify(allowedInviteLinkManagement, times(1)).createAllowedInviteLink(server, INVITE_CODE); + } + + @Test(expected = InvalidInviteException.class) + public void testAllowInviteIllegalInvite() { + testUnit.allowInvite("#", SERVER_ID); + } + + @Test + public void testAllowInviteInviteCode() { + when(allowedInviteLinkManagement.allowedInviteLinkExists(SERVER_ID, INVITE_CODE)).thenReturn(false); + when(serverManagementService.loadServer(SERVER_ID)).thenReturn(server); + testUnit.allowInvite(INVITE_CODE, SERVER_ID); + verify(allowedInviteLinkManagement, times(1)).createAllowedInviteLink(server, INVITE_CODE); + } + + @Test + public void testAllowInviteAlreadyPresent() { + when(allowedInviteLinkManagement.allowedInviteLinkExists(SERVER_ID, INVITE_CODE)).thenReturn(true); + testUnit.allowInvite(FULL_INVITE, SERVER_ID); + verify(allowedInviteLinkManagement, times(0)).createAllowedInviteLink(any(AServer.class), anyString()); + } + + @Test + public void testDisallowInvite() { + when(serverManagementService.loadServer(SERVER_ID)).thenReturn(server); + testUnit.disAllowInvite(FULL_INVITE, SERVER_ID); + verify(allowedInviteLinkManagement, times(1)).removeAllowedInviteLink(server, INVITE_CODE); + } + + @Test + public void testClearAllTrackedInviteCodes() { + testUnit.clearAllTrackedInviteCodes(SERVER_ID); + verify(filteredInviteLinkManagement, times(1)).clearFilteredInviteLinks(SERVER_ID); + } + + @Test + public void testClearAllUses() { + testUnit.clearAllUses(FULL_INVITE, SERVER_ID); + verify(filteredInviteLinkManagement, times(1)).clearFilteredInviteLink(INVITE_CODE, SERVER_ID); + } + + @Test + public void testGetTopFilteredInviteLinksWithCount() { + int count = 4; + FilteredInviteLink mockedFilteredInviteLink = Mockito.mock(FilteredInviteLink.class); + when(filteredInviteLinkManagement.getTopFilteredInviteLink(SERVER_ID, count)).thenReturn(Arrays.asList(mockedFilteredInviteLink)); + List filteredInviteLinks = testUnit.getTopFilteredInviteLinks(SERVER_ID, count); + Assert.assertEquals(1, filteredInviteLinks.size()); + Assert.assertEquals(mockedFilteredInviteLink, filteredInviteLinks.get(0)); + } + + @Test + public void testGetTopFilteredInviteLinksDefaultCount() { + FilteredInviteLink mockedFilteredInviteLink = Mockito.mock(FilteredInviteLink.class); + when(filteredInviteLinkManagement.getTopFilteredInviteLink(SERVER_ID, 5)).thenReturn(Arrays.asList(mockedFilteredInviteLink)); + List filteredInviteLinks = testUnit.getTopFilteredInviteLinks(SERVER_ID); + Assert.assertEquals(1, filteredInviteLinks.size()); + Assert.assertEquals(mockedFilteredInviteLink, filteredInviteLinks.get(0)); + } + +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/KickServiceBeanTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/KickServiceBeanTest.java index 8e4ff53da..5a4d7d085 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/KickServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/KickServiceBeanTest.java @@ -4,7 +4,7 @@ import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.FeatureModeService; import dev.sheldan.abstracto.core.service.PostTargetService; import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; -import dev.sheldan.abstracto.moderation.config.features.ModerationMode; +import dev.sheldan.abstracto.moderation.config.features.mode.ModerationMode; import dev.sheldan.abstracto.moderation.config.posttargets.ModerationPostTarget; import dev.sheldan.abstracto.moderation.models.template.commands.KickLogModel; import dev.sheldan.abstracto.templating.model.MessageToSend; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/MuteServiceBeanTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/MuteServiceBeanTest.java index 70f0bd02c..22c73c619 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/MuteServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/MuteServiceBeanTest.java @@ -12,7 +12,7 @@ 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.moderation.config.features.ModerationFeatures; -import dev.sheldan.abstracto.moderation.config.features.MutingMode; +import dev.sheldan.abstracto.moderation.config.features.mode.MutingMode; import dev.sheldan.abstracto.moderation.config.posttargets.MutingPostTarget; import dev.sheldan.abstracto.moderation.exception.MuteRoleNotSetupException; import dev.sheldan.abstracto.moderation.exception.NoMuteFoundException; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/WarnServiceBeanTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/WarnServiceBeanTest.java index ee8748a59..8a8b74531 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/WarnServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/WarnServiceBeanTest.java @@ -6,16 +6,14 @@ import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.service.*; import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; -import dev.sheldan.abstracto.moderation.config.features.WarnDecayMode; +import dev.sheldan.abstracto.moderation.config.features.mode.WarnDecayMode; import dev.sheldan.abstracto.moderation.config.features.WarningDecayFeature; -import dev.sheldan.abstracto.moderation.config.features.WarningMode; -import dev.sheldan.abstracto.moderation.config.posttargets.WarnDecayPostTarget; +import dev.sheldan.abstracto.moderation.config.features.mode.WarningMode; import dev.sheldan.abstracto.moderation.config.posttargets.WarningPostTarget; import dev.sheldan.abstracto.moderation.models.database.Warning; import dev.sheldan.abstracto.moderation.models.template.commands.WarnContext; import dev.sheldan.abstracto.moderation.models.template.commands.WarnNotification; import dev.sheldan.abstracto.moderation.models.template.job.WarnDecayLogModel; -import dev.sheldan.abstracto.moderation.models.template.job.WarnDecayWarning; import dev.sheldan.abstracto.moderation.service.management.WarnManagementService; import dev.sheldan.abstracto.templating.model.MessageToSend; import dev.sheldan.abstracto.templating.service.TemplateService; @@ -23,7 +21,6 @@ import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.User; -import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.*; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/management/AllowedInviteLinkManagementBeanTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/management/AllowedInviteLinkManagementBeanTest.java new file mode 100644 index 000000000..999e89cf5 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/management/AllowedInviteLinkManagementBeanTest.java @@ -0,0 +1,98 @@ +package dev.sheldan.abstracto.moderation.service.management; + +import dev.sheldan.abstracto.core.models.ServerUser; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.moderation.exception.AllowedInviteLinkNotFound; +import dev.sheldan.abstracto.moderation.models.database.AllowedInviteLink; +import dev.sheldan.abstracto.moderation.repository.AllowedInviteLinkRepository; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.*; +import org.mockito.junit.MockitoJUnitRunner; + +import java.util.Optional; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class AllowedInviteLinkManagementBeanTest { + + @InjectMocks + private AllowedInviteLinkManagementBean testUnit; + + @Mock + private AllowedInviteLinkRepository repository; + + @Mock + private AServer server; + + @Mock + private AllowedInviteLink mockedInviteLink; + + private static final Long SERVER_ID = 1L; + private static final String INVITE = "invite"; + + @Captor + private ArgumentCaptor linkCaptor; + + @Test + public void testCreateAllowedInviteLink() { + when(repository.save(linkCaptor.capture())).thenReturn(mockedInviteLink); + AllowedInviteLink allowedInviteLink = testUnit.createAllowedInviteLink(server, INVITE); + verify(repository, times(1)).save(linkCaptor.capture()); + Assert.assertEquals(allowedInviteLink, mockedInviteLink); + AllowedInviteLink repositoryAllowedInviteLink = linkCaptor.getValue(); + Assert.assertEquals(server, repositoryAllowedInviteLink.getServer()); + Assert.assertEquals(INVITE, repositoryAllowedInviteLink.getCode()); + } + + @Test + public void testRemoveAllowedInviteLink() { + when(repository.findByCodeAndServer(INVITE, server)).thenReturn(Optional.of(mockedInviteLink)); + testUnit.removeAllowedInviteLink(server, INVITE); + verify(repository, times(1)).delete(mockedInviteLink); + } + + @Test(expected = AllowedInviteLinkNotFound.class) + public void testRemoveNotPresentAllowedInviteLink() { + when(repository.findByCodeAndServer(INVITE, server)).thenReturn(Optional.empty()); + testUnit.removeAllowedInviteLink(server, INVITE); + } + + @Test + public void testFindAllowedInviteLinkByCode() { + when(repository.findByCodeAndServer(INVITE, server)).thenReturn(Optional.of(mockedInviteLink)); + AllowedInviteLink allowedInviteLinkByCode = testUnit.findAllowedInviteLinkByCode(server, INVITE); + Assert.assertEquals(mockedInviteLink, allowedInviteLinkByCode); + } + + @Test(expected = AllowedInviteLinkNotFound.class) + public void testFindNotPresentAllowedInviteLinkByCode() { + when(repository.findByCodeAndServer(INVITE, server)).thenReturn(Optional.empty()); + testUnit.findAllowedInviteLinkByCode(server, INVITE); + } + + @Test + public void testAllowedInviteLinkExists() { + when(repository.findByCodeAndServer(INVITE, server)).thenReturn(Optional.of(mockedInviteLink)); + boolean exists = testUnit.allowedInviteLinkExists(server, INVITE); + Assert.assertTrue(exists); + } + + @Test + public void testAllowedInviteLinkExistsViaId() { + when(repository.findByCodeAndServer_Id(INVITE, SERVER_ID)).thenReturn(Optional.of(mockedInviteLink)); + boolean exists = testUnit.allowedInviteLinkExists(SERVER_ID, INVITE); + Assert.assertTrue(exists); + } + + @Test + public void testAllowedInviteLinkExistsViaServerUser() { + ServerUser serverUser = Mockito.mock(ServerUser.class); + when(serverUser.getServerId()).thenReturn(SERVER_ID); + when(repository.findByCodeAndServer_Id(INVITE, SERVER_ID)).thenReturn(Optional.of(mockedInviteLink)); + boolean exists = testUnit.allowedInviteLinkExists(serverUser, INVITE); + Assert.assertTrue(exists); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/management/FilteredInviteLinkManagementBeanTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/management/FilteredInviteLinkManagementBeanTest.java new file mode 100644 index 000000000..a2593bc02 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/management/FilteredInviteLinkManagementBeanTest.java @@ -0,0 +1,102 @@ +package dev.sheldan.abstracto.moderation.service.management; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.moderation.models.database.FilteredInviteLink; +import dev.sheldan.abstracto.moderation.repository.FilteredInviteLinkRepository; +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.Optional; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class FilteredInviteLinkManagementBeanTest { + + @InjectMocks + private FilteredInviteLinkManagementBean testUnit; + + @Mock + private FilteredInviteLinkRepository repository; + + @Mock + private AServer server; + + @Mock + private FilteredInviteLink mockedFilteredLink; + + private static final String INVITE = "invite"; + private static final Long SERVER_ID = 1L; + + @Captor + private ArgumentCaptor linkCaptor; + + @Test + public void testCreateFilteredInviteLink() { + when(repository.save(linkCaptor.capture())).thenReturn(mockedFilteredLink); + FilteredInviteLink filteredInviteLink = testUnit.createFilteredInviteLink(server, INVITE); + verify(repository, times(1)).save(linkCaptor.capture()); + Assert.assertEquals(filteredInviteLink, mockedFilteredLink); + FilteredInviteLink repositoryFilteredInviteLink = linkCaptor.getValue(); + Assert.assertEquals(server, repositoryFilteredInviteLink.getServer()); + Assert.assertEquals(INVITE, repositoryFilteredInviteLink.getCode()); + Assert.assertEquals(1, repositoryFilteredInviteLink.getUses().intValue()); + } + + @Test + public void testFindInviteLinkViaCode() { + when(repository.findByCodeAndServer(INVITE, server)).thenReturn(Optional.of(mockedFilteredLink)); + Optional filteredInviteLinkOptional = testUnit.findInviteLinkViaCode(server, INVITE); + Assert.assertTrue(filteredInviteLinkOptional.isPresent()); + filteredInviteLinkOptional.ifPresent(filteredInviteLink -> Assert.assertEquals(mockedFilteredLink, filteredInviteLink)); + } + + @Test + public void testFindInviteLinkViaCodeById() { + when(repository.findByCodeAndServer_Id(INVITE, SERVER_ID)).thenReturn(Optional.of(mockedFilteredLink)); + Optional filteredInviteLinkOptional = testUnit.findInviteLinkViaCode(SERVER_ID, INVITE); + Assert.assertTrue(filteredInviteLinkOptional.isPresent()); + filteredInviteLinkOptional.ifPresent(filteredInviteLink -> Assert.assertEquals(mockedFilteredLink, filteredInviteLink)); + } + + @Test + public void testClearFilteredInviteLinksViaId() { + testUnit.clearFilteredInviteLinks(SERVER_ID); + verify(repository, times(1)).deleteByServer_Id(SERVER_ID); + } + + @Test + public void testClearFilteredInviteLinks() { + when(server.getId()).thenReturn(SERVER_ID); + testUnit.clearFilteredInviteLinks(server); + verify(repository, times(1)).deleteByServer_Id(SERVER_ID); + } + + @Test + public void testClearFilteredInviteLinkViaId() { + testUnit.clearFilteredInviteLink(INVITE, SERVER_ID); + verify(repository, times(1)).deleteByCodeAndServer_Id(INVITE, SERVER_ID); + } + + @Test + public void testClearFilteredInviteLink() { + when(server.getId()).thenReturn(SERVER_ID); + testUnit.clearFilteredInviteLink(INVITE, server); + verify(repository, times(1)).deleteByCodeAndServer_Id(INVITE, SERVER_ID); + } + + @Test + public void testGetTopFilteredInviteLink() { + Integer count = 4; + testUnit.getTopFilteredInviteLink(SERVER_ID, count); + ArgumentCaptor pageableArgumentCaptor = ArgumentCaptor.forClass(Pageable.class); + verify(repository, times(1)).findAllByServer_IdOrderByUsesDesc(eq(SERVER_ID), pageableArgumentCaptor.capture()); + Pageable paginator = pageableArgumentCaptor.getValue(); + Assert.assertEquals(count.intValue(), paginator.getPageSize()); + Assert.assertEquals(0, paginator.getPageNumber()); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/InviteFilterFeature.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/InviteFilterFeature.java new file mode 100644 index 000000000..229eb0862 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/InviteFilterFeature.java @@ -0,0 +1,24 @@ +package dev.sheldan.abstracto.moderation.config.features; + +import dev.sheldan.abstracto.core.config.FeatureConfig; +import dev.sheldan.abstracto.core.config.FeatureEnum; +import dev.sheldan.abstracto.core.config.PostTargetEnum; +import dev.sheldan.abstracto.moderation.config.posttargets.InviteFilterPostTarget; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +@Component +public class InviteFilterFeature implements FeatureConfig { + @Override + public FeatureEnum getFeature() { + return ModerationFeatures.INVITE_FILTER; + } + + @Override + public List getRequiredPostTargets() { + return Arrays.asList(InviteFilterPostTarget.INVITE_DELETE_LOG); + } + +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationFeature.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationFeature.java index ebee5f76d..efe4f52d4 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationFeature.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationFeature.java @@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureConfig; import dev.sheldan.abstracto.core.config.FeatureMode; import dev.sheldan.abstracto.core.config.PostTargetEnum; +import dev.sheldan.abstracto.moderation.config.features.mode.ModerationMode; import dev.sheldan.abstracto.moderation.config.posttargets.ModerationPostTarget; import org.springframework.stereotype.Component; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationFeatures.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationFeatures.java index aef4b7c41..b02b04e57 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationFeatures.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationFeatures.java @@ -5,7 +5,13 @@ import lombok.Getter; @Getter public enum ModerationFeatures implements FeatureEnum { - MODERATION("moderation"), WARNING("warnings"), LOGGING("logging"), MUTING("muting"), AUTOMATIC_WARN_DECAY("warnDecay"), USER_NOTES("userNotes"); + MODERATION("moderation"), + WARNING("warnings"), + LOGGING("logging"), + MUTING("muting"), + AUTOMATIC_WARN_DECAY("warnDecay"), + USER_NOTES("userNotes"), + INVITE_FILTER("inviteFilter"); private final String key; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/MutingFeature.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/MutingFeature.java index 955c6c82d..40d2456cc 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/MutingFeature.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/MutingFeature.java @@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.config.FeatureConfig; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureMode; import dev.sheldan.abstracto.core.config.PostTargetEnum; +import dev.sheldan.abstracto.moderation.config.features.mode.MutingMode; import dev.sheldan.abstracto.moderation.config.posttargets.MutingPostTarget; import org.springframework.stereotype.Component; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarningDecayFeature.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarningDecayFeature.java index 0339dbf59..3a377ebb6 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarningDecayFeature.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarningDecayFeature.java @@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.config.FeatureConfig; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureMode; import dev.sheldan.abstracto.core.config.PostTargetEnum; +import dev.sheldan.abstracto.moderation.config.features.mode.WarnDecayMode; import dev.sheldan.abstracto.moderation.config.posttargets.WarnDecayPostTarget; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarningFeature.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarningFeature.java index f7041ae59..445e992d2 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarningFeature.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarningFeature.java @@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.config.FeatureConfig; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureMode; import dev.sheldan.abstracto.core.config.PostTargetEnum; +import dev.sheldan.abstracto.moderation.config.features.mode.WarningMode; import dev.sheldan.abstracto.moderation.config.posttargets.WarningPostTarget; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/InviteFilterMode.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/InviteFilterMode.java new file mode 100644 index 000000000..e46c589de --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/InviteFilterMode.java @@ -0,0 +1,16 @@ +package dev.sheldan.abstracto.moderation.config.features.mode; + +import dev.sheldan.abstracto.core.config.FeatureMode; +import lombok.Getter; + +@Getter +public enum InviteFilterMode implements FeatureMode { + TRACK_USES("trackUses"), FILTER_NOTIFICATIONS("filterNotifications"); + + private final String key; + + InviteFilterMode(String key) { + this.key = key; + } + +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationMode.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/ModerationMode.java similarity index 82% rename from abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationMode.java rename to abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/ModerationMode.java index cfcbbbad4..035b9949d 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationMode.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/ModerationMode.java @@ -1,4 +1,4 @@ -package dev.sheldan.abstracto.moderation.config.features; +package dev.sheldan.abstracto.moderation.config.features.mode; import dev.sheldan.abstracto.core.config.FeatureMode; import lombok.Getter; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/MutingMode.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/MutingMode.java similarity index 84% rename from abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/MutingMode.java rename to abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/MutingMode.java index 46bccb114..c0b35709b 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/MutingMode.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/MutingMode.java @@ -1,4 +1,4 @@ -package dev.sheldan.abstracto.moderation.config.features; +package dev.sheldan.abstracto.moderation.config.features.mode; import dev.sheldan.abstracto.core.config.FeatureMode; import lombok.Getter; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarnDecayMode.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/WarnDecayMode.java similarity index 82% rename from abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarnDecayMode.java rename to abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/WarnDecayMode.java index af45afbc4..8e0ef323c 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarnDecayMode.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/WarnDecayMode.java @@ -1,4 +1,4 @@ -package dev.sheldan.abstracto.moderation.config.features; +package dev.sheldan.abstracto.moderation.config.features.mode; import dev.sheldan.abstracto.core.config.FeatureMode; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarningMode.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/WarningMode.java similarity index 82% rename from abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarningMode.java rename to abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/WarningMode.java index 02d2ed3cf..61f832d8d 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/WarningMode.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/mode/WarningMode.java @@ -1,4 +1,4 @@ -package dev.sheldan.abstracto.moderation.config.features; +package dev.sheldan.abstracto.moderation.config.features.mode; import dev.sheldan.abstracto.core.config.FeatureMode; import lombok.Getter; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/posttargets/InviteFilterPostTarget.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/posttargets/InviteFilterPostTarget.java new file mode 100644 index 000000000..73b791a2e --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/posttargets/InviteFilterPostTarget.java @@ -0,0 +1,16 @@ +package dev.sheldan.abstracto.moderation.config.posttargets; + +import dev.sheldan.abstracto.core.config.PostTargetEnum; +import lombok.Getter; + +@Getter +public enum InviteFilterPostTarget implements PostTargetEnum { + INVITE_DELETE_LOG("inviteDeleteLog"); + + private String key; + + InviteFilterPostTarget(String key) { + this.key = key; + } +} + diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/exception/AllowedInviteLinkNotFound.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/exception/AllowedInviteLinkNotFound.java new file mode 100644 index 000000000..def95e96b --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/exception/AllowedInviteLinkNotFound.java @@ -0,0 +1,21 @@ +package dev.sheldan.abstracto.moderation.exception; + +import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException; +import dev.sheldan.abstracto.templating.Templatable; + +public class AllowedInviteLinkNotFound extends AbstractoRunTimeException implements Templatable { + + public AllowedInviteLinkNotFound(String message) { + super(message); + } + + @Override + public String getTemplateName() { + return "allowed_invite_link_not_found_exception"; + } + + @Override + public Object getTemplateModel() { + return new Object(); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/exception/InvalidInviteException.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/exception/InvalidInviteException.java new file mode 100644 index 000000000..ff12e826e --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/exception/InvalidInviteException.java @@ -0,0 +1,21 @@ +package dev.sheldan.abstracto.moderation.exception; + +import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException; +import dev.sheldan.abstracto.templating.Templatable; + +public class InvalidInviteException extends AbstractoRunTimeException implements Templatable { + + public InvalidInviteException(String message) { + super(message); + } + + @Override + public String getTemplateName() { + return "invalid_invite_link_exception"; + } + + @Override + public Object getTemplateModel() { + return new Object(); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/database/AllowedInviteLink.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/database/AllowedInviteLink.java new file mode 100644 index 000000000..6830959ec --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/database/AllowedInviteLink.java @@ -0,0 +1,41 @@ +package dev.sheldan.abstracto.moderation.models.database; + +import dev.sheldan.abstracto.core.models.database.AServer; +import lombok.*; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +import javax.persistence.*; +import java.time.Instant; + +@Entity +@Table(name="allowed_invite_link") +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +@EqualsAndHashCode +@Cacheable +@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class AllowedInviteLink { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "code") + private String code; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "server_id", nullable = false) + private AServer server; + + + @Column(name = "created") + private Instant created; + + @PrePersist + private void onInsert() { + this.created = Instant.now(); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/database/FilteredInviteLink.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/database/FilteredInviteLink.java new file mode 100644 index 000000000..026f1dd97 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/database/FilteredInviteLink.java @@ -0,0 +1,54 @@ +package dev.sheldan.abstracto.moderation.models.database; + +import dev.sheldan.abstracto.core.models.database.AServer; +import lombok.*; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +import javax.persistence.*; +import java.time.Instant; + +@Entity +@Table(name = "filtered_invite_link") +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +@EqualsAndHashCode +@Cacheable +@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class FilteredInviteLink { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "code") + private String code; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "server_id", nullable = false) + private AServer server; + + /** + * The amount of times, this invite code has been tried. + */ + @Column(name = "uses") + private Long uses; + + @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/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/commands/TrackedInviteLinksModel.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/commands/TrackedInviteLinksModel.java new file mode 100644 index 000000000..e8ede9a3c --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/commands/TrackedInviteLinksModel.java @@ -0,0 +1,16 @@ +package dev.sheldan.abstracto.moderation.models.template.commands; + +import dev.sheldan.abstracto.core.models.context.SlimUserInitiatedServerContext; +import dev.sheldan.abstracto.moderation.models.database.FilteredInviteLink; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +import java.util.List; + +@Getter +@Setter +@SuperBuilder +public class TrackedInviteLinksModel extends SlimUserInitiatedServerContext { + private List inviteLinks; +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/listener/InviteDeletedModel.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/listener/InviteDeletedModel.java new file mode 100644 index 000000000..88f9e093a --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/listener/InviteDeletedModel.java @@ -0,0 +1,22 @@ +package dev.sheldan.abstracto.moderation.models.template.listener; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.TextChannel; + +import java.util.List; + +@Getter +@Setter +@Builder +public class InviteDeletedModel { + private Guild guild; + private TextChannel channel; + private Member author; + private Message message; + private List invites; +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/InviteLinkFilterService.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/InviteLinkFilterService.java new file mode 100644 index 000000000..10ffbd9a3 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/InviteLinkFilterService.java @@ -0,0 +1,19 @@ +package dev.sheldan.abstracto.moderation.service; + +import dev.sheldan.abstracto.core.models.ServerUser; +import dev.sheldan.abstracto.moderation.models.database.FilteredInviteLink; + +import java.util.List; + +public interface InviteLinkFilterService { + boolean isCodeFiltered(String code, ServerUser serverUser); + boolean isCodeAllowed(String code, ServerUser serverUser); + boolean isCodeAllowed(String code, Long serverId); + void storeFilteredInviteLinkUsage(String code, ServerUser serverUser); + void allowInvite(String invite, Long serverId); + void disAllowInvite(String invite, Long serverId); + void clearAllTrackedInviteCodes(Long serverId); + void clearAllUses(String code, Long serverId); + List getTopFilteredInviteLinks(Long serverId, Integer count); + List getTopFilteredInviteLinks(Long serverId); +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/management/AllowedInviteLinkManagement.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/management/AllowedInviteLinkManagement.java new file mode 100644 index 000000000..acc2923ce --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/management/AllowedInviteLinkManagement.java @@ -0,0 +1,14 @@ +package dev.sheldan.abstracto.moderation.service.management; + +import dev.sheldan.abstracto.core.models.ServerUser; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.moderation.models.database.AllowedInviteLink; + +public interface AllowedInviteLinkManagement { + AllowedInviteLink createAllowedInviteLink(AServer server, String code); + void removeAllowedInviteLink(AServer server, String code); + AllowedInviteLink findAllowedInviteLinkByCode(AServer server, String code); + boolean allowedInviteLinkExists(AServer server, String code); + boolean allowedInviteLinkExists(Long serverId, String code); + boolean allowedInviteLinkExists(ServerUser serverUser, String code); +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/management/FilteredInviteLinkManagement.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/management/FilteredInviteLinkManagement.java new file mode 100644 index 000000000..adab76af7 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/management/FilteredInviteLinkManagement.java @@ -0,0 +1,18 @@ +package dev.sheldan.abstracto.moderation.service.management; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.moderation.models.database.FilteredInviteLink; + +import java.util.List; +import java.util.Optional; + +public interface FilteredInviteLinkManagement { + FilteredInviteLink createFilteredInviteLink(AServer server, String code); + Optional findInviteLinkViaCode(AServer server, String code); + Optional findInviteLinkViaCode(Long serverId, String code); + void clearFilteredInviteLinks(Long serverId); + void clearFilteredInviteLinks(AServer server); + void clearFilteredInviteLink(String code, Long serverId); + void clearFilteredInviteLink(String code, AServer server); + List getTopFilteredInviteLink(Long serverId, Integer count); +} diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/AnonReply.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/AnonReply.java index 666365326..b92498bce 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/AnonReply.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/AnonReply.java @@ -8,7 +8,9 @@ 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.AChannel; import dev.sheldan.abstracto.core.service.BotService; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.config.ModMailFeatures; import dev.sheldan.abstracto.modmail.models.database.ModMailThread; @@ -40,12 +42,16 @@ public class AnonReply extends AbstractConditionableCommand { @Autowired private BotService botService; + @Autowired + private ChannelManagementService channelManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); // text is optional, for example if only an attachment is sent String text = parameters.size() == 1 ? (String) parameters.get(0) : ""; - ModMailThread thread = modMailThreadManagementService.getByChannel(commandContext.getUserInitiatedContext().getChannel()); + AChannel channel = channelManagementService.loadChannel(commandContext.getChannel()); + ModMailThread thread = modMailThreadManagementService.getByChannel(channel); Long threadId = thread.getId(); return botService.getMemberInServerAsync(thread.getUser()).thenCompose(member -> modMailThreadService.relayMessageToDm(threadId, text, commandContext.getMessage(), true, commandContext.getChannel(), commandContext.getUndoActions(), member) diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/Close.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/Close.java index c9a431c38..63d77b9de 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/Close.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/Close.java @@ -8,6 +8,8 @@ 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.AChannel; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.config.ModMailFeatures; import dev.sheldan.abstracto.modmail.models.database.ModMailThread; @@ -41,13 +43,16 @@ public class Close extends AbstractConditionableCommand { @Autowired private TemplateService templateService; + @Autowired + private ChannelManagementService channelManagementService; @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); // the default value of the note is configurable via template String note = parameters.size() == 1 ? (String) parameters.get(0) : templateService.renderTemplate("modmail_close_default_note", new Object()); - ModMailThread thread = modMailThreadManagementService.getByChannel(commandContext.getUserInitiatedContext().getChannel()); + AChannel channel = channelManagementService.loadChannel(commandContext.getChannel()); + ModMailThread thread = modMailThreadManagementService.getByChannel(channel); return modMailThreadService.closeModMailThread(thread, note, true, commandContext.getUndoActions(), true) .thenApply(aVoid -> CommandResult.fromIgnored()); } diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/CloseNoLog.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/CloseNoLog.java index c176f92cb..4e9ff5e2c 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/CloseNoLog.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/CloseNoLog.java @@ -8,6 +8,8 @@ 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.AChannel; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.config.ModMailFeatures; import dev.sheldan.abstracto.modmail.config.ModMailMode; @@ -42,9 +44,13 @@ public class CloseNoLog extends AbstractConditionableCommand { @Autowired private TemplateService templateService; + @Autowired + private ChannelManagementService channelManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { - ModMailThread thread = modMailThreadManagementService.getByChannel(commandContext.getUserInitiatedContext().getChannel()); + AChannel channel = channelManagementService.loadChannel(commandContext.getChannel()); + ModMailThread thread = modMailThreadManagementService.getByChannel(channel); // we don't have a note, therefore we cant pass any, the method handles this accordingly return modMailThreadService.closeModMailThread(thread, null, false, commandContext.getUndoActions(), false) .thenApply(aVoid -> CommandResult.fromIgnored()); diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/CloseSilently.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/CloseSilently.java index cfcc72019..5c1546b47 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/CloseSilently.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/CloseSilently.java @@ -8,6 +8,8 @@ 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.AChannel; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.config.ModMailFeatures; import dev.sheldan.abstracto.modmail.models.database.ModMailThread; @@ -39,12 +41,17 @@ public class CloseSilently extends AbstractConditionableCommand { @Autowired private TemplateService templateService; + + @Autowired + private ChannelManagementService channelManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); // default note text is configurable via template, because the note is optional String note = parameters.size() == 1 ? (String) parameters.get(0) : templateService.renderTemplate("modmail_close_default_note", new Object()); - ModMailThread thread = modMailThreadManagementService.getByChannel(commandContext.getUserInitiatedContext().getChannel()); + AChannel channel = channelManagementService.loadChannel(commandContext.getChannel()); + ModMailThread thread = modMailThreadManagementService.getByChannel(channel); return modMailThreadService.closeModMailThread(thread, note, false, commandContext.getUndoActions(), true) .thenApply(aVoid -> CommandResult.fromIgnored()); } diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/Reply.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/Reply.java index 5f2275b71..f5c38b8b6 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/Reply.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/Reply.java @@ -8,7 +8,9 @@ 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.AChannel; import dev.sheldan.abstracto.core.service.BotService; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.config.ModMailFeatures; import dev.sheldan.abstracto.modmail.models.database.ModMailThread; @@ -39,11 +41,15 @@ public class Reply extends AbstractConditionableCommand { @Autowired private BotService botService; + @Autowired + private ChannelManagementService channelManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String text = parameters.size() == 1 ? (String) parameters.get(0) : ""; - ModMailThread thread = modMailThreadManagementService.getByChannel(commandContext.getUserInitiatedContext().getChannel()); + AChannel channel = channelManagementService.loadChannel(commandContext.getChannel()); + ModMailThread thread = modMailThreadManagementService.getByChannel(channel); Long threadId = thread.getId(); return botService.getMemberInServerAsync(thread.getUser()).thenCompose(member -> modMailThreadService.relayMessageToDm(threadId, text, commandContext.getMessage(), false, commandContext.getChannel(), commandContext.getUndoActions(), member) diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/Subscribe.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/Subscribe.java index f17fa6b0e..83935a5e6 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/Subscribe.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/Subscribe.java @@ -7,6 +7,7 @@ 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.management.UserInServerManagementService; import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.config.ModMailFeatures; import dev.sheldan.abstracto.modmail.models.database.ModMailThread; @@ -34,10 +35,13 @@ public class Subscribe extends AbstractConditionableCommand { @Autowired private ModMailSubscriptionService modMailSubscriptionService; + @Autowired + private UserInServerManagementService userInServerManagementService; + @Override public CommandResult execute(CommandContext commandContext) { ModMailThread modMailThread = modMailThreadManagementService.getByChannelId(commandContext.getChannel().getIdLong()); - modMailSubscriptionService.subscribeToThread(commandContext.getUserInitiatedContext().getAUserInAServer(), modMailThread); + modMailSubscriptionService.subscribeToThread(userInServerManagementService.loadUser(commandContext.getAuthor()), modMailThread); return CommandResult.fromSuccess(); } diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/UnSubscribe.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/UnSubscribe.java index 7be9321ed..cbfbf89a2 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/UnSubscribe.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/UnSubscribe.java @@ -7,6 +7,8 @@ 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.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.config.ModMailFeatures; import dev.sheldan.abstracto.modmail.models.database.ModMailThread; @@ -34,10 +36,14 @@ public class UnSubscribe extends AbstractConditionableCommand { @Autowired private ModMailSubscriptionService modMailSubscriptionService; + @Autowired + private UserInServerManagementService userInServerManagementService; + @Override public CommandResult execute(CommandContext commandContext) { ModMailThread modMailThread = modMailThreadManagementService.getByChannelId(commandContext.getChannel().getIdLong()); - modMailSubscriptionService.unsubscribeFromThread(commandContext.getUserInitiatedContext().getAUserInAServer(), modMailThread); + AUserInAServer aUserInAServer = userInServerManagementService.loadUser(commandContext.getAuthor()); + modMailSubscriptionService.unsubscribeFromThread(aUserInAServer, modMailThread); return CommandResult.fromSuccess(); } diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/condition/RequiresModMailCondition.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/condition/RequiresModMailCondition.java index 727a35167..f470308a1 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/condition/RequiresModMailCondition.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/commands/condition/RequiresModMailCondition.java @@ -3,6 +3,7 @@ package dev.sheldan.abstracto.modmail.commands.condition; import dev.sheldan.abstracto.core.command.Command; import dev.sheldan.abstracto.core.command.condition.ConditionResult; import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.condition.detail.NotInModMailThreadConditionDetail; import dev.sheldan.abstracto.modmail.models.database.ModMailThread; @@ -26,9 +27,12 @@ public class RequiresModMailCondition implements ModMailContextCondition { @Autowired private TemplateService templateService; + @Autowired + private ChannelManagementService channelManagementService; + @Override public ConditionResult shouldExecute(CommandContext commandContext, Command command) { - Optional threadOptional = modMailThreadManagementService.getByChannelOptional(commandContext.getUserInitiatedContext().getChannel()); + Optional threadOptional = modMailThreadManagementService.getByChannelOptional(channelManagementService.loadChannel(commandContext.getChannel())); if(threadOptional.isPresent()) { return ConditionResult.builder().result(true).build(); } 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 ab80ef3c2..7a7b9ac76 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 @@ -7,7 +7,9 @@ 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.AServer; import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.statistic.config.StatisticFeatures; import dev.sheldan.abstracto.statistic.emotes.config.EmoteTrackingModule; @@ -38,6 +40,9 @@ public class DeletedEmoteStats extends AbstractConditionableCommand { @Autowired private ChannelService channelService; + @Autowired + private ServerManagementService serverManagementService; + public static final String EMOTE_STATS_STATIC_DELETED_RESPONSE = "deletedEmoteStats_static_response"; public static final String EMOTE_STATS_ANIMATED_DELETED_RESPONSE = "deletedEmoteStats_animated_response"; @@ -51,7 +56,8 @@ public class DeletedEmoteStats extends AbstractConditionableCommand { Duration duration = (Duration) parameters.get(0); statsSince = Instant.now().minus(duration); } - EmoteStatsModel emoteStatsModel = usedEmoteService.getDeletedEmoteStatsForServerSince(commandContext.getUserInitiatedContext().getServer(), statsSince); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + EmoteStatsModel emoteStatsModel = usedEmoteService.getDeletedEmoteStatsForServerSince(server, statsSince); List> messagePromises = new ArrayList<>(); // only show the embed, if there are static emotes to show if(!emoteStatsModel.getStaticEmotes().isEmpty()) { 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 900e64c09..2f4b7b764 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 @@ -7,7 +7,9 @@ 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.AServer; import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.statistic.config.StatisticFeatures; import dev.sheldan.abstracto.statistic.emotes.config.EmoteTrackingModule; @@ -38,6 +40,9 @@ public class EmoteStats extends AbstractConditionableCommand { @Autowired private ChannelService channelService; + @Autowired + private ServerManagementService serverManagementService; + public static final String EMOTE_STATS_STATIC_RESPONSE = "emoteStats_static_response"; public static final String EMOTE_STATS_ANIMATED_RESPONSE = "emoteStats_animated_response"; public static final String EMOTE_STATS_NO_STATS_AVAILABLE = "emoteStats_no_stats_available"; @@ -52,7 +57,8 @@ public class EmoteStats extends AbstractConditionableCommand { Duration duration = (Duration) parameters.get(0); statsSince = Instant.now().minus(duration); } - EmoteStatsModel emoteStatsModel = usedEmoteService.getActiveEmoteStatsForServerSince(commandContext.getUserInitiatedContext().getServer(), statsSince); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + EmoteStatsModel emoteStatsModel = usedEmoteService.getActiveEmoteStatsForServerSince(server, statsSince); List> messagePromises = new ArrayList<>(); // only show embed if static emote stats are available if(!emoteStatsModel.getStaticEmotes().isEmpty()) { 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 d64f6dca9..51fa672a0 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 @@ -8,7 +8,9 @@ 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.AServer; import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.statistic.config.StatisticFeatures; import dev.sheldan.abstracto.statistic.emotes.config.EmoteTrackingMode; @@ -41,6 +43,9 @@ public class ExternalEmoteStats extends AbstractConditionableCommand { @Autowired private ChannelService channelService; + @Autowired + private ServerManagementService serverManagementService; + public static final String EMOTE_STATS_STATIC_EXTERNAL_RESPONSE = "externalEmoteStats_static_response"; public static final String EMOTE_STATS_ANIMATED_EXTERNAL_RESPONSE = "externalEmoteStats_animated_response"; @@ -54,7 +59,8 @@ public class ExternalEmoteStats extends AbstractConditionableCommand { Duration duration = (Duration) parameters.get(0); statsSince = Instant.now().minus(duration); } - EmoteStatsModel emoteStatsModel = usedEmoteService.getExternalEmoteStatsForServerSince(commandContext.getUserInitiatedContext().getServer(), statsSince); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + EmoteStatsModel emoteStatsModel = usedEmoteService.getExternalEmoteStatsForServerSince(server, statsSince); List> messagePromises = new ArrayList<>(); // only show embed if static emote stats are available 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 080becfe8..bc6acf2ab 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,7 +1,9 @@ package dev.sheldan.abstracto.statistic.emotes.command; import dev.sheldan.abstracto.core.command.execution.CommandContext; +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.statistic.config.StatisticFeatures; @@ -38,6 +40,12 @@ public class DeletedEmoteStatsTest { @Mock private ChannelService channelService; + @Mock + private ServerManagementService serverManagementService; + + @Mock + private AServer server; + @Test public void testWithoutParameterStaticEmotes() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); @@ -45,7 +53,8 @@ public class DeletedEmoteStatsTest { EmoteStatsResultDisplay display = Mockito.mock(EmoteStatsResultDisplay.class); when(model.getStaticEmotes()).thenReturn(Arrays.asList(display)); when(model.areStatsAvailable()).thenReturn(true); - when(usedEmoteService.getDeletedEmoteStatsForServerSince(noParameters.getUserInitiatedContext().getServer(), Instant.EPOCH)).thenReturn(model); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(usedEmoteService.getDeletedEmoteStatsForServerSince(server, Instant.EPOCH)).thenReturn(model); when(channelService.sendEmbedTemplateInChannel(EMOTE_STATS_STATIC_DELETED_RESPONSE, model, noParameters.getChannel())).thenReturn(CommandTestUtilities.messageFutureList()); CommandTestUtilities.checkSuccessfulCompletionAsync(testUnit.executeAsync(noParameters)); } @@ -57,7 +66,8 @@ public class DeletedEmoteStatsTest { EmoteStatsResultDisplay display = Mockito.mock(EmoteStatsResultDisplay.class); when(model.getAnimatedEmotes()).thenReturn(Arrays.asList(display)); when(model.areStatsAvailable()).thenReturn(true); - when(usedEmoteService.getDeletedEmoteStatsForServerSince(noParameters.getUserInitiatedContext().getServer(), Instant.EPOCH)).thenReturn(model); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(usedEmoteService.getDeletedEmoteStatsForServerSince(server, Instant.EPOCH)).thenReturn(model); when(channelService.sendEmbedTemplateInChannel(EMOTE_STATS_ANIMATED_DELETED_RESPONSE, model, noParameters.getChannel())).thenReturn(CommandTestUtilities.messageFutureList()); CommandTestUtilities.checkSuccessfulCompletionAsync(testUnit.executeAsync(noParameters)); } @@ -67,7 +77,8 @@ public class DeletedEmoteStatsTest { CommandContext noParameters = CommandTestUtilities.getNoParameters(); EmoteStatsModel model = Mockito.mock(EmoteStatsModel.class); when(model.areStatsAvailable()).thenReturn(false); - when(usedEmoteService.getDeletedEmoteStatsForServerSince(noParameters.getUserInitiatedContext().getServer(), Instant.EPOCH)).thenReturn(model); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(usedEmoteService.getDeletedEmoteStatsForServerSince(server, Instant.EPOCH)).thenReturn(model); when(channelService.sendEmbedTemplateInChannel(eq(EmoteStats.EMOTE_STATS_NO_STATS_AVAILABLE), any(), eq(noParameters.getChannel()))).thenReturn(CommandTestUtilities.messageFutureList()); CommandTestUtilities.checkSuccessfulCompletionAsync(testUnit.executeAsync(noParameters)); } @@ -79,7 +90,8 @@ public class DeletedEmoteStatsTest { EmoteStatsResultDisplay display = Mockito.mock(EmoteStatsResultDisplay.class); when(model.getStaticEmotes()).thenReturn(Arrays.asList(display)); when(model.areStatsAvailable()).thenReturn(true); - when(usedEmoteService.getDeletedEmoteStatsForServerSince(eq(noParameters.getUserInitiatedContext().getServer()), any(Instant.class))).thenReturn(model); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(usedEmoteService.getDeletedEmoteStatsForServerSince(eq(server), any(Instant.class))).thenReturn(model); when(channelService.sendEmbedTemplateInChannel(EMOTE_STATS_STATIC_DELETED_RESPONSE, model, noParameters.getChannel())).thenReturn(CommandTestUtilities.messageFutureList()); CommandTestUtilities.checkSuccessfulCompletionAsync(testUnit.executeAsync(noParameters)); } 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 f808610d3..6314538c6 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,7 +1,9 @@ package dev.sheldan.abstracto.statistic.emotes.command; import dev.sheldan.abstracto.core.command.execution.CommandContext; +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.statistic.config.StatisticFeatures; @@ -38,6 +40,12 @@ public class EmoteStatsTest { @Mock private ChannelService channelService; + @Mock + private ServerManagementService serverManagementService; + + @Mock + private AServer server; + @Test public void testWithoutParameterStaticEmotes() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); @@ -45,7 +53,8 @@ public class EmoteStatsTest { EmoteStatsResultDisplay display = Mockito.mock(EmoteStatsResultDisplay.class); when(model.getStaticEmotes()).thenReturn(Arrays.asList(display)); when(model.areStatsAvailable()).thenReturn(true); - when(usedEmoteService.getActiveEmoteStatsForServerSince(noParameters.getUserInitiatedContext().getServer(), Instant.EPOCH)).thenReturn(model); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(usedEmoteService.getActiveEmoteStatsForServerSince(server, Instant.EPOCH)).thenReturn(model); when(channelService.sendEmbedTemplateInChannel(EMOTE_STATS_STATIC_RESPONSE, model, noParameters.getChannel())).thenReturn(CommandTestUtilities.messageFutureList()); CommandTestUtilities.checkSuccessfulCompletionAsync(testUnit.executeAsync(noParameters)); } @@ -57,7 +66,8 @@ public class EmoteStatsTest { EmoteStatsResultDisplay display = Mockito.mock(EmoteStatsResultDisplay.class); when(model.getAnimatedEmotes()).thenReturn(Arrays.asList(display)); when(model.areStatsAvailable()).thenReturn(true); - when(usedEmoteService.getActiveEmoteStatsForServerSince(noParameters.getUserInitiatedContext().getServer(), Instant.EPOCH)).thenReturn(model); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(usedEmoteService.getActiveEmoteStatsForServerSince(server, Instant.EPOCH)).thenReturn(model); when(channelService.sendEmbedTemplateInChannel(EMOTE_STATS_ANIMATED_RESPONSE, model, noParameters.getChannel())).thenReturn(CommandTestUtilities.messageFutureList()); CommandTestUtilities.checkSuccessfulCompletionAsync(testUnit.executeAsync(noParameters)); } @@ -67,7 +77,8 @@ public class EmoteStatsTest { CommandContext noParameters = CommandTestUtilities.getNoParameters(); EmoteStatsModel model = Mockito.mock(EmoteStatsModel.class); when(model.areStatsAvailable()).thenReturn(false); - when(usedEmoteService.getActiveEmoteStatsForServerSince(noParameters.getUserInitiatedContext().getServer(), Instant.EPOCH)).thenReturn(model); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(usedEmoteService.getActiveEmoteStatsForServerSince(server, Instant.EPOCH)).thenReturn(model); when(channelService.sendEmbedTemplateInChannel(eq(EmoteStats.EMOTE_STATS_NO_STATS_AVAILABLE), any(), eq(noParameters.getChannel()))).thenReturn(CommandTestUtilities.messageFutureList()); CommandTestUtilities.checkSuccessfulCompletionAsync(testUnit.executeAsync(noParameters)); } @@ -79,7 +90,8 @@ public class EmoteStatsTest { EmoteStatsResultDisplay display = Mockito.mock(EmoteStatsResultDisplay.class); when(model.getStaticEmotes()).thenReturn(Arrays.asList(display)); when(model.areStatsAvailable()).thenReturn(true); - when(usedEmoteService.getActiveEmoteStatsForServerSince(eq(noParameters.getUserInitiatedContext().getServer()), any(Instant.class))).thenReturn(model); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(usedEmoteService.getActiveEmoteStatsForServerSince(eq(server), any(Instant.class))).thenReturn(model); when(channelService.sendEmbedTemplateInChannel(EMOTE_STATS_STATIC_RESPONSE, model, noParameters.getChannel())).thenReturn(CommandTestUtilities.messageFutureList()); CommandTestUtilities.checkSuccessfulCompletionAsync(testUnit.executeAsync(noParameters)); } 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 9ae5be24c..a4ab22afa 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,7 +1,9 @@ package dev.sheldan.abstracto.statistic.emotes.command; import dev.sheldan.abstracto.core.command.execution.CommandContext; +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.statistic.config.StatisticFeatures; @@ -38,6 +40,12 @@ public class ExternalEmoteStatsTest { @Mock private ChannelService channelService; + @Mock + private ServerManagementService serverManagementService; + + @Mock + private AServer server; + @Test public void testWithoutParameterStaticEmotes() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); @@ -45,7 +53,8 @@ public class ExternalEmoteStatsTest { EmoteStatsResultDisplay display = Mockito.mock(EmoteStatsResultDisplay.class); when(model.getStaticEmotes()).thenReturn(Arrays.asList(display)); when(model.areStatsAvailable()).thenReturn(true); - when(usedEmoteService.getExternalEmoteStatsForServerSince(noParameters.getUserInitiatedContext().getServer(), Instant.EPOCH)).thenReturn(model); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(usedEmoteService.getExternalEmoteStatsForServerSince(server, Instant.EPOCH)).thenReturn(model); when(channelService.sendEmbedTemplateInChannel(EMOTE_STATS_STATIC_EXTERNAL_RESPONSE, model, noParameters.getChannel())).thenReturn(CommandTestUtilities.messageFutureList()); CommandTestUtilities.checkSuccessfulCompletionAsync(testUnit.executeAsync(noParameters)); } @@ -57,7 +66,8 @@ public class ExternalEmoteStatsTest { EmoteStatsResultDisplay display = Mockito.mock(EmoteStatsResultDisplay.class); when(model.getAnimatedEmotes()).thenReturn(Arrays.asList(display)); when(model.areStatsAvailable()).thenReturn(true); - when(usedEmoteService.getExternalEmoteStatsForServerSince(noParameters.getUserInitiatedContext().getServer(), Instant.EPOCH)).thenReturn(model); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(usedEmoteService.getExternalEmoteStatsForServerSince(server, Instant.EPOCH)).thenReturn(model); when(channelService.sendEmbedTemplateInChannel(EMOTE_STATS_ANIMATED_EXTERNAL_RESPONSE, model, noParameters.getChannel())).thenReturn(CommandTestUtilities.messageFutureList()); CommandTestUtilities.checkSuccessfulCompletionAsync(testUnit.executeAsync(noParameters)); } @@ -67,7 +77,8 @@ public class ExternalEmoteStatsTest { CommandContext noParameters = CommandTestUtilities.getNoParameters(); EmoteStatsModel model = Mockito.mock(EmoteStatsModel.class); when(model.areStatsAvailable()).thenReturn(false); - when(usedEmoteService.getExternalEmoteStatsForServerSince(noParameters.getUserInitiatedContext().getServer(), Instant.EPOCH)).thenReturn(model); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(usedEmoteService.getExternalEmoteStatsForServerSince(server, Instant.EPOCH)).thenReturn(model); when(channelService.sendEmbedTemplateInChannel(eq(EmoteStats.EMOTE_STATS_NO_STATS_AVAILABLE), any(), eq(noParameters.getChannel()))).thenReturn(CommandTestUtilities.messageFutureList()); CommandTestUtilities.checkSuccessfulCompletionAsync(testUnit.executeAsync(noParameters)); } @@ -79,7 +90,8 @@ public class ExternalEmoteStatsTest { EmoteStatsResultDisplay display = Mockito.mock(EmoteStatsResultDisplay.class); when(model.getStaticEmotes()).thenReturn(Arrays.asList(display)); when(model.areStatsAvailable()).thenReturn(true); - when(usedEmoteService.getExternalEmoteStatsForServerSince(eq(noParameters.getUserInitiatedContext().getServer()), any(Instant.class))).thenReturn(model); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(usedEmoteService.getExternalEmoteStatsForServerSince(eq(server), any(Instant.class))).thenReturn(model); when(channelService.sendEmbedTemplateInChannel(EMOTE_STATS_STATIC_EXTERNAL_RESPONSE, model, noParameters.getChannel())).thenReturn(CommandTestUtilities.messageFutureList()); CommandTestUtilities.checkSuccessfulCompletionAsync(testUnit.executeAsync(noParameters)); } 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 5a1841dd5..c4ebc5da2 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 @@ -9,6 +9,7 @@ import dev.sheldan.abstracto.core.command.execution.*; import dev.sheldan.abstracto.core.config.FeatureEnum; 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.utility.config.features.UtilityFeature; import dev.sheldan.abstracto.utility.models.database.Reminder; @@ -35,12 +36,15 @@ public class Remind extends AbstractConditionableCommand { @Autowired private ChannelService channelService; + @Autowired + private UserInServerManagementService userInServerManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); Duration remindTime = (Duration) parameters.get(0); String text = (String) parameters.get(1); - AUserInAServer aUserInAServer = commandContext.getUserInitiatedContext().getAUserInAServer(); + AUserInAServer aUserInAServer = userInServerManagementService.loadUser(commandContext.getAuthor()); ReminderModel remindModel = (ReminderModel) ContextConverter.fromCommandContext(commandContext, ReminderModel.class); remindModel.setRemindText(text); Reminder createdReminder = remindService.createReminderInForUser(aUserInAServer, text, remindTime, commandContext.getMessage()); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/Reminders.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/Reminders.java index 29b8502e2..8ddd3d2e9 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/Reminders.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/Reminders.java @@ -10,6 +10,7 @@ import dev.sheldan.abstracto.core.command.execution.ContextConverter; import dev.sheldan.abstracto.core.config.FeatureEnum; 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.utility.config.features.UtilityFeature; import dev.sheldan.abstracto.utility.models.database.Reminder; @@ -33,10 +34,12 @@ public class Reminders extends AbstractConditionableCommand { @Autowired private ChannelService channelService; + @Autowired + private UserInServerManagementService userInServerManagementService; @Override public CompletableFuture executeAsync(CommandContext commandContext) { - AUserInAServer aUserInAServer = commandContext.getUserInitiatedContext().getAUserInAServer(); + AUserInAServer aUserInAServer = userInServerManagementService.loadUser(commandContext.getAuthor()); List activeReminders = reminderManagementService.getActiveRemindersForUser(aUserInAServer); RemindersModel model = (RemindersModel) ContextConverter.fromCommandContext(commandContext, RemindersModel.class); model.setReminders(activeReminders); 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 2cebff915..ae89dc217 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 @@ -10,6 +10,7 @@ import dev.sheldan.abstracto.core.command.config.validator.MinIntegerValueValida 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.management.UserInServerManagementService; import dev.sheldan.abstracto.utility.config.features.UtilityFeature; import dev.sheldan.abstracto.utility.service.ReminderService; import lombok.extern.slf4j.Slf4j; @@ -27,10 +28,13 @@ public class UnRemind extends AbstractConditionableCommand { @Autowired private ReminderService reminderService; + @Autowired + private UserInServerManagementService userInServerManagementService; + @Override public CommandResult execute(CommandContext commandContext) { Long reminderId = (Long) commandContext.getParameters().getParameters().get(0); - reminderService.unRemind(reminderId, commandContext.getUserInitiatedContext().getAUserInAServer()); + reminderService.unRemind(reminderId, userInServerManagementService.loadUser(commandContext.getAuthor())); return CommandResult.fromSuccess(); } diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/MessageEmbedServiceBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/MessageEmbedServiceBean.java index b1b00c569..7591f13bf 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/MessageEmbedServiceBean.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/MessageEmbedServiceBean.java @@ -3,8 +3,6 @@ package dev.sheldan.abstracto.utility.service; import dev.sheldan.abstracto.core.models.template.listener.MessageEmbeddedModel; import dev.sheldan.abstracto.templating.model.MessageToSend; import dev.sheldan.abstracto.core.models.cache.CachedMessage; -import dev.sheldan.abstracto.core.models.database.AChannel; -import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.service.BotService; import dev.sheldan.abstracto.core.service.ChannelService; @@ -152,21 +150,14 @@ public class MessageEmbedServiceBean implements MessageEmbedService { @Transactional public MessageEmbeddedModel loadMessageEmbedModel(Message message, CachedMessage embeddedMessage, Member member) { - AServer server = serverManagementService.loadOrCreate(message.getGuild().getIdLong()); - AUserInAServer user = userInServerManagementService.loadUser(message.getMember()); Optional textChannelFromServer = botService.getTextChannelFromServerOptional(embeddedMessage.getServerId(), embeddedMessage.getChannelId()); TextChannel sourceChannel = textChannelFromServer.orElse(null); - AChannel channel = channelManagementService.loadChannel(message.getChannel().getIdLong()); return MessageEmbeddedModel .builder() - .channel(channel) - .server(server) .member(message.getMember()) - .aUserInAServer(user) .author(member) .sourceChannel(sourceChannel) .embeddingUser(message.getMember()) - .user(user.getUserReference()) .messageChannel(message.getChannel()) .guild(message.getGuild()) .embeddedMessage(embeddedMessage) diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/StarboardServiceBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/StarboardServiceBean.java index 61f982462..1ced7e9de 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/StarboardServiceBean.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/StarboardServiceBean.java @@ -131,7 +131,6 @@ public class StarboardServiceBean implements StarboardService { // TODO use model objects instead of building entity models AChannel aChannel = AChannel.builder().id(message.getChannelId()).build(); AUser user = AUser.builder().id(message.getAuthor().getAuthorId()).build(); - AServer server = AServer.builder().id(message.getServerId()).build(); String starLevelEmote = getAppropriateEmote(message.getServerId(), starCount); return StarboardPostModel .builder() @@ -142,7 +141,6 @@ public class StarboardServiceBean implements StarboardService { .starCount(starCount) .guild(guild.orElse(null)) .user(user) - .server(server) .starLevelEmote(starLevelEmote) .build(); }); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/SuggestionServiceBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/SuggestionServiceBean.java index f0f7a254e..6b8382adf 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/SuggestionServiceBean.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/SuggestionServiceBean.java @@ -1,7 +1,9 @@ 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.CounterService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.templating.model.MessageToSend; @@ -61,12 +63,17 @@ public class SuggestionServiceBean implements SuggestionService { @Autowired private CounterService counterService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture createSuggestionMessage(Member member, String text, SuggestionLog suggestionLog) { - Long newSuggestionId = counterService.getNextCounterValue(suggestionLog.getServer(), SUGGESTION_COUNTER_KEY); + AServer server = serverManagementService.loadServer(member.getGuild()); + AUserInAServer suggester = userInServerManagementService.loadUser(member); + Long newSuggestionId = counterService.getNextCounterValue(server, SUGGESTION_COUNTER_KEY); suggestionLog.setSuggestionId(newSuggestionId); suggestionLog.setState(SuggestionState.NEW); - suggestionLog.setSuggesterUser(suggestionLog.getAUserInAServer()); + suggestionLog.setSuggesterUser(suggester); suggestionLog.setText(text); MessageToSend messageToSend = templateService.renderEmbedTemplate(SUGGESTION_LOG_TEMPLATE, suggestionLog); long guildId = member.getGuild().getIdLong(); @@ -136,7 +143,7 @@ public class SuggestionServiceBean implements SuggestionService { suggestionLog.setReason(text); suggestionLog.setText(suggestionEmbed.getDescription()); MessageToSend messageToSend = templateService.renderEmbedTemplate(SUGGESTION_LOG_TEMPLATE, suggestionLog); - List> completableFutures = postTargetService.sendEmbedInPostTarget(messageToSend, SuggestionPostTarget.SUGGESTION, suggestionLog.getServer().getId()); + List> completableFutures = postTargetService.sendEmbedInPostTarget(messageToSend, SuggestionPostTarget.SUGGESTION, suggestionLog.getGuild().getIdLong()); return CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[0])); } else { log.warn("The message to update the suggestion for, did not contain an embed to update. Suggestions require an embed with a description as a container. MessageURL: {}", message.getJumpUrl()); 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 ece8ebbc6..5e5c1133d 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 @@ -155,6 +155,12 @@ + + + + + + \ 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 b2415df12..293ea6000 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 @@ -11,6 +11,7 @@ + diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/StarStatsTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/StarStatsTest.java index cbc257547..f6add8eac 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/StarStatsTest.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/StarStatsTest.java @@ -32,7 +32,6 @@ public class StarStatsTest { @Test public void executeCommand() { CommandContext noParameters = CommandTestUtilities.getNoParameters(); - when(noParameters.getGuild().getIdLong()).thenReturn(noParameters.getUserInitiatedContext().getChannel().getId()); StarStatsModel starStatsModel = StarStatsModel.builder().build(); when(starboardService.retrieveStarStats(noParameters.getGuild().getIdLong())).thenReturn(CompletableFuture.completedFuture(starStatsModel)); CompletableFuture result = testUnit.executeAsync(noParameters); 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 2b59f8694..27847f2d4 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 @@ -2,7 +2,9 @@ package dev.sheldan.abstracto.utility.commands.remind; 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.utility.models.template.commands.reminder.ReminderModel; @@ -10,10 +12,7 @@ import dev.sheldan.abstracto.utility.service.ReminderService; 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.*; import org.mockito.junit.MockitoJUnitRunner; import java.time.Duration; @@ -34,6 +33,9 @@ public class RemindTest { @Mock private ChannelService channelService; + @Mock + private UserInServerManagementService userInServerManagementService; + @Captor private ArgumentCaptor captor; @@ -42,8 +44,10 @@ public class RemindTest { String reminderText = "text"; Duration duration = Duration.ofMinutes(10); CommandContext withParameters = CommandTestUtilities.getWithParameters(Arrays.asList(duration, reminderText)); + AUserInAServer user = Mockito.mock(AUserInAServer.class); + when(userInServerManagementService.loadUser(withParameters.getAuthor())).thenReturn(user); CompletableFuture result = testUnit.executeAsync(withParameters); - verify(remindService, times(1)).createReminderInForUser(withParameters.getUserInitiatedContext().getAUserInAServer(), reminderText, duration, withParameters.getMessage()); + verify(remindService, times(1)).createReminderInForUser(user, reminderText, duration, withParameters.getMessage()); verify(channelService, times(1)).sendEmbedTemplateInChannel(eq(Remind.REMINDER_EMBED_KEY), captor.capture(), eq(withParameters.getChannel())); ReminderModel reminderModel = captor.getValue(); Assert.assertEquals(reminderText, reminderModel.getRemindText()); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/remind/RemindersTest.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/remind/RemindersTest.java index d37e1a45e..0edfd0f57 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/remind/RemindersTest.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/test/java/dev/sheldan/abstracto/utility/commands/remind/RemindersTest.java @@ -2,7 +2,9 @@ package dev.sheldan.abstracto.utility.commands.remind; 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.utility.models.database.Reminder; @@ -11,10 +13,7 @@ import dev.sheldan.abstracto.utility.service.management.ReminderManagementServic 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.*; import org.mockito.junit.MockitoJUnitRunner; import java.util.Arrays; @@ -35,6 +34,9 @@ public class RemindersTest { @Mock private ChannelService channelService; + @Mock + private UserInServerManagementService userInServerManagementService; + @Captor private ArgumentCaptor modelCaptor; @@ -44,7 +46,9 @@ public class RemindersTest { Reminder reminder = Reminder.builder().build(); Reminder secondReminder = Reminder.builder().build(); List reminders = Arrays.asList(reminder, secondReminder); - when(reminderManagementService.getActiveRemindersForUser(context.getUserInitiatedContext().getAUserInAServer())).thenReturn(reminders); + AUserInAServer user = Mockito.mock(AUserInAServer.class); + when(userInServerManagementService.loadUser(context.getAuthor())).thenReturn(user); + when(reminderManagementService.getActiveRemindersForUser(user)).thenReturn(reminders); CompletableFuture result = testUnit.executeAsync(context); verify(channelService, times(1)).sendEmbedTemplateInChannel(eq(Reminders.REMINDERS_RESPONSE_TEMPLATE), modelCaptor.capture(), eq(context.getChannel())); RemindersModel usedModel = modelCaptor.getValue(); 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 62ab0d2f3..7d0c3c079 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 @@ -2,6 +2,8 @@ package dev.sheldan.abstracto.utility.commands.remind; 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.ReminderService; @@ -9,6 +11,7 @@ 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; @@ -24,12 +27,17 @@ public class UnRemindTest { @Mock private ReminderService reminderService; + @Mock + private UserInServerManagementService userInServerManagementService; + @Test public void testExecuteCommand() { Long reminderId = 6L; CommandContext withParameters = CommandTestUtilities.getWithParameters(Arrays.asList(reminderId)); + AUserInAServer user = Mockito.mock(AUserInAServer.class); + when(userInServerManagementService.loadUser(withParameters.getAuthor())).thenReturn(user); CommandResult result = testUnit.execute(withParameters); - verify(reminderService, times(1)).unRemind(reminderId, withParameters.getUserInitiatedContext().getAUserInAServer()); + verify(reminderService, times(1)).unRemind(reminderId, user); CommandTestUtilities.checkSuccessfulCompletion(result); } 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 347ef41ee..a4627f8ad 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 @@ -10,6 +10,8 @@ import dev.sheldan.abstracto.core.service.BotService; import dev.sheldan.abstracto.core.service.CounterService; import dev.sheldan.abstracto.core.service.MessageService; import dev.sheldan.abstracto.core.service.PostTargetService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.templating.model.MessageToSend; import dev.sheldan.abstracto.templating.service.TemplateService; import dev.sheldan.abstracto.utility.config.posttargets.SuggestionPostTarget; @@ -74,6 +76,12 @@ public class SuggestionServiceBeanTest { @Mock private CounterService counterService; + @Mock + private UserInServerManagementService userInServerManagementService; + + @Mock + private ServerManagementService serverManagementService; + @Mock private AServer server; @@ -98,14 +106,16 @@ public class SuggestionServiceBeanTest { public void testCreateSuggestionMessage() { String suggestionText = "text"; SuggestionLog log = Mockito.mock(SuggestionLog.class); - when(log.getServer()).thenReturn(server); when(suggestionCreator.getGuild()).thenReturn(guild); when(guild.getIdLong()).thenReturn(SERVER_ID); when(guild.getIdLong()).thenReturn(SERVER_ID); + when(serverManagementService.loadServer(suggestionCreator.getGuild())).thenReturn(server); MessageToSend messageToSend = MessageToSend.builder().build(); when(templateService.renderEmbedTemplate(eq(SuggestionServiceBean.SUGGESTION_LOG_TEMPLATE), any(SuggestionLog.class))).thenReturn(messageToSend); Message suggestionMessage = Mockito.mock(Message.class); when(counterService.getNextCounterValue(server, SUGGESTION_COUNTER_KEY)).thenReturn(SUGGESTION_ID); + AUserInAServer aUserInAServer = Mockito.mock(AUserInAServer.class); + when(userInServerManagementService.loadUser(suggestionCreator)).thenReturn(aUserInAServer); List> postingFutures = Arrays.asList(CompletableFuture.completedFuture(suggestionMessage)); when(postTargetService.sendEmbedInPostTarget(messageToSend, SuggestionPostTarget.SUGGESTION, SERVER_ID)).thenReturn(postingFutures); testUnit.createSuggestionMessage(suggestionCreator, suggestionText, log); @@ -170,17 +180,18 @@ public class SuggestionServiceBeanTest { @Test public void testUpdateSuggestionMessageWithEmbed() { - SuggestionLog log = SuggestionLog.builder().server(server).build(); + SuggestionLog log = Mockito.mock(SuggestionLog.class); + when(log.getGuild()).thenReturn(guild); MessageEmbed embed = Mockito.mock(MessageEmbed.class); when(embed.getDescription()).thenReturn("description"); Message suggestionMessage = Mockito.mock(Message.class); when(suggestionMessage.getGuild()).thenReturn(guild); - when(guild.getId()).thenReturn("8"); + when(guild.getIdLong()).thenReturn(SERVER_ID); when(suggestionMessage.getEmbeds()).thenReturn(Arrays.asList(embed)); MessageToSend updatedMessage = MessageToSend.builder().build(); when(templateService.renderEmbedTemplate(eq(SuggestionServiceBean.SUGGESTION_LOG_TEMPLATE), any(SuggestionLog.class))).thenReturn(updatedMessage); testUnit.updateSuggestionMessageText(CLOSING_TEXT, log, suggestionMessage); - verify(postTargetService, times(1)).sendEmbedInPostTarget(updatedMessage, SuggestionPostTarget.SUGGESTION, server.getId()); + verify(postTargetService, times(1)).sendEmbedInPostTarget(updatedMessage, SuggestionPostTarget.SUGGESTION, SERVER_ID); } @Test 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 473dbbee8..81d310e99 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 @@ -212,16 +212,9 @@ public class CommandReceivedHandler extends ListenerAdapter { } private UserInitiatedServerContext buildTemplateParameter(MessageReceivedEvent event) { - AChannel channel = channelManagementService.loadChannel(event.getChannel().getIdLong()); - AServer server = serverManagementService.loadOrCreate(event.getGuild().getIdLong()); - AUserInAServer user = userInServerManagementService.loadUser(event.getMember()); return UserInitiatedServerContext .builder() - .channel(channel) - .server(server) .member(event.getMember()) - .aUserInAServer(user) - .user(user.getUserReference()) .messageChannel(event.getTextChannel()) .guild(event.getGuild()) .build(); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/repository/CommandInServerRepository.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/repository/CommandInServerRepository.java index a28caf5db..0dc57f734 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/repository/CommandInServerRepository.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/repository/CommandInServerRepository.java @@ -14,4 +14,7 @@ public interface CommandInServerRepository extends JpaRepository allChannelGroupsOfCommand = channelGroupCommandService.getAllGroupCommandsForCommand(command); @@ -33,4 +37,9 @@ public class ChannelGroupCommandServiceBean implements ChannelGroupCommandServic // not empty -> has groups, command is disabled in all return allChannelGroupsOfCommand.isEmpty(); } + + @Override + public Boolean isCommandEnabled(ACommand command, Long channelId) { + return isCommandEnabled(command, channelManagementService.loadChannel(channelId)); + } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/service/ExceptionServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/service/ExceptionServiceBean.java index 4386acd3b..7810adde9 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/service/ExceptionServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/service/ExceptionServiceBean.java @@ -94,7 +94,7 @@ public class ExceptionServiceBean implements ExceptionService { } private GenericExceptionModel buildCommandModel(Throwable throwable, CommandContext context) { - FullUserInServer fullUser = FullUserInServer.builder().member(context.getAuthor()).aUserInAServer(context.getUserInitiatedContext().getAUserInAServer()).build(); + FullUserInServer fullUser = FullUserInServer.builder().member(context.getAuthor()).aUserInAServer(userInServerManagementService.loadUser(context.getAuthor())).build(); return GenericExceptionModel .builder() .user(fullUser) diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/service/management/CommandInServerManagementServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/service/management/CommandInServerManagementServiceBean.java index f6d7bfd80..5c46d7375 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/service/management/CommandInServerManagementServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/command/service/management/CommandInServerManagementServiceBean.java @@ -37,4 +37,9 @@ public class CommandInServerManagementServiceBean implements CommandInServerMana public ACommandInAServer getCommandForServer(ACommand command, AServer server) { return repository.findByServerReferenceAndCommandReference(server, command); } + + @Override + public ACommandInAServer getCommandForServer(ACommand command, Long serverId) { + return null; + } } 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 e80918090..228e5e1b9 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 @@ -8,6 +8,8 @@ import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.execution.ContextConverter; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.command.config.features.CoreFeatures; +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.templating.model.MessageToSend; import dev.sheldan.abstracto.core.models.template.commands.ChannelGroupChannelModel; import dev.sheldan.abstracto.core.models.template.commands.ChannelGroupModel; @@ -37,9 +39,13 @@ public class ListChannelGroups extends AbstractConditionableCommand { @Autowired private ChannelService channelService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CommandResult execute(CommandContext commandContext) { - List channelGroups = channelGroupManagementService.findAllInServer(commandContext.getUserInitiatedContext().getServer()); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + List channelGroups = channelGroupManagementService.findAllInServer(server); ListChannelGroupsModel template = (ListChannelGroupsModel) ContextConverter.fromCommandContext(commandContext, ListChannelGroupsModel.class); template.setGroups(convertAChannelGroupToChannelGroupChannel(channelGroups)); MessageToSend response = templateService.renderEmbedTemplate("listChannelGroups_response", template); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/PostTargetCommand.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/PostTargetCommand.java index 481df9161..0b736d977 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/PostTargetCommand.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/PostTargetCommand.java @@ -15,6 +15,7 @@ import dev.sheldan.abstracto.core.models.template.commands.PostTargetModelEntry; import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.PostTargetService; import dev.sheldan.abstracto.core.service.management.PostTargetManagement; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.templating.service.TemplateService; import lombok.extern.slf4j.Slf4j; @@ -48,12 +49,15 @@ public class PostTargetCommand extends AbstractConditionableCommand { @Autowired private ChannelService channelService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { if(commandContext.getParameters().getParameters().isEmpty()) { log.trace("Displaying existing post targets for guild {}.", commandContext.getGuild().getId()); PostTargetDisplayModel posttargetDisplayModel = (PostTargetDisplayModel) ContextConverter.fromCommandContext(commandContext, PostTargetDisplayModel.class); - AServer server = commandContext.getUserInitiatedContext().getServer(); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); List postTargets = postTargetService.getPostTargets(server); posttargetDisplayModel.setPostTargets(new ArrayList<>()); List postTargetEntries = posttargetDisplayModel.getPostTargets(); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/Allow.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/Allow.java index 9aeb4b35a..380b8eed6 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/Allow.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/Allow.java @@ -15,7 +15,9 @@ import dev.sheldan.abstracto.core.commands.config.ConfigModuleInterface; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.command.config.features.CoreFeatures; import dev.sheldan.abstracto.core.models.database.AFeature; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.management.RoleManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.templating.service.TemplateService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -41,17 +43,21 @@ public class Allow extends AbstractConditionableCommand { @Autowired private TemplateService templateService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CommandResult execute(CommandContext commandContext) { String name = (String) commandContext.getParameters().getParameters().get(0); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); if(featureManagementService.featureExists(name)) { AFeature feature = featureManagementService.getFeature(name); feature.getCommands().forEach(command -> - commandService.unRestrictCommand(command, commandContext.getUserInitiatedContext().getServer()) + commandService.unRestrictCommand(command, server) ); } else if(commandManagementService.doesCommandExist(name)) { ACommand command = commandManagementService.findCommandByName(name); - commandService.unRestrictCommand(command, commandContext.getUserInitiatedContext().getServer()); + commandService.unRestrictCommand(command, server); } else { // TODO refactor to use exception return CommandResult.fromError(templateService.renderTemplate(CommandServiceBean.NO_FEATURE_COMMAND_FOUND_EXCEPTION_TEMPLATE, new Object())); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableFeature.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableFeature.java index 7cadb82b6..a35a92f88 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableFeature.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableFeature.java @@ -12,10 +12,12 @@ import dev.sheldan.abstracto.core.commands.config.ConfigModuleInterface; import dev.sheldan.abstracto.core.config.FeatureConfig; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.command.config.features.CoreFeatures; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.template.commands.EnableModel; import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureFlagService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.templating.service.TemplateService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -39,6 +41,8 @@ public class DisableFeature extends AbstractConditionableCommand { @Autowired private TemplateService templateService; + @Autowired + private ServerManagementService serverManagementService; @Override public CompletableFuture executeAsync(CommandContext commandContext) { @@ -53,8 +57,9 @@ public class DisableFeature extends AbstractConditionableCommand { FeatureConfig feature = featureConfigService.getFeatureDisplayForFeature(flagKey); featureFlagService.disableFeature(feature, commandContext.getGuild().getIdLong()); if(feature.getDependantFeatures() != null) { + AServer server = serverManagementService.loadServer(commandContext.getGuild()); feature.getDependantFeatures().forEach(featureDisplay -> - featureFlagService.disableFeature(featureDisplay, commandContext.getUserInitiatedContext().getServer()) + featureFlagService.disableFeature(featureDisplay, server) ); } return CompletableFuture.completedFuture(CommandResult.fromSuccess()); 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 eda8a94e2..367aee0b6 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 @@ -11,9 +11,11 @@ import dev.sheldan.abstracto.core.command.service.management.FeatureManagementSe import dev.sheldan.abstracto.core.commands.config.ConfigModuleInterface; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureMode; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureModeService; import dev.sheldan.abstracto.core.service.management.FeatureModeManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.templating.service.TemplateService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -39,13 +41,17 @@ public class DisableMode extends AbstractConditionableCommand { @Autowired private TemplateService templateService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CommandResult execute(CommandContext commandContext) { String featureName = (String) commandContext.getParameters().getParameters().get(0); String modeName = (String) commandContext.getParameters().getParameters().get(1); FeatureEnum featureEnum = featureConfigService.getFeatureEnum(featureName); FeatureMode featureMode = featureModeService.getFeatureModeForKey(modeName); - featureModeService.disableFeatureModeForFeature(featureEnum, commandContext.getUserInitiatedContext().getServer(), featureMode); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + featureModeService.disableFeatureModeForFeature(featureEnum, server, featureMode); return CommandResult.fromSuccess(); } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableFeature.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableFeature.java index cb0b301d0..75a5b0281 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableFeature.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableFeature.java @@ -13,10 +13,12 @@ import dev.sheldan.abstracto.core.config.FeatureConfig; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.command.config.features.CoreFeatures; import dev.sheldan.abstracto.core.models.FeatureValidationResult; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.template.commands.EnableModel; import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureFlagService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.templating.service.TemplateService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -42,6 +44,9 @@ public class EnableFeature extends AbstractConditionableCommand { @Autowired private TemplateService templateService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { if(commandContext.getParameters().getParameters().isEmpty()) { @@ -53,16 +58,17 @@ public class EnableFeature extends AbstractConditionableCommand { } else { String flagKey = (String) commandContext.getParameters().getParameters().get(0); FeatureConfig feature = featureConfigService.getFeatureDisplayForFeature(flagKey); - FeatureValidationResult featureSetup = featureConfigService.validateFeatureSetup(feature, commandContext.getUserInitiatedContext().getServer()); + AServer server = serverManagementService.loadServer(commandContext.getUserInitiatedContext().getGuild().getIdLong()); + FeatureValidationResult featureSetup = featureConfigService.validateFeatureSetup(feature, server); if(Boolean.FALSE.equals(featureSetup.getValidationResult())) { log.info("Feature {} has failed the setup validation. Notifying user.", flagKey); channelService.sendTextToChannelNotAsync(templateService.renderTemplatable(featureSetup), commandContext.getChannel()); } - featureFlagService.enableFeature(feature, commandContext.getUserInitiatedContext().getServer()); + featureFlagService.enableFeature(feature, server); if(feature.getRequiredFeatures() != null) { feature.getRequiredFeatures().forEach(featureDisplay -> { log.info("Also enabling required feature {}.", featureDisplay.getFeature().getKey()); - featureFlagService.enableFeature(featureDisplay, commandContext.getUserInitiatedContext().getServer()); + featureFlagService.enableFeature(featureDisplay, server); }); } return CompletableFuture.completedFuture(CommandResult.fromSuccess()); 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 de66f7552..18ec0b96c 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 @@ -11,9 +11,11 @@ import dev.sheldan.abstracto.core.command.service.management.FeatureManagementSe import dev.sheldan.abstracto.core.commands.config.ConfigModuleInterface; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureMode; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureModeService; import dev.sheldan.abstracto.core.service.management.FeatureModeManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.templating.service.TemplateService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -39,13 +41,17 @@ public class EnableMode extends AbstractConditionableCommand { @Autowired private TemplateService templateService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CommandResult execute(CommandContext commandContext) { String featureName = (String) commandContext.getParameters().getParameters().get(0); String modeName = (String) commandContext.getParameters().getParameters().get(1); FeatureEnum featureEnum = featureConfigService.getFeatureEnum(featureName); FeatureMode featureMode = featureModeService.getFeatureModeForKey(modeName); - featureModeService.enableFeatureModeForFeature(featureEnum, commandContext.getUserInitiatedContext().getServer(), featureMode); + AServer server = serverManagementService.loadServer(commandContext.getGuild().getIdLong()); + featureModeService.enableFeatureModeForFeature(featureEnum, server, featureMode); return CommandResult.fromSuccess(); } 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 e53ca0157..7956472d2 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 @@ -11,11 +11,13 @@ import dev.sheldan.abstracto.core.command.service.management.FeatureManagementSe import dev.sheldan.abstracto.core.commands.config.ConfigModuleInterface; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.models.database.AFeature; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.template.commands.FeatureModeDisplay; 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.service.management.ServerManagementService; import dev.sheldan.abstracto.core.utils.FutureUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -40,16 +42,20 @@ public class FeatureModes extends AbstractConditionableCommand { @Autowired private ChannelService channelService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List featureModes; + AServer server = serverManagementService.loadServer(commandContext.getGuild()); if(commandContext.getParameters().getParameters().isEmpty()) { - featureModes = featureModeService.getEffectiveFeatureModes(commandContext.getUserInitiatedContext().getServer()); + featureModes = featureModeService.getEffectiveFeatureModes(server); } else { String featureName = (String) commandContext.getParameters().getParameters().get(0); FeatureEnum featureEnum = featureConfigService.getFeatureEnum(featureName); AFeature feature = featureManagementService.getFeature(featureEnum.getKey()); - featureModes = featureModeService.getEffectiveFeatureModes(commandContext.getUserInitiatedContext().getServer(), feature); + featureModes = featureModeService.getEffectiveFeatureModes(server, feature); } FeatureModesModel model = FeatureModesModel.builder().featureModes(featureModes).build(); return FutureUtils.toSingleFutureGeneric(channelService.sendEmbedTemplateInChannel(FEATURE_MODES_RESPONSE_TEMPLATE_KEY, model, commandContext.getChannel())) diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/Features.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/Features.java index c4b5f7fe2..88f194db9 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/Features.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/Features.java @@ -11,9 +11,11 @@ import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.command.config.features.CoreFeatures; import dev.sheldan.abstracto.core.converter.FeatureFlagConverter; import dev.sheldan.abstracto.core.models.database.AFeatureFlag; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.template.commands.FeaturesModel; import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.templating.model.MessageToSend; import dev.sheldan.abstracto.templating.service.TemplateService; @@ -38,9 +40,13 @@ public class Features extends AbstractConditionableCommand { @Autowired private FeatureFlagConverter featureFlagConverter; + @Autowired + private ServerManagementService serverManagementService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { - List features = featureFlagManagementService.getFeatureFlagsOfServer(commandContext.getUserInitiatedContext().getServer()); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); + List features = featureFlagManagementService.getFeatureFlagsOfServer(server); FeaturesModel featuresModel = (FeaturesModel) ContextConverter.fromCommandContext(commandContext, FeaturesModel.class); featuresModel.setFeatures(featureFlagConverter.fromFeatureFlags(features)); MessageToSend messageToSend = templateService.renderEmbedTemplate("features_response", featuresModel); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/Restrict.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/Restrict.java index 97d0cdefa..5c20696b9 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/Restrict.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/Restrict.java @@ -15,7 +15,9 @@ import dev.sheldan.abstracto.core.commands.config.ConfigModuleInterface; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.command.config.features.CoreFeatures; import dev.sheldan.abstracto.core.models.database.AFeature; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.management.RoleManagementService; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.templating.service.TemplateService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -41,17 +43,21 @@ public class Restrict extends AbstractConditionableCommand { @Autowired private TemplateService templateService; + @Autowired + private ServerManagementService serverManagementService; + @Override public CommandResult execute(CommandContext commandContext) { String name = (String) commandContext.getParameters().getParameters().get(0); + AServer server = serverManagementService.loadServer(commandContext.getGuild()); if(featureManagementService.featureExists(name)) { AFeature feature = featureManagementService.getFeature(name); feature.getCommands().forEach(command -> - commandService.restrictCommand(command, commandContext.getUserInitiatedContext().getServer()) + commandService.restrictCommand(command, server) ); } else if(commandManagementService.doesCommandExist(name)) { ACommand command = commandManagementService.findCommandByName(name); - commandService.restrictCommand(command, commandContext.getUserInitiatedContext().getServer()); + commandService.restrictCommand(command, server); } else { // TODO Refactor to use exception return CommandResult.fromError(templateService.renderTemplate(CommandServiceBean.NO_FEATURE_COMMAND_FOUND_EXCEPTION_TEMPLATE, new Object())); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/help/Help.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/help/Help.java index ea37888f5..e570c02cb 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/help/Help.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/help/Help.java @@ -89,7 +89,7 @@ public class Help implements Command { Command command = commandRegistry.getCommandByName(parameter); log.trace("Displaying help for command {}.", command.getConfiguration().getName()); ACommand aCommand = commandManagementService.findCommandByName(parameter); - ACommandInAServer aCommandInAServer = commandInServerManagementService.getCommandForServer(aCommand, commandContext.getUserInitiatedContext().getServer()); + ACommandInAServer aCommandInAServer = commandInServerManagementService.getCommandForServer(aCommand, commandContext.getGuild().getIdLong()); HelpCommandDetailsModel model = (HelpCommandDetailsModel) ContextConverter.fromCommandContext(commandContext, HelpCommandDetailsModel.class); if(Boolean.TRUE.equals(aCommandInAServer.getRestricted())) { model.setImmuneRoles(roleService.getRolesFromGuild(aCommandInAServer.getImmuneRoles())); 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 641a6ca53..fe9a7e671 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 @@ -23,6 +23,9 @@ public interface UserInServerRepository extends JpaRepository findByUserReference(AUser user); } \ No newline at end of file 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 9a9e90a3f..b9862ef46 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 @@ -202,6 +202,11 @@ public class PostTargetServiceBean implements PostTargetService { } } + @Override + public boolean postTargetDefinedInServer(PostTargetEnum name, Long serverId) { + return postTargetManagement.postTargetExists(name.getKey(), serverId); + } + @Override public List> editEmbedInPostTarget(Long messageId, MessageToSend message, PostTargetEnum postTargetName, Long serverId) { PostTarget postTarget = this.getPostTarget(postTargetName, serverId); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelManagementServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelManagementServiceBean.java index 8d438e8d0..bcb6be2dc 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelManagementServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelManagementServiceBean.java @@ -8,6 +8,7 @@ import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.repository.ChannelRepository; import dev.sheldan.abstracto.core.service.LockService; import lombok.extern.slf4j.Slf4j; +import net.dv8tion.jda.api.entities.TextChannel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -33,6 +34,11 @@ public class ChannelManagementServiceBean implements ChannelManagementService { return loadChannelOptional(id).orElseThrow(() -> new ChannelNotFoundException(id)); } + @Override + public AChannel loadChannel(TextChannel textChannel) { + return loadChannel(textChannel.getIdLong()); + } + @Override public AChannel createChannel(Long id, AChannelType type, AServer server) { lockService.lockTable(TableLocks.CHANNELS); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ServerManagementServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ServerManagementServiceBean.java index ac1ede056..d4de3b6b7 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ServerManagementServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ServerManagementServiceBean.java @@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.exception.GuildNotFoundException; import dev.sheldan.abstracto.core.models.database.*; import dev.sheldan.abstracto.core.repository.ServerRepository; import lombok.extern.slf4j.Slf4j; +import net.dv8tion.jda.api.entities.Guild; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -41,6 +42,11 @@ public class ServerManagementServiceBean implements ServerManagementService { return loadServerOptional(id).orElseThrow(() -> new GuildNotFoundException(id)); } + @Override + public AServer loadServer(Guild guild) { + return loadServer(guild.getIdLong()); + } + @Override public Optional loadServerOptional(Long id) { return repository.findById(id); 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 ff2c62c4f..da23969db 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 @@ -30,7 +30,11 @@ public class UserInServerManagementServiceBean implements UserInServerManagement @Override public AUserInAServer loadUser(Long serverId, Long userId) { - return userInServerRepository.findByServerReference_IdAndUserReference_Id(serverId, userId).orElseThrow(() -> new UserInServerNotFoundException(0L)); + if(userInServerRepository.existsByServerReference_IdAndUserReference_Id(serverId, userId)) { + return userInServerRepository.findByServerReference_IdAndUserReference_Id(serverId, userId).orElseThrow(() -> new UserInServerNotFoundException(0L)); + } else { + return this.createUserInServer(serverId, userId); + } } @Override 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 5d4eaa982..af43bd05c 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 @@ -6,8 +6,10 @@ import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureMode; import dev.sheldan.abstracto.core.exception.FeatureModeNotFoundException; import dev.sheldan.abstracto.core.exception.FeatureNotFoundException; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureModeService; +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 org.junit.Test; @@ -34,6 +36,9 @@ public class DisableFeatureModeTest { @Mock private FeatureModeService featureModeService; + @Mock + private ServerManagementService serverManagementService; + @Test public void testExecuteDisable() { String featureName = "text"; @@ -43,9 +48,11 @@ public class DisableFeatureModeTest { FeatureMode featureMode = Mockito.mock(FeatureMode.class); when(featureModeService.getFeatureModeForKey(modeName)).thenReturn(featureMode); CommandContext context = CommandTestUtilities.getWithParameters(Arrays.asList(featureName, modeName)); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(context.getGuild())).thenReturn(server); CommandResult commandResultCompletableFuture = testUnit.execute(context); CommandTestUtilities.checkSuccessfulCompletion(commandResultCompletableFuture); - verify(featureModeService, times(1)).disableFeatureModeForFeature(featureEnum, context.getUserInitiatedContext().getServer(), featureMode); + verify(featureModeService, times(1)).disableFeatureModeForFeature(featureEnum, server, featureMode); } @Test(expected = FeatureNotFoundException.class) 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 de96a1073..9da510069 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 @@ -6,8 +6,10 @@ import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureMode; import dev.sheldan.abstracto.core.exception.FeatureModeNotFoundException; import dev.sheldan.abstracto.core.exception.FeatureNotFoundException; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureModeService; +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 org.junit.Test; @@ -36,6 +38,11 @@ public class EnableFeatureModeTest { @Mock private FeatureModeService featureModeService; + @Mock + private ServerManagementService serverManagementService; + + private static final Long SERVER_ID = 3L; + @Test public void testExecuteDisable() { String featureName = "text"; @@ -45,9 +52,12 @@ public class EnableFeatureModeTest { FeatureMode featureMode = Mockito.mock(FeatureMode.class); when(featureModeService.getFeatureModeForKey(modeName)).thenReturn(featureMode); CommandContext context = CommandTestUtilities.getWithParameters(Arrays.asList(featureName, modeName)); + AServer server = Mockito.mock(AServer.class); + when(context.getGuild().getIdLong()).thenReturn(SERVER_ID); + when(serverManagementService.loadServer(SERVER_ID)).thenReturn(server); CommandResult commandResultCompletableFuture = testUnit.execute(context); CommandTestUtilities.checkSuccessfulCompletion(commandResultCompletableFuture); - verify(featureModeService, times(1)).enableFeatureModeForFeature(featureEnum, context.getUserInitiatedContext().getServer(), featureMode); + verify(featureModeService, times(1)).enableFeatureModeForFeature(featureEnum, server, featureMode); } @Test(expected = FeatureNotFoundException.class) 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 98fcd2ea8..865c7c7af 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 @@ -6,11 +6,13 @@ import dev.sheldan.abstracto.core.command.service.management.FeatureManagementSe import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.exception.FeatureNotFoundException; import dev.sheldan.abstracto.core.models.database.AFeature; +import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.template.commands.FeatureModeDisplay; 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.service.management.ServerManagementService; import dev.sheldan.abstracto.core.test.command.CommandConfigValidator; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; import org.junit.Assert; @@ -43,6 +45,9 @@ public class FeatureModesTest { @Mock private FeatureConfigService featureConfigService; + @Mock + private ServerManagementService serverManagementService; + @Mock private FeatureManagementService featureManagementService; @@ -57,7 +62,9 @@ public class FeatureModesTest { FeatureModeDisplay display1 = Mockito.mock(FeatureModeDisplay.class); FeatureModeDisplay display2 = Mockito.mock(FeatureModeDisplay.class); List featureModeDisplays = Arrays.asList(display1, display2); - when(featureModeService.getEffectiveFeatureModes(noParameters.getUserInitiatedContext().getServer())).thenReturn(featureModeDisplays); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(featureModeService.getEffectiveFeatureModes(server)).thenReturn(featureModeDisplays); when(channelService.sendEmbedTemplateInChannel(eq(FeatureModes.FEATURE_MODES_RESPONSE_TEMPLATE_KEY), modelCaptor.capture(), eq(noParameters.getChannel()))).thenReturn(new ArrayList<>()); CompletableFuture commandResultCompletableFuture = testUnit.executeAsync(noParameters); CommandTestUtilities.checkSuccessfulCompletionAsync(commandResultCompletableFuture); @@ -76,7 +83,9 @@ public class FeatureModesTest { AFeature feature = Mockito.mock(AFeature.class); when(featureManagementService.getFeature(FEATURE_NAME)).thenReturn(feature); List featureModeDisplays = Arrays.asList(display1); - when(featureModeService.getEffectiveFeatureModes(noParameters.getUserInitiatedContext().getServer(), feature)).thenReturn(featureModeDisplays); + AServer server = Mockito.mock(AServer.class); + when(serverManagementService.loadServer(noParameters.getGuild())).thenReturn(server); + when(featureModeService.getEffectiveFeatureModes(server, feature)).thenReturn(featureModeDisplays); when(channelService.sendEmbedTemplateInChannel(eq(FeatureModes.FEATURE_MODES_RESPONSE_TEMPLATE_KEY), modelCaptor.capture(), eq(noParameters.getChannel()))).thenReturn(new ArrayList<>()); CompletableFuture commandResultCompletableFuture = testUnit.executeAsync(noParameters); CommandTestUtilities.checkSuccessfulCompletionAsync(commandResultCompletableFuture); diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/CommandDisabledCondition.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/CommandDisabledCondition.java index 87597eef5..3f34188c8 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/CommandDisabledCondition.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/CommandDisabledCondition.java @@ -21,7 +21,7 @@ public class CommandDisabledCondition implements CommandCondition { @Override public ConditionResult shouldExecute(CommandContext context, Command command) { ACommand acommand = commandManagementService.findCommandByName(command.getConfiguration().getName()); - Boolean commandEnabled = channelGroupCommandService.isCommandEnabled(acommand, context.getUserInitiatedContext().getChannel()); + Boolean commandEnabled = channelGroupCommandService.isCommandEnabled(acommand, context.getUserInitiatedContext().getMessageChannel().getIdLong()); if(!commandEnabled) { return ConditionResult.builder().result(false).conditionDetail(new CommandDisabledDetail()).build(); } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/CommandDisallowedCondition.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/CommandDisallowedCondition.java index 7eebd33a7..24e5ef49d 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/CommandDisallowedCondition.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/CommandDisallowedCondition.java @@ -38,7 +38,7 @@ public class CommandDisallowedCondition implements CommandCondition { @Override public ConditionResult shouldExecute(CommandContext context, Command command) { ACommand aCommand = commandService.findCommandByName(command.getConfiguration().getName()); - ACommandInAServer commandForServer = commandInServerManagementService.getCommandForServer(aCommand, context.getUserInitiatedContext().getServer()); + ACommandInAServer commandForServer = commandInServerManagementService.getCommandForServer(aCommand, context.getUserInitiatedContext().getGuild().getIdLong()); if(Boolean.FALSE.equals(commandForServer.getRestricted())) { return ConditionResult.builder().result(true).build(); } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/FeatureModeCondition.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/FeatureModeCondition.java index da9d2d221..247f45210 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/FeatureModeCondition.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/FeatureModeCondition.java @@ -21,7 +21,7 @@ public class FeatureModeCondition implements CommandCondition { FeatureEnum feature = command.getFeature(); if(feature != null) { for (FeatureMode featureModeLimitation : command.getFeatureModeLimitations()) { - if(modeService.featureModeActive(feature, context.getUserInitiatedContext().getServer(), featureModeLimitation)) { + if(modeService.featureModeActive(feature, context.getUserInitiatedContext().getGuild().getIdLong(), featureModeLimitation)) { return ConditionResult.builder().result(true).build(); } } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/ImmuneUserCondition.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/ImmuneUserCondition.java index 9239523b5..64c65c2c0 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/ImmuneUserCondition.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/condition/ImmuneUserCondition.java @@ -36,7 +36,7 @@ public class ImmuneUserCondition implements CommandCondition { @Override public ConditionResult shouldExecute(CommandContext context, Command command) { ACommand aCommand = commandService.findCommandByName(command.getConfiguration().getName()); - ACommandInAServer commandForServer = commandInServerManagementService.getCommandForServer(aCommand, context.getUserInitiatedContext().getServer()); + ACommandInAServer commandForServer = commandInServerManagementService.getCommandForServer(aCommand, context.getUserInitiatedContext().getGuild().getIdLong()); Optional any = context.getParameters().getParameters().stream().filter(o -> o instanceof Member).map(this::toMember).findAny(); if(any.isPresent()) { Member member = any.get(); diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/execution/ContextConverter.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/execution/ContextConverter.java index 21ab678ff..89e8239e0 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/execution/ContextConverter.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/execution/ContextConverter.java @@ -25,10 +25,6 @@ public class ContextConverter { .guild(commandContext.getGuild()) .message(commandContext.getMessage()) .messageChannel(commandContext.getChannel()) - .channel(commandContext.getUserInitiatedContext().getChannel()) - .server(commandContext.getUserInitiatedContext().getServer()) - .aUserInAServer(commandContext.getUserInitiatedContext().getAUserInAServer()) - .user(commandContext.getUserInitiatedContext().getUser()) .build(); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { log.error("Failed to execute builder method", e); diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/service/ChannelGroupCommandService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/service/ChannelGroupCommandService.java index ce6b254d1..15eb28068 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/service/ChannelGroupCommandService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/service/ChannelGroupCommandService.java @@ -5,4 +5,5 @@ import dev.sheldan.abstracto.core.models.database.AChannel; public interface ChannelGroupCommandService { Boolean isCommandEnabled(ACommand command, AChannel channel); + Boolean isCommandEnabled(ACommand command, Long channelId); } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/service/management/CommandInServerManagementService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/service/management/CommandInServerManagementService.java index 12222afb8..edbc9cf74 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/service/management/CommandInServerManagementService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/service/management/CommandInServerManagementService.java @@ -8,4 +8,5 @@ public interface CommandInServerManagementService { ACommandInAServer crateCommandInServer(ACommand command, AServer server); boolean doesCommandExistInServer(ACommand command, AServer server); ACommandInAServer getCommandForServer(ACommand command, AServer server); + ACommandInAServer getCommandForServer(ACommand command, Long serverId); } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/cache/CachedMessage.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/cache/CachedMessage.java index 3bd998500..8117b7f53 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/cache/CachedMessage.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/cache/CachedMessage.java @@ -1,5 +1,6 @@ package dev.sheldan.abstracto.core.models.cache; +import dev.sheldan.abstracto.core.models.ServerUser; import dev.sheldan.abstracto.core.utils.MessageUtils; import lombok.Builder; import lombok.Getter; @@ -26,4 +27,8 @@ public class CachedMessage { public String getMessageUrl() { return MessageUtils.buildMessageUrl(this.serverId ,this.channelId, this.messageId); } + + public ServerUser getAuthorAsServerUser() { + return ServerUser.builder().serverId(serverId).userId(author.getAuthorId()).build(); + } } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/context/ServerContext.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/context/ServerContext.java index ecc9eb147..063a6b4d2 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/context/ServerContext.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/context/ServerContext.java @@ -1,6 +1,5 @@ package dev.sheldan.abstracto.core.models.context; -import dev.sheldan.abstracto.core.models.database.AServer; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -15,6 +14,5 @@ import net.dv8tion.jda.api.entities.Guild; @Setter public class ServerContext { private Guild guild; - private AServer server; } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/context/UserInitiatedServerContext.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/context/UserInitiatedServerContext.java index dc9d4a2fc..3af2609d7 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/context/UserInitiatedServerContext.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/context/UserInitiatedServerContext.java @@ -1,8 +1,5 @@ package dev.sheldan.abstracto.core.models.context; -import dev.sheldan.abstracto.core.models.database.AChannel; -import dev.sheldan.abstracto.core.models.database.AUser; -import dev.sheldan.abstracto.core.models.database.AUserInAServer; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -16,11 +13,8 @@ import net.dv8tion.jda.api.entities.MessageChannel; @Setter @SuperBuilder public class UserInitiatedServerContext extends ServerContext { - private AChannel channel; private MessageChannel messageChannel; private Member member; - private AUser user; private Message message; - private AUserInAServer aUserInAServer; } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/PostTargetService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/PostTargetService.java index 3ea5b1820..43c0fd843 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/PostTargetService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/PostTargetService.java @@ -24,6 +24,7 @@ public interface PostTargetService { List> editOrCreatedInPostTarget(Long messageId, MessageToSend messageToSend, PostTarget target); List> editOrCreatedInPostTarget(Long messageId, MessageToSend messageToSend, PostTargetEnum postTarget, Long serverId); void throwIfPostTargetIsNotDefined(PostTargetEnum name, Long serverId); + boolean postTargetDefinedInServer(PostTargetEnum name, Long serverId); boolean validPostTarget(String name); List getPostTargets(AServer server); List getAvailablePostTargets(); diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelManagementService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelManagementService.java index fc033e6b5..69915c0ed 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelManagementService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ChannelManagementService.java @@ -3,12 +3,14 @@ package dev.sheldan.abstracto.core.service.management; import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AChannelType; import dev.sheldan.abstracto.core.models.database.AServer; +import net.dv8tion.jda.api.entities.TextChannel; import java.util.Optional; public interface ChannelManagementService { Optional loadChannelOptional(Long id); AChannel loadChannel(Long id); + AChannel loadChannel(TextChannel textChannel); AChannel createChannel(Long id, AChannelType type, AServer server); AChannel markAsDeleted(Long id); boolean channelExists(Long id); diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ServerManagementService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ServerManagementService.java index ff4987353..d4fc521c8 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ServerManagementService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/ServerManagementService.java @@ -1,6 +1,7 @@ package dev.sheldan.abstracto.core.service.management; import dev.sheldan.abstracto.core.models.database.*; +import net.dv8tion.jda.api.entities.Guild; import java.util.List; import java.util.Optional; @@ -9,6 +10,7 @@ public interface ServerManagementService { AServer createServer(Long id); AServer loadOrCreate(Long id); AServer loadServer(Long id); + AServer loadServer(Guild guild); Optional loadServerOptional(Long id); void addChannelToServer(AServer server, AChannel channel); AUserInAServer addUserToServer(AServer server, AUser user); diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/utils/ContextUtils.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/utils/ContextUtils.java index 00a6cf37b..ac3b397ac 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/utils/ContextUtils.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/utils/ContextUtils.java @@ -1,14 +1,12 @@ package dev.sheldan.abstracto.core.utils; import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException; -import dev.sheldan.abstracto.core.models.database.AChannel; +import dev.sheldan.abstracto.core.models.GuildChannelMember; +import dev.sheldan.abstracto.core.models.cache.CachedMessage; +import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext; +import dev.sheldan.abstracto.core.service.BotService; import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; -import dev.sheldan.abstracto.core.models.cache.CachedMessage; -import dev.sheldan.abstracto.core.models.GuildChannelMember; -import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext; -import dev.sheldan.abstracto.core.models.database.AUserInAServer; -import dev.sheldan.abstracto.core.service.BotService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -35,16 +33,10 @@ public class ContextUtils { try { m = clazz.getMethod("builder"); UserInitiatedServerContext.UserInitiatedServerContextBuilder builder = (UserInitiatedServerContext.UserInitiatedServerContextBuilder) m.invoke(null, null); - AUserInAServer aUserInAServer = userInServerManagementService.loadUser(message.getServerId(), message.getAuthor().getAuthorId()); - AChannel channel = channelManagementService.loadChannel(message.getChannelId()); return builder .member(guildChannelMember.getMember()) .guild(guildChannelMember.getGuild()) .messageChannel(guildChannelMember.getTextChannel()) - .channel(channel) - .server(aUserInAServer.getServerReference()) - .aUserInAServer(aUserInAServer) - .user(aUserInAServer.getUserReference()) .build(); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { log.error("Failed to execute builder method", e); diff --git a/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/command/condition/FeatureModeConditionTest.java b/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/command/condition/FeatureModeConditionTest.java index 596ce9c59..89045ca44 100644 --- a/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/command/condition/FeatureModeConditionTest.java +++ b/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/command/condition/FeatureModeConditionTest.java @@ -5,9 +5,9 @@ import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureMode; import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext; -import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.FeatureModeService; import dev.sheldan.abstracto.core.test.command.CommandTestUtilities; +import net.dv8tion.jda.api.entities.Guild; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; @@ -41,11 +41,13 @@ public class FeatureModeConditionTest { private FeatureEnum featureEnum; @Mock - private AServer server; + private Guild server; @Mock private UserInitiatedServerContext userInitiatedServerContext; + private static final Long SERVER_ID = 4L; + @Test public void testNoLimitations() { when(command.getFeatureModeLimitations()).thenReturn(new ArrayList<>()); @@ -55,9 +57,10 @@ public class FeatureModeConditionTest { @Test public void testMetLimitations() { when(commandContext.getUserInitiatedContext()).thenReturn(userInitiatedServerContext); - when(userInitiatedServerContext.getServer()).thenReturn(server); + when(server.getIdLong()).thenReturn(SERVER_ID); + when(userInitiatedServerContext.getGuild()).thenReturn(server); when(command.getFeature()).thenReturn(featureEnum); - when(modeService.featureModeActive(featureEnum, server, featureMode)).thenReturn(true); + when(modeService.featureModeActive(featureEnum, SERVER_ID, featureMode)).thenReturn(true); when(command.getFeatureModeLimitations()).thenReturn(Arrays.asList(featureMode)); CommandTestUtilities.checkSuccessfulCondition(testUnit.shouldExecute(commandContext, command)); } @@ -65,9 +68,10 @@ public class FeatureModeConditionTest { @Test public void testLimitedCommand() { when(commandContext.getUserInitiatedContext()).thenReturn(userInitiatedServerContext); - when(userInitiatedServerContext.getServer()).thenReturn(server); + when(server.getIdLong()).thenReturn(SERVER_ID); + when(userInitiatedServerContext.getGuild()).thenReturn(server); when(command.getFeature()).thenReturn(featureEnum); - when(modeService.featureModeActive(featureEnum, server, featureMode)).thenReturn(false); + when(modeService.featureModeActive(featureEnum, SERVER_ID, featureMode)).thenReturn(false); when(command.getFeatureModeLimitations()).thenReturn(Arrays.asList(featureMode)); CommandTestUtilities.checkUnmetCondition(testUnit.shouldExecute(commandContext, command)); } 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 d6e0a44ac..decb2387d 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 @@ -7,9 +7,6 @@ import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.execution.ResultState; import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext; -import dev.sheldan.abstracto.core.models.database.AServer; -import dev.sheldan.abstracto.core.models.database.AUserInAServer; -import dev.sheldan.abstracto.core.test.MockUtils; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Message; @@ -44,8 +41,6 @@ public class CommandTestUtilities { public static CommandContext getNoParameters() { - AServer server = MockUtils.getServer(); - AUserInAServer author = MockUtils.getUserObject(3L, server); CommandContext context = CommandContext .builder() .build(); @@ -53,16 +48,11 @@ public class CommandTestUtilities { context.setGuild(guild); Member member = Mockito.mock(Member.class); context.setAuthor(member); - long channelId = 4L; TextChannel mockedTextChannel = Mockito.mock(TextChannel.class); UserInitiatedServerContext userInitiatedContext = UserInitiatedServerContext .builder() - .server(server) .guild(guild) - .aUserInAServer(author) .member(member) - .user(author.getUserReference()) - .channel(MockUtils.getTextChannel(server, channelId)) .messageChannel(mockedTextChannel) .build(); context.setUserInitiatedContext(userInitiatedContext); diff --git a/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/utils/ContextUtilsTest.java b/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/utils/ContextUtilsTest.java deleted file mode 100644 index acf24856a..000000000 --- a/abstracto-application/core/core-interface/src/test/java/dev/sheldan/abstracto/core/utils/ContextUtilsTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package dev.sheldan.abstracto.core.utils; - -import dev.sheldan.abstracto.core.models.GuildChannelMember; -import dev.sheldan.abstracto.core.models.cache.CachedAuthor; -import dev.sheldan.abstracto.core.models.cache.CachedMessage; -import dev.sheldan.abstracto.core.models.database.AChannel; -import dev.sheldan.abstracto.core.models.database.AServer; -import dev.sheldan.abstracto.core.models.database.AUser; -import dev.sheldan.abstracto.core.models.database.AUserInAServer; -import dev.sheldan.abstracto.core.models.template.commands.PingModel; -import dev.sheldan.abstracto.core.service.BotService; -import dev.sheldan.abstracto.core.service.management.ChannelManagementService; -import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class ContextUtilsTest { - - public static final Long CHANNEL_ID = 1L; - public static final Long SERVER_ID = 1L; - public static final Long AUTHOR_ID = 1L; - @InjectMocks - private ContextUtils classToTest; - - @Mock - private ChannelManagementService channelManagementService; - - @Mock - private UserInServerManagementService userInServerManagementService; - - @Mock - private BotService botService; - - @Before - public void setup() { - GuildChannelMember build = GuildChannelMember.builder().build(); - when(botService.getServerChannelUser(eq(SERVER_ID), eq(CHANNEL_ID), eq(AUTHOR_ID))).thenReturn(build); - AServer server = AServer.builder().id(SERVER_ID).build(); - AUserInAServer aUserInAServer = AUserInAServer.builder().userReference(AUser.builder().id(AUTHOR_ID).build()).serverReference(server).build(); - when(userInServerManagementService.loadUser(eq(SERVER_ID), eq(AUTHOR_ID))).thenReturn(aUserInAServer); - AChannel channel = AChannel.builder().id(CHANNEL_ID).build(); - when(channelManagementService.loadChannel(eq(CHANNEL_ID))).thenReturn(channel); - } - - @Test - public void testFromMessage() { - PingModel pingModel = (PingModel) classToTest.fromMessage(buildCachedMessage(), PingModel.class); - assertEquals(AUTHOR_ID, pingModel.getUser().getId()); - assertEquals(AUTHOR_ID, pingModel.getAUserInAServer().getUserReference().getId()); - assertEquals(SERVER_ID, pingModel.getAUserInAServer().getServerReference().getId()); - assertEquals(SERVER_ID, pingModel.getServer().getId()); - assertEquals(CHANNEL_ID, pingModel.getChannel().getId()); - } - - private CachedMessage buildCachedMessage() { - return CachedMessage.builder().author(CachedAuthor.builder().authorId(AUTHOR_ID).build()).serverId(SERVER_ID).channelId(CHANNEL_ID).build(); - } -} diff --git a/abstracto-application/documentation/src/main/docs/asciidoc/modules/moderation.adoc b/abstracto-application/documentation/src/main/docs/asciidoc/modules/moderation.adoc index 7e6a91122..58c2842b4 100644 --- a/abstracto-application/documentation/src/main/docs/asciidoc/modules/moderation.adoc +++ b/abstracto-application/documentation/src/main/docs/asciidoc/modules/moderation.adoc @@ -165,3 +165,37 @@ Deleting a user note:: Retrieving user notes:: * Usage: `userNotes [user]` * Description: If `user` is not provided, this will list the user notes of the whole server, if `user` is provided, this will only list user notes from this particular `user`. + +=== Invite filter + +Feature key `inviteFilter` + +This feature provides the ability to automatically delete invites not allowed on the server. These illegal invites can be tracked in a specific feature mode, in order to analyze if allowing them would make sense. +Another feature mode can send a notification to a post target in case an invite link has been deleted. + +==== Post targets +`inviteDeleteLog`:: target for notifications about deleted invite links - if the feature mode `filterNotifications` is enabled. + + +==== Feature modes +`trackUses`:: if enabled, each filtered invite will be tracked in the database. Disabled by default. +`filterNotifications`:: if enabled, sends a notification to the `inviteDeleteLog` post target in case a message was deleted because of an invite. This notification contains the detected invite link(s), the author and a link to where the message was. Enabled by default. + +==== Commands +Allowing an invite:: +* Usage: `allowInvite ` +* Description: Adds the `invite` to the list of invites, which are allowed on the server. The `invite` can either be the full invite URL or only the last part. If the invite is already allowed, this command will do nothing. + +Disallowing an invite:: +* Usage: `disAllowInvite ` +* Description: Removes the `invite` from the list of invites, which are allowed on the server. The `invite` can either be the full invite URL or only the last part. In case the given invite is not allowed, this command will throw an error. + +Showing the tracked filtered invites:: +* Usage: `showTrackedInviteLinks [amount]` +* Description: Shows the invites which were used and deleted on the server ordered by the amount of times they were deleted. The `amount` can be used to define how many invite links to display. The default is the top 5. +* Mode Restriction: This command is only available when the feature mode `trackUses` is enabled. + +Remove all or individual invites from the tracked filtered invites:: +* Usage: `removeTrackedInviteLinks [invite]` +* Description: Removes the stored statistic for the given `invite`. In case `invite` is not given, it will delete all tracked filtered invites from the server. +* Mode Restriction: This command is only available when the feature mode `trackUses` is enabled. \ No newline at end of file