Compare commits

..

55 Commits

Author SHA1 Message Date
Sheldan
c791c063e3 [AB-xxx] changing the structure of starboard post model 2025-11-22 15:28:00 +01:00
release-bot
d293d764db Commit from GitHub Actions (Publishes a new version of abstracto) 2025-11-12 22:53:03 +00:00
release-bot
a7cd674cdd [maven-release-plugin] prepare for next development iteration 2025-11-12 22:39:42 +00:00
release-bot
0abefe64e9 [maven-release-plugin] prepare release v1.6.16 2025-11-12 22:39:40 +00:00
Sheldan
d1267605c1 [AB-xxx] adding roles to the model of leave logger 2025-11-12 23:33:50 +01:00
release-bot
b4ffea341c Commit from GitHub Actions (Publishes a new version of abstracto) 2025-10-12 18:28:32 +00:00
release-bot
507c755809 [maven-release-plugin] prepare for next development iteration 2025-10-12 18:15:34 +00:00
release-bot
9e0e92a530 [maven-release-plugin] prepare release v1.6.15 2025-10-12 18:15:32 +00:00
Sheldan
d078b3fa87 [AB-xxx] adding feature to suggest slash commands for message commands, if the command is slash command only 2025-10-12 20:10:14 +02:00
release-bot
71b7dd2383 Commit from GitHub Actions (Publishes a new version of abstracto) 2025-09-10 23:10:18 +00:00
release-bot
ea0384490e [maven-release-plugin] prepare for next development iteration 2025-09-10 22:56:04 +00:00
release-bot
b5dbc0b1ed [maven-release-plugin] prepare release v1.6.14 2025-09-10 22:56:02 +00:00
Sheldan
e265eb6760 [AB-xxx] adding user agent for all outgoing okhttp requests 2025-09-11 00:52:49 +02:00
release-bot
2f18b7431d Commit from GitHub Actions (Publishes a new version of abstracto) 2025-09-10 22:05:18 +00:00
release-bot
2d8827fa81 [maven-release-plugin] prepare for next development iteration 2025-09-10 21:53:38 +00:00
release-bot
dddeb15127 [maven-release-plugin] prepare release v1.6.13 2025-09-10 21:53:37 +00:00
Sheldan
78fbe0723b [AB-xxx] actively restricting length of slash command parameters if a validator is configured for the parameter (more easy solution than a separate one) 2025-09-10 23:46:39 +02:00
release-bot
e1d4a41d60 Commit from GitHub Actions (Publishes a new version of abstracto) 2025-08-04 18:59:22 +00:00
release-bot
354a82f806 [maven-release-plugin] prepare for next development iteration 2025-08-04 18:43:45 +00:00
release-bot
ff3e3d85ba [maven-release-plugin] prepare release v1.6.12 2025-08-04 18:43:43 +00:00
Sheldan
46bf4fbc42 [AB-xxx] changing the method used to edit the giveaway message 2025-08-02 00:06:43 +02:00
Sheldan
97ac25dbb6 [AB-xxx] adding auto complete for feature names/feature mode names 2025-08-01 23:52:15 +02:00
Sheldan
ef4bdb2ab2 [AB-xxx] enabling commands which take users to only require one parameter instead of a string and a member option 2025-07-29 23:04:33 +02:00
release-bot
433fdb7068 Commit from GitHub Actions (Publishes a new version of abstracto) 2025-07-20 09:04:03 +00:00
release-bot
e59b6269e1 [maven-release-plugin] prepare for next development iteration 2025-07-20 08:49:59 +00:00
release-bot
8077501584 [maven-release-plugin] prepare release v1.6.11 2025-07-20 08:49:57 +00:00
Sheldan
cb9ab8f542 [AB-xxx] adding ability to define unique ids for components, a color of the container, disabled state for multiple components and spoiler for container
fixing reminder message not containing a link to the message anymore
2025-07-19 23:56:06 +02:00
release-bot
f513f8890b Commit from GitHub Actions (Publishes a new version of abstracto) 2025-07-13 20:08:48 +00:00
release-bot
6f02834b75 [maven-release-plugin] prepare for next development iteration 2025-07-13 19:56:17 +00:00
release-bot
75456b45c9 [maven-release-plugin] prepare release v1.6.10 2025-07-13 19:56:15 +00:00
Sheldan
92e581305e [AB-xxx] changing logic to replace embedded messages with the link instead of removing the reaction/button for deletion 2025-07-13 21:52:37 +02:00
release-bot
bd8b57e977 Commit from GitHub Actions (Publishes a new version of abstracto) 2025-07-13 18:05:19 +00:00
release-bot
e5fc411dc2 [maven-release-plugin] prepare for next development iteration 2025-07-13 17:52:51 +00:00
release-bot
9d9fdef42e [maven-release-plugin] prepare release v1.6.9 2025-07-13 17:52:49 +00:00
Sheldan
4a3d43b1b0 [AB-xxx] adding initial support for components v2
fixing issue with buttons which only provide an emoji
adding logging in case updating a starboard post goes wrong
2025-07-13 19:45:59 +02:00
release-bot
15d41c58ef Commit from GitHub Actions (Publishes a new version of abstracto) 2025-05-29 20:16:51 +00:00
release-bot
ad863af5d6 [maven-release-plugin] prepare for next development iteration 2025-05-29 20:05:41 +00:00
release-bot
f3dae2f6a3 [maven-release-plugin] prepare release v1.6.8 2025-05-29 20:05:40 +00:00
Sheldan
9f9c0612eb [AB-xxx] fixing youtube sometimes not returning videos even if specified 2025-05-29 22:00:45 +02:00
Sheldan
db73071a71 [AB-xxx] updating JDA version 2025-04-26 13:11:36 +02:00
Sheldan
d7125fbf25 [AB-xxx] adding input to response model for 8ball and choose command 2025-04-26 13:09:34 +02:00
release-bot
fd3bf41406 Commit from GitHub Actions (Publishes a new version of abstracto) 2025-04-01 11:47:09 +00:00
release-bot
d1abe194ec [maven-release-plugin] prepare for next development iteration 2025-04-01 11:37:04 +00:00
release-bot
79477923c6 [maven-release-plugin] prepare release v1.6.7 2025-04-01 11:37:03 +00:00
Sheldan
be9ffa3045 [AB-xxx] updating postgres driver version 2025-04-01 13:34:34 +02:00
release-bot
e29ceb9243 [maven-release-plugin] prepare for next development iteration 2025-03-31 21:49:19 +00:00
release-bot
70acf46cfd [maven-release-plugin] prepare release v1.6.6 2025-03-31 21:49:17 +00:00
Sheldan
022603ae3b [AB-xxx] updating JDA version in readme 2025-03-31 23:46:56 +02:00
release-bot
264082d63d [maven-release-plugin] prepare for next development iteration 2025-03-31 21:32:13 +00:00
release-bot
3e9d53feee [maven-release-plugin] prepare release v1.6.5 2025-03-31 21:32:11 +00:00
Sheldan
6c9cb39ad6 [AB-xxx] merging user and guild reminders for handling in reminders and unremind command
fixing issue with creating reminder in DMs
2025-03-31 23:29:33 +02:00
Sheldan
899afa82c4 [AB-xxx] updating JDA to receive DM command fix 2025-03-31 22:15:00 +02:00
Sheldan
2a357cf09f [AB-xxx] adding clearing existing roles or newly added roles if a member receives the honey pot role 2025-02-27 19:20:00 +01:00
release-bot
1aeb3b56cb Commit from GitHub Actions (Publishes a new version of abstracto) 2025-02-23 20:28:39 +00:00
release-bot
05c3f1ac01 [maven-release-plugin] prepare for next development iteration 2025-02-23 20:17:35 +00:00
186 changed files with 1925 additions and 563 deletions

