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>
+ <#if warning?has_content>
+ {
+ "name": "Location of the incident",
+ "value": "[${textChannel.name}](${messageLink})"
+ },
+ #if>
+ {
+ "name": "Reason",
+ "value": "${reason}"
+ }
+ ],
+ "footer": {
+ <#if warningUser?has_content>
+ "text": "Warning #${warning.id}"
+ #if>
+ }
+}
\ 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