From 4180a07243de096b14139cd517cf1b1c79c61c35 Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Sun, 28 Dec 2025 19:17:58 +0100 Subject: [PATCH] [AB-xxx] upgrading to JDA 6.2.0 changing how assignable role places change their buttons --- .../AssignableRolePlaceServiceBean.java | 27 ++-- .../service/EntertainmentServiceBean.java | 4 +- .../BanModerationActionModalListener.java | 4 +- .../KickModerationActionModalListener.java | 2 +- .../MuteModerationActionModalListener.java | 4 +- .../WarnModerationActionModalListener.java | 2 +- .../ReportContextModalListener.java | 2 +- .../moderation/service/KickServiceBean.java | 4 +- .../ServerPollAddOptionModalListener.java | 4 +- .../service/SuggestionServiceBean.java | 4 +- .../twitch/twitch-int/pom.xml | 10 +- abstracto-application/core/core-impl/pom.xml | 2 +- .../interaction/ComponentServiceBean.java | 128 +++++------------- .../interaction/InteractionServiceBean.java | 12 +- .../interaction/modal/ModalServiceBean.java | 22 ++- .../core/service/BotServiceBean.java | 2 +- .../core/service/ChannelServiceBean.java | 4 +- .../core/service/MessageServiceBean.java | 11 +- .../service/TemplateServiceBean.java | 4 +- abstracto-application/core/core-int/pom.xml | 2 +- .../core/interaction/ComponentService.java | 15 +- .../core/interaction/modal/ModalService.java | 2 +- .../core/service/MessageService.java | 5 +- abstracto-application/pom.xml | 14 +- 24 files changed, 117 insertions(+), 173 deletions(-) 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 bd053558f..84cbfe750 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 @@ -31,7 +31,6 @@ import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel; import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel; import net.dv8tion.jda.api.entities.emoji.CustomEmoji; import net.dv8tion.jda.api.entities.emoji.Emoji; -import net.dv8tion.jda.api.components.buttons.ButtonStyle; import org.apache.commons.lang3.BooleanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -60,9 +59,6 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic @Autowired private ChannelService channelService; - @Autowired - private GuildService guildService; - @Autowired private EmoteService emoteService; @@ -131,9 +127,18 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic String buttonId = componentService.generateComponentId(); String emoteMarkdown = emoji != null ? emoji.getFormatted() : null; if (assignableRolePlace.getMessageId() != null) { + AssignablePostMessage model = prepareAssignablePostMessageModel(assignableRolePlace); + model.getRoles().add(AssignablePostRole + .builder() + .componentId(buttonId) + .emoteMarkDown(emoteMarkdown) + .description(description) + .build()); + MessageToSend messageToSend = templateService.renderEmbedTemplate(ASSIGNABLE_ROLES_POST_TEMPLATE_KEY, model, assignableRolePlace.getServer().getId()); log.debug("Assignable role place {} has already message post with ID {} - updating.", assignableRolePlace.getId(), assignableRolePlace.getMessageId()); - return componentService.addButtonToMessage(assignableRolePlace.getMessageId(), textChannel, buttonId, description, emoteMarkdown, ButtonStyle.SECONDARY) - .thenAccept(message -> self.persistAssignableRoleAddition(placeId, role, description, emoji, buttonId)); + return messageService.editMessageInChannel(textChannel, messageToSend, assignableRolePlace.getMessageId()).thenAccept(unused -> { + self.persistAssignableRoleAddition(placeId, role, description, emoji, buttonId); + }); } else { log.info("Assignable role place {} is not yet setup - only adding role to the database.", assignableRolePlace.getId()); self.persistAssignableRoleAddition(placeId, role, description, emoji, buttonId); @@ -174,7 +179,7 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic return channelService.retrieveMessageInChannel(assignableRolePlace.getServer().getId(), assignableRolePlace.getChannel().getId(), assignableRolePlace.getMessageId()) .thenCompose(message -> { log.debug("Updating message {} to remove component with ID {}.", message.getIdLong(), componentId); - return componentService.removeComponentWithId(message, componentId, true); + return componentService.removeComponentById(message, componentId).thenAccept(message1 -> {}); } ); } @@ -269,8 +274,8 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic log.info("Deactivating assignable role place {} in server {}", place.getId(), place.getServer().getId()); return channelService.retrieveMessageInChannel(place.getServer().getId(), place.getChannel().getId(), place.getMessageId()) .thenCompose(message -> - componentService.disableAllButtons(message) - ); + componentService.disableAllComponents(message) + ).thenAccept(message -> {}); } @Override @@ -283,8 +288,8 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic log.info("Activating assignable role place {} in server {}", place.getId(), place.getServer().getId()); return channelService.retrieveMessageInChannel(place.getServer().getId(), place.getChannel().getId(), place.getMessageId()) .thenCompose(message -> - componentService.enableAllButtons(message) - ); + componentService.enableAllComponents(message) + ).thenAccept(message -> {}); } @Override diff --git a/abstracto-application/abstracto-modules/entertainment/entertainment-impl/src/main/java/dev/sheldan/abstracto/entertainment/service/EntertainmentServiceBean.java b/abstracto-application/abstracto-modules/entertainment/entertainment-impl/src/main/java/dev/sheldan/abstracto/entertainment/service/EntertainmentServiceBean.java index ea5633b6b..303fd6b0f 100644 --- a/abstracto-application/abstracto-modules/entertainment/entertainment-impl/src/main/java/dev/sheldan/abstracto/entertainment/service/EntertainmentServiceBean.java +++ b/abstracto-application/abstracto-modules/entertainment/entertainment-impl/src/main/java/dev/sheldan/abstracto/entertainment/service/EntertainmentServiceBean.java @@ -200,8 +200,8 @@ public class EntertainmentServiceBean implements EntertainmentService { return FutureUtils.toSingleFutureGeneric(channelService.sendMessageEmbedToSendToAChannel(messageToSend, pressF.getPressFChannel())) .thenCompose(unused -> messageService.loadMessage(serverId, channelId, messageId).thenCompose(message -> { log.info("Clearing buttons from pressF {} in with message {} in channel {} in server {}.", pressFId, pressFId, channelId, serverId); - return componentService.clearButtons(message); - })); + return componentService.clearComponents(message); + })).thenAccept(message -> {}); } else { throw new AbstractoRunTimeException(String.format("PressF with id %s not found.", pressFId)); } diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/BanModerationActionModalListener.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/BanModerationActionModalListener.java index 7d05e6fb5..2ce6ab060 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/BanModerationActionModalListener.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/BanModerationActionModalListener.java @@ -61,7 +61,7 @@ public class BanModerationActionModalListener implements ModalInteractionListene .getEvent() .getValues() .stream() - .filter(modalMapping -> modalMapping.getId().equals(payload.getDurationInputId())) + .filter(modalMapping -> modalMapping.getCustomId().equals(payload.getDurationInputId())) .map(ModalMapping::getAsString) .findFirst() .orElse(null); @@ -76,7 +76,7 @@ public class BanModerationActionModalListener implements ModalInteractionListene .getEvent() .getValues() .stream() - .filter(modalMapping -> modalMapping.getId().equals(payload.getReasonInputId())) + .filter(modalMapping -> modalMapping.getCustomId().equals(payload.getReasonInputId())) .map(ModalMapping::getAsString) .findFirst() .orElse(null); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/KickModerationActionModalListener.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/KickModerationActionModalListener.java index 35b132436..f51593564 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/KickModerationActionModalListener.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/KickModerationActionModalListener.java @@ -51,7 +51,7 @@ public class KickModerationActionModalListener implements ModalInteractionListen .getEvent() .getValues() .stream() - .filter(modalMapping -> modalMapping.getId().equals(payload.getReasonInputId())) + .filter(modalMapping -> modalMapping.getCustomId().equals(payload.getReasonInputId())) .map(ModalMapping::getAsString) .findFirst() .orElse(null); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MuteModerationActionModalListener.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MuteModerationActionModalListener.java index 2d9d1492a..31d18cf04 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MuteModerationActionModalListener.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/MuteModerationActionModalListener.java @@ -59,7 +59,7 @@ public class MuteModerationActionModalListener implements ModalInteractionListen .getEvent() .getValues() .stream() - .filter(modalMapping -> modalMapping.getId().equals(payload.getReasonInputId())) + .filter(modalMapping -> modalMapping.getCustomId().equals(payload.getReasonInputId())) .map(ModalMapping::getAsString) .findFirst() .orElse(null); @@ -68,7 +68,7 @@ public class MuteModerationActionModalListener implements ModalInteractionListen .getEvent() .getValues() .stream() - .filter(modalMapping -> modalMapping.getId().equals(payload.getDurationInputId())) + .filter(modalMapping -> modalMapping.getCustomId().equals(payload.getDurationInputId())) .map(ModalMapping::getAsString) .findFirst() .orElse(null); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/WarnModerationActionModalListener.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/WarnModerationActionModalListener.java index 0f078ac4b..1f28783f0 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/WarnModerationActionModalListener.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/WarnModerationActionModalListener.java @@ -60,7 +60,7 @@ public class WarnModerationActionModalListener implements ModalInteractionListen .getEvent() .getValues() .stream() - .filter(modalMapping -> modalMapping.getId().equals(payload.getReasonInputId())) + .filter(modalMapping -> modalMapping.getCustomId().equals(payload.getReasonInputId())) .map(ModalMapping::getAsString) .findFirst() .orElse(null); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/interaction/ReportContextModalListener.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/interaction/ReportContextModalListener.java index ffde88883..48202a5f0 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/interaction/ReportContextModalListener.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/interaction/ReportContextModalListener.java @@ -43,7 +43,7 @@ public class ReportContextModalListener implements ModalInteractionListener { .getEvent() .getValues() .stream() - .filter(modalMapping -> modalMapping.getId().equals(payload.getTextInputId())) + .filter(modalMapping -> modalMapping.getCustomId().equals(payload.getTextInputId())) .map(ModalMapping::getAsString) .findFirst() .orElse(null); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/KickServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/KickServiceBean.java index cfcd1349b..7ce201d0d 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/KickServiceBean.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/KickServiceBean.java @@ -61,7 +61,9 @@ public class KickServiceBean implements KickService { public CompletableFuture kickMember(Member kickedMember, Member kickingMember, String reason) { Guild guild = kickedMember.getGuild(); log.info("Kicking user {} from guild {}", kickedMember.getUser().getIdLong(), guild.getIdLong()); - CompletableFuture kickFuture = guild.kick(kickedMember, reason).submit(); + CompletableFuture kickFuture = guild.kick(kickedMember) + .reason(reason) + .submit(); CompletableFuture logFuture = sendKickLog(kickedMember.getUser(), ServerUser.fromMember(kickedMember), kickingMember.getUser(), ServerUser.fromMember(kickingMember), reason, guild.getIdLong()); return CompletableFuture.allOf(kickFuture, logFuture) .thenAccept(unused -> self.storeInfraction(kickedMember, kickingMember, reason, logFuture.join(), guild.getIdLong())); diff --git a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/listener/ServerPollAddOptionModalListener.java b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/listener/ServerPollAddOptionModalListener.java index 3228acf5e..52dbf15ad 100644 --- a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/listener/ServerPollAddOptionModalListener.java +++ b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/listener/ServerPollAddOptionModalListener.java @@ -48,7 +48,7 @@ public class ServerPollAddOptionModalListener implements ModalInteractionListene .getEvent() .getValues() .stream() - .filter(modalMapping -> modalMapping.getId().equals(payload.getLabelInputComponentId())) + .filter(modalMapping -> modalMapping.getCustomId().equals(payload.getLabelInputComponentId())) .map(ModalMapping::getAsString) .findFirst() .orElse(null); @@ -62,7 +62,7 @@ public class ServerPollAddOptionModalListener implements ModalInteractionListene .getEvent() .getValues() .stream() - .filter(modalMapping -> modalMapping.getId().equals(payload.getDescriptionInputComponentId())) + .filter(modalMapping -> modalMapping.getCustomId().equals(payload.getDescriptionInputComponentId())) .map(ModalMapping::getAsString) .findFirst() .orElse(null); diff --git a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBean.java b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBean.java index 0fb24317b..aba60ebf7 100644 --- a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBean.java +++ b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBean.java @@ -381,8 +381,8 @@ public class SuggestionServiceBean implements SuggestionService { if(useButtons) { return messageService.loadMessage(serverId, channelId, messageId).thenCompose(message -> { log.info("Clearing buttons from suggestion {} in with message {} in channel {} in server {}.", suggestionId, message, channelId, serverId); - return componentService.clearButtons(message); - }); + return componentService.clearComponents(message); + }).thenAccept(message -> {}); } else { return CompletableFuture.completedFuture(null); } diff --git a/abstracto-application/abstracto-modules/twitch/twitch-int/pom.xml b/abstracto-application/abstracto-modules/twitch/twitch-int/pom.xml index 87040784d..d881369b2 100644 --- a/abstracto-application/abstracto-modules/twitch/twitch-int/pom.xml +++ b/abstracto-application/abstracto-modules/twitch/twitch-int/pom.xml @@ -5,6 +5,7 @@ twitch 1.6.19-SNAPSHOT + 4.0.0 twitch-int @@ -14,11 +15,10 @@ com.github.twitch4j twitch4j + + com.apollographql.apollo + apollo-runtime + - - 8 - 8 - - \ No newline at end of file diff --git a/abstracto-application/core/core-impl/pom.xml b/abstracto-application/core/core-impl/pom.xml index ee1eee99e..0e926c571 100644 --- a/abstracto-application/core/core-impl/pom.xml +++ b/abstracto-application/core/core-impl/pom.xml @@ -84,7 +84,7 @@ - io.github.freya022 + net.dv8tion JDA diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/interaction/ComponentServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/interaction/ComponentServiceBean.java index 214f72b5e..36c8403ef 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/interaction/ComponentServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/interaction/ComponentServiceBean.java @@ -1,32 +1,21 @@ package dev.sheldan.abstracto.core.interaction; import dev.sheldan.abstracto.core.interaction.button.ButtonConfigModel; -import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.MessageService; -import net.dv8tion.jda.api.entities.Message; -import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel; -import net.dv8tion.jda.api.entities.emoji.Emoji; -import net.dv8tion.jda.api.components.ActionComponent; -import net.dv8tion.jda.api.components.actionrow.ActionRow; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; import net.dv8tion.jda.api.components.buttons.Button; -import net.dv8tion.jda.api.components.buttons.ButtonStyle; -import org.apache.commons.collections4.ListUtils; +import net.dv8tion.jda.api.components.tree.MessageComponentTree; +import net.dv8tion.jda.api.entities.Message; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; - @Component public class ComponentServiceBean implements ComponentService { @Autowired private MessageService messageService; - @Autowired - private ChannelService channelService; - @Override public String generateComponentId(Long serverId) { return generateComponentId(); @@ -38,95 +27,48 @@ public class ComponentServiceBean implements ComponentService { } @Override - public CompletableFuture addButtonToMessage(Long messageId, GuildMessageChannel textChannel, String buttonId, String description, String emoteMarkdown, ButtonStyle style) { - return channelService.retrieveMessageInChannel(textChannel, messageId).thenCompose(message -> { - Button button = Button.of(style, buttonId, description); - if(emoteMarkdown != null) { - button = button.withEmoji(Emoji.fromFormatted(emoteMarkdown)); - } - List actionRows; - if(message.getActionRows().isEmpty()) { - actionRows = Arrays.asList(ActionRow.of(button)); + public CompletableFuture clearComponents(Message message) { + MessageComponentTree tree = message.getComponentTree().replace(oldComponent -> null); + return messageService.editMessage(message, tree); + } + + @Override + public CompletableFuture disableAllComponents(Message message) { + return setAllComponentStatesTo(message, true); + } + + @Override + public CompletableFuture enableAllComponents(Message message) { + return setAllComponentStatesTo(message, false); + } + + @Override + public CompletableFuture removeComponentById(Message message, String componentId) { + MessageComponentTree tree; + tree = message.getComponentTree().replace(oldComponent -> { + if (oldComponent instanceof Button && componentId.equals(((Button) oldComponent).getCustomId())) { + return null; } else { - ActionRow lastRow = message.getActionRows().get(message.getActionRows().size() - 1); - if(lastRow.getComponents().size() < MAX_BUTTONS_PER_ROW) { - lastRow.getButtons().add(button); - actionRows = message.getActionRows(); - } else { - List currentActionRows = new ArrayList<>(message.getActionRows()); - currentActionRows.add(ActionRow.of(button)); - actionRows = currentActionRows; - } + return oldComponent; } - return messageService.editMessageWithActionRowsMessage(message, actionRows); }); + return messageService.editMessage(message, tree); } - @Override - public CompletableFuture clearButtons(Message message) { - return messageService.editMessageWithActionRows(message, new ArrayList<>()); - } - - @Override - public CompletableFuture disableAllButtons(Message message) { - return setAllButtonStatesTo(message, true); - } - - @Override - public CompletableFuture enableAllButtons(Message message) { - return setAllButtonStatesTo(message, false); - } - - @Override - public CompletableFuture removeComponentWithId(Message message, String componentId) { - return removeComponentWithId(message, componentId, false); - } - - @Override - public CompletableFuture removeComponentWithId(Message message, String componentId, Boolean rearrange) { - List actionRows = new ArrayList<>(); - if(Boolean.TRUE.equals(rearrange)) { - List components = new ArrayList<>(); - message.getActionRows().forEach(row -> - row - .getComponents() - .stream() - .filter(ActionComponent.class::isInstance) - .map(ActionComponent.class::cast) - .filter(component -> component.getId() == null || !component.getId().equals(componentId)) - .forEach(components::add)); - actionRows = splitIntoActionRowsMax(components); - } else { - for (ActionRow row : message.getActionRows()) { - actionRows.add(ActionRow.of( - row - .getComponents() - .stream() - .filter(ActionComponent.class::isInstance) - .map(ActionComponent.class::cast) - .filter(component -> component.getId() == null || !component.getId().equals(componentId)) - .collect(Collectors.toList()))); - } - } - return messageService.editMessageWithActionRows(message, actionRows); - } - - @Override - public List splitIntoActionRowsMax(List allComponents) { - List> actionRows = ListUtils.partition(allComponents, MAX_BUTTONS_PER_ROW); - return actionRows.stream().map(ActionRow::of).collect(Collectors.toList()); - } @Override public ButtonConfigModel createButtonConfigModel() { return ButtonConfigModel.builder().buttonId(generateComponentId()).build(); } - private CompletableFuture setAllButtonStatesTo(Message message, Boolean disabled) { - List actionRows = new ArrayList<>(); - - message.getActionRows().forEach(row -> actionRows.add(row.withDisabled(disabled))); - return messageService.editMessageWithActionRows(message, actionRows); + private CompletableFuture setAllComponentStatesTo(Message message, Boolean disabled) { + MessageComponentTree tree; + if(disabled) { + tree = message.getComponentTree().asDisabled(); + } else { + tree = message.getComponentTree().asEnabled(); + } + return messageService.editMessage(message, tree); } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/interaction/InteractionServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/interaction/InteractionServiceBean.java index c58d7e2b4..46c1c793f 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/interaction/InteractionServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/interaction/InteractionServiceBean.java @@ -94,9 +94,9 @@ public class InteractionServiceBean implements InteractionService { if(!actionRows.isEmpty()) { AServer server = serverManagementService.loadServer(interactionHook.getInteraction().getGuild()); allMessageActions.set(0, allMessageActions.get(0).addComponents(actionRows)); - actionRows.forEach(components -> components.forEach(component -> { + actionRows.forEach(components -> components.getComponents().forEach(component -> { if(component instanceof ActionComponent) { - String id = ((ActionComponent)component).getId(); + String id = ((ActionComponent)component).getCustomId(); MessageToSend.ComponentConfig payload = messageToSend.getComponentPayloads().get(id); if(payload != null && payload.getPersistCallback()) { componentPayloadManagementService.createPayload(id, payload.getPayload(), payload.getPayloadType(), payload.getComponentOrigin(), server, payload.getComponentType()); @@ -228,9 +228,9 @@ public class InteractionServiceBean implements InteractionService { server = serverManagementService.loadServer(serverId); } else { server = null; } - actionRows.forEach(components -> components.forEach(component -> { + actionRows.forEach(components -> components.getComponents().forEach(component -> { if(component instanceof ActionComponent) { - String id = ((ActionComponent)component).getId(); + String id = ((ActionComponent)component).getCustomId(); MessageToSend.ComponentConfig payload = messageToSend.getComponentPayloads().get(id); if(payload != null && payload.getPersistCallback()) { componentPayloadManagementService.createPayload(id, payload.getPayload(), payload.getPayloadType(), payload.getComponentOrigin(), server, payload.getComponentType()); @@ -301,9 +301,9 @@ public class InteractionServiceBean implements InteractionService { } else { server = null; } - actionRows.forEach(components -> components.forEach(component -> { + actionRows.forEach(components -> components.getComponents().forEach(component -> { if(component instanceof ActionComponent) { - String id = ((ActionComponent)component).getId(); + String id = ((ActionComponent)component).getCustomId(); MessageToSend.ComponentConfig payload = messageToSend.getComponentPayloads().get(id); if(payload != null && payload.getPersistCallback()) { componentPayloadManagementService.createPayload(id, payload.getPayload(), payload.getPayloadType(), payload.getComponentOrigin(), server, payload.getComponentType()); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/interaction/modal/ModalServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/interaction/modal/ModalServiceBean.java index 0c6a47838..303e2329e 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/interaction/modal/ModalServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/interaction/modal/ModalServiceBean.java @@ -6,12 +6,12 @@ import dev.sheldan.abstracto.core.interaction.modal.config.ModalConfig; import dev.sheldan.abstracto.core.interaction.modal.config.TextInputComponent; import dev.sheldan.abstracto.core.interaction.modal.config.TextInputComponentStyle; import dev.sheldan.abstracto.core.templating.service.TemplateService; +import net.dv8tion.jda.api.components.ModalTopLevelComponent; +import net.dv8tion.jda.api.components.label.Label; import net.dv8tion.jda.api.events.interaction.command.GenericCommandInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; -import net.dv8tion.jda.api.components.actionrow.ActionRow; -import net.dv8tion.jda.api.interactions.components.ItemComponent; import net.dv8tion.jda.api.components.textinput.TextInput; -import net.dv8tion.jda.api.interactions.modals.Modal; +import net.dv8tion.jda.api.modals.Modal; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -55,29 +55,27 @@ public class ModalServiceBean implements ModalService { .build(); } - private List convertToActionRows(List components) { + private List convertToActionRows(List components) { return components .stream() .map(this::convertComponent) - .map(ActionRow::of) .collect(Collectors.toList()); } - private ItemComponent convertComponent(ModalComponent component) { + private ModalTopLevelComponent convertComponent(ModalComponent component) { if(component instanceof TextInputComponent) { TextInputComponent tic = (TextInputComponent) component; - TextInput.Builder builder = TextInput - .create(tic.getId(), tic.getLabel(), TextInputComponentStyle.getStyle(tic.getStyle())); + TextInput.Builder tiBuilder = TextInput.create(tic.getId(), TextInputComponentStyle.getStyle(tic.getStyle())); if(tic.getMinLength() != null) { - builder.setMinLength(tic.getMinLength()); + tiBuilder.setMinLength(tic.getMinLength()); } if(tic.getMaxLength() != null) { - builder.setMaxLength(tic.getMaxLength()); + tiBuilder.setMaxLength(tic.getMaxLength()); } if(tic.getRequired() != null) { - builder.setRequired(tic.getRequired()); + tiBuilder.setRequired(tic.getRequired()); } - return builder.build(); + return Label.of(tic.getLabel(), tiBuilder.build()); } return null; } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/BotServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/BotServiceBean.java index c595f9209..b6f8a3a8f 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/BotServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/BotServiceBean.java @@ -37,7 +37,7 @@ public class BotServiceBean implements BotService { @Autowired private OkHttpLogger okHttpLogger; - @Value("${abstracto.intents:GUILD_VOICE_STATES,GUILD_MODERATION,MESSAGE_CONTENT,GUILD_EMOJIS_AND_STICKERS,GUILD_MEMBERS,GUILD_MESSAGES,GUILD_MESSAGE_REACTIONS,DIRECT_MESSAGES,GUILD_PRESENCES}") + @Value("${abstracto.intents:GUILD_VOICE_STATES,GUILD_MODERATION,MESSAGE_CONTENT,GUILD_EXPRESSIONS,GUILD_MEMBERS,GUILD_MESSAGES,GUILD_MESSAGE_REACTIONS,DIRECT_MESSAGES,GUILD_PRESENCES}") private String[] intents; @Value("${abstracto.cacheFlags:ACTIVITY,ONLINE_STATUS,VOICE_STATE}") diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java index 9d16f7e29..ab3ee1c9e 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java @@ -279,9 +279,9 @@ public class ChannelServiceBean implements ChannelService { server = serverManagementService.loadServer(channel.getGuild()); } for (ActionRow row : actionRows) { - for (ActionRowChildComponent component : row) { + for (ActionRowChildComponent component : row.getComponents()) { if (component instanceof ActionComponent) { - String id = ((ActionComponent) component).getId(); + String id = ((ActionComponent) component).getCustomId(); MessageToSend.ComponentConfig payload = messageToSend.getComponentPayloads().get(id); if (payload != null && payload.getPersistCallback()) { componentPayloadManagementService.createPayload(id, payload.getPayload(), payload.getPayloadType(), payload.getComponentOrigin(), server, payload.getComponentType()); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/MessageServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/MessageServiceBean.java index ad26789e6..36b219d4d 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/MessageServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/MessageServiceBean.java @@ -12,11 +12,11 @@ import dev.sheldan.abstracto.core.utils.FutureUtils; 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.components.tree.MessageComponentTree; import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.entities.channel.concrete.PrivateChannel; import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; -import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.requests.restaction.AuditableRestAction; import net.dv8tion.jda.api.requests.restaction.MessageEditAction; import org.springframework.beans.factory.annotation.Autowired; @@ -267,14 +267,9 @@ public class MessageServiceBean implements MessageService { } @Override - public CompletableFuture editMessageWithActionRows(Message message, List rows) { - return editMessageWithActionRowsMessage(message, rows).thenApply(message1 -> null); - } - - @Override - public CompletableFuture editMessageWithActionRowsMessage(Message message, List rows) { + public CompletableFuture editMessage(Message message, MessageComponentTree componentTree) { metricService.incrementCounter(MESSAGE_EDIT_METRIC); - return message.editMessageComponents(rows).submit(); + return message.editMessageComponents(componentTree.getComponents()).submit(); } @Override diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBean.java index 9b12eeb89..f86f0a897 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBean.java @@ -47,6 +47,7 @@ import net.dv8tion.jda.api.components.mediagallery.MediaGalleryItem; import net.dv8tion.jda.api.components.section.Section; import net.dv8tion.jda.api.components.section.SectionAccessoryComponent; import net.dv8tion.jda.api.components.section.SectionContentComponent; +import net.dv8tion.jda.api.components.selections.SelectMenu; import net.dv8tion.jda.api.components.separator.Separator; import net.dv8tion.jda.api.components.textdisplay.TextDisplay; import net.dv8tion.jda.api.components.thumbnail.Thumbnail; @@ -54,7 +55,6 @@ import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.channel.ChannelType; import net.dv8tion.jda.api.components.actionrow.ActionRow; -import net.dv8tion.jda.api.interactions.components.ItemComponent; import net.dv8tion.jda.api.components.buttons.Button; import net.dv8tion.jda.api.components.selections.EntitySelectMenu; import net.dv8tion.jda.api.components.selections.SelectOption; @@ -449,7 +449,7 @@ public class TemplateServiceBean implements TemplateService { } private void addSelectionMenu(List actionRows, SelectionMenuConfig selectionMenuConfig) { - ItemComponent selectionMenu; + SelectMenu selectionMenu; if (selectionMenuConfig.getType() == SelectionMenuType.STRING) { List selectOptions = selectionMenuConfig.getMenuEntries().stream().map(selectionMenuEntry -> { SelectOption option = SelectOption.of(selectionMenuEntry.getLabel(), selectionMenuEntry.getValue()); diff --git a/abstracto-application/core/core-int/pom.xml b/abstracto-application/core/core-int/pom.xml index 64db09a68..e0aa8c84a 100644 --- a/abstracto-application/core/core-int/pom.xml +++ b/abstracto-application/core/core-int/pom.xml @@ -33,7 +33,7 @@ spring-boot-starter - io.github.freya022 + net.dv8tion JDA diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/interaction/ComponentService.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/interaction/ComponentService.java index 31ebda49e..4847134b8 100644 --- a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/interaction/ComponentService.java +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/interaction/ComponentService.java @@ -3,25 +3,20 @@ package dev.sheldan.abstracto.core.interaction; import dev.sheldan.abstracto.core.interaction.button.ButtonConfigModel; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel; -import net.dv8tion.jda.api.components.ActionComponent; import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.components.Component; import net.dv8tion.jda.api.components.buttons.ButtonStyle; -import java.util.List; import java.util.concurrent.CompletableFuture; public interface ComponentService { - Integer MAX_BUTTONS_PER_ROW = Component.Type.BUTTON.getMaxPerRow(); + Integer MAX_BUTTONS_PER_ROW = ActionRow.getMaxAllowed(Component.Type.BUTTON); String generateComponentId(Long serverId); String generateComponentId(); - CompletableFuture addButtonToMessage(Long messageId, GuildMessageChannel textChannel, String buttonId, String description, String emoteMarkdown, ButtonStyle style); - CompletableFuture clearButtons(Message message); - CompletableFuture disableAllButtons(Message message); - CompletableFuture enableAllButtons(Message message); - CompletableFuture removeComponentWithId(Message message, String componentId); - CompletableFuture removeComponentWithId(Message message, String componentId, Boolean rearrange); - List splitIntoActionRowsMax(List components); + CompletableFuture clearComponents(Message message); + CompletableFuture disableAllComponents(Message message); + CompletableFuture enableAllComponents(Message message); + CompletableFuture removeComponentById(Message message, String componentId); ButtonConfigModel createButtonConfigModel(); } diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/interaction/modal/ModalService.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/interaction/modal/ModalService.java index 0183ddc3c..e7631d958 100644 --- a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/interaction/modal/ModalService.java +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/interaction/modal/ModalService.java @@ -2,9 +2,9 @@ package dev.sheldan.abstracto.core.interaction.modal; import net.dv8tion.jda.api.events.interaction.command.GenericCommandInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; -import net.dv8tion.jda.api.interactions.modals.Modal; import java.util.concurrent.CompletableFuture; +import net.dv8tion.jda.api.modals.Modal; public interface ModalService { CompletableFuture replyModal(GenericCommandInteractionEvent event, String templateKey, Object model); diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/MessageService.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/MessageService.java index ca9a3fd43..8553f7162 100644 --- a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/MessageService.java +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/MessageService.java @@ -6,11 +6,11 @@ import dev.sheldan.abstracto.core.models.cache.CachedMessage; import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.templating.model.MessageToSend; +import net.dv8tion.jda.api.components.tree.MessageComponentTree; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; -import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.requests.restaction.AuditableRestAction; import net.dv8tion.jda.api.requests.restaction.MessageEditAction; @@ -45,7 +45,6 @@ public interface MessageService { MessageEditAction editMessage(Message message, String text, MessageEmbed messageEmbed); AuditableRestAction deleteMessageWithAction(Message message); CompletableFuture deleteMessage(Message message); - CompletableFuture editMessageWithActionRows(Message message, List rows); - CompletableFuture editMessageWithActionRowsMessage(Message message, List rows); + CompletableFuture editMessage(Message message, MessageComponentTree componentTree); CompletableFuture pinMessage(Message message); } diff --git a/abstracto-application/pom.xml b/abstracto-application/pom.xml index e37a710ed..b8b313f6f 100644 --- a/abstracto-application/pom.xml +++ b/abstracto-application/pom.xml @@ -55,7 +55,7 @@ yyyy/MM/dd HH:mm - 92f4c2d210 + 6.2.0 2.2.6 1.5.3 2.3.0 @@ -75,9 +75,11 @@ 1.31.3 v3-rev222-1.25.0 1.12.2 - 1.15.0 + 1.25.0 2.15.2 + + 4.0.0 3.10.8 6.2.5.Final 1.3.2 @@ -154,7 +156,7 @@ - io.github.freya022 + net.dv8tion JDA ${jda.version} @@ -186,6 +188,12 @@ ${twitch4j.version} + + com.apollographql.apollo + apollo-runtime + ${apollo-runtime.version} + + com.fasterxml.jackson.core jackson-databind