djs-easy
Version:
djs-easy is a javascript package for discord with the a lot stuff you need to make your bot programming easy
322 lines (315 loc) • 18 kB
JavaScript
const { MessageButton, MessageActionRow, MessageEmbed } = require("discord.js");
class embedbuilder {
constructor(client) {
this.client = client;
};
async createEmbed(interaction) {
let bool = 1;
let embed = new MessageEmbed()
.setAuthor("Embed Builder")
.setDescription("Welcome to the interactive embed builder. Use the buttons below to build the embed, after click post!")
let id = new Date().getTime();
let row1 = new MessageActionRow().addComponents(
new MessageButton()
.setCustomId("author" + id)
.setLabel("Author Text")
.setStyle("SECONDARY")
).addComponents(
new MessageButton()
.setCustomId("title" + id)
.setLabel("Title Text")
.setStyle("SECONDARY")
).addComponents(
new MessageButton()
.setCustomId("titleurl" + id)
.setLabel("Title URL")
.setStyle("SECONDARY")
).addComponents(
new MessageButton()
.setCustomId("description" + id)
.setLabel("Description Text")
.setStyle("SECONDARY")
).addComponents(
new MessageButton()
.setCustomId("footer" + id)
.setLabel("Footer Text")
.setStyle("SECONDARY")
)
let row2 = new MessageActionRow().addComponents(
new MessageButton()
.setCustomId("authorimage" + id)
.setLabel("Author Image")
.setStyle("SECONDARY")
).addComponents(
new MessageButton()
.setCustomId("thumbnail" + id)
.setLabel("Thumbnail Image")
.setStyle("SECONDARY")
).addComponents(
new MessageButton()
.setCustomId("image" + id)
.setLabel("Large Image")
.setStyle("SECONDARY")
).addComponents(
new MessageButton()
.setCustomId("footerimage" + id)
.setLabel("Footer Image")
.setStyle("SECONDARY")
).addComponents(
new MessageButton()
.setCustomId("color" + id)
.setLabel("Embed Color")
.setStyle("SECONDARY")
)
let row3 = new MessageActionRow().addComponents(
new MessageButton()
.setCustomId("fields" + id)
.setStyle("SECONDARY")
.setLabel("Embed Fields")
).addComponents(
new MessageButton()
.setCustomId("timestamp" + id)
.setStyle("SECONDARY")
.setLabel("Add Timestamp")
).addComponents(
new MessageButton()
.setCustomId("channel" + id)
.setStyle("PRIMARY")
.setLabel("Channel to Post")
).addComponents(
new MessageButton()
.setCustomId("post" + id)
.setStyle("DANGER")
.setLabel("Post the embed")
)
let field;
let buttons = [row1, row2, row3];
interaction.reply({ embeds: [embed], components: buttons, ephemeral: true });
const filter = click => click.user.id === interaction.member.id;
const wordFilter = rep => { return rep.author.id === interaction.member.id };
const collecter = interaction.channel.createMessageComponentCollector({ filter, time: 900000 });
let channel = interaction.channel;
let back;
collecter.on("collect", async function(click) {
if (bool == 1 && ["author", "description"].includes(click.customId)) {
embed.description = "",
embed.author = "";
bool = 0;
};
if (click.customId == "author" + id) {
click.update({ content: "What would you like to set the author text to?", components: [] });
let response = await waitResponse(interaction.channel, wordFilter);
if (!response) return returnHome(interaction, buttons);
try { embed.setAuthor(response.content, embed.author.iconURL || null); } catch {};
click.editReply({ embeds: [embed], content: " ", components: buttons });
} else if (click.customId == "timestamp" + id) {
try { embed.setTimestamp(); } catch {};
click.update({ embeds: [embed], content: " ", components: buttons });
} else if (click.customId == "title" + id) {
click.update({ content: "What would you like to set the title text to?", components: [] });
let response = await waitResponse(interaction.channel, wordFilter);
if (!response) return returnHome(interaction, buttons);
try { embed.setTitle(response.content); } catch {};
click.editReply({ embeds: [embed], content: " ", components: buttons });
} else if (click.customId == "titleurl" + id) {
click.update({ content: "What would you like to set the title URL to?", components: [] });
let response = await waitResponse(interaction.channel, wordFilter);
if (!response) return returnHome(interaction, buttons);
try { embed.setURL(response.content); } catch {};
click.editReply({ embeds: [embed], content: " ", components: buttons });
} else if (click.customId == "description" + id) {
click.update({ content: "What would you like to set the description to?", components: [] });
let response = await waitResponse(interaction.channel, wordFilter);
if (!response) return returnHome(interaction, buttons);
try { embed.setDescription(response.content); } catch {};
click.editReply({ embeds: [embed], content: " ", components: buttons });
} else if (click.customId == "footer" + id) {
click.update({ content: "What would you like to set the footer text to?", components: [] });
let response = await waitResponse(interaction.channel, wordFilter);
if (!response) return returnHome(interaction, buttons);
try { embed.setFooter(response.content || " ", embed.footer?.iconURL); } catch (e) { console.log(e.stack) };
click.editReply({ embeds: [embed], content: " ", components: buttons });
} else if (click.customId == "authorimage" + id) {
click.update({ content: "What would you like to set the author image to?", components: [] });
let response = await waitResponse(interaction.channel, wordFilter);
if (!response) return returnHome(interaction, buttons);
try { embed.setAuthor(embed.author.name, response.content || response.attachments.first().url); } catch {};
click.editReply({ embeds: [embed], content: " ", components: buttons });
} else if (click.customId == "color" + id) {
click.update({ content: "What color would you like to set the embed to?", components: [] });
let response = await waitResponse(interaction.channel, wordFilter);
if (!response) return returnHome(interaction, buttons);
try { embed.setColor(response.content); } catch {};
click.editReply({ embeds: [embed], content: " ", components: buttons });
} else if (click.customId == "thumbnail" + id) {
click.update({ content: "What would you like to set the thumbnail image to?", components: [] });
let response = await waitResponse(interaction.channel, wordFilter);
if (!response) return returnHome(interaction, buttons);
try { embed.setThumbnail(response.content || response.attachments.first().url); } catch {};
click.editReply({ embeds: [embed], content: " ", components: buttons });
} else if (click.customId == "image" + id) {
click.update({ content: "What would you like to set the large image to?", components: [] });
let response = await waitResponse(interaction.channel, wordFilter);
if (!response) return returnHome(interaction, buttons);
try { embed.setImage(response.content || response.attachments.first().url); } catch {};
click.editReply({ embeds: [embed], content: " ", components: buttons });
} else if (click.customId == "footerimage" + id) {
click.update({ content: "What would you like to set the footer image to?", components: [] });
let response = await waitResponse(interaction.channel, wordFilter);
if (!response) return returnHome(interaction, buttons);
try { embed.setFooter(embed.footer.text || " ", response.content || response.attachments.first().url); } catch {};
click.editReply({ embeds: [embed], content: " ", components: buttons });
} else if (click.customId == "channel" + id) {
click.update({ content: "What channel would you like to post this to?", components: [] });
let msg = await channel.awaitMessages({ filter: wordFilter, max: 1, time: 120000 });
let chan;
if (msg.first().mentions.channels.first()) {
chan = msg.first().mentions.channels.first();
} else {
chan = interaction.member.guild.channels.cache.get(msg.first().content);
};
try { msg.first().delete(); } catch {};
if (chan) {
channel = chan;
buttons[2].components[1].setLabel(chan.name);
};
click.editReply({ embeds: [embed], content: " ", components: buttons });
} else if (click.customId == "post" + id) {
channel.send({ embeds: [embed] });
click.update({ embeds: [], components: [], content: "Embed Posted !" })
} else if (click.customId == "fields" + id) {
let fieldButtons = await getFieldButtons(embed.fields, id);
if (fieldButtons.length) {
fieldButtons[fieldButtons.length - 1].components.push(new MessageButton().setCustomId("go-back" + id).setStyle("SUCCESS").setLabel("Go Back"));
fieldButtons[fieldButtons.length - 1].components.push(new MessageButton().setCustomId("create-new" + id).setStyle("SUCCESS").setLabel("New Field"));
} else {
fieldButtons[0] = new MessageActionRow().addComponents(new MessageButton().setCustomId("create-new" + id).setStyle("SUCCESS").setLabel("New Field")).addComponents(new MessageButton().setCustomId("go-back" + id).setStyle("SUCCESS").setLabel("Go Back"));
};
click.update({ components: fieldButtons });
back = "home";
} else if (click.customId == "create-new" + id) {
click.update({ content: "What should the name of this field be?", components: [] });
let name = await waitResponse(interaction.channel, wordFilter);
if (!name) return returnHome(click, buttons);
click.editReply({ content: "What should the value of this field be?" });
let value = await waitResponse(interaction.channel, wordFilter);
if (!value) return returnHome(click, buttons);
embed.addField(name.content, value.content);
let fieldButtons = await getFieldButtons(embed.fields, id);
if (fieldButtons.length) {
fieldButtons[fieldButtons.length - 1].components.push(new MessageButton().setCustomId("go-back" + id).setStyle("SUCCESS").setLabel("Go Back"));
fieldButtons[fieldButtons.length - 1].components.push(new MessageButton().setCustomId("create-new" + id).setStyle("SUCCESS").setLabel("New Field"));
} else {
fieldButtons[0] = new MessageActionRow().addComponents(new MessageButton().setCustomId("create-new" + id).setStyle("SUCCESS").setLabel("New Field")).addComponents(new MessageButton().setCustomId("go-back" + id).setStyle("SUCCESS").setLabel("Go Back"));
};
click.editReply({ content: " ", embeds: [embed], components: fieldButtons });
back = "home";
} else if (click.customId == "go-back" + id) {
switch (back) {
case "home":
returnHome1(click, buttons);
break;
case "fields":
let fieldButtons = await getFieldButtons(embed.fields);
if (fieldButtons.length) {
fieldButtons[fieldButtons.length - 1].components.push(new MessageButton().setCustomId("go-back" + id).setStyle("SUCCESS").setLabel("Go Back"));
fieldButtons[fieldButtons.length - 1].components.push(new MessageButton().setCustomId("create-new" + id).setStyle("SUCCESS").setLabel("New Field"));
} else {
fieldButtons[0] = new MessageActionRow().addComponents(new MessageButton().setCustomId("create-new" + id).setStyle("SUCCESS").setLabel("New Field")).addComponents(new MessageButton().setCustomId("go-back" + id).setStyle("SUCCESS").setLabel("Go Back"));
}
click.update({ components: fieldButtons });
back = "home";
break;
}
} else if (click.customId.startsWith(`edit-field${id}-`)) {
field = Number(click.customId.split("-")[2]);
let edits = new MessageActionRow().addComponents(
new MessageButton()
.setCustomId("field-name-" + id)
.setLabel("Field Name: " + embed.fields[field].name)
.setStyle("SECONDARY")
).addComponents(
new MessageButton()
.setCustomId("field-value-" + id)
.setLabel("Field Value")
.setStyle("SECONDARY")
)
if (embed.fields[field].inline == true) {
edits.addComponents(
new MessageButton()
.setCustomId("field-inline-" + id)
.setLabel("Field Inline")
.setStyle("SUCCESS")
)
} else {
edits.addComponents(
new MessageButton()
.setCustomId("field-inline-" + id)
.setLabel("Field Inline")
.setStyle("DANGER")
)
};
click.update({ components: [edits, new MessageActionRow().addComponents(new MessageButton().setCustomId("go-back").setStyle("SUCCESS").setLabel("Go Back"))] })
back = "fields";
} else if (click.customId.startsWith("field-") && click.customId.endsWith(id)) {
let check = click.customId.split("-")[1];
let backup = click.message.components;
if (check == "name") {
click.update({ content: "What should the name of this field be?", components: [] });
let rep = await waitResponse(interaction.channel, wordFilter);
if (!rep) return returnHome(click, backup);
embed.fields[field].name = rep.content;
backup[0].components[0].setLabel(`Field Name: ${rep.content}`);
click.editReply({ content: " ", embeds: [embed], components: backup });
} else if (check == "value") {
click.update({ content: "What should the value of this field be?", components: [] });
let rep = await waitResponse(interaction.channel, wordFilter);
if (!rep) return returnHome(click, backup);
embed.fields[field].value = rep.content;
click.editReply({ content: " ", embeds: [embed], components: backup });
} else if (check == "inline") {
if (embed.fields[field].inline == true) {
embed.fields[field].inline = false;
backup[0].components[2].setStyle("DANGER");
click.update({ embeds: [embed], components: backup });
} else {
embed.fields[field].inline = true;
backup[0].components[2].setStyle("SUCCESS");
click.update({ embeds: [embed], components: backup });
}
}
};
})
}
};
module.exports = embedbuilder;
async function getFieldButtons(fields, id) {
let array = [];
let row = new MessageActionRow()
let limit = 0;
for (let field of fields) {
if (row.components.length == 5) {
array.push(row);
row = new MessageActionRow();
};
row.addComponents(new MessageButton().setCustomId(`edit-field${id}-` + limit).setStyle("SECONDARY").setLabel(field.name));
limit++;
};
if (row.components.length) array.push(row);
return array;
};
async function waitResponse(channel, filter) {
let msg = await channel.awaitMessages({ filter: filter, max: 1, time: 120000 });
try {
msg.first().delete();
return msg.first()
} catch {
return undefined;
}
};
function returnHome(interaction, buttons) {
interaction.editReply({ components: buttons, content: " " })
};
function returnHome1(interaction, buttons) {
interaction.update({ components: buttons, content: " " })
};