Files
chopin/src/discord/Embed.js

132 lines
3.7 KiB
JavaScript

const { EmbedBuilder, ActionRowBuilder } = require("discord.js");
class Embed {
fields;
buttons;
constructor (interaction, ephemeral) {
this.embed = new EmbedBuilder().setTimestamp()
this.fields = []
this.buttons = []
this.isSended = false
if(interaction) {
interaction.deferReply({ ephemeral: ephemeral }).then(() => {
this.isSended = true
})
this.interaction = interaction
this.ephemeral = ephemeral
}
}
setTitle(title) {
this.embed.setTitle(title)
return this
}
setDescription(description) {
this.embed.setDescription(description)
return this
}
setAuthor(author) {
this.embed.setAuthor(author)
return this
}
setColor(r, g, b) {
// if only R is provided, set color with R as hex else set color with RGB
if (g === undefined && b === undefined) {
this.embed.setColor(r)
return this
} else {
// Transforme r, g, b in one 0xRRGGBB value
r = Math.max(0, Math.min(255, r));
g = Math.max(0, Math.min(255, g));
b = Math.max(0, Math.min(255, b));
// Shift the values to their respective positions in a 24-bit number
const hexNumber = (r << 16) + (g << 8) + b;
this.embed.setColor(hexNumber)
}
}
setFooter(footer) {
this.embed.setFooter(footer)
return this
}
setImage(imageUrl) {
this.embed.setImage(imageUrl)
return this
}
setThumbnail(thumbnailUrl) {
this.embed.setThumbnail(thumbnailUrl)
return this
}
addBotPicture(client) {
this.embed.setThumbnail("https://cdn.discordapp.com/avatars/" + client.user.id + "/" + client.user.avatar + ".png")
}
addField(name, value, inline) {
if(!inline) inline = false;
this.fields.push({name: name, value: value, inline: inline})
return this
}
addColumn() {
this.fields.push({name: '\u200B', value: '\u200B', inline: true})
return this
}
addButton(button) {
this.buttons.push(button)
return this
}
build() {
//Add Fields to an object
this.embed.addFields(this.fields)
if(this.buttons.length > 0) {
this.actionRow = new ActionRowBuilder()
.addComponents(this.buttons);
}
return this.embed
}
async send() {
// Add a secutiry check to avoid sending an embed if the interaction is not defined and retry one again
while(!this.isSended) {
await new Promise(resolve => setTimeout(resolve, 50));
}
if(this.ephemeral === undefined) this.ephemeral = false;
this.interaction.editReply({ embeds: [this.build()], components: this.buttons.length > 0 ? [this.actionRow] : [] })
}
async returnError(message) {
this.setColor(150, 20, 20)
this.setTitle('Erreur')
this.setThumbnail("https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/Dialog-error-round.svg/2048px-Dialog-error-round.svg.png")
this.setDescription(message)
await this.send()
}
}
class EmbedError extends Embed {
constructor(message, interaction, ephemeral) {
super(interaction, ephemeral)
this.setColor(150, 20, 20)
this.setTitle('Erreur')
this.setThumbnail("https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/Dialog-error-round.svg/2048px-Dialog-error-round.svg.png")
this.setDescription(message)
this.send()
}
}
module.exports = {Embed, EmbedError}