blob: fc8b76c94b5cf956612b9efc8bc1e5d45a7c5e9f [file] [log] [blame]
import Discord, { CommandInteraction, MessageActionRow, Message } from "discord.js";
import generateEmojiEmbed from "./generateEmojiEmbed.js"
import getEmojiByName from "./getEmojiByName.js";
class confirmationMessage {
interaction: CommandInteraction;
title: string;
emoji: string;
description: string;
color: string;
customCallback: () => any;
customButtonTitle: string;
customButtonDisabled: boolean;
customCallbackString: string = "";
customCallbackClicked: boolean = false;
customCallbackResponse: any = null;
constructor(interaction: CommandInteraction) {
this.interaction = interaction;
this.title = "";
this.emoji = "";
this.description = "";
this.color = "";
this.customCallback = () => {}
}
setTitle(title: string) { this.title = title; return this }
setEmoji(emoji: string) { this.emoji = emoji; return this }
setDescription(description: string) { this.description = description; return this }
setColor(color: string) { this.color = color; return this }
addCustomCallback(title: string, disabled: boolean, callback: () => any, callbackClicked: string) {
this.customButtonTitle = title;
this.customButtonDisabled = disabled;
this.customCallback = callback;
this.customCallbackString = callbackClicked;
return this;
}
async send(editOnly?: boolean) {
while (true) {
let object = {
embeds: [
new generateEmojiEmbed()
.setEmoji(this.emoji)
.setTitle(this.title)
.setDescription(this.description)
.setStatus(this.color)
.setFooter({text: this.customCallbackClicked ? this.customCallbackString : ""})
],
components: [
new MessageActionRow().addComponents([
new Discord.MessageButton()
.setCustomId("yes")
.setLabel("Yes")
.setStyle("SUCCESS")
.setEmoji(getEmojiByName("CONTROL.TICK", "id")),
new Discord.MessageButton()
.setCustomId("no")
.setLabel("Cancel")
.setStyle("DANGER")
.setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
].concat(this.customButtonTitle ? [new Discord.MessageButton()
.setCustomId("custom")
.setLabel(this.customButtonTitle)
.setStyle("SECONDARY")
.setDisabled(this.customButtonDisabled)
.setEmoji(getEmojiByName("CONTROL.RIGHT", "id")) // TODO: add an emoji
] : []))
],
ephemeral: true,
fetchReply: true
}
let m;
if ( editOnly ) {
m = await this.interaction.editReply(object);
} else {
m = await this.interaction.reply(object)
}
let component;
try {
component = await (m as Message).awaitMessageComponent({filter: (m) => m.user.id === this.interaction.user.id, time: 2.5 * 60 * 1000});
} catch (e) {
return {success: false, buttonClicked: this.customCallbackClicked, response: this.customCallbackResponse}; // TODO: Check the type of the error; change the error message here
}
if (component.customId === "yes") {
component.deferUpdate();
return {success: true, buttonClicked: this.customCallbackClicked, response: this.customCallbackResponse};
} else if (component.customId === "no") {
component.deferUpdate();
return {success: false, buttonClicked: this.customCallbackClicked, response: this.customCallbackResponse};
} else if (component.customId === "custom") {
component.deferUpdate();
this.customCallbackResponse = this.customCallback();
this.customCallbackClicked = true;
this.customButtonDisabled = true;
editOnly = true;
}
}
}
}
export default confirmationMessage;