added automatic page splitting for embeds

This commit is contained in:
Sheldan
2020-04-07 16:42:38 +02:00
parent 20cb43d071
commit 02a7c3633b
3 changed files with 47 additions and 15 deletions

View File

@@ -99,7 +99,7 @@ public class ReactionUpdatedListener extends ListenerAdapter {
} }
try { try {
reactedAddedListener.executeReactionAdded(cachedMessage, event.getReaction(), userInAServer); reactedAddedListener.executeReactionAdded(cachedMessage, event.getReaction(), userInAServer);
} catch (AbstractoRunTimeException e) { } catch (Exception e) {
log.warn(String.format("Failed to execute reaction added listener %s.", reactedAddedListener.getClass().getName()), e); log.warn(String.format("Failed to execute reaction added listener %s.", reactedAddedListener.getClass().getName()), e);
} }
}); });

View File

@@ -11,6 +11,7 @@ import freemarker.template.Configuration;
import freemarker.template.TemplateException; import freemarker.template.TemplateException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.MessageEmbed;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
@@ -18,8 +19,10 @@ import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import java.awt.*; import java.awt.*;
import java.io.IOException; import java.io.IOException;
import java.time.Instant; import java.time.Instant;
import java.util.Arrays; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j @Slf4j
@Component @Component
@@ -49,54 +52,82 @@ public class TemplateServiceBean implements TemplateService {
return null; return null;
} }
private String getPageString(Integer count) {
HashMap<String, Object> params = new HashMap<>();
params.put("count", count);
return renderTemplate("embed_page_count", params);
}
@Override @Override
public MessageToSend renderEmbedTemplate(String key, Object model) { public MessageToSend renderEmbedTemplate(String key, Object model) {
String embedConfig = this.renderTemplate(key + "_embed", model); String embedConfig = this.renderTemplate(key + "_embed", model);
EmbedBuilder builder = new EmbedBuilder(); List<EmbedBuilder> embedBuilders = new ArrayList<>();
EmbedConfiguration configuration = gson.fromJson(embedConfig, EmbedConfiguration.class); EmbedConfiguration configuration = gson.fromJson(embedConfig, EmbedConfiguration.class);
String description = configuration.getDescription(); String description = configuration.getDescription();
if(description != null) { if(description != null) {
builder.setDescription(description); double parts = Math.ceil(description.length() / (double) MessageEmbed.TEXT_MAX_LENGTH);
extendIfNecessary(embedBuilders, parts);
for (int i = 0; i < parts; i++) {
String descriptionText = description.substring(MessageEmbed.TEXT_MAX_LENGTH * i, Math.min(MessageEmbed.TEXT_MAX_LENGTH * (i + 1), description.length()));
embedBuilders.get(i).setDescription(descriptionText);
}
} }
EmbedAuthor author = configuration.getAuthor(); EmbedAuthor author = configuration.getAuthor();
EmbedBuilder firstBuilder = embedBuilders.get(0);
if(author != null) { if(author != null) {
builder.setAuthor(author.getName(), author.getUrl(), author.getAvatar()); firstBuilder.setAuthor(author.getName(), author.getUrl(), author.getAvatar());
} }
String thumbnail = configuration.getThumbnail(); String thumbnail = configuration.getThumbnail();
if(thumbnail != null) { if(thumbnail != null) {
builder.setThumbnail(thumbnail); firstBuilder.setThumbnail(thumbnail);
} }
EmbedTitle title = configuration.getTitle(); EmbedTitle title = configuration.getTitle();
if(title != null) { if(title != null) {
builder.setTitle(title.getTitle(), title.getUrl()); firstBuilder.setTitle(title.getTitle(), title.getUrl());
} }
EmbedFooter footer = configuration.getFooter(); EmbedFooter footer = configuration.getFooter();
if(footer != null) { if(footer != null) {
builder.setFooter(footer.getText(), footer.getIcon()); firstBuilder.setFooter(footer.getText(), footer.getIcon());
} }
if(configuration.getFields() != null) { if(configuration.getFields() != null) {
configuration.getFields().forEach(embedField -> { double neededIndex = Math.ceil(configuration.getFields().size() / 25D) - 1;
extendIfNecessary(embedBuilders, neededIndex);
for (int i = 0; i < configuration.getFields().size(); i++) {
double currentPart = Math.floor(i / 25D);
EmbedField embedField = configuration.getFields().get(i);
Boolean inline = embedField.getInline() != null ? embedField.getInline() : Boolean.FALSE; Boolean inline = embedField.getInline() != null ? embedField.getInline() : Boolean.FALSE;
builder.addField(embedField.getName(), embedField.getValue(), inline); embedBuilders.get((int) currentPart).addField(embedField.getName(), embedField.getValue(), inline);
}); }
} }
builder.setTimestamp(configuration.getTimeStamp()); firstBuilder.setTimestamp(configuration.getTimeStamp());
builder.setImage(configuration.getImageUrl()); firstBuilder.setImage(configuration.getImageUrl());
EmbedColor color = configuration.getColor(); EmbedColor color = configuration.getColor();
if(color != null) { if(color != null) {
builder.setColor(new Color(color.getR(), color.getG(), color.getB()).getRGB()); int colorToSet = new Color(color.getR(), color.getG(), color.getB()).getRGB();
embedBuilders.forEach(embedBuilder -> embedBuilder.setColor(colorToSet));
} }
List<MessageEmbed> embeds = embedBuilders.stream().map(EmbedBuilder::build).collect(Collectors.toList());
return MessageToSend.builder() return MessageToSend.builder()
.embeds(Arrays.asList(builder.build())) .embeds(embeds)
.message(configuration.getAdditionalMessage()) .message(configuration.getAdditionalMessage())
.build(); .build();
} }
private void extendIfNecessary(List<EmbedBuilder> builders, double neededIndex) {
if(neededIndex > builders.size() - 1) {
for (int i = builders.size(); i < neededIndex + 1; i++) {
EmbedBuilder e = new EmbedBuilder();
e.setFooter(getPageString(i + 1));
builders.add(e);
}
}
}
@Override @Override
public String renderTemplate(String key, HashMap<String, Object> parameters) { public String renderTemplate(String key, HashMap<String, Object> parameters) {
try { try {