package net.romvoid.crashbot.utilities;
import java.util.concurrent.TimeUnit;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.MessageBuilder;
import net.dv8tion.jda.api.entities.ChannelType;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageChannel;
import net.romvoid.crashbot.Bot;
/**
* Generates common embed messages.
*
* @author ROMVoid
*/
public class EmbedUtil {
/**
* The default deletion interval.
* TODO: Create a config-option to set this per-guild
*/
private static final long defaultDeleteInterval = 60;
/**
* The default deletion interval TimeUnit.
* TODO: Create a config-option to set this per-guild
*/
private static final TimeUnit defaultDeleteIntervalTimeUnit = TimeUnit.SECONDS;
/**
* Creates an embedded message indicating a successful feature execution.
*
* @param title the title of the embedded.
* @param description a more detailed description.
* @return the generated EmbedBuilder.
*/
public static EmbedBuilder success(String title, String description) {
return embed(":white_check_mark: " + title, description).setColor(Colors.Universal.PRIMARY);
}
/**
* Creates an embedded message with additional information.
*
* @param title the title of the embedded.
* @param description a more detailed description.
* @return the generated EmbedBuilder.
*/
public static EmbedBuilder info(String title, String description) {
return embed(":information_source: " + title, description).setColor(Colors.Universal.SECONDARY);
}
/**
* Creates an embedded unknown error message.
*
* @return the generated EmbedBuilder.
*/
public static EmbedBuilder error() {
return error("Unknown error", "An unknown error occurred.");
}
/**
* Creates an embedded error message.
*
* @param title the title of the embedded.
* @param description the error description.
* @return the generated EmbedBuilder.
*/
public static EmbedBuilder error(String title, String description) {
return embed(":warning: " + title, description).setColor(Colors.Universal.ERROR);
}
/**
* Creates an embedded no permissions message.
*
* @return the generated EmbedBuilder.
*/
public static EmbedBuilder no_permissions() {
return embed(":warning: " + "No permissions", "You don't have the permission to execute this command!").setColor(Colors.Universal.NO_PERMISSION);
}
/**
* Creates an embedded message.
*
* @param title the title of the embedded.
* @param description the description (main message).
* @return the generated EmbedBuilder.
*/
public static EmbedBuilder embed(String title, String description) {
return new EmbedBuilder().setTitle(title).setDescription(description);
}
/**
* Attaches a timestamp to an embedded message.
*
* @param embedBuilder the EmbedBuilder to attach a timestamp to.
* @return the given EmbedBuilder with a timestamp.
*/
public static EmbedBuilder withTimestamp(EmbedBuilder embedBuilder) {
return embedBuilder.setFooter(Bot.getNewTimestamp(), null);
}
/**
* Converts an EmbedBuilder into a message.
*
* @param embedBuilder the EmbedBuilder that contains the embed data.
* @return the compiled Message.
*/
public static Message message(EmbedBuilder embedBuilder) {
return new MessageBuilder().setEmbed(embedBuilder.build()).build();
}
/**
* Always sends a message but deletes it only if the messageChannel is on a server.
*
* @param messageChannel the channel to send the message in.
* @param message the message to send.
*/
public static void sendAndDeleteOnGuilds(MessageChannel messageChannel, Message message) {
sendAndDeleteOnGuilds(messageChannel, message, defaultDeleteInterval, defaultDeleteIntervalTimeUnit);
}
/**
* Always sends a message but deletes it only if the messageChannel is on a server.
*
* @param messageChannel the channel to send the message in.
* @param message the message to send.
* @param deleteInterval the interval after that the message should be deleted if the channel is on a server.
* @param deleteIntervalTimeUnit the TimeUnit of deleteInterval.
*/
public static void sendAndDeleteOnGuilds(MessageChannel messageChannel, Message message, long deleteInterval, TimeUnit deleteIntervalTimeUnit) {
sendAndDelete(messageChannel, message,
// only delete message on servers.
messageChannel.getType() == ChannelType.TEXT ? deleteInterval : -1,
deleteIntervalTimeUnit);
}
/**
* Sends a message and deletes it after an interval (if interval is >= 0).
*
* @param messageChannel the channel to send the message in.
* @param message the message to send.
* @param deleteInterval the interval after that the message should be deleted. Message won't be deleted if
* interval is < 0.
* @param deleteIntervalTimeUnit the TimeUnit of deleteInterval.
*/
public static void sendAndDelete(MessageChannel messageChannel, Message message, long deleteInterval, TimeUnit deleteIntervalTimeUnit) {
messageChannel.sendMessage(message).queue(deleteInterval < 0
// do nothing if interval < 0
? null
// else: delete after interval
: sentMessage -> sentMessage.delete().queueAfter(deleteInterval, deleteIntervalTimeUnit, null, ignored -> {
//TODO evaluate exception, i.e. bot does not have permission
}));
}
public static void sendAndDelete(MessageChannel messageChannel, EmbedBuilder embed, long deleteInterval, TimeUnit deleteIntervalTimeUnit) {
messageChannel.sendMessage(embed.build()).queue(deleteInterval < 0
// do nothing if interval < 0
? null
// else: delete after interval
: sentMessage -> sentMessage.delete().queueAfter(deleteInterval, deleteIntervalTimeUnit, null, ignored -> {
//TODO evaluate exception, i.e. bot does not have permission
}));
}
}