2
.env
View File

@@ -1,2 +1,2 @@
REGISTRY_PREFIX=harbor.sheldan.dev/abstracto/
VERSION=1.6.3
VERSION=1.6.16

View File

@@ -11,7 +11,7 @@ This repository does not provide the full functionality in order to start a disc
## Technologies
* [JDA](https://github.com/DV8FromTheWorld/JDA/) The Discord API Wrapper in the version 5.0.0-beta.21
* [JDA](https://github.com/DV8FromTheWorld/JDA/) The Discord API Wrapper in the version 5.4.0
* [Spring boot](https://github.com/spring-projects/spring-boot) is used as a framework to create standalone application in Java with Java EE methods. (including dependency injection and more)
* [Hibernate](https://github.com/hibernate/hibernate-orm) is used as a reference implementation of JPA.
* [Freemarker](https://github.com/apache/freemarker) is used as a templating engine. This is used to provide internationalization for user facing text and enable dynamic embed configuration.
@@ -30,4 +30,4 @@ If you want to view the documentation to an earlier released version you need to
If you find any issue, feel free to create a GitHub issue.
## License
This project is licensed under the MIT license.
This project is licensed under the MIT license.

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>anti-raid</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>anti-raid</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>assignable-roles</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -74,7 +74,7 @@ public class CreateAssignableRolePlace extends AbstractConditionableCommand {
@Override
public CommandConfiguration getConfiguration() {
List<ParameterValidator> rolePlaceNameValidator = Arrays.asList(MaxStringLengthValidator.max(AssignableRolePlace.ASSIGNABLE_PLACE_NAME_LIMIT));
List<ParameterValidator> rolePlaceNameValidator = Arrays.asList(MaxStringLengthValidator.max(AssignableRolePlace.ASSIGNABLE_PLACE_NAME_LIMIT.intValue()));
Parameter rolePostName = Parameter
.builder()
.name(ASSIGNABLE_ROLE_PLACE_NAME_PARAMETER)
@@ -95,7 +95,7 @@ public class CreateAssignableRolePlace extends AbstractConditionableCommand {
.templated(true)
.optional(true)
.build();
List<ParameterValidator> rolePlaceDescriptionValidator = Arrays.asList(MaxStringLengthValidator.max(AssignableRolePlace.ASSIGNABLE_PLACE_NAME_LIMIT));
List<ParameterValidator> rolePlaceDescriptionValidator = Arrays.asList(MaxStringLengthValidator.max(AssignableRolePlace.ASSIGNABLE_PLACE_NAME_LIMIT.intValue()));
Parameter text = Parameter
.builder()
.name(ASSIGNABLE_ROLE_PLACE_TEXT_PARAMETER)

View File

@@ -31,7 +31,7 @@ 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.interactions.components.buttons.ButtonStyle;
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;

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>assignable-roles</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>assignable-roles-int</artifactId>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>abstracto-modules</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>custom-command</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>custom-command</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>dynamic-activity</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>dynamic-activity</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>entertainment</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -52,6 +52,7 @@ public class Choose extends AbstractConditionableCommand {
String choice = entertainmentService.takeChoice(choices, commandContext.getAuthor());
ChooseResponseModel responseModel = ChooseResponseModel
.builder()
.choices(choices)
.chosenValue(choice)
.build();
return FutureUtils.toSingleFutureGeneric(channelService.sendEmbedTemplateInMessageChannel(CHOOSE_RESPONSE_TEMPLATE_KEY, responseModel, commandContext.getChannel()))
@@ -70,6 +71,7 @@ public class Choose extends AbstractConditionableCommand {
String choice = entertainmentService.takeChoice(choices, event.getMember());
ChooseResponseModel responseModel = ChooseResponseModel
.builder()
.choices(choices)
.chosenValue(choice)
.build();
return interactionService.replyEmbed(CHOOSE_RESPONSE_TEMPLATE_KEY, responseModel, event)

View File

@@ -56,6 +56,7 @@ public class EightBall extends AbstractConditionableCommand {
String chosenKey = entertainmentService.getEightBallValue(text);
EightBallResponseModel responseModel = EightBallResponseModel
.builder()
.input(text)
.chosenKey(chosenKey)
.build();
return templateService.renderEmbedTemplate(EIGHT_BALL_RESPONSE_TEMPLATE_KEY, responseModel, serverId);

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>entertainment</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.entertainment.model.command;
import java.util.List;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@@ -9,4 +10,5 @@ import lombok.Setter;
@Builder
public class ChooseResponseModel {
private String chosenValue;
private List<String> choices;
}

View File

@@ -9,4 +9,5 @@ import lombok.Setter;
@Builder
public class EightBallResponseModel {
private String chosenKey;
private String input;
}

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>experience-tracking</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -97,7 +97,7 @@ public class LeaderBoardCommand extends AbstractConditionableCommand {
} else {
leaderBoard = userExperienceService.findLeaderBoardData(server, page);
}
List<CompletableFuture> futures = new ArrayList<>();
List<CompletableFuture<?>> futures = new ArrayList<>();
CompletableFuture<List<LeaderBoardEntryModel>> completableFutures = converter.fromLeaderBoard(leaderBoard, actorUser.getGuild().getIdLong());
futures.add(completableFutures);
log.info("Rendering leaderboard for page {} in server {} for user {}.", page, actorUser.getId(), actorUser.getGuild().getId());
@@ -158,7 +158,6 @@ public class LeaderBoardCommand extends AbstractConditionableCommand {
Parameter focusMe = Parameter
.builder()
.name(FOCUS_PARAMETER)
.validators(leaderBoardPageValidators)
.optional(true)
.slashCommandOnly(true)
.templated(true)

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>experience-tracking</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>abstracto-modules</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>giveaway</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<artifactId>giveaway-impl</artifactId>

View File

@@ -155,7 +155,7 @@ public class GiveawayServiceBean implements GiveawayService {
Long giveawayId = giveaway.getGiveawayId().getId();
log.info("Adding giveaway participating of user {} to giveaway {} in server {}.", member.getIdLong(), giveawayId, member.getGuild().getIdLong());
MessageToSend messageToSend = templateService.renderEmbedTemplate(GIVEAWAY_MESSAGE_TEMPLATE_KEY, giveawayMessageModel, member.getGuild().getIdLong());
return channelService.editEmbedMessageInAChannel(messageToSend.getEmbeds().get(0), messageChannel, giveaway.getMessageId())
return channelService.editMessageInAChannelFuture(messageToSend, messageChannel, giveaway.getMessageId())
.thenAccept(message -> {
self.persistAddedParticipant(member, giveawayId);
});

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>giveaway</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<artifactId>giveaway-int</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>abstracto-modules</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<artifactId>giveaway</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<artifactId>image-generation</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<artifactId>image-generation-impl</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<artifactId>image-generation</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<artifactId>image-generation-int</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>abstracto-modules</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<artifactId>image-generation</artifactId>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>invite-filter</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>invite-filter</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -18,7 +18,7 @@
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>moderation-int</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>link-embed</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -11,6 +11,7 @@ import dev.sheldan.abstracto.core.interaction.button.ButtonConfigModel;
import dev.sheldan.abstracto.core.interaction.ComponentPayloadManagementService;
import dev.sheldan.abstracto.linkembed.config.LinkEmbedFeatureDefinition;
import dev.sheldan.abstracto.linkembed.config.LinkEmbedFeatureMode;
import dev.sheldan.abstracto.linkembed.model.template.MessageEmbedCleanupReplacementModel;
import dev.sheldan.abstracto.linkembed.model.template.MessageEmbedDeleteButtonPayload;
import dev.sheldan.abstracto.linkembed.model.template.MessageEmbeddedModel;
import dev.sheldan.abstracto.core.service.*;
@@ -18,7 +19,6 @@ import dev.sheldan.abstracto.core.service.management.ServerManagementService;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
import dev.sheldan.abstracto.core.templating.service.TemplateService;
import dev.sheldan.abstracto.core.utils.CompletableFutureList;
import dev.sheldan.abstracto.core.utils.FutureUtils;
import dev.sheldan.abstracto.linkembed.model.MessageEmbedLink;
import dev.sheldan.abstracto.linkembed.model.database.EmbeddedMessage;
@@ -28,6 +28,7 @@ import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel;
import net.dv8tion.jda.api.interactions.commands.CommandInteraction;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@@ -49,6 +50,7 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
private final Pattern messageRegex = Pattern.compile("(?<whole>(?:https?://)?(?:\\w+\\.)?discord(?:app)?\\.com/channels/(?<server>\\d+)/(?<channel>\\d+)/(?<message>\\d+)(?:.*?))+", Pattern.CASE_INSENSITIVE);
public static final String MESSAGE_EMBED_TEMPLATE = "message_embed";
private static final String MESSAGE_EMBED_CLEANUP_REPLACEMENT_TEMPLATE = "message_embed_cleanup_replacement";
public static final String REMOVAL_EMOTE = "removeEmbed";
@Autowired
@@ -78,9 +80,6 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
@Autowired
private ReactionService reactionService;
@Autowired
private MessageService messageService;
@Autowired
private ComponentService componentServiceBean;
@@ -160,15 +159,21 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
return CompletableFuture.completedFuture(null);
}
log.info("Cleaning up {} embedded embeddedMessages", embeddedMessages.size());
List<ServerChannelMessage> reactionChannelMessages = embeddedMessages.stream()
.filter(embeddedMessage -> embeddedMessage.getDeletionComponentId() == null)
.map(this::convertEmbedMessageToServerChannelMessage)
.collect(Collectors.toList());
List<Pair<ServerChannelMessage, ServerChannelMessage>> embeddingMessages = embeddedMessages.stream()
.map(embeddedMessage -> Pair.of(ServerChannelMessage
.builder()
.serverId(embeddedMessage.getEmbeddingServer().getId())
.channelId(embeddedMessage.getEmbeddingChannel().getId())
.messageId(embeddedMessage.getEmbeddingMessageId())
.build(),
ServerChannelMessage
.builder().
serverId(embeddedMessage.getEmbeddedServer().getId())
.channelId(embeddedMessage.getEmbeddedChannel().getId())
.messageId(embeddedMessage.getEmbeddedMessageId())
.build()))
.toList();
List<ServerChannelMessage> buttonChannelMessages = embeddedMessages.stream()
.filter(embeddedMessage -> embeddedMessage.getDeletionComponentId() != null)
.map(this::convertEmbedMessageToServerChannelMessage)
.collect(Collectors.toList());
List<Long> embeddedMessagesHandled = embeddedMessages
.stream()
.map(EmbeddedMessage::getEmbeddingMessageId)
@@ -179,67 +184,26 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
List<CompletableFuture<Message>> reactionMessageFutures = messageService.retrieveMessages(reactionChannelMessages);
List<CompletableFuture<Message>> buttonMessageFutures = messageService.retrieveMessages(buttonChannelMessages);
CompletableFutureList<Message> reactionFutureList = new CompletableFutureList<>(reactionMessageFutures);
CompletableFutureList<Message> buttonFutureList = new CompletableFutureList<>(buttonMessageFutures);
return reactionFutureList.getMainFuture()
.handle((unused, throwable) -> {
if(throwable != null) {
log.warn("Embedded messages reaction message loading failed.", throwable);
}
return self.removeReactions(reactionFutureList.getObjects());
})
.thenCompose(Function.identity())
.thenCompose(unused -> buttonFutureList.getMainFuture())
.handle((unused, throwable) -> {
if(throwable != null) {
log.warn("Embedded messages button message loading failed.", throwable);
}
return self.removeButtons(buttonFutureList.getObjects());
})
// deleting the messages from db regardless of exceptions, at most the reaction remains
.thenCompose(Function.identity())
.whenComplete((unused, throwable) -> {
if(throwable != null) {
log.warn("Embedded message button clearing failed.", throwable);
}
self.deleteEmbeddedMessages(embeddedMessagesHandled, componentPayloadsToDelete);
})
.exceptionally(throwable -> {
log.error("Failed to clean up embedded messages.", throwable);
return null;
});
}
public CompletableFuture<Void> removeButtons(List<Message> messages) {
List<CompletableFuture<Void>> removalFutures = new ArrayList<>();
messages.forEach(message -> removalFutures.add(componentServiceBean.clearButtons(message)));
return FutureUtils.toSingleFutureGeneric(removalFutures);
}
private ServerChannelMessage convertEmbedMessageToServerChannelMessage(EmbeddedMessage embeddedMessage) {
return ServerChannelMessage
List<CompletableFuture<Message>> editList = embeddingMessages.stream().map(messagePair -> {
ServerChannelMessage embeddingMessage = messagePair.getLeft();
ServerChannelMessage embeddedMessage = messagePair.getRight();
MessageEmbedCleanupReplacementModel model = MessageEmbedCleanupReplacementModel
.builder()
.serverId(embeddedMessage.getEmbeddingServer().getId())
.channelId(embeddedMessage.getEmbeddingChannel().getId())
.messageId(embeddedMessage.getEmbeddingMessageId())
.message(embeddedMessage)
.build();
MessageToSend messageToSend =
templateService.renderEmbedTemplate(MESSAGE_EMBED_CLEANUP_REPLACEMENT_TEMPLATE, model, embeddingMessage.getServerId());
return channelService.editMessageInAChannelFuture(messageToSend, embeddingMessage.getServerId(), embeddingMessage.getChannelId(),
embeddingMessage.getMessageId());
}).toList();
return FutureUtils.toSingleFutureGeneric(editList).whenComplete((unused, throwable) -> {
if(throwable != null) {
log.warn("Failed to cleanup embedded messages..", throwable);
}
self.deleteEmbeddedMessages(embeddedMessagesHandled, componentPayloadsToDelete);
});
}
@Transactional
public CompletableFuture<Void> removeReactions(List<Message> allMessages) {
List<CompletableFuture<Void>> removalFutures = new ArrayList<>();
Map<Long, List<Message>> groupedPerServer = allMessages
.stream()
.collect(Collectors.groupingBy(message -> message.getGuild().getIdLong()));
groupedPerServer.forEach((serverId, serverMessages) -> {
// we assume the emote remained the same
CompletableFutureList<Void> removalFuture = reactionService.removeReactionFromMessagesWithFutureWithFutureList(serverMessages, REMOVAL_EMOTE);
removalFutures.add(removalFuture.getMainFuture());
});
return FutureUtils.toSingleFutureGeneric(removalFutures);
}
@Transactional
public void deleteEmbeddedMessages(List<Long> embeddedMessagesToDelete, List<String> componentPayloadsToDelete) {
@@ -357,7 +321,9 @@ public class MessageEmbedServiceBean implements MessageEmbedService {
private Boolean shouldMentionReferencedAuthor(Message message) {
if(message.getReferencedMessage() != null) {
return message.getMentions().getMentions(Message.MentionType.USER).contains(message.getReferencedMessage().getAuthor());
return message.getMentions().getMentions(Message.MentionType.USER)
.stream()
.anyMatch(user -> message.getReferencedMessage().getAuthor().getIdLong() == user.getIdLong());
}
return false;
}

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>link-embed</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -0,0 +1,11 @@
package dev.sheldan.abstracto.linkembed.model.template;
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
public class MessageEmbedCleanupReplacementModel {
private ServerChannelMessage message;
}

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>logging</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,6 +5,7 @@ import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
import dev.sheldan.abstracto.core.listener.async.jda.AsyncLeaveListener;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.listener.MemberLeaveModel;
import dev.sheldan.abstracto.core.models.template.display.RoleDisplay;
import dev.sheldan.abstracto.core.models.template.display.UserDisplay;
import dev.sheldan.abstracto.core.service.PostTargetService;
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
@@ -13,6 +14,7 @@ import dev.sheldan.abstracto.core.utils.FutureUtils;
import dev.sheldan.abstracto.logging.config.LoggingFeatureDefinition;
import dev.sheldan.abstracto.logging.config.LoggingPostTarget;
import dev.sheldan.abstracto.logging.model.template.MemberLeaveLogModel;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -41,10 +43,17 @@ public class LeaveLogger implements AsyncLeaveListener {
.userId(listenerModel.getUser().getIdLong())
.serverId(listenerModel.getServerId())
.build();
List<RoleDisplay> roles = listenerModel
.getMember()
.getRoles()
.stream()
.map(RoleDisplay::fromRole)
.toList();
MemberLeaveLogModel model = MemberLeaveLogModel
.builder()
.leavingUser(leavingUser)
.user(UserDisplay.fromUser(listenerModel.getUser()))
.roles(roles)
.build();
log.debug("Logging leave event for user {} in server {}.", listenerModel.getUser().getIdLong(), listenerModel.getServerId());
MessageToSend messageToSend = templateService.renderEmbedTemplate(USER_LEAVE_TEMPLATE, model, listenerModel.getServerId());

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>logging</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -1,7 +1,9 @@
package dev.sheldan.abstracto.logging.model.template;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.template.display.RoleDisplay;
import dev.sheldan.abstracto.core.models.template.display.UserDisplay;
import java.util.List;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@@ -12,4 +14,5 @@ import lombok.Setter;
public class MemberLeaveLogModel {
private ServerUser leavingUser;
private UserDisplay user;
private List<RoleDisplay> roles;
}

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>moderation</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,6 @@ import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.InteractionHook;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -76,16 +75,15 @@ public class Ban extends AbstractConditionableCommand {
duration = null;
}
if(slashCommandParameterService.hasCommandOptionWithFullType(USER_PARAMETER, event, OptionType.USER)) {
Member member = slashCommandParameterService.getCommandOption(USER_PARAMETER, event, User.class, Member.class);
Member member = slashCommandParameterService.getCommandOption(USER_PARAMETER, event, User.class, Member.class);
if(member != null) {
return event.deferReply().submit()
.thenCompose((hook) -> self.banMember(event, member, reason, duration, hook))
.thenApply(commandResult -> CommandResult.fromSuccess());
} else {
String userIdStr = slashCommandParameterService.getCommandOption(USER_PARAMETER, event, User.class, String.class);
Long userId = Long.parseLong(userIdStr);
User user = slashCommandParameterService.getCommandOption(USER_PARAMETER, event, User.class, User.class);
return event.deferReply().submit()
.thenCompose((hook) -> self.banViaUserId(event, userId, reason, duration, hook))
.thenCompose((hook) -> self.banViaUserId(event, user.getIdLong(), reason, duration, hook))
.thenApply(commandResult -> CommandResult.fromSuccess());
}
}

View File

@@ -33,7 +33,6 @@ import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.InteractionHook;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -86,16 +85,15 @@ public class Infractions extends AbstractConditionableCommand {
public CompletableFuture<CommandResult> showInfractions(InteractionHook hook, SlashCommandInteractionEvent event) {
List<Infraction> infractions;
Guild guild = hook.getInteraction().getGuild();
if(slashCommandParameterService.hasCommandOptionWithFullType(USER_PARAMETER, event, OptionType.USER)) {
Member member = slashCommandParameterService.getCommandOption(USER_PARAMETER, event, User.class, Member.class);
Member member = slashCommandParameterService.getCommandOption(USER_PARAMETER, event, User.class, Member.class);
User user = slashCommandParameterService.getCommandOption(USER_PARAMETER, event, User.class, User.class);
if(member != null) {
if(!member.getGuild().equals(guild)) {
throw new EntityGuildMismatchException();
}
infractions = infractionManagementService.getInfractionsForUser(userInServerManagementService.loadOrCreateUser(member));
} else if(slashCommandParameterService.hasCommandOptionWithFullType(USER_PARAMETER, event, OptionType.STRING)){
String userIdStr = slashCommandParameterService.getCommandOption(USER_PARAMETER, event, User.class, String.class);
Long userId = Long.parseLong(userIdStr);
AUserInAServer userInServer = userInServerManagementService.loadOrCreateUser(guild.getIdLong(), userId);
} else if(user != null){
AUserInAServer userInServer = userInServerManagementService.loadOrCreateUser(guild.getIdLong(), user.getIdLong());
infractions = infractionManagementService.getInfractionsForUser(userInServer);
} else {

View File

@@ -12,6 +12,7 @@ import dev.sheldan.abstracto.core.models.template.display.MemberDisplay;
import dev.sheldan.abstracto.core.models.template.display.RoleDisplay;
import dev.sheldan.abstracto.core.service.ConditionService;
import dev.sheldan.abstracto.core.service.ConfigService;
import dev.sheldan.abstracto.core.service.RoleService;
import dev.sheldan.abstracto.core.service.SystemCondition;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.core.templating.service.TemplateService;
@@ -19,7 +20,11 @@ import dev.sheldan.abstracto.moderation.config.feature.HoneyPotFeatureConfig;
import dev.sheldan.abstracto.moderation.config.feature.ModerationFeatureDefinition;
import dev.sheldan.abstracto.moderation.model.listener.HoneyPotReasonModel;
import dev.sheldan.abstracto.moderation.service.BanService;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.ISnowflake;
import net.dv8tion.jda.api.entities.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -49,6 +54,9 @@ public class HoneyPotRoleAddedListener implements RoleAddedListener {
@Autowired
private UserInServerManagementService userInServerManagementService;
@Autowired
private RoleService roleService;
private static final String HONEYPOT_BAN_REASON_TEMPLATE = "honeypot_ban_reason";
private static final String LEVEL_CONDITION_USER_ID_PARAMETER = "userId";
@@ -59,18 +67,19 @@ public class HoneyPotRoleAddedListener implements RoleAddedListener {
@Override
public DefaultListenerResult execute(RoleAddedModel model) {
Long roleId = configService.getLongValueOrConfigDefault(HoneyPotFeatureConfig.HONEYPOT_ROLE_ID, model.getServerId());
if(roleId == 0) {
Long honeyPotRoleId = configService.getLongValueOrConfigDefault(HoneyPotFeatureConfig.HONEYPOT_ROLE_ID, model.getServerId());
if(honeyPotRoleId == 0) {
log.info("Server {} has honeypot feature enabled, but still default honeypot role config - Ignoring.", model.getServerId());
return DefaultListenerResult.IGNORED;
}
if(roleId.equals(model.getRoleId())) {
if(honeyPotRoleId.equals(model.getRoleId())) {
Integer levelToSkipBan = configService.getLongValueOrConfigDefault(HoneyPotFeatureConfig.HONEYPOT_IGNORED_LEVEL, model.getServerId()).intValue();
Long amountOfSecondsToIgnore = configService.getLongValueOrConfigDefault(HoneyPotFeatureConfig.HONEYPOT_IGNORED_JOIN_DURATION_SECONDS, model.getServerId());
boolean allowed = userHasLevel(model.getTargetMember(), levelToSkipBan) || userJoinedLongerThanSeconds(model.getTargetMember(), amountOfSecondsToIgnore);
if(allowed) {
log.info("User {} in server {} has at least level {} or joined more than {} seconds ago and will not get banned by honeypot.",
model.getTargetUser().getUserId(), model.getTargetUser().getServerId(), levelToSkipBan, amountOfSecondsToIgnore);
log.info("User {} in server {} has at least level {} or joined more than {} seconds ago and will not get banned by honeypot. All existing roles besides {} will be removed.",
model.getTargetUser().getUserId(), model.getTargetUser().getServerId(), levelToSkipBan, amountOfSecondsToIgnore, honeyPotRoleId);
cleanupRolesBesidesHoneyPot(model, honeyPotRoleId);
} else {
log.info("Banning user {} in guild {} due to role {}.", model.getTargetUser().getUserId(), model.getTargetUser().getServerId(), model.getRoleId());
HoneyPotReasonModel reasonModel = HoneyPotReasonModel
@@ -88,10 +97,35 @@ public class HoneyPotRoleAddedListener implements RoleAddedListener {
});
}
return DefaultListenerResult.PROCESSED;
} else {
boolean targetMemberHasHoneypotRole = model.getTargetMember().getRoles().stream().anyMatch(role -> role.getIdLong() == honeyPotRoleId);
log.info("User {} in server {} received another role, which was not honeypot role -> remove all other roles.", model.getTargetUser().getUserId(), model.getTargetUser().getServerId());
if(targetMemberHasHoneypotRole) {
cleanupRolesBesidesHoneyPot(model, honeyPotRoleId);
}
}
return DefaultListenerResult.IGNORED;
}
private void cleanupRolesBesidesHoneyPot(RoleAddedModel model, Long roleId) {
List<Long> rolesToRemove = model
.getTargetMember()
.getRoles()
.stream().map(ISnowflake::getIdLong)
.filter(idLong -> !idLong.equals(roleId))
.collect(Collectors.toList());
if(!rolesToRemove.isEmpty()) {
roleService.updateRolesIds(model.getTargetMember(), rolesToRemove, new ArrayList<>()).thenAccept(unused -> {
log.info("Removed {} roles from user {} in server {}.", rolesToRemove.size(), model.getTargetUser().getUserId(), model.getTargetUser().getServerId());
}).exceptionally(throwable -> {
log.warn("Failed to cleanup roles {} from user {} in server {}.", rolesToRemove.size(), model.getTargetUser().getUserId(), model.getTargetUser().getServerId(), throwable);
return null;
});
} else {
log.info("No other roles found.");
}
}
private boolean userHasLevel(Member member, Integer level) {
log.info("Checking if member {} is ignored to click on the honeypot in server {}.", member.getIdLong(),member.getGuild().getIdLong());
Map<String, Object> parameters = new HashMap<>();

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>moderation</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>abstracto-modules</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>modmail</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>modmail</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>abstracto-modules</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto</groupId>
<artifactId>abstracto-application</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>profanity-filter</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>profanity-filter</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>remind</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -126,7 +126,6 @@ public class Remind extends AbstractConditionableCommand {
String durationString = slashCommandParameterService.getCommandOption(DURATION_PARAMETER, event, Duration.class, String.class);
Duration duration = ParseUtils.parseDuration(durationString);
String reminderText = null;
Long serverId = event.getGuild().getIdLong();
if(slashCommandParameterService.hasCommandOption(REMIND_TEXT_PARAMETER, event)) {
reminderText = slashCommandParameterService.getCommandOption(REMIND_TEXT_PARAMETER, event, String.class, String.class);
}
@@ -151,6 +150,7 @@ public class Remind extends AbstractConditionableCommand {
.build();
if(ContextUtils.isNotUserCommand(event)) {
Long serverId = event.getGuild().getIdLong();
AServer server = serverManagementService.loadServer(serverId);
JoinReminderPayload payload = JoinReminderPayload
.builder()
@@ -161,8 +161,6 @@ public class Remind extends AbstractConditionableCommand {
componentPayloadService.createButtonPayload(joinButtonId, payload, REMINDER_JOIN_BUTTON_ORIGIN, server);
}
log.info("Notifying user {} about reminder being scheduled.", event.getUser().getId());
MessageToSend messageToSend = templateService.renderEmbedTemplate(REMINDER_EMBED_KEY, remindModel, ContextUtils.serverIdOrNull(event));
return interactionService.replyMessageToSend(messageToSend, event)

View File

@@ -9,6 +9,7 @@ import dev.sheldan.abstracto.core.interaction.slash.SlashCommandConfig;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.core.interaction.InteractionService;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.models.template.display.UserDisplay;
@@ -25,7 +26,9 @@ import dev.sheldan.abstracto.remind.model.template.commands.ReminderDisplay;
import dev.sheldan.abstracto.remind.model.template.commands.RemindersModel;
import dev.sheldan.abstracto.remind.service.management.ReminderManagementService;
import dev.sheldan.abstracto.remind.service.management.ReminderParticipantManagementService;
import java.util.ArrayList;
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.User;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
@@ -61,11 +64,22 @@ public class Reminders extends AbstractConditionableCommand {
private MessageToSend getServerReminders(Long serverId, Member member) {
AUserInAServer aUserInAServer = userInServerManagementService.loadOrCreateUser(member);
List<ReminderDisplay> reminders = getRemindersForUserInServer(aUserInAServer);
RemindersModel model = RemindersModel
.builder()
.reminders(reminders)
.userDisplay(UserDisplay.fromUser(member.getUser()))
.build();
return templateService.renderEmbedTemplate(REMINDERS_RESPONSE_TEMPLATE, model, serverId);
}
private List<ReminderDisplay> getRemindersForUserInServer(AUserInAServer aUserInAServer) {
List<Reminder> activeReminders = reminderManagementService.getActiveRemindersForUser(aUserInAServer);
log.info("Showing {} reminders for user {} in server {}.", activeReminders.size(), aUserInAServer.getUserReference().getId(), aUserInAServer.getServerReference().getId());
List<Reminder> joinedReminders = reminderParticipantManagementService.getActiveReminders(aUserInAServer)
.stream()
.map(ReminderParticipant::getReminder)
.collect(Collectors.toList());
.toList();
List<ReminderDisplay> reminders = activeReminders
.stream()
.map(ReminderDisplay::fromReminder)
@@ -74,23 +88,25 @@ public class Reminders extends AbstractConditionableCommand {
.stream()
.map(ReminderDisplay::fromReminder)
.peek(reminderDisplay -> reminderDisplay.setJoined(true))
.collect(Collectors.toList()));
RemindersModel model = RemindersModel
.builder()
.reminders(reminders)
.userDisplay(UserDisplay.fromUser(member.getUser()))
.build();
log.info("Showing {} reminders for user {} in server {}.", activeReminders.size(), aUserInAServer.getUserReference().getId(), serverId);
return templateService.renderEmbedTemplate(REMINDERS_RESPONSE_TEMPLATE, model, serverId);
.toList());
return reminders;
}
private MessageToSend getUserReminders(User user) {
private MessageToSend getUserReminders(User user, Guild guild) {
AUser aUser = userManagementService.loadOrCreateUser(user.getIdLong());
List<ReminderDisplay> remindersFromServer;
if(guild != null) {
AUserInAServer aUserInAServer = userInServerManagementService.loadOrCreateUser(ServerUser.fromId(guild.getIdLong(), user.getIdLong()));
remindersFromServer = getRemindersForUserInServer(aUserInAServer);
} else {
remindersFromServer = new ArrayList<>();
}
List<Reminder> activeReminders = reminderManagementService.getActiveUserRemindersForUser(aUser);
List<ReminderDisplay> reminders = activeReminders
.stream()
.map(ReminderDisplay::fromReminder)
.collect(Collectors.toList());
reminders.addAll(remindersFromServer);
RemindersModel model = RemindersModel
.builder()
.reminders(reminders)
@@ -103,7 +119,7 @@ public class Reminders extends AbstractConditionableCommand {
public CompletableFuture<CommandResult> executeSlash(SlashCommandInteractionEvent event) {
MessageToSend messageToSend;
if(ContextUtils.isUserCommand(event)) {
messageToSend = getUserReminders(event.getUser());
messageToSend = getUserReminders(event.getUser(), event.getGuild());
} else {
Member member = event.getMember();
Long serverId = event.getGuild().getIdLong();

View File

@@ -8,12 +8,15 @@ import dev.sheldan.abstracto.core.interaction.slash.SlashCommandConfig;
import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.core.interaction.InteractionService;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.core.service.management.UserManagementService;
import dev.sheldan.abstracto.core.utils.ContextUtils;
import dev.sheldan.abstracto.remind.config.RemindFeatureDefinition;
import dev.sheldan.abstracto.remind.config.RemindSlashCommandNames;
import dev.sheldan.abstracto.remind.model.database.Reminder;
import dev.sheldan.abstracto.remind.service.ReminderService;
import dev.sheldan.abstracto.remind.service.management.ReminderManagementService;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import org.springframework.beans.factory.annotation.Autowired;
@@ -46,11 +49,19 @@ public class UnRemind extends AbstractConditionableCommand {
@Autowired
private InteractionService interactionService;
@Autowired
private ReminderManagementService reminderManagementService;
@Override
public CompletableFuture<CommandResult> executeSlash(SlashCommandInteractionEvent event) {
Long reminderId = slashCommandParameterService.getCommandOption(REMINDER_ID_PARAMETER, event, Long.class, Integer.class).longValue();
if(ContextUtils.isUserCommand(event)) {
reminderService.unRemind(reminderId, userManagementService.loadOrCreateUser(event.getUser().getIdLong()));
Reminder reminderToCancel = reminderManagementService.loadReminder(reminderId);
if(reminderToCancel.getUserCommand()) {
reminderService.unRemind(reminderId, userManagementService.loadOrCreateUser(event.getUser().getIdLong()));
} else {
reminderService.unRemind(reminderId, userInServerManagementService.loadOrCreateUser(ServerUser.fromId(event.getGuild().getIdLong(), event.getUser().getIdLong())));
}
} else {
reminderService.unRemind(reminderId, userInServerManagementService.loadOrCreateUser(event.getMember()));
}

View File

@@ -223,6 +223,9 @@ public class RemindServiceBean implements ReminderService {
.builder()
.reminderParticipants(participantsDisplays)
.reminderDisplay(reminderDisplay)
.serverId(reminder.getServer().getId())
.channelId(reminder.getChannel().getId())
.messageId(reminder.getMessageId())
.userDisplay(UserDisplay.fromUser(member.getUser()))
.duration(Duration.between(reminder.getReminderDate(), reminder.getTargetDate()))
.build();

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>remind</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>repost-detection</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>repost-detection</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>starboard</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -138,8 +138,12 @@ public abstract class StarboardListener {
protected void updateStarboardPost(CachedMessage message, AUserInAServer userReacting, boolean adding, StarboardPost starboardPost, List<AUserInAServer> userExceptAuthor) {
starboardPost.setIgnored(false);
// TODO handle futures correctly
starboardService.updateStarboardPost(starboardPost, message, userExceptAuthor);
starboardService.updateStarboardPost(starboardPost, message, userExceptAuthor)
.thenAccept(unused -> log.info("Updated starboard post."))
.exceptionally(throwable -> {
log.error("Failed to update starboard post.", throwable);
return null;
});
if(adding) {
log.debug("Adding reactor {} from message {}", userReacting.getUserReference().getId(), message.getMessageId());
starboardPostReactorManagementService.addReactor(starboardPost, userReacting);

View File

@@ -8,6 +8,8 @@ import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
import dev.sheldan.abstracto.core.models.template.display.MemberDisplay;
import dev.sheldan.abstracto.core.models.template.display.UserDisplay;
import dev.sheldan.abstracto.core.service.*;
import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
@@ -148,22 +150,43 @@ public class StarboardServiceBean implements StarboardService {
private CompletableFuture<StarboardPostModel> buildStarboardPostModel(CachedMessage message, Integer starCount) {
return userService.retrieveUserForId(message.getAuthor().getAuthorId())
.thenApply(user -> createStarboardModel(message, starCount, user))
CompletableFuture<User> userFuture = userService.retrieveUserForId(message.getAuthor().getAuthorId());
CompletableFuture<Member> memberFuture = memberService.retrieveMemberInServer(message.getAuthorAsServerUser());
CompletableFuture<StarboardPostModel> returnedFuture = new CompletableFuture<>();
FutureUtils.toSingleFuture(List.of(userFuture, memberFuture))
.whenComplete((any, error) -> {
User user = null;
if(!userFuture.isCompletedExceptionally()) {
user = userFuture.join();
} else {
log.warn("Failed to retrieve user for author {} of starboard post.", message.getAuthor().getAuthorId());
}
Member member = null;
if(!memberFuture.isCompletedExceptionally()) {
member = memberFuture.join();
} else {
log.warn("Failed to retrieve user for author {} of starboard post.", message.getAuthor().getAuthorId());
}
StarboardPostModel starboardModel = createStarboardModel(message, starCount, user, member);
returnedFuture.complete(starboardModel);
})
.exceptionally(throwable -> {
log.warn("Failed to retrieve user for author {} of starboard post.", message.getAuthor().getAuthorId(), throwable);
return createStarboardModel(message, starCount, null);
log.warn("Complete failure when handling creation starboard post of message {}.", message.getMessageId(), throwable);
returnedFuture.completeExceptionally(throwable);
return null;
});
return returnedFuture;
}
private StarboardPostModel createStarboardModel(CachedMessage message, Integer starCount, net.dv8tion.jda.api.entities.User user) {
private StarboardPostModel createStarboardModel(CachedMessage message, Integer starCount, net.dv8tion.jda.api.entities.User user, Member member) {
Optional<GuildMessageChannel> channel = channelService.getMessageChannelFromServerOptional(message.getServerId(), message.getChannelId());
Optional<Guild> guild = guildService.getGuildByIdOptional(message.getServerId());
String starLevelEmote = getAppropriateEmote(message.getServerId(), starCount);
return StarboardPostModel
.builder()
.message(message)
.author(user)
.authorUser(user != null ? UserDisplay.fromUser(user) : null)
.authorMember(member != null ? MemberDisplay.fromMember(member) : null)
.sourceChannelId(message.getChannelId())
.channel(channel.orElse(null))
.starCount(starCount)
@@ -214,7 +237,7 @@ public class StarboardServiceBean implements StarboardService {
int count = 3;
List<CompletableFuture<StarStatsUser>> topStarGiverFutures = starboardPostReactorManagementService.retrieveTopStarGiver(serverId, count);
List<CompletableFuture<StarStatsUser>> topStarReceiverFutures = starboardPostReactorManagementService.retrieveTopStarReceiver(serverId, count);
List<CompletableFuture> allFutures = new ArrayList<>();
List<CompletableFuture<?>> allFutures = new ArrayList<>();
allFutures.addAll(topStarGiverFutures);
allFutures.addAll(topStarReceiverFutures);
return FutureUtils.toSingleFuture(allFutures).thenApply(aVoid -> {

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>starboard</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -2,17 +2,19 @@ package dev.sheldan.abstracto.starboard.model.template;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.models.context.ServerContext;
import dev.sheldan.abstracto.core.models.template.display.MemberDisplay;
import dev.sheldan.abstracto.core.models.template.display.UserDisplay;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel;
@Getter
@Setter
@SuperBuilder
public class StarboardPostModel extends ServerContext {
private User author;
private UserDisplay authorUser;
private MemberDisplay authorMember;
private GuildMessageChannel channel;
private Long sourceChannelId;
private CachedMessage message;

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>abstracto-modules</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>statistic</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>statistic</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>sticky-roles</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<artifactId>sticky-roles-impl</artifactId>

View File

@@ -11,7 +11,6 @@ import dev.sheldan.abstracto.core.interaction.InteractionService;
import dev.sheldan.abstracto.core.interaction.slash.SlashCommandConfig;
import dev.sheldan.abstracto.core.interaction.slash.SlashCommandPrivilegeLevels;
import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService;
import dev.sheldan.abstracto.core.service.UserService;
import dev.sheldan.abstracto.stickyroles.config.StickyRolesFeatureDefinition;
import dev.sheldan.abstracto.stickyroles.config.StickyRolesSlashCommandNames;
import dev.sheldan.abstracto.stickyroles.service.StickyRoleService;
@@ -19,10 +18,8 @@ import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
@@ -47,34 +44,18 @@ public class ToggleStickinessManagement extends AbstractConditionableCommand {
@Autowired
private StickyRoleService stickyRoleService;
@Autowired
private UserService userService;
@Autowired
private ToggleStickinessManagement self;
@Override
public CompletableFuture<CommandResult> executeSlash(SlashCommandInteractionEvent event) {
Boolean newState = slashCommandParameterService.getCommandOption(STICKY_PARAMETER_NAME, event, Boolean.class);
if(slashCommandParameterService.hasCommandOptionWithFullType(MEMBER_PARAMETER_NAME, event, OptionType.USER)) {
Member targetMember = slashCommandParameterService.getCommandOption(MEMBER_PARAMETER_NAME, event, User.class, Member.class);
Member targetMember = slashCommandParameterService.getCommandOption(MEMBER_PARAMETER_NAME, event, User.class, Member.class);
User targetUser = slashCommandParameterService.getCommandOption(MEMBER_PARAMETER_NAME, event, User.class, User.class);
if(targetMember != null) {
stickyRoleService.setStickiness(targetMember, newState);
return interactionService.replyEmbed(RESPONSE_TEMPLATE, event)
.thenApply(interactionHook -> CommandResult.fromSuccess());
} else {
String userIdStr = slashCommandParameterService.getCommandOption(MEMBER_PARAMETER_NAME, event, User.class, String.class);
Long userId = Long.parseLong(userIdStr);
return userService.retrieveUserForId(userId).thenCompose(user -> {
self.callService(event, user, newState);
return interactionService.replyEmbed(RESPONSE_TEMPLATE, event);
}).thenApply(interactionHook -> CommandResult.fromSuccess());
stickyRoleService.setStickiness(targetUser, event.getGuild(), newState);
}
}
@Transactional
public void callService(SlashCommandInteractionEvent event, User user, Boolean newState) {
stickyRoleService.setStickiness(user, event.getGuild(), newState);
return interactionService.replyEmbed(RESPONSE_TEMPLATE, event)
.thenApply(interactionHook -> CommandResult.fromSuccess());
}
@Override

View File

@@ -4,7 +4,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>sticky-roles</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<artifactId>sticky-roles-int</artifactId>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>suggestion</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>suggestion</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>twitch</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>twitch</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>abstracto-modules</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>utility</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>utility</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>abstracto-modules</artifactId>
<groupId>dev.sheldan.abstracto.modules</groupId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>voice-channel-context</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>voice-channel-context</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>abstracto-modules</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>webservices</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -39,7 +39,7 @@ public class WikipediaServiceBean implements WikipediaService {
Response response = okHttpClient.newCall(request).execute();
if(!response.isSuccessful()) {
if(log.isDebugEnabled()) {
log.error("Failed to retrieve wikipedia summary. Response had code {} with body {}.",
log.debug("Failed to retrieve wikipedia summary. Response had code {} with body {}.",
response.code(), response.body());
}
throw new WikipediaRequestException(response.code());

View File

@@ -26,7 +26,7 @@ public class YoutubeSearchServiceBean implements YoutubeSearchService {
@Override
public YoutubeVideo searchOneVideoForQuery(String query) {
try {
YouTube.Search.List search = youTube.search().list("id,snippet");
YouTube.Search.List search = youTube.search().list("id");
search.setQ(query);
search.setType("video");
search.setMaxResults(1L);
@@ -35,6 +35,9 @@ public class YoutubeSearchServiceBean implements YoutubeSearchService {
if(items.isEmpty()) {
throw new YoutubeVideoNotFoundException();
}
if(items.stream().noneMatch(searchResult -> searchResult.getId().get("kind").equals("youtube#video"))) {
throw new YoutubeVideoNotFoundException();
}
return youtubeVideoService.getVideoInfo(items.get(0).getId().getVideoId());
} catch (IOException e) {
throw new YoutubeAPIException(e);

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>webservices</artifactId>
<version>1.6.4</version>
<version>1.6.17-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Some files were not shown because too many files have changed in this diff Show More