diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/Warn.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/Warn.java index b4b1fd229..69360d55a 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/Warn.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/Warn.java @@ -2,9 +2,7 @@ package dev.sheldan.abstracto.moderation.command; import dev.sheldan.abstracto.command.execution.*; import dev.sheldan.abstracto.moderation.Moderation; -import dev.sheldan.abstracto.moderation.models.template.BanIdLog; import dev.sheldan.abstracto.moderation.models.template.WarnLog; -import dev.sheldan.abstracto.moderation.models.Warning; import dev.sheldan.abstracto.moderation.service.WarnService; import dev.sheldan.abstracto.command.Command; import dev.sheldan.abstracto.command.HelpInfo; @@ -41,6 +39,7 @@ public class Warn implements Command { warnLogModel.setWarnedUser(member); warnLogModel.setReason(reason); warnLogModel.setWarningUser(commandContext.getAuthor()); + warnLogModel.setMessageLink(commandContext.getMessage().getJumpUrl()); warnService.warnUser(member, commandContext.getAuthor(), reason, warnLogModel); return Result.fromSuccess(); } diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/WarnServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/WarnServiceBean.java index a4d1f0d3b..05e40090e 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/WarnServiceBean.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/WarnServiceBean.java @@ -19,6 +19,7 @@ import lombok.extern.slf4j.Slf4j; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -49,7 +50,7 @@ public class WarnServiceBean implements WarnService { private static final String WARN_NOTIFICATION_TEMPLATE = "warn_notification"; @Override - public void warnUser(AUserInAServer warnedAUserInAServer, AUserInAServer warningAUserInAServer, String reason, ServerContext warnLog) { + public void warnUser(AUserInAServer warnedAUserInAServer, AUserInAServer warningAUserInAServer, String reason, WarnLog warnLog) { AUser warningAUser = warningAUserInAServer.getUserReference(); AUser warnedAUser = warnedAUserInAServer.getUserReference(); AServer serverOfWarning = warnedAUserInAServer.getServerReference(); @@ -72,18 +73,21 @@ public class WarnServiceBean implements WarnService { } else { log.warn("Unable to find user {} in guild {} to warn.", warnedAUser.getId(), serverOfWarning.getId()); } + warnLog.setWarning(warning); this.sendWarnLog(warnLog); } @Override - public void warnUser(Member warnedMember, Member warningMember, String reason, ServerContext warnLog) { + public void warnUser(Member warnedMember, Member warningMember, String reason, WarnLog warnLog) { AUserInAServer warnedAUser = userManagementService.loadUser(warnedMember); AUserInAServer warningAUser = userManagementService.loadUser(warningMember); this.warnUser(warnedAUser, warningAUser, reason, warnLog); } - public void sendWarnLog(ServerContext warnLogModel) { + private void sendWarnLog(ServerContext warnLogModel) { String warnLogMessage = templateService.renderContextAwareTemplate(WARN_LOG_TEMPLATE, warnLogModel); postTargetService.sendTextInPostTarget(warnLogMessage, PostTarget.WARN_LOG, warnLogModel.getServer().getId()); + MessageEmbed embed = templateService.renderEmbedTemplate("warn_log", warnLogModel); + postTargetService.sendEmbedInPostTarget(embed, PostTarget.WARN_LOG, warnLogModel.getServer().getId()); } } diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/warn/embed/warn_log_embed_en_US.ftl b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/warn/embed/warn_log_embed_en_US.ftl new file mode 100644 index 000000000..c7f0bc2ee --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/warn/embed/warn_log_embed_en_US.ftl @@ -0,0 +1,41 @@ +{ + "author": { + "name": "${warnedUser.effectiveName}", + "avatar": "${warnedUser.user.effectiveAvatarUrl}" + }, + "title": { + "title": "User has been warned" + }, + "color" : { + "r": 200, + "g": 0, + "b": 255 + }, + "fields": [ + { + "name": "Warned User", + "value": "${warnedUser.effectiveName} ${warnedUser.asMention} (${warnedUser.idLong?c})" + }, + <#if warningUser?has_content> + { + "name": "Warned by", + "value": "${warningUser.effectiveName} ${warningUser.asMention} (${warningUser.idLong?c})" + }, + + <#if warning?has_content> + { + "name": "Location of the incident", + "value": "[${textChannel.name}](${messageLink})" + }, + + { + "name": "Reason", + "value": "${reason}" + } + ], + "footer": { + <#if warningUser?has_content> + "text": "Warning #${warning.id}" + + } +} \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/WarnLog.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/WarnLog.java index 6d3a9918b..0bb0e6c7b 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/WarnLog.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/WarnLog.java @@ -14,5 +14,6 @@ public class WarnLog extends UserInitiatedServerContext { private String reason; private Member warnedUser; private Member warningUser; - + private String messageLink; + private Warning warning; } diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/WarnService.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/WarnService.java index 42034f412..faf5f05e3 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/WarnService.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/WarnService.java @@ -7,6 +7,6 @@ import net.dv8tion.jda.api.entities.Member; public interface WarnService { - void warnUser(AUserInAServer warnedAUser, AUserInAServer warningAUser, String reason, ServerContext warnLog); - void warnUser(Member warnedUser, Member warningUser, String reason, ServerContext warnLog); + void warnUser(AUserInAServer warnedAUser, AUserInAServer warningAUser, String reason, WarnLog warnLog); + void warnUser(Member warnedUser, Member warningUser, String reason, WarnLog warnLog); } diff --git a/abstracto-application/command/command-support/src/main/java/dev/sheldan/abstracto/commands/management/post/ExceptionPostExecution.java b/abstracto-application/command/command-support/src/main/java/dev/sheldan/abstracto/commands/management/post/ExceptionPostExecution.java index da7320338..822d2d908 100644 --- a/abstracto-application/command/command-support/src/main/java/dev/sheldan/abstracto/commands/management/post/ExceptionPostExecution.java +++ b/abstracto-application/command/command-support/src/main/java/dev/sheldan/abstracto/commands/management/post/ExceptionPostExecution.java @@ -7,10 +7,12 @@ import dev.sheldan.abstracto.command.execution.CommandContext; import dev.sheldan.abstracto.command.execution.Result; import dev.sheldan.abstracto.command.execution.ResultState; import dev.sheldan.abstracto.templating.TemplateService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service +@Slf4j public class ExceptionPostExecution implements PostCommandExecution { @Autowired @@ -20,6 +22,7 @@ public class ExceptionPostExecution implements PostCommandExecution { public void execute(CommandContext commandContext, Result result, Command command) { if(result.getResult().equals(ResultState.ERROR)) { if(result.getThrowable() != null) { + log.warn("Exception", result.getThrowable()); if(result.getThrowable() instanceof TemplatedException) { TemplatedException exception = (TemplatedException) result.getThrowable(); String text = templateService.renderTemplate(exception.getTemplateName(), exception.getTemplateModel()); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/exception/ConfigurationException.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/exception/ConfigurationException.java new file mode 100644 index 000000000..8a623e79a --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/exception/ConfigurationException.java @@ -0,0 +1,7 @@ +package dev.sheldan.abstracto.core.exception; + +public class ConfigurationException extends RuntimeException { + public ConfigurationException(String message) { + super(message); + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PostTargetServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PostTargetServiceBean.java index 7c33f8287..d34cb486f 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PostTargetServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PostTargetServiceBean.java @@ -1,10 +1,12 @@ package dev.sheldan.abstracto.core.service; +import dev.sheldan.abstracto.core.exception.ConfigurationException; import dev.sheldan.abstracto.core.management.PostTargetManagement; import dev.sheldan.abstracto.core.management.ServerManagementService; import dev.sheldan.abstracto.core.models.database.PostTarget; import lombok.extern.slf4j.Slf4j; import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.TextChannel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -25,11 +27,22 @@ public class PostTargetServiceBean implements PostTargetService { @Override public void sendTextInPostTarget(String text, PostTarget target) { + TextChannel textChannelForPostTarget = getTextChannelForPostTarget(target); + textChannelForPostTarget.sendMessage(text).queue(); + } + + @Override + public void sendEmbedInPostTarget(MessageEmbed embed, PostTarget target) { + TextChannel textChannelForPostTarget = getTextChannelForPostTarget(target); + textChannelForPostTarget.sendMessage(embed).queue(); + } + + private TextChannel getTextChannelForPostTarget(PostTarget target) { Guild guild = botService.getInstance().getGuildById(target.getServerReference().getId()); if(guild != null) { TextChannel textChannelById = guild.getTextChannelById(target.getChannelReference().getId()); if(textChannelById != null) { - textChannelById.sendMessage(text).queue(); + return textChannelById; } else { log.warn("Incorrect post target configuration: {} points to {} on server {}", target.getName(), target.getChannelReference().getId(), target.getServerReference().getId()); @@ -37,15 +50,28 @@ public class PostTargetServiceBean implements PostTargetService { } else { log.warn("Incorrect post target configuration: Guild id {} was not found.", target.getServerReference().getId()); } + throw new ConfigurationException("Incorrect post target configuration."); + } + + private PostTarget getPostTarget(String postTargetName, Long serverId) { + PostTarget postTarget = postTargetManagement.getPostTarget(postTargetName, serverId); + if(postTarget != null) { + return postTarget; + } else { + log.warn("PostTarget {} in server {} was not found!", postTargetName, serverId); + throw new ConfigurationException(String.format("Incorrect post target configuration: Post target %s was not found.", postTargetName)); + } } @Override public void sendTextInPostTarget(String text, String postTargetName, Long serverId) { - PostTarget postTarget = postTargetManagement.getPostTarget(postTargetName, serverId); - if(postTarget != null) { - this.sendTextInPostTarget(text, postTarget); - } else { - log.warn("PostTarget {} in server {} was not found!", postTargetName, serverId); - } + PostTarget postTarget = this.getPostTarget(postTargetName, serverId); + this.sendTextInPostTarget(text, postTarget); + } + + @Override + public void sendEmbedInPostTarget(MessageEmbed embed, String postTargetName, Long serverId) { + PostTarget postTarget = this.getPostTarget(postTargetName, serverId); + this.sendEmbedInPostTarget(embed, postTarget); } } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/PostTargetService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/PostTargetService.java index ad8515056..f3f9d2067 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/PostTargetService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/PostTargetService.java @@ -1,8 +1,11 @@ package dev.sheldan.abstracto.core.service; import dev.sheldan.abstracto.core.models.database.PostTarget; +import net.dv8tion.jda.api.entities.MessageEmbed; public interface PostTargetService { void sendTextInPostTarget(String text, PostTarget target); + void sendEmbedInPostTarget(MessageEmbed embed, PostTarget target); void sendTextInPostTarget(String text, String postTargetName, Long serverId); + void sendEmbedInPostTarget(MessageEmbed embed, String postTargetName, Long serverId); } diff --git a/abstracto-application/pom.xml b/abstracto-application/pom.xml index 3f78c192a..c0c3060db 100644 --- a/abstracto-application/pom.xml +++ b/abstracto-application/pom.xml @@ -52,6 +52,13 @@ 4.3 + + com.google.code.gson + gson + 2.8.6 + + + diff --git a/abstracto-application/templating/templating-impl/pom.xml b/abstracto-application/templating/templating-impl/pom.xml index fd38084ec..10e868245 100644 --- a/abstracto-application/templating/templating-impl/pom.xml +++ b/abstracto-application/templating/templating-impl/pom.xml @@ -22,10 +22,17 @@ org.springframework.boot spring-boot-starter-freemarker + commons-io commons-io + + + com.google.code.gson + gson + + \ No newline at end of file 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 14f3dd752..6e66339c1 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 @@ -19,6 +19,9 @@ public class FreemarkerConfiguration { public Configuration freeMarkerConfiguration() throws IOException, TemplateException { FreeMarkerConfigurationFactory factory = new FreeMarkerConfigurationFactory(); factory.setPreTemplateLoaders(templateLoader); - return factory.createConfiguration(); + Configuration configuration = factory.createConfiguration(); + // needed to support default methods in interfaces + configuration.setIncompatibleImprovements(Configuration.VERSION_2_3_29); + return configuration; } } diff --git a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedAuthor.java b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedAuthor.java new file mode 100644 index 000000000..ed5dd2c24 --- /dev/null +++ b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedAuthor.java @@ -0,0 +1,12 @@ +package dev.sheldan.abstracto.templating.embed; + + +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +public class EmbedAuthor { + private String name; + private String url; + private String avatar; +} diff --git a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedColor.java b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedColor.java new file mode 100644 index 000000000..c38da0ef7 --- /dev/null +++ b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedColor.java @@ -0,0 +1,11 @@ +package dev.sheldan.abstracto.templating.embed; + +import lombok.Getter; +import lombok.Setter; + +@Setter @Getter +public class EmbedColor { + private Integer r; + private Integer g; + private Integer b; +} diff --git a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedConfiguration.java b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedConfiguration.java new file mode 100644 index 000000000..91eb38f21 --- /dev/null +++ b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedConfiguration.java @@ -0,0 +1,17 @@ +package dev.sheldan.abstracto.templating.embed; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter @Setter +public class EmbedConfiguration { + private EmbedAuthor author; + private EmbedTitle title; + private EmbedColor color; + private String description; + private String thumbnail; + private List fields; + private EmbedFooter footer; +} diff --git a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedField.java b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedField.java new file mode 100644 index 000000000..9e0a298e2 --- /dev/null +++ b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedField.java @@ -0,0 +1,11 @@ +package dev.sheldan.abstracto.templating.embed; + +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +public class EmbedField { + private String name; + private String value; + private Boolean inline; +} diff --git a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedFooter.java b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedFooter.java new file mode 100644 index 000000000..a533068c8 --- /dev/null +++ b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedFooter.java @@ -0,0 +1,10 @@ +package dev.sheldan.abstracto.templating.embed; + +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +public class EmbedFooter { + private String text; + private String icon; +} diff --git a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedTitle.java b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedTitle.java new file mode 100644 index 000000000..df875d8fe --- /dev/null +++ b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/embed/EmbedTitle.java @@ -0,0 +1,10 @@ +package dev.sheldan.abstracto.templating.embed; + +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +public class EmbedTitle { + private String title; + private String url; +} diff --git a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/loading/TemplateServiceBean.java b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/loading/TemplateServiceBean.java index d69528bf4..f0ecfb042 100644 --- a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/loading/TemplateServiceBean.java +++ b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/loading/TemplateServiceBean.java @@ -1,18 +1,24 @@ package dev.sheldan.abstracto.templating.loading; +import com.google.gson.Gson; import dev.sheldan.abstracto.core.models.ContextAware; import dev.sheldan.abstracto.core.models.ServerContext; import dev.sheldan.abstracto.templating.TemplateDto; import dev.sheldan.abstracto.templating.TemplateService; +import dev.sheldan.abstracto.templating.embed.*; import freemarker.template.Configuration; +import freemarker.template.Template; import freemarker.template.TemplateException; import lombok.extern.slf4j.Slf4j; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.MessageEmbed; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Component; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; +import java.awt.*; import java.io.IOException; +import java.io.StringReader; import java.time.Instant; import java.util.HashMap; @@ -26,8 +32,10 @@ public class TemplateServiceBean implements TemplateService { @Autowired private Configuration configuration; + @Autowired + private Gson gson; + @Override - @Cacheable("template") public TemplateDto getTemplateByKey(String key) { return repository.getOne(key); } @@ -42,6 +50,58 @@ public class TemplateServiceBean implements TemplateService { return null; } + @Override + public MessageEmbed renderEmbedTemplate(String key, Object model) { + String embedConfig = this.renderTemplate(key + "_embed", model); + EmbedBuilder builder = new EmbedBuilder(); + EmbedConfiguration configuration = gson.fromJson(embedConfig, EmbedConfiguration.class); + String description = configuration.getDescription(); + if(description != null) { + builder.setDescription(description); + } + EmbedAuthor author = configuration.getAuthor(); + if(author != null) { + builder.setAuthor(author.getName(), author.getUrl(), author.getAvatar()); + } + + String thumbnail = configuration.getThumbnail(); + if(thumbnail != null) { + builder.setThumbnail(thumbnail); + } + EmbedTitle title = configuration.getTitle(); + if(title != null) { + builder.setTitle(title.getTitle(), title.getUrl()); + } + EmbedFooter footer = configuration.getFooter(); + if(footer != null) { + builder.setFooter(footer.getText(), footer.getIcon()); + } + configuration.getFields().forEach(embedField -> { + Boolean inline = embedField.getInline() != null ? embedField.getInline() : Boolean.FALSE; + builder.addField(embedField.getName(), embedField.getValue(), inline); + }); + + EmbedColor color = configuration.getColor(); + if(color != null) { + builder.setColor(new Color(color.getR(), color.getG(), color.getB()).getRGB()); + } + + return builder.build(); + } + + private String impromptu(String templateStr, Object model) { + try { + Template t = new Template("name", new StringReader(templateStr), + new Configuration(Configuration.VERSION_2_3_29)); + return FreeMarkerTemplateUtils.processTemplateIntoString(t, model); + } catch (IOException e) { + e.printStackTrace(); + } catch (TemplateException e) { + e.printStackTrace(); + } + return ""; + } + @Override public String renderTemplate(String key, HashMap parameters) { try { @@ -58,8 +118,8 @@ public class TemplateServiceBean implements TemplateService { return FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate(key), model); } catch (IOException | TemplateException e) { log.warn("Failed to render template: {}", e.getMessage()); + throw new RuntimeException("Failed to render template", e); } - return ""; } @Override diff --git a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/seeding/TemplateSeedDataLoader.java b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/seeding/TemplateSeedDataLoader.java index eb62d7eb6..c5ad60b13 100644 --- a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/seeding/TemplateSeedDataLoader.java +++ b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/seeding/TemplateSeedDataLoader.java @@ -1,6 +1,7 @@ package dev.sheldan.abstracto.templating.seeding; import dev.sheldan.abstracto.templating.TemplateService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -16,6 +17,7 @@ import java.util.Arrays; import java.util.List; @Component +@Slf4j public class TemplateSeedDataLoader { @Value("classpath*:**/templates/**/*.ftl") @@ -31,6 +33,7 @@ public class TemplateSeedDataLoader { try { String templateKey = FilenameUtils.getBaseName(resource.getFilename()); String templateContent = IOUtils.toString(resource.getURI(), Charset.defaultCharset()); + log.debug("Creating template {}", templateKey); service.createTemplate(templateKey, templateContent); } catch (IOException e) { e.printStackTrace(); diff --git a/abstracto-application/templating/templating-interface/src/main/java/dev/sheldan/abstracto/templating/TemplateDto.java b/abstracto-application/templating/templating-interface/src/main/java/dev/sheldan/abstracto/templating/TemplateDto.java index a7cac2d34..5e18d9403 100644 --- a/abstracto-application/templating/templating-interface/src/main/java/dev/sheldan/abstracto/templating/TemplateDto.java +++ b/abstracto-application/templating/templating-interface/src/main/java/dev/sheldan/abstracto/templating/TemplateDto.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @@ -22,6 +23,7 @@ public class TemplateDto { private String key; @Getter + @Column(length = 4000) private String content; @Getter diff --git a/abstracto-application/templating/templating-interface/src/main/java/dev/sheldan/abstracto/templating/TemplateService.java b/abstracto-application/templating/templating-interface/src/main/java/dev/sheldan/abstracto/templating/TemplateService.java index bf39448c5..41a16e527 100644 --- a/abstracto-application/templating/templating-interface/src/main/java/dev/sheldan/abstracto/templating/TemplateService.java +++ b/abstracto-application/templating/templating-interface/src/main/java/dev/sheldan/abstracto/templating/TemplateService.java @@ -1,6 +1,7 @@ package dev.sheldan.abstracto.templating; import dev.sheldan.abstracto.core.models.ServerContext; +import net.dv8tion.jda.api.entities.MessageEmbed; import java.util.HashMap; @@ -8,6 +9,7 @@ public interface TemplateService { TemplateDto getTemplateByKey(String key); boolean templateExists(String key); String renderTemplate(TemplateDto templateDto); + MessageEmbed renderEmbedTemplate(String key, Object model); String renderTemplate(String key, HashMap parameters); String renderTemplate(String key, Object model); String renderContextAwareTemplate(String key, ServerContext serverContext); diff --git a/pom.xml b/pom.xml index 6f21cde2e..06b8208fd 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ org.springframework.boot spring-boot-starter-parent - 2.2.2.RELEASE + 2.2.5.RELEASE