From ef8dcb61d9cdeb64d5a8d272658e6b4999d3883f Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Wed, 8 Apr 2020 16:22:58 +0200 Subject: [PATCH] added reminders command fixed embedbuilder list not containing an initial embed builder --- .../utility/commands/remind/Reminders.java | 60 +++++++++++++++++++ .../repository/ReminderRepository.java | 5 +- .../utility/service/RemindServiceBean.java | 2 +- .../ReminderManagementServiceBean.java | 9 ++- .../reminders_response_embed_en_US.ftl | 23 +++++++ .../utility/models/database/Reminder.java | 2 +- .../commands/reminder/RemindersModel.java | 16 +++++ .../management/ReminderManagementService.java | 3 + .../service/TemplateServiceBean.java | 5 +- 9 files changed, 119 insertions(+), 6 deletions(-) create mode 100644 abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/Reminders.java create mode 100644 abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/templates/commands/reminders/reminders_response_embed_en_US.ftl create mode 100644 abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/reminder/RemindersModel.java diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/Reminders.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/Reminders.java new file mode 100644 index 000000000..a524ca6bc --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/Reminders.java @@ -0,0 +1,60 @@ +package dev.sheldan.abstracto.utility.commands.remind; + +import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand; +import dev.sheldan.abstracto.core.command.config.CommandConfiguration; +import dev.sheldan.abstracto.core.command.config.HelpInfo; +import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.command.execution.ContextConverter; +import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.templating.model.MessageToSend; +import dev.sheldan.abstracto.templating.service.TemplateService; +import dev.sheldan.abstracto.utility.Utility; +import dev.sheldan.abstracto.utility.config.UtilityFeatures; +import dev.sheldan.abstracto.utility.models.database.Reminder; +import dev.sheldan.abstracto.utility.models.template.commands.reminder.RemindersModel; +import dev.sheldan.abstracto.utility.service.management.ReminderManagementService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class Reminders extends AbstractConditionableCommand { + + @Autowired + private ReminderManagementService reminderManagementService; + + @Autowired + private ChannelService channelService; + + @Autowired + private TemplateService templateService; + + @Override + public CommandResult execute(CommandContext commandContext) { + List activeReminders = reminderManagementService.getActiveRemindersForUser(commandContext.getUserInitiatedContext().getAUserInAServer()); + RemindersModel model = (RemindersModel) ContextConverter.fromCommandContext(commandContext, RemindersModel.class); + model.setReminders(activeReminders); + MessageToSend messageToSend = templateService.renderEmbedTemplate("reminders_response", model); + channelService.sendMessageToEndInTextChannel(messageToSend, commandContext.getChannel()); + return CommandResult.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + HelpInfo helpInfo = HelpInfo.builder().longHelp("Shows the current active reminders").usage("reminders").build(); + return CommandConfiguration.builder() + .name("reminders") + .module(Utility.UTILITY) + .description("Shows the current active reminders") + .causesReaction(true) + .help(helpInfo) + .build(); + } + + @Override + public String getFeature() { + return UtilityFeatures.REMIND; + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/ReminderRepository.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/ReminderRepository.java index ef6546b24..d41426809 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/ReminderRepository.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/ReminderRepository.java @@ -1,8 +1,11 @@ package dev.sheldan.abstracto.utility.repository; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.utility.models.database.Reminder; import org.springframework.data.jpa.repository.JpaRepository; -public interface ReminderRepository extends JpaRepository { +import java.util.List; +public interface ReminderRepository extends JpaRepository { + List getByRemindedUserAndRemindedFalse(AUserInAServer aUserInAServer); } diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RemindServiceBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RemindServiceBean.java index 7ee430616..b70edf640 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RemindServiceBean.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RemindServiceBean.java @@ -97,7 +97,7 @@ public class RemindServiceBean implements ReminderService { Optional channelToAnswerIn = bot.getTextChannelFromServer(server.getId(), channel.getId()); // only send the message if the channel still exists, if not, only set the reminder to reminded. if(channelToAnswerIn.isPresent()) { - AUser userReference = reminderToRemindFor.getToBeReminded().getUserReference(); + AUser userReference = reminderToRemindFor.getRemindedUser().getUserReference(); Member memberInServer = bot.getMemberInServer(server.getId(), userReference.getId()); ExecutedReminderModel build = ExecutedReminderModel .builder() diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementServiceBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementServiceBean.java index 04c69846f..6a280b0b3 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementServiceBean.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementServiceBean.java @@ -1,12 +1,14 @@ package dev.sheldan.abstracto.utility.service.management; import dev.sheldan.abstracto.core.models.AServerAChannelAUser; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.utility.models.database.Reminder; import dev.sheldan.abstracto.utility.repository.ReminderRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.time.Instant; +import java.util.List; @Component public class ReminderManagementServiceBean implements ReminderManagementService { @@ -19,7 +21,7 @@ public class ReminderManagementServiceBean implements ReminderManagementService Reminder reminder = Reminder.builder() .channel(userToBeReminded.getChannel()) .server(userToBeReminded.getGuild()) - .toBeReminded(userToBeReminded.getAUserInAServer()) + .remindedUser(userToBeReminded.getAUserInAServer()) .reminded(false) .text(text) .reminderDate(Instant.now()) @@ -42,4 +44,9 @@ public class ReminderManagementServiceBean implements ReminderManagementService reminderRepository.save(reminder); } + @Override + public List getActiveRemindersForUser(AUserInAServer aUserInAServer) { + return reminderRepository.getByRemindedUserAndRemindedFalse(aUserInAServer); + } + } diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/templates/commands/reminders/reminders_response_embed_en_US.ftl b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/templates/commands/reminders/reminders_response_embed_en_US.ftl new file mode 100644 index 000000000..099d84388 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/templates/commands/reminders/reminders_response_embed_en_US.ftl @@ -0,0 +1,23 @@ +{ + "author": { + "name": "${member.effectiveName}", + "avatar": "${member.user.effectiveAvatarUrl}" + }, + "color" : { + "r": 200, + "g": 0, + "b": 255 + }, + "title": { + "title": "Currently active reminders" + }, + "fields": [ + <#list reminders as reminder> + { + "name": "Reminder ${reminder.id}", + "value": "Due on ${reminder.targetDate} with text ${reminder.text}" + } + <#sep>, + + ] +} \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/Reminder.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/Reminder.java index 4a2f266d1..0a47fe4b2 100644 --- a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/Reminder.java +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/Reminder.java @@ -25,7 +25,7 @@ public class Reminder { @Getter @ManyToOne @JoinColumn(name = "remindedUser") - private AUserInAServer toBeReminded; + private AUserInAServer remindedUser; @Getter private Long messageId; diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/reminder/RemindersModel.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/reminder/RemindersModel.java new file mode 100644 index 000000000..9fc524361 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/reminder/RemindersModel.java @@ -0,0 +1,16 @@ +package dev.sheldan.abstracto.utility.models.template.commands.reminder; + +import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext; +import dev.sheldan.abstracto.utility.models.database.Reminder; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +import java.util.List; + +@Getter +@Setter +@SuperBuilder +public class RemindersModel extends UserInitiatedServerContext { + private List reminders; +} diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementService.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementService.java index 41c712a28..336e77dab 100644 --- a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementService.java +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementService.java @@ -1,12 +1,15 @@ package dev.sheldan.abstracto.utility.service.management; import dev.sheldan.abstracto.core.models.AServerAChannelAUser; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.utility.models.database.Reminder; import java.time.Instant; +import java.util.List; public interface ReminderManagementService { Reminder createReminder(AServerAChannelAUser userToBeReminded, String text, Instant timeToBeRemindedAt, Long messageId); Reminder loadReminder(Long reminderId); void setReminded(Reminder reminder); + List getActiveRemindersForUser(AUserInAServer aUserInAServer); } diff --git a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/service/TemplateServiceBean.java b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/service/TemplateServiceBean.java index e66595c7e..75db857ca 100644 --- a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/service/TemplateServiceBean.java +++ b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/service/TemplateServiceBean.java @@ -44,6 +44,7 @@ public class TemplateServiceBean implements TemplateService { public MessageToSend renderEmbedTemplate(String key, Object model) { String embedConfig = this.renderTemplate(key + "_embed", model); List embedBuilders = new ArrayList<>(); + embedBuilders.add(new EmbedBuilder()); EmbedConfiguration configuration = gson.fromJson(embedConfig, EmbedConfiguration.class); String description = configuration.getDescription(); if(description != null) { @@ -116,8 +117,8 @@ public class TemplateServiceBean implements TemplateService { return FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate(key), parameters); } catch (IOException | TemplateException e) { log.warn("Failed to render template. ", e); + throw new RuntimeException(e); } - return ""; } @Override @@ -126,7 +127,7 @@ public class TemplateServiceBean implements TemplateService { return FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate(key), model); } catch (IOException | TemplateException e) { log.warn("Failed to render template. ", e); - return null; + throw new RuntimeException(e); } } }