From ff8817f76555330254ddb3a99d5621d745f7c4d8 Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Tue, 21 Apr 2020 21:54:47 +0200 Subject: [PATCH] added duration field to reminder and restructured remind text added general duration formatting to freemarker (its a builtin method currently added source channel attribute to starboard post added exception logging to immediate reminders --- .../utility/service/RemindServiceBean.java | 13 ++-- .../StarboardPostManagementServiceBean.java | 2 + .../remind/remind_reminder_embed_en_US.ftl | 16 ++++- .../models/database/StarboardPost.java | 4 ++ .../reminder/ExecutedReminderModel.java | 3 + .../config/FreemarkerConfiguration.java | 5 ++ .../templating/methods/DurationMethod.java | 59 +++++++++++++++++++ .../templates/embeds/builtins/day_en_US.ftl | 5 ++ .../templates/embeds/builtins/hour_en_US.ftl | 5 ++ .../embeds/builtins/minute_en_US.ftl | 5 ++ .../embeds/builtins/second_en_US.ftl | 5 ++ 11 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/methods/DurationMethod.java create mode 100644 abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/day_en_US.ftl create mode 100644 abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/hour_en_US.ftl create mode 100644 abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/minute_en_US.ftl create mode 100644 abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/second_en_US.ftl 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 a5d0e7f5c..c1e37f2eb 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 @@ -28,9 +28,7 @@ import java.time.Duration; import java.time.Instant; import java.util.Date; import java.util.Optional; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; @Component @Slf4j @@ -80,8 +78,14 @@ public class RemindServiceBean implements ReminderService { log.trace("Directly scheduling the reminder, because it was below the threshold."); ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.schedule(() -> { - self.executeReminder(reminder.getId()); + try { + self.executeReminder(reminder.getId()); + } catch (Exception exception) { + log.error("Failed to remind immediately.", exception); + } }, remindIn.toNanos(), TimeUnit.NANOSECONDS); + + } else { log.trace("Starting scheduled job to execute reminder."); JobDataMap parameters = new JobDataMap(); @@ -109,6 +113,7 @@ public class RemindServiceBean implements ReminderService { .builder() .reminder(reminderToRemindFor) .member(memberInServer) + .duration(Duration.between(reminderToRemindFor.getReminderDate(), reminderToRemindFor.getTargetDate())) .build(); MessageToSend messageToSend = templateService.renderEmbedTemplate("remind_reminder", build); channelService.sendMessageToEndInTextChannel(messageToSend, channelToAnswerIn.get()); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/StarboardPostManagementServiceBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/StarboardPostManagementServiceBean.java index 07432cbe3..a2e62c86f 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/StarboardPostManagementServiceBean.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/StarboardPostManagementServiceBean.java @@ -2,6 +2,7 @@ package dev.sheldan.abstracto.utility.service.management; import dev.sheldan.abstracto.core.models.AServerAChannelMessage; 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.utility.models.database.StarboardPost; import dev.sheldan.abstracto.utility.repository.StarboardPostRepository; @@ -32,6 +33,7 @@ public class StarboardPostManagementServiceBean implements StarboardPostManageme .postMessageId(starredMessage.getMessageId()) .starboardMessageId(starboardPost.getMessageId()) .starboardChannel(starboardPost.getChannel()) + .sourceChanel(AChannel.builder().id(starredMessage.getChannelId()).build()) .starredDate(Instant.now()) .build(); repository.save(post); diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/templates/commands/remind/remind_reminder_embed_en_US.ftl b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/templates/commands/remind/remind_reminder_embed_en_US.ftl index 26739d6a9..8a4a036fb 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/templates/commands/remind/remind_reminder_embed_en_US.ftl +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/resources/templates/commands/remind/remind_reminder_embed_en_US.ftl @@ -8,6 +8,20 @@ "g": 0, "b": 255 }, - "description": "You wanted to be reminded of: '${reminder.text}'. Original message was [here](${messageUrl}).", + "description": "You wanted to be reminded.", + "fields": [ + { + "name": "Duration", + "value": "${fmtDuration(duration)}" + }, + { + "name": "Note", + "value": "${reminder.text}" + }, + { + "name": "Link", + "value": "[Jump!](${messageUrl})" + } + ], "additionalMessage": "${member.asMention}" } \ 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/StarboardPost.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/StarboardPost.java index 8cfca2128..72347b6ac 100644 --- a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/StarboardPost.java +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/StarboardPost.java @@ -35,6 +35,10 @@ public class StarboardPost { @JoinColumn(name = "channelId") private AChannel starboardChannel; + @ManyToOne + @JoinColumn(name = "sourceChannelId") + private AChannel sourceChanel; + @Transient private Integer reactionCount; diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/reminder/ExecutedReminderModel.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/reminder/ExecutedReminderModel.java index 72f1d506f..005c7ee65 100644 --- a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/reminder/ExecutedReminderModel.java +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/template/commands/reminder/ExecutedReminderModel.java @@ -8,12 +8,15 @@ import lombok.Setter; import lombok.experimental.SuperBuilder; import net.dv8tion.jda.api.entities.Member; +import java.time.Duration; + @Getter @Setter @SuperBuilder public class ExecutedReminderModel extends ServerContext { private Reminder reminder; private Member member; + private Duration duration; public String getMessageUrl() { return MessageUtils.buildMessageUrl(this.reminder.getServer().getId() ,this.reminder.getChannel().getId(), this.reminder.getMessageId()); diff --git a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/config/FreemarkerConfiguration.java b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/config/FreemarkerConfiguration.java index 07e5176d4..8334075f1 100644 --- a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/config/FreemarkerConfiguration.java +++ b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/config/FreemarkerConfiguration.java @@ -1,6 +1,7 @@ package dev.sheldan.abstracto.templating.config; import dev.sheldan.abstracto.templating.loading.DatabaseTemplateLoader; +import dev.sheldan.abstracto.templating.methods.DurationMethod; import freemarker.template.Configuration; import freemarker.template.TemplateException; import org.springframework.beans.factory.annotation.Autowired; @@ -16,11 +17,15 @@ public class FreemarkerConfiguration { @Autowired private DatabaseTemplateLoader templateLoader; + @Autowired + private DurationMethod durationMethod; + @Bean public Configuration freeMarkerConfiguration() throws IOException, TemplateException { FreeMarkerConfigurationFactory factory = new FreeMarkerConfigurationFactory(); factory.setPreTemplateLoaders(templateLoader); Configuration configuration = factory.createConfiguration(); + configuration.setSharedVariable("fmtDuration", durationMethod); configuration.setEncoding(Locale.getDefault(), "utf-8"); // needed to support default methods in interfaces configuration.setIncompatibleImprovements(Configuration.VERSION_2_3_29); diff --git a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/methods/DurationMethod.java b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/methods/DurationMethod.java new file mode 100644 index 000000000..734591770 --- /dev/null +++ b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/methods/DurationMethod.java @@ -0,0 +1,59 @@ +package dev.sheldan.abstracto.templating.methods; + +import dev.sheldan.abstracto.templating.service.TemplateService; +import freemarker.ext.beans.StringModel; +import freemarker.template.TemplateMethodModelEx; +import freemarker.template.TemplateModelException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import java.util.List; + +@Component +public class DurationMethod implements TemplateMethodModelEx { + + @Autowired + private TemplateService service; + + @Override + public Object exec(List arguments) throws TemplateModelException { + if (arguments.size() != 1) { + throw new TemplateModelException("Incorrect parameters passed."); + } + Object wrappedObject = ((StringModel) arguments.get(0)).getWrappedObject(); + if(!(wrappedObject instanceof Duration)) { + throw new TemplateModelException("Passed argument was not a duration object"); + } + Duration duration = (Duration) wrappedObject; + StringBuilder stringBuilder = new StringBuilder(); + // upgrading to java 9 makes this nicer + long days = duration.toDays(); + if(days > 0) { + stringBuilder.append(service.renderTemplate("day", getParam(days))); + } + long hours = duration.toHours() % 24; + if(hours > 0) { + stringBuilder.append(service.renderTemplate("hour", getParam(hours))); + } + long minutes = duration.toMinutes() % 60; + if(minutes > 0) { + stringBuilder.append(service.renderTemplate("minute", getParam(minutes))); + } + + long seconds = duration.get(ChronoUnit.SECONDS) % 60; + if(seconds > 0) { + stringBuilder.append(service.renderTemplate("second", getParam(seconds))); + } + + return stringBuilder.toString(); + } + + private HashMap getParam(Long value) { + HashMap params = new HashMap<>(); + params.put("amount", value); + return params; + } +} diff --git a/abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/day_en_US.ftl b/abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/day_en_US.ftl new file mode 100644 index 000000000..e58a30b03 --- /dev/null +++ b/abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/day_en_US.ftl @@ -0,0 +1,5 @@ +<#if amount gt 1> +${amount} days +<#else> +1 day + \ No newline at end of file diff --git a/abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/hour_en_US.ftl b/abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/hour_en_US.ftl new file mode 100644 index 000000000..5d3e1d282 --- /dev/null +++ b/abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/hour_en_US.ftl @@ -0,0 +1,5 @@ +<#if amount gt 1> +${amount} hours +<#else> +1 hour + \ No newline at end of file diff --git a/abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/minute_en_US.ftl b/abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/minute_en_US.ftl new file mode 100644 index 000000000..b5cbb2e7a --- /dev/null +++ b/abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/minute_en_US.ftl @@ -0,0 +1,5 @@ +<#if amount gt 1> +${amount} minutes +<#else> +1 minute + \ No newline at end of file diff --git a/abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/second_en_US.ftl b/abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/second_en_US.ftl new file mode 100644 index 000000000..e42ba7f06 --- /dev/null +++ b/abstracto-application/templating/templating-impl/src/main/resources/templates/embeds/builtins/second_en_US.ftl @@ -0,0 +1,5 @@ +<#if amount gt 1> +${amount} seconds +<#else> +1 second + \ No newline at end of file