diff --git a/abstracto-application/abstracto-modules/anti-raid/anti-raid-impl/pom.xml b/abstracto-application/abstracto-modules/anti-raid/anti-raid-impl/pom.xml
index b7b7b287f..3b06c7ae8 100644
--- a/abstracto-application/abstracto-modules/anti-raid/anti-raid-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/anti-raid/anti-raid-impl/pom.xml
@@ -3,7 +3,7 @@
anti-raid
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/anti-raid/anti-raid-int/pom.xml b/abstracto-application/abstracto-modules/anti-raid/anti-raid-int/pom.xml
index 808382c47..52a375795 100644
--- a/abstracto-application/abstracto-modules/anti-raid/anti-raid-int/pom.xml
+++ b/abstracto-application/abstracto-modules/anti-raid/anti-raid-int/pom.xml
@@ -3,7 +3,7 @@
anti-raid
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/anti-raid/pom.xml b/abstracto-application/abstracto-modules/anti-raid/pom.xml
index 9271de7d2..c2f423efc 100644
--- a/abstracto-application/abstracto-modules/anti-raid/pom.xml
+++ b/abstracto-application/abstracto-modules/anti-raid/pom.xml
@@ -3,7 +3,7 @@
abstracto-modules
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/pom.xml b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/pom.xml
index 9f54dd3cb..0df40ed76 100644
--- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
assignable-roles
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/listener/AssignableRoleButtonClickedListener.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/listener/AssignableRoleButtonClickedListener.java
index 42e9cb780..11d38f043 100644
--- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/listener/AssignableRoleButtonClickedListener.java
+++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/listener/AssignableRoleButtonClickedListener.java
@@ -31,8 +31,8 @@ import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Role;
-import net.dv8tion.jda.api.events.interaction.ButtonClickEvent;
-import net.dv8tion.jda.api.interactions.components.ButtonInteraction;
+import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
+import net.dv8tion.jda.api.interactions.components.buttons.ButtonInteraction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@@ -74,7 +74,7 @@ public class AssignableRoleButtonClickedListener implements ButtonClickedListene
@Override
public ButtonClickedListenerResult execute(ButtonClickedListenerModel model) {
- ButtonClickEvent event = model.getEvent();
+ ButtonInteractionEvent event = model.getEvent();
Member member = event.getMember();
if(event.getGuild() != null && member != null) {
AssignableRolePlacePayload payload = (AssignableRolePlacePayload) model.getDeserializedPayload();
@@ -219,7 +219,7 @@ public class AssignableRoleButtonClickedListener implements ButtonClickedListene
@Override
public Boolean handlesEvent(ButtonClickedListenerModel model) {
- return AssignableRolePlaceServiceBean.ASSIGNABLE_ROLE_COMPONENT_ORIGIN.equals(model.getOrigin());
+ return AssignableRolePlaceServiceBean.ASSIGNABLE_ROLE_COMPONENT_ORIGIN.equals(model.getOrigin()) && model.getEvent().isFromGuild();
}
@Override
diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/service/AssignableRolePlaceServiceBean.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/service/AssignableRolePlaceServiceBean.java
index 5eb6ce592..81cbfd739 100644
--- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/service/AssignableRolePlaceServiceBean.java
+++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/service/AssignableRolePlaceServiceBean.java
@@ -24,7 +24,7 @@ import dev.sheldan.abstracto.core.templating.model.MessageToSend;
import dev.sheldan.abstracto.core.templating.service.TemplateService;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.*;
-import net.dv8tion.jda.api.interactions.components.ButtonStyle;
+import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -118,9 +118,9 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
throw new EmoteNotUsableException(fakeEmote.getEmote());
}
}
- Optional channelOptional = channelService.getTextChannelFromServerOptional(server.getId(), assignableRolePlace.getChannel().getId());
+ Optional channelOptional = channelService.getMessageChannelFromServerOptional(server.getId(), assignableRolePlace.getChannel().getId());
if (channelOptional.isPresent()) {
- TextChannel textChannel = channelOptional.get();
+ GuildMessageChannel textChannel = channelOptional.get();
String buttonId = componentService.generateComponentId();
String emoteMarkdown = fakeEmote != null ? fakeEmote.getEmoteRepr() : null;
if (assignableRolePlace.getMessageId() != null) {
@@ -223,7 +223,7 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
AssignablePostMessage model = prepareAssignablePostMessageModel(place);
MessageToSend messageToSend = templateService.renderEmbedTemplate(ASSIGNABLE_ROLES_POST_TEMPLATE_KEY, model, place.getServer().getId());
Long channelId = place.getChannel().getId();
- Optional channelOptional = channelService.getTextChannelFromServerOptional(place.getServer().getId(), channelId);
+ Optional channelOptional = channelService.getMessageChannelFromServerOptional(place.getServer().getId(), channelId);
if (channelOptional.isPresent()) {
log.info("Refreshing text for assignable role place {} in channel {} in post {}.", place.getId(), channelId, place.getMessageId());
return channelService.editEmbedMessageInAChannel(messageToSend.getEmbeds().get(0), channelOptional.get(), place.getMessageId()).thenCompose(message -> CompletableFuture.completedFuture(null));
@@ -435,7 +435,7 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
.build();
}
- private CompletableFuture sendAssignablePostMessage(AssignableRolePlace place, TextChannel channel) {
+ private CompletableFuture sendAssignablePostMessage(AssignableRolePlace place, GuildMessageChannel channel) {
AssignablePostMessage model = prepareAssignablePostMessageModel(place);
MessageToSend messageToSend = templateService.renderEmbedTemplate(ASSIGNABLE_ROLES_POST_TEMPLATE_KEY, model, place.getServer().getId());
log.info("Sending message for assignable role place {}.", place.getId());
@@ -501,9 +501,9 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
@Transactional
public CompletableFuture createAssignableRolePlacePost(Long serverId, Long assignablePlaceId) {
AssignableRolePlace assignableRolePlace = rolePlaceManagementService.findByPlaceId(assignablePlaceId);
- Optional channelOptional = channelService.getTextChannelFromServerOptional(serverId, assignableRolePlace.getChannel().getId());
+ Optional channelOptional = channelService.getMessageChannelFromServerOptional(serverId, assignableRolePlace.getChannel().getId());
if (channelOptional.isPresent()) {
- TextChannel channel = channelOptional.get();
+ GuildMessageChannel channel = channelOptional.get();
log.info("Sending assignable role place posts for place {} in channel {} in server {}.", assignableRolePlace.getId(), channel.getId(), serverId);
return sendAssignablePostMessage(assignableRolePlace, channel);
} else {
diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-int/pom.xml b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-int/pom.xml
index 5e0e4338a..cd448fb39 100644
--- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-int/pom.xml
+++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-int/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
assignable-roles
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
assignable-roles-int
diff --git a/abstracto-application/abstracto-modules/assignable-roles/pom.xml b/abstracto-application/abstracto-modules/assignable-roles/pom.xml
index 161ba7dbf..4aa2a0160 100644
--- a/abstracto-application/abstracto-modules/assignable-roles/pom.xml
+++ b/abstracto-application/abstracto-modules/assignable-roles/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
abstracto-modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/dynamic-activity/dynamic-activity-impl/pom.xml b/abstracto-application/abstracto-modules/dynamic-activity/dynamic-activity-impl/pom.xml
index eef963953..d5fa83702 100644
--- a/abstracto-application/abstracto-modules/dynamic-activity/dynamic-activity-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/dynamic-activity/dynamic-activity-impl/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
dynamic-activity
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/dynamic-activity/dynamic-activity-int/pom.xml b/abstracto-application/abstracto-modules/dynamic-activity/dynamic-activity-int/pom.xml
index 88f53c337..538658dee 100644
--- a/abstracto-application/abstracto-modules/dynamic-activity/dynamic-activity-int/pom.xml
+++ b/abstracto-application/abstracto-modules/dynamic-activity/dynamic-activity-int/pom.xml
@@ -3,7 +3,7 @@
dynamic-activity
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/dynamic-activity/pom.xml b/abstracto-application/abstracto-modules/dynamic-activity/pom.xml
index 6c81499de..767c97078 100644
--- a/abstracto-application/abstracto-modules/dynamic-activity/pom.xml
+++ b/abstracto-application/abstracto-modules/dynamic-activity/pom.xml
@@ -3,7 +3,7 @@
abstracto-modules
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/entertainment/entertainment-impl/pom.xml b/abstracto-application/abstracto-modules/entertainment/entertainment-impl/pom.xml
index 2305c2686..b8e42c944 100644
--- a/abstracto-application/abstracto-modules/entertainment/entertainment-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/entertainment/entertainment-impl/pom.xml
@@ -3,7 +3,7 @@
entertainment
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/entertainment/entertainment-int/pom.xml b/abstracto-application/abstracto-modules/entertainment/entertainment-int/pom.xml
index be272dd03..5c59644dc 100644
--- a/abstracto-application/abstracto-modules/entertainment/entertainment-int/pom.xml
+++ b/abstracto-application/abstracto-modules/entertainment/entertainment-int/pom.xml
@@ -3,7 +3,7 @@
entertainment
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/entertainment/pom.xml b/abstracto-application/abstracto-modules/entertainment/pom.xml
index 8a88f2c6b..ed6608a6a 100644
--- a/abstracto-application/abstracto-modules/entertainment/pom.xml
+++ b/abstracto-application/abstracto-modules/entertainment/pom.xml
@@ -3,7 +3,7 @@
abstracto-modules
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/pom.xml b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/pom.xml
index 509e908ac..f7f4931ec 100644
--- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
experience-tracking
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/pom.xml b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/pom.xml
index 099fa4ea4..8476cf29a 100644
--- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/pom.xml
+++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-int/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
experience-tracking
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/experience-tracking/pom.xml b/abstracto-application/abstracto-modules/experience-tracking/pom.xml
index b8e330d89..cc33aea73 100644
--- a/abstracto-application/abstracto-modules/experience-tracking/pom.xml
+++ b/abstracto-application/abstracto-modules/experience-tracking/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
abstracto-modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/invite-filter/invite-filter-impl/pom.xml b/abstracto-application/abstracto-modules/invite-filter/invite-filter-impl/pom.xml
index 9b294d762..818fed729 100644
--- a/abstracto-application/abstracto-modules/invite-filter/invite-filter-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/invite-filter/invite-filter-impl/pom.xml
@@ -3,7 +3,7 @@
invite-filter
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/invite-filter/invite-filter-int/pom.xml b/abstracto-application/abstracto-modules/invite-filter/invite-filter-int/pom.xml
index 0045d5f14..c5212eadd 100644
--- a/abstracto-application/abstracto-modules/invite-filter/invite-filter-int/pom.xml
+++ b/abstracto-application/abstracto-modules/invite-filter/invite-filter-int/pom.xml
@@ -3,7 +3,7 @@
invite-filter
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/invite-filter/pom.xml b/abstracto-application/abstracto-modules/invite-filter/pom.xml
index f063ded55..b2aea699c 100644
--- a/abstracto-application/abstracto-modules/invite-filter/pom.xml
+++ b/abstracto-application/abstracto-modules/invite-filter/pom.xml
@@ -3,7 +3,7 @@
abstracto-modules
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/pom.xml b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/pom.xml
index 25ceb6dd5..883868084 100644
--- a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/pom.xml
@@ -3,7 +3,7 @@
link-embed
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/listener/MessageEmbedDeleteButtonClickedListener.java b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/listener/MessageEmbedDeleteButtonClickedListener.java
index dc3d159ec..423394564 100644
--- a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/listener/MessageEmbedDeleteButtonClickedListener.java
+++ b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/listener/MessageEmbedDeleteButtonClickedListener.java
@@ -16,7 +16,7 @@ import dev.sheldan.abstracto.linkembed.service.MessageEmbedMetricService;
import dev.sheldan.abstracto.linkembed.service.MessageEmbedServiceBean;
import dev.sheldan.abstracto.linkembed.service.management.MessageEmbedPostManagementService;
import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.events.interaction.ButtonClickEvent;
+import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@@ -51,7 +51,7 @@ public class MessageEmbedDeleteButtonClickedListener implements ButtonClickedLis
@Override
public ButtonClickedListenerResult execute(ButtonClickedListenerModel model) {
- ButtonClickEvent event = model.getEvent();
+ ButtonInteractionEvent event = model.getEvent();
MessageEmbedDeleteButtonPayload payload = (MessageEmbedDeleteButtonPayload) model.getDeserializedPayload();
Long clickingUserId = event.getInteraction().getUser().getIdLong();
boolean embeddedUserRemoves = clickingUserId.equals(payload.getEmbeddedUserId());
@@ -77,7 +77,7 @@ public class MessageEmbedDeleteButtonClickedListener implements ButtonClickedLis
@Override
public Boolean handlesEvent(ButtonClickedListenerModel model) {
- return MessageEmbedServiceBean.MESSAGE_EMBED_DELETE_ORIGIN.equals(model.getOrigin());
+ return MessageEmbedServiceBean.MESSAGE_EMBED_DELETE_ORIGIN.equals(model.getOrigin()) && model.getEvent().isFromGuild();
}
@Override
diff --git a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/listener/MessageEmbedListener.java b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/listener/MessageEmbedListener.java
index 38b21aaeb..4510f9430 100644
--- a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/listener/MessageEmbedListener.java
+++ b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/listener/MessageEmbedListener.java
@@ -7,6 +7,7 @@ import dev.sheldan.abstracto.core.listener.sync.jda.MessageReceivedListener;
import dev.sheldan.abstracto.core.metric.service.CounterMetric;
import dev.sheldan.abstracto.core.metric.service.MetricService;
import dev.sheldan.abstracto.core.metric.service.MetricTag;
+import dev.sheldan.abstracto.core.models.GuildMemberMessageChannel;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.models.listener.MessageReceivedModel;
import dev.sheldan.abstracto.core.service.MessageCache;
@@ -97,9 +98,16 @@ public class MessageEmbedListener implements MessageReceivedListener {
@Transactional
public void embedSingleLink(Message message, Long cause, CachedMessage cachedMessage) {
+ GuildMemberMessageChannel context = GuildMemberMessageChannel
+ .builder()
+ .guildChannel(message.getGuildChannel())
+ .member(message.getMember())
+ .guild(message.getGuild())
+ .message(message)
+ .build();
log.info("Embedding link to message {} in channel {} in server {} to channel {} and server {}.",
cachedMessage.getMessageId(), cachedMessage.getChannelId(), cachedMessage.getServerId(), message.getChannel().getId(), message.getGuild().getId());
- messageEmbedService.embedLink(cachedMessage, message.getTextChannel(), cause , message).thenAccept(unused ->
+ messageEmbedService.embedLink(cachedMessage, message.getGuildChannel(), cause , context).thenAccept(unused ->
metricService.incrementCounter(MESSAGE_EMBED_CREATED)
).exceptionally(throwable -> {
log.error("Failed to embed link towards message {} in channel {} in sever {} linked from message {} in channel {} in server {}.", cachedMessage.getMessageId(), cachedMessage.getChannelId(), cachedMessage.getServerId(),
diff --git a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/listener/interaction/MessageEmbedContextCommandListener.java b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/listener/interaction/MessageEmbedContextCommandListener.java
new file mode 100644
index 000000000..76a2adf8c
--- /dev/null
+++ b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/listener/interaction/MessageEmbedContextCommandListener.java
@@ -0,0 +1,83 @@
+package dev.sheldan.abstracto.linkembed.listener.interaction;
+
+import dev.sheldan.abstracto.core.config.FeatureDefinition;
+import dev.sheldan.abstracto.core.interaction.MessageContextConfig;
+import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
+import dev.sheldan.abstracto.core.listener.async.MessageContextCommandListener;
+import dev.sheldan.abstracto.core.models.GuildMemberMessageChannel;
+import dev.sheldan.abstracto.core.models.cache.CachedMessage;
+import dev.sheldan.abstracto.core.models.listener.interaction.MessageContextInteractionModel;
+import dev.sheldan.abstracto.core.service.MessageCache;
+import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
+import dev.sheldan.abstracto.linkembed.config.LinkEmbedFeatureDefinition;
+import dev.sheldan.abstracto.linkembed.service.MessageEmbedService;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.entities.Message;
+import net.dv8tion.jda.api.events.interaction.command.MessageContextInteractionEvent;
+import net.dv8tion.jda.api.interactions.commands.Command;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+@Component
+@Slf4j
+public class MessageEmbedContextCommandListener implements MessageContextCommandListener {
+
+ @Autowired
+ private MessageCache messageCache;
+
+ @Autowired
+ private MessageEmbedService messageEmbedService;
+
+ @Autowired
+ private UserInServerManagementService userInServerManagementService;
+
+ @Autowired
+ private MessageEmbedContextCommandListener self;
+
+ @Override
+ public DefaultListenerResult execute(MessageContextInteractionModel model) {
+ MessageContextInteractionEvent event = model.getEvent();
+ event.deferReply().queue();
+ Message targetMessage = event.getInteraction().getTarget();
+ Member actor = model.getEvent().getMember();
+
+ messageCache.getMessageFromCache(targetMessage)
+ .thenAccept(cachedMessage -> self.embedMessage(model, actor, cachedMessage));
+ return DefaultListenerResult.PROCESSED;
+ }
+
+ @Transactional
+ public void embedMessage(MessageContextInteractionModel model, Member actor, CachedMessage cachedMessage) {
+ Long userEmbeddingUserInServerId = userInServerManagementService.loadOrCreateUser(actor).getUserInServerId();
+ GuildMemberMessageChannel context = GuildMemberMessageChannel
+ .builder()
+ .message(null)
+ .guild(actor.getGuild())
+ .member(actor)
+ .guildChannel(model.getEvent().getGuildChannel())
+ .build();
+ messageEmbedService.embedLink(cachedMessage, model.getEvent().getGuildChannel(), userEmbeddingUserInServerId, context, model.getEvent().getInteraction());
+ }
+
+ @Override
+ public FeatureDefinition getFeature() {
+ return LinkEmbedFeatureDefinition.LINK_EMBEDS;
+ }
+
+ @Override
+ public MessageContextConfig getConfig() {
+ return MessageContextConfig
+ .builder()
+ .name("Embed message")
+ .build();
+ }
+
+ @Override
+ public Boolean handlesEvent(MessageContextInteractionModel model) {
+ return model.getEvent().getName().equals(getConfig().getName())
+ && model.getEvent().isFromGuild()
+ && model.getEvent().getCommandType().equals(Command.Type.MESSAGE);
+ }
+}
diff --git a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBean.java b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBean.java
index e5beae121..679c972ab 100644
--- a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBean.java
+++ b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBean.java
@@ -1,5 +1,7 @@
package dev.sheldan.abstracto.linkembed.service;
+import dev.sheldan.abstracto.core.interaction.InteractionService;
+import dev.sheldan.abstracto.core.models.GuildMemberMessageChannel;
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.models.database.AServer;
@@ -22,9 +24,11 @@ import dev.sheldan.abstracto.linkembed.model.MessageEmbedLink;
import dev.sheldan.abstracto.linkembed.model.database.EmbeddedMessage;
import dev.sheldan.abstracto.linkembed.service.management.MessageEmbedPostManagementService;
import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.entities.GuildMessageChannel;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.interactions.commands.CommandInteraction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@@ -48,18 +52,12 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
public static final String MESSAGE_EMBED_TEMPLATE = "message_embed";
public static final String REMOVAL_EMOTE = "removeEmbed";
- @Autowired
- private ChannelManagementService channelManagementService;
-
@Autowired
private ServerManagementService serverManagementService;
@Autowired
private UserInServerManagementService userInServerManagementService;
- @Autowired
- private MemberService memberService;
-
@Autowired
private UserService userService;
@@ -84,15 +82,15 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
@Autowired
private MessageService messageService;
- @Autowired
- private EmoteService emoteService;
-
@Autowired
private ComponentService componentServiceBean;
@Autowired
private FeatureModeService featureModeService;
+ @Autowired
+ private InteractionService interactionService;
+
@Autowired
private ComponentPayloadManagementService componentPayloadManagementService;
@@ -126,10 +124,10 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
}
@Override
- public void embedLinks(List linksToEmbed, TextChannel target, Long userEmbeddingUserInServerId, Message embeddingMessage) {
+ public void embedLinks(List linksToEmbed, GuildMessageChannel target, Long userEmbeddingUserInServerId, GuildMemberMessageChannel executionContext) {
linksToEmbed.forEach(messageEmbedLink ->
messageCache.getMessageFromCache(messageEmbedLink.getServerId(), messageEmbedLink.getChannelId(), messageEmbedLink.getMessageId())
- .thenAccept(cachedMessage -> self.embedLink(cachedMessage, target, userEmbeddingUserInServerId, embeddingMessage)
+ .thenAccept(cachedMessage -> self.embedLink(cachedMessage, target, userEmbeddingUserInServerId, executionContext)
).exceptionally(throwable -> {
log.error("Message embedding from cache failed for message {}.", messageEmbedLink.getMessageId(), throwable);
return null;
@@ -139,13 +137,21 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
@Override
@Transactional
- public CompletableFuture embedLink(CachedMessage cachedMessage, TextChannel target, Long userEmbeddingUserInServerId, Message embeddingMessage) {
+ public CompletableFuture embedLink(CachedMessage cachedMessage, GuildMessageChannel target, Long userEmbeddingUserInServerId, GuildMemberMessageChannel executionContext) {
boolean deletionButtonEnabled = featureModeService.featureModeActive(LinkEmbedFeatureDefinition.LINK_EMBEDS, target.getGuild(), LinkEmbedFeatureMode.DELETE_BUTTON);
- return buildTemplateParameter(embeddingMessage, cachedMessage, deletionButtonEnabled).thenCompose(messageEmbeddedModel ->
+ return buildTemplateParameter(executionContext, cachedMessage, deletionButtonEnabled).thenCompose(messageEmbeddedModel ->
self.sendEmbeddingMessage(cachedMessage, target, userEmbeddingUserInServerId, messageEmbeddedModel, deletionButtonEnabled)
);
}
+ @Override
+ public CompletableFuture embedLink(CachedMessage cachedMessage, GuildMessageChannel target, Long userEmbeddingUserInServerId, GuildMemberMessageChannel executionContext, CommandInteraction interaction) {
+ boolean deletionButtonEnabled = featureModeService.featureModeActive(LinkEmbedFeatureDefinition.LINK_EMBEDS, target.getGuild(), LinkEmbedFeatureMode.DELETE_BUTTON);
+ return buildTemplateParameter(executionContext, cachedMessage, deletionButtonEnabled).thenCompose(messageEmbeddedModel ->
+ self.sendEmbeddingMessageToInteraction(cachedMessage, target, userEmbeddingUserInServerId, messageEmbeddedModel, deletionButtonEnabled, interaction)
+ );
+ }
+
@Override
public CompletableFuture cleanUpOldMessageEmbeds() {
Instant oldestDate = Instant.now().truncatedTo(ChronoUnit.DAYS).minus(embedRemovalDays, ChronoUnit.DAYS);
@@ -243,11 +249,15 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
}
@Transactional
- public CompletableFuture sendEmbeddingMessage(CachedMessage cachedMessage, TextChannel target,
+ public CompletableFuture sendEmbeddingMessage(CachedMessage cachedMessage, GuildMessageChannel target,
Long userEmbeddingUserInServerId, MessageEmbeddedModel messageEmbeddedModel, Boolean deletionButtonEnabled) {
MessageToSend embed = templateService.renderEmbedTemplate(MESSAGE_EMBED_TEMPLATE, messageEmbeddedModel, target.getGuild().getIdLong());
- AUserInAServer cause = userInServerManagementService.loadOrCreateUser(userEmbeddingUserInServerId);
List> completableFutures = channelService.sendMessageToSendToChannel(embed, target);
+ return postProcessLinkEmbed(cachedMessage, userEmbeddingUserInServerId, messageEmbeddedModel, deletionButtonEnabled, completableFutures);
+ }
+
+ private CompletableFuture postProcessLinkEmbed(CachedMessage cachedMessage, Long userEmbeddingUserInServerId, MessageEmbeddedModel messageEmbeddedModel, Boolean deletionButtonEnabled, List> completableFutures) {
+ AUserInAServer cause = userInServerManagementService.loadOrCreateUser(userEmbeddingUserInServerId);
Long embeddingUserId = cause.getUserReference().getId();
log.debug("Embedding message {} from channel {} from server {}, because of user {}", cachedMessage.getMessageId(),
cachedMessage.getChannelId(), cachedMessage.getServerId(), embeddingUserId);
@@ -257,6 +267,14 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
});
}
+ @Transactional
+ public CompletableFuture sendEmbeddingMessageToInteraction(CachedMessage cachedMessage, GuildMessageChannel target,
+ Long userEmbeddingUserInServerId, MessageEmbeddedModel messageEmbeddedModel, Boolean deletionButtonEnabled, CommandInteraction interaction) {
+ MessageToSend embed = templateService.renderEmbedTemplate(MESSAGE_EMBED_TEMPLATE, messageEmbeddedModel, target.getGuild().getIdLong());
+ List> completableFutures = interactionService.sendMessageToInteraction(embed, interaction.getHook());
+ return postProcessLinkEmbed(cachedMessage, userEmbeddingUserInServerId, messageEmbeddedModel, deletionButtonEnabled, completableFutures);
+ }
+
@Transactional
public CompletableFuture addDeletionPossibility(CachedMessage cachedMessage, MessageEmbeddedModel messageEmbeddedModel,
Message createdMessage, Long embeddingUserId, Boolean deletionButtonEnabled) {
@@ -299,34 +317,37 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
messageEmbedPostManagementService.createMessageEmbed(cachedMessage, createdMessage, innerCause, deletionButtonId);
}
- private CompletableFuture buildTemplateParameter(Message message, CachedMessage embeddedMessage, Boolean deletionButtonEnabled) {
+ private CompletableFuture buildTemplateParameter(GuildMemberMessageChannel executionContext, CachedMessage embeddedMessage, Boolean deletionButtonEnabled) {
return userService.retrieveUserForId(embeddedMessage.getAuthor().getAuthorId()).thenApply(authorUser ->
- self.loadMessageEmbedModel(message, embeddedMessage, authorUser, deletionButtonEnabled)
+ self.loadMessageEmbedModel(executionContext, embeddedMessage, authorUser, deletionButtonEnabled)
).exceptionally(throwable -> {
log.warn("Failed to retrieve author for user {}.", embeddedMessage.getAuthor().getAuthorId(), throwable);
- return self.loadMessageEmbedModel(message, embeddedMessage, null, deletionButtonEnabled);
+ return self.loadMessageEmbedModel(executionContext, embeddedMessage, null, deletionButtonEnabled);
});
}
@Transactional
- public MessageEmbeddedModel loadMessageEmbedModel(Message message, CachedMessage embeddedMessage, User userAuthor, Boolean deletionButtonEnabled) {
- Optional textChannelFromServer = channelService.getTextChannelFromServerOptional(embeddedMessage.getServerId(), embeddedMessage.getChannelId());
- TextChannel sourceChannel = textChannelFromServer.orElse(null);
+ public MessageEmbeddedModel loadMessageEmbedModel(GuildMemberMessageChannel executionContext, CachedMessage embeddedMessage, User userAuthor, Boolean deletionButtonEnabled) {
+ Optional textChannelFromServer = channelService.getMessageChannelFromServerOptional(embeddedMessage.getServerId(), embeddedMessage.getChannelId());
+ GuildMessageChannel sourceChannel = textChannelFromServer.orElse(null);
ButtonConfigModel buttonConfigModel = ButtonConfigModel
.builder()
.buttonId(deletionButtonEnabled ? componentServiceBean.generateComponentId() : null)
.build();
-
- Long referencedMessageId = message.getReferencedMessage() != null ? message.getReferencedMessage().getIdLong() : null;
- Boolean shouldMentionReferencedAuthor = shouldMentionReferencedAuthor(message);
+ Long referencedMessageId = null;
+ Boolean shouldMentionReferencedAuthor = false;
+ if(executionContext.getMessage() != null) {
+ referencedMessageId = executionContext.getMessage().getReferencedMessage() != null ? executionContext.getMessage().getReferencedMessage().getIdLong() : null;
+ shouldMentionReferencedAuthor = shouldMentionReferencedAuthor(executionContext.getMessage());
+ }
return MessageEmbeddedModel
.builder()
- .member(message.getMember())
+ .member(executionContext.getMember())
.author(userAuthor)
.sourceChannel(sourceChannel)
- .embeddingUser(message.getMember())
- .messageChannel(message.getChannel())
- .guild(message.getGuild())
+ .embeddingUser(executionContext.getMember())
+ .messageChannel(executionContext.getGuildChannel())
+ .guild(executionContext.getGuild())
.useButton(deletionButtonEnabled)
.embeddedMessage(embeddedMessage)
.referencedMessageId(referencedMessageId)
diff --git a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/test/java/dev/sheldan/abstracto/linkembed/listener/MessageEmbedListenerTest.java b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/test/java/dev/sheldan/abstracto/linkembed/listener/MessageEmbedListenerTest.java
index 480ba378f..02e7d4721 100644
--- a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/test/java/dev/sheldan/abstracto/linkembed/listener/MessageEmbedListenerTest.java
+++ b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/test/java/dev/sheldan/abstracto/linkembed/listener/MessageEmbedListenerTest.java
@@ -1,6 +1,7 @@
package dev.sheldan.abstracto.linkembed.listener;
import dev.sheldan.abstracto.core.metric.service.MetricService;
+import dev.sheldan.abstracto.core.models.GuildMemberMessageChannel;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.models.listener.MessageReceivedModel;
@@ -49,11 +50,14 @@ public class MessageEmbedListenerTest {
@Mock
private MessageEmbedListener self;
+ @Mock
+ private GuildMemberMessageChannel context;
+
@Mock
private Message message;
@Mock
- private TextChannel textChannel;
+ private GuildMessageChannel textChannel;
@Mock
private MessageReceivedModel model;
@@ -71,8 +75,8 @@ public class MessageEmbedListenerTest {
@Before
public void setup(){
when(guild.getIdLong()).thenReturn(FIRST_SERVER_ID);
- when(message.getGuild()).thenReturn(guild);
- when(message.getChannel()).thenReturn(textChannel);
+ when(context.getGuild()).thenReturn(guild);
+ when(context.getGuildChannel()).thenReturn(textChannel);
}
@Test
@@ -82,7 +86,6 @@ public class MessageEmbedListenerTest {
setupMessageConfig();
List foundMessageLinks = new ArrayList<>();
when(messageEmbedService.getLinksInMessage(text)).thenReturn(foundMessageLinks);
- when(model.getMessage()).thenReturn(message);
testUnit.execute(model);
verify(messageService, times(0)).deleteMessage(message);
}
@@ -124,7 +127,7 @@ public class MessageEmbedListenerTest {
when(foundLink.getServerId()).thenReturn(SECOND_SERVER_ID);
List foundMessageLinks = Arrays.asList(foundLink);
Member author = Mockito.mock(Member.class);
- when(message.getMember()).thenReturn(author);
+ when(context.getMember()).thenReturn(author);
when(userInServerManagementService.loadOrCreateUser(author)).thenReturn(userInAServer);
when(messageEmbedService.getLinksInMessage(text)).thenReturn(foundMessageLinks);
when(model.getMessage()).thenReturn(message);
@@ -153,8 +156,8 @@ public class MessageEmbedListenerTest {
when(message.getContentRaw()).thenReturn(completeMessage);
setupMessageConfig();
Member author = Mockito.mock(Member.class);
- when(message.getMember()).thenReturn(author);
- when(message.getGuild()).thenReturn(guild);
+ when(context.getMember()).thenReturn(author);
+ when(context.getGuild()).thenReturn(guild);
when(guild.getIdLong()).thenReturn(FIRST_SERVER_ID);
when(userInServerManagementService.loadOrCreateUser(author)).thenReturn(embeddingUser);
CachedMessage cachedMessage = Mockito.mock(CachedMessage.class);
@@ -185,7 +188,7 @@ public class MessageEmbedListenerTest {
when(message.getContentRaw()).thenReturn(text);
setupMessageConfig();
Member author = Mockito.mock(Member.class);
- when(message.getMember()).thenReturn(author);
+ when(context.getMember()).thenReturn(author);
when(userInServerManagementService.loadOrCreateUser(author)).thenReturn(userInAServer);
CachedMessage cachedMessage = Mockito.mock(CachedMessage.class);
CachedMessage secondCachedMessage = Mockito.mock(CachedMessage.class);
@@ -203,8 +206,8 @@ public class MessageEmbedListenerTest {
public void testLoadUserAndEmbed() {
CachedMessage cachedMessage = Mockito.mock(CachedMessage.class);
long userId = 3L;
- when(message.getTextChannel()).thenReturn(textChannel);
- when(messageEmbedService.embedLink(cachedMessage, textChannel, userId, message)).thenReturn(CompletableFuture.completedFuture(null));
+ when(context.getGuildChannel()).thenReturn(textChannel);
+ when(messageEmbedService.embedLink(cachedMessage, textChannel, userId, context)).thenReturn(CompletableFuture.completedFuture(null));
testUnit.embedSingleLink(message, userId, cachedMessage);
verify(metricService, times(1)).incrementCounter(any());
}
@@ -220,7 +223,7 @@ public class MessageEmbedListenerTest {
when(foundLink.getChannelId()).thenReturn(FIRST_CHANNEL_ID);
List foundMessageLinks = Arrays.asList(foundLink);
Member author = Mockito.mock(Member.class);
- when(message.getMember()).thenReturn(author);
+ when(context.getMember()).thenReturn(author);
when(userInServerManagementService.loadOrCreateUser(author)).thenReturn(userInAServer);
CachedMessage cachedMessage = Mockito.mock(CachedMessage.class);
when(messageCache.getMessageFromCache(FIRST_SERVER_ID, FIRST_CHANNEL_ID, FIRST_MESSAGE_ID)).thenReturn(CompletableFuture.completedFuture(cachedMessage));
diff --git a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/test/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBeanTest.java b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/test/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBeanTest.java
index a279ff0a4..e779d94e6 100644
--- a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/test/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBeanTest.java
+++ b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/test/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBeanTest.java
@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.linkembed.service;
+import dev.sheldan.abstracto.core.models.GuildMemberMessageChannel;
import dev.sheldan.abstracto.core.models.cache.CachedAuthor;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.models.database.AUser;
@@ -73,10 +74,13 @@ public class MessageEmbedServiceBeanTest {
private FeatureModeService featureModeService;
@Mock
- private TextChannel textChannel;
+ private GuildMessageChannel textChannel;
@Mock
- private Message embeddingMessage;
+ private GuildMemberMessageChannel embeddingMessage;
+
+ @Mock
+ private Message message;
@Mock
private Guild guild;
@@ -176,7 +180,7 @@ public class MessageEmbedServiceBeanTest {
when(messageCache.getMessageFromCache(SERVER_ID,channelId, firstMessageId)).thenReturn(CompletableFuture.completedFuture(firstCachedMessage));
Long embeddingUserId = 5L;
testUnit.embedLinks(linksToEmbed, textChannel, embeddingUserId, embeddingMessage);
- verify( self, times(1)).embedLink(eq(firstCachedMessage), eq(textChannel), eq(embeddingUserId) , eq(embeddingMessage));
+ verify( self, times(1)).embedLink(firstCachedMessage, textChannel, embeddingUserId, embeddingMessage);
}
@Test
@@ -258,17 +262,17 @@ public class MessageEmbedServiceBeanTest {
@Test
public void testLoadUserAndPersistMessage() {
when(userInServerManagementService.loadOrCreateUser(EMBEDDING_USER_IN_SERVER_ID)).thenReturn(embeddingUser);
- testUnit.loadUserAndPersistMessage(cachedMessage, EMBEDDING_USER_IN_SERVER_ID, embeddingMessage, null);
- verify(messageEmbedPostManagementService, times(1)).createMessageEmbed(cachedMessage, embeddingMessage, embeddingUser, null);
+ testUnit.loadUserAndPersistMessage(cachedMessage, EMBEDDING_USER_IN_SERVER_ID, message, null);
+ verify(messageEmbedPostManagementService, times(1)).createMessageEmbed(cachedMessage, message, embeddingUser, null);
}
@Test
public void testLoadMessageEmbedModel() {
when(cachedMessage.getServerId()).thenReturn(SERVER_ID);
when(cachedMessage.getChannelId()).thenReturn(CHANNEL_ID);
- when(channelService.getTextChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.of(textChannel));
+ when(channelService.getMessageChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.of(textChannel));
when(embeddingMessage.getGuild()).thenReturn(guild);
- when(embeddingMessage.getChannel()).thenReturn(textChannel);
+ when(embeddingMessage.getGuildChannel()).thenReturn(textChannel);
when(embeddingMessage.getMember()).thenReturn(embeddingMember);
MessageEmbeddedModel createdModel = testUnit.loadMessageEmbedModel(embeddingMessage, cachedMessage, embeddedUser, false);
Assert.assertEquals(textChannel, createdModel.getSourceChannel());
diff --git a/abstracto-application/abstracto-modules/link-embed/link-embed-int/pom.xml b/abstracto-application/abstracto-modules/link-embed/link-embed-int/pom.xml
index 4ad059e75..5151342fc 100644
--- a/abstracto-application/abstracto-modules/link-embed/link-embed-int/pom.xml
+++ b/abstracto-application/abstracto-modules/link-embed/link-embed-int/pom.xml
@@ -3,7 +3,7 @@
link-embed
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/link-embed/link-embed-int/src/main/java/dev/sheldan/abstracto/linkembed/model/template/MessageEmbeddedModel.java b/abstracto-application/abstracto-modules/link-embed/link-embed-int/src/main/java/dev/sheldan/abstracto/linkembed/model/template/MessageEmbeddedModel.java
index 2821919ec..fabcf3a78 100644
--- a/abstracto-application/abstracto-modules/link-embed/link-embed-int/src/main/java/dev/sheldan/abstracto/linkembed/model/template/MessageEmbeddedModel.java
+++ b/abstracto-application/abstracto-modules/link-embed/link-embed-int/src/main/java/dev/sheldan/abstracto/linkembed/model/template/MessageEmbeddedModel.java
@@ -6,8 +6,8 @@ import dev.sheldan.abstracto.core.models.template.button.ButtonConfigModel;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
+import net.dv8tion.jda.api.entities.GuildMessageChannel;
import net.dv8tion.jda.api.entities.Member;
-import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.entities.User;
@Getter
@@ -16,7 +16,7 @@ import net.dv8tion.jda.api.entities.User;
public class MessageEmbeddedModel extends UserInitiatedServerContext {
private CachedMessage embeddedMessage;
private User author;
- private TextChannel sourceChannel;
+ private GuildMessageChannel sourceChannel;
private Member embeddingUser;
private ButtonConfigModel buttonConfigModel;
private Long referencedMessageId;
diff --git a/abstracto-application/abstracto-modules/link-embed/link-embed-int/src/main/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedService.java b/abstracto-application/abstracto-modules/link-embed/link-embed-int/src/main/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedService.java
index 6eb6bbcc4..3760bd613 100644
--- a/abstracto-application/abstracto-modules/link-embed/link-embed-int/src/main/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedService.java
+++ b/abstracto-application/abstracto-modules/link-embed/link-embed-int/src/main/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedService.java
@@ -1,16 +1,18 @@
package dev.sheldan.abstracto.linkembed.service;
+import dev.sheldan.abstracto.core.models.GuildMemberMessageChannel;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.linkembed.model.MessageEmbedLink;
-import net.dv8tion.jda.api.entities.Message;
-import net.dv8tion.jda.api.entities.TextChannel;
+import net.dv8tion.jda.api.entities.GuildMessageChannel;
+import net.dv8tion.jda.api.interactions.commands.CommandInteraction;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public interface MessageEmbedService {
List getLinksInMessage(String message);
- void embedLinks(List linksToEmbed, TextChannel target, Long userEmbeddingUserInServerId, Message embeddingMessage);
- CompletableFuture embedLink(CachedMessage cachedMessage, TextChannel target, Long userEmbeddingUserInServerId, Message embeddingMessage);
+ void embedLinks(List linksToEmbed, GuildMessageChannel target, Long userEmbeddingUserInServerId, GuildMemberMessageChannel executionContext);
+ CompletableFuture embedLink(CachedMessage cachedMessage, GuildMessageChannel target, Long userEmbeddingUserInServerId, GuildMemberMessageChannel executionContext);
+ CompletableFuture embedLink(CachedMessage cachedMessage, GuildMessageChannel target, Long userEmbeddingUserInServerId, GuildMemberMessageChannel executionContext, CommandInteraction interaction);
CompletableFuture cleanUpOldMessageEmbeds();
}
diff --git a/abstracto-application/abstracto-modules/link-embed/pom.xml b/abstracto-application/abstracto-modules/link-embed/pom.xml
index 07a93f56b..fc4eec15d 100644
--- a/abstracto-application/abstracto-modules/link-embed/pom.xml
+++ b/abstracto-application/abstracto-modules/link-embed/pom.xml
@@ -3,7 +3,7 @@
abstracto-modules
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/logging/logging-impl/pom.xml b/abstracto-application/abstracto-modules/logging/logging-impl/pom.xml
index 4fbbd5223..6a0bcb14a 100644
--- a/abstracto-application/abstracto-modules/logging/logging-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/logging/logging-impl/pom.xml
@@ -3,7 +3,7 @@
logging
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/logging/logging-impl/src/main/java/dev/sheldan/abstracto/logging/listener/MessageDeleteLogListener.java b/abstracto-application/abstracto-modules/logging/logging-impl/src/main/java/dev/sheldan/abstracto/logging/listener/MessageDeleteLogListener.java
index 9fdc01a8c..faf62cc7b 100644
--- a/abstracto-application/abstracto-modules/logging/logging-impl/src/main/java/dev/sheldan/abstracto/logging/listener/MessageDeleteLogListener.java
+++ b/abstracto-application/abstracto-modules/logging/logging-impl/src/main/java/dev/sheldan/abstracto/logging/listener/MessageDeleteLogListener.java
@@ -20,6 +20,7 @@ import dev.sheldan.abstracto.logging.config.LoggingPostTarget;
import dev.sheldan.abstracto.logging.model.template.MessageDeletedAttachmentLog;
import dev.sheldan.abstracto.logging.model.template.MessageDeletedLog;
import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.entities.GuildMessageChannel;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.beans.factory.annotation.Autowired;
@@ -76,7 +77,7 @@ public class MessageDeleteLogListener implements AsyncMessageDeletedListener {
public void executeListener(CachedMessage messageFromCache, Member authorMember) {
log.debug("Message {} in channel {} in guild {} was deleted.", messageFromCache.getMessageId(), messageFromCache.getChannelId(), messageFromCache.getServerId());
- TextChannel textChannel = channelService.getTextChannelFromServer(messageFromCache.getServerId(), messageFromCache.getChannelId());
+ GuildMessageChannel textChannel = channelService.getMessageChannelFromServer(messageFromCache.getServerId(), messageFromCache.getChannelId());
MessageDeletedLog logModel = MessageDeletedLog
.builder()
.cachedMessage(messageFromCache)
diff --git a/abstracto-application/abstracto-modules/logging/logging-impl/src/main/java/dev/sheldan/abstracto/logging/listener/MessageEditedListener.java b/abstracto-application/abstracto-modules/logging/logging-impl/src/main/java/dev/sheldan/abstracto/logging/listener/MessageEditedListener.java
index e518ed0c7..92a345a94 100644
--- a/abstracto-application/abstracto-modules/logging/logging-impl/src/main/java/dev/sheldan/abstracto/logging/listener/MessageEditedListener.java
+++ b/abstracto-application/abstracto-modules/logging/logging-impl/src/main/java/dev/sheldan/abstracto/logging/listener/MessageEditedListener.java
@@ -17,6 +17,7 @@ import dev.sheldan.abstracto.logging.config.LoggingPostTarget;
import dev.sheldan.abstracto.logging.model.template.MessageDeletedAttachmentLog;
import dev.sheldan.abstracto.logging.model.template.MessageEditedLog;
import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.entities.GuildMessageChannel;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.beans.factory.annotation.Autowired;
@@ -56,7 +57,7 @@ public class MessageEditedListener implements AsyncMessageUpdatedListener {
return DefaultListenerResult.IGNORED;
}
log.debug("Message {} in channel {} in guild {} was edited.", messageBefore.getMessageId(), messageBefore.getChannelId(), model.getServerId());
- TextChannel textChannel = channelService.getTextChannelFromServer(model.getServerId(), messageBefore.getChannelId());
+ GuildMessageChannel textChannel = channelService.getMessageChannelFromServer(model.getServerId(), messageBefore.getChannelId());
MessageEditedLog lodModel = MessageEditedLog
.builder()
.messageAfter(messageAfter)
diff --git a/abstracto-application/abstracto-modules/logging/logging-impl/src/test/java/dev/sheldan/abstracto/logging/listener/MessageDeleteLogListenerTest.java b/abstracto-application/abstracto-modules/logging/logging-impl/src/test/java/dev/sheldan/abstracto/logging/listener/MessageDeleteLogListenerTest.java
index 0117e30ec..12c729493 100644
--- a/abstracto-application/abstracto-modules/logging/logging-impl/src/test/java/dev/sheldan/abstracto/logging/listener/MessageDeleteLogListenerTest.java
+++ b/abstracto-application/abstracto-modules/logging/logging-impl/src/test/java/dev/sheldan/abstracto/logging/listener/MessageDeleteLogListenerTest.java
@@ -108,7 +108,7 @@ public class MessageDeleteLogListenerTest {
MessageToSend messageToSend = Mockito.mock(MessageToSend.class);
when(member.getGuild()).thenReturn(guild);
when(templateService.renderEmbedTemplate(eq(MessageDeleteLogListener.MESSAGE_DELETED_TEMPLATE), captor.capture(), eq(SERVER_ID))).thenReturn(messageToSend);
- when(channelService.getTextChannelFromServer(SERVER_ID, CHANNEL_ID)).thenReturn(textChannel);
+ when(channelService.getMessageChannelFromServer(SERVER_ID, CHANNEL_ID)).thenReturn(textChannel);
testUnit.executeListener(deletedMessage, member);
verify(postTargetService, times(1)).sendEmbedInPostTarget(messageToSend, LoggingPostTarget.DELETE_LOG, SERVER_ID);
MessageDeletedLog messageDeletedLog = captor.getValue();
@@ -123,7 +123,7 @@ public class MessageDeleteLogListenerTest {
String attachmentUrl = "url";
when(deletedMessage.getServerId()).thenReturn(SERVER_ID);
when(deletedMessage.getChannelId()).thenReturn(CHANNEL_ID);
- when(channelService.getTextChannelFromServer(SERVER_ID, CHANNEL_ID)).thenReturn(textChannel);
+ when(channelService.getMessageChannelFromServer(SERVER_ID, CHANNEL_ID)).thenReturn(textChannel);
CachedAttachment cachedAttachment = Mockito.mock(CachedAttachment.class);
when(cachedAttachment.getProxyUrl()).thenReturn(attachmentUrl);
List attachmentList = Arrays.asList(cachedAttachment);
@@ -147,7 +147,7 @@ public class MessageDeleteLogListenerTest {
public void testExecuteListenerWithTwoAttachment() {
when(deletedMessage.getServerId()).thenReturn(SERVER_ID);
when(deletedMessage.getChannelId()).thenReturn(CHANNEL_ID);
- when(channelService.getTextChannelFromServer(SERVER_ID, CHANNEL_ID)).thenReturn(textChannel);
+ when(channelService.getMessageChannelFromServer(SERVER_ID, CHANNEL_ID)).thenReturn(textChannel);
String attachmentUrl = "url";
String secondAttachmentUrl = "url2";
CachedAttachment cachedAttachment = Mockito.mock(CachedAttachment.class);
diff --git a/abstracto-application/abstracto-modules/logging/logging-impl/src/test/java/dev/sheldan/abstracto/logging/listener/MessageEditedListenerTest.java b/abstracto-application/abstracto-modules/logging/logging-impl/src/test/java/dev/sheldan/abstracto/logging/listener/MessageEditedListenerTest.java
index 1f280bce8..8356f5461 100644
--- a/abstracto-application/abstracto-modules/logging/logging-impl/src/test/java/dev/sheldan/abstracto/logging/listener/MessageEditedListenerTest.java
+++ b/abstracto-application/abstracto-modules/logging/logging-impl/src/test/java/dev/sheldan/abstracto/logging/listener/MessageEditedListenerTest.java
@@ -79,7 +79,7 @@ public class MessageEditedListenerTest {
MessageToSend messageToSend = Mockito.mock(MessageToSend.class);
ArgumentCaptor captor = ArgumentCaptor.forClass(MessageEditedLog.class);
when(templateService.renderEmbedTemplate(eq(MessageEditedListener.MESSAGE_EDITED_TEMPLATE), captor.capture(), eq(SERVER_ID))).thenReturn(messageToSend);
- when(channelService.getTextChannelFromServer(SERVER_ID, CHANNEL_ID)).thenReturn(channel);
+ when(channelService.getMessageChannelFromServer(SERVER_ID, CHANNEL_ID)).thenReturn(channel);
when(model.getAfter()).thenReturn(messageAfter);
when(model.getBefore()).thenReturn(messageBefore);
when(messageAfter.getMember()).thenReturn(author);
diff --git a/abstracto-application/abstracto-modules/logging/logging-int/pom.xml b/abstracto-application/abstracto-modules/logging/logging-int/pom.xml
index 9a2085482..8269ac97a 100644
--- a/abstracto-application/abstracto-modules/logging/logging-int/pom.xml
+++ b/abstracto-application/abstracto-modules/logging/logging-int/pom.xml
@@ -3,7 +3,7 @@
logging
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/logging/logging-int/src/main/java/dev/sheldan/abstracto/logging/model/template/MessageDeletedAttachmentLog.java b/abstracto-application/abstracto-modules/logging/logging-int/src/main/java/dev/sheldan/abstracto/logging/model/template/MessageDeletedAttachmentLog.java
index 608a92a3d..5059fd02e 100644
--- a/abstracto-application/abstracto-modules/logging/logging-int/src/main/java/dev/sheldan/abstracto/logging/model/template/MessageDeletedAttachmentLog.java
+++ b/abstracto-application/abstracto-modules/logging/logging-int/src/main/java/dev/sheldan/abstracto/logging/model/template/MessageDeletedAttachmentLog.java
@@ -1,7 +1,9 @@
package dev.sheldan.abstracto.logging.model.template;
import dev.sheldan.abstracto.core.models.context.SlimUserInitiatedServerContext;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
@@ -12,6 +14,8 @@ import lombok.experimental.SuperBuilder;
@Getter
@Setter
@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
public class MessageDeletedAttachmentLog extends SlimUserInitiatedServerContext {
/**
* The proxy URL to the attachment which was deleted.
diff --git a/abstracto-application/abstracto-modules/logging/logging-int/src/main/java/dev/sheldan/abstracto/logging/model/template/MessageDeletedLog.java b/abstracto-application/abstracto-modules/logging/logging-int/src/main/java/dev/sheldan/abstracto/logging/model/template/MessageDeletedLog.java
index cce7c46cb..0d2e32bc4 100644
--- a/abstracto-application/abstracto-modules/logging/logging-int/src/main/java/dev/sheldan/abstracto/logging/model/template/MessageDeletedLog.java
+++ b/abstracto-application/abstracto-modules/logging/logging-int/src/main/java/dev/sheldan/abstracto/logging/model/template/MessageDeletedLog.java
@@ -2,7 +2,9 @@ package dev.sheldan.abstracto.logging.model.template;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.models.context.SlimUserInitiatedServerContext;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
@@ -12,6 +14,8 @@ import lombok.experimental.SuperBuilder;
@Getter
@Setter
@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
public class MessageDeletedLog extends SlimUserInitiatedServerContext {
/**
* A {@link CachedMessage} representing the deleted message
diff --git a/abstracto-application/abstracto-modules/logging/pom.xml b/abstracto-application/abstracto-modules/logging/pom.xml
index 43c7db8e3..b7c0b32dd 100644
--- a/abstracto-application/abstracto-modules/logging/pom.xml
+++ b/abstracto-application/abstracto-modules/logging/pom.xml
@@ -3,7 +3,7 @@
abstracto-modules
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/pom.xml b/abstracto-application/abstracto-modules/moderation/moderation-impl/pom.xml
index a8f2b46ac..415e4e8de 100644
--- a/abstracto-application/abstracto-modules/moderation/moderation-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
moderation
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/SlowMode.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/SlowMode.java
index 016e78bcb..5d2d8fefb 100644
--- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/SlowMode.java
+++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/SlowMode.java
@@ -43,7 +43,11 @@ public class SlowMode extends AbstractConditionableCommand {
throw new EntityGuildMismatchException();
}
} else {
- channel = commandContext.getChannel();
+ if(commandContext.getChannel() instanceof TextChannel) {
+ channel = (TextChannel) commandContext.getChannel();
+ } else {
+ throw new IllegalArgumentException("Not a text channel.");
+ }
}
return slowModeService.setSlowMode(channel, duration)
.thenApply(aVoid -> CommandResult.fromSuccess());
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 b06563c96..873ec4a54 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
@@ -28,10 +28,7 @@ import dev.sheldan.abstracto.scheduling.service.SchedulerService;
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
import dev.sheldan.abstracto.core.templating.service.TemplateService;
import lombok.extern.slf4j.Slf4j;
-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 net.dv8tion.jda.api.entities.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@@ -159,7 +156,7 @@ public class MuteServiceBean implements MuteService {
String muteNotificationMessage = templateService.renderTemplate(MUTE_NOTIFICATION_TEMPLATE, muteNotification, message.getServerId());
CompletableFuture messageCompletableFuture = messageService.sendMessageToUser(memberBeingMuted.getUser(), muteNotificationMessage);
messageCompletableFuture.exceptionally(throwable -> {
- TextChannel feedBackChannel = channelService.getTextChannelFromServer(message.getServerId(), message.getChannelId());
+ GuildMessageChannel feedBackChannel = channelService.getMessageChannelFromServer(message.getServerId(), message.getChannelId());
channelService.sendTextToChannel(throwable.getMessage(), feedBackChannel).whenComplete((exceptionMessage, innerThrowable) -> {
notificationFuture.complete(null);
log.info("Successfully notified user {} in server {} about mute.", memberBeingMuted.getId(), memberBeingMuted.getGuild().getId());
diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/PurgeServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/PurgeServiceBean.java
index 633c1aef1..097089a5b 100644
--- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/PurgeServiceBean.java
+++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/PurgeServiceBean.java
@@ -9,10 +9,7 @@ import dev.sheldan.abstracto.moderation.model.template.command.PurgeStatusUpdate
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
import dev.sheldan.abstracto.core.templating.service.TemplateService;
import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.entities.Member;
-import net.dv8tion.jda.api.entities.Message;
-import net.dv8tion.jda.api.entities.MessageHistory;
-import net.dv8tion.jda.api.entities.TextChannel;
+import net.dv8tion.jda.api.entities.*;
import net.dv8tion.jda.api.utils.MiscUtil;
import net.dv8tion.jda.api.utils.TimeUtil;
import org.springframework.beans.factory.annotation.Autowired;
@@ -51,11 +48,11 @@ public class PurgeServiceBean implements PurgeService {
.build();
@Override
- public CompletableFuture purgeMessagesInChannel(Integer amountToDelete, TextChannel channel, Long startId, Member purgedMember) {
+ public CompletableFuture purgeMessagesInChannel(Integer amountToDelete, GuildMessageChannel channel, Long startId, Member purgedMember) {
return purgeMessages(amountToDelete, channel, startId, purgedMember, amountToDelete, 0, 0L);
}
- private CompletableFuture purgeMessages(Integer amountToDelete, TextChannel channel, Long startId, Member purgedMember, Integer totalCount, Integer currentCount, Long statusMessageId) {
+ private CompletableFuture purgeMessages(Integer amountToDelete, GuildMessageChannel channel, Long startId, Member purgedMember, Integer totalCount, Integer currentCount, Long statusMessageId) {
int toDeleteInThisIteration;
if(amountToDelete >= PURGE_MAX_MESSAGES){
@@ -106,9 +103,12 @@ public class PurgeServiceBean implements PurgeService {
return CompletableFuture.allOf(retrievalFuture, deletionFuture);
}
- private void bulkDeleteMessages(TextChannel channel, CompletableFuture deletionFuture, List messagesToDeleteNow, Consumer consumer) {
+ private void bulkDeleteMessages(GuildMessageChannel channel, CompletableFuture deletionFuture, List messagesToDeleteNow, Consumer consumer) {
try {
- channelService.deleteMessagesInChannel(channel, messagesToDeleteNow).queue(consumer, deletionFuture::completeExceptionally);
+ channelService.deleteMessagesInChannel(channel, messagesToDeleteNow).thenAccept(consumer).exceptionally(throwable -> {
+ deletionFuture.completeExceptionally(throwable);
+ return null;
+ });
} catch (IllegalArgumentException e) {
channelService.sendTextToChannel(e.getMessage(), channel);
log.warn("Failed to bulk delete, message was most likely too old to delete by bulk.", e);
@@ -116,7 +116,7 @@ public class PurgeServiceBean implements PurgeService {
}
}
- private CompletableFuture getOrCreatedStatusMessage(TextChannel channel, Integer totalCount, Long statusMessageId) {
+ private CompletableFuture getOrCreatedStatusMessage(GuildMessageChannel channel, Integer totalCount, Long statusMessageId) {
CompletableFuture statusMessageFuture;
if(statusMessageId == 0) {
log.debug("Creating new status message in channel {} in server {} because of puring.", channel.getIdLong(), channel.getGuild().getId());
@@ -151,7 +151,7 @@ public class PurgeServiceBean implements PurgeService {
return messagesToDeleteNow;
}
- private Consumer deletionConsumer(Integer amountToDelete, TextChannel channel, Member purgedMember, Integer totalCount, Integer currentCount, CompletableFuture deletionFuture, Long currentStatusMessageId, Message earliestMessage) {
+ private Consumer deletionConsumer(Integer amountToDelete, GuildMessageChannel channel, Member purgedMember, Integer totalCount, Integer currentCount, CompletableFuture deletionFuture, Long currentStatusMessageId, Message earliestMessage) {
return aVoid -> {
if (amountToDelete >= 1) {
log.debug("Still more than 1 message to delete. Continuing.");
@@ -181,7 +181,7 @@ public class PurgeServiceBean implements PurgeService {
}
@Override
- public CompletableFuture purgeMessagesInChannel(Integer count, TextChannel channel, Message origin, Member purgingRestriction) {
+ public CompletableFuture purgeMessagesInChannel(Integer count, GuildMessageChannel channel, Message origin, Member purgingRestriction) {
return purgeMessagesInChannel(count, channel, origin.getIdLong(), purgingRestriction);
}
diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/ReactionReportServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/ReactionReportServiceBean.java
index 660e1de91..e3ad630bf 100644
--- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/ReactionReportServiceBean.java
+++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/ReactionReportServiceBean.java
@@ -17,6 +17,7 @@ import dev.sheldan.abstracto.moderation.model.template.listener.ReportReactionNo
import dev.sheldan.abstracto.moderation.service.management.ModerationUserManagementService;
import dev.sheldan.abstracto.moderation.service.management.ReactionReportManagementService;
import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.entities.GuildMessageChannel;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.beans.factory.annotation.Autowired;
@@ -92,7 +93,7 @@ public class ReactionReportServiceBean implements ReactionReportService {
ReactionReport report = recentReportOptional.get();
log.info("Report is already present in channel {} with message {}. Updating field.", report.getReportChannel().getId(), report.getReportMessageId());
report.setReportCount(report.getReportCount() + 1);
- TextChannel reportTextChannel = channelService.getTextChannelFromServer(serverId, report.getReportChannel().getId());
+ GuildMessageChannel reportTextChannel = channelService.getMessageChannelFromServer(serverId, report.getReportChannel().getId());
return channelService.editFieldValueInMessage(reportTextChannel, report.getReportMessageId(), 0, report.getReportCount().toString())
.thenAccept(message -> self.updateModerationUserReportCooldown(reporter));
}
diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBean.java
index c65ef0462..dad60000b 100644
--- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBean.java
+++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBean.java
@@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.exception.ChannelNotInGuildException;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.service.ChannelService;
import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.entities.GuildMessageChannel;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/ReactionReportManagementServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/ReactionReportManagementServiceBean.java
index 105f73aeb..08c3f9291 100644
--- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/ReactionReportManagementServiceBean.java
+++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/ReactionReportManagementServiceBean.java
@@ -35,7 +35,7 @@ public class ReactionReportManagementServiceBean implements ReactionReportManage
@Override
public ReactionReport createReactionReport(CachedMessage reportedMessage, Message reportMessage) {
- AChannel reportChannel = channelManagementService.loadChannel(reportMessage.getTextChannel());
+ AChannel reportChannel = channelManagementService.loadChannel(reportMessage.getChannel());
AChannel reportedChannel = channelManagementService.loadChannel(reportedMessage.getChannelId());
AUserInAServer reportedUser = userInServerManagementService.loadOrCreateUser(reportedMessage.getAuthorAsServerUser());
ReactionReport report = ReactionReport
diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/command/SlowModeTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/command/SlowModeTest.java
index 81675e664..219ad312e 100644
--- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/command/SlowModeTest.java
+++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/command/SlowModeTest.java
@@ -32,7 +32,7 @@ public class SlowModeTest {
public void testExecuteSlowModeWithDurationCurrentChannel() {
String duration = "1m";
CommandContext parameters = CommandTestUtilities.getWithParameters(Arrays.asList(duration));
- when(slowModeService.setSlowMode(parameters.getChannel(), Duration.ofMinutes(1))).thenReturn(CompletableFuture.completedFuture(null));
+ when(slowModeService.setSlowMode((TextChannel) parameters.getChannel(), Duration.ofMinutes(1))).thenReturn(CompletableFuture.completedFuture(null));
CompletableFuture result = testUnit.executeAsync(parameters);
CommandTestUtilities.checkSuccessfulCompletionAsync(result);
}
@@ -41,7 +41,7 @@ public class SlowModeTest {
public void testDisableSlowModeCurrentChannel() {
String duration = "off";
CommandContext parameters = CommandTestUtilities.getWithParameters(Arrays.asList(duration));
- when(slowModeService.setSlowMode(parameters.getChannel(), Duration.ZERO)).thenReturn(CompletableFuture.completedFuture(null));
+ when(slowModeService.setSlowMode((TextChannel) parameters.getChannel(), Duration.ZERO)).thenReturn(CompletableFuture.completedFuture(null));
CompletableFuture result = testUnit.executeAsync(parameters);
CommandTestUtilities.checkSuccessfulCompletionAsync(result);
}
diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/PurgeServiceBeanTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/PurgeServiceBeanTest.java
deleted file mode 100644
index 0dd5eb6e5..000000000
--- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/PurgeServiceBeanTest.java
+++ /dev/null
@@ -1,300 +0,0 @@
-package dev.sheldan.abstracto.moderation.service;
-
-import dev.sheldan.abstracto.core.metric.service.MetricService;
-import dev.sheldan.abstracto.core.service.ChannelService;
-import dev.sheldan.abstracto.core.service.MessageService;
-import dev.sheldan.abstracto.moderation.exception.NoMessageFoundException;
-import dev.sheldan.abstracto.moderation.model.template.command.PurgeStatusUpdateModel;
-import dev.sheldan.abstracto.core.templating.model.MessageToSend;
-import dev.sheldan.abstracto.core.templating.service.TemplateService;
-import net.dv8tion.jda.api.entities.*;
-import net.dv8tion.jda.api.requests.RestAction;
-import net.dv8tion.jda.api.requests.restaction.AuditableRestAction;
-import net.dv8tion.jda.api.utils.TimeUtil;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.junit.MockitoJUnitRunner;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Consumer;
-
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class PurgeServiceBeanTest {
-
- @InjectMocks
- private PurgeServiceBean testUnit;
-
- @Mock
- private ChannelService channelService;
-
- @Mock
- private MessageService messageService;
-
- @Mock
- private TemplateService templateService;
-
- @Mock
- private MetricService metricService;
-
- @Mock
- private TextChannel textChannel;
-
- @Mock
- private Member purgedMember;
-
- private static final Long START_MESSAGE_ID = 4L;
- private static final Long STATUS_MESSAGE_ID = 7L;
- private static final Long AUTHOR_ID = 17L;
-
- @Mock
- private User messageAuthor;
-
- @Mock
- private Message firstMessage;
-
- @Mock
- private Message secondMessage;
-
- @Mock
- private Message thirdMessage;
-
- @Mock
- private Message fourthMessage;
-
- @Mock
- private MessageHistory history;
-
- @Mock
- private MessageToSend firstStatusUpdateMessage;
-
- @Mock
- private RestAction deleteMessagesAction;
-
- @Mock
- private AuditableRestAction deleteStatusAction;
-
- @Mock
- private Guild guild;
-
- private static final Long SERVER_ID = 1L;
-
- @Before
- public void setup() {
- when(textChannel.getGuild()).thenReturn(guild);
- when(guild.getId()).thenReturn(SERVER_ID.toString());
- when(guild.getIdLong()).thenReturn(SERVER_ID);
- }
-
- @Test
- public void testPurgeMessageViaStartMessage() {
- Integer amountToDelete = 50;
- when(channelService.getHistoryOfChannel(textChannel, START_MESSAGE_ID, amountToDelete)).thenReturn(CompletableFuture.completedFuture(history));
-
- setupOneMessageBatch(getDeletableMessageId(), getDeletableMessageId());
-
- Message messageToStartOffAT = Mockito.mock(Message.class);
- when(messageToStartOffAT.getIdLong()).thenReturn(START_MESSAGE_ID);
- CompletableFuture futures = testUnit.purgeMessagesInChannel(amountToDelete, textChannel, messageToStartOffAT, purgedMember);
- futures.whenComplete((aVoid, throwable) -> Assert.assertNull(throwable));
- verify(deleteStatusAction, times(1)).queueAfter(5, TimeUnit.SECONDS);
- verify(messageService, times(1)).updateStatusMessage(eq(textChannel), anyLong(), any());
- verify(metricService, times(1)).incrementCounter(any(), eq((long) amountToDelete));
- }
-
- @Test
- public void testPurgeMessageNotNoUser() {
- Integer amountToDelete = 50;
- when(channelService.getHistoryOfChannel(textChannel, START_MESSAGE_ID, amountToDelete)).thenReturn(CompletableFuture.completedFuture(history));
-
- when(firstMessage.getId()).thenReturn(getDeletableMessageId().toString());
- when(secondMessage.getId()).thenReturn(getDeletableMessageId().toString());
-
- setupFirstMessageHistoryMocks();
- setupStatusMessageMocks();
- mockQueueDoubleVoidConsumer(deleteMessagesAction);
- CompletableFuture futures = testUnit.purgeMessagesInChannel(amountToDelete, textChannel, START_MESSAGE_ID, null);
- futures.whenComplete((aVoid, throwable) -> Assert.assertNull(throwable));
- verify(deleteStatusAction, times(1)).queueAfter(5, TimeUnit.SECONDS);
- verify(messageService, times(1)).updateStatusMessage(eq(textChannel), anyLong(), any());
- verify(metricService, times(1)).incrementCounter(any(), eq((long) amountToDelete));
- }
-
- @Test
- public void testPurgeSingleMessage() {
- Integer amountToDelete = 50;
- when(channelService.getHistoryOfChannel(textChannel, START_MESSAGE_ID, amountToDelete)).thenReturn(CompletableFuture.completedFuture(history));
-
- when(firstMessage.getId()).thenReturn(getDeletableMessageId().toString());
- when(firstMessage.getAuthor()).thenReturn(messageAuthor);
- setupMembersWithAuthorId();
-
- List messagesToDelete = Arrays.asList(firstMessage);
- when(history.getRetrievedHistory()).thenReturn(messagesToDelete);
- setupStatusMessageMocks();
- AuditableRestAction auditableRestAction = Mockito.mock(AuditableRestAction.class);
- when(messageService.deleteMessageWithAction(firstMessage)).thenReturn(auditableRestAction);
- mockQueueDoubleVoidConsumer(auditableRestAction);
- CompletableFuture futures = testUnit.purgeMessagesInChannel(amountToDelete, textChannel, START_MESSAGE_ID, purgedMember);
- futures.whenComplete((aVoid, throwable) -> Assert.assertNull(throwable));
- verify(deleteStatusAction, times(1)).queueAfter(5, TimeUnit.SECONDS);
- verify(messageService, times(1)).updateStatusMessage(eq(textChannel), anyLong(), any());
- verify(metricService, times(1)).incrementCounter(any(), eq((long) amountToDelete));
- }
-
- @Test
- public void testPurgeMessagesInTwoIterationsSecondIterationsTooOld() {
- Integer amountToDelete = 150;
- Long latestDeletedMessageId = getDeletableMessageId();
- when(channelService.getHistoryOfChannel(textChannel, START_MESSAGE_ID, amountToDelete - 50)).thenReturn(CompletableFuture.completedFuture(history));
-
- MessageHistory secondHistory = Mockito.mock(MessageHistory.class);
- when(channelService.getHistoryOfChannel(textChannel, latestDeletedMessageId, 50)).thenReturn(CompletableFuture.completedFuture(secondHistory));
-
- when(secondMessage.getIdLong()).thenReturn(latestDeletedMessageId);
- when(thirdMessage.getId()).thenReturn(getNotDeletableMessageId().toString());
- when(fourthMessage.getId()).thenReturn(getNotDeletableMessageId().toString());
-
- setupOneMessageBatch(getDeletableMessageId(), latestDeletedMessageId);
-
- List secondMessagesToDelete = Arrays.asList(thirdMessage, fourthMessage);
- when(secondHistory.getRetrievedHistory()).thenReturn(secondMessagesToDelete);
-
-
- CompletableFuture futures = testUnit.purgeMessagesInChannel(amountToDelete, textChannel, START_MESSAGE_ID, purgedMember);
- futures.whenComplete((aVoid, throwable) -> Assert.assertTrue(throwable.getCause() instanceof NoMessageFoundException));
- verify(deleteStatusAction, times(1)).queueAfter(5, TimeUnit.SECONDS);
- verify(messageService, times(1)).updateStatusMessage(eq(textChannel), anyLong(), any());
- ArgumentCaptor deleted = ArgumentCaptor.forClass(Long.class);
- verify(metricService, times(2)).incrementCounter(any(), deleted.capture());
- List capturedValues = deleted.getAllValues();
- Assert.assertEquals(2, capturedValues.size());
- Assert.assertEquals(100, capturedValues.get(0).longValue());
- Assert.assertEquals(50, capturedValues.get(1).longValue());
- }
-
-
- @Test
- public void testPurgeMessagesInTwoIterations() {
- Integer amountToDelete = 150;
- Long latestDeletedMessageId = getDeletableMessageId();
- when(channelService.getHistoryOfChannel(textChannel, START_MESSAGE_ID, amountToDelete - 50)).thenReturn(CompletableFuture.completedFuture(history));
- MessageHistory secondHistory = Mockito.mock(MessageHistory.class);
- when(channelService.getHistoryOfChannel(textChannel, latestDeletedMessageId, 50)).thenReturn(CompletableFuture.completedFuture(secondHistory));
-
- when(secondMessage.getIdLong()).thenReturn(latestDeletedMessageId);
-
- setupOneMessageBatch(getDeletableMessageId(), latestDeletedMessageId);
-
- setupFirstMessages(thirdMessage, getDeletableMessageId(), fourthMessage, latestDeletedMessageId, messageAuthor);
-
- RestAction secondDeleteMessagesAction = Mockito.mock(RestAction.class);
- List secondMessagesToDelete = Arrays.asList(thirdMessage, fourthMessage);
- when(secondHistory.getRetrievedHistory()).thenReturn(secondMessagesToDelete);
- when(channelService.deleteMessagesInChannel(textChannel, secondMessagesToDelete)).thenReturn(secondDeleteMessagesAction);
-
-
- mockQueueDoubleVoidConsumer(secondDeleteMessagesAction);
- CompletableFuture futures = testUnit.purgeMessagesInChannel(amountToDelete, textChannel, START_MESSAGE_ID, purgedMember);
- futures.whenComplete((aVoid, throwable) -> Assert.assertNull(throwable));
- verify(deleteStatusAction, times(1)).queueAfter(5, TimeUnit.SECONDS);
- verify(messageService, times(2)).updateStatusMessage(eq(textChannel), anyLong(), any());
- ArgumentCaptor deleted = ArgumentCaptor.forClass(Long.class);
- verify(metricService, times(2)).incrementCounter(any(), deleted.capture());
- List capturedValues = deleted.getAllValues();
- Assert.assertEquals(2, capturedValues.size());
- Assert.assertEquals(100, capturedValues.get(0).longValue());
- Assert.assertEquals(50, capturedValues.get(1).longValue());
- }
-
- @Test
- public void testPurgeMessagesInOneIteration() {
- Integer amountToDelete = 50;
- when(channelService.getHistoryOfChannel(textChannel, START_MESSAGE_ID, amountToDelete)).thenReturn(CompletableFuture.completedFuture(history));
-
- setupOneMessageBatch(getDeletableMessageId(), getDeletableMessageId());
-
- CompletableFuture futures = testUnit.purgeMessagesInChannel(amountToDelete, textChannel, START_MESSAGE_ID, purgedMember);
- futures.whenComplete((aVoid, throwable) -> Assert.assertNull(throwable));
- verify(deleteStatusAction, times(1)).queueAfter(5, TimeUnit.SECONDS);
- verify(messageService, times(1)).updateStatusMessage(eq(textChannel), anyLong(), any());
- verify(metricService, times(1)).incrementCounter(any(), eq((long) amountToDelete));
- }
-
- @Test
- public void testPurgeTooOldMessage() {
- Integer amountToDelete = 50;
- when(channelService.getHistoryOfChannel(textChannel, START_MESSAGE_ID, amountToDelete)).thenReturn(CompletableFuture.completedFuture(history));
-
- when(firstMessage.getId()).thenReturn(getNotDeletableMessageId().toString());
-
- when(history.getRetrievedHistory()).thenReturn(Arrays.asList(firstMessage));
- setupStatusMessageMocks();
- CompletableFuture futures = testUnit.purgeMessagesInChannel(amountToDelete, textChannel, START_MESSAGE_ID, purgedMember);
- futures.whenComplete((aVoid, throwable) -> Assert.assertTrue(throwable.getCause() instanceof NoMessageFoundException));
- }
-
- private void setupOneMessageBatch(Long deletableMessageId, Long deletableMessageId2) {
- setupFirstMessages(firstMessage, deletableMessageId, secondMessage, deletableMessageId2, messageAuthor);
- setupMembersWithAuthorId();
- setupFirstMessageHistoryMocks();
- mockQueueDoubleVoidConsumer(deleteMessagesAction);
- setupStatusMessageMocks();
- }
-
- public void mockQueueDoubleVoidConsumer(RestAction action) {
- doAnswer(invocationOnMock -> {
- Object consumerObj = invocationOnMock.getArguments()[0];
- if(consumerObj instanceof Consumer) {
- Consumer consumer = (Consumer) consumerObj;
- consumer.accept(null);
- }
- return null;
- }).when(action).queue(any(Consumer.class), any(Consumer.class));
- }
-
- private void setupFirstMessageHistoryMocks() {
- List messagesToDelete = Arrays.asList(firstMessage, secondMessage);
- when(history.getRetrievedHistory()).thenReturn(messagesToDelete);
- when(channelService.deleteMessagesInChannel(textChannel, messagesToDelete)).thenReturn(deleteMessagesAction);
- }
-
- private void setupStatusMessageMocks() {
- when(templateService.renderTemplateToMessageToSend(eq("purge_status_update"), any(PurgeStatusUpdateModel.class), eq(SERVER_ID))).thenReturn(firstStatusUpdateMessage);
- when(messageService.createStatusMessageId(firstStatusUpdateMessage, textChannel)).thenReturn(CompletableFuture.completedFuture(STATUS_MESSAGE_ID));
- when(textChannel.deleteMessageById(STATUS_MESSAGE_ID)).thenReturn(deleteStatusAction);
- }
-
- private void setupMembersWithAuthorId() {
- when(messageAuthor.getIdLong()).thenReturn(AUTHOR_ID);
- when(purgedMember.getIdLong()).thenReturn(AUTHOR_ID);
- }
-
- private void setupFirstMessages(Message firstMessageToMock, Long firstMessageId, Message secondMessageToMock, Long secondMessageId, User author) {
- when(firstMessageToMock.getId()).thenReturn(firstMessageId.toString());
- when(firstMessageToMock.getAuthor()).thenReturn(author);
- when(secondMessageToMock.getId()).thenReturn(secondMessageId.toString());
- when(secondMessageToMock.getAuthor()).thenReturn(author);
- }
-
-
-
- private Long getDeletableMessageId() {
- return TimeUtil.getDiscordTimestamp((System.currentTimeMillis() - (7 * 24 * 60 * 60 * 1000)));
- }
-
- private Long getNotDeletableMessageId() {
- return TimeUtil.getDiscordTimestamp((System.currentTimeMillis() - (21 * 24 * 60 * 60 * 1000)));
- }
-
-}
diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBeanTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBeanTest.java
index 4cd96a0b6..9ecb9d431 100644
--- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBeanTest.java
+++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/SlowModeServiceBeanTest.java
@@ -6,7 +6,7 @@ import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.ChannelService;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.TextChannel;
-import net.dv8tion.jda.api.managers.ChannelManager;
+import net.dv8tion.jda.api.managers.channel.ChannelManager;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/pom.xml b/abstracto-application/abstracto-modules/moderation/moderation-int/pom.xml
index 083e8bfa5..736d06a9d 100644
--- a/abstracto-application/abstracto-modules/moderation/moderation-int/pom.xml
+++ b/abstracto-application/abstracto-modules/moderation/moderation-int/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
moderation
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/model/template/command/UnMuteLog.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/model/template/command/UnMuteLog.java
index 626414dc3..ddf84c5de 100644
--- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/model/template/command/UnMuteLog.java
+++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/model/template/command/UnMuteLog.java
@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.moderation.model.template.command;
import dev.sheldan.abstracto.core.models.context.ServerContext;
import dev.sheldan.abstracto.core.utils.MessageUtils;
import dev.sheldan.abstracto.moderation.model.database.Mute;
+import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@@ -19,6 +20,7 @@ import java.time.Instant;
@SuperBuilder
@Setter
@NoArgsConstructor
+@AllArgsConstructor
public class UnMuteLog extends ServerContext {
/**
* The un-muted Member, is null if the member left the server
diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/PurgeService.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/PurgeService.java
index a78072bbe..9ded1a738 100644
--- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/PurgeService.java
+++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/PurgeService.java
@@ -1,12 +1,10 @@
package dev.sheldan.abstracto.moderation.service;
-import net.dv8tion.jda.api.entities.Member;
-import net.dv8tion.jda.api.entities.Message;
-import net.dv8tion.jda.api.entities.TextChannel;
+import net.dv8tion.jda.api.entities.*;
import java.util.concurrent.CompletableFuture;
public interface PurgeService {
- CompletableFuture purgeMessagesInChannel(Integer count, TextChannel channel, Long messageId, Member purgingRestriction);
- CompletableFuture purgeMessagesInChannel(Integer count, TextChannel channel, Message origin, Member purgingRestriction);
+ CompletableFuture purgeMessagesInChannel(Integer count, GuildMessageChannel channel, Long messageId, Member purgingRestriction);
+ CompletableFuture purgeMessagesInChannel(Integer count, GuildMessageChannel channel, Message origin, Member purgingRestriction);
}
diff --git a/abstracto-application/abstracto-modules/moderation/pom.xml b/abstracto-application/abstracto-modules/moderation/pom.xml
index a05c929d1..c831c2090 100644
--- a/abstracto-application/abstracto-modules/moderation/pom.xml
+++ b/abstracto-application/abstracto-modules/moderation/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
abstracto-modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/pom.xml b/abstracto-application/abstracto-modules/modmail/modmail-impl/pom.xml
index 40bebd118..90fa03afd 100644
--- a/abstracto-application/abstracto-modules/modmail/modmail-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
modmail
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/listener/ModMailInitialButtonListener.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/listener/ModMailInitialButtonListener.java
new file mode 100644
index 000000000..14e4301d4
--- /dev/null
+++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/listener/ModMailInitialButtonListener.java
@@ -0,0 +1,98 @@
+package dev.sheldan.abstracto.modmail.listener;
+
+import dev.sheldan.abstracto.core.config.FeatureDefinition;
+import dev.sheldan.abstracto.core.config.ListenerPriority;
+import dev.sheldan.abstracto.core.listener.ButtonClickedListenerResult;
+import dev.sheldan.abstracto.core.listener.async.jda.ButtonClickedListener;
+import dev.sheldan.abstracto.core.models.UndoActionInstance;
+import dev.sheldan.abstracto.core.models.listener.ButtonClickedListenerModel;
+import dev.sheldan.abstracto.core.service.*;
+import dev.sheldan.abstracto.core.service.management.ComponentPayloadManagementService;
+import dev.sheldan.abstracto.modmail.config.ModMailFeatureDefinition;
+import dev.sheldan.abstracto.modmail.model.dto.ServerChoicePayload;
+import dev.sheldan.abstracto.modmail.model.dto.ServiceChoicesPayload;
+import dev.sheldan.abstracto.modmail.service.ModMailThreadService;
+import dev.sheldan.abstracto.modmail.service.ModMailThreadServiceBean;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+
+@Component
+@Slf4j
+public class ModMailInitialButtonListener implements ButtonClickedListener {
+
+ @Autowired
+ private MemberService memberService;
+
+ @Autowired
+ private ModMailThreadService modMailThreadService;
+
+ @Autowired
+ private UndoActionService undoActionService;
+
+ @Autowired
+ private MessageService messageService;
+
+ @Autowired
+ private ComponentPayloadManagementService componentPayloadService;
+
+ @Autowired
+ private ModMailInitialButtonListener self;
+
+ @Autowired
+ private ChannelService channelService;
+
+ @Override
+ public ButtonClickedListenerResult execute(ButtonClickedListenerModel model) {
+ ServiceChoicesPayload choices = (ServiceChoicesPayload) model.getDeserializedPayload();
+
+ ServerChoicePayload chosenServer = choices.getChoices().get(model.getEvent().getComponentId());
+
+ Long userId = choices.getUserId();
+ log.debug("Executing action for creationg a modmail thread in server {} for user {}.", chosenServer.getServerId(), userId);
+ ArrayList undoActions = new ArrayList<>();
+ memberService.getMemberInServerAsync(chosenServer.getServerId(), userId)
+ .thenCompose(member -> channelService.retrieveMessageInChannel(model.getEvent().getChannel(), choices.getMessageId())
+ .thenCompose(originalMessage -> {
+ try {
+ return modMailThreadService.createModMailThreadForUser(member, originalMessage, model.getEvent().getChannel(), true, undoActions);
+ } catch (Exception ex) {
+ log.error("Failed to setup thread correctly", ex);
+ undoActionService.performActions(undoActions);
+ return null;
+ }
+ })
+ .thenAccept(unused -> self.cleanup(model)))
+ .exceptionally(throwable -> {
+ log.error("Failed to setup thread correctly", throwable);
+ undoActionService.performActions(undoActions);
+ return null;
+ });
+ return ButtonClickedListenerResult.ACKNOWLEDGED;
+ }
+
+ @Transactional
+ public void cleanup(ButtonClickedListenerModel model) {
+ ServiceChoicesPayload choices = (ServiceChoicesPayload) model.getDeserializedPayload();
+ choices.getChoices().keySet().forEach(componentId -> componentPayloadService.deletePayload(componentId));
+ }
+
+ @Override
+ public Boolean handlesEvent(ButtonClickedListenerModel model) {
+ return ModMailThreadServiceBean.MODMAIL_INITIAL_ORIGIN.equals(model.getOrigin()) && !model.getEvent().isFromGuild();
+ }
+
+ @Override
+ public Integer getPriority() {
+ return ListenerPriority.LOW;
+ }
+
+ @Override
+ public FeatureDefinition getFeature() {
+ return ModMailFeatureDefinition.MOD_MAIL;
+ }
+
+}
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailMessageServiceBean.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailMessageServiceBean.java
index ca6979b7c..4529ed0be 100644
--- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailMessageServiceBean.java
+++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailMessageServiceBean.java
@@ -72,9 +72,9 @@ public class ModMailMessageServiceBean implements ModMailMessageService {
.stream()
.map(ServerChannelMessageUser::getMessageId)
.collect(Collectors.toList());
- Optional textChannelFromServer = channelService.getTextChannelFromServerOptional(thread.getServer().getId(), thread.getChannel().getId());
+ Optional textChannelFromServer = channelService.getMessageChannelFromServerOptional(thread.getServer().getId(), thread.getChannel().getId());
if(textChannelFromServer.isPresent()) {
- TextChannel modMailThread = textChannelFromServer.get();
+ GuildMessageChannel modMailThread = textChannelFromServer.get();
Long userId = thread.getUser().getUserReference().getId();
botService.getInstance().openPrivateChannelById(userId).queue(privateChannel -> {
Optional latestThreadMessageOptional = messageIds
@@ -125,7 +125,7 @@ public class ModMailMessageServiceBean implements ModMailMessageService {
}
public CompletableFuture loadMoreMessages(Integer totalMessageCount, List messagesToLoad,
- MessageHistory privateMessageHistory, TextChannel thread,
+ MessageHistory privateMessageHistory, GuildMessageChannel thread,
MessageHistory threadMessageHistory, PrivateChannel dmChannel, List loadedMessages, Integer counter) {
// TODO maybe find a better mechanism for this... one which does not lead to infinite loops, but also doesnt miss out on history
if(counter.equals(totalMessageCount * 2)) {
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java
index 047aa2cd3..fa0221078 100644
--- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java
+++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java
@@ -1,7 +1,5 @@
package dev.sheldan.abstracto.modmail.service;
-import com.jagrosh.jdautilities.commons.waiter.EventWaiter;
-import com.jagrosh.jdautilities.menu.ButtonMenu;
import dev.sheldan.abstracto.core.command.exception.AbstractoTemplatedException;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.metric.service.CounterMetric;
@@ -26,8 +24,10 @@ import dev.sheldan.abstracto.modmail.exception.ModMailCategoryIdException;
import dev.sheldan.abstracto.modmail.exception.ModMailThreadChannelNotFound;
import dev.sheldan.abstracto.modmail.exception.ModMailThreadNotFoundException;
import dev.sheldan.abstracto.modmail.model.ClosingContext;
+import dev.sheldan.abstracto.modmail.model.dto.ServiceChoicesPayload;
+import dev.sheldan.abstracto.modmail.model.template.ServerChoices;
import dev.sheldan.abstracto.modmail.model.database.*;
-import dev.sheldan.abstracto.modmail.model.dto.ServerChoice;
+import dev.sheldan.abstracto.modmail.model.template.ServerChoice;
import dev.sheldan.abstracto.modmail.model.template.*;
import dev.sheldan.abstracto.modmail.service.management.ModMailMessageManagementService;
import dev.sheldan.abstracto.modmail.service.management.ModMailRoleManagementService;
@@ -125,9 +125,6 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
@Autowired
private ModMailSubscriberManagementService modMailSubscriberManagementService;
- @Autowired
- private EventWaiter eventWaiter;
-
@Autowired
private FeatureModeService featureModeService;
@@ -146,6 +143,12 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
@Autowired
private MetricService metricService;
+ @Autowired
+ private ComponentService componentService;
+
+ @Autowired
+ private ComponentPayloadService componentPayloadService;
+
public static final String MODMAIL_THREAD_METRIC = "modmail.threads";
public static final String MODMAIL_MESSAGE_METRIC = "modmail.messges";
public static final String ACTION = "action";
@@ -174,14 +177,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
.tagList(Arrays.asList(MetricTag.getTag(MESSAGE_DIRECTION, "sent")))
.build();
- /**
- * The emoji used when the user can decide for a server to open a mod mail thread in.
- */
- private static List NUMBER_EMOJI = Arrays.asList("\u0031\u20e3", "\u0032\u20e3", "\u0033\u20e3",
- "\u0034\u20e3", "\u0035\u20e3", "\u0036\u20e3",
- "\u0037\u20e3", "\u0038\u20e3", "\u0039\u20e3",
- "\u0040\u20e3");
-
+ public static final String MODMAIL_INITIAL_ORIGIN = "modmailInitial";
@Override
public CompletableFuture createModMailThreadForUser(Member member, Message initialMessage, MessageChannel feedBackChannel, boolean userInitiated, List undoActions) {
@@ -315,34 +311,29 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
@Override
public void createModMailPrompt(AUser user, Message initialMessage) {
- List knownServers = userInServerManagementService.getUserInAllServers(user.getId());
- // if the user doesnt exist in the servery set, we need to create the user first in all of them, in order to offer it
- if(knownServers.isEmpty()) {
- List mutualServers = initialMessage.getJDA().getMutualGuilds(initialMessage.getAuthor());
- mutualServers.forEach(guild -> {
- AServer server = serverManagementService.loadServer(guild);
- knownServers.add(userInServerManagementService.loadOrCreateUser(server, user));
- });
- }
- if(!knownServers.isEmpty()) {
- log.info("There are {} shared servers between user and the bot.", knownServers.size());
+ List servers = new ArrayList<>();
+ List mutualServers = initialMessage.getJDA().getMutualGuilds(initialMessage.getAuthor());
+ mutualServers.forEach(guild -> {
+ AServer server = serverManagementService.loadServer(guild);
+ servers.add(server);
+ });
+ if(!servers.isEmpty()) {
+ log.info("There are {} shared servers between user and the bot.", servers.size());
List availableGuilds = new ArrayList<>();
- HashMap choices = new HashMap<>();
- for (int i = 0; i < knownServers.size(); i++) {
- AUserInAServer aUserInAServer = knownServers.get(i);
+ for (AServer server : servers) {
// only take the servers in which mod mail is actually enabled, would not make much sense to make the
// other servers available
- if(featureFlagService.isFeatureEnabled(modMailFeatureConfig, aUserInAServer.getServerReference())) {
- AServer serverReference = aUserInAServer.getServerReference();
+ if (featureFlagService.isFeatureEnabled(modMailFeatureConfig, server)) {
FullGuild guild = FullGuild
.builder()
- .guild(guildService.getGuildById(serverReference.getId()))
- .server(serverReference)
+ .guild(guildService.getGuildById(server.getId()))
+ .server(server)
+ .build();
+ ServerChoice serverChoice = ServerChoice
+ .builder()
+ .serverId(guild.getGuild().getIdLong())
+ .serverName(guild.getGuild().getName())
.build();
- // TODO support more than this limited amount of servers
- String reactionEmote = NUMBER_EMOJI.get(i);
- ServerChoice serverChoice = ServerChoice.builder().guild(guild).reactionEmote(reactionEmote).build();
- choices.put(reactionEmote, aUserInAServer.getServerReference().getId());
availableGuilds.add(serverChoice);
}
}
@@ -350,40 +341,30 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
// if more than 1 server is available, show a choice dialog
ArrayList undoActions = new ArrayList<>();
if(availableGuilds.size() > 1) {
+ Map choices = new HashMap<>();
+ ServerChoices serverChoices = ServerChoices
+ .builder()
+ .commonGuilds(choices)
+ .userId(initialMessage.getAuthor().getIdLong())
+ .messageId(initialMessage.getIdLong())
+ .build();
+ availableGuilds.forEach(serverChoice -> choices.put(componentService.generateComponentId(), serverChoice));
ModMailServerChooserModel modMailServerChooserModel = ModMailServerChooserModel
.builder()
- .commonGuilds(availableGuilds)
- .build();
- String text = templateService.renderTemplate("modmail_modal_server_choice", modMailServerChooserModel);
- ButtonMenu menu = new ButtonMenu.Builder()
- .setChoices(choices.keySet().toArray(new String[0]))
- .setEventWaiter(eventWaiter)
- .setDescription(text)
- .setAction(reactionEmote -> {
- Long chosenServerId = choices.get(reactionEmote.getEmoji());
- Long userId = initialMessage.getAuthor().getIdLong();
- log.debug("Executing action for creationg a modmail thread in server {} for user {}.", chosenServerId, userId);
- memberService.getMemberInServerAsync(chosenServerId, userId).thenCompose(member -> {
- try {
- return self.createModMailThreadForUser(member, initialMessage, initialMessage.getChannel(), true, undoActions);
- } catch (Exception exception) {
- log.error("Setting up modmail thread for user {} in server {} failed.", userId, chosenServerId, exception);
- CompletableFuture future = new CompletableFuture<>();
- future.completeExceptionally(exception);
- return future;
- }
- }).exceptionally(throwable -> {
- log.error("Failed to load member {} for modmail in server {}.", userId, chosenServerId, throwable);
- undoActionService.performActions(undoActions);
- return null;
- });
- })
+ .choices(serverChoices)
.build();
+ MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_modal_server_choice", modMailServerChooserModel);
+ FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, initialMessage.getChannel()))
+ .thenAccept(unused -> self.persistInitialCallbacks(serverChoices))
+ .exceptionally(throwable -> {
+ log.error("Failed to setup prompt message correctly", throwable);
+ undoActionService.performActions(undoActions);
+ return null;
+ });
log.debug("Displaying server choice message for user {} in channel {}.", user.getId(), initialMessage.getChannel().getId());
- menu.display(initialMessage.getChannel());
} else if(availableGuilds.size() == 1) {
// if exactly one server is available, open the thread directly
- Long chosenServerId = choices.get(availableGuilds.get(0).getReactionEmote());
+ Long chosenServerId = availableGuilds.get(0).getServerId();
log.info("Only one server available to modmail. Directly opening modmail thread for user {} in server {}.", initialMessage.getAuthor().getId(), chosenServerId);
memberService.getMemberInServerAsync(chosenServerId, initialMessage.getAuthor().getIdLong()).thenCompose(member -> {
try {
@@ -408,6 +389,13 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
}
}
+ @Transactional
+ public void persistInitialCallbacks(ServerChoices choices) {
+ ServiceChoicesPayload payload = ServiceChoicesPayload.fromServerChoices(choices);
+ choices.getCommonGuilds().keySet().forEach(componentId ->
+ componentPayloadService.createButtonPayload(componentId, payload, MODMAIL_INITIAL_ORIGIN, null));
+ }
+
/**
* Method used to send the header of a newly created mod mail thread. This message contains information about
@@ -446,10 +434,10 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
@Transactional
public CompletableFuture relayMessage(Message messageFromUser, Long serverId, Long channelId, Long modmailThreadId, Member member) {
- Optional textChannelFromServer = channelService.getTextChannelFromServerOptional(serverId, channelId);
+ Optional textChannelFromServer = channelService.getMessageChannelFromServerOptional(serverId, channelId);
if(textChannelFromServer.isPresent()) {
- TextChannel textChannel = textChannelFromServer.get();
- return self.sendUserReply(textChannel, modmailThreadId, messageFromUser, member, true);
+ GuildMessageChannel guildMessageChannel = textChannelFromServer.get();
+ return self.sendUserReply(guildMessageChannel, modmailThreadId, messageFromUser, member, true);
} else {
log.warn("Closing mod mail thread {}, because it seems the channel {} in server {} got deleted.", modmailThreadId, channelId, serverId);
// in this case there was no text channel on the server associated with the mod mail thread
@@ -464,14 +452,14 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
* This message takes a received {@link Message} from a user, renders it to a new message to send and sends it to
* the appropriate {@link ModMailThread} channel, the returned promise only returns if the message was dealt with on the user
* side.
- * @param textChannel The {@link TextChannel} in which the {@link ModMailThread} is being handled
+ * @param textChannel The {@link GuildMessageChannel} in which the {@link ModMailThread} is being handled
* @param modMailThreadId The id of the modmail thread to which the received {@link Message} is a reply to, can be null, if it is null, its the initial message
* @param messageFromUser The received message from the user
* @param member The {@link Member} instance from the user the thread is about. It is used as author
* @param modMailThreadExists Whether or not the modmail thread already exists and is persisted.
* @return A {@link CompletableFuture} which resolves when the post processing of the message is completed (adding read notification, and storing messageIDs)
*/
- public CompletableFuture sendUserReply(TextChannel textChannel, Long modMailThreadId, Message messageFromUser, Member member, boolean modMailThreadExists) {
+ public CompletableFuture sendUserReply(GuildMessageChannel textChannel, Long modMailThreadId, Message messageFromUser, Member member, boolean modMailThreadExists) {
List> subscriberMemberFutures = new ArrayList<>();
if(modMailThreadExists) {
ModMailThread modMailThread = modMailThreadManagementService.getById(modMailThreadId);
@@ -551,7 +539,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
* @param messageFromUser The {@link Message} object which was sent from the user
*/
@Transactional
- public void postProcessSendMessages(TextChannel textChannel, Message messageInModMailThread, Message messageFromUser) {
+ public void postProcessSendMessages(GuildMessageChannel textChannel, Message messageInModMailThread, Message messageFromUser) {
Optional modMailThreadOpt = modMailThreadManagementService.getByChannelIdOptional(textChannel.getIdLong());
if(modMailThreadOpt.isPresent()) {
ModMailThread modMailThread = modMailThreadOpt.get();
@@ -793,7 +781,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
log.info("Modmail thread {} is empty. No messages to log.", modMailThreadId);
return CompletableFuture.completedFuture(new CompletableFutureList<>(new ArrayList<>()));
}
- TextChannel channel = channelService.getTextChannelFromServer(serverId, modMailThreadId);
+ GuildMessageChannel channel = channelService.getMessageChannelFromServer(serverId, modMailThreadId);
ClosingProgressModel progressModel = ClosingProgressModel
.builder()
.loggedMessages(0)
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/setup/ModMailCategoryDelayedActionConfig.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/setup/ModMailCategoryDelayedActionConfig.java
index ae2a470c7..04b297281 100644
--- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/setup/ModMailCategoryDelayedActionConfig.java
+++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/setup/ModMailCategoryDelayedActionConfig.java
@@ -5,7 +5,6 @@ import dev.sheldan.abstracto.modmail.model.template.ModMailCategoryActionModel;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
-import net.dv8tion.jda.api.entities.Category;
/**
* This represents both an instance of a {@link DelayedActionConfig} used to be executed in the
@@ -19,7 +18,6 @@ import net.dv8tion.jda.api.entities.Category;
public class ModMailCategoryDelayedActionConfig implements DelayedActionConfig {
private Long serverId;
private Long categoryId;
- private Category category;
@Override
public String getTemplateName() {
@@ -30,7 +28,7 @@ public class ModMailCategoryDelayedActionConfig implements DelayedActionConfig {
public Object getTemplateModel() {
return ModMailCategoryActionModel
.builder()
- .category(this.category)
+ .serverId(serverId)
.categoryId(categoryId)
.build();
}
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/setup/ModMailCategorySetupBean.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/setup/ModMailCategorySetupBean.java
index 74b9a5ebf..ac5492d80 100644
--- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/setup/ModMailCategorySetupBean.java
+++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/setup/ModMailCategorySetupBean.java
@@ -5,6 +5,7 @@ import dev.sheldan.abstracto.core.models.AServerChannelUserId;
import dev.sheldan.abstracto.core.models.FeatureValidationResult;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
+import dev.sheldan.abstracto.core.models.listener.MessageReceivedModel;
import dev.sheldan.abstracto.core.service.ConfigService;
import dev.sheldan.abstracto.core.service.GuildService;
import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
@@ -82,7 +83,10 @@ public class ModMailCategorySetupBean implements ModMailCategorySetup {
Long categoryId = configService.getLongValue(ModMailThreadServiceBean.MODMAIL_CATEGORY, user.getGuildId());
log.debug("Previous modmail category exists for server {}. Loading value {}.", guild.getId(), categoryId);
Category category = guild.getCategoryById(categoryId);
- model.setCategory(category);
+ if(category != null) {
+ model.setCategoryId(category.getIdLong());
+ }
+ model.setServerId(user.getGuildId());
}
log.info("Executing mod mail category setup for server {}.", user.getGuildId());
String messageText = templateService.renderTemplate(messageTemplateKey, model);
@@ -90,8 +94,8 @@ public class ModMailCategorySetupBean implements ModMailCategorySetup {
CompletableFuture future = new CompletableFuture<>();
AUserInAServer aUserInAServer = userInServerManagementService.loadOrCreateUser(user.getGuildId(), user.getUserId());
- Runnable finalAction = getTimeoutRunnable(user.getGuildId(), user.getChannelId());
- Consumer configAction = (MessageReceivedEvent event) -> {
+ Consumer finalAction = getTimeoutConsumer(user.getGuildId(), user.getChannelId());
+ Consumer configAction = (MessageReceivedModel event) -> {
try {
SetupStepResult result;
@@ -113,10 +117,14 @@ public class ModMailCategorySetupBean implements ModMailCategorySetup {
ModMailCategoryDelayedActionConfig build = ModMailCategoryDelayedActionConfig
.builder()
.serverId(user.getGuildId())
- .category(guild.getCategoryById(categoryId))
.categoryId(categoryId)
.build();
- List delayedSteps = Arrays.asList(build);
+ DelayedActionConfigContainer container = DelayedActionConfigContainer
+ .builder()
+ .type(build.getClass())
+ .object(build)
+ .build();
+ List delayedSteps = Arrays.asList(container);
result = SetupStepResult
.builder()
.result(SetupStepResultType.SUCCESS)
@@ -135,12 +143,12 @@ public class ModMailCategorySetupBean implements ModMailCategorySetup {
future.completeExceptionally(new SetupStepException(e));
}
};
- interactiveService.createMessageWithResponse(messageText, aUserInAServer, channel, parameter.getPreviousMessageId(), configAction, finalAction);
+ interactiveService.createMessageWithResponse(messageText, aUserInAServer, channel, configAction, finalAction);
return future;
}
- protected Runnable getTimeoutRunnable(Long serverId, Long channelId) {
- return () -> interactiveUtils.sendTimeoutMessage(serverId, channelId);
+ protected Consumer getTimeoutConsumer(Long serverId, Long channelId) {
+ return (MessageReceivedModel) -> interactiveUtils.sendTimeoutMessage(serverId, channelId);
}
protected boolean checkForExit(Message message) {
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-int/pom.xml b/abstracto-application/abstracto-modules/modmail/modmail-int/pom.xml
index 8356e84a4..9a524767c 100644
--- a/abstracto-application/abstracto-modules/modmail/modmail-int/pom.xml
+++ b/abstracto-application/abstracto-modules/modmail/modmail-int/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
modmail
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/dto/ServerChoice.java b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/dto/ServerChoice.java
deleted file mode 100644
index 52b2a2c77..000000000
--- a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/dto/ServerChoice.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package dev.sheldan.abstracto.modmail.model.dto;
-
-import dev.sheldan.abstracto.core.models.FullGuild;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * Used when the user shares multiple servers with the bot and needs to determine for which server the user
- * wants to open a mod mail thread, this is done by reacting to the prompt with the proper emote.
- */
-@Getter
-@Setter
-@Builder
-public class ServerChoice {
- /**
- * The possible guild to open a mod mail thread for
- */
- private FullGuild guild;
- /**
- * The unicode emote used in the prompt to identify this choice
- */
- private String reactionEmote;
-}
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/dto/ServerChoicePayload.java b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/dto/ServerChoicePayload.java
new file mode 100644
index 000000000..81fe73120
--- /dev/null
+++ b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/dto/ServerChoicePayload.java
@@ -0,0 +1,18 @@
+package dev.sheldan.abstracto.modmail.model.dto;
+
+import dev.sheldan.abstracto.modmail.model.template.ServerChoice;
+import lombok.Builder;
+import lombok.Getter;
+
+@Getter
+@Builder
+public class ServerChoicePayload {
+ private Long serverId;
+
+ public static ServerChoicePayload fromServerChoice(ServerChoice choice) {
+ return ServerChoicePayload
+ .builder()
+ .serverId(choice.getServerId())
+ .build();
+ }
+}
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/dto/ServiceChoicesPayload.java b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/dto/ServiceChoicesPayload.java
new file mode 100644
index 000000000..2a6a78bab
--- /dev/null
+++ b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/dto/ServiceChoicesPayload.java
@@ -0,0 +1,28 @@
+package dev.sheldan.abstracto.modmail.model.dto;
+
+import dev.sheldan.abstracto.core.models.template.button.ButtonPayload;
+import dev.sheldan.abstracto.modmail.model.template.ServerChoices;
+import lombok.Builder;
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Getter
+@Builder
+public class ServiceChoicesPayload implements ButtonPayload {
+ private Map choices;
+ private Long userId;
+ private Long messageId;
+
+ public static ServiceChoicesPayload fromServerChoices(ServerChoices choices) {
+ Map newChoices = new HashMap<>();
+ choices.getCommonGuilds().forEach((s, choice) -> newChoices.put(s, ServerChoicePayload.fromServerChoice(choice)));
+ return ServiceChoicesPayload
+ .builder()
+ .userId(choices.getUserId())
+ .messageId(choices.getMessageId())
+ .choices(newChoices)
+ .build();
+ }
+}
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ModMailCategoryActionModel.java b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ModMailCategoryActionModel.java
index 9483c19ca..334d3bbb0 100644
--- a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ModMailCategoryActionModel.java
+++ b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ModMailCategoryActionModel.java
@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.modmail.model.template;
+import dev.sheldan.abstracto.core.utils.ChannelUtils;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@@ -14,6 +15,10 @@ import net.dv8tion.jda.api.entities.Category;
@Setter
@Builder
public class ModMailCategoryActionModel {
- private Category category;
+ private Long serverId;
private Long categoryId;
+
+ public String getCategoryAsMention() {
+ return ChannelUtils.getAsMention(this.getCategoryId());
+ }
}
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ModMailServerChooserModel.java b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ModMailServerChooserModel.java
index c651a1c32..968dacb3e 100644
--- a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ModMailServerChooserModel.java
+++ b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ModMailServerChooserModel.java
@@ -1,12 +1,9 @@
package dev.sheldan.abstracto.modmail.model.template;
-import dev.sheldan.abstracto.modmail.model.dto.ServerChoice;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
-import java.util.List;
-
/**
* Container model used to define all the possible {@link ServerChoice} which are presented when the initial message is
* sent to the bot
@@ -15,9 +12,5 @@ import java.util.List;
@Setter
@Builder
public class ModMailServerChooserModel {
- /**
- * A list of {@link ServerChoice} which contains the common servers of the user and the bot, but only those
- * in which the mod mail feature is currently enabled
- */
- private List commonGuilds;
+ private ServerChoices choices;
}
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ServerChoice.java b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ServerChoice.java
new file mode 100644
index 000000000..0aae2ba26
--- /dev/null
+++ b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ServerChoice.java
@@ -0,0 +1,11 @@
+package dev.sheldan.abstracto.modmail.model.template;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Getter
+@Builder
+public class ServerChoice {
+ private String serverName;
+ private Long serverId;
+}
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ServerChoices.java b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ServerChoices.java
new file mode 100644
index 000000000..401bb772c
--- /dev/null
+++ b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/ServerChoices.java
@@ -0,0 +1,14 @@
+package dev.sheldan.abstracto.modmail.model.template;
+
+import lombok.Builder;
+import lombok.Getter;
+
+import java.util.Map;
+
+@Getter
+@Builder
+public class ServerChoices {
+ private Map commonGuilds;
+ private Long userId;
+ private Long messageId;
+}
diff --git a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/SetupModMailCategoryMessageModel.java b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/SetupModMailCategoryMessageModel.java
index e058216f7..652ee25da 100644
--- a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/SetupModMailCategoryMessageModel.java
+++ b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/template/SetupModMailCategoryMessageModel.java
@@ -1,9 +1,9 @@
package dev.sheldan.abstracto.modmail.model.template;
+import dev.sheldan.abstracto.core.utils.ChannelUtils;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
-import net.dv8tion.jda.api.entities.Category;
/**
* Model which is used when setting up the mod mail feature. The category property will be used when there is already a category
@@ -13,5 +13,10 @@ import net.dv8tion.jda.api.entities.Category;
@Setter
@Builder
public class SetupModMailCategoryMessageModel {
- private Category category;
+ private Long serverId;
+ private Long categoryId;
+
+ public String getCategoryAsMention() {
+ return ChannelUtils.getAsMention(this.getCategoryId());
+ }
}
diff --git a/abstracto-application/abstracto-modules/modmail/pom.xml b/abstracto-application/abstracto-modules/modmail/pom.xml
index 985ef4b9f..5d876523a 100644
--- a/abstracto-application/abstracto-modules/modmail/pom.xml
+++ b/abstracto-application/abstracto-modules/modmail/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
abstracto-modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/pom.xml b/abstracto-application/abstracto-modules/pom.xml
index 97fd1302b..f42621793 100644
--- a/abstracto-application/abstracto-modules/pom.xml
+++ b/abstracto-application/abstracto-modules/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto
abstracto-application
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/profanity-filter/pom.xml b/abstracto-application/abstracto-modules/profanity-filter/pom.xml
index 43a827263..36b1a1c63 100644
--- a/abstracto-application/abstracto-modules/profanity-filter/pom.xml
+++ b/abstracto-application/abstracto-modules/profanity-filter/pom.xml
@@ -3,7 +3,7 @@
abstracto-modules
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/profanity-filter/profanity-filter-impl/pom.xml b/abstracto-application/abstracto-modules/profanity-filter/profanity-filter-impl/pom.xml
index 186202131..cecd07761 100644
--- a/abstracto-application/abstracto-modules/profanity-filter/profanity-filter-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/profanity-filter/profanity-filter-impl/pom.xml
@@ -3,7 +3,7 @@
profanity-filter
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/profanity-filter/profanity-filter-int/pom.xml b/abstracto-application/abstracto-modules/profanity-filter/profanity-filter-int/pom.xml
index 9fe9a5bff..94f5ca7d2 100644
--- a/abstracto-application/abstracto-modules/profanity-filter/profanity-filter-int/pom.xml
+++ b/abstracto-application/abstracto-modules/profanity-filter/profanity-filter-int/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
profanity-filter
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/remind/pom.xml b/abstracto-application/abstracto-modules/remind/pom.xml
index a85ca1840..427d2fba3 100644
--- a/abstracto-application/abstracto-modules/remind/pom.xml
+++ b/abstracto-application/abstracto-modules/remind/pom.xml
@@ -3,7 +3,7 @@
abstracto-modules
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/remind/remind-impl/pom.xml b/abstracto-application/abstracto-modules/remind/remind-impl/pom.xml
index 841133796..e2f1d3cf8 100644
--- a/abstracto-application/abstracto-modules/remind/remind-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/remind/remind-impl/pom.xml
@@ -3,7 +3,7 @@
remind
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/remind/remind-impl/src/main/java/dev/sheldan/abstracto/remind/service/RemindServiceBean.java b/abstracto-application/abstracto-modules/remind/remind-impl/src/main/java/dev/sheldan/abstracto/remind/service/RemindServiceBean.java
index cb79c23bd..50ea815d1 100644
--- a/abstracto-application/abstracto-modules/remind/remind-impl/src/main/java/dev/sheldan/abstracto/remind/service/RemindServiceBean.java
+++ b/abstracto-application/abstracto-modules/remind/remind-impl/src/main/java/dev/sheldan/abstracto/remind/service/RemindServiceBean.java
@@ -19,10 +19,7 @@ import dev.sheldan.abstracto.remind.service.management.ReminderManagementService
import dev.sheldan.abstracto.scheduling.model.JobParameters;
import dev.sheldan.abstracto.scheduling.service.SchedulerService;
import lombok.extern.slf4j.Slf4j;
-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 net.dv8tion.jda.api.entities.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@@ -133,7 +130,7 @@ public class RemindServiceBean implements ReminderService {
reminderId, channel.getId(), server.getId(), reminderToRemindFor.getRemindedUser().getUserReference().getId());
Optional guildToAnswerIn = guildService.getGuildByIdOptional(server.getId());
if(guildToAnswerIn.isPresent()) {
- Optional channelToAnswerIn = channelService.getTextChannelFromServerOptional(server.getId(), channel.getId());
+ Optional channelToAnswerIn = channelService.getMessageChannelFromServerOptional(server.getId(), channel.getId());
// only send the message if the channel still exists, if not, only set the reminder to reminded.
if(channelToAnswerIn.isPresent()) {
memberService.getMemberInServerAsync(server.getId(), reminderToRemindFor.getRemindedUser().getUserReference().getId()).thenAccept(member ->
@@ -150,7 +147,7 @@ public class RemindServiceBean implements ReminderService {
}
@Transactional
- public CompletableFuture sendReminderText(Long reminderId, TextChannel channelToAnswerIn, Member member) {
+ public CompletableFuture sendReminderText(Long reminderId, GuildMessageChannel channelToAnswerIn, Member member) {
Reminder reminder = reminderManagementService.loadReminder(reminderId);
log.debug("Sending remind message for reminder {} to user user {} in server {}.", reminderId, member.getIdLong(), member.getGuild().getIdLong());
ExecutedReminderModel build = ExecutedReminderModel
diff --git a/abstracto-application/abstracto-modules/remind/remind-impl/src/test/java/dev/sheldan/abstracto/remind/service/RemindServiceBeanTest.java b/abstracto-application/abstracto-modules/remind/remind-impl/src/test/java/dev/sheldan/abstracto/remind/service/RemindServiceBeanTest.java
index 4908def57..4ff6d8d10 100644
--- a/abstracto-application/abstracto-modules/remind/remind-impl/src/test/java/dev/sheldan/abstracto/remind/service/RemindServiceBeanTest.java
+++ b/abstracto-application/abstracto-modules/remind/remind-impl/src/test/java/dev/sheldan/abstracto/remind/service/RemindServiceBeanTest.java
@@ -16,10 +16,7 @@ import dev.sheldan.abstracto.scheduling.model.JobParameters;
import dev.sheldan.abstracto.scheduling.service.SchedulerService;
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
import dev.sheldan.abstracto.core.templating.service.TemplateService;
-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 net.dv8tion.jda.api.entities.*;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -73,7 +70,7 @@ public class RemindServiceBeanTest {
private Message message;
@Mock
- private TextChannel channel;
+ private GuildMessageChannel channel;
@Mock
private ScheduledExecutorService instantReminderScheduler;
@@ -155,7 +152,7 @@ public class RemindServiceBeanTest {
when(reminderManagementService.loadReminder(REMINDER_ID)).thenReturn(remindedReminder);
Guild guildMock = Mockito.mock(Guild.class);
when(guildService.getGuildByIdOptional(SERVER_ID)).thenReturn(Optional.of(guildMock));
- when(channelService.getTextChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.of(channel));
+ when(channelService.getMessageChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.of(channel));
Member mockedMember = Mockito.mock(Member.class);
when(memberService.getMemberInServerAsync(SERVER_ID, USER_ID)).thenReturn(CompletableFuture.completedFuture(mockedMember));
testUnit.executeReminder(REMINDER_ID);
@@ -174,7 +171,7 @@ public class RemindServiceBeanTest {
when(guildService.getGuildByIdOptional(SERVER_ID)).thenReturn(Optional.of(guildMock));
when(aUserInAServer.getUserReference()).thenReturn(user);
when(remindedReminder.getRemindedUser()).thenReturn(aUserInAServer);
- when(channelService.getTextChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.empty());
+ when(channelService.getMessageChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.empty());
testUnit.executeReminder(REMINDER_ID);
verify(reminderManagementService, times(1)).setReminded(remindedReminder);
verify(self, times(0)).sendReminderText(anyLong(), any(), any(Member.class));
diff --git a/abstracto-application/abstracto-modules/remind/remind-int/pom.xml b/abstracto-application/abstracto-modules/remind/remind-int/pom.xml
index 788a04290..0772e69f5 100644
--- a/abstracto-application/abstracto-modules/remind/remind-int/pom.xml
+++ b/abstracto-application/abstracto-modules/remind/remind-int/pom.xml
@@ -3,7 +3,7 @@
remind
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/repost-detection/pom.xml b/abstracto-application/abstracto-modules/repost-detection/pom.xml
index 227cc2513..af8a3208c 100644
--- a/abstracto-application/abstracto-modules/repost-detection/pom.xml
+++ b/abstracto-application/abstracto-modules/repost-detection/pom.xml
@@ -3,7 +3,7 @@
abstracto-modules
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/pom.xml b/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/pom.xml
index d555d110d..12829ab63 100644
--- a/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/pom.xml
@@ -3,7 +3,7 @@
repost-detection
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/main/java/dev/sheldan/abstracto/repostdetection/converter/RepostCheckChannelModelConverter.java b/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/main/java/dev/sheldan/abstracto/repostdetection/converter/RepostCheckChannelModelConverter.java
index 4918569c1..6102934f3 100644
--- a/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/main/java/dev/sheldan/abstracto/repostdetection/converter/RepostCheckChannelModelConverter.java
+++ b/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/main/java/dev/sheldan/abstracto/repostdetection/converter/RepostCheckChannelModelConverter.java
@@ -26,7 +26,7 @@ public class RepostCheckChannelModelConverter {
FullChannel
.builder()
.channel(channel)
- .serverChannel(channelService.getTextChannelFromServerNullable(guild, channel.getId()))
+ .serverChannel(channelService.getMessageChannelFromServerNullable(guild, channel.getId()))
.build()
).collect(Collectors.toList());
repostCheckChannelGroups.add(
diff --git a/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/main/java/dev/sheldan/abstracto/repostdetection/listener/RepostMessageReceivedListener.java b/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/main/java/dev/sheldan/abstracto/repostdetection/listener/RepostMessageReceivedListener.java
index 25f31c2d0..866e183b4 100644
--- a/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/main/java/dev/sheldan/abstracto/repostdetection/listener/RepostMessageReceivedListener.java
+++ b/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/main/java/dev/sheldan/abstracto/repostdetection/listener/RepostMessageReceivedListener.java
@@ -39,7 +39,7 @@ public class RepostMessageReceivedListener implements AsyncMessageReceivedListen
if(!message.isFromGuild() || message.isWebhookMessage() || message.getType().isSystem()) {
return DefaultListenerResult.IGNORED;
}
- AChannel channel = channelManagementService.loadChannel(message.getTextChannel().getIdLong());
+ AChannel channel = channelManagementService.loadChannel(message.getChannel().getIdLong());
if(repostCheckChannelService.duplicateCheckEnabledForChannel(channel)) {
repostService.processMessageAttachmentRepostCheck(message);
List imageEmbeds = message.getEmbeds().stream().filter(messageEmbed -> messageEmbed.getType().equals(EmbedType.IMAGE)).collect(Collectors.toList());
diff --git a/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/test/java/dev/sheldan/abstracto/repostdetection/converter/RepostCheckChannelModelConverterTest.java b/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/test/java/dev/sheldan/abstracto/repostdetection/converter/RepostCheckChannelModelConverterTest.java
index 8f7dcdb5e..597366570 100644
--- a/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/test/java/dev/sheldan/abstracto/repostdetection/converter/RepostCheckChannelModelConverterTest.java
+++ b/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/test/java/dev/sheldan/abstracto/repostdetection/converter/RepostCheckChannelModelConverterTest.java
@@ -62,11 +62,11 @@ public class RepostCheckChannelModelConverterTest {
AChannel channel1 = Mockito.mock(AChannel.class);
when(channel1.getId()).thenReturn(channelId1);
TextChannel textChannel = Mockito.mock(TextChannel.class);
- when(channelService.getTextChannelFromServerNullable(guild, channelId1)).thenReturn(textChannel);
+ when(channelService.getMessageChannelFromServerNullable(guild, channelId1)).thenReturn(textChannel);
Long channelId2 = 2L;
AChannel channel2 = Mockito.mock(AChannel.class);
when(channel2.getId()).thenReturn(channelId2);
- when(channelService.getTextChannelFromServerNullable(guild, channelId2)).thenReturn(null);
+ when(channelService.getMessageChannelFromServerNullable(guild, channelId2)).thenReturn(null);
when(group.getChannels()).thenReturn(Arrays.asList(channel1, channel2));
RepostCheckChannelsModel model = testUnit.fromRepostCheckChannelGroups(Arrays.asList(element), guild);
Assert.assertEquals(1, model.getRepostCheckChannelGroups().size());
diff --git a/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/test/java/dev/sheldan/abstracto/repostdetection/listener/RepostMessageReceivedListenerTest.java b/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/test/java/dev/sheldan/abstracto/repostdetection/listener/RepostMessageReceivedListenerTest.java
index 83dbc9ca9..6ae89def5 100644
--- a/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/test/java/dev/sheldan/abstracto/repostdetection/listener/RepostMessageReceivedListenerTest.java
+++ b/abstracto-application/abstracto-modules/repost-detection/repost-detection-impl/src/test/java/dev/sheldan/abstracto/repostdetection/listener/RepostMessageReceivedListenerTest.java
@@ -42,7 +42,7 @@ public class RepostMessageReceivedListenerTest {
private MessageReceivedModel model;
@Mock
- private TextChannel textChannel;
+ private GuildMessageChannel textChannel;
@Captor
private ArgumentCaptor> embedListCaptor;
@@ -89,7 +89,7 @@ public class RepostMessageReceivedListenerTest {
}
private void setupRepostCheckEnabled(boolean b) {
- when(message.getTextChannel()).thenReturn(textChannel);
+ when(message.getChannel()).thenReturn(textChannel);
when(message.isFromGuild()).thenReturn(true);
when(message.isWebhookMessage()).thenReturn(false);
MessageType type = MessageType.DEFAULT;
diff --git a/abstracto-application/abstracto-modules/repost-detection/repost-detection-int/pom.xml b/abstracto-application/abstracto-modules/repost-detection/repost-detection-int/pom.xml
index 3da277095..00a4cb414 100644
--- a/abstracto-application/abstracto-modules/repost-detection/repost-detection-int/pom.xml
+++ b/abstracto-application/abstracto-modules/repost-detection/repost-detection-int/pom.xml
@@ -3,7 +3,7 @@
repost-detection
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/starboard/pom.xml b/abstracto-application/abstracto-modules/starboard/pom.xml
index f8cea4c59..977fec2e0 100644
--- a/abstracto-application/abstracto-modules/starboard/pom.xml
+++ b/abstracto-application/abstracto-modules/starboard/pom.xml
@@ -3,7 +3,7 @@
abstracto-modules
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/pom.xml b/abstracto-application/abstracto-modules/starboard/starboard-impl/pom.xml
index 2d4467886..728b1ff7b 100644
--- a/abstracto-application/abstracto-modules/starboard/starboard-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/pom.xml
@@ -3,7 +3,7 @@
starboard
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBean.java b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBean.java
index 54c28e277..d3181d4c3 100644
--- a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBean.java
+++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBean.java
@@ -25,10 +25,7 @@ import dev.sheldan.abstracto.starboard.model.template.*;
import dev.sheldan.abstracto.starboard.service.management.StarboardPostManagementService;
import dev.sheldan.abstracto.starboard.service.management.StarboardPostReactorManagementService;
import lombok.extern.slf4j.Slf4j;
-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 net.dv8tion.jda.api.entities.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@@ -159,7 +156,7 @@ public class StarboardServiceBean implements StarboardService {
}
private StarboardPostModel createStarboardModel(CachedMessage message, Integer starCount, net.dv8tion.jda.api.entities.User user) {
- Optional channel = channelService.getTextChannelFromServerOptional(message.getServerId(), message.getChannelId());
+ Optional channel = channelService.getMessageChannelFromServerOptional(message.getServerId(), message.getChannelId());
Optional guild = guildService.getGuildByIdOptional(message.getServerId());
String starLevelEmote = getAppropriateEmote(message.getServerId(), starCount);
return StarboardPostModel
diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBeanTest.java b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBeanTest.java
index f8c74ff16..d8da01475 100644
--- a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBeanTest.java
+++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBeanTest.java
@@ -97,7 +97,7 @@ public class StarboardServiceBeanTest {
private Message sendPost;
@Mock
- private TextChannel mockedTextChannel;
+ private GuildMessageChannel mockedTextChannel;
@Mock
private User starredJdaUser;
@@ -156,7 +156,7 @@ public class StarboardServiceBeanTest {
when(message.getServerId()).thenReturn(SERVER_ID);
when(message.getChannelId()).thenReturn(CHANNEL_ID);
when(userService.retrieveUserForId(STARRED_USER_ID)).thenReturn(CompletableFuture.completedFuture(starredJdaUser));
- when(channelService.getTextChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.of(mockedTextChannel));
+ when(channelService.getMessageChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.of(mockedTextChannel));
when(guildService.getGuildByIdOptional(SERVER_ID)).thenReturn(Optional.of(guild));
SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class);
Long defaultValue = 3L;
diff --git a/abstracto-application/abstracto-modules/starboard/starboard-int/pom.xml b/abstracto-application/abstracto-modules/starboard/starboard-int/pom.xml
index 32732b386..9452dc075 100644
--- a/abstracto-application/abstracto-modules/starboard/starboard-int/pom.xml
+++ b/abstracto-application/abstracto-modules/starboard/starboard-int/pom.xml
@@ -3,7 +3,7 @@
starboard
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/model/template/StarboardPostModel.java b/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/model/template/StarboardPostModel.java
index 2d39eab6c..94f8493c7 100644
--- a/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/model/template/StarboardPostModel.java
+++ b/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/model/template/StarboardPostModel.java
@@ -5,7 +5,7 @@ import dev.sheldan.abstracto.core.models.context.ServerContext;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
-import net.dv8tion.jda.api.entities.TextChannel;
+import net.dv8tion.jda.api.entities.GuildMessageChannel;
import net.dv8tion.jda.api.entities.User;
@Getter
@@ -13,7 +13,7 @@ import net.dv8tion.jda.api.entities.User;
@SuperBuilder
public class StarboardPostModel extends ServerContext {
private User author;
- private TextChannel channel;
+ private GuildMessageChannel channel;
private Long sourceChannelId;
private CachedMessage message;
private Integer starCount;
diff --git a/abstracto-application/abstracto-modules/statistic/pom.xml b/abstracto-application/abstracto-modules/statistic/pom.xml
index e8eb3e2c7..0a0bf6237 100644
--- a/abstracto-application/abstracto-modules/statistic/pom.xml
+++ b/abstracto-application/abstracto-modules/statistic/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
abstracto-modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/pom.xml b/abstracto-application/abstracto-modules/statistic/statistic-impl/pom.xml
index 2d92cb609..03d153503 100644
--- a/abstracto-application/abstracto-modules/statistic/statistic-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
statistic
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/statistic/statistic-int/pom.xml b/abstracto-application/abstracto-modules/statistic/statistic-int/pom.xml
index 60c2927fa..79e8c7d4a 100644
--- a/abstracto-application/abstracto-modules/statistic/statistic-int/pom.xml
+++ b/abstracto-application/abstracto-modules/statistic/statistic-int/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
statistic
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/suggestion/pom.xml b/abstracto-application/abstracto-modules/suggestion/pom.xml
index 7ec944b46..c12f1c38e 100644
--- a/abstracto-application/abstracto-modules/suggestion/pom.xml
+++ b/abstracto-application/abstracto-modules/suggestion/pom.xml
@@ -3,7 +3,7 @@
abstracto-modules
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/pom.xml b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/pom.xml
index a015a5157..634f943af 100644
--- a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/pom.xml
@@ -3,7 +3,7 @@
suggestion
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/listener/SuggestionButtonVoteClickedListener.java b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/listener/SuggestionButtonVoteClickedListener.java
index aaa255bb7..347ed5831 100644
--- a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/listener/SuggestionButtonVoteClickedListener.java
+++ b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/listener/SuggestionButtonVoteClickedListener.java
@@ -12,8 +12,8 @@ import dev.sheldan.abstracto.suggestion.model.template.SuggestionButtonPayload;
import dev.sheldan.abstracto.suggestion.service.SuggestionServiceBean;
import dev.sheldan.abstracto.suggestion.service.SuggestionVoteService;
import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.events.interaction.ButtonClickEvent;
-import net.dv8tion.jda.api.interactions.components.ButtonInteraction;
+import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
+import net.dv8tion.jda.api.interactions.components.buttons.ButtonInteraction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -33,7 +33,7 @@ public class SuggestionButtonVoteClickedListener implements ButtonClickedListene
@Override
public ButtonClickedListenerResult execute(ButtonClickedListenerModel model) {
- ButtonClickEvent event = model.getEvent();
+ ButtonInteractionEvent event = model.getEvent();
SuggestionButtonPayload payload = (SuggestionButtonPayload) model.getDeserializedPayload();
suggestionVoteService.upsertSuggestionVote(event.getMember(), payload.getDecision(), payload.getSuggestionId());
ButtonInteraction buttonInteraction = model.getEvent().getInteraction();
@@ -58,7 +58,7 @@ public class SuggestionButtonVoteClickedListener implements ButtonClickedListene
@Override
public Boolean handlesEvent(ButtonClickedListenerModel model) {
- return SuggestionServiceBean.SUGGESTION_VOTE_ORIGIN.equals(model.getOrigin());
+ return SuggestionServiceBean.SUGGESTION_VOTE_ORIGIN.equals(model.getOrigin()) && model.getEvent().isFromGuild();
}
@Override
diff --git a/abstracto-application/abstracto-modules/suggestion/suggestion-int/pom.xml b/abstracto-application/abstracto-modules/suggestion/suggestion-int/pom.xml
index 568cc2c0f..9e7ff7bec 100644
--- a/abstracto-application/abstracto-modules/suggestion/suggestion-int/pom.xml
+++ b/abstracto-application/abstracto-modules/suggestion/suggestion-int/pom.xml
@@ -3,7 +3,7 @@
suggestion
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/utility/pom.xml b/abstracto-application/abstracto-modules/utility/pom.xml
index c29ece7e5..5a8169551 100644
--- a/abstracto-application/abstracto-modules/utility/pom.xml
+++ b/abstracto-application/abstracto-modules/utility/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
abstracto-modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/pom.xml b/abstracto-application/abstracto-modules/utility/utility-impl/pom.xml
index b4114c5df..44f0a8d9b 100644
--- a/abstracto-application/abstracto-modules/utility/utility-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/utility/utility-impl/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
utility
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/utility/utility-int/pom.xml b/abstracto-application/abstracto-modules/utility/utility-int/pom.xml
index ffb586aa1..b76ef5161 100644
--- a/abstracto-application/abstracto-modules/utility/utility-int/pom.xml
+++ b/abstracto-application/abstracto-modules/utility/utility-int/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
utility
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/voice-channel-context/pom.xml b/abstracto-application/abstracto-modules/voice-channel-context/pom.xml
index a3f413653..3763278c7 100644
--- a/abstracto-application/abstracto-modules/voice-channel-context/pom.xml
+++ b/abstracto-application/abstracto-modules/voice-channel-context/pom.xml
@@ -3,7 +3,7 @@
abstracto-modules
dev.sheldan.abstracto.modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/voice-channel-context/voice-channel-context-impl/pom.xml b/abstracto-application/abstracto-modules/voice-channel-context/voice-channel-context-impl/pom.xml
index aee6a44e8..07398b2f6 100644
--- a/abstracto-application/abstracto-modules/voice-channel-context/voice-channel-context-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/voice-channel-context/voice-channel-context-impl/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
voice-channel-context
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/voice-channel-context/voice-channel-context-int/pom.xml b/abstracto-application/abstracto-modules/voice-channel-context/voice-channel-context-int/pom.xml
index bb863aa87..4cf98c484 100644
--- a/abstracto-application/abstracto-modules/voice-channel-context/voice-channel-context-int/pom.xml
+++ b/abstracto-application/abstracto-modules/voice-channel-context/voice-channel-context-int/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
voice-channel-context
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/webservices/pom.xml b/abstracto-application/abstracto-modules/webservices/pom.xml
index 1fd8e5d30..536655405 100644
--- a/abstracto-application/abstracto-modules/webservices/pom.xml
+++ b/abstracto-application/abstracto-modules/webservices/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
abstracto-modules
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/webservices/webservices-impl/pom.xml b/abstracto-application/abstracto-modules/webservices/webservices-impl/pom.xml
index e9c7de3eb..7a625caa5 100644
--- a/abstracto-application/abstracto-modules/webservices/webservices-impl/pom.xml
+++ b/abstracto-application/abstracto-modules/webservices/webservices-impl/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
webservices
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/abstracto-modules/webservices/webservices-int/pom.xml b/abstracto-application/abstracto-modules/webservices/webservices-int/pom.xml
index 6c2c98ec3..d8c810791 100644
--- a/abstracto-application/abstracto-modules/webservices/webservices-int/pom.xml
+++ b/abstracto-application/abstracto-modules/webservices/webservices-int/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.modules
webservices
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/bundle/pom.xml b/abstracto-application/bundle/pom.xml
index 911fcae3c..77f7bfa7c 100644
--- a/abstracto-application/bundle/pom.xml
+++ b/abstracto-application/bundle/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto
abstracto-application
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
diff --git a/abstracto-application/core/core-impl/pom.xml b/abstracto-application/core/core-impl/pom.xml
index 621c2d92b..e603c4435 100644
--- a/abstracto-application/core/core-impl/pom.xml
+++ b/abstracto-application/core/core-impl/pom.xml
@@ -3,7 +3,7 @@
dev.sheldan.abstracto.core
core
- 1.3.14-SNAPSHOT
+ 1.4.0-SNAPSHOT
4.0.0
jar
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 34735ae31..89ba1777b 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
@@ -139,25 +139,32 @@ public class CommandReceivedHandler extends ListenerAdapter {
@Override
@Transactional
public void onMessageReceived(MessageReceivedEvent event) {
- if(!event.isFromGuild()) {
+ if (!event.isFromGuild()) {
return;
}
Message message = event.getMessage();
- if(!commandManager.isCommand(message)) {
+ if (!commandManager.isCommand(message)) {
return;
}
metricService.incrementCounter(COMMANDS_PROCESSED_COUNTER);
try {
UnParsedCommandResult result = getUnparsedCommandResult(message);
CompletableFuture parsingFuture = getParametersFromMessage(message, result);
- parsingFuture.thenAccept(parsedParameters -> self.executeCommand(event, parsedParameters.getCommand(), parsedParameters.getParameters()));
+ parsingFuture.thenAccept(parsedParameters -> {
+ try {
+ self.executeCommand(event, parsedParameters.getCommand(), parsedParameters.getParameters());
+ } catch (Exception e) {
+ reportException(event, null, e, String.format("Exception when executing command from message %d in message %d in guild %d."
+ , message.getIdLong(), event.getChannel().getIdLong(), event.getGuild().getIdLong()));
+ }
+ });
parsingFuture.exceptionally(throwable -> {
self.reportException(event, result.getCommand(), throwable, "Exception when parsing command.");
return null;
});
} catch (Exception e) {
reportException(event, null, e, String.format("Exception when executing command from message %d in message %d in guild %d."
- , message.getIdLong(), event.getChannel().getIdLong(), event.getGuild().getIdLong()));
+ , message.getIdLong(), event.getChannel().getIdLong(), event.getGuild().getIdLong()));
}
}
@@ -244,7 +251,7 @@ public class CommandReceivedHandler extends ListenerAdapter {
.author(event.getMember())
.guild(event.getGuild())
.undoActions(new ArrayList<>())
- .channel(event.getTextChannel())
+ .channel(event.getGuildChannel())
.message(event.getMessage())
.jda(event.getJDA())
.userInitiatedContext(userInitiatedContext);
@@ -253,9 +260,9 @@ public class CommandReceivedHandler extends ListenerAdapter {
CompletableFuture conditionResultFuture = commandService.isCommandExecutable(foundCommand, commandContext);
conditionResultFuture.thenAccept(conditionResult -> {
CommandResult commandResult = null;
- if(conditionResult.isResult()) {
+ if (conditionResult.isResult()) {
CommandConfiguration commandConfiguration = foundCommand.getConfiguration();
- if(commandConfiguration.isRequiresConfirmation()) {
+ if (commandConfiguration.isRequiresConfirmation()) {
DriedCommandContext driedCommandContext = DriedCommandContext.buildFromCommandContext(commandContext);
driedCommandContext.setCommandName(commandConfiguration.getName());
String confirmId = componentService.generateComponentId();
@@ -272,7 +279,7 @@ public class CommandReceivedHandler extends ListenerAdapter {
FutureUtils.toSingleFutureGeneric(confirmationMessageFutures)
.thenAccept(unused -> self.persistConfirmationCallbacks(model, confirmationMessageFutures.get(0).join()))
.exceptionally(throwable -> self.handleFailedCommand(foundCommand, commandContext, throwable));
- } else if(commandConfiguration.isAsync()) {
+ } else if (commandConfiguration.isAsync()) {
log.info("Executing async command {} for server {} in channel {} based on message {} by user {}.",
commandConfiguration.getName(), commandContext.getGuild().getId(), commandContext.getChannel().getId(), commandContext.getMessage().getId(), commandContext.getAuthor().getId());
@@ -284,7 +291,7 @@ public class CommandReceivedHandler extends ListenerAdapter {
} else {
commandResult = CommandResult.fromCondition(conditionResult);
}
- if(commandResult != null) {
+ if (commandResult != null) {
self.executePostCommandListener(foundCommand, commandContext, commandResult);
}
}).exceptionally(throwable -> handleFailedCommand(foundCommand, commandContext, throwable));
@@ -301,7 +308,7 @@ public class CommandReceivedHandler extends ListenerAdapter {
@Transactional(isolation = Isolation.SERIALIZABLE)
public CompletableFuture executeAsyncCommand(Command foundCommand, CommandContext commandContext) {
return foundCommand.executeAsync(commandContext).thenAccept(result ->
- executePostCommandListener(foundCommand, commandContext, result)
+ executePostCommandListener(foundCommand, commandContext, result)
).exceptionally(throwable -> {
handleFailedCommand(foundCommand, commandContext, throwable);
return null;
@@ -314,13 +321,13 @@ public class CommandReceivedHandler extends ListenerAdapter {
}
@Transactional
- public void reportException(Message message, TextChannel textChannel, Member member, Command foundCommand, Throwable throwable, String s) {
- UserInitiatedServerContext userInitiatedContext = buildUserInitiatedServerContext(member, textChannel, member.getGuild());
+ public void reportException(Message message, MessageChannel channel, Member member, Command foundCommand, Throwable throwable, String s) {
+ UserInitiatedServerContext userInitiatedContext = buildUserInitiatedServerContext(member, channel, member.getGuild());
CommandContext.CommandContextBuilder commandContextBuilder = CommandContext.builder()
.author(member)
.guild(message.getGuild())
.undoActions(new ArrayList<>())
- .channel(message.getTextChannel())
+ .channel(message.getGuildChannel())
.message(message)
.jda(message.getJDA())
.userInitiatedContext(userInitiatedContext);
@@ -332,7 +339,7 @@ public class CommandReceivedHandler extends ListenerAdapter {
@Transactional
public void reportException(MessageReceivedEvent event, Command foundCommand, Throwable throwable, String s) {
- reportException(event.getMessage(), event.getTextChannel(), event.getMember(), foundCommand, throwable, s);
+ reportException(event.getMessage(), event.getChannel(), event.getMember(), foundCommand, throwable, s);
}
private void validateCommandParameters(Parameters parameters, Command foundCommand) {
@@ -344,13 +351,13 @@ public class CommandReceivedHandler extends ListenerAdapter {
Parameter parameter = parameterList.get(Math.min(i, parameterList.size() - 1));
for (ParameterValidator parameterValidator : parameter.getValidators()) {
boolean validate = parameterValidator.validate(parameters.getParameters().get(i));
- if(!validate) {
+ if (!validate) {
log.debug("Parameter {} in command {} failed to validate.", parameter.getName(), commandConfiguration.getName());
throw new CommandParameterValidationException(parameterValidator.getParameters(), parameterValidator.getExceptionTemplateName(), parameter);
}
}
}
- if(commandConfiguration.getNecessaryParameterCount() > parameters.getParameters().size()) {
+ if (commandConfiguration.getNecessaryParameterCount() > parameters.getParameters().size()) {
String nextParameterName = commandConfiguration.getParameters().get(commandConfiguration.getNecessaryParameterCount() - 1).getName();
throw new InsufficientParametersException(foundCommand, nextParameterName);
}
@@ -371,23 +378,23 @@ public class CommandReceivedHandler extends ListenerAdapter {
return foundCommand.execute(commandContext);
}
- private UserInitiatedServerContext buildUserInitiatedServerContext(Member member, TextChannel textChannel, Guild guild) {
+ private UserInitiatedServerContext buildUserInitiatedServerContext(Member member, MessageChannel channel, Guild guild) {
return UserInitiatedServerContext
.builder()
.member(member)
- .messageChannel(textChannel)
+ .messageChannel(channel)
.guild(guild)
.build();
}
private UserInitiatedServerContext buildUserInitiatedServerContext(MessageReceivedEvent event) {
- return buildUserInitiatedServerContext(event.getMember(), event.getTextChannel(), event.getGuild());
+ return buildUserInitiatedServerContext(event.getMember(), event.getChannel(), event.getGuild());
}
- public CompletableFuture getParsedParameters(UnParsedCommandParameter unParsedCommandParameter, Command command, Message message){
+ public CompletableFuture getParsedParameters(UnParsedCommandParameter unParsedCommandParameter, Command command, Message message) {
List parsedParameters = new ArrayList<>();
List parameters = command.getConfiguration().getParameters();
- if(parameters == null || parameters.isEmpty()) {
+ if (parameters == null || parameters.isEmpty()) {
return CompletableFuture.completedFuture(Parameters.builder().parameters(new ArrayList<>()).build());
}
log.debug("Parsing parameters for command {} based on message {}.", command.getConfiguration().getName(), message.getId());
@@ -403,9 +410,9 @@ public class CommandReceivedHandler extends ListenerAdapter {
// because we might ignore some parameters (for example referenced messages) in case the command does not use this as a parameter
int parsedParameter = 0;
for (int i = 0; i < unParsedCommandParameter.getParameters().size(); i++) {
- if(parsedParameter < parameters.size() && !param.isRemainder()) {
+ if (parsedParameter < parameters.size() && !param.isRemainder()) {
param = parameters.get(parsedParameter);
- } else if(param.isRemainder()) {
+ } else if (param.isRemainder()) {
param = parameters.get(parameters.size() - 1);
} else {
break;
@@ -421,7 +428,7 @@ public class CommandReceivedHandler extends ListenerAdapter {
parsedParameters.add(ParseResult.builder().parameter(param).result(future).build());
} else {
Object result = handler.handle(value, iterators, param, message, command);
- if(result != null) {
+ if (result != null) {
parsedParameters.add(ParseResult.builder().parameter(param).result(result).build());
}
}
@@ -438,12 +445,12 @@ public class CommandReceivedHandler extends ListenerAdapter {
}
}
- if(!futures.isEmpty()) {
+ if (!futures.isEmpty()) {
CompletableFuture multipleFuturesFuture = new CompletableFuture<>();
CompletableFuture combinedFuture = FutureUtils.toSingleFuture(futures);
combinedFuture.thenAccept(aVoid -> {
List