From d95382b5896cc711bf840022030c784703289dcc Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Sun, 22 Mar 2020 10:26:58 +0100 Subject: [PATCH] added mechanism to dynamically load properties defining postTargets and valid emoteNames changed the output of the exception message refactored emote management service added service to define whether or not an emote is usable by the bot --- .../moderation/config/ModerationConfig.java | 10 ++ .../listener/MessageDeletedListener.java | 8 +- .../listener/MessageEditedListener.java | 6 +- .../moderation/service/BanServiceBean.java | 12 +- .../moderation/service/KickServiceBean.java | 6 +- .../moderation/service/WarnServiceBean.java | 7 +- ...racto.properties => moderation.properties} | 0 .../utility/config/UtilityConfig.java | 10 ++ .../service/SuggestionServiceBean.java | 8 +- .../AsyncSuggestionServiceBean.java | 4 +- .../src/main/resources/abstracto.properties | 1 - .../src/main/resources/utility.properties | 2 + .../post/ExceptionPostExecution.java | 2 +- .../abstracto/core/DynamicKeyLoader.java | 40 +++++++ .../abstracto/core/PostTargetLoader.java | 31 ----- .../core/commands/utility/SetEmote.java | 11 +- .../core/exception/PostTargetException.java | 7 -- .../core/service/EmoteServiceBean.java | 24 ++++ .../EmoteManagementServiceBean.java | 110 +++++++++++++++--- .../management/PostTargetManagementBean.java | 13 ++- .../abstracto/listener/JoinLeaveListener.java | 7 +- .../abstracto/repository/EmoteRepository.java | 2 + .../management/EmoteManagementService.java | 8 ++ .../core/models/database/PostTarget.java | 10 -- .../abstracto/core/service/EmoteService.java | 7 ++ 25 files changed, 246 insertions(+), 100 deletions(-) create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/config/ModerationConfig.java rename abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/{abstracto.properties => moderation.properties} (100%) create mode 100644 abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/config/UtilityConfig.java delete mode 100644 abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/abstracto.properties create mode 100644 abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/utility.properties create mode 100644 abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/DynamicKeyLoader.java delete mode 100644 abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/PostTargetLoader.java delete mode 100644 abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/exception/PostTargetException.java create mode 100644 abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/EmoteServiceBean.java create mode 100644 abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/EmoteService.java diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/config/ModerationConfig.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/config/ModerationConfig.java new file mode 100644 index 000000000..7a64d702c --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/config/ModerationConfig.java @@ -0,0 +1,10 @@ +package dev.sheldan.abstracto.moderation.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +@Configuration +@PropertySource("classpath:moderation.properties") +public class ModerationConfig { +} + diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MessageDeletedListener.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MessageDeletedListener.java index 0999da638..9087540a1 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MessageDeletedListener.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MessageDeletedListener.java @@ -1,7 +1,6 @@ package dev.sheldan.abstracto.moderation.listener; import dev.sheldan.abstracto.core.utils.ContextUtils; -import dev.sheldan.abstracto.core.models.database.PostTarget; import dev.sheldan.abstracto.core.service.MessageCache; import dev.sheldan.abstracto.core.service.PostTargetService; import dev.sheldan.abstracto.moderation.models.template.listener.MessageDeletedAttachmentLog; @@ -20,6 +19,7 @@ import javax.annotation.Nonnull; @Component public class MessageDeletedListener extends ListenerAdapter { + private static final String DELETE_LOG_TARGET = "deleteLog"; private static String MESSAGE_DELETED_TEMPLATE = "message_deleted"; private static String MESSAGE_DELETED_ATTACHMENT_TEMPLATE = "message_deleted_attachment"; @@ -43,16 +43,16 @@ public class MessageDeletedListener extends ListenerAdapter { MessageDeletedLog logModel = (MessageDeletedLog) contextUtils.fromMessage(messageFromCache, MessageDeletedLog.class); logModel.setMessage(messageFromCache); String simpleMessageUpdatedMessage = templateService.renderTemplate(MESSAGE_DELETED_TEMPLATE, logModel); - postTargetService.sendTextInPostTarget(simpleMessageUpdatedMessage, PostTarget.EDIT_LOG, event.getGuild().getIdLong()); + postTargetService.sendTextInPostTarget(simpleMessageUpdatedMessage, DELETE_LOG_TARGET, event.getGuild().getIdLong()); MessageEmbed embed = templateService.renderEmbedTemplate(MESSAGE_DELETED_TEMPLATE, logModel); - postTargetService.sendEmbedInPostTarget(embed, PostTarget.DELETE_LOG, event.getGuild().getIdLong()); + postTargetService.sendEmbedInPostTarget(embed, DELETE_LOG_TARGET, event.getGuild().getIdLong()); for (int i = 0; i < messageFromCache.getAttachments().size(); i++) { Message.Attachment attachment = messageFromCache.getAttachments().get(i); MessageDeletedAttachmentLog log = (MessageDeletedAttachmentLog) contextUtils.fromMessage(messageFromCache, MessageDeletedAttachmentLog.class); log.setImageUrl(attachment.getProxyUrl()); log.setCounter(i + 1); MessageEmbed attachmentEmbed = templateService.renderEmbedTemplate(MESSAGE_DELETED_ATTACHMENT_TEMPLATE, log); - postTargetService.sendEmbedInPostTarget(attachmentEmbed, PostTarget.DELETE_LOG, event.getGuild().getIdLong()); + postTargetService.sendEmbedInPostTarget(attachmentEmbed, DELETE_LOG_TARGET, event.getGuild().getIdLong()); } } } 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/MessageEditedListener.java index 1edaf94a3..e9fed29f8 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/MessageEditedListener.java @@ -1,7 +1,6 @@ package dev.sheldan.abstracto.moderation.listener; import dev.sheldan.abstracto.core.MessageTextUpdatedListener; -import dev.sheldan.abstracto.core.models.database.PostTarget; import dev.sheldan.abstracto.core.service.MessageCache; import dev.sheldan.abstracto.core.service.PostTargetService; import dev.sheldan.abstracto.moderation.models.template.listener.MessageEditedLog; @@ -18,6 +17,7 @@ import org.springframework.transaction.annotation.Transactional; public class MessageEditedListener implements MessageTextUpdatedListener { private static final String MESSAGE_EDITED_TEMPLATE = "message_edited"; + private static final String EDIT_LOG_TARGET = "editLog"; @Autowired private TemplateService templateService; @@ -43,9 +43,9 @@ public class MessageEditedListener implements MessageTextUpdatedListener { .guild(messageAfter.getGuild()) .member(messageAfter.getMember()).build(); String simpleMessageUpdatedMessage = templateService.renderTemplate(MESSAGE_EDITED_TEMPLATE, log); - postTargetService.sendTextInPostTarget(simpleMessageUpdatedMessage, PostTarget.EDIT_LOG, messageAfter.getGuild().getIdLong()); + postTargetService.sendTextInPostTarget(simpleMessageUpdatedMessage, EDIT_LOG_TARGET, messageAfter.getGuild().getIdLong()); MessageEmbed embed = templateService.renderEmbedTemplate(MESSAGE_EDITED_TEMPLATE, log); - postTargetService.sendEmbedInPostTarget(embed, PostTarget.DELETE_LOG, messageBefore.getGuild().getIdLong()); + postTargetService.sendEmbedInPostTarget(embed, EDIT_LOG_TARGET, messageBefore.getGuild().getIdLong()); } } 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 5266df592..5432aad2a 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 @@ -1,11 +1,8 @@ package dev.sheldan.abstracto.moderation.service; import dev.sheldan.abstracto.core.models.ServerContext; -import dev.sheldan.abstracto.core.models.database.PostTarget; import dev.sheldan.abstracto.core.service.Bot; import dev.sheldan.abstracto.core.service.PostTargetService; -import dev.sheldan.abstracto.moderation.models.template.BanIdLog; -import dev.sheldan.abstracto.moderation.models.template.BanLog; import dev.sheldan.abstracto.templating.TemplateService; import lombok.extern.slf4j.Slf4j; import net.dv8tion.jda.api.entities.Guild; @@ -17,8 +14,9 @@ import org.springframework.stereotype.Component; @Slf4j public class BanServiceBean implements BanService { - public static final String BAN_LOG_TEMPLATE = "ban_log"; - public static final String BAN_ID_LOG_TEMPLATE = "banid_log"; + private static final String BAN_LOG_TEMPLATE = "ban_log"; + private static final String BAN_ID_LOG_TEMPLATE = "banid_log"; + private static final String BAN_LOG_TARGET = "banLog"; @Autowired private Bot bot; @@ -32,14 +30,14 @@ public class BanServiceBean implements BanService { public void banMember(Member member, String reason, ServerContext banLog) { this.banUser(member.getGuild().getIdLong(), member.getIdLong(), reason); String warnLogMessage = templateService.renderContextAwareTemplate(BAN_LOG_TEMPLATE, banLog); - postTargetService.sendTextInPostTarget(warnLogMessage, PostTarget.BAN_LOG, banLog.getServer().getId()); + postTargetService.sendTextInPostTarget(warnLogMessage, BAN_LOG_TARGET, banLog.getServer().getId()); } @Override public void banMember(Long guildId, Long userId, String reason, ServerContext banIdLog) { banUser(guildId, userId, reason); String warnLogMessage = templateService.renderContextAwareTemplate(BAN_ID_LOG_TEMPLATE, banIdLog); - postTargetService.sendTextInPostTarget(warnLogMessage, PostTarget.BAN_LOG, guildId); + postTargetService.sendTextInPostTarget(warnLogMessage, BAN_LOG_TARGET, guildId); } private void banUser(Long guildId, Long userId, String reason) { 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 a669876c9..8e0275753 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 @@ -1,6 +1,5 @@ package dev.sheldan.abstracto.moderation.service; -import dev.sheldan.abstracto.core.models.database.PostTarget; import dev.sheldan.abstracto.core.service.Bot; import dev.sheldan.abstracto.core.service.PostTargetService; import dev.sheldan.abstracto.moderation.models.template.KickLogModel; @@ -15,7 +14,8 @@ import org.springframework.stereotype.Component; @Slf4j public class KickServiceBean implements KickService { - public static final String KICK_LOG_TEMPLATE = "kick_log"; + private static final String KICK_LOG_TEMPLATE = "kick_log"; + private static final String WARN_LOG_TARGET = "warnLog"; @Autowired private Bot bot; @@ -38,6 +38,6 @@ public class KickServiceBean implements KickService { private void sendKickLog(KickLogModel kickLogModel) { String warnLogMessage = templateService.renderContextAwareTemplate(KICK_LOG_TEMPLATE, kickLogModel); - postTargetService.sendTextInPostTarget(warnLogMessage, PostTarget.WARN_LOG, kickLogModel.getServer().getId()); + postTargetService.sendTextInPostTarget(warnLogMessage, WARN_LOG_TARGET, kickLogModel.getServer().getId()); } } 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 05e40090e..3df13795c 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 @@ -1,7 +1,6 @@ package dev.sheldan.abstracto.moderation.service; import dev.sheldan.abstracto.core.models.ServerContext; -import dev.sheldan.abstracto.core.models.UserInitiatedServerContext; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.database.AUser; import dev.sheldan.abstracto.moderation.models.template.WarnLog; @@ -11,7 +10,6 @@ import dev.sheldan.abstracto.moderation.service.management.WarnManagementService import dev.sheldan.abstracto.core.management.ServerManagementService; import dev.sheldan.abstracto.core.management.UserManagementService; import dev.sheldan.abstracto.core.models.database.AUserInAServer; -import dev.sheldan.abstracto.core.models.database.PostTarget; import dev.sheldan.abstracto.core.service.Bot; import dev.sheldan.abstracto.core.service.PostTargetService; import dev.sheldan.abstracto.templating.TemplateService; @@ -28,6 +26,7 @@ import org.springframework.stereotype.Component; @Component public class WarnServiceBean implements WarnService { + public static final String WARN_LOG_TARGET = "warnLog"; @Autowired private UserManagementService userManagementService; @@ -86,8 +85,8 @@ public class WarnServiceBean implements WarnService { private void sendWarnLog(ServerContext warnLogModel) { String warnLogMessage = templateService.renderContextAwareTemplate(WARN_LOG_TEMPLATE, warnLogModel); - postTargetService.sendTextInPostTarget(warnLogMessage, PostTarget.WARN_LOG, warnLogModel.getServer().getId()); + postTargetService.sendTextInPostTarget(warnLogMessage, WARN_LOG_TARGET, warnLogModel.getServer().getId()); MessageEmbed embed = templateService.renderEmbedTemplate("warn_log", warnLogModel); - postTargetService.sendEmbedInPostTarget(embed, PostTarget.WARN_LOG, warnLogModel.getServer().getId()); + postTargetService.sendEmbedInPostTarget(embed, WARN_LOG_TARGET, warnLogModel.getServer().getId()); } } diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/abstracto.properties b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/moderation.properties similarity index 100% rename from abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/abstracto.properties rename to abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/moderation.properties diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/config/UtilityConfig.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/config/UtilityConfig.java new file mode 100644 index 000000000..86dfc41fb --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/config/UtilityConfig.java @@ -0,0 +1,10 @@ +package dev.sheldan.abstracto.utility.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +@Configuration +@PropertySource("classpath:utility.properties") +public class UtilityConfig { +} + 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 e1190af81..78ec4779f 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 @@ -2,7 +2,6 @@ package dev.sheldan.abstracto.utility.service; import dev.sheldan.abstracto.core.management.EmoteManagementService; import dev.sheldan.abstracto.core.models.database.AUserInAServer; -import dev.sheldan.abstracto.core.models.database.PostTarget; import dev.sheldan.abstracto.core.service.Bot; import dev.sheldan.abstracto.core.service.MessageService; import dev.sheldan.abstracto.core.service.PostTargetService; @@ -24,8 +23,9 @@ import org.springframework.stereotype.Component; public class SuggestionServiceBean implements SuggestionService { public static final String SUGGESTION_LOG_TEMPLATE = "suggest_log"; - public static final String SUGGESTION_YES_EMOTE = "SUGGESTION_YES"; - public static final String SUGGESTION_NO_EMOTE = "SUGGESTION_NO"; + private static final String SUGGESTION_YES_EMOTE = "SUGGESTION_YES"; + private static final String SUGGESTION_NO_EMOTE = "SUGGESTION_NO"; + public static final String SUGGESTIONS_TARGET = "suggestions"; @Autowired private SuggestionManagementService suggestionManagementService; @@ -57,7 +57,7 @@ public class SuggestionServiceBean implements SuggestionService { JDA instance = botService.getInstance(); Guild guildById = instance.getGuildById(guildId); if(guildById != null) { - postTargetService.sendEmbedInPostTarget(embed, PostTarget.SUGGESTIONS, guildId).thenAccept(message -> { + postTargetService.sendEmbedInPostTarget(embed, SUGGESTIONS_TARGET, guildId).thenAccept(message -> { messageService.addReactionToMessage(SUGGESTION_YES_EMOTE, guildId, message); messageService.addReactionToMessage(SUGGESTION_NO_EMOTE, guildId, message); suggestionManagementService.setPostedMessage(suggestion, message); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/AsyncSuggestionServiceBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/AsyncSuggestionServiceBean.java index 5d7c44723..52ac0ec35 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/AsyncSuggestionServiceBean.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/AsyncSuggestionServiceBean.java @@ -1,6 +1,5 @@ package dev.sheldan.abstracto.utility.service.management; -import dev.sheldan.abstracto.core.models.database.PostTarget; import dev.sheldan.abstracto.core.service.PostTargetService; import dev.sheldan.abstracto.templating.TemplateService; import dev.sheldan.abstracto.utility.models.template.SuggestionLog; @@ -15,6 +14,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.Optional; import static dev.sheldan.abstracto.utility.service.SuggestionServiceBean.SUGGESTION_LOG_TEMPLATE; +import static dev.sheldan.abstracto.utility.service.SuggestionServiceBean.SUGGESTIONS_TARGET; @Component @Slf4j @@ -34,7 +34,7 @@ public class AsyncSuggestionServiceBean { suggestionLog.setReason(text); suggestionLog.setText(suggestionEmbed.getDescription()); MessageEmbed embed = templateService.renderEmbedTemplate(SUGGESTION_LOG_TEMPLATE, suggestionLog); - postTargetService.sendEmbedInPostTarget(embed, PostTarget.SUGGESTIONS, suggestionLog.getServer().getId()); + postTargetService.sendEmbedInPostTarget(embed, SUGGESTIONS_TARGET, suggestionLog.getServer().getId()); } } diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/abstracto.properties b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/abstracto.properties deleted file mode 100644 index 3a703b969..000000000 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/abstracto.properties +++ /dev/null @@ -1 +0,0 @@ -abstracto.postTargets.utility=suggestions \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/utility.properties b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/utility.properties new file mode 100644 index 000000000..6a5942ce4 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/utility.properties @@ -0,0 +1,2 @@ +abstracto.postTargets.utility=suggestions +abstracto.emoteNames.suggestion=SUGGESTION_YES,SUGGESTION_NO \ No newline at end of file diff --git a/abstracto-application/command/command-support/src/main/java/dev/sheldan/abstracto/commands/management/post/ExceptionPostExecution.java b/abstracto-application/command/command-support/src/main/java/dev/sheldan/abstracto/commands/management/post/ExceptionPostExecution.java index 822d2d908..6a6a290ae 100644 --- a/abstracto-application/command/command-support/src/main/java/dev/sheldan/abstracto/commands/management/post/ExceptionPostExecution.java +++ b/abstracto-application/command/command-support/src/main/java/dev/sheldan/abstracto/commands/management/post/ExceptionPostExecution.java @@ -28,7 +28,7 @@ public class ExceptionPostExecution implements PostCommandExecution { String text = templateService.renderTemplate(exception.getTemplateName(), exception.getTemplateModel()); commandContext.getChannel().sendMessage(text).queue(); } else { - commandContext.getChannel().sendMessage("Exception: " + result.getThrowable().getClass() + ": " + result.getMessage()).queue(); + commandContext.getChannel().sendMessage(result.getThrowable().getClass().getSimpleName() + ": " + result.getMessage()).queue(); } } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/DynamicKeyLoader.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/DynamicKeyLoader.java new file mode 100644 index 000000000..a47a62ca2 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/DynamicKeyLoader.java @@ -0,0 +1,40 @@ +package dev.sheldan.abstracto.core; + +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +@Component +@Getter +@Setter +@ConfigurationProperties(prefix = "abstracto") +public class DynamicKeyLoader { + + private HashMap postTargets = new HashMap<>(); + private HashMap emoteNames = new HashMap<>(); + + public List getPostTargetsAsList() { + return getHashMapAsList(postTargets); + } + + public List getEmoteNamesAsList() { + return getHashMapAsList(emoteNames); + } + + @NotNull + private List getHashMapAsList(HashMap emoteNames) { + List emotes = new ArrayList<>(); + if (emoteNames == null || emoteNames.size() == 0) { + return emotes; + } + emoteNames.values().forEach(s -> emotes.addAll(Arrays.asList(s.split(",")))); + return emotes; + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/PostTargetLoader.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/PostTargetLoader.java deleted file mode 100644 index 5762b42e3..000000000 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/PostTargetLoader.java +++ /dev/null @@ -1,31 +0,0 @@ -package dev.sheldan.abstracto.core; - -import lombok.Getter; -import lombok.Setter; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.PropertySource; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -@Component -@Getter -@Setter -@PropertySource("classpath:abstracto.properties") -@ConfigurationProperties(prefix = "abstracto") -public class PostTargetLoader { - - private HashMap postTargets = new HashMap<>(); - - public List getPostTargetsAsList() { - List targets = new ArrayList<>(); - if(postTargets == null || postTargets.size() == 0) { - return targets; - } - postTargets.values().forEach(s -> targets.addAll(Arrays.asList(s.split(",")))); - return targets; - } -} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/utility/SetEmote.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/utility/SetEmote.java index 87c361912..69db986fd 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/utility/SetEmote.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/utility/SetEmote.java @@ -5,7 +5,9 @@ import dev.sheldan.abstracto.command.execution.CommandConfiguration; import dev.sheldan.abstracto.command.execution.CommandContext; import dev.sheldan.abstracto.command.execution.Parameter; import dev.sheldan.abstracto.command.execution.Result; +import dev.sheldan.abstracto.core.exception.ConfigurationException; import dev.sheldan.abstracto.core.management.EmoteManagementService; +import dev.sheldan.abstracto.core.service.EmoteService; import net.dv8tion.jda.api.entities.Emote; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -19,6 +21,9 @@ public class SetEmote implements Command { @Autowired private EmoteManagementService emoteManagementService; + @Autowired + private EmoteService emoteService; + @Override public Result execute(CommandContext commandContext) { String emoteKey = (String) commandContext.getParameters().getParameters().get(0); @@ -28,7 +33,11 @@ public class SetEmote implements Command { emoteManagementService.setEmoteToDefaultEmote(emoteKey, emote, commandContext.getGuild().getIdLong()); } else { Emote emote = (Emote) o; - emoteManagementService.setEmoteToCustomEmote(emoteKey, emote, commandContext.getGuild().getIdLong()); + if(emoteService.isEmoteUsableByBot(emote)) { + emoteManagementService.setEmoteToCustomEmote(emoteKey, emote, commandContext.getGuild().getIdLong()); + } else { + throw new ConfigurationException("Emote is not usable by bot."); + } } return Result.fromSuccess(); } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/exception/PostTargetException.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/exception/PostTargetException.java deleted file mode 100644 index 5f1b914ee..000000000 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/exception/PostTargetException.java +++ /dev/null @@ -1,7 +0,0 @@ -package dev.sheldan.abstracto.core.exception; - -public class PostTargetException extends RuntimeException { - public PostTargetException(String message) { - super(message); - } -} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/EmoteServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/EmoteServiceBean.java new file mode 100644 index 000000000..27cfb6730 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/EmoteServiceBean.java @@ -0,0 +1,24 @@ +package dev.sheldan.abstracto.core.service; + +import net.dv8tion.jda.api.entities.Emote; +import net.dv8tion.jda.api.entities.Guild; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class EmoteServiceBean implements EmoteService { + + @Autowired + private Bot botService; + + @Override + public boolean isEmoteUsableByBot(Emote emote) { + for (Guild guild : botService.getInstance().getGuilds()) { + Emote emoteById = guild.getEmoteById(emote.getId()); + if(emoteById != null) { + return true; + } + } + return false; + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/EmoteManagementServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/EmoteManagementServiceBean.java index 22bfa53ef..5ed89b61f 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/EmoteManagementServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/EmoteManagementServiceBean.java @@ -1,5 +1,7 @@ package dev.sheldan.abstracto.core.service.management; +import dev.sheldan.abstracto.core.DynamicKeyLoader; +import dev.sheldan.abstracto.core.exception.ConfigurationException; import dev.sheldan.abstracto.core.management.EmoteManagementService; import dev.sheldan.abstracto.core.management.ServerManagementService; import dev.sheldan.abstracto.core.models.database.AEmote; @@ -9,6 +11,8 @@ import net.dv8tion.jda.api.entities.Emote; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.List; + @Component public class EmoteManagementServiceBean implements EmoteManagementService { @@ -18,37 +22,97 @@ public class EmoteManagementServiceBean implements EmoteManagementService { @Autowired private ServerManagementService serverManagementService; + @Autowired + private DynamicKeyLoader dynamicKeyLoader; + @Override public AEmote loadEmote(Long id) { return repository.getOne(id); } + @Override + public AEmote createCustomEmote(String name, String emoteKey, Long emoteId, Boolean animated, Long serverId) { + AServer server = serverManagementService.loadServer(serverId); + return this.createCustomEmote(name, emoteKey, emoteId, animated, server); + } + + @Override + public AEmote createCustomEmote(String name, String emoteKey, Long emoteId, Boolean animated, AServer server) { + validateEmoteName(name); + AEmote emoteToCreate = AEmote + .builder() + .custom(true) + .name(name) + .animated(animated) + .emoteId(emoteId) + .emoteKey(emoteKey) + .serverRef(server) + .build(); + repository.save(emoteToCreate); + return emoteToCreate; + } + + @Override + public AEmote createDefaultEmote(String name, String emoteKey, Long serverId) { + AServer server = serverManagementService.loadServer(serverId); + return createDefaultEmote(name, emoteKey, server); + } + + @Override + public AEmote createDefaultEmote(String name, String emoteKey, AServer server) { + validateEmoteName(name); + AEmote emoteToCreate = AEmote + .builder() + .custom(false) + .name(name) + .emoteKey(emoteKey) + .serverRef(server) + .build(); + repository.save(emoteToCreate); + return emoteToCreate; + } + @Override public AEmote loadEmoteByName(String name, Long serverId) { AServer server = serverManagementService.loadServer(serverId); + return loadEmoteByName(name, server); + } + + @Override + public AEmote loadEmoteByName(String name, AServer server) { return repository.findAEmoteByNameAndServerRef(name, server); } @Override public AEmote setEmoteToCustomEmote(String name, String emoteKey, Long emoteId, Boolean animated, Long serverId) { - AEmote existing = loadEmoteByName(name, serverId); - existing.setEmoteKey(emoteKey); - existing.setEmoteId(emoteId); - existing.setAnimated(animated); - existing.setCustom(true); - repository.save(existing); - return existing; + AServer server = serverManagementService.loadServer(serverId); + AEmote emote; + if(!emoteExists(name, server)) { + emote = this.createCustomEmote(name, emoteKey, emoteId, animated, server); + } else { + emote = loadEmoteByName(name, server); + emote.setEmoteKey(emoteKey); + emote.setEmoteId(emoteId); + emote.setAnimated(animated); + emote.setCustom(true); + repository.save(emote); + } + return emote; } @Override public AEmote setEmoteToCustomEmote(String name, Emote emote, Long serverId) { - AEmote existing = loadEmoteByName(name, serverId); - existing.setCustom(true); - existing.setAnimated(emote.isAnimated()); - existing.setEmoteId(emote.getIdLong()); - existing.setEmoteKey(emote.getName()); - repository.save(existing); - return existing; + AServer server = serverManagementService.loadServer(serverId); + AEmote emoteBeingSet; + if(!emoteExists(name, server)) { + emoteBeingSet = this.createDefaultEmote(name, emote.getName(), server); + } else { + emoteBeingSet = loadEmoteByName(name, serverId); + emoteBeingSet.setCustom(false); + emoteBeingSet.setEmoteKey(emote.getName()); + repository.save(emoteBeingSet); + } + return emoteBeingSet; } @Override @@ -60,6 +124,17 @@ public class EmoteManagementServiceBean implements EmoteManagementService { return existing; } + @Override + public boolean emoteExists(String name, Long serverId) { + AServer server = serverManagementService.loadServer(serverId); + return emoteExists(name, server); + } + + @Override + public boolean emoteExists(String name, AServer server) { + return repository.existsByNameAndServerRef(name, server); + } + @Override public AEmote createCustomEmote(String name, String emoteKey, Long emoteId, Boolean animated) { AEmote emote = AEmote.builder() @@ -83,4 +158,11 @@ public class EmoteManagementServiceBean implements EmoteManagementService { repository.save(emote); return emote; } + + private void validateEmoteName(String name) { + List possibleEmotes = dynamicKeyLoader.getEmoteNamesAsList(); + if(!possibleEmotes.contains(name)) { + throw new ConfigurationException("Emote `" + name + "` is not defined. Possible values are: " + String.join(", ", possibleEmotes)); + } + } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/PostTargetManagementBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/PostTargetManagementBean.java index 93e3503f2..ed028e250 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/PostTargetManagementBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/PostTargetManagementBean.java @@ -1,7 +1,7 @@ package dev.sheldan.abstracto.core.service.management; -import dev.sheldan.abstracto.core.PostTargetLoader; -import dev.sheldan.abstracto.core.exception.PostTargetException; +import dev.sheldan.abstracto.core.DynamicKeyLoader; +import dev.sheldan.abstracto.core.exception.ConfigurationException; import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.database.PostTarget; @@ -14,6 +14,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; +import java.util.List; + @Service @Slf4j public class PostTargetManagementBean implements PostTargetManagement { @@ -27,12 +29,13 @@ public class PostTargetManagementBean implements PostTargetManagement { private ServerManagementService serverManagementService; @Autowired - private PostTargetLoader postTargetLoader; + private DynamicKeyLoader dynamicKeyLoader; @Override public void createPostTarget(String name, AServer server, AChannel targetChannel) { - if(!postTargetLoader.getPostTargetsAsList().contains(name)) { - throw new PostTargetException("PostTarget not found"); + List possiblePostTargets = dynamicKeyLoader.getPostTargetsAsList(); + if(!possiblePostTargets.contains(name)) { + throw new ConfigurationException("PostTarget not found. Possible values are: " + String.join(", ", possiblePostTargets)); } log.info("Creating post target {} pointing towards {}", name, targetChannel); postTargetRepository.save(PostTarget.builder().name(name).channelReference(targetChannel).serverReference(server).build()); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/listener/JoinLeaveListener.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/listener/JoinLeaveListener.java index f0767b6ab..3a4bfbecc 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/listener/JoinLeaveListener.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/listener/JoinLeaveListener.java @@ -1,6 +1,5 @@ package dev.sheldan.abstracto.listener; -import dev.sheldan.abstracto.core.models.database.PostTarget; import dev.sheldan.abstracto.core.service.PostTargetService; import dev.sheldan.abstracto.core.management.ServerManagementService; import dev.sheldan.abstracto.templating.TemplateService; @@ -23,6 +22,8 @@ public class JoinLeaveListener extends ListenerAdapter { private static final String USER_JOIN_TEMPLATE = "user_join"; private static final String USER_LEAVE_TEMPLATE = "user_leave"; + private static final String JOIN_LOG_TARGET = "joinLog"; + private static final String LEAVE_LOG_TARGET = "leaveLog"; @Autowired private ServerManagementService serverManagementService; @@ -37,14 +38,14 @@ public class JoinLeaveListener extends ListenerAdapter { @Transactional public void onGuildMemberJoin(@Nonnull GuildMemberJoinEvent event) { String text = getRenderedEvent(event.getUser(), USER_JOIN_TEMPLATE); - postTargetService.sendTextInPostTarget(text, PostTarget.JOIN_LOG, event.getGuild().getIdLong()); + postTargetService.sendTextInPostTarget(text, JOIN_LOG_TARGET, event.getGuild().getIdLong()); } @Override @Transactional public void onGuildMemberLeave(@Nonnull GuildMemberLeaveEvent event) { String text = getRenderedEvent(event.getUser(), USER_LEAVE_TEMPLATE); - postTargetService.sendTextInPostTarget(text, PostTarget.LEAVE_LOG, event.getGuild().getIdLong()); + postTargetService.sendTextInPostTarget(text, LEAVE_LOG_TARGET, event.getGuild().getIdLong()); } @NotNull diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/repository/EmoteRepository.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/repository/EmoteRepository.java index a781e27c2..94e531333 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/repository/EmoteRepository.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/repository/EmoteRepository.java @@ -2,10 +2,12 @@ package dev.sheldan.abstracto.repository; import dev.sheldan.abstracto.core.models.database.AEmote; import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUser; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface EmoteRepository extends JpaRepository { AEmote findAEmoteByNameAndServerRef(String name, AServer server); + boolean existsByNameAndServerRef(String name, AServer server); } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/management/EmoteManagementService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/management/EmoteManagementService.java index 5f0142d6b..bd5f23189 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/management/EmoteManagementService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/management/EmoteManagementService.java @@ -1,14 +1,22 @@ package dev.sheldan.abstracto.core.management; import dev.sheldan.abstracto.core.models.database.AEmote; +import dev.sheldan.abstracto.core.models.database.AServer; import net.dv8tion.jda.api.entities.Emote; public interface EmoteManagementService { AEmote loadEmote(Long id); + AEmote createCustomEmote(String name, String emoteKey, Long emoteId, Boolean animated, Long serverId); + AEmote createCustomEmote(String name, String emoteKey, Long emoteId, Boolean animated, AServer server); + AEmote createDefaultEmote(String name, String emoteKey, Long serverId); + AEmote createDefaultEmote(String name, String emoteKey, AServer server); AEmote loadEmoteByName(String name, Long serverId); + AEmote loadEmoteByName(String name, AServer server); AEmote setEmoteToCustomEmote(String name, String emoteKey, Long emoteId, Boolean animated, Long serverId); AEmote setEmoteToCustomEmote(String name, Emote emote, Long serverId); AEmote setEmoteToDefaultEmote(String name, String emoteKey, Long serverId); + boolean emoteExists(String name, Long serverId); + boolean emoteExists(String name, AServer server); AEmote createCustomEmote(String name, String emoteKey, Long emoteId, Boolean animated); AEmote createDefaultEmote(String name, String emoteKey); } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/PostTarget.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/PostTarget.java index dbfc04d5e..5f1c5c108 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/PostTarget.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/database/PostTarget.java @@ -32,14 +32,4 @@ public class PostTarget { @Getter @Setter private AServer serverReference; - public static String JOIN_LOG = "joinLog"; - public static String LEAVE_LOG = "leaveLog"; - public static String WARN_LOG = "warnLog"; - public static String KICK_LOG = "kickLog"; - public static String BAN_LOG = "banLog"; - public static String EDIT_LOG = "editLog"; - public static String DELETE_LOG = "deleteLog"; - public static String SUGGESTIONS = "suggestions"; - - public static List AVAILABLE_POST_TARGETS = Arrays.asList(JOIN_LOG, LEAVE_LOG, WARN_LOG, KICK_LOG, BAN_LOG, EDIT_LOG, DELETE_LOG, SUGGESTIONS); } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/EmoteService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/EmoteService.java new file mode 100644 index 000000000..11f61d692 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/EmoteService.java @@ -0,0 +1,7 @@ +package dev.sheldan.abstracto.core.service; + +import net.dv8tion.jda.api.entities.Emote; + +public interface EmoteService { + boolean isEmoteUsableByBot(Emote emote); +}