diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/AllowedMentionServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/AllowedMentionServiceBean.java index bf9175333..5c312cb55 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/AllowedMentionServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/AllowedMentionServiceBean.java @@ -10,10 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Optional; +import java.util.*; @Component @Slf4j @@ -37,7 +34,7 @@ public class AllowedMentionServiceBean implements AllowedMentionService { } @Override - public List getAllowedMentionTypesForServer(Long serverId) { + public Set getAllowedMentionTypesForServer(Long serverId) { AllowedMention allowedMention = getEffectiveAllowedMention(serverId); return mapAllowedMentionToMentionType(allowedMention); } @@ -79,12 +76,12 @@ public class AllowedMentionServiceBean implements AllowedMentionService { throw new UnknownMentionTypeException(); } - private List mapAllowedMentionToMentionType(AllowedMention allowedMention) { + private Set mapAllowedMentionToMentionType(AllowedMention allowedMention) { // if all are allowed, we dont want to restrict it if(allowedMention.allAllowed()) { return null; } - List types = new ArrayList<>(); + Set types = new HashSet<>(); if(allowedMention.getEveryone()) { types.add(Message.MentionType.EVERYONE); } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java index b035efbb4..9eb05bc73 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java @@ -6,6 +6,7 @@ import dev.sheldan.abstracto.core.metric.service.MetricService; import dev.sheldan.abstracto.core.metric.service.MetricTag; import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.templating.model.MessageConfig; import dev.sheldan.abstracto.core.templating.model.MessageToSend; import dev.sheldan.abstracto.core.templating.service.TemplateService; import dev.sheldan.abstracto.core.utils.FileService; @@ -22,10 +23,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.concurrent.CompletableFuture; import static dev.sheldan.abstracto.core.config.MetricConstants.DISCORD_API_INTERACTION_METRIC; @@ -126,21 +124,34 @@ public class ChannelServiceBean implements ChannelService { log.debug("Sending message {} from channel {} and server {} to channel {}.", message.getId(), message.getChannel().getId(), message.getGuild().getId(), channel.getId()); metricService.incrementCounter(MESSAGE_SEND_METRIC); - return channel.sendMessage(message).allowedMentions(getAllowedMentionsFor(channel)).submit(); + return channel.sendMessage(message).allowedMentions(getAllowedMentionsFor(channel, null)).submit(); } - private List getAllowedMentionsFor(MessageChannel channel) { + private Set getAllowedMentionsFor(MessageChannel channel, MessageToSend messageToSend) { + Set allowedMentions = new HashSet<>(); if(channel instanceof GuildChannel) { - return allowedMentionService.getAllowedMentionTypesForServer(((GuildChannel) channel).getGuild().getIdLong()); + allowedMentions.addAll(allowedMentionService.getAllowedMentionTypesForServer(((GuildChannel) channel).getGuild().getIdLong())); } - return null; + if(messageToSend != null && messageToSend.getMessageConfig() != null) { + MessageConfig messageConfig = messageToSend.getMessageConfig(); + if(messageConfig.isAllowsEveryoneMention()) { + allowedMentions.add(Message.MentionType.EVERYONE); + } + if(messageConfig.isAllowsUserMention()) { + allowedMentions.add(Message.MentionType.USER); + } + if(messageConfig.isAllowsRoleMention()) { + allowedMentions.add(Message.MentionType.ROLE); + } + } + return allowedMentions; } @Override public CompletableFuture sendTextToChannel(String text, MessageChannel channel) { log.debug("Sending text to channel {}.", channel.getId()); metricService.incrementCounter(MESSAGE_SEND_METRIC); - return channel.sendMessage(text).allowedMentions(getAllowedMentionsFor(channel)).submit(); + return channel.sendMessage(text).allowedMentions(getAllowedMentionsFor(channel, null)).submit(); } @Override @@ -169,7 +180,7 @@ public class ChannelServiceBean implements ChannelService { @Override public MessageAction sendEmbedToChannelInComplete(MessageEmbed embed, MessageChannel channel) { metricService.incrementCounter(MESSAGE_SEND_METRIC); - return channel.sendMessage(embed).allowedMentions(getAllowedMentionsFor(channel)); + return channel.sendMessage(embed).allowedMentions(getAllowedMentionsFor(channel, null)); } @Override @@ -232,7 +243,7 @@ public class ChannelServiceBean implements ChannelService { allMessageActions.add(textChannel.sendFile(messageToSend.getFileToSend())); } } - List allowedMentions = getAllowedMentionsFor(textChannel); + Set allowedMentions = getAllowedMentionsFor(textChannel, messageToSend); allMessageActions.forEach(messageAction -> futures.add(messageAction.allowedMentions(allowedMentions).submit()) ); 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 9dca73a11..ea58248a0 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 @@ -80,7 +80,8 @@ public class PostTargetServiceBean implements PostTargetService { } } - private PostTarget getPostTarget(PostTargetEnum postTargetName, Long serverId) { + @Override + public PostTarget getPostTarget(PostTargetEnum postTargetName, Long serverId) { PostTarget postTarget = postTargetManagement.getPostTarget(postTargetName.getKey(), serverId); if(postTarget != null) { return postTarget; diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/model/EmbedConfiguration.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/model/EmbedConfiguration.java index 29706479b..4f97d7cf3 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/model/EmbedConfiguration.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/model/EmbedConfiguration.java @@ -55,8 +55,5 @@ public class EmbedConfiguration { * The message which is posted along the {@link net.dv8tion.jda.api.entities.MessageEmbed} as a normal message. */ private String additionalMessage; - private Long additionalMessageLengthLimit; - private Long messageLimit; - - private boolean preventEmptyEmbed = false; + private MetaEmbedConfiguration metaConfig; } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/model/MetaEmbedConfiguration.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/model/MetaEmbedConfiguration.java new file mode 100644 index 000000000..6e1b7b166 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/model/MetaEmbedConfiguration.java @@ -0,0 +1,19 @@ +package dev.sheldan.abstracto.core.templating.model; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder +public class MetaEmbedConfiguration { + private Long additionalMessageLengthLimit; + private Long messageLimit; + + private boolean preventEmptyEmbed; + private boolean allowsRoleMention; + private boolean allowsEveryoneMention; + @Builder.Default + private boolean allowsUserMention = true; +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBean.java index 1c4f087d2..9e88a638a 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBean.java @@ -123,7 +123,10 @@ public class TemplateServiceBean implements TemplateService { List messages = new ArrayList<>(); String additionalMessage = embedConfiguration.getAdditionalMessage(); if(additionalMessage != null) { - Long segmentLimit = embedConfiguration.getAdditionalMessageLengthLimit() != null ? embedConfiguration.getAdditionalMessageLengthLimit() : Long.valueOf(Message.MAX_CONTENT_LENGTH); + Long segmentLimit = embedConfiguration.getMetaConfig() != null + && embedConfiguration.getMetaConfig().getAdditionalMessageLengthLimit() != null ? + embedConfiguration.getMetaConfig().getAdditionalMessageLengthLimit() : + Long.valueOf(Message.MAX_CONTENT_LENGTH); if(additionalMessage.length() > segmentLimit) { int segmentStart = 0; int segmentEnd = segmentLimit.intValue(); @@ -150,8 +153,8 @@ public class TemplateServiceBean implements TemplateService { if(serverContext.getServerId() != null) { messageLimit = Math.min(messageLimit, configService.getLongValueOrConfigDefault(CoreFeatureConfig.MAX_MESSAGES_KEY, serverContext.getServerId())); } - if(embedConfiguration.getMessageLimit() != null) { - messageLimit = Math.min(messageLimit, embedConfiguration.getMessageLimit()); + if(embedConfiguration.getMetaConfig() != null && embedConfiguration.getMetaConfig().getMessageLimit() != null) { + messageLimit = Math.min(messageLimit, embedConfiguration.getMetaConfig().getMessageLimit()); } if(embeds.size() > messageLimit) { log.info("Limiting size of embeds. Max allowed: {}, currently: {}.", messageLimit, embeds.size()); @@ -164,10 +167,23 @@ public class TemplateServiceBean implements TemplateService { return MessageToSend.builder() .embeds(embeds) + .messageConfig(createMessageConfig(embedConfiguration.getMetaConfig())) .messages(messages) .build(); } + private MessageConfig createMessageConfig(MetaEmbedConfiguration metaEmbedConfiguration) { + if(metaEmbedConfiguration == null) { + return null; + } + return MessageConfig + .builder() + .allowsEveryoneMention(metaEmbedConfiguration.isAllowsEveryoneMention()) + .allowsUserMention(metaEmbedConfiguration.isAllowsUserMention()) + .allowsRoleMention(metaEmbedConfiguration.isAllowsRoleMention()) + .build(); + } + private void setPagingFooters(List embedBuilders) { // the first footer comes from the configuration for (int i = 1; i < embedBuilders.size(); i++) { @@ -211,7 +227,7 @@ public class TemplateServiceBean implements TemplateService { } private boolean isEmptyEmbed(EmbedConfiguration configuration) { - if (configuration.isPreventEmptyEmbed()) { + if (configuration.getMetaConfig() != null && configuration.getMetaConfig().isPreventEmptyEmbed()) { return configuration.getFields() == null && configuration.getDescription() == null && configuration.getImageUrl() == null; } return false; diff --git a/abstracto-application/core/core-impl/src/main/resources/migrations/1.2.9-core/core-tables/command_disabled_channel_group.xml b/abstracto-application/core/core-impl/src/main/resources/migrations/1.2.9-core/core-tables/command_disabled_channel_group.xml index 88665c02d..377954a64 100644 --- a/abstracto-application/core/core-impl/src/main/resources/migrations/1.2.9-core/core-tables/command_disabled_channel_group.xml +++ b/abstracto-application/core/core-impl/src/main/resources/migrations/1.2.9-core/core-tables/command_disabled_channel_group.xml @@ -9,7 +9,7 @@ - + diff --git a/abstracto-application/core/core-impl/src/main/resources/migrations/1.2.9-core/core-tables/cool_down_channel_group.xml b/abstracto-application/core/core-impl/src/main/resources/migrations/1.2.9-core/core-tables/cool_down_channel_group.xml index 0ee676170..37e3110db 100644 --- a/abstracto-application/core/core-impl/src/main/resources/migrations/1.2.9-core/core-tables/cool_down_channel_group.xml +++ b/abstracto-application/core/core-impl/src/main/resources/migrations/1.2.9-core/core-tables/cool_down_channel_group.xml @@ -9,7 +9,7 @@ - + diff --git a/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/service/AllowedMentionServiceBeanTest.java b/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/service/AllowedMentionServiceBeanTest.java index 9049a92fe..18f5f9105 100644 --- a/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/service/AllowedMentionServiceBeanTest.java +++ b/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/service/AllowedMentionServiceBeanTest.java @@ -16,6 +16,7 @@ import org.mockito.junit.MockitoJUnitRunner; import java.util.List; import java.util.Optional; +import java.util.Set; import static org.mockito.Mockito.*; @@ -68,7 +69,7 @@ public class AllowedMentionServiceBeanTest { public void getAllowedMentionTypesForServerEmpty() { allDefaultConfigAllowed(); when(allowedMentionManagementService.getCustomAllowedMentionFor(SERVER_ID)).thenReturn(Optional.empty()); - List allowedMentions = testUnit.getAllowedMentionTypesForServer(SERVER_ID); + Set allowedMentions = testUnit.getAllowedMentionTypesForServer(SERVER_ID); Assert.assertNull(allowedMentions); } @@ -78,9 +79,9 @@ public class AllowedMentionServiceBeanTest { when(allowedMentionConfig.getRole()).thenReturn(false); when(allowedMentionConfig.getUser()).thenReturn(false); when(allowedMentionManagementService.getCustomAllowedMentionFor(SERVER_ID)).thenReturn(Optional.empty()); - List allowedMentions = testUnit.getAllowedMentionTypesForServer(SERVER_ID); + Set allowedMentions = testUnit.getAllowedMentionTypesForServer(SERVER_ID); Assert.assertEquals(1, allowedMentions.size()); - Assert.assertEquals(Message.MentionType.EVERYONE, allowedMentions.get(0)); + Assert.assertEquals(Message.MentionType.EVERYONE, allowedMentions.iterator().next()); } @Test @@ -89,7 +90,7 @@ public class AllowedMentionServiceBeanTest { when(allowedMentionConfig.getRole()).thenReturn(false); when(allowedMentionConfig.getUser()).thenReturn(false); when(allowedMentionManagementService.getCustomAllowedMentionFor(SERVER_ID)).thenReturn(Optional.empty()); - List allowedMentions = testUnit.getAllowedMentionTypesForServer(SERVER_ID); + Set allowedMentions = testUnit.getAllowedMentionTypesForServer(SERVER_ID); Assert.assertEquals(0, allowedMentions.size()); } diff --git a/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBeanTest.java b/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBeanTest.java index 33f013051..b9490eff7 100644 --- a/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBeanTest.java +++ b/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBeanTest.java @@ -99,9 +99,11 @@ public class TemplateServiceBeanTest { when(configService.getLongValueOrConfigDefault(CoreFeatureConfig.MAX_MESSAGES_KEY, SERVER_ID)).thenReturn(5L); String templateContent = String.format("{ \"additionalMessage\": \"%s\"}", additionalMessage); EmbedConfiguration config = Mockito.mock(EmbedConfiguration.class); - when(config.getAdditionalMessageLengthLimit()).thenReturn(2000L); + MetaEmbedConfiguration metaConfig = Mockito.mock(MetaEmbedConfiguration.class); + when(config.getMetaConfig()).thenReturn(metaConfig); + when(metaConfig.getAdditionalMessageLengthLimit()).thenReturn(2000L); when(config.getAdditionalMessage()).thenReturn(additionalMessage); - when(config.getMessageLimit()).thenReturn(5L); + when(metaConfig.getMessageLimit()).thenReturn(5L); when(configuration.getTemplate(getEmbedTemplateKey(), null, SERVER_ID, null, true, false)).thenReturn(new Template(getEmbedTemplateKey(), templateContent, getNonMockedConfiguration())); when(gson.fromJson(templateContent, EmbedConfiguration.class)).thenReturn(config); MessageToSend messageToSend = templateServiceBean.renderEmbedTemplate(TEMPLATE_KEY, new Object()); @@ -117,9 +119,11 @@ public class TemplateServiceBeanTest { when(configService.getLongValueOrConfigDefault(CoreFeatureConfig.MAX_MESSAGES_KEY, SERVER_ID)).thenReturn(5L); String templateContent = String.format("{ \"additionalMessage\": \"%s\", \"messageLimit\": 1}", additionalMessage); EmbedConfiguration config = Mockito.mock(EmbedConfiguration.class); - when(config.getAdditionalMessageLengthLimit()).thenReturn(2000L); + MetaEmbedConfiguration metaConfig = Mockito.mock(MetaEmbedConfiguration.class); + when(config.getMetaConfig()).thenReturn(metaConfig); + when(metaConfig.getAdditionalMessageLengthLimit()).thenReturn(2000L); when(config.getAdditionalMessage()).thenReturn(additionalMessage); - when(config.getMessageLimit()).thenReturn(1L); + when(metaConfig.getMessageLimit()).thenReturn(1L); when(configuration.getTemplate(getEmbedTemplateKey(), null, SERVER_ID, null, true, false)).thenReturn(new Template(getEmbedTemplateKey(), templateContent, getNonMockedConfiguration())); when(gson.fromJson(templateContent, EmbedConfiguration.class)).thenReturn(config); MessageToSend messageToSend = templateServiceBean.renderEmbedTemplate(TEMPLATE_KEY, new Object()); @@ -134,8 +138,10 @@ public class TemplateServiceBeanTest { when(configService.getLongValueOrConfigDefault(CoreFeatureConfig.MAX_MESSAGES_KEY, SERVER_ID)).thenReturn(5L); String templateContent = String.format("{ \"additionalMessage\": \"%s\"}", additionalMessage); EmbedConfiguration config = Mockito.mock(EmbedConfiguration.class); - when(config.getAdditionalMessageLengthLimit()).thenReturn(500L); - when(config.getMessageLimit()).thenReturn(5L); + MetaEmbedConfiguration metaConfig = Mockito.mock(MetaEmbedConfiguration.class); + when(config.getMetaConfig()).thenReturn(metaConfig); + when(metaConfig.getAdditionalMessageLengthLimit()).thenReturn(500L); + when(metaConfig.getMessageLimit()).thenReturn(5L); when(config.getAdditionalMessage()).thenReturn(additionalMessage); when(configuration.getTemplate(getEmbedTemplateKey(), null, SERVER_ID, null, true, false)).thenReturn(new Template(getEmbedTemplateKey(), templateContent, getNonMockedConfiguration())); when(gson.fromJson(templateContent, EmbedConfiguration.class)).thenReturn(config); diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/AllowedMentionService.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/AllowedMentionService.java index f755976da..f49446917 100644 --- a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/AllowedMentionService.java +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/AllowedMentionService.java @@ -3,11 +3,11 @@ package dev.sheldan.abstracto.core.service; import dev.sheldan.abstracto.core.models.database.AllowedMention; import net.dv8tion.jda.api.entities.Message; -import java.util.List; +import java.util.Set; public interface AllowedMentionService { boolean allMentionsAllowed(Long serverId); - List getAllowedMentionTypesForServer(Long serverId); + Set getAllowedMentionTypesForServer(Long serverId); void allowMentionForServer(Message.MentionType mentionType, Long serverId); void disAllowMentionForServer(Message.MentionType mentionType, Long serverId); AllowedMention getDefaultAllowedMention(); diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/PostTargetService.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/PostTargetService.java index 3c3c4d218..3befebb2e 100644 --- a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/PostTargetService.java +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/PostTargetService.java @@ -25,6 +25,7 @@ public interface PostTargetService { List> editOrCreatedInPostTarget(Long messageId, MessageToSend messageToSend, PostTargetEnum postTarget, Long serverId); void throwIfPostTargetIsNotDefined(PostTargetEnum name, Long serverId); boolean postTargetDefinedInServer(PostTargetEnum name, Long serverId); + PostTarget getPostTarget(PostTargetEnum postTargetName, Long serverId); boolean validPostTarget(String name); List getPostTargets(AServer server); List getAvailablePostTargets(); diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/templating/model/MessageConfig.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/templating/model/MessageConfig.java new file mode 100644 index 000000000..9acbcab82 --- /dev/null +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/templating/model/MessageConfig.java @@ -0,0 +1,15 @@ +package dev.sheldan.abstracto.core.templating.model; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder +public class MessageConfig { + private boolean allowsRoleMention; + private boolean allowsEveryoneMention; + @Builder.Default + private boolean allowsUserMention = true; +} diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/templating/model/MessageToSend.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/templating/model/MessageToSend.java index 6a610caee..2cc11d905 100644 --- a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/templating/model/MessageToSend.java +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/templating/model/MessageToSend.java @@ -29,6 +29,7 @@ public class MessageToSend { * The file handle to send attached to the message. */ private File fileToSend; + private MessageConfig messageConfig; public boolean hasFileToSend() { return fileToSend != null;