diff --git a/.gitignore b/.gitignore
index 1f58c8d..97aca2e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,2 @@
-tests.js
-register-commands.js
-docker-compose.yml
-.env
\ No newline at end of file
+.env
+node_modules
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 5eb7046..3ebfd2d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
FROM node:latest
WORKDIR /app
COPY . /app
-CMD ["bash", "start.sh"]
\ No newline at end of file
+CMD ["node", "bot.js"]
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index e4b1365..0000000
--- a/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# Chaise Bot
-
-Welcome to Chaise Bot's GitHub repository! Chaise Bot is a versatile and powerful chatbot designed to work seamlessly on both Discord and Telegram. Powered by OpenAI's API, the bot provides an interactive and engaging user experience, making it the perfect companion for managing your online communities and having some fun conversations.
-
-## Features
-
-- Integration with Discord and Telegram platforms
-- Utilizes OpenAI's API for natural language processing and advanced conversation capabilities
-- Easy setup and configuration
-
-## Prerequisites
-
-- Docker
-- Node.js
-- Discord bot token
-- Telegram bot token
-- OpenAI API key
-
-## Getting Started
-
-To get Chaise Bot up and running on your Discord or Telegram server, follow these simple steps:
-
-1. Clone this repository
-2. Rename `docker-compose-exemple.yml` to `docker-compose.yml`
-3. Configure your bot's API keys and settings in `docker-compose.yml`
-4. Run `docker-compose up -d` to build the bot's Docker image and start the container
-
-## Usage
-
-Once you have Chaise Bot deployed and running, you can start interacting with it by sending messages on Discord or Telegram using the appropriate commands. The bot will automatically respond to your messages and provide the necessary information or actions based on the commands you use.
-
-## Contributing
-
-We welcome contributions to Chaise Bot's development! If you'd like to contribute bugfixes, improvements, or new features, please feel free to create a pull request on this repository. For any questions or concerns, please open an issue or contact us directly.
-
-## Acknowledgments
-
-- OpenAI for providing their API and resources (more information can be found [here](https://openai.com/))
-
-Enjoy using Chaise Bot, and happy chatting!
-
-ps : this README has been fully generated by Chaise Bot
\ No newline at end of file
diff --git a/app.js b/app.js
deleted file mode 100644
index d0634fc..0000000
--- a/app.js
+++ /dev/null
@@ -1,16 +0,0 @@
-//Importing libs
-const discord = require('discord.js');
-
-//Importing events
-const discordEvents = require('./events/discordEvents');
-
-//bot initialization
-const client = new discord.Client({intents: 33297});
-
-//events
-discordEvents.ready(client);
-discordEvents.newMessage(client);
-discordEvents.newInteraction(client);
-
-//bot launch
-client.login(process.env.DISCORD);
\ No newline at end of file
diff --git a/bot.js b/bot.js
new file mode 100644
index 0000000..076d6d4
--- /dev/null
+++ b/bot.js
@@ -0,0 +1,87 @@
+const fs = require("node:fs");
+const path = require("node:path");
+const {
+ Client,
+ Collection,
+ GatewayIntentBits,
+ Partials,
+ REST,
+ Routes,
+} = require("discord.js");
+require("dotenv").config();
+const { sendLog } = require("./libs/logs.js");
+
+const client = new Client({
+ intents: [
+ GatewayIntentBits.Guilds,
+ GatewayIntentBits.GuildMessages,
+ GatewayIntentBits.DirectMessages,
+ GatewayIntentBits.MessageContent,
+ ],
+ partials: [Partials.Channel, Partials.Message],
+});
+
+client.commands = new Collection();
+const commands = [];
+const foldersPath = path.join(__dirname, "commands");
+const commandFolders = fs.readdirSync(foldersPath);
+
+for (const folder of commandFolders) {
+ const commandsPath = path.join(foldersPath, folder);
+ const commandFiles = fs
+ .readdirSync(commandsPath)
+ .filter((file) => file.endsWith(".js"));
+
+ for (const file of commandFiles) {
+ const filePath = path.join(commandsPath, file);
+ const command = require(filePath);
+ if ("data" in command && "execute" in command) {
+ client.commands.set(command.data.name, command);
+ commands.push(command.data.toJSON());
+ } else {
+ console.log(
+ `[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`
+ );
+ }
+ }
+}
+
+const rest = new REST().setToken(process.env.DISCORD_TOKEN);
+
+(async () => {
+ try {
+ console.log(
+ `Started refreshing ${commands.length} application (/) commands.`
+ );
+ sendLog(`Started refreshing ${commands.length} application (/) commands.`);
+
+ const data = await rest.put(
+ Routes.applicationCommands(process.env.BOT_ID),
+ { body: commands }
+ );
+
+ console.log(
+ `Successfully reloaded ${data.length} application (/) commands.`
+ );
+ sendLog(`Successfully reloaded ${data.length} application (/) commands.`);
+ } catch (error) {
+ console.error(error);
+ }
+})();
+
+const eventsPath = path.join(__dirname, "events");
+const eventFiles = fs
+ .readdirSync(eventsPath)
+ .filter((file) => file.endsWith(".js"));
+
+for (const file of eventFiles) {
+ const filePath = path.join(eventsPath, file);
+ const event = require(filePath);
+ if (event.once) {
+ client.once(event.name, (...args) => event.execute(...args));
+ } else {
+ client.on(event.name, (...args) => event.execute(...args));
+ }
+}
+
+client.login(process.env.DISCORD_TOKEN);
diff --git a/commands/commands.js b/commands/commands.js
deleted file mode 100644
index 1bde90b..0000000
--- a/commands/commands.js
+++ /dev/null
@@ -1,151 +0,0 @@
-const { ApplicationCommandOptionType } = require('discord.js');
-
-const commands = [
- {
- name: 'gptrequest',
- description: 'Make a request to the GPT-4 API',
- options: [
- {
- name: 'question',
- description: 'The question you want to ask to the API',
- type: ApplicationCommandOptionType.String,
- required: true,
- },
- ],
- },
-
- {
- name: 'quickgpt',
- description: 'Make a quicker request to the GPT-3.5 API',
- options: [
- {
- name: 'question',
- description: 'The question you want to ask to the API',
- type: ApplicationCommandOptionType.String,
- required: true,
- },
- ],
- },
-
- {
- name : 'info',
- description : 'utilise pas cette commande fdp',
- },
-
- {
- name : 'addconv',
- description : 'Add a conversation to the database',
- options : [
- {
- name : 'name',
- description : 'The name of the conversation',
- type : ApplicationCommandOptionType.String,
- required : true,
- },
- ],
- },
-
- {
- name : 'delconv',
- description : 'Delete a conversation from the database',
- options : [
- {
- name : 'name',
- description : 'The name of the conversation',
- type : ApplicationCommandOptionType.String,
- required : true,
- },
- ],
- },
-
- {
- name : 'listconvs',
- description : 'List all the conversations in the database',
- },
-
- {
- name : 'addmsg',
- description : 'Add a message to a conversation',
- options : [
- {
- name : 'name',
- description : 'The name of the conversation',
- type : ApplicationCommandOptionType.String,
- required : true,
- },
- {
- name : 'message',
- description : 'The message to add to the conversation',
- type : ApplicationCommandOptionType.String,
- required : true,
- },
- ],
- },
- {
- name : 'displayconv',
- description : 'Display a conversation',
- options : [
- {
- name : 'name',
- description : 'The name of the conversation',
- type : ApplicationCommandOptionType.String,
- required : true,
- },
- ],
- },
- {
- name : 'getmyguota',
- description : 'Get your quota',
- },
-
- {
- name : 'github',
- description : 'Get the github link of the bot',
- },
-
- {
- name : 'dalle',
- description : 'Make a request to the DALL-E API',
- options : [
- {
- name : 'query',
- description : 'The query you want to ask to the API',
- type : ApplicationCommandOptionType.String,
- required : true,
- },
- ],
- },
-
- {
- name : 'addchannel',
- description : 'Add a channel to the conversation system',
- options : [
- {
- name : 'channel',
- description : 'The channel you want to add',
- type : ApplicationCommandOptionType.Channel,
- required : true,
- },
- ],
- },
-
- {
- name : 'deletechannel',
- description : 'Delete a channel from the conversation system',
- options : [
- {
- name : 'channel',
- description : 'The channel you want to delete',
- type : ApplicationCommandOptionType.Channel,
- required : true,
- },
- ],
- },
-
- {
- name : 'help',
- description : 'Get help',
- },
-];
-
-module.exports = { commands };
\ No newline at end of file
diff --git a/commands/fun/ping.js b/commands/fun/ping.js
new file mode 100644
index 0000000..2c5a733
--- /dev/null
+++ b/commands/fun/ping.js
@@ -0,0 +1,11 @@
+const { SlashCommandBuilder } = require("discord.js");
+
+module.exports = {
+ data: new SlashCommandBuilder()
+ .setName("ping")
+ .setDescription("Replies with Pong!"),
+ async execute(interaction) {
+ console.log("ping command executed");
+ await interaction.reply("Pong!");
+ },
+};
diff --git a/commands/hubs/addhub.js b/commands/hubs/addhub.js
new file mode 100644
index 0000000..905de73
--- /dev/null
+++ b/commands/hubs/addhub.js
@@ -0,0 +1,43 @@
+const {
+ SlashCommandBuilder,
+ EmbedBuilder,
+ ButtonBuilder,
+ ActionRowBuilder,
+ ButtonStyle,
+ PermissionsBitField,
+} = require("discord.js");
+const { errorEmbed } = require("../../libs/embeds.js");
+
+module.exports = {
+ data: new SlashCommandBuilder()
+ .setName("addhub")
+ .setDescription("Add a conversation hub to the database.")
+ .setDMPermission(false),
+ async execute(interaction) {
+ if (
+ !interaction.member.permissions.has(
+ PermissionsBitField.Flags.Administrator
+ )
+ ) {
+ const embed = errorEmbed(
+ "You need the administrator permission to use this command."
+ );
+ return interaction.reply({ embeds: [embed] });
+ }
+
+ const embed = new EmbedBuilder()
+ .setTitle("Conversation hub")
+ .setDescription("Click on the button below to create a conversation.")
+ .setColor("#F6C6F9")
+ .setFooter({ text: "Bot by @ninja_jambon" });
+
+ const button = new ButtonBuilder()
+ .setCustomId("create_conversation")
+ .setLabel("Create conversation")
+ .setStyle(ButtonStyle.Success);
+
+ const actionRow = new ActionRowBuilder().addComponents(button);
+
+ await interaction.reply({ embeds: [embed], components: [actionRow] });
+ },
+};
diff --git a/commands/hubs/closeconv.js b/commands/hubs/closeconv.js
new file mode 100644
index 0000000..cf77be4
--- /dev/null
+++ b/commands/hubs/closeconv.js
@@ -0,0 +1,37 @@
+const { SlashCommandBuilder } = require("discord.js");
+const { getConv, removeConv } = require("../../libs/mysql.js");
+const { errorEmbed } = require("../../libs/embeds.js");
+const { sendLog } = require("../../libs/logs.js");
+
+module.exports = {
+ data: new SlashCommandBuilder()
+ .setName("closeconv")
+ .setDescription("Close the current conversation.")
+ .setDMPermission(false),
+ async execute(interaction) {
+ const conv = await getConv(interaction.channelId).catch((err) => {
+ sendLog(err);
+
+ const embed = errorEmbed(
+ "An error occured while trying to get your conversation data."
+ );
+
+ return interaction.reply({ embeds: [embed], ephemeral: true });
+ });
+
+ if (!conv[0]) {
+ const embed = errorEmbed("This channel is not a conversation.");
+ return interaction.reply({ embeds: [embed], ephemeral: true });
+ }
+
+ if (conv[0].userid != interaction.user.id) {
+ const embed = errorEmbed("You are not the owner of this conversation.");
+ return interaction.reply({ embeds: [embed], ephemeral: true });
+ }
+
+ var channel = interaction.guild.channels.cache.get(interaction.channelId);
+
+ await removeConv(channel.id);
+ await channel.delete();
+ },
+};
diff --git a/commands/mistral/mistral.js b/commands/mistral/mistral.js
new file mode 100644
index 0000000..ac4cbb4
--- /dev/null
+++ b/commands/mistral/mistral.js
@@ -0,0 +1,32 @@
+const { SlashCommandBuilder } = require("discord.js");
+//const { sendConv } = require("../../libs/mistralAiFunctions");
+//const data = require("../../data.json");
+
+module.exports = {
+ data: new SlashCommandBuilder()
+ .setName("mistral")
+ .setDescription("Talk to Mistral AI")
+ .addSubcommand((subcommand) =>
+ subcommand
+ .setName("medium")
+ .setDescription("Talk to Mistral AI using the medium model")
+ .addStringOption((option) =>
+ option
+ .setName("message")
+ .setDescription("What do you want to say to Mistral AI?")
+ .setRequired(true)
+ )
+ ),
+ async execute(interaction) {
+ /*if (interaction.options.getSubcommand() === "medium") {
+ const message = interaction.options.getString("message");
+ messages = [
+ { role: system, text: data.prompt },
+ { role: user, text: message },
+ ];
+ const chatResponse = await sendConv(messages);
+ console.log(chatResponse);
+ await interaction.reply(chatResponse);
+ }*/
+ },
+};
diff --git a/commands/others/botinfo.js b/commands/others/botinfo.js
new file mode 100644
index 0000000..cd4898f
--- /dev/null
+++ b/commands/others/botinfo.js
@@ -0,0 +1,31 @@
+const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
+const { getQuotasSum } = require("../../libs/mysql.js");
+
+module.exports = {
+ data: new SlashCommandBuilder()
+ .setName("botinfo")
+ .setDescription("Get information about the bot."),
+ async execute(interaction) {
+ const quotasSum = await getQuotasSum();
+
+ const embed = new EmbedBuilder()
+ .setColor("#F6C6F9")
+ .setTitle("Bot Info")
+ .setDescription("Information about the bot.")
+ .addFields(
+ {
+ name: "Guilds",
+ value: interaction.client.guilds.cache.size.toString(),
+ inline: false,
+ },
+ {
+ name: "Total quota",
+ value: `${quotasSum[0]["SUM(quota)"]}$`,
+ inline: false,
+ }
+ )
+ .setFooter({ text: "Bot by @ninja_jambon" });
+
+ interaction.reply({ embeds: [embed] });
+ },
+};
diff --git a/commands/others/getquota.js b/commands/others/getquota.js
new file mode 100644
index 0000000..75ba477
--- /dev/null
+++ b/commands/others/getquota.js
@@ -0,0 +1,36 @@
+const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
+const { getUser } = require("../../libs/mysql.js");
+const { errorEmbed } = require("../../libs/embeds.js");
+const { sendLog } = require("../../libs/logs.js");
+
+module.exports = {
+ data: new SlashCommandBuilder()
+ .setName("getquota")
+ .setDescription("Get your current quota.")
+ .setDMPermission(false),
+ async execute(interaction) {
+ const user = await getUser(interaction.user.id).catch((err) => {
+ sendLog(err);
+
+ const embed = errorEmbed(
+ "An error occured while trying to get your user data."
+ );
+
+ return interaction.reply({ embeds: [embed], ephemeral: true });
+ });
+
+ if (!user[0]) {
+ const embed = errorEmbed("You don't have any quota yet.");
+
+ return interaction.reply({ embeds: [embed], ephemeral: true });
+ }
+
+ const embed = new EmbedBuilder()
+ .setColor("#F6C6F9")
+ .setTitle("Quota")
+ .setDescription(`You have ${0.4 - user[0].quota}$ of credits left.`)
+ .setFooter({ text: "Bot by @ninja_jambon" });
+
+ await interaction.reply({ embeds: [embed] });
+ },
+};
diff --git a/commands/others/help.js b/commands/others/help.js
new file mode 100644
index 0000000..99384a2
--- /dev/null
+++ b/commands/others/help.js
@@ -0,0 +1,34 @@
+const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
+
+module.exports = {
+ data: new SlashCommandBuilder()
+ .setName("help")
+ .setDescription("Get help about the bot."),
+ async execute(interaction) {
+ const helpMessage = `
+**Single requests:**
+- **/quickgpt**: Make a single request to the GPT-3.5 Turbo model.
+- **/gptrequest**: Make a single request to the GPT-4 model.
+
+**Conversations:**
+- **/addhub**: Add a conversation hub to the channel, user needs to have the ADMINISTRATOR permission and the channel needs to be a forum channel or a normal text channel.
+- **/closeconv**: Close the conversation in your channel, user needs to be the creator of the conversation.
+
+**Others:**
+- **/getquota**: Display your quota, you can use a total of 0.4$ of quota per month.
+- **/botinfo**: Display information about the bot.
+
+**Links:**
+- [Invite the bot](https://discord.com/api/oauth2/authorize?client_id=1059559067846189067&permissions=326417632256&scope=bot)
+- [Support server](https://discord.gg/WcZPz3nm5p)
+`;
+
+ const embed = new EmbedBuilder()
+ .setColor("#F6C6F9")
+ .setTitle("Help")
+ .setDescription(helpMessage)
+ .setFooter({ text: "Bot by @ninja_jambon" });
+
+ interaction.reply({ embeds: [embed] });
+ },
+};
diff --git a/commands/single requests/gptrequest.js b/commands/single requests/gptrequest.js
new file mode 100644
index 0000000..f9076a6
--- /dev/null
+++ b/commands/single requests/gptrequest.js
@@ -0,0 +1,107 @@
+const { SlashCommandBuilder } = require("discord.js");
+const {
+ getUser,
+ registerUser,
+ incrementQuota,
+} = require("../../libs/mysql.js");
+const { answerQuestion } = require("../../libs/openAi.js");
+const { checkLastResetDate } = require("../../libs/quotaReset.js");
+const { requestResponseEmbed, errorEmbed } = require("../../libs/embeds.js");
+const { sendLog } = require("../../libs/logs.js");
+
+module.exports = {
+ data: new SlashCommandBuilder()
+ .setName("gptrequest")
+ .setDescription("Make a single request to the GPT-4 API.")
+ .addStringOption((option) =>
+ option
+ .setName("prompt")
+ .setDescription("The prompt to send to the API.")
+ .setRequired(true)
+ ),
+ async execute(interaction) {
+ interaction.deferReply();
+ await checkLastResetDate();
+ user = await getUser(interaction.user.id).catch((err) => {
+ sendLog(err);
+
+ const embed = errorEmbed(
+ "An error occured while trying to get your user data."
+ );
+
+ return interaction.editReply({ embeds: [embed], ephemeral: true });
+ });
+
+ if (!user[0]) {
+ await registerUser(interaction.user.username, interaction.user.id).catch(
+ (err) => {
+ sendLog(err);
+
+ const embed = errorEmbed(
+ "An error occured while trying to register you in our database."
+ );
+
+ return interaction.editReply({ embeds: [embed], ephemeral: true });
+ }
+ );
+
+ user = await getUser(interaction.user.id).catch((err) => {
+ sendLog(err);
+
+ const embed = errorEmbed(
+ "An error occured while trying to get your user data."
+ );
+
+ return interaction.editReply({ embeds: [embed], ephemeral: true });
+ });
+ }
+
+ if (user[0].quota >= 0.4) {
+ const embed = errorEmbed(
+ "You don't have enough quota to use this command."
+ );
+
+ return await interaction.editReply({ embeds: [embed], ephemeral: true });
+ }
+
+ response = await answerQuestion(
+ interaction.options.getString("prompt")
+ ).catch((err) => {
+ sendLog(err);
+
+ const embed = errorEmbed(
+ "An error occured while trying to send the request to the API."
+ );
+
+ return interaction.editReply({ embeds: [embed], ephemeral: true });
+ });
+
+ const prompt_usage = (response.data.usage.prompt_tokens * 0.01) / 1000;
+ const completion_usage =
+ (response.data.usage.completion_tokens * 0.03) / 1000;
+
+ await incrementQuota(
+ interaction.user.id,
+ prompt_usage + completion_usage
+ ).catch((err) => {
+ sendLog(err);
+
+ const embed = errorEmbed(
+ "An error occured while trying to increment your quota."
+ );
+
+ return interaction.editReply({ embeds: [embed], ephemeral: true });
+ });
+
+ const embed = requestResponseEmbed(
+ interaction.user,
+ interaction.options.getString("prompt"),
+ response.data.choices[0].message.content,
+ user[0].quota,
+ prompt_usage,
+ completion_usage
+ );
+
+ await interaction.editReply({ embeds: [embed] });
+ },
+};
diff --git a/commands/single requests/quickgpt.js b/commands/single requests/quickgpt.js
new file mode 100644
index 0000000..96bb18d
--- /dev/null
+++ b/commands/single requests/quickgpt.js
@@ -0,0 +1,107 @@
+const { SlashCommandBuilder } = require("discord.js");
+const {
+ getUser,
+ registerUser,
+ incrementQuota,
+} = require("../../libs/mysql.js");
+const { quickAnswer } = require("../../libs/openAi.js");
+const { checkLastResetDate } = require("../../libs/quotaReset.js");
+const { requestResponseEmbed, errorEmbed } = require("../../libs/embeds.js");
+const { sendLog } = require("../../libs/logs.js");
+
+module.exports = {
+ data: new SlashCommandBuilder()
+ .setName("quickgpt")
+ .setDescription("Make a single request to the GPT-3.5-turbo API.")
+ .addStringOption((option) =>
+ option
+ .setName("prompt")
+ .setDescription("The prompt to send to the API.")
+ .setRequired(true)
+ ),
+ async execute(interaction) {
+ await interaction.deferReply();
+ await checkLastResetDate();
+ user = await getUser(interaction.user.id).catch((err) => {
+ sendLog(err);
+
+ const embed = errorEmbed(
+ "An error occured while trying to get your user data."
+ );
+
+ return interaction.editReply({ embeds: [embed], ephemeral: true });
+ });
+
+ if (!user[0]) {
+ await registerUser(interaction.user.username, interaction.user.id).catch(
+ (err) => {
+ sendLog(err);
+
+ const embed = errorEmbed(
+ "An error occured while trying to register you in our database."
+ );
+
+ return interaction.editReply({ embeds: [embed], ephemeral: true });
+ }
+ );
+
+ user = await getUser(interaction.user.id).catch((err) => {
+ sendLog(err);
+
+ const embed = errorEmbed(
+ "An error occured while trying to get your user data."
+ );
+
+ return interaction.editReply({ embeds: [embed], ephemeral: true });
+ });
+ }
+
+ if (user[0].quota >= 0.4) {
+ const embed = errorEmbed(
+ "You don't have enough quota to use this command."
+ );
+
+ return await interaction.editReply({ embeds: [embed], ephemeral: true });
+ }
+
+ response = await quickAnswer(interaction.options.getString("prompt")).catch(
+ (err) => {
+ sendLog(err);
+
+ const embed = errorEmbed(
+ "An error occured while trying to send the request to the API."
+ );
+
+ return interaction.editReply({ embeds: [embed], ephemeral: true });
+ }
+ );
+
+ const prompt_usage = (response.data.usage.prompt_tokens * 0.001) / 1000;
+ const completion_usage =
+ (response.data.usage.completion_tokens * 0.002) / 1000;
+
+ await incrementQuota(
+ interaction.user.id,
+ prompt_usage + completion_usage
+ ).catch((err) => {
+ sendLog(err);
+
+ const embed = errorEmbed(
+ "An error occured while trying to increment your quota."
+ );
+
+ return interaction.editReply({ embeds: [embed], ephemeral: true });
+ });
+
+ const embed = requestResponseEmbed(
+ interaction.user,
+ interaction.options.getString("prompt"),
+ response.data.choices[0].message.content,
+ user[0].quota,
+ prompt_usage,
+ completion_usage
+ );
+
+ await interaction.editReply({ embeds: [embed] });
+ },
+};
diff --git a/data/prompt.json b/data/prompt.json
new file mode 100644
index 0000000..fa761e4
--- /dev/null
+++ b/data/prompt.json
@@ -0,0 +1,3 @@
+{
+ "prompt": "Tu es un bot discord s'appelant NekoSuru, tu es une catgirl futuriste. Tu es amicale et tutois les utilisateurs."
+}
\ No newline at end of file
diff --git a/docker-compose-exemple.yml b/docker-compose-exemple.yml
deleted file mode 100644
index 63677df..0000000
--- a/docker-compose-exemple.yml
+++ /dev/null
@@ -1,48 +0,0 @@
-version: '3.1'
-
-services:
- chaisebot:
- build:
- context: .
- dockerfile: Dockerfile
- restart: always
- environment:
- TELEGRAM: your telegram token
- OPENAI: your openai token
- DISCORD: your discord token
- MYSQL: your mysql password
- MYSQL_HOST: 172.16.0.3
- networks:
- chaise_bot:
- ipv4_address: 172.16.0.2
- volumes:
- - /your/bot/path:/app
- db:
- image: mariadb:latest
- restart: always
- environment:
- MYSQL_ROOT_PASSWORD: your mysql password
- networks:
- chaise_bot:
- ipv4_address: 172.16.0.3
- volumes:
- - /your/mysql/path:/var/lib/mysql
-
- phpmyadmin:
- image: phpmyadmin:latest
- restart: always
- ports:
- - 8080:80
- environment:
- - PMA_ARBITRARY=1
- networks:
- chaise_bot:
- ipv4_address: 172.16.0.4
-
-networks:
- chaise_bot:
- ipam:
- driver: default
- config:
- - subnet: 172.16.0.0/24
- gateway: 172.16.0.1
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..0d13efb
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,18 @@
+version: '3.1'
+
+services:
+ chaisebot:
+ build:
+ context: .
+ dockerfile: DOCKERFILE
+ restart: always
+ networks:
+ db_system:
+ ipv4_address: 172.16.0.11
+ volumes:
+ - /home/lucien/chaisebot:/app
+
+networks:
+ db_system:
+ name : dbsystem_db_system
+ external: true
\ No newline at end of file
diff --git a/events/discordEvents.js b/events/discordEvents.js
deleted file mode 100644
index f005cf3..0000000
--- a/events/discordEvents.js
+++ /dev/null
@@ -1,159 +0,0 @@
-const discord = require('discord.js');
-
-const { commands } = require('../commands/commands');
-
-const gptrequest = require('../functions/discord/gptrequest');
-const quickGptrequest = require('../functions/discord/quickGptrequest');
-const addconv = require('../functions/discord/addconv');
-const delconv = require('../functions/discord/delconv');
-const listconvs = require('../functions/discord/listconvs');
-const addmsg = require('../functions/discord/addmsg');
-const displayconv = require('../functions/discord/displayconv');
-const getmyguota = require('../functions/discord/getmyguota');
-const github = require('../functions/discord/github');
-const dalle = require('../functions/discord/dalle');
-const addchannel = require('../functions/discord/addchannel');
-const deletechannel = require('../functions/discord/deletechannel');
-const help = require('../functions/discord/help');
-
-const { listchannels, incrementQuota, isNewUser } = require('../libs/mysql');
-const { sendQuickConv } = require('../libs/openAi')
-
-module.exports = {
- newMessage: (client) => {
- client.on('messageCreate', async msg => {
- const channels = await listchannels();
- channelId = msg.channel.id;
-
- quota = await isNewUser(msg.author.id, msg.author.username).catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- if (!channels.includes(channelId) || msg.author.bot == true) {}
-
- else if (quota.quota >= 200000) {
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Quota exceeded", iconURL: client.user.displayAvatarURL() })
- .setDescription("Quota exceeded, please wait untill reset (every month)")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- msg.reply({ embeds: [embed] });
- } else {
- discordMessages = await msg.channel.messages.fetch({ limit: 8 })
-
- discordMessages.reverse();
-
- messages = [{"role": "system", "content": "You are a helpful assistant."}];
-
- discordMessages.forEach(async message => {
- if (msg.author.id == '1059559067846189067') {
- messages.push({"role" : "assistant", "content" : message.content});
- } else {
- messages.push({"role" : "user", "content" : message.content});
- }
- });
-
- response = await sendQuickConv(messages);
-
- msg.reply(response.data.choices[0].message.content);
-
- incrementQuota(msg.author.id, response.data.usage.total_tokens);
- }
- });
- },
-
-
- newInteraction: (client) => {
- client.on('interactionCreate', async interaction => {
- if (!interaction.isCommand()) return;
-
- if (interaction.commandName === 'gptrequest') {
- gptrequest(interaction, client);
- }
-
- else if (interaction.commandName === 'quickgpt') {
- quickGptrequest(interaction, client);
- }
-
- else if (interaction.commandName === 'info') {
- console.log(interaction)
- }
-
- else if (interaction.commandName === 'addconv') {
- addconv(interaction, client);
- }
-
- else if (interaction.commandName === 'delconv') {
- delconv(interaction, client);
- }
-
- else if (interaction.commandName === 'listconvs') {
- listconvs(interaction, client);
- }
-
- else if (interaction.commandName === 'addmsg') {
- addmsg(interaction, client);
- }
-
- else if (interaction.commandName === 'displayconv') {
- displayconv(interaction, client);
- }
-
- else if (interaction.commandName === 'getmyguota') {
- getmyguota(interaction);
- }
-
- else if (interaction.commandName === 'github') {
- github(interaction, client);
- }
-
- else if (interaction.commandName === 'dalle') {
- dalle(interaction, client);
- }
-
- else if (interaction.commandName === 'addchannel') {
- addchannel(interaction, client);
- }
-
- else if (interaction.commandName === 'deletechannel') {
- deletechannel(interaction, client);
- }
-
- else if (interaction.commandName === 'help') {
- help(interaction, client);
- }
- });
- },
-
- ready: (client) => {
- client.on('ready', async () => {
- console.log(`[Discord] Logged in as ${client.user.tag} !`);
-
- const rest = new discord.REST({ version: '10' }).setToken(process.env.DISCORD);
-
- await rest.put(
- discord.Routes.applicationCommands('1059559067846189067'),
- { body: commands },
- );
-
- console.log('[Discord] Successfully reloaded application (/) commands globally.');
-
- client.user.setPresence({ activities: [{ name: client.guilds.cache.size + ' servers !', type: 3 }] });
-
- n = 1;
-
- act = [
- [{ name: client.guilds.cache.size + ' servers !', type: 3 }],
- [{ name: '/help command', type: 3 }],
- ];
-
- setInterval(() => {
- client.user.setPresence({ activities: act[n] });
- if (n == 1) { n = 0; }
- else { n = 1; }
- }, 10000);
- });
- },
-}
\ No newline at end of file
diff --git a/events/interactionCreate.js b/events/interactionCreate.js
new file mode 100644
index 0000000..8208872
--- /dev/null
+++ b/events/interactionCreate.js
@@ -0,0 +1,120 @@
+const {
+ Events,
+ ButtonBuilder,
+ ActionRowBuilder,
+ ButtonStyle,
+} = require("discord.js");
+const { addConv, removeConv, getConv } = require("../libs/mysql.js");
+const {
+ errorEmbed,
+ convBeginEmbed,
+ convCreatedEmbed,
+} = require("../libs/embeds.js");
+const { sendLog } = require("../libs/logs.js");
+
+module.exports = {
+ name: Events.InteractionCreate,
+ async execute(interaction) {
+ if (interaction.isChatInputCommand()) {
+ const command = interaction.client.commands.get(interaction.commandName);
+
+ if (!command) {
+ console.error(
+ `No command matching ${interaction.commandName} was found.`
+ );
+ return;
+ }
+
+ try {
+ await command.execute(interaction);
+ } catch (error) {
+ sendLog(error);
+ }
+ }
+
+ if (interaction.isButton()) {
+ if (interaction.customId == "create_conversation") {
+ var channel = interaction.guild.channels.cache.get(
+ interaction.message.channelId
+ );
+
+ if (channel.type == 11) {
+ channel = interaction.guild.channels.cache.get(channel.parentId);
+ }
+
+ const embed = convBeginEmbed();
+
+ const button = new ButtonBuilder()
+ .setCustomId("close_conversation")
+ .setLabel("Close conversation")
+ .setStyle(ButtonStyle.Danger);
+
+ const actionRow = new ActionRowBuilder().addComponents(button);
+
+ channel = await channel.threads
+ .create({
+ name: interaction.user.username + "'s conversation",
+ message: {
+ embeds: [embed],
+ components: [actionRow],
+ },
+ })
+ .catch((err) => {
+ sendLog(err);
+ });
+
+ const embed2 = convCreatedEmbed(channel.id);
+
+ await addConv(
+ interaction.user.id,
+ channel.id,
+ interaction.guild.id
+ ).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while creating the conversation."
+ );
+ return interaction.reply({ embeds: [embed], ephemeral: true });
+ });
+
+ await interaction.reply({ embeds: [embed2], ephemeral: true });
+ } else if (interaction.customId == "close_conversation") {
+ const conv = await getConv(interaction.message.channelId).catch(
+ (err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while closing the conversation."
+ );
+ return interaction.reply({ embeds: [embed], ephemeral: true });
+ }
+ );
+
+ if (conv[0].userid != interaction.user.id) {
+ const embed = errorEmbed("You can't close this conversation.");
+
+ return interaction.reply({ embeds: [embed], ephemeral: true });
+ }
+
+ var channel = interaction.guild.channels.cache.get(
+ interaction.message.channelId
+ );
+
+ await removeConv(channel.id).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while closing the conversation."
+ );
+ return interaction.reply({ embeds: [embed], ephemeral: true });
+ });
+
+ await channel.delete().catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while closing the conversation."
+ );
+ return interaction.reply({ embeds: [embed], ephemeral: true });
+ });
+ }
+ }
+ },
+};
diff --git a/events/messageCreate.js b/events/messageCreate.js
new file mode 100644
index 0000000..aa240c0
--- /dev/null
+++ b/events/messageCreate.js
@@ -0,0 +1,315 @@
+const { Events, EmbedBuilder } = require("discord.js");
+const {
+ getConv,
+ getUser,
+ registerUser,
+ incrementQuota,
+} = require("../libs/mysql.js");
+const { sendQuickConv, quickAnswer } = require("../libs/openAi.js");
+const { checkLastResetDate } = require("../libs/quotaReset.js");
+const prompt = require("../data/prompt.json").prompt;
+require("dotenv").config();
+const { errorEmbed } = require("../libs/embeds.js");
+const { sendLog } = require("../libs/logs.js");
+
+module.exports = {
+ name: Events.MessageCreate,
+ async execute(message) {
+ conv = await getConv(message.channel.id);
+
+ if (!message.guildId && message.author.id != "1059559067846189067") {
+ await checkLastResetDate();
+ user = await getUser(message.author.id).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to get your data from the database."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+
+ if (!user[0]) {
+ await registerUser(message.author.username, message.author.id).catch(
+ (err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to register you in the database."
+ );
+ return message.reply({ embeds: [embed] });
+ }
+ );
+
+ user = await getUser(message.author.id).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to get your data from the database."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+ }
+
+ if (user[0].quota >= 0.4)
+ return await message.reply({
+ content: "You don't have enough quota to talk with the bot.",
+ ephemeral: true,
+ });
+
+ discordMessages = await message.channel.messages.fetch().catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to fetch the messages from the channel."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+
+ discordMessages.filter((message) => message.content);
+ messages = [];
+ var i = 0;
+ discordMessages.forEach(async (message) => {
+ if (i == 6) return;
+ if (message.author.id == "1059559067846189067") {
+ messages.push({ role: "assistant", content: message.content });
+ i++;
+ } else {
+ messages.push({ role: "user", content: message.content });
+ i++;
+ }
+ });
+ messages.reverse();
+ messages.unshift({ role: "system", content: prompt });
+
+ message.channel.sendTyping().catch((err) => {
+ sendLog(err);
+ });
+
+ const response = await sendQuickConv(messages).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to send the request to the API."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+
+ const prompt_usage = (response.data.usage.prompt_tokens * 0.001) / 1000;
+ const completion_usage =
+ (response.data.usage.completion_tokens * 0.002) / 1000;
+
+ await incrementQuota(
+ message.author.id,
+ prompt_usage + completion_usage
+ ).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to increment your quota."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+
+ if (response.data.choices[0].message.content.length <= 2000) {
+ await message.reply(response.data.choices[0].message.content);
+ } else {
+ let paragraphs = response.data.choices[0].message.content.split("\n");
+ messageText = "";
+
+ paragraphs.forEach((paragraph) => {
+ if (`${messageText}${paragraph}`.length > 2000) {
+ message.reply(messageText);
+ messageText = `${paragraph}\n`;
+ } else {
+ messageText += `${paragraph}\n`;
+ }
+ });
+ }
+ } else if (
+ message.content.includes(`<@${process.env.BOT_ID}>`) ||
+ (message.mentions.repliedUser &&
+ message.mentions.repliedUser.id == process.env.BOT_ID)
+ ) {
+ await checkLastResetDate();
+ user = await getUser(message.author.id).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to get your data from the database."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+
+ if (!user[0]) {
+ await registerUser(message.author.username, message.author.id).catch(
+ (err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to register you in the database."
+ );
+ return message.reply({ embeds: [embed] });
+ }
+ );
+
+ user = await getUser(message.author.id).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to get your data from the database."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+ }
+
+ if (user[0].quota >= 0.4)
+ return await message.reply({
+ content: "You don't have enough quota to use this command.",
+ ephemeral: true,
+ });
+
+ message.channel.sendTyping().catch((err) => {
+ sendLog(err);
+ });
+
+ response = await quickAnswer(message.content).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to send the request to the API."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+
+ const prompt_usage = (response.data.usage.prompt_tokens * 0.01) / 1000;
+ const completion_usage =
+ (response.data.usage.completion_tokens * 0.03) / 1000;
+
+ await incrementQuota(
+ message.author.id,
+ prompt_usage + completion_usage
+ ).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to increment your quota."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+
+ if (response.data.choices[0].message.content.length <= 2000) {
+ await message.reply({
+ content: response.data.choices[0].message.content,
+ });
+ } else {
+ const embed = new EmbedBuilder()
+ .setTitle("Answer")
+ .setDescription(response.data.choices[0].message.content)
+ .setColor("#F6C6F9")
+ .setFooter({ text: "Bot by @ninja_jambon" });
+
+ await message.reply({ embeds: [embed] });
+ }
+ } else if (
+ conv[0] &&
+ message.author.id != "1059559067846189067" &&
+ conv[0].userid == message.author.id
+ ) {
+ await checkLastResetDate();
+ user = await getUser(message.author.id).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to get your data from the database."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+
+ if (!user[0]) {
+ await registerUser(message.author.username, message.author.id).catch(
+ (err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to register you in the database."
+ );
+ return message.reply({ embeds: [embed] });
+ }
+ );
+
+ user = await getUser(message.author.id).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to get your data from the database."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+ }
+
+ if (user[0].quota >= 0.4)
+ return await message.reply({
+ content: "You don't have enough quota to talk with the bot.",
+ ephemeral: true,
+ });
+
+ discordMessages = await message.channel.messages.fetch().catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to fetch the messages from the channel."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+
+ discordMessages.filter(
+ (message) =>
+ (message.author.id == "1059559067846189067" ||
+ message.author.id == conv[0].userid) &&
+ message.content
+ );
+ messages = [];
+ var i = 0;
+ discordMessages.forEach(async (message) => {
+ if (i == 6) return;
+ if (message.author.id == "1059559067846189067") {
+ messages.push({ role: "assistant", content: message.content });
+ i++;
+ } else if (message.author.id == conv[0].userid) {
+ messages.push({ role: "user", content: message.content });
+ i++;
+ }
+ });
+ messages.reverse();
+ messages.unshift({ role: "system", content: prompt });
+
+ message.channel.sendTyping().catch((err) => {
+ sendLog(err);
+ });
+
+ const response = await sendQuickConv(messages).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to send the request to the API."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+
+ const prompt_usage = (response.data.usage.prompt_tokens * 0.001) / 1000;
+ const completion_usage =
+ (response.data.usage.completion_tokens * 0.002) / 1000;
+
+ await incrementQuota(
+ message.author.id,
+ prompt_usage + completion_usage
+ ).catch((err) => {
+ sendLog(err);
+ const embed = errorEmbed(
+ "An error occured while trying to increment your quota."
+ );
+ return message.reply({ embeds: [embed] });
+ });
+
+ if (response.data.choices[0].message.content.length <= 2000) {
+ await message.reply(response.data.choices[0].message.content);
+ } else {
+ let paragraphs = response.data.choices[0].message.content.split("\n");
+ messageText = "";
+
+ paragraphs.forEach((paragraph) => {
+ if (`${messageText}${paragraph}`.length > 2000) {
+ message.reply(messageText);
+ messageText = `${paragraph}\n`;
+ } else {
+ messageText += `${paragraph}\n`;
+ }
+ });
+ }
+ }
+ },
+};
diff --git a/events/ready.js b/events/ready.js
new file mode 100644
index 0000000..6e4bc4d
--- /dev/null
+++ b/events/ready.js
@@ -0,0 +1,23 @@
+const { Events } = require("discord.js");
+const { sendLog } = require("../libs/logs.js");
+
+module.exports = {
+ name: Events.ClientReady,
+ once: true,
+ execute(client) {
+ console.log(`Ready! Logged in as ${client.user.tag}`);
+ sendLog(`Ready! Logged in as ${client.user.tag}`);
+
+ client.user.setPresence({
+ activities: [{ name: client.guilds.cache.size + " servers !", type: 3 }],
+ });
+
+ setInterval(() => {
+ client.user.setPresence({
+ activities: [
+ { name: client.guilds.cache.size + " servers !", type: 3 },
+ ],
+ });
+ }, 10000);
+ },
+};
diff --git a/functions/discord/addchannel.js b/functions/discord/addchannel.js
deleted file mode 100644
index f843dfe..0000000
--- a/functions/discord/addchannel.js
+++ /dev/null
@@ -1,43 +0,0 @@
-const { listchannels, addChannel } = require('../../libs/mysql');
-const { EmbedBuilder, PermissionsBitField } = require('discord.js');
-
-async function addchannel(interaction, client) {
- await interaction.deferReply();
-
- if (!interaction.memberPermissions.has(PermissionsBitField.Flags.Administrator)) {
- const embed = new EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Error", iconURL: client.user.displayAvatarURL() })
- .setDescription("You must be an administrator to use this command.")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
- return;
- }
-
- channels = await listchannels();
-
- id = interaction.options.get('channel').value;
-
- if (!channels.includes(id)) {
- addChannel(id);
-
- const embed = new EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Channel added", iconURL: client.user.displayAvatarURL() })
- .setDescription("Channel " + id + " added to db")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
- } else {
- const embed = new EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Error", iconURL: client.user.displayAvatarURL() })
- .setDescription("Channel " + id + " already exists in the database.")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
- }
-}
-
-module.exports = addchannel;
\ No newline at end of file
diff --git a/functions/discord/addconv.js b/functions/discord/addconv.js
deleted file mode 100644
index d87497f..0000000
--- a/functions/discord/addconv.js
+++ /dev/null
@@ -1,39 +0,0 @@
-const discord = require('discord.js');
-
-const { addToLogs } = require('../../libs/botTools');
-const { addConv, getConvs } = require('../../libs/mysql');
-
-async function addconv(interaction, client) {
- await interaction.deferReply();
- convs = await getConvs().catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- if (!interaction.options.get('name').value.includes(" ") && !convs.includes(interaction.options.get('name').value)) {
- await addConv(interaction.options.get('name').value);
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Conversation added", iconURL: client.user.displayAvatarURL() })
- .setDescription("Conversation " + interaction.options.get('name').value + " added to db")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
-
- addToLogs('[Discord] Added conversation : ' + interaction.options.get('name').value);
- console.log('[Discord] Added conversation : ' + interaction.options.get('name').value);
- } else {
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Error", iconURL: client.user.displayAvatarURL() })
- .setDescription("Verify the name of the conversation (it must not contain spaces and must be unique).")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
-
- addToLogs('[Discord] Error adding conversation : ' + interaction.options.get('name').value);
- console.log('[Discord] Error adding conversation : ' + interaction.options.get('name').value);
- }
-}
-
-module.exports = addconv;
\ No newline at end of file
diff --git a/functions/discord/addmsg.js b/functions/discord/addmsg.js
deleted file mode 100644
index d07cd78..0000000
--- a/functions/discord/addmsg.js
+++ /dev/null
@@ -1,86 +0,0 @@
-const discord = require('discord.js');
-
-const { addToLogs } = require('../../libs/botTools');
-const { sendConv } = require('../../libs/openAi');
-const { getConvs, addMessage, getMessages, isNewUser, incrementQuota } = require('../../libs/mysql');
-
-async function addmsg(interaction, client) {
- await interaction.deferReply();
-
- quota = await isNewUser(interaction.member.user.id, interaction.member.user.username).catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- if (quota.quota >= 200000) {
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Quota exceeded", iconURL: client.user.displayAvatarURL() })
- .setDescription("Quota exceeded, please wait untill reset (every month)")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
-
- addToLogs('[Discord] Quota exceeded for user : ' + interaction.member.user.username);
- console.log('[Discord] Quota exceeded for user : ' + interaction.member.user.username);
- } else {
- convs = await getConvs().catch((err) => {
- console.log(err);
- addToLogs(err);
- });
- if (!convs.includes(interaction.options.get('name').value)) {
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Error", iconURL: client.user.displayAvatarURL() })
- .setDescription("Conversation not found in the database")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
-
- addToLogs('[Discord] Conversation not found in the database : ' + interaction.options.get('name').value);
- console.log('[Discord] Conversation not found in the database : ' + interaction.options.get('name').value);
- } else {
- await addMessage(interaction.options.get('name').value, "user", interaction.options.get('message').value.replace(/"/g, "\'").replace("\""), interaction.member.user.username).catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- messages = await getMessages(interaction.options.get('name').value, "role").catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- sendConv(messages).then((res) => {
- incrementQuota(interaction.member.user.id, res.data.usage.total_tokens * 15).catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- addMessage(interaction.options.get('name').value, "assistant", res.data.choices[0].message.content.replace(/"/g, "\'").replace("\""), "Chaise bot").catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- const embed_user = new discord.EmbedBuilder()
- .setColor(0xBBFAF4)
- .setAuthor({ name: interaction.member.user.username, iconURL: "https://cdn.discordapp.com/avatars/" + interaction.member.user.id + "/" + interaction.member.user.avatar + ".jpeg" })
- .setDescription(interaction.options.get('message').value);
-
- const embed_bot = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Chaise bot", iconURL: client.user.displayAvatarURL() })
- .setDescription(res.data.choices[0].message.content)
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed_user, embed_bot] });
-
- addToLogs('[Discord] Added message to conversation : ' + interaction.options.get('name').value);
- console.log('[Discord] Added message to conversation : ' + interaction.options.get('name').value);
- }).catch((err) => {
- console.log(err);
- })
- }
- }
-}
-
-module.exports = addmsg;
\ No newline at end of file
diff --git a/functions/discord/dalle.js b/functions/discord/dalle.js
deleted file mode 100644
index 7b6429e..0000000
--- a/functions/discord/dalle.js
+++ /dev/null
@@ -1,47 +0,0 @@
-const discord = require('discord.js');
-
-const { addToLogs } = require('../../libs/botTools');
-const { generateImage } = require('../../libs/openAi');
-const { isNewUser, incrementQuota } = require('../../libs/mysql');
-
-async function dalle (interaction, client) {
- await interaction.deferReply();
-
- quota = await isNewUser(interaction.member.user.id, interaction.member.user.username).catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- if (quota.quota >= 200000) {
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Quota exceeded", iconURL: client.user.displayAvatarURL() })
- .setDescription("You have a quota of " + quota.quota + " tokens, please wait until reset (every months)")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
- }
- else {
- const response = await generateImage(interaction.options.getString('query')).catch((err) => {
- interaction.editReply("Something went wrong");
- console.log(err);
- addToLogs('--> error : ' + err);
- });
-
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Image generated for : " + interaction.member.user.username, iconURL: "https://cdn.discordapp.com/avatars/" + interaction.member.user.id + "/" + interaction.member.user.avatar + ".jpeg" })
- .setTitle("Query : " + interaction.options.get('query').value)
- .setImage(response.data.data[0].url)
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
-
- incrementQuota(interaction.member.user.id, 10000).catch((err) => {
- console.log(err);
- addToLogs(err);
- });
- }
-}
-
-module.exports = dalle;
\ No newline at end of file
diff --git a/functions/discord/delconv.js b/functions/discord/delconv.js
deleted file mode 100644
index 3257abc..0000000
--- a/functions/discord/delconv.js
+++ /dev/null
@@ -1,39 +0,0 @@
-const discord = require('discord.js');
-
-const { addToLogs } = require('../../libs/botTools');
-const { delConv, getConvs } = require('../../libs/mysql');
-
-async function delconv(interaction, client) {
- await interaction.deferReply();
-
- convs = await getConvs().catch((err) => {
- console.log(err);
- addToLogs(err);
- });
- if (!convs.includes(interaction.options.get('name').value)) {
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Error", iconURL: client.user.displayAvatarURL() })
- .setDescription("Conversation not found in the database")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
-
- addToLogs('[Discord] Conversation not found in the database : ' + interaction.options.get('name').value);
- console.log('[Discord] Conversation not found in the database : ' + interaction.options.get('name').value);
- } else {
- await delConv(interaction.options.get('name').value);
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Conversation deleted", iconURL: client.user.displayAvatarURL() })
- .setDescription("Conversation " + interaction.options.get('name').value + " deleted from the database")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
-
- addToLogs('[Discord] Conversation deleted from the database : ' + interaction.options.get('name').value);
- console.log('[Discord] Conversation deleted from the database : ' + interaction.options.get('name').value);
- }
-}
-
-module.exports = delconv;
\ No newline at end of file
diff --git a/functions/discord/deletechannel.js b/functions/discord/deletechannel.js
deleted file mode 100644
index 05d194e..0000000
--- a/functions/discord/deletechannel.js
+++ /dev/null
@@ -1,43 +0,0 @@
-const { listchannels, deleteChannel } = require('../../libs/mysql');
-const { EmbedBuilder, PermissionsBitField } = require('discord.js');
-
-async function delechannel(interaction, client) {
- await interaction.deferReply();
-
- if (!interaction.memberPermissions.has(PermissionsBitField.Flags.Administrator)) {
- const embed = new EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Error", iconURL: client.user.displayAvatarURL() })
- .setDescription("You must be an administrator to use this command.")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
- return;
- }
-
- channels = await listchannels();
-
- id = interaction.options.get('channel').value;
-
- if (channels.includes(id)) {
- deleteChannel(id);
-
- const embed = new EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Channel deleted", iconURL: client.user.displayAvatarURL() })
- .setDescription("Channel " + id + " deleted from db")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
- } else {
- const embed = new EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Error", iconURL: client.user.displayAvatarURL() })
- .setDescription("Channel " + id + " does not exist in the database.")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
- }
-}
-
-module.exports = delechannel;
\ No newline at end of file
diff --git a/functions/discord/displayconv.js b/functions/discord/displayconv.js
deleted file mode 100644
index 2cf21fa..0000000
--- a/functions/discord/displayconv.js
+++ /dev/null
@@ -1,70 +0,0 @@
-const discord = require('discord.js');
-
-const { addToLogs } = require('../../libs/botTools');
-const { getConvs, getMessages } = require('../../libs/mysql');
-
-async function displayconv(interaction, client) {
- await interaction.deferReply();
-
- if (interaction.options.get('name').value.includes(" ")) {
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Error", iconURL: client.user.displayAvatarURL() })
- .setDescription("Conversation name can't contain spaces")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
-
- addToLogs('[Discord] Conversation name can\'t contain spaces');
- console.log('[Discord] Conversation name can\'t contain spaces');
- } else {
- convs = await getConvs().catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- if (!convs.includes(interaction.options.get('name').value)) {
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Error", iconURL: client.user.displayAvatarURL() })
- .setDescription("Conversation not found in the database")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
-
- addToLogs('[Discord] Conversation not found in the database');
- console.log('[Discord] Conversation not found in the database');
- }
-
- messages = await getMessages(interaction.options.get('name').value, "user").catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- embed_text = "";
-
- messages.forEach(element => {
- if (element.user == "System") { }
- else {
- embed_text += "**" + element.user + "** : " + element.content + "\n\n";
- }
- });
-
- if (embed_text.length > 4096) {
- embed_text = "Conversation too long to display";
- }
-
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Conversation : " + interaction.options.get('name').value, iconURL: client.user.displayAvatarURL() })
- .setDescription(embed_text)
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
-
- addToLogs('[Discord] Displayed conversation : ' + interaction.options.get('name').value);
- console.log('[Discord] Displayed conversation : ' + interaction.options.get('name').value);
- }
-}
-
-module.exports = displayconv;
\ No newline at end of file
diff --git a/functions/discord/getmyguota.js b/functions/discord/getmyguota.js
deleted file mode 100644
index 12d8de7..0000000
--- a/functions/discord/getmyguota.js
+++ /dev/null
@@ -1,26 +0,0 @@
-const discord = require('discord.js');
-
-const { addToLogs } = require('../../libs/botTools');
-const { isNewUser } = require('../../libs/mysql');
-
-async function getmyguota(interaction) {
- await interaction.deferReply();
-
- quota = (await isNewUser(interaction.member.user.id, interaction.member.user.username).catch((error) => {
- console.log(error);
- addToLogs(error);
- })).quota;
-
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Quota : " + interaction.member.user.username, iconURL: "https://cdn.discordapp.com/avatars/" + interaction.member.user.id + "/" + interaction.member.user.avatar + ".jpeg" })
- .setDescription("You have " + (200000 - quota) + " tokens left this month")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
-
- addToLogs('[Discord] Quota requested by ' + interaction.member.user.username);
- console.log('[Discord] Quota requested by ' + interaction.member.user.username);
-}
-
-module.exports = getmyguota ;
\ No newline at end of file
diff --git a/functions/discord/github.js b/functions/discord/github.js
deleted file mode 100644
index fcb4052..0000000
--- a/functions/discord/github.js
+++ /dev/null
@@ -1,20 +0,0 @@
-const discord = require('discord.js');
-
-const { addToLogs } = require('../../libs/botTools');
-
-async function github(interaction, client) {
- await interaction.deferReply();
-
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Github", iconURL: client.user.displayAvatarURL() })
- .setDescription('Link of the Gihhub repository :\n https://github.com/Ninja-Jambon/chaise_bot')
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
-
- addToLogs('[Discord] Github requested by ' + interaction.member.user.username);
- console.log('[Discord] Github requested by ' + interaction.member.user.username);
-}
-
-module.exports = github;
\ No newline at end of file
diff --git a/functions/discord/gptrequest.js b/functions/discord/gptrequest.js
deleted file mode 100644
index 78b75fe..0000000
--- a/functions/discord/gptrequest.js
+++ /dev/null
@@ -1,72 +0,0 @@
-const discord = require('discord.js');
-
-const { addToLogs } = require('../../libs/botTools');
-const { answerQuestion } = require('../../libs/openAi');
-const { incrementQuota, isNewUser } = require('../../libs/mysql');
-
-async function gptrequest(interaction, client) {
- await interaction.deferReply();
-
- quota = await isNewUser(interaction.member.user.id, interaction.member.user.username).catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- if (quota.quota >= 200000) {
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Quota exceeded", iconURL: client.user.displayAvatarURL() })
- .setDescription("You have a quota of " + quota.quota + " tokens, please wait until reset (every months)")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
- }
- else {
- answerQuestion(interaction.options.get('question').value).then((res) => {
- incrementQuota(interaction.member.user.id, res.data.usage.total_tokens * 15).catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- if (res.data.choices[0].message.content.length > 4096) {
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Reply to : " + interaction.member.user.username, iconURL: "https://cdn.discordapp.com/avatars/" + interaction.member.user.id + "/" + interaction.member.user.avatar + ".jpeg" })
- .setTitle("Question : " + interaction.options.get('question').value)
- .setDescription("The answer is too long to be displayed, please try again with a shorter question.")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- console.log('[Discord] Sent answer to : ' + interaction.options.get('question').value);
- addToLogs('[Discord] Sent answer to : ' + interaction.options.get('question').value);
- interaction.editReply({ embeds: [embed] });
- }
- else {
- title = "Question : " + interaction.options.get('question').value;
-
- if (title.length > 256) {
- title = title.slice(0, 253) + "...";
- }
-
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Reply to : " + interaction.member.user.username, iconURL: "https://cdn.discordapp.com/avatars/" + interaction.member.user.id + "/" + interaction.member.user.avatar + ".jpeg" })
- .setTitle(title)
- .setDescription(res.data.choices[0].message.content)
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- console.log('[Discord] Sent answer to : ' + interaction.options.get('question').value);
- addToLogs('[Discord] Sent answer to : ' + interaction.options.get('question').value);
- interaction.editReply({ embeds: [embed] });
- }
- }).catch((err) => {
- console.log(err);
- addToLogs(err);
- interaction.editReply("Something went wrong");
- })
-
- console.log('[Discord] Generating answer to : ' + interaction.options.get('question').value);
- addToLogs('[Discord] Generating answer to : ' + interaction.options.get('question').value);
- }
-}
-
-module.exports = gptrequest;
\ No newline at end of file
diff --git a/functions/discord/help.js b/functions/discord/help.js
deleted file mode 100644
index 209e745..0000000
--- a/functions/discord/help.js
+++ /dev/null
@@ -1,38 +0,0 @@
-const { EmbedBuilder } = require('discord.js');
-
-function help(interaction, client) {
- const embed = new EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Help", iconURL: client.user.displayAvatarURL() })
- .setDescription(`
- **OpenAI basic commands :**
- \`/gptrequest [query]\` : Make a request to the GPT-4 API
- \`/quickgpt [query]\` : Make a request to the GPT-3.5-turbo API
- \`/dalle [query]\` : Make a request to the DALL-E API
-
- **OpenAI conversations commands :**
- *Note : These commands allow you to create conversations and add messages to them, so that the bot will remember your previous messages*
-
- \`/addconv [convName]\` : Add a conversation to the database
- \`/delconv [convName]\` : Delete a conversation from the database
- \`/listconvs\` : List all the conversations in the database
- \`/displayconv [convName]\` : Display a conversation from the database
- \`/addmsg [message]\` : Add a message to the conversation
-
- **Channel commands :**
- *Note : These commands allow you to talk to the bots without using any commands in a specific channel (this requires admin permission)*
-
- \`/addchannel [channelName]\` : Add a channel to the database
- \`/delchannel [channelName]\` : Delete a channel from the database
-
- **Miscellaneous commands :**
- \`/github\` : Get the github link of the bot
- \`/getmyquota\` : Get your quota *Note : Since the OpenAI API is not free, all users have a quota of 200k tokens*
- \`/help\` : Display this message
- `)
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.reply({ embeds: [embed] });
-}
-
-module.exports = help;
\ No newline at end of file
diff --git a/functions/discord/listconvs.js b/functions/discord/listconvs.js
deleted file mode 100644
index 5892b4e..0000000
--- a/functions/discord/listconvs.js
+++ /dev/null
@@ -1,32 +0,0 @@
-const discord = require('discord.js');
-
-const { addToLogs } = require('../../libs/botTools');
-const { getConvs } = require('../../libs/mysql');
-
-async function listconvs(interaction, client) {
- convs = await getConvs().catch((err) => {
- console.log(err);
- addToLogs(err);
- });
- message = "";
- if (convs.length == 0) {
- message = "No conversations in the database";
- } else {
- convs.forEach(element => {
- message += "- **" + element + "**\n\n";
- });
- }
-
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Conversations list", iconURL: client.user.displayAvatarURL() })
- .setDescription(message)
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.reply({ embeds: [embed] });
-
- addToLogs('[Discord] Sent conversations list');
- console.log('[Discord] Sent conversations list');
-}
-
-module.exports = listconvs;
\ No newline at end of file
diff --git a/functions/discord/quickGptrequest.js b/functions/discord/quickGptrequest.js
deleted file mode 100644
index f898026..0000000
--- a/functions/discord/quickGptrequest.js
+++ /dev/null
@@ -1,72 +0,0 @@
-const discord = require('discord.js');
-
-const { addToLogs } = require('../../libs/botTools');
-const { quickAnswer } = require('../../libs/openAi');
-const { incrementQuota, isNewUser } = require('../../libs/mysql');
-
-async function quickGptrequest(interaction, client) {
- await interaction.deferReply();
-
- quota = await isNewUser(interaction.member.user.id, interaction.member.user.username).catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- if (quota.quota >= 200000) {
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Quota exceeded", iconURL: client.user.displayAvatarURL() })
- .setDescription("You have a quota of " + quota.quota + " tokens, please wait until reset (every months)")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- interaction.editReply({ embeds: [embed] });
- }
- else {
- quickAnswer(interaction.options.get('question').value).then((res) => {
- incrementQuota(interaction.member.user.id, res.data.usage.total_tokens).catch((err) => {
- console.log(err);
- addToLogs(err);
- });
-
- if (res.data.choices[0].message.content.length > 4096) {
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Reply to : " + interaction.member.user.username, iconURL: "https://cdn.discordapp.com/avatars/" + interaction.member.user.id + "/" + interaction.member.user.avatar + ".jpeg" })
- .setTitle("Question : " + interaction.options.get('question').value)
- .setDescription("The answer is too long to be displayed, please try again with a shorter question.")
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- console.log('[Discord] Sent answer to : ' + interaction.options.get('question').value);
- addToLogs('[Discord] Sent answer to : ' + interaction.options.get('question').value);
- interaction.editReply({ embeds: [embed] });
- }
- else {
- title = "Question : " + interaction.options.get('question').value;
-
- if (title.length > 256) {
- title = title.slice(0, 253) + "...";
- }
-
- const embed = new discord.EmbedBuilder()
- .setColor(0xFABBDE)
- .setAuthor({ name: "Reply to : " + interaction.member.user.username, iconURL: "https://cdn.discordapp.com/avatars/" + interaction.member.user.id + "/" + interaction.member.user.avatar + ".jpeg" })
- .setTitle(title)
- .setDescription(res.data.choices[0].message.content)
- .setFooter({ text: "Powered by OpenAI https://www.openai.com/", iconURL: "https://seeklogo.com/images/O/open-ai-logo-8B9BFEDC26-seeklogo.com.png" });
-
- console.log('[Discord] Sent answer to : ' + interaction.options.get('question').value);
- addToLogs('[Discord] Sent answer to : ' + interaction.options.get('question').value);
- interaction.editReply({ embeds: [embed] });
- }
- }).catch((err) => {
- console.log(err);
- addToLogs(err);
- interaction.editReply("Something went wrong");
- })
-
- console.log('[Discord] Generating answer to : ' + interaction.options.get('question').value);
- addToLogs('[Discord] Generating answer to : ' + interaction.options.get('question').value);
- }
-}
-
-module.exports = quickGptrequest;
\ No newline at end of file
diff --git a/libs/botTools.js b/libs/botTools.js
deleted file mode 100644
index 60de0b3..0000000
--- a/libs/botTools.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const fs = require('fs');
-
-function addToLogs(message) {
- fs.appendFile('./logs/logs.txt', message + "\n", err => {
- if (err) {
- console.log(err);
- }
- });
-}
-
-module.exports = { addToLogs };
\ No newline at end of file
diff --git a/libs/embeds.js b/libs/embeds.js
new file mode 100644
index 0000000..6ba5629
--- /dev/null
+++ b/libs/embeds.js
@@ -0,0 +1,62 @@
+const { EmbedBuilder } = require("discord.js");
+
+function errorEmbed(error) {
+ return new EmbedBuilder()
+ .setTitle("Error")
+ .setDescription(error)
+ .setColor("#F6C6F9")
+ .setFooter({ text: "Bot by @ninja_jambon" });
+}
+
+function convBeginEmbed() {
+ return new EmbedBuilder()
+ .setTitle("Conversation beginning")
+ .setDescription(
+ "Click on the button below or use the command **/closeconv** to close the conversation."
+ )
+ .setColor("#F6C6F9")
+ .setFooter({ text: "Bot by @ninja_jambon" });
+}
+
+function convCreatedEmbed(channelId) {
+ return new EmbedBuilder()
+ .setTitle("Conversation created")
+ .setDescription(`Your conversation has been created at <#${channelId}>.`)
+ .setColor("#F6C6F9")
+ .setFooter({ text: "Bot by @ninja_jambon" });
+}
+
+function requestResponseEmbed(
+ user,
+ prompt,
+ response,
+ quota,
+ prompt_usage,
+ completion_usage
+) {
+ return new EmbedBuilder()
+ .setAuthor({
+ name: user.username,
+ iconURL:
+ "https://cdn.discordapp.com/avatars/" +
+ user.id +
+ "/" +
+ user.avatar +
+ ".jpeg",
+ })
+ .setTitle(prompt)
+ .setDescription(response)
+ .setFooter({
+ text: `Quota used ${prompt_usage + completion_usage}$ | New quota: ${
+ quota + prompt_usage + completion_usage
+ }$ | Quota remaining : ${0.4 - prompt_usage - completion_usage}$`,
+ })
+ .setColor("#F6C6F9");
+}
+
+module.exports = {
+ errorEmbed,
+ convBeginEmbed,
+ convCreatedEmbed,
+ requestResponseEmbed,
+};
diff --git a/libs/logs.js b/libs/logs.js
new file mode 100644
index 0000000..57257c7
--- /dev/null
+++ b/libs/logs.js
@@ -0,0 +1,20 @@
+const { EmbedBuilder, WebhookClient } = require("discord.js");
+
+const webhookClient = new WebhookClient({
+ url: `https://discord.com/api/webhooks/1187067107054202961/M7bsyOwFPMXQTMB8tvrWZu-gLT9rSjl1NASOBrz-z4lwvbwQ9To_yAywE_4aj5oGBP0D`,
+});
+
+function sendLog(message) {
+ const embed = new EmbedBuilder()
+ .setTitle("Log")
+ .setDescription(message)
+ .setColor(0x00ffff);
+
+ webhookClient.send({
+ embeds: [embed],
+ });
+}
+
+module.exports = {
+ sendLog,
+};
diff --git a/src/discord_helps/openAi.txt b/libs/mistralAi.js
similarity index 100%
rename from src/discord_helps/openAi.txt
rename to libs/mistralAi.js
diff --git a/libs/mysql.js b/libs/mysql.js
index c9a83db..6bf2660 100644
--- a/libs/mysql.js
+++ b/libs/mysql.js
@@ -1,210 +1,110 @@
-const mysql = require('mysql');
+var mysql = require("mysql");
+require("dotenv").config();
-const connection = mysql.createConnection({
- host: process.env.MYSQL_HOST,
- user: "root",
- password: process.env.MYSQL,
- database: "discord"
+var con = mysql.createConnection({
+ host: process.env.MYSQL_HOST,
+ user: process.env.MYSQL_USER,
+ password: process.env.MYSQL_PASSWORD,
+ database: process.env.MYSQL_DATABASE,
});
-function addUserToDb(id, user) {
- return new Promise((resolve, reject) => {
- connection.query('INSERT INTO users(userid, username) VALUES("' + id + '","' + user + '")' , (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- console.log('User added to database');
- resolve();
- }
- });
- });
+function registerUser(username, userid) {
+ return new Promise((resolve, reject) => {
+ con.query(
+ `INSERT INTO users (username, userid, quota) VALUES ("${username}", "${userid}", 0)`,
+ (err, result) => {
+ if (err) reject(err);
+ resolve(result);
+ }
+ );
+ });
}
-function incrementQuota(id, value) {
- return new Promise((resolve, reject) => {
- connection.query('UPDATE users SET quota = quota + '+ value + ' WHERE userid = ' + id, (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- resolve();
- }
- });
- });
+function getUser(userid) {
+ return new Promise((resolve, reject) => {
+ con.query(
+ `SELECT * FROM users WHERE userid = "${userid}"`,
+ (err, result) => {
+ if (err) reject(err);
+ resolve(result);
+ }
+ );
+ });
}
-function usersInDb() {
- return new Promise((resolve, reject) => {
- connection.query('SELECT * FROM users', (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- resolve(results);
- }
- });
- });
+function incrementQuota(user, value) {
+ return new Promise((resolve, reject) => {
+ con.query(
+ `UPDATE users SET quota = quota + ${value} WHERE userid = "${user}"`,
+ (err, result) => {
+ if (err) reject(err);
+ resolve(result);
+ }
+ );
+ });
}
-function getQuota(id) {
- return new Promise((resolve, reject) => {
- connection.query('SELECT quota FROM users WHERE userid = ' + id, (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- resolve(results[0].quota);
- }
- });
- });
+function addConv(userid, channelid, guildid) {
+ return new Promise((resolve, reject) => {
+ con.query(
+ `INSERT INTO convs (userid, channelid, guildid) VALUES ("${userid}", "${channelid}", "${guildid}")`,
+ (err, result) => {
+ if (err) reject(err);
+ resolve(result);
+ }
+ );
+ });
}
-function addConv (convName) {
- return new Promise((resolve, reject) => {
- connection.query('INSERT INTO conversations (name) VALUES ("' + convName + '")', (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- connection.query('CREATE TABLE ' + convName + '(id int NOT NULL AUTO_INCREMENT, author varchar(20) NOT NULL, message text, user varchar(20), PRIMARY KEY (id))', async (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- resolve(addMessage(convName, 'system', 'You are a helpful assistant.', 'System'));
- }
- });
- }
- });
- });
+function removeConv(channelid) {
+ return new Promise((resolve, reject) => {
+ con.query(
+ `DELETE FROM convs WHERE channelid = "${channelid}"`,
+ (err, result) => {
+ if (err) reject(err);
+ resolve(result);
+ }
+ );
+ });
}
-function delConv (convName) {
- return new Promise((resolve, reject) => {
- connection.query('DROP TABLE ' + convName, (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- connection.query('DELETE FROM conversations WHERE name = "' + convName + '"', (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- resolve(results);
- }
- });
- }
- });
- });
+function getConv(channelid) {
+ return new Promise((resolve, reject) => {
+ con.query(
+ `SELECT * FROM convs WHERE channelid = "${channelid}"`,
+ (err, result) => {
+ if (err) reject(err);
+ resolve(result);
+ }
+ );
+ });
}
-function getConvs() {
- return new Promise((resolve, reject) => {
- connection.query('SELECT name FROM conversations', (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- convs = [];
- results.forEach(element => {
- convs.push(element.name);
- });
- resolve(convs);
- }
- });
+function getQuotasSum() {
+ return new Promise((resolve, reject) => {
+ con.query(`SELECT SUM(quota) FROM users`, (err, result) => {
+ if (err) reject(err);
+ resolve(result);
});
+ });
}
-function addMessage(convName, author, message, user) {
- return new Promise((resolve, reject) => {
- connection.query('INSERT INTO ' + convName + ' (author, message, user) VALUES ("' + author + '"'+', "' + message + '", "' + user + '")', (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- resolve(results);
- }
- });
+function resetQuotas() {
+ return new Promise((resolve, reject) => {
+ con.query(`UPDATE users SET quota = 0`, (err, result) => {
+ if (err) reject(err);
+ resolve(result);
});
+ });
}
-function getMessages (convName, choice) {
- return new Promise((resolve, reject) => {
- connection.query('SELECT author, message, user FROM ' + convName, (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- messages = [];
- if (choice == 'role') {
- results.forEach(element => {
- messages.push({"role" : element.author, "content" : element.message});
- });
- } else if (choice == 'user') {
- results.forEach(element => {
- messages.push({"user" : element.user, "content" : element.message});
- });
- }
-
- resolve(messages);
- }
- });
- });
-}
-
-async function isNewUser(id, username) {
- return new Promise(async (resolve, reject) => {
- users = await usersInDb().catch(error => {
- reject(error);
- });
-
- test = false;
- quota = 0;
-
- users.forEach(element => {
- if (element.userid == id) {
- test = true;
- quota = element.quota;
- }
- });
-
- if (test == false) {
- addUserToDb(id, username);
- }
-
- resolve({quota : quota});
- });
-}
-
-async function listchannels() {
- return new Promise((resolve, reject) => {
- connection.query('SELECT id FROM channels', (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- channels = [];
- results.forEach(element => {
- channels.push(element.id);
- });
- resolve(channels);
- }
- });
- });
-}
-
-async function addChannel(id) {
- return new Promise((resolve, reject) => {
- connection.query('INSERT INTO channels (id) VALUES (' + id + ')', (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- resolve();
- }
- });
- });
-}
-
-async function deleteChannel(id) {
- return new Promise((resolve, reject) => {
- connection.query('DELETE FROM channels WHERE id = ' + id, (error, results, fields) => {
- if (error) {
- reject(error);
- } else {
- resolve();
- }
- });
- });
-}
-
-module.exports = { addUserToDb, incrementQuota, usersInDb, getQuota, addConv, delConv, getConvs, addMessage, getMessages, isNewUser, listchannels, addChannel, deleteChannel };
\ No newline at end of file
+module.exports = {
+ registerUser,
+ getUser,
+ incrementQuota,
+ addConv,
+ removeConv,
+ getConv,
+ getQuotasSum,
+ resetQuotas,
+};
diff --git a/libs/openAi.js b/libs/openAi.js
index 5267563..5379b4d 100644
--- a/libs/openAi.js
+++ b/libs/openAi.js
@@ -1,5 +1,5 @@
const { Configuration, OpenAIApi } = require("openai");
-const { addToLogs } = require("./botTools");
+const prompt = require("../data/prompt.json").prompt;
const configuration = new Configuration({
apiKey: process.env.OPENAI,
@@ -7,70 +7,78 @@ const configuration = new Configuration({
const openai = new OpenAIApi(configuration);
-async function generateImage(query) {
- response = await openai.createImage({
- prompt: query,
- n: 1,
- size: "1024x1024",
- response_format : 'url'
- }).catch((err) => {
- console.log(err);
- addToLogs("--> error : " + err);
- });
-
- return response;
-}
-
async function answerQuestion(query) {
- response = await openai.createChatCompletion({
- model: "gpt-4",
- messages: [{ "role" : "user", "content" : query}],
- temperature: 0.9,
- }).catch((err) => {
- console.log(err);
- addToLogs("--> error : " + err);
- })
-
- return response;
+ return new Promise((resolve, reject) => {
+ openai
+ .createChatCompletion({
+ model: "gpt-4-1106-preview",
+ messages: [
+ { role: "system", content: prompt },
+ { role: "user", content: query },
+ ],
+ temperature: 0.9,
+ })
+ .then((res) => {
+ resolve(res);
+ })
+ .catch((err) => {
+ reject(err);
+ });
+ });
}
async function quickAnswer(query) {
- response = await openai.createChatCompletion({
- model: "gpt-3.5-turbo",
- messages: [{ "role" : "user", "content" : query}],
- temperature: 0.9,
- }).catch((err) => {
- console.log(err);
- addToLogs("--> error : " + err);
- })
-
- return response;
+ return new Promise((resolve, reject) => {
+ openai
+ .createChatCompletion({
+ model: "gpt-3.5-turbo-1106",
+ messages: [
+ { role: "system", content: prompt },
+ { role: "user", content: query },
+ ],
+ temperature: 0.9,
+ })
+ .then((res) => {
+ resolve(res);
+ })
+ .catch((err) => {
+ reject(err);
+ });
+ });
}
-async function sendConv (messages) {
- response = await openai.createChatCompletion({
- model: "gpt-4",
- messages: messages,
- temperature: 0.9,
- }).catch((err) => {
- console.log(err);
- addToLogs("--> error : " + err);
- })
-
- return response;
+async function sendConv(messages) {
+ return new Promise((resolve, reject) => {
+ openai
+ .createChatCompletion({
+ model: "gpt-4-1106-preview",
+ messages: messages,
+ temperature: 0.9,
+ })
+ .then((res) => {
+ resolve(res);
+ })
+ .catch((err) => {
+ reject(err);
+ });
+ });
}
-async function sendQuickConv (messages) {
- response = await openai.createChatCompletion({
- model: "gpt-3.5-turbo",
- messages: messages,
- temperature: 0.9,
- }).catch((err) => {
- console.log(err);
- addToLogs("--> error : " + err);
- })
-
- return response;
+async function sendQuickConv(messages) {
+ return new Promise((resolve, reject) => {
+ openai
+ .createChatCompletion({
+ model: "gpt-3.5-turbo-1106",
+ messages: messages,
+ temperature: 0.9,
+ })
+ .then((res) => {
+ resolve(res);
+ })
+ .catch((err) => {
+ reject(err);
+ });
+ });
}
-module.exports = { generateImage, answerQuestion, sendConv, quickAnswer, sendQuickConv };
\ No newline at end of file
+module.exports = { answerQuestion, sendConv, quickAnswer, sendQuickConv };
diff --git a/libs/quotaReset.js b/libs/quotaReset.js
new file mode 100644
index 0000000..c31e8d7
--- /dev/null
+++ b/libs/quotaReset.js
@@ -0,0 +1,23 @@
+const fs = require("fs");
+const { resetQuotas } = require("./mysql.js");
+
+function getLastResetDate() {
+ const data = fs.readFileSync("./data/lastReset", "utf8");
+ return parseInt(data);
+}
+
+function checkLastResetDate() {
+ const lastResetDate = getLastResetDate();
+ const now = Date.now();
+
+ if (now - lastResetDate > 1000 * 60 * 60 * 24 * 30) {
+ fs.writeFileSync("./data/lastReset", now.toString());
+ return resetQuotas();
+ } else {
+ return false;
+ }
+}
+
+module.exports = {
+ checkLastResetDate,
+};
diff --git a/logs/logs.txt b/logs/logs.txt
deleted file mode 100644
index e3737c3..0000000
--- a/logs/logs.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-[Discord] Generating answer to : test
-[Discord] Generating answer to : test
-[Discord] Generating answer to : test
-[Discord] Generating answer to : test
-[Discord] Generating answer to : test
-[Discord] Sent answer to : test
-[Discord] Generating answer to : invente une théorie du complot
-[Discord] Sent answer to : invente une théorie du complot
-[Discord] Sent conversations list
-[Discord] Added conversation : test
-[Discord] Quota requested by Ninja_Jambon
-[Discord] Conversation deleted from the database : test
-[Discord] Added conversation : test
-[Discord] Added message to conversation : test
-Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'best" can refer to different aspects like quality, efficiency, or popularity....' at line 1
-[Discord] Displayed conversation : test
-[Discord] Added message to conversation : test
-[Discord] Displayed conversation : test
-[Discord] Added message to conversation : test
-[Discord] Added message to conversation : test
-[Discord] Generating answer to : what's the english for "je suis nois mon gars" ?
-[Discord] Sent answer to : what's the english for "je suis nois mon gars" ?
-[Discord] Added message to conversation : test
-[Discord] Quota requested by Ninja_Jambon
-[Discord] Github requested by Ninja_Jambon
-[Discord] Conversation deleted from the database : test
-[Discord] Github requested by Ninja_Jambon
-[Discord] Generating answer to : test
---> error : Error: Request failed with status code 429
-TypeError: Cannot read properties of undefined (reading 'data')
-[Discord] Generating answer to : tesr
-[Discord] Sent answer to : tesr
-[Discord] Generating answer to : donne moi plusieurs idées de garnitures simples pour des raviolis
-[Discord] Generating answer to : donne moi plusieurs idées de garnitures simples pour des raviolis
-[Discord] Sent answer to : donne moi plusieurs idées de garnitures simples pour des raviolis
-[Discord] Sent answer to : donne moi plusieurs idées de garnitures simples pour des raviolis
-[Discord] Generating answer to : how r u today
-[Discord] Sent answer to : how r u today
-[Discord] Generating answer to : qu'est-ce qu'un HAT pour un raspberry
-[Discord] Sent answer to : qu'est-ce qu'un HAT pour un raspberry
-[Discord] Generating answer to : à quoi correspond la valeur d'un dérivée (f'(-2) par exemple)
-[Discord] Sent answer to : à quoi correspond la valeur d'un dérivée (f'(-2) par exemple)
-[Discord] Generating answer to : écrit moi une description pour mon annonce fiverr de création de vot discord
-[Discord] Sent answer to : écrit moi une description pour mon annonce fiverr de création de vot discord
-[Discord] Generating answer to : qui est DAN ?
-[Discord] Sent answer to : qui est DAN ?
-[Discord] Generating answer to : qui est le roi d'angleterre ?
-[Discord] Sent answer to : qui est le roi d'angleterre ?
-[Discord] Generating answer to : quel est le roi actuel d'angleterre ?
-[Discord] Sent answer to : quel est le roi actuel d'angleterre ?
-[Discord] Generating answer to : Guillaume Bats est t'il en vie ?
-[Discord] Sent answer to : Guillaume Bats est t'il en vie ?
-[Discord] Generating answer to : pourquoi le gouvernement Francais a t'il utiliser le 49.3
-[Discord] Sent answer to : pourquoi le gouvernement Francais a t'il utiliser le 49.3
-[Discord] Generating answer to : pourquoi la réforme des retraites est t'elle controversé ?
-[Discord] Sent answer to : pourquoi la réforme des retraites est t'elle controversé ?
-[Discord] Generating answer to : en France quel est l'age minimal de départ à la retraite ?
-[Discord] Sent answer to : en France quel est l'age minimal de départ à la retraite ?
-[Discord] Generating answer to : de quand date cette réforme ?
-[Discord] Sent answer to : de quand date cette réforme ?
-[Discord] Generating answer to : de quand date la réforme des retraites ?
-[Discord] Added conversation : allo
-[Discord] Sent answer to : de quand date la réforme des retraites ?
-[Discord] Added message to conversation : allo
-Error: ER_NO_SUCH_TABLE: Table 'discord.db' doesn't exist
-Error: ER_NO_SUCH_TABLE: Table 'discord.db' doesn't exist
---> error : Error: Request failed with status code 400
-[Discord] Added message to conversation : allo
-[Discord] Displayed conversation : allo
-[Discord] Added message to conversation : allo
-[Discord] Added message to conversation : allo
-[Discord] Conversation not found in the database : jefg
-[Discord] Generating answer to : comment enterer et faire disparaître a jamais le cadavre d’une amie à son mec ?
-[Discord] Github requested by Ninja_Jambon
-[Discord] Sent answer to : comment enterer et faire disparaître a jamais le cadavre d’une amie à son mec ?
-[Discord] Sent conversations list
-[Discord] Generating answer to : generate three dscriptions for fiverr package for discord bots. the first package is "Basic discord bot", you have to say that it have simple commands. The second package is "Standard discord bot", you have to say that's the perfect options to create a game. And the third package is "Premium discord bot", you have to say that this package is a package to create a bit that will be at the center of the attention in the server. you can use only 100characters by dscription.
-[Discord] Sent answer to : generate three dscriptions for fiverr package for discord bots. the first package is "Basic discord bot", you have to say that it have simple commands. The second package is "Standard discord bot", you have to say that's the perfect options to create a game. And the third package is "Premium discord bot", you have to say that this package is a package to create a bit that will be at the center of the attention in the server. you can use only 100characters by dscription.
-[Discord] Generating answer to : improve this description to make it more attractive : If you are looking for a simple Telegram bot that will use APIs or databases for a low price, this is the best solution for you. It is important to note that the delivery times are indicative because this is the first time I will sell my services, so I'm not sure of the time it will take me to do your bot.
-[Discord] Sent answer to : improve this description to make it more attractive : If you are looking for a simple Telegram bot that will use APIs or databases for a low price, this is the best solution for you. It is important to note that the delivery times are indicative because this is the first time I will sell my services, so I'm not sure of the time it will take me to do your bot.
-[Discord] Generating answer to : improve this description to make it more attractive : If you are looking for a simple Discord bot that will use APIs or databases for a low price, this is the best solution for you. It is important to note that the delivery times are indicative because this is the first time I will sell my services, so I'm not sure of the time it will take me to do your bot.
-[Discord] Sent answer to : improve this description to make it more attractive : If you are looking for a simple Discord bot that will use APIs or databases for a low price, this is the best solution for you. It is important to note that the delivery times are indicative because this is the first time I will sell my services, so I'm not sure of the time it will take me to do your bot.
-[Discord] Generating answer to : improve this descrption : If you are looking for a simple Discord bot that will use APIs or databases for a low price, this is the best solution for you. It is important to note that the delivery times are indicative because this is the first time I will sell my services, so I'm not sure of the time it will take me to do your bot.
-[Discord] Sent answer to : improve this descrption : If you are looking for a simple Discord bot that will use APIs or databases for a low price, this is the best solution for you. It is important to note that the delivery times are indicative because this is the first time I will sell my services, so I'm not sure of the time it will take me to do your bot.
-[Discord] Generating answer to : improve this description : I'm a first-year computer science student. I want to work in the cyber field later on, more specifically in cyber defense or cybersecurity. I have experience with the JavaScript language, more specifically in the creation of Discord and Telegram bots. I also have some knowledge of web development (use of HTML, CSS, Js, and NextJS framework). I'm the perfect developer to realize your small projects at a low cost.
-[Discord] Sent answer to : improve this description : I'm a first-year computer science student. I want to work in the cyber field later on, more specifically in cyber defense or cybersecurity. I have experience with the JavaScript language, more specifically in the creation of Discord and Telegram bots. I also have some knowledge of web development (use of HTML, CSS, Js, and NextJS framework). I'm the perfect developer to realize your small projects at a low cost.
-[Discord] Generating answer to : improve this description : If you're in search of an affordable and straightforward Discord bot that utilizes APIs or databases, look no further! This is the perfect solution tailored for your needs. However, please bear in mind that the provided delivery times are only estimates, as this is my debut offering of services. As such, I cannot guarantee the exact duration required to complete your bot. Nonetheless, you can trust that I will strive to deliver an efficient and high-quality product. If you want to take a look at my existing project, you can join this discord server to test my discord bot that is using openAi API : https://discord.gg/kgEMXBrxyj or you can take a look at my github profile : https://github.com/Ninja-Jambon
-[Discord] Sent answer to : improve this description : If you're in search of an affordable and straightforward Discord bot that utilizes APIs or databases, look no further! This is the perfect solution tailored for your needs. However, please bear in mind that the provided delivery times are only estimates, as this is my debut offering of services. As such, I cannot guarantee the exact duration required to complete your bot. Nonetheless, you can trust that I will strive to deliver an efficient and high-quality product. If you want to take a look at my existing project, you can join this discord server to test my discord bot that is using openAi API : https://discord.gg/kgEMXBrxyj or you can take a look at my github profile : https://github.com/Ninja-Jambon
-[Discord] Quota requested by Ninja_Jambon
-[Discord] Quota requested by Ninja_Jambon
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
deleted file mode 100644
index 7a9df22..0000000
--- a/node_modules/.package-lock.json
+++ /dev/null
@@ -1,537 +0,0 @@
-{
- "name": "roberto-bot",
- "version": "1.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "node_modules/@discordjs/builders": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.3.tgz",
- "integrity": "sha512-CTCh8NqED3iecTNuiz49mwSsrc2iQb4d0MjMdmS/8pb69Y4IlzJ/DIy/p5GFlgOrFbNO2WzMHkWKQSiJ3VNXaw==",
- "dependencies": {
- "@discordjs/formatters": "^0.3.1",
- "@discordjs/util": "^0.3.1",
- "@sapphire/shapeshift": "^3.8.2",
- "discord-api-types": "^0.37.41",
- "fast-deep-equal": "^3.1.3",
- "ts-mixer": "^6.0.3",
- "tslib": "^2.5.0"
- },
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/@discordjs/collection": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.1.tgz",
- "integrity": "sha512-aWEc9DCf3TMDe9iaJoOnO2+JVAjeRNuRxPZQA6GVvBf+Z3gqUuWYBy2NWh4+5CLYq5uoc3MOvUQ5H5m8CJBqOA==",
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/@discordjs/formatters": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.1.tgz",
- "integrity": "sha512-M7X4IGiSeh4znwcRGcs+49B5tBkNDn4k5bmhxJDAUhRxRHTiFAOTVUNQ6yAKySu5jZTnCbSvTYHW3w0rAzV1MA==",
- "dependencies": {
- "discord-api-types": "^0.37.41"
- },
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/@discordjs/rest": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.7.1.tgz",
- "integrity": "sha512-Ofa9UqT0U45G/eX86cURQnX7gzOJLG2oC28VhIk/G6IliYgQF7jFByBJEykPSHE4MxPhqCleYvmsrtfKh1nYmQ==",
- "dependencies": {
- "@discordjs/collection": "^1.5.1",
- "@discordjs/util": "^0.3.0",
- "@sapphire/async-queue": "^1.5.0",
- "@sapphire/snowflake": "^3.4.2",
- "discord-api-types": "^0.37.41",
- "file-type": "^18.3.0",
- "tslib": "^2.5.0",
- "undici": "^5.22.0"
- },
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/@discordjs/util": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.3.1.tgz",
- "integrity": "sha512-HxXKYKg7vohx2/OupUN/4Sd02Ev3PBJ5q0gtjdcvXb0ErCva8jNHWfe/v5sU3UKjIB/uxOhc+TDOnhqffj9pRA==",
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/@discordjs/ws": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-0.8.3.tgz",
- "integrity": "sha512-hcYtppanjHecbdNyCKQNH2I4RP9UrphDgmRgLYrATEQF1oo4sYSve7ZmGsBEXSzH72MO2tBPdWSThunbxUVk0g==",
- "dependencies": {
- "@discordjs/collection": "^1.5.1",
- "@discordjs/rest": "^1.7.1",
- "@discordjs/util": "^0.3.1",
- "@sapphire/async-queue": "^1.5.0",
- "@types/ws": "^8.5.4",
- "@vladfrangu/async_event_emitter": "^2.2.1",
- "discord-api-types": "^0.37.41",
- "tslib": "^2.5.0",
- "ws": "^8.13.0"
- },
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/@sapphire/async-queue": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz",
- "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==",
- "engines": {
- "node": ">=v14.0.0",
- "npm": ">=7.0.0"
- }
- },
- "node_modules/@sapphire/shapeshift": {
- "version": "3.9.2",
- "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.2.tgz",
- "integrity": "sha512-YRbCXWy969oGIdqR/wha62eX8GNHsvyYi0Rfd4rNW6tSVVa8p0ELiMEuOH/k8rgtvRoM+EMV7Csqz77YdwiDpA==",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "lodash": "^4.17.21"
- },
- "engines": {
- "node": ">=v14.0.0",
- "npm": ">=7.0.0"
- }
- },
- "node_modules/@sapphire/snowflake": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz",
- "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==",
- "engines": {
- "node": ">=v14.0.0",
- "npm": ">=7.0.0"
- }
- },
- "node_modules/@tokenizer/token": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
- "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="
- },
- "node_modules/@types/node": {
- "version": "20.3.1",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz",
- "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg=="
- },
- "node_modules/@types/ws": {
- "version": "8.5.5",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz",
- "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@vladfrangu/async_event_emitter": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz",
- "integrity": "sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ==",
- "engines": {
- "node": ">=v14.0.0",
- "npm": ">=7.0.0"
- }
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
- },
- "node_modules/axios": {
- "version": "0.26.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
- "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
- "dependencies": {
- "follow-redirects": "^1.14.8"
- }
- },
- "node_modules/bignumber.js": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
- "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/busboy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
- "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
- "dependencies": {
- "streamsearch": "^1.1.0"
- },
- "engines": {
- "node": ">=10.16.0"
- }
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/discord-api-types": {
- "version": "0.37.46",
- "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.46.tgz",
- "integrity": "sha512-DeSi5WSWYTeXJJhdwACtpQycY3g4vLRvE2Ol5IlC0o//P2W+8jXPF447PuJn2fRH1nD7JGEJ3YMb0NB9+OQ7BQ=="
- },
- "node_modules/discord.js": {
- "version": "14.11.0",
- "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.11.0.tgz",
- "integrity": "sha512-CkueWYFQ28U38YPR8HgsBR/QT35oPpMbEsTNM30Fs8loBIhnA4s70AwQEoy6JvLcpWWJO7GY0y2BUzZmuBMepQ==",
- "dependencies": {
- "@discordjs/builders": "^1.6.3",
- "@discordjs/collection": "^1.5.1",
- "@discordjs/formatters": "^0.3.1",
- "@discordjs/rest": "^1.7.1",
- "@discordjs/util": "^0.3.1",
- "@discordjs/ws": "^0.8.3",
- "@sapphire/snowflake": "^3.4.2",
- "@types/ws": "^8.5.4",
- "discord-api-types": "^0.37.41",
- "fast-deep-equal": "^3.1.3",
- "lodash.snakecase": "^4.1.1",
- "tslib": "^2.5.0",
- "undici": "^5.22.0",
- "ws": "^8.13.0"
- },
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
- },
- "node_modules/file-type": {
- "version": "18.5.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.5.0.tgz",
- "integrity": "sha512-yvpl5U868+V6PqXHMmsESpg6unQ5GfnPssl4dxdJudBrr9qy7Fddt7EVX1VLlddFfe8Gj9N7goCZH22FXuSQXQ==",
- "dependencies": {
- "readable-web-to-node-stream": "^3.0.2",
- "strtok3": "^7.0.0",
- "token-types": "^5.0.1"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/file-type?sponsor=1"
- }
- },
- "node_modules/follow-redirects": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fs": {
- "version": "0.0.1-security",
- "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
- "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w=="
- },
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "node_modules/lodash.snakecase": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
- "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mysql": {
- "version": "2.18.1",
- "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz",
- "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
- "dependencies": {
- "bignumber.js": "9.0.0",
- "readable-stream": "2.3.7",
- "safe-buffer": "5.1.2",
- "sqlstring": "2.3.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/openai": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/openai/-/openai-3.3.0.tgz",
- "integrity": "sha512-uqxI/Au+aPRnsaQRe8CojU0eCR7I0mBiKjD3sNMzY6DaC1ZVrc85u98mtJW6voDug8fgGN+DIZmTDxTthxb7dQ==",
- "dependencies": {
- "axios": "^0.26.0",
- "form-data": "^4.0.0"
- }
- },
- "node_modules/peek-readable": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz",
- "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==",
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/readable-web-to-node-stream": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz",
- "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==",
- "dependencies": {
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
- "node_modules/readable-web-to-node-stream/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/sqlstring": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
- "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/streamsearch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
- "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/strtok3": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz",
- "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==",
- "dependencies": {
- "@tokenizer/token": "^0.3.0",
- "peek-readable": "^5.0.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
- "node_modules/token-types": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz",
- "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==",
- "dependencies": {
- "@tokenizer/token": "^0.3.0",
- "ieee754": "^1.2.1"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
- "node_modules/ts-mixer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz",
- "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ=="
- },
- "node_modules/tslib": {
- "version": "2.5.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz",
- "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w=="
- },
- "node_modules/undici": {
- "version": "5.22.1",
- "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz",
- "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==",
- "dependencies": {
- "busboy": "^1.6.0"
- },
- "engines": {
- "node": ">=14.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
- },
- "node_modules/ws": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
- "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- }
- }
-}
diff --git a/node_modules/@discordjs/builders/CHANGELOG.md b/node_modules/@discordjs/builders/CHANGELOG.md
deleted file mode 100644
index de5bb4f..0000000
--- a/node_modules/@discordjs/builders/CHANGELOG.md
+++ /dev/null
@@ -1,279 +0,0 @@
-# Changelog
-
-All notable changes to this project will be documented in this file.
-
-# [@discordjs/builders@1.6.3](https://github.com/discordjs/discord.js/compare/@discordjs/builders@1.6.2...@discordjs/builders@1.6.3) - (2023-05-01)
-
-## Refactor
-
-- Remove `@discordjs/util` re-export (#9488) ([54ceedf](https://github.com/discordjs/discord.js/commit/54ceedf6c535d4641643d4106b6286cbef09de4a))
-
-# [@discordjs/builders@1.6.2](https://github.com/discordjs/discord.js/compare/@discordjs/builders@1.6.1...@discordjs/builders@1.6.2) - (2023-05-01)
-
-## Bug Fixes
-
-- **BaseSelectMenuBuilder:** Modify class to be `abstract` (#9358) ([ca4de2d](https://github.com/discordjs/discord.js/commit/ca4de2d9c6bc204e85d1b7eae7eabd23dbeb4475))
-- Correct `@link` tags that involve parents (#9351) ([fbbce3e](https://github.com/discordjs/discord.js/commit/fbbce3eb4ba20bc0c4806ca2259d1f86001594be))
-- Fix external links (#9313) ([a7425c2](https://github.com/discordjs/discord.js/commit/a7425c29c4f23f1b31f4c6a463107ca9eb7fd7e2))
-
-## Documentation
-
-- Reference package names properly (#9426) ([d6bca9b](https://github.com/discordjs/discord.js/commit/d6bca9bb4d976dc069a5039250db7d5b3e9142ef))
-- Generate static imports for types with api-extractor ([98a76db](https://github.com/discordjs/discord.js/commit/98a76db482879f79d6bb2fb2e5fc65ac2c34e2d9))
-- **builders:** Add some basic documentation (#9359) ([8073561](https://github.com/discordjs/discord.js/commit/8073561824f911d1a18d0b4f1de39f452bc69fa9))
-- Use `@link` in `@see` (#9348) ([d66d113](https://github.com/discordjs/discord.js/commit/d66d1133331b81563588db4500c63a18c3c3dfae))
-
-# [@discordjs/builders@1.6.2](https://github.com/discordjs/discord.js/compare/@discordjs/builders@1.6.1...@discordjs/builders@1.6.2) - (2023-05-01)
-
-## Bug Fixes
-
-- **BaseSelectMenuBuilder:** Modify class to be `abstract` (#9358) ([ca4de2d](https://github.com/discordjs/discord.js/commit/ca4de2d9c6bc204e85d1b7eae7eabd23dbeb4475))
-- Correct `@link` tags that involve parents (#9351) ([fbbce3e](https://github.com/discordjs/discord.js/commit/fbbce3eb4ba20bc0c4806ca2259d1f86001594be))
-- Fix external links (#9313) ([a7425c2](https://github.com/discordjs/discord.js/commit/a7425c29c4f23f1b31f4c6a463107ca9eb7fd7e2))
-
-## Documentation
-
-- Reference package names properly (#9426) ([d6bca9b](https://github.com/discordjs/discord.js/commit/d6bca9bb4d976dc069a5039250db7d5b3e9142ef))
-- Generate static imports for types with api-extractor ([98a76db](https://github.com/discordjs/discord.js/commit/98a76db482879f79d6bb2fb2e5fc65ac2c34e2d9))
-- **builders:** Add some basic documentation (#9359) ([8073561](https://github.com/discordjs/discord.js/commit/8073561824f911d1a18d0b4f1de39f452bc69fa9))
-- Use `@link` in `@see` (#9348) ([d66d113](https://github.com/discordjs/discord.js/commit/d66d1133331b81563588db4500c63a18c3c3dfae))
-
-# [@discordjs/builders@1.6.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@1.5.0...@discordjs/builders@1.6.0) - (2023-04-01)
-
-## Bug Fixes
-
-- **scripts:** Accessing tsComment ([d8d5f31](https://github.com/discordjs/discord.js/commit/d8d5f31d3927fd1de62f1fa3a1a6e454243ad87b))
-
-## Features
-
-- **website:** Render syntax and mdx on the server (#9086) ([ee5169e](https://github.com/discordjs/discord.js/commit/ee5169e0aadd7bbfcd752aae614ec0f69602b68b))
-
-# [@discordjs/builders@1.5.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@1.4.0...@discordjs/builders@1.5.0) - (2023-03-12)
-
-## Documentation
-
-- **EmbedBuilder#spliceFields:** Fix a typo (#9159) ([4367ab9](https://github.com/discordjs/discord.js/commit/4367ab930227048868db3ed8437f6c4507ff32e1))
-- Fix version export (#9049) ([8b70f49](https://github.com/discordjs/discord.js/commit/8b70f497a1207e30edebdecd12b926c981c13d28))
-
-## Features
-
-- **website:** Add support for source file links (#9048) ([f6506e9](https://github.com/discordjs/discord.js/commit/f6506e99c496683ee0ab67db0726b105b929af38))
-- **StringSelectMenu:** Add `spliceOptions()` (#8937) ([a6941d5](https://github.com/discordjs/discord.js/commit/a6941d536ce24ed2b5446a154cbc886b2b97c63a))
-- Add support for nsfw commands (#7976) ([7a51344](https://github.com/discordjs/discord.js/commit/7a5134459c5f06864bf74631d83b96d9c21b72d8))
-- Add `@discordjs/formatters` (#8889) ([3fca638](https://github.com/discordjs/discord.js/commit/3fca638a8470dcea2f79ddb9f18526dbc0017c88))
-
-## Styling
-
-- Run prettier (#9041) ([2798ba1](https://github.com/discordjs/discord.js/commit/2798ba1eb3d734f0cf2eeccd2e16cfba6804873b))
-
-# [@discordjs/builders@1.4.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@1.3.0...@discordjs/builders@1.4.0) - (2022-11-28)
-
-## Bug Fixes
-
-- Pin @types/node version ([9d8179c](https://github.com/discordjs/discord.js/commit/9d8179c6a78e1c7f9976f852804055964d5385d4))
-
-## Features
-
-- New select menus (#8793) ([5152abf](https://github.com/discordjs/discord.js/commit/5152abf7285581abf7689e9050fdc56c4abb1e2b))
-- Allow punctuation characters in context menus (#8783) ([b521366](https://github.com/discordjs/discord.js/commit/b5213664fa66746daab1673ebe2adf2db3d1522c))
-
-## Typings
-
-- **Formatters:** Allow boolean in `formatEmoji` (#8823) ([ec37f13](https://github.com/discordjs/discord.js/commit/ec37f137fd4fca0fdbdb8a5c83abf32362a8f285))
-
-# [@discordjs/builders@1.3.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@1.2.0...@discordjs/builders@1.3.0) - (2022-10-08)
-
-## Bug Fixes
-
-- Allow adding forums to `channelTypes` (#8658) ([b1e190c](https://github.com/discordjs/discord.js/commit/b1e190c4f0773a1a739625f5b41026f593515370))
-- **SlashCommandBuilder:** Missing methods in subcommand builder (#8583) ([1c5b78f](https://github.com/discordjs/discord.js/commit/1c5b78fd2130f09c951459cf4c2d637f46c3c2c9))
-- Footer / sidebar / deprecation alert ([ba3e0ed](https://github.com/discordjs/discord.js/commit/ba3e0ed348258fe8e51eefb4aa7379a1230616a9))
-
-## Documentation
-
-- **builders/components:** Document constructors (#8636) ([8444576](https://github.com/discordjs/discord.js/commit/8444576f45da5fdddbf8ba2d91b4cb31a3b51c04))
-- Change name (#8604) ([dd5a089](https://github.com/discordjs/discord.js/commit/dd5a08944c258a847fc4377f1d5e953264ab47d0))
-- Use remarks instead of `Note` in descriptions (#8597) ([f3ce4a7](https://github.com/discordjs/discord.js/commit/f3ce4a75d0c4eafc89a1f0ce9f4964bcbcdae6da))
-
-## Features
-
-- Web-components (#8715) ([0ac3e76](https://github.com/discordjs/discord.js/commit/0ac3e766bd9dbdeb106483fa4bb085d74de346a2))
-- Add `@discordjs/util` (#8591) ([b2ec865](https://github.com/discordjs/discord.js/commit/b2ec865765bf94181473864a627fb63ea8173fd3))
-- Add `chatInputApplicationCommandMention` formatter (#8546) ([d08a57c](https://github.com/discordjs/discord.js/commit/d08a57cadd9d69a734077cc1902d931ab10336db))
-
-## Refactor
-
-- Replace usage of deprecated `ChannelType`s (#8625) ([669c3cd](https://github.com/discordjs/discord.js/commit/669c3cd2566eac68ef38ab522dd6378ba761e8b3))
-- Website components (#8600) ([c334157](https://github.com/discordjs/discord.js/commit/c3341570d983aea9ecc419979d5a01de658c9d67))
-- Use `eslint-config-neon` for packages. (#8579) ([edadb9f](https://github.com/discordjs/discord.js/commit/edadb9fe5dfd9ff51a3cfc9b25cb242d3f9f5241))
-
-## Testing
-
-- Rename incorrect test (#8596) ([ce991dd](https://github.com/discordjs/discord.js/commit/ce991dd1d883f6785b5f4b4b3ac80ef21cb304e7))
-
-## Typings
-
-- **interactions:** Fix `{Slash,ContextMenu}CommandBuilder#toJSON` (#8568) ([b7eb96d](https://github.com/discordjs/discord.js/commit/b7eb96d45670616521fbcca28a657793d91605c7))
-
-# [@discordjs/builders@1.2.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@1.1.0...@discordjs/builders@1.2.0) - (2022-08-22)
-
-## Features
-
-- **website:** Show `constructor` information (#8540) ([e42fd16](https://github.com/discordjs/discord.js/commit/e42fd1636973b10dd7ed6fb4280ee1a4a8f82007))
-- **website:** Show descriptions for `@typeParam` blocks (#8523) ([e475b63](https://github.com/discordjs/discord.js/commit/e475b63f257f6261d73cb89fee9ecbcdd84e2a6b))
-- **website:** Show parameter descriptions (#8519) ([7f415a2](https://github.com/discordjs/discord.js/commit/7f415a2502bf7ce2025dbcfed9017b0635a19966))
-- **WebSocketShard:** Support new resume url (#8480) ([bc06cc6](https://github.com/discordjs/discord.js/commit/bc06cc638d2f57ab5c600e8cdb6afc8eb2180166))
-
-## Refactor
-
-- Docs design (#8487) ([4ab1d09](https://github.com/discordjs/discord.js/commit/4ab1d09997a18879a9eb9bda39df6f15aa22557e))
-
-# [@discordjs/builders@1.1.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@0.16.0...@discordjs/builders@1.1.0) - (2022-07-29)
-
-## Bug Fixes
-
-- Use proper format for `@link` text (#8384) ([2655639](https://github.com/discordjs/discord.js/commit/26556390a3800e954974a00c1328ff47d3e67e9a))
-- **Formatters:** Add newline in `codeBlock` (#8369) ([5d8bd03](https://github.com/discordjs/discord.js/commit/5d8bd030d60ef364de3ef5f9963da8bda5c4efd4))
-- **selectMenu:** Allow json to be used for select menu options (#8322) ([6a2d0d8](https://github.com/discordjs/discord.js/commit/6a2d0d8e96d157d5b85cee7f17bffdfff4240074))
-
-## Documentation
-
-- Use link tags (#8382) ([5494791](https://github.com/discordjs/discord.js/commit/549479131318c659f86f0eb18578d597e22522d3))
-
-## Features
-
-- Add channel & message URL formatters (#8371) ([a7deb8f](https://github.com/discordjs/discord.js/commit/a7deb8f89830ead6185c5fb46a49688b6d209ed1))
-
-## Testing
-
-- **builders:** Improve coverage (#8274) ([b7e6238](https://github.com/discordjs/discord.js/commit/b7e62380f2e6b9324d6bba9b9eaa5315080bf66a))
-
-# [@discordjs/builders@0.16.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@0.15.0...@discordjs/builders@0.16.0) - (2022-07-17)
-
-## Bug Fixes
-
-- Slash command name regex (#8265) ([32f9056](https://github.com/discordjs/discord.js/commit/32f9056b15edede3bab07de96afb4b56d3a9ecca))
-- **TextInputBuilder:** Parse `custom_id`, `label`, and `style` (#8216) ([2d9dfa3](https://github.com/discordjs/discord.js/commit/2d9dfa3c6ea4bb972da2f7e088d148b798c866d9))
-
-## Documentation
-
-- Add codecov coverage badge to readmes (#8226) ([f6db285](https://github.com/discordjs/discord.js/commit/f6db285c073898a749fe4591cbd4463d1896daf5))
-
-## Features
-
-- **builder:** Add max min length in string option (#8214) ([96c8d21](https://github.com/discordjs/discord.js/commit/96c8d21f95eb366c46ae23505ba9054f44821b25))
-- Codecov (#8219) ([f10f4cd](https://github.com/discordjs/discord.js/commit/f10f4cdcd88ca6be7ec735ed3a415ba13da83db0))
-- **docgen:** Update typedoc ([b3346f4](https://github.com/discordjs/discord.js/commit/b3346f4b9b3d4f96443506643d4631dc1c6d7b21))
-- Website (#8043) ([127931d](https://github.com/discordjs/discord.js/commit/127931d1df7a2a5c27923c2f2151dbf3824e50cc))
-- **docgen:** Typescript support ([3279b40](https://github.com/discordjs/discord.js/commit/3279b40912e6aa61507bedb7db15a2b8668de44b))
-- Docgen package (#8029) ([8b979c0](https://github.com/discordjs/discord.js/commit/8b979c0245c42fd824d8e98745ee869f5360fc86))
-
-## Refactor
-
-- **builder:** Remove `unsafe*Builder`s (#8074) ([a4d1862](https://github.com/discordjs/discord.js/commit/a4d18629828234f43f03d1bd4851d4b727c6903b))
-- Remove @sindresorhus/is as it's now esm only (#8133) ([c6f285b](https://github.com/discordjs/discord.js/commit/c6f285b7b089b004776fbeb444fe973a68d158d8))
-- Move all the config files to root (#8033) ([769ea0b](https://github.com/discordjs/discord.js/commit/769ea0bfe78c4f1d413c6b397c604ffe91e39c6a))
-
-## Typings
-
-- Remove expect error (#8242) ([7e6dbaa](https://github.com/discordjs/discord.js/commit/7e6dbaaed900c07d1a04e23bbbf9cd0d1b0501c5))
-- **builder:** Remove casting (#8241) ([8198da5](https://github.com/discordjs/discord.js/commit/8198da5cd0898e06954615a2287853321e7ebbd4))
-
-# [@discordjs/builders@0.15.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@0.14.0...@discordjs/builders@0.15.0) - (2022-06-06)
-
-## Features
-
-- Allow builders to accept rest params and arrays (#7874) ([ad75be9](https://github.com/discordjs/discord.js/commit/ad75be9a9cf90c8624495df99b75177e6c24022f))
-- Use vitest instead of jest for more speed ([8d8e6c0](https://github.com/discordjs/discord.js/commit/8d8e6c03decd7352a2aa180f6e5bc1a13602539b))
-- Add scripts package for locally used scripts ([f2ae1f9](https://github.com/discordjs/discord.js/commit/f2ae1f9348bfd893332a9060f71a8a5f272a1b8b))
-
-# [@discordjs/builders@0.14.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@0.13.0...@discordjs/builders@0.14.0) - (2022-06-04)
-
-## Bug Fixes
-
-- **builders:** Leftover invalid null type ([8a7cd10](https://github.com/discordjs/discord.js/commit/8a7cd10554a2a71cd2fe7f6a177b5f4f43464348))
-- **SlashCommandBuilder:** Import `Permissions` correctly (#7921) ([7ce641d](https://github.com/discordjs/discord.js/commit/7ce641d33a4af6586d5e7beffbe7d38619dcf1a2))
-- Add localizations for subcommand builders and option choices (#7862) ([c1b5e73](https://github.com/discordjs/discord.js/commit/c1b5e731daa9cbbfca03a046e47cb1221ee1ed7c))
-
-## Features
-
-- Export types from `interactions/slashCommands/mixins` (#7942) ([68d5169](https://github.com/discordjs/discord.js/commit/68d5169f66c96f8fe5be17a1c01cdd5155607ab2))
-- **builders:** Add new command permissions v2 (#7861) ([de3f157](https://github.com/discordjs/discord.js/commit/de3f1573f07dda294cc0fbb1ca4b659eb2388a12))
-- **builders:** Improve embed errors and predicates (#7795) ([ec8d87f](https://github.com/discordjs/discord.js/commit/ec8d87f93272cc9987f9613735c0361680c4ed1e))
-
-## Refactor
-
-- Use arrays instead of rest parameters for builders (#7759) ([29293d7](https://github.com/discordjs/discord.js/commit/29293d7bbb5ed463e52e5a5853817e5a09cf265b))
-
-## Styling
-
-- Cleanup tests and tsup configs ([6b8ef20](https://github.com/discordjs/discord.js/commit/6b8ef20cb3af5b5cfd176dd0aa0a1a1e98551629))
-
-# [@discordjs/builders@0.13.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@0.12.0...@discordjs/builders@0.13.0) - (2022-04-17)
-
-## Bug Fixes
-
-- Validate select menu options (#7566) ([b1d63d9](https://github.com/discordjs/discord.js/commit/b1d63d919a61f309ac89f27016b0f148678dac2b))
-- **SelectMenu:** Set `placeholder` max to 150 (#7538) ([dcd4797](https://github.com/discordjs/discord.js/commit/dcd479767b6ec980a373f2ea1f22754f41661c1e))
-- Only check `instanceof Component` once (#7546) ([0aa4851](https://github.com/discordjs/discord.js/commit/0aa48516a4e33497e8e8dc50da164a57cdee09d3))
-- **builders:** Allow negative min/max value of number/integer option (#7484) ([3baa340](https://github.com/discordjs/discord.js/commit/3baa340821b8ecf8a16253bc0917a1033250d7c9))
-- **components:** SetX should take rest parameters (#7461) ([3617359](https://github.com/discordjs/discord.js/commit/36173590a712f041b087b7882054805a8bd42dae))
-- Unsafe embed builder field normalization (#7418) ([b936103](https://github.com/discordjs/discord.js/commit/b936103395121cb21a8c616f669ddab1d2efb0f1))
-- Fix some typos (#7393) ([92a04f4](https://github.com/discordjs/discord.js/commit/92a04f4d98f6c6760214034cc8f5a1eaa78893c7))
-- **builders:** Make type optional in constructor (#7391) ([4abb28c](https://github.com/discordjs/discord.js/commit/4abb28c0a1256c57a60369a6b8ec9e98c265b489))
-- Don't create new instances of builders classes (#7343) ([d6b56d0](https://github.com/discordjs/discord.js/commit/d6b56d0080c4c5f8ace731f1e8bcae0c9d3fb5a5))
-
-## Documentation
-
-- Completely fix builders example link (#7543) ([1a14c0c](https://github.com/discordjs/discord.js/commit/1a14c0ca562ea173d363a770a0437209f461fd23))
-- Add slash command builders example, fixes #7338 (#7339) ([3ae6f3c](https://github.com/discordjs/discord.js/commit/3ae6f3c313091151245d6e6b52337b459ecfc765))
-
-## Features
-
-- Slash command localization for builders (#7683) ([40b9a1d](https://github.com/discordjs/discord.js/commit/40b9a1d67d0b508ec593e030913acd8161cd17f8))
-- Add API v10 support (#7477) ([72577c4](https://github.com/discordjs/discord.js/commit/72577c4bfd02524a27afb6ff4aebba9301a690d3))
-- Add support for module: NodeNext in TS and ESM (#7598) ([8f1986a](https://github.com/discordjs/discord.js/commit/8f1986a6aa98365e09b00e84ad5f9f354ab61f3d))
-- Add Modals and Text Inputs (#7023) ([ed92015](https://github.com/discordjs/discord.js/commit/ed920156344233241a21b0c0b99736a3a855c23c))
-- Add missing `v13` component methods (#7466) ([f7257f0](https://github.com/discordjs/discord.js/commit/f7257f07655076eabfe355cb6a53260b39ca9670))
-- **builders:** Add attachment command option type (#7203) ([ae0f35f](https://github.com/discordjs/discord.js/commit/ae0f35f51d68dfa5a7dc43d161ef9365171debdb))
-- **components:** Add unsafe message component builders (#7387) ([6b6222b](https://github.com/discordjs/discord.js/commit/6b6222bf513d1ee8cd98fba0ad313def560b864f))
-- **embed:** Add setFields (#7322) ([bcc5cda](https://github.com/discordjs/discord.js/commit/bcc5cda8a902ddb28c7e3578e0f29b4272832624))
-
-## Refactor
-
-- Remove nickname parsing (#7736) ([78a3afc](https://github.com/discordjs/discord.js/commit/78a3afcd7fdac358e06764cc0d675e1215c785f3))
-- Replace zod with shapeshift (#7547) ([3c0bbac](https://github.com/discordjs/discord.js/commit/3c0bbac82fa9988af4a62ff00c66d149fbe6b921))
-- Remove store channels (#7634) ([aedddb8](https://github.com/discordjs/discord.js/commit/aedddb875e740e1f1bd77f06ce1b361fd3b7bc36))
-- Allow builders to accept emoji strings (#7616) ([fb9a9c2](https://github.com/discordjs/discord.js/commit/fb9a9c221121ee1c7986f9c775b77b9691a0ae15))
-- Don't return builders from API data (#7584) ([549716e](https://github.com/discordjs/discord.js/commit/549716e4fcec89ca81216a6d22aa8e623175e37a))
-- Remove obsolete builder methods (#7590) ([10607db](https://github.com/discordjs/discord.js/commit/10607dbdafe257c5cbf5b952b7eecec4919e8b4a))
-- **Embed:** Remove add field (#7522) ([8478d2f](https://github.com/discordjs/discord.js/commit/8478d2f4de9ac013733850cbbc67902f7c5abc55))
-- Make `data` public in builders (#7486) ([ba31203](https://github.com/discordjs/discord.js/commit/ba31203a0ad96e0a00f8312c397889351e4c5cfd))
-- **embed:** Remove array support in favor of rest params (#7498) ([b3fa2ec](https://github.com/discordjs/discord.js/commit/b3fa2ece402839008738ad3adce3db958445838d))
-- **components:** Default set boolean methods to true (#7502) ([b122149](https://github.com/discordjs/discord.js/commit/b12214922cea2f43afbe6b1555a74a3c8e16f798))
-- Make public builder props getters (#7422) ([e8252ed](https://github.com/discordjs/discord.js/commit/e8252ed3b981a4b7e4013f12efadd2f5d9318d3e))
-- **builders-methods:** Make methods consistent (#7395) ([f495364](https://github.com/discordjs/discord.js/commit/f4953647ff9f39127978c73bf8a62c08462802ca))
-- Remove conditional autocomplete option return types (#7396) ([0909824](https://github.com/discordjs/discord.js/commit/09098240bfb13b8afafa4ab549f06d236e0ff1c9))
-- **embed:** Mark properties as readonly (#7332) ([31768fc](https://github.com/discordjs/discord.js/commit/31768fcd69ed5b4566a340bda89ce881418e8272))
-
-## Typings
-
-- Fix regressions (#7649) ([5748dbe](https://github.com/discordjs/discord.js/commit/5748dbe08783beb80c526de38ccd105eb0e82664))
-
-# [@discordjs/builders@0.12.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@0.11.0...@discordjs/builders@0.12.0) - (2022-01-24)
-
-## Bug Fixes
-
-- **builders:** Dont export `Button` component stuff twice (#7289) ([86d9d06](https://github.com/discordjs/discord.js/commit/86d9d0674347c08d056cd054cb4ce4253195bf94))
-
-## Documentation
-
-- **SlashCommandSubcommands:** Updating old links from Discord developer portal (#7224) ([bd7a6f2](https://github.com/discordjs/discord.js/commit/bd7a6f265212624199fb0b2ddc8ece39759c63de))
-
-## Features
-
-- Add components to /builders (#7195) ([2bb40fd](https://github.com/discordjs/discord.js/commit/2bb40fd767cf5918e3ba422ff73082734bfa05b0))
-
-## Typings
-
-- Make `required` a boolean (#7307) ([c10afea](https://github.com/discordjs/discord.js/commit/c10afeadc702ab98bec5e077b3b92494a9596f9c))
diff --git a/node_modules/@discordjs/builders/LICENSE b/node_modules/@discordjs/builders/LICENSE
deleted file mode 100644
index cbe9c65..0000000
--- a/node_modules/@discordjs/builders/LICENSE
+++ /dev/null
@@ -1,191 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- Copyright 2021 Noel Buechler
- Copyright 2021 Vlad Frangu
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/node_modules/@discordjs/builders/README.md b/node_modules/@discordjs/builders/README.md
deleted file mode 100644
index 2981f19..0000000
--- a/node_modules/@discordjs/builders/README.md
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-## About
-
-`@discordjs/builders` is a utility package for easily building Discord API payloads.
-
-## Installation
-
-**Node.js 16.9.0 or newer is required.**
-
-```sh
-npm install @discordjs/builders
-yarn add @discordjs/builders
-pnpm add @discordjs/builders
-```
-
-## Examples
-
-You can find examples of how to use the builders in the [Slash Command Builders][example] examples.
-
-## Links
-
-- [Website][website] ([source][website-source])
-- [Documentation][documentation]
-- [Guide][guide] ([source][guide-source])
- Also see the v13 to v14 [Update Guide][guide-update], which includes updated and removed items from the library.
-- [discord.js Discord server][discord]
-- [Discord API Discord server][discord-api]
-- [GitHub][source]
-- [npm][npm]
-- [Related libraries][related-libs]
-
-## Contributing
-
-Before creating an issue, please ensure that it hasn't already been reported/suggested, and double-check the
-[documentation][documentation].
-See [the contribution guide][contributing] if you'd like to submit a PR.
-
-## Help
-
-If you don't understand something in the documentation, you are experiencing problems, or you just need a gentle nudge in the right direction, please don't hesitate to join our official [discord.js Server][discord].
-
-[example]: https://github.com/discordjs/discord.js/blob/main/packages/builders/docs/examples/Slash%20Command%20Builders.md
-[website]: https://discord.js.org
-[website-source]: https://github.com/discordjs/discord.js/tree/main/apps/website
-[documentation]: https://discord.js.org/docs/packages/builders/stable
-[guide]: https://discordjs.guide/
-[guide-source]: https://github.com/discordjs/guide
-[guide-update]: https://discordjs.guide/additional-info/changes-in-v14.html
-[discord]: https://discord.gg/djs
-[discord-api]: https://discord.gg/discord-api
-[source]: https://github.com/discordjs/discord.js/tree/main/packages/builders
-[npm]: https://www.npmjs.com/package/@discordjs/builders
-[related-libs]: https://discord.com/developers/docs/topics/community-resources#libraries
-[contributing]: https://github.com/discordjs/discord.js/blob/main/.github/CONTRIBUTING.md
diff --git a/node_modules/@discordjs/builders/dist/index.d.ts b/node_modules/@discordjs/builders/dist/index.d.ts
deleted file mode 100644
index 5237d9b..0000000
--- a/node_modules/@discordjs/builders/dist/index.d.ts
+++ /dev/null
@@ -1,1948 +0,0 @@
-import * as _sapphire_shapeshift from '@sapphire/shapeshift';
-import { APIEmbedField, APIEmbedAuthor, APIEmbedFooter, APIEmbedImage, APIEmbed, APISelectMenuOption, APIMessageComponentEmoji, ButtonStyle, ChannelType, APIActionRowComponent, APIActionRowComponentTypes, APIBaseComponent, ComponentType, APIButtonComponent, APISelectMenuComponent, APIChannelSelectComponent, APIMentionableSelectComponent, APIRoleSelectComponent, APIStringSelectComponent, APIUserSelectComponent, APITextInputComponent, TextInputStyle, APIMessageActionRowComponent, APIModalActionRowComponent, APIModalComponent, APIMessageComponent, APIModalInteractionResponseCallbackData, LocalizationMap, LocaleString, ApplicationCommandOptionType, APIApplicationCommandBasicOption, APIApplicationCommandAttachmentOption, APIApplicationCommandBooleanOption, APIApplicationCommandChannelOption, APIApplicationCommandOptionChoice, APIApplicationCommandIntegerOption, APIApplicationCommandMentionableOption, APIApplicationCommandNumberOption, APIApplicationCommandRoleOption, APIApplicationCommandStringOption, APIApplicationCommandUserOption, APIApplicationCommandSubcommandGroupOption, APIApplicationCommandSubcommandOption, Permissions, RESTPostAPIChatInputApplicationCommandsJSONBody, APIApplicationCommandOption, Locale, ApplicationCommandType, RESTPostAPIContextMenuApplicationCommandsJSONBody } from 'discord-api-types/v10';
-export * from '@discordjs/formatters';
-import { JSONEncodable, Equatable } from '@discordjs/util';
-
-declare const fieldNamePredicate: _sapphire_shapeshift.StringValidator;
-declare const fieldValuePredicate: _sapphire_shapeshift.StringValidator;
-declare const fieldInlinePredicate: _sapphire_shapeshift.UnionValidator;
-declare const embedFieldPredicate: _sapphire_shapeshift.ObjectValidator<{
- name: string;
- value: string;
- inline: boolean | undefined;
-}, _sapphire_shapeshift.UndefinedToOptional<{
- name: string;
- value: string;
- inline: boolean | undefined;
-}>>;
-declare const embedFieldsArrayPredicate: _sapphire_shapeshift.ArrayValidator<_sapphire_shapeshift.UndefinedToOptional<{
- name: string;
- value: string;
- inline: boolean | undefined;
-}>[], _sapphire_shapeshift.UndefinedToOptional<{
- name: string;
- value: string;
- inline: boolean | undefined;
-}>>;
-declare const fieldLengthPredicate: _sapphire_shapeshift.NumberValidator;
-declare function validateFieldLength(amountAdding: number, fields?: APIEmbedField[]): void;
-declare const authorNamePredicate: _sapphire_shapeshift.UnionValidator;
-declare const imageURLPredicate: _sapphire_shapeshift.UnionValidator;
-declare const urlPredicate: _sapphire_shapeshift.UnionValidator;
-declare const embedAuthorPredicate: _sapphire_shapeshift.ObjectValidator<{
- name: string | null;
- iconURL: string | null | undefined;
- url: string | null | undefined;
-}, _sapphire_shapeshift.UndefinedToOptional<{
- name: string | null;
- iconURL: string | null | undefined;
- url: string | null | undefined;
-}>>;
-declare const RGBPredicate: _sapphire_shapeshift.NumberValidator;
-declare const colorPredicate: _sapphire_shapeshift.UnionValidator;
-declare const descriptionPredicate: _sapphire_shapeshift.UnionValidator;
-declare const footerTextPredicate: _sapphire_shapeshift.UnionValidator;
-declare const embedFooterPredicate: _sapphire_shapeshift.ObjectValidator<{
- text: string | null;
- iconURL: string | null | undefined;
-}, _sapphire_shapeshift.UndefinedToOptional<{
- text: string | null;
- iconURL: string | null | undefined;
-}>>;
-declare const timestampPredicate: _sapphire_shapeshift.UnionValidator;
-declare const titlePredicate: _sapphire_shapeshift.UnionValidator;
-
-declare const Assertions$5_RGBPredicate: typeof RGBPredicate;
-declare const Assertions$5_authorNamePredicate: typeof authorNamePredicate;
-declare const Assertions$5_colorPredicate: typeof colorPredicate;
-declare const Assertions$5_descriptionPredicate: typeof descriptionPredicate;
-declare const Assertions$5_embedAuthorPredicate: typeof embedAuthorPredicate;
-declare const Assertions$5_embedFieldPredicate: typeof embedFieldPredicate;
-declare const Assertions$5_embedFieldsArrayPredicate: typeof embedFieldsArrayPredicate;
-declare const Assertions$5_embedFooterPredicate: typeof embedFooterPredicate;
-declare const Assertions$5_fieldInlinePredicate: typeof fieldInlinePredicate;
-declare const Assertions$5_fieldLengthPredicate: typeof fieldLengthPredicate;
-declare const Assertions$5_fieldNamePredicate: typeof fieldNamePredicate;
-declare const Assertions$5_fieldValuePredicate: typeof fieldValuePredicate;
-declare const Assertions$5_footerTextPredicate: typeof footerTextPredicate;
-declare const Assertions$5_imageURLPredicate: typeof imageURLPredicate;
-declare const Assertions$5_timestampPredicate: typeof timestampPredicate;
-declare const Assertions$5_titlePredicate: typeof titlePredicate;
-declare const Assertions$5_urlPredicate: typeof urlPredicate;
-declare const Assertions$5_validateFieldLength: typeof validateFieldLength;
-declare namespace Assertions$5 {
- export {
- Assertions$5_RGBPredicate as RGBPredicate,
- Assertions$5_authorNamePredicate as authorNamePredicate,
- Assertions$5_colorPredicate as colorPredicate,
- Assertions$5_descriptionPredicate as descriptionPredicate,
- Assertions$5_embedAuthorPredicate as embedAuthorPredicate,
- Assertions$5_embedFieldPredicate as embedFieldPredicate,
- Assertions$5_embedFieldsArrayPredicate as embedFieldsArrayPredicate,
- Assertions$5_embedFooterPredicate as embedFooterPredicate,
- Assertions$5_fieldInlinePredicate as fieldInlinePredicate,
- Assertions$5_fieldLengthPredicate as fieldLengthPredicate,
- Assertions$5_fieldNamePredicate as fieldNamePredicate,
- Assertions$5_fieldValuePredicate as fieldValuePredicate,
- Assertions$5_footerTextPredicate as footerTextPredicate,
- Assertions$5_imageURLPredicate as imageURLPredicate,
- Assertions$5_timestampPredicate as timestampPredicate,
- Assertions$5_titlePredicate as titlePredicate,
- Assertions$5_urlPredicate as urlPredicate,
- Assertions$5_validateFieldLength as validateFieldLength,
- };
-}
-
-/**
- * Normalizes data that is a rest parameter or an array into an array with a depth of 1.
- *
- * @typeParam T - The data that must satisfy {@link RestOrArray}.
- * @param arr - The (possibly variadic) data to normalize
- */
-declare function normalizeArray(arr: RestOrArray): T[];
-/**
- * Represents data that may be an array or came from a rest parameter.
- *
- * @remarks
- * This type is used throughout builders to ensure both an array and variadic arguments
- * may be used. It is normalized with {@link normalizeArray}.
- */
-type RestOrArray = T[] | [T[]];
-
-/**
- * A tuple satisfying the RGB color model.
- *
- * @see {@link https://developer.mozilla.org/docs/Glossary/RGB}
- */
-type RGBTuple = [red: number, green: number, blue: number];
-/**
- * The base icon data typically used in payloads.
- */
-interface IconData {
- /**
- * The URL of the icon.
- */
- iconURL?: string;
- /**
- * The proxy URL of the icon.
- */
- proxyIconURL?: string;
-}
-/**
- * Represents the author data of an embed.
- */
-type EmbedAuthorData = IconData & Omit;
-/**
- * Represents the author options of an embed.
- */
-type EmbedAuthorOptions = Omit;
-/**
- * Represents the footer data of an embed.
- */
-type EmbedFooterData = IconData & Omit;
-/**
- * Represents the footer options of an embed.
- */
-type EmbedFooterOptions = Omit;
-/**
- * Represents the image data of an embed.
- */
-interface EmbedImageData extends Omit {
- /**
- * The proxy URL for the image.
- */
- proxyURL?: string;
-}
-/**
- * A builder that creates API-compatible JSON data for embeds.
- */
-declare class EmbedBuilder {
- /**
- * The API data associated with this embed.
- */
- readonly data: APIEmbed;
- /**
- * Creates a new embed from API data.
- *
- * @param data - The API data to create this embed with
- */
- constructor(data?: APIEmbed);
- /**
- * Appends fields to the embed.
- *
- * @remarks
- * This method accepts either an array of fields or a variable number of field parameters.
- * The maximum amount of fields that can be added is 25.
- * @example
- * Using an array:
- * ```ts
- * const fields: APIEmbedField[] = ...;
- * const embed = new EmbedBuilder()
- * .addFields(fields);
- * ```
- * @example
- * Using rest parameters (variadic):
- * ```ts
- * const embed = new EmbedBuilder()
- * .addFields(
- * { name: 'Field 1', value: 'Value 1' },
- * { name: 'Field 2', value: 'Value 2' },
- * );
- * ```
- * @param fields - The fields to add
- */
- addFields(...fields: RestOrArray): this;
- /**
- * Removes, replaces, or inserts fields for this embed.
- *
- * @remarks
- * This method behaves similarly
- * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.
- * The maximum amount of fields that can be added is 25.
- *
- * It's useful for modifying and adjusting order of the already-existing fields of an embed.
- * @example
- * Remove the first field:
- * ```ts
- * embed.spliceFields(0, 1);
- * ```
- * @example
- * Remove the first n fields:
- * ```ts
- * const n = 4;
- * embed.spliceFields(0, n);
- * ```
- * @example
- * Remove the last field:
- * ```ts
- * embed.spliceFields(-1, 1);
- * ```
- * @param index - The index to start at
- * @param deleteCount - The number of fields to remove
- * @param fields - The replacing field objects
- */
- spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this;
- /**
- * Sets the fields for this embed.
- *
- * @remarks
- * This method is an alias for {@link EmbedBuilder.spliceFields}. More specifically,
- * it splices the entire array of fields, replacing them with the provided fields.
- *
- * You can set a maximum of 25 fields.
- * @param fields - The fields to set
- */
- setFields(...fields: RestOrArray): this;
- /**
- * Sets the author of this embed.
- *
- * @param options - The options to use
- */
- setAuthor(options: EmbedAuthorOptions | null): this;
- /**
- * Sets the color of this embed.
- *
- * @param color - The color to use
- */
- setColor(color: RGBTuple | number | null): this;
- /**
- * Sets the description of this embed.
- *
- * @param description - The description to use
- */
- setDescription(description: string | null): this;
- /**
- * Sets the footer of this embed.
- *
- * @param options - The footer to use
- */
- setFooter(options: EmbedFooterOptions | null): this;
- /**
- * Sets the image of this embed.
- *
- * @param url - The image URL to use
- */
- setImage(url: string | null): this;
- /**
- * Sets the thumbnail of this embed.
- *
- * @param url - The thumbnail URL to use
- */
- setThumbnail(url: string | null): this;
- /**
- * Sets the timestamp of this embed.
- *
- * @param timestamp - The timestamp or date to use
- */
- setTimestamp(timestamp?: Date | number | null): this;
- /**
- * Sets the title for this embed.
- *
- * @param title - The title to use
- */
- setTitle(title: string | null): this;
- /**
- * Sets the URL of this embed.
- *
- * @param url - The URL to use
- */
- setURL(url: string | null): this;
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON(): APIEmbed;
-}
-
-/**
- * A builder that creates API-compatible JSON data for string select menu options.
- */
-declare class StringSelectMenuOptionBuilder implements JSONEncodable {
- data: Partial;
- /**
- * Creates a new string select menu option from API data.
- *
- * @param data - The API data to create this string select menu option with
- * @example
- * Creating a string select menu option from an API data object:
- * ```ts
- * const selectMenuOption = new SelectMenuOptionBuilder({
- * label: 'catchy label',
- * value: '1',
- * });
- * ```
- * @example
- * Creating a string select menu option using setters and API data:
- * ```ts
- * const selectMenuOption = new SelectMenuOptionBuilder({
- * default: true,
- * value: '1',
- * })
- * .setLabel('woah');
- * ```
- */
- constructor(data?: Partial);
- /**
- * Sets the label for this option.
- *
- * @param label - The label to use
- */
- setLabel(label: string): this;
- /**
- * Sets the value for this option.
- *
- * @param value - The value to use
- */
- setValue(value: string): this;
- /**
- * Sets the description for this option.
- *
- * @param description - The description to use
- */
- setDescription(description: string): this;
- /**
- * Sets whether this option is selected by default.
- *
- * @param isDefault - Whether this option is selected by default
- */
- setDefault(isDefault?: boolean): this;
- /**
- * Sets the emoji to display for this option.
- *
- * @param emoji - The emoji to use
- */
- setEmoji(emoji: APIMessageComponentEmoji): this;
- /**
- * {@inheritDoc BaseSelectMenuBuilder.toJSON}
- */
- toJSON(): APISelectMenuOption;
-}
-
-declare const customIdValidator: _sapphire_shapeshift.StringValidator;
-declare const emojiValidator: _sapphire_shapeshift.ObjectValidator<{
- name?: string | undefined;
- id?: string | undefined;
- animated?: boolean | undefined;
-}, _sapphire_shapeshift.UndefinedToOptional<{
- name?: string | undefined;
- id?: string | undefined;
- animated?: boolean | undefined;
-}>>;
-declare const disabledValidator: _sapphire_shapeshift.BooleanValidator;
-declare const buttonLabelValidator: _sapphire_shapeshift.StringValidator;
-declare const buttonStyleValidator: _sapphire_shapeshift.NativeEnumValidator;
-declare const placeholderValidator$1: _sapphire_shapeshift.StringValidator;
-declare const minMaxValidator: _sapphire_shapeshift.NumberValidator;
-declare const labelValueDescriptionValidator: _sapphire_shapeshift.StringValidator;
-declare const jsonOptionValidator: _sapphire_shapeshift.ObjectValidator<{
- label: string;
- value: string;
- description: string | undefined;
- emoji: _sapphire_shapeshift.UndefinedToOptional<{
- name?: string | undefined;
- id?: string | undefined;
- animated?: boolean | undefined;
- }> | undefined;
- default: boolean | undefined;
-}, _sapphire_shapeshift.UndefinedToOptional<{
- label: string;
- value: string;
- description: string | undefined;
- emoji: _sapphire_shapeshift.UndefinedToOptional<{
- name?: string | undefined;
- id?: string | undefined;
- animated?: boolean | undefined;
- }> | undefined;
- default: boolean | undefined;
-}>>;
-declare const optionValidator: _sapphire_shapeshift.InstanceValidator;
-declare const optionsValidator: _sapphire_shapeshift.ArrayValidator;
-declare const optionsLengthValidator: _sapphire_shapeshift.NumberValidator;
-declare function validateRequiredSelectMenuParameters(options: StringSelectMenuOptionBuilder[], customId?: string): void;
-declare const defaultValidator: _sapphire_shapeshift.BooleanValidator;
-declare function validateRequiredSelectMenuOptionParameters(label?: string, value?: string): void;
-declare const channelTypesValidator: _sapphire_shapeshift.ArrayValidator;
-declare const urlValidator: _sapphire_shapeshift.StringValidator;
-declare function validateRequiredButtonParameters(style?: ButtonStyle, label?: string, emoji?: APIMessageComponentEmoji, customId?: string, url?: string): void;
-
-declare const Assertions$4_buttonLabelValidator: typeof buttonLabelValidator;
-declare const Assertions$4_buttonStyleValidator: typeof buttonStyleValidator;
-declare const Assertions$4_channelTypesValidator: typeof channelTypesValidator;
-declare const Assertions$4_customIdValidator: typeof customIdValidator;
-declare const Assertions$4_defaultValidator: typeof defaultValidator;
-declare const Assertions$4_disabledValidator: typeof disabledValidator;
-declare const Assertions$4_emojiValidator: typeof emojiValidator;
-declare const Assertions$4_jsonOptionValidator: typeof jsonOptionValidator;
-declare const Assertions$4_labelValueDescriptionValidator: typeof labelValueDescriptionValidator;
-declare const Assertions$4_minMaxValidator: typeof minMaxValidator;
-declare const Assertions$4_optionValidator: typeof optionValidator;
-declare const Assertions$4_optionsLengthValidator: typeof optionsLengthValidator;
-declare const Assertions$4_optionsValidator: typeof optionsValidator;
-declare const Assertions$4_urlValidator: typeof urlValidator;
-declare const Assertions$4_validateRequiredButtonParameters: typeof validateRequiredButtonParameters;
-declare const Assertions$4_validateRequiredSelectMenuOptionParameters: typeof validateRequiredSelectMenuOptionParameters;
-declare const Assertions$4_validateRequiredSelectMenuParameters: typeof validateRequiredSelectMenuParameters;
-declare namespace Assertions$4 {
- export {
- Assertions$4_buttonLabelValidator as buttonLabelValidator,
- Assertions$4_buttonStyleValidator as buttonStyleValidator,
- Assertions$4_channelTypesValidator as channelTypesValidator,
- Assertions$4_customIdValidator as customIdValidator,
- Assertions$4_defaultValidator as defaultValidator,
- Assertions$4_disabledValidator as disabledValidator,
- Assertions$4_emojiValidator as emojiValidator,
- Assertions$4_jsonOptionValidator as jsonOptionValidator,
- Assertions$4_labelValueDescriptionValidator as labelValueDescriptionValidator,
- Assertions$4_minMaxValidator as minMaxValidator,
- Assertions$4_optionValidator as optionValidator,
- Assertions$4_optionsLengthValidator as optionsLengthValidator,
- Assertions$4_optionsValidator as optionsValidator,
- placeholderValidator$1 as placeholderValidator,
- Assertions$4_urlValidator as urlValidator,
- Assertions$4_validateRequiredButtonParameters as validateRequiredButtonParameters,
- Assertions$4_validateRequiredSelectMenuOptionParameters as validateRequiredSelectMenuOptionParameters,
- Assertions$4_validateRequiredSelectMenuParameters as validateRequiredSelectMenuParameters,
- };
-}
-
-/**
- * Any action row component data represented as an object.
- */
-type AnyAPIActionRowComponent = APIActionRowComponent | APIActionRowComponentTypes;
-/**
- * The base component builder that contains common symbols for all sorts of components.
- *
- * @typeParam DataType - The type of internal API data that is stored within the component
- */
-declare abstract class ComponentBuilder> = APIBaseComponent> implements JSONEncodable {
- /**
- * The API data associated with this component.
- */
- readonly data: Partial;
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- abstract toJSON(): AnyAPIActionRowComponent;
- /**
- * Constructs a new kind of component.
- *
- * @param data - The data to construct a component out of
- */
- constructor(data: Partial);
-}
-
-/**
- * A builder that creates API-compatible JSON data for buttons.
- */
-declare class ButtonBuilder extends ComponentBuilder {
- /**
- * Creates a new button from API data.
- *
- * @param data - The API data to create this button with
- * @example
- * Creating a button from an API data object:
- * ```ts
- * const button = new ButtonBuilder({
- * custom_id: 'a cool button',
- * style: ButtonStyle.Primary,
- * label: 'Click Me',
- * emoji: {
- * name: 'smile',
- * id: '123456789012345678',
- * },
- * });
- * ```
- * @example
- * Creating a button using setters and API data:
- * ```ts
- * const button = new ButtonBuilder({
- * style: ButtonStyle.Secondary,
- * label: 'Click Me',
- * })
- * .setEmoji({ name: '🙂' })
- * .setCustomId('another cool button');
- * ```
- */
- constructor(data?: Partial);
- /**
- * Sets the style of this button.
- *
- * @param style - The style to use
- */
- setStyle(style: ButtonStyle): this;
- /**
- * Sets the URL for this button.
- *
- * @remarks
- * This method is only available to buttons using the `Link` button style.
- * Only three types of URL schemes are currently supported: `https://`, `http://`, and `discord://`.
- * @param url - The URL to use
- */
- setURL(url: string): this;
- /**
- * Sets the custom id for this button.
- *
- * @remarks
- * This method is only applicable to buttons that are not using the `Link` button style.
- * @param customId - The custom id to use
- */
- setCustomId(customId: string): this;
- /**
- * Sets the emoji to display on this button.
- *
- * @param emoji - The emoji to use
- */
- setEmoji(emoji: APIMessageComponentEmoji): this;
- /**
- * Sets whether this button is disabled.
- *
- * @param disabled - Whether to disable this button
- */
- setDisabled(disabled?: boolean): this;
- /**
- * Sets the label for this button.
- *
- * @param label - The label to use
- */
- setLabel(label: string): this;
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON(): APIButtonComponent;
-}
-
-/**
- * The base select menu builder that contains common symbols for select menu builders.
- *
- * @typeParam SelectMenuType - The type of select menu this would be instantiated for.
- */
-declare abstract class BaseSelectMenuBuilder extends ComponentBuilder {
- /**
- * Sets the placeholder for this select menu.
- *
- * @param placeholder - The placeholder to use
- */
- setPlaceholder(placeholder: string): this;
- /**
- * Sets the minimum values that must be selected in the select menu.
- *
- * @param minValues - The minimum values that must be selected
- */
- setMinValues(minValues: number): this;
- /**
- * Sets the maximum values that must be selected in the select menu.
- *
- * @param maxValues - The maximum values that must be selected
- */
- setMaxValues(maxValues: number): this;
- /**
- * Sets the custom id for this select menu.
- *
- * @param customId - The custom id to use
- */
- setCustomId(customId: string): this;
- /**
- * Sets whether this select menu is disabled.
- *
- * @param disabled - Whether this select menu is disabled
- */
- setDisabled(disabled?: boolean): this;
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON(): SelectMenuType;
-}
-
-/**
- * A builder that creates API-compatible JSON data for channel select menus.
- */
-declare class ChannelSelectMenuBuilder extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new ChannelSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new ChannelSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .addChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement)
- * .setMinValues(2);
- * ```
- */
- constructor(data?: Partial);
- /**
- * Adds channel types to this select menu.
- *
- * @param types - The channel types to use
- */
- addChannelTypes(...types: RestOrArray): this;
- /**
- * Sets channel types for this select menu.
- *
- * @param types - The channel types to use
- */
- setChannelTypes(...types: RestOrArray): this;
- /**
- * {@inheritDoc BaseSelectMenuBuilder.toJSON}
- */
- toJSON(): APIChannelSelectComponent;
-}
-
-/**
- * A builder that creates API-compatible JSON data for mentionable select menus.
- */
-declare class MentionableSelectMenuBuilder extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new MentionableSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new MentionableSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1);
- * ```
- */
- constructor(data?: Partial);
-}
-
-/**
- * A builder that creates API-compatible JSON data for role select menus.
- */
-declare class RoleSelectMenuBuilder extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new RoleSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new RoleSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1);
- * ```
- */
- constructor(data?: Partial);
-}
-
-/**
- * A builder that creates API-compatible JSON data for string select menus.
- */
-declare class StringSelectMenuBuilder extends BaseSelectMenuBuilder {
- /**
- * The options within this select menu.
- */
- readonly options: StringSelectMenuOptionBuilder[];
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new StringSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * options: [
- * { label: 'option 1', value: '1' },
- * { label: 'option 2', value: '2' },
- * { label: 'option 3', value: '3' },
- * ],
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new StringSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * .addOptions({
- * label: 'Catchy',
- * value: 'catch',
- * });
- * ```
- */
- constructor(data?: Partial);
- /**
- * Adds options to this select menu.
- *
- * @param options - The options to add
- */
- addOptions(...options: RestOrArray): this;
- /**
- * Sets the options for this select menu.
- *
- * @param options - The options to set
- */
- setOptions(...options: RestOrArray): this;
- /**
- * Removes, replaces, or inserts options for this select menu.
- *
- * @remarks
- * This method behaves similarly
- * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice()}.
- * It's useful for modifying and adjusting the order of existing options.
- * @example
- * Remove the first option:
- * ```ts
- * selectMenu.spliceOptions(0, 1);
- * ```
- * @example
- * Remove the first n option:
- * ```ts
- * const n = 4;
- * selectMenu.spliceOptions(0, n);
- * ```
- * @example
- * Remove the last option:
- * ```ts
- * selectMenu.spliceOptions(-1, 1);
- * ```
- * @param index - The index to start at
- * @param deleteCount - The number of options to remove
- * @param options - The replacing option objects or builders
- */
- spliceOptions(index: number, deleteCount: number, ...options: RestOrArray): this;
- /**
- * {@inheritDoc BaseSelectMenuBuilder.toJSON}
- */
- toJSON(): APIStringSelectComponent;
-}
-
-/**
- * A builder that creates API-compatible JSON data for user select menus.
- */
-declare class UserSelectMenuBuilder extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new UserSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new UserSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1);
- * ```
- */
- constructor(data?: Partial);
-}
-
-/**
- * A builder that creates API-compatible JSON data for text inputs.
- */
-declare class TextInputBuilder extends ComponentBuilder implements Equatable> {
- /**
- * Creates a new text input from API data.
- *
- * @param data - The API data to create this text input with
- * @example
- * Creating a select menu option from an API data object:
- * ```ts
- * const textInput = new TextInputBuilder({
- * custom_id: 'a cool select menu',
- * label: 'Type something',
- * style: TextInputStyle.Short,
- * });
- * ```
- * @example
- * Creating a select menu option using setters and API data:
- * ```ts
- * const textInput = new TextInputBuilder({
- * label: 'Type something else',
- * })
- * .setCustomId('woah')
- * .setStyle(TextInputStyle.Paragraph);
- * ```
- */
- constructor(data?: APITextInputComponent & {
- type?: ComponentType.TextInput;
- });
- /**
- * Sets the custom id for this text input.
- *
- * @param customId - The custom id to use
- */
- setCustomId(customId: string): this;
- /**
- * Sets the label for this text input.
- *
- * @param label - The label to use
- */
- setLabel(label: string): this;
- /**
- * Sets the style for this text input.
- *
- * @param style - The style to use
- */
- setStyle(style: TextInputStyle): this;
- /**
- * Sets the minimum length of text for this text input.
- *
- * @param minLength - The minimum length of text for this text input
- */
- setMinLength(minLength: number): this;
- /**
- * Sets the maximum length of text for this text input.
- *
- * @param maxLength - The maximum length of text for this text input
- */
- setMaxLength(maxLength: number): this;
- /**
- * Sets the placeholder for this text input.
- *
- * @param placeholder - The placeholder to use
- */
- setPlaceholder(placeholder: string): this;
- /**
- * Sets the value for this text input.
- *
- * @param value - The value to use
- */
- setValue(value: string): this;
- /**
- * Sets whether this text input is required.
- *
- * @param required - Whether this text input is required
- */
- setRequired(required?: boolean): this;
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON(): APITextInputComponent;
- /**
- * {@inheritDoc Equatable.equals}
- */
- equals(other: APITextInputComponent | JSONEncodable): boolean;
-}
-
-/**
- * The builders that may be used for messages.
- */
-type MessageComponentBuilder = ActionRowBuilder | MessageActionRowComponentBuilder;
-/**
- * The builders that may be used for modals.
- */
-type ModalComponentBuilder = ActionRowBuilder | ModalActionRowComponentBuilder;
-/**
- * The builders that may be used within an action row for messages.
- */
-type MessageActionRowComponentBuilder = ButtonBuilder | ChannelSelectMenuBuilder | MentionableSelectMenuBuilder | RoleSelectMenuBuilder | StringSelectMenuBuilder | UserSelectMenuBuilder;
-/**
- * The builders that may be used within an action row for modals.
- */
-type ModalActionRowComponentBuilder = TextInputBuilder;
-/**
- * Any builder.
- */
-type AnyComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder;
-/**
- * A builder that creates API-compatible JSON data for action rows.
- *
- * @typeParam T - The types of components this action row holds
- */
-declare class ActionRowBuilder extends ComponentBuilder> {
- /**
- * The components within this action row.
- */
- readonly components: T[];
- /**
- * Creates a new action row from API data.
- *
- * @param data - The API data to create this action row with
- * @example
- * Creating an action row from an API data object:
- * ```ts
- * const actionRow = new ActionRowBuilder({
- * components: [
- * {
- * custom_id: "custom id",
- * label: "Type something",
- * style: TextInputStyle.Short,
- * type: ComponentType.TextInput,
- * },
- * ],
- * });
- * ```
- * @example
- * Creating an action row using setters and API data:
- * ```ts
- * const actionRow = new ActionRowBuilder({
- * components: [
- * {
- * custom_id: "custom id",
- * label: "Click me",
- * style: ButtonStyle.Primary,
- * type: ComponentType.Button,
- * },
- * ],
- * })
- * .addComponents(button2, button3);
- * ```
- */
- constructor({ components, ...data }?: Partial>);
- /**
- * Adds components to this action row.
- *
- * @param components - The components to add
- */
- addComponents(...components: RestOrArray): this;
- /**
- * Sets components for this action row.
- *
- * @param components - The components to set
- */
- setComponents(...components: RestOrArray): this;
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON(): APIActionRowComponent>;
-}
-
-/**
- * Components here are mapped to their respective builder.
- */
-interface MappedComponentTypes {
- /**
- * The action row component type is associated with an {@link ActionRowBuilder}.
- */
- [ComponentType.ActionRow]: ActionRowBuilder;
- /**
- * The button component type is associated with an {@link ButtonBuilder}.
- */
- [ComponentType.Button]: ButtonBuilder;
- /**
- * The string select component type is associated with an {@link StringSelectMenuBuilder}.
- */
- [ComponentType.StringSelect]: StringSelectMenuBuilder;
- /**
- * The text inpiut component type is associated with an {@link TextInputBuilder}.
- */
- [ComponentType.TextInput]: TextInputBuilder;
- /**
- * The user select component type is associated with an {@link UserSelectMenuBuilder}.
- */
- [ComponentType.UserSelect]: UserSelectMenuBuilder;
- /**
- * The role select component type is associated with an {@link RoleSelectMenuBuilder}.
- */
- [ComponentType.RoleSelect]: RoleSelectMenuBuilder;
- /**
- * The mentionable select component type is associated with an {@link MentionableSelectMenuBuilder}.
- */
- [ComponentType.MentionableSelect]: MentionableSelectMenuBuilder;
- /**
- * The channel select component type is associated with an {@link ChannelSelectMenuBuilder}.
- */
- [ComponentType.ChannelSelect]: ChannelSelectMenuBuilder;
-}
-/**
- * Factory for creating components from API data.
- *
- * @typeParam T - The type of component to use
- * @param data - The API data to transform to a component class
- */
-declare function createComponentBuilder(data: (APIModalComponent | APIMessageComponent) & {
- type: T;
-}): MappedComponentTypes[T];
-/**
- * Factory for creating components from API data.
- *
- * @typeParam C - The type of component to use
- * @param data - The API data to transform to a component class
- */
-declare function createComponentBuilder(data: C): C;
-
-declare const textInputStyleValidator: _sapphire_shapeshift.NativeEnumValidator;
-declare const minLengthValidator: _sapphire_shapeshift.NumberValidator;
-declare const maxLengthValidator: _sapphire_shapeshift.NumberValidator;
-declare const requiredValidator: _sapphire_shapeshift.BooleanValidator;
-declare const valueValidator: _sapphire_shapeshift.StringValidator;
-declare const placeholderValidator: _sapphire_shapeshift.StringValidator;
-declare const labelValidator: _sapphire_shapeshift.StringValidator;
-declare function validateRequiredParameters$3(customId?: string, style?: TextInputStyle, label?: string): void;
-
-declare const Assertions$3_labelValidator: typeof labelValidator;
-declare const Assertions$3_maxLengthValidator: typeof maxLengthValidator;
-declare const Assertions$3_minLengthValidator: typeof minLengthValidator;
-declare const Assertions$3_placeholderValidator: typeof placeholderValidator;
-declare const Assertions$3_requiredValidator: typeof requiredValidator;
-declare const Assertions$3_textInputStyleValidator: typeof textInputStyleValidator;
-declare const Assertions$3_valueValidator: typeof valueValidator;
-declare namespace Assertions$3 {
- export {
- Assertions$3_labelValidator as labelValidator,
- Assertions$3_maxLengthValidator as maxLengthValidator,
- Assertions$3_minLengthValidator as minLengthValidator,
- Assertions$3_placeholderValidator as placeholderValidator,
- Assertions$3_requiredValidator as requiredValidator,
- Assertions$3_textInputStyleValidator as textInputStyleValidator,
- validateRequiredParameters$3 as validateRequiredParameters,
- Assertions$3_valueValidator as valueValidator,
- };
-}
-
-/**
- * A builder that creates API-compatible JSON data for modals.
- */
-declare class ModalBuilder implements JSONEncodable {
- /**
- * The API data associated with this modal.
- */
- readonly data: Partial;
- /**
- * The components within this modal.
- */
- readonly components: ActionRowBuilder[];
- /**
- * Creates a new modal from API data.
- *
- * @param data - The API data to create this modal with
- */
- constructor({ components, ...data }?: Partial);
- /**
- * Sets the title of this modal.
- *
- * @param title - The title to use
- */
- setTitle(title: string): this;
- /**
- * Sets the custom id of this modal.
- *
- * @param customId - The custom id to use
- */
- setCustomId(customId: string): this;
- /**
- * Adds components to this modal.
- *
- * @param components - The components to add
- */
- addComponents(...components: RestOrArray | APIActionRowComponent>): this;
- /**
- * Sets components for this modal.
- *
- * @param components - The components to set
- */
- setComponents(...components: RestOrArray>): this;
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON(): APIModalInteractionResponseCallbackData;
-}
-
-declare const titleValidator: _sapphire_shapeshift.StringValidator;
-declare const componentsValidator: _sapphire_shapeshift.ArrayValidator<[ActionRowBuilder, ...ActionRowBuilder[]], ActionRowBuilder>;
-declare function validateRequiredParameters$2(customId?: string, title?: string, components?: ActionRowBuilder[]): void;
-
-declare const Assertions$2_componentsValidator: typeof componentsValidator;
-declare const Assertions$2_titleValidator: typeof titleValidator;
-declare namespace Assertions$2 {
- export {
- Assertions$2_componentsValidator as componentsValidator,
- Assertions$2_titleValidator as titleValidator,
- validateRequiredParameters$2 as validateRequiredParameters,
- };
-}
-
-/**
- * This mixin holds name and description symbols for slash commands.
- */
-declare class SharedNameAndDescription {
- /**
- * The name of this command.
- */
- readonly name: string;
- /**
- * The name localizations of this command.
- */
- readonly name_localizations?: LocalizationMap;
- /**
- * The description of this command.
- */
- readonly description: string;
- /**
- * The description localizations of this command.
- */
- readonly description_localizations?: LocalizationMap;
- /**
- * Sets the name of this command.
- *
- * @param name - The name to use
- */
- setName(name: string): this;
- /**
- * Sets the description of this command.
- *
- * @param description - The description to use
- */
- setDescription(description: string): this;
- /**
- * SSets a name localization for this command.
- *
- * @param locale - The locale to set
- * @param localizedName - The localized name for the given `locale`
- */
- setNameLocalization(locale: LocaleString, localizedName: string | null): this;
- /**
- * Sets the name localizations for this command.
- *
- * @param localizedNames - The object of localized names to set
- */
- setNameLocalizations(localizedNames: LocalizationMap | null): this;
- /**
- * Sets a description localization for this command.
- *
- * @param locale - The locale to set
- * @param localizedDescription - The localized description for the given locale
- */
- setDescriptionLocalization(locale: LocaleString, localizedDescription: string | null): this;
- /**
- * Sets the description localizations for this command.
- *
- * @param localizedDescriptions - The object of localized descriptions to set
- */
- setDescriptionLocalizations(localizedDescriptions: LocalizationMap | null): this;
-}
-
-/**
- * The base application command option builder that contains common symbols for application command builders.
- */
-declare abstract class ApplicationCommandOptionBase extends SharedNameAndDescription {
- /**
- * The type of this option.
- */
- abstract readonly type: ApplicationCommandOptionType;
- /**
- * Whether this option is required.
- *
- * @defaultValue `false`
- */
- readonly required: boolean;
- /**
- * Sets whether this option is required.
- *
- * @param required - Whether this option should be required
- */
- setRequired(required: boolean): this;
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- abstract toJSON(): APIApplicationCommandBasicOption;
- /**
- * This method runs required validators on this builder.
- */
- protected runRequiredValidations(): void;
-}
-
-/**
- * A slash command attachment option.
- */
-declare class SlashCommandAttachmentOption extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- readonly type: ApplicationCommandOptionType.Attachment;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON(): APIApplicationCommandAttachmentOption;
-}
-
-/**
- * A slash command boolean option.
- */
-declare class SlashCommandBooleanOption extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- readonly type: ApplicationCommandOptionType.Boolean;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON(): APIApplicationCommandBooleanOption;
-}
-
-/**
- * The allowed channel types used for a channel option in a slash command builder.
- *
- * @privateRemarks This can't be dynamic because const enums are erased at runtime.
- * @internal
- */
-declare const allowedChannelTypes: readonly [ChannelType.GuildText, ChannelType.GuildVoice, ChannelType.GuildCategory, ChannelType.GuildAnnouncement, ChannelType.AnnouncementThread, ChannelType.PublicThread, ChannelType.PrivateThread, ChannelType.GuildStageVoice, ChannelType.GuildForum];
-/**
- * The type of allowed channel types used for a channel option.
- */
-type ApplicationCommandOptionAllowedChannelTypes = (typeof allowedChannelTypes)[number];
-/**
- * This mixin holds channel type symbols used for options.
- */
-declare class ApplicationCommandOptionChannelTypesMixin {
- /**
- * The channel types of this option.
- */
- readonly channel_types?: ApplicationCommandOptionAllowedChannelTypes[];
- /**
- * Adds channel types to this option.
- *
- * @param channelTypes - The channel types
- */
- addChannelTypes(...channelTypes: ApplicationCommandOptionAllowedChannelTypes[]): this;
-}
-
-/**
- * A slash command channel option.
- */
-declare class SlashCommandChannelOption extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- readonly type: ApplicationCommandOptionType.Channel;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON(): APIApplicationCommandChannelOption;
-}
-interface SlashCommandChannelOption extends ApplicationCommandOptionChannelTypesMixin {
-}
-
-/**
- * This mixin holds minimum and maximum symbols used for options.
- */
-declare abstract class ApplicationCommandNumericOptionMinMaxValueMixin {
- /**
- * The maximum value of this option.
- */
- readonly max_value?: number;
- /**
- * The minimum value of this option.
- */
- readonly min_value?: number;
- /**
- * Sets the maximum number value of this option.
- *
- * @param max - The maximum value this option can be
- */
- abstract setMaxValue(max: number): this;
- /**
- * Sets the minimum number value of this option.
- *
- * @param min - The minimum value this option can be
- */
- abstract setMinValue(min: number): this;
-}
-
-/**
- * This mixin holds choices and autocomplete symbols used for options.
- */
-declare class ApplicationCommandOptionWithChoicesAndAutocompleteMixin {
- /**
- * The choices of this option.
- */
- readonly choices?: APIApplicationCommandOptionChoice[];
- /**
- * Whether this option utilizes autocomplete.
- */
- readonly autocomplete?: boolean;
- /**
- * The type of this option.
- *
- * @privateRemarks Since this is present and this is a mixin, this is needed.
- */
- readonly type: ApplicationCommandOptionType;
- /**
- * Adds multiple choices to this option.
- *
- * @param choices - The choices to add
- */
- addChoices(...choices: APIApplicationCommandOptionChoice[]): this;
- /**
- * Sets multiple choices for this option.
- *
- * @param choices - The choices to set
- */
- setChoices[]>(...choices: Input): this;
- /**
- * Whether this option uses autocomplete.
- *
- * @param autocomplete - Whether this option should use autocomplete
- */
- setAutocomplete(autocomplete: boolean): this;
-}
-
-/**
- * A slash command integer option.
- */
-declare class SlashCommandIntegerOption extends ApplicationCommandOptionBase implements ApplicationCommandNumericOptionMinMaxValueMixin {
- /**
- * The type of this option.
- */
- readonly type: ApplicationCommandOptionType.Integer;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}
- */
- setMaxValue(max: number): this;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}
- */
- setMinValue(min: number): this;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON(): APIApplicationCommandIntegerOption;
-}
-interface SlashCommandIntegerOption extends ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin {
-}
-
-/**
- * A slash command mentionable option.
- */
-declare class SlashCommandMentionableOption extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- readonly type: ApplicationCommandOptionType.Mentionable;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON(): APIApplicationCommandMentionableOption;
-}
-
-/**
- * A slash command number option.
- */
-declare class SlashCommandNumberOption extends ApplicationCommandOptionBase implements ApplicationCommandNumericOptionMinMaxValueMixin {
- /**
- * The type of this option.
- */
- readonly type: ApplicationCommandOptionType.Number;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}
- */
- setMaxValue(max: number): this;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}
- */
- setMinValue(min: number): this;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON(): APIApplicationCommandNumberOption;
-}
-interface SlashCommandNumberOption extends ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin {
-}
-
-/**
- * A slash command role option.
- */
-declare class SlashCommandRoleOption extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- readonly type: ApplicationCommandOptionType.Role;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON(): APIApplicationCommandRoleOption;
-}
-
-/**
- * A slash command string option.
- */
-declare class SlashCommandStringOption extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- readonly type: ApplicationCommandOptionType.String;
- /**
- * The maximum length of this option.
- */
- readonly max_length?: number;
- /**
- * The minimum length of this option.
- */
- readonly min_length?: number;
- /**
- * Sets the maximum length of this string option.
- *
- * @param max - The maximum length this option can be
- */
- setMaxLength(max: number): this;
- /**
- * Sets the minimum length of this string option.
- *
- * @param min - The minimum length this option can be
- */
- setMinLength(min: number): this;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON(): APIApplicationCommandStringOption;
-}
-interface SlashCommandStringOption extends ApplicationCommandOptionWithChoicesAndAutocompleteMixin {
-}
-
-/**
- * A slash command user option.
- */
-declare class SlashCommandUserOption extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- readonly type: ApplicationCommandOptionType.User;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON(): APIApplicationCommandUserOption;
-}
-
-/**
- * This mixin holds symbols that can be shared in slash command options.
- *
- * @typeParam ShouldOmitSubcommandFunctions - Whether to omit subcommand functions.
- */
-declare class SharedSlashCommandOptions {
- readonly options: ToAPIApplicationCommandOptions[];
- /**
- * Adds a boolean option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addBooleanOption(input: SlashCommandBooleanOption | ((builder: SlashCommandBooleanOption) => SlashCommandBooleanOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds a user option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds a channel option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addChannelOption(input: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds a role option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds an attachment option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addAttachmentOption(input: SlashCommandAttachmentOption | ((builder: SlashCommandAttachmentOption) => SlashCommandAttachmentOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds a mentionable option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addMentionableOption(input: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds a string option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addStringOption(input: Omit | Omit | SlashCommandStringOption | ((builder: SlashCommandStringOption) => Omit | Omit | SlashCommandStringOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds an integer option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addIntegerOption(input: Omit | Omit | SlashCommandIntegerOption | ((builder: SlashCommandIntegerOption) => Omit | Omit | SlashCommandIntegerOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds a number option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addNumberOption(input: Omit | Omit | SlashCommandNumberOption | ((builder: SlashCommandNumberOption) => Omit | Omit | SlashCommandNumberOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Where the actual adding magic happens. ✨
- *
- * @param input - The input. What else?
- * @param Instance - The instance of whatever is being added
- * @internal
- */
- private _sharedAddOptionMethod;
-}
-
-/**
- * Represents a folder for subcommands.
- *
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}
- */
-declare class SlashCommandSubcommandGroupBuilder implements ToAPIApplicationCommandOptions {
- /**
- * The name of this subcommand group.
- */
- readonly name: string;
- /**
- * The description of this subcommand group.
- */
- readonly description: string;
- /**
- * The subcommands within this subcommand group.
- */
- readonly options: SlashCommandSubcommandBuilder[];
- /**
- * Adds a new subcommand to this group.
- *
- * @param input - A function that returns a subcommand builder or an already built builder
- */
- addSubcommand(input: SlashCommandSubcommandBuilder | ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder)): this;
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON(): APIApplicationCommandSubcommandGroupOption;
-}
-interface SlashCommandSubcommandGroupBuilder extends SharedNameAndDescription {
-}
-/**
- * A builder that creates API-compatible JSON data for slash command subcommands.
- *
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}
- */
-declare class SlashCommandSubcommandBuilder implements ToAPIApplicationCommandOptions {
- /**
- * The name of this subcommand.
- */
- readonly name: string;
- /**
- * The description of this subcommand.
- */
- readonly description: string;
- /**
- * The options within this subcommand.
- */
- readonly options: ApplicationCommandOptionBase[];
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON(): APIApplicationCommandSubcommandOption;
-}
-interface SlashCommandSubcommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {
-}
-
-/**
- * A builder that creates API-compatible JSON data for slash commands.
- */
-declare class SlashCommandBuilder {
- /**
- * The name of this command.
- */
- readonly name: string;
- /**
- * The name localizations of this command.
- */
- readonly name_localizations?: LocalizationMap;
- /**
- * The description of this command.
- */
- readonly description: string;
- /**
- * The description localizations of this command.
- */
- readonly description_localizations?: LocalizationMap;
- /**
- * The options of this command.
- */
- readonly options: ToAPIApplicationCommandOptions[];
- /**
- * Whether this command is enabled by default when the application is added to a guild.
- *
- * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- readonly default_permission: boolean | undefined;
- /**
- * The set of permissions represented as a bit set for the command.
- */
- readonly default_member_permissions: Permissions | null | undefined;
- /**
- * Indicates whether the command is available in direct messages with the application.
- *
- * @remarks
- * By default, commands are visible. This property is only for global commands.
- */
- readonly dm_permission: boolean | undefined;
- /**
- * Whether this command is NSFW.
- */
- readonly nsfw: boolean | undefined;
- /**
- * Sets whether the command is enabled by default when the application is added to a guild.
- *
- * @remarks
- * If set to `false`, you will have to later `PUT` the permissions for this command.
- * @param value - Whether or not to enable this command by default
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- * @deprecated Use {@link SlashCommandBuilder.setDefaultMemberPermissions} or {@link SlashCommandBuilder.setDMPermission} instead.
- */
- setDefaultPermission(value: boolean): this;
- /**
- * Sets the default permissions a member should have in order to run the command.
- *
- * @remarks
- * You can set this to `'0'` to disable the command by default.
- * @param permissions - The permissions bit field to set
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- */
- setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined): this;
- /**
- * Sets if the command is available in direct messages with the application.
- *
- * @remarks
- * By default, commands are visible. This method is only for global commands.
- * @param enabled - Whether the command should be enabled in direct messages
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- */
- setDMPermission(enabled: boolean | null | undefined): this;
- /**
- * Sets whether this command is NSFW.
- *
- * @param nsfw - Whether this command is NSFW
- */
- setNSFW(nsfw?: boolean): this;
- /**
- * Adds a new subcommand group to this command.
- *
- * @param input - A function that returns a subcommand group builder or an already built builder
- */
- addSubcommandGroup(input: SlashCommandSubcommandGroupBuilder | ((subcommandGroup: SlashCommandSubcommandGroupBuilder) => SlashCommandSubcommandGroupBuilder)): SlashCommandSubcommandsOnlyBuilder;
- /**
- * Adds a new subcommand to this command.
- *
- * @param input - A function that returns a subcommand builder or an already built builder
- */
- addSubcommand(input: SlashCommandSubcommandBuilder | ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder)): SlashCommandSubcommandsOnlyBuilder;
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON(): RESTPostAPIChatInputApplicationCommandsJSONBody;
-}
-interface SlashCommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {
-}
-/**
- * An interface specifically for slash command subcommands.
- */
-interface SlashCommandSubcommandsOnlyBuilder extends Omit> {
-}
-/**
- * An interface specifically for slash command options.
- */
-interface SlashCommandOptionsOnlyBuilder extends SharedNameAndDescription, SharedSlashCommandOptions, Pick {
-}
-/**
- * An interface that ensures the `toJSON()` call will return something
- * that can be serialized into API-compatible data.
- */
-interface ToAPIApplicationCommandOptions {
- toJSON(): APIApplicationCommandOption;
-}
-
-declare function validateName$1(name: unknown): asserts name is string;
-declare function validateDescription(description: unknown): asserts description is string;
-declare function validateLocale(locale: unknown): Locale;
-declare function validateMaxOptionsLength(options: unknown): asserts options is ToAPIApplicationCommandOptions[];
-declare function validateRequiredParameters$1(name: string, description: string, options: ToAPIApplicationCommandOptions[]): void;
-declare function validateDefaultPermission$1(value: unknown): asserts value is boolean;
-declare function validateRequired(required: unknown): asserts required is boolean;
-declare function validateChoicesLength(amountAdding: number, choices?: APIApplicationCommandOptionChoice[]): void;
-declare function assertReturnOfBuilder(input: unknown, ExpectedInstanceOf: new () => T): asserts input is T;
-declare const localizationMapPredicate: _sapphire_shapeshift.UnionValidator<_sapphire_shapeshift.UndefinedToOptional>> | null | undefined>;
-declare function validateLocalizationMap(value: unknown): asserts value is LocalizationMap;
-declare function validateDMPermission$1(value: unknown): asserts value is boolean | null | undefined;
-declare function validateDefaultMemberPermissions$1(permissions: unknown): string | null | undefined;
-declare function validateNSFW(value: unknown): asserts value is boolean;
-
-declare const Assertions$1_assertReturnOfBuilder: typeof assertReturnOfBuilder;
-declare const Assertions$1_localizationMapPredicate: typeof localizationMapPredicate;
-declare const Assertions$1_validateChoicesLength: typeof validateChoicesLength;
-declare const Assertions$1_validateDescription: typeof validateDescription;
-declare const Assertions$1_validateLocale: typeof validateLocale;
-declare const Assertions$1_validateLocalizationMap: typeof validateLocalizationMap;
-declare const Assertions$1_validateMaxOptionsLength: typeof validateMaxOptionsLength;
-declare const Assertions$1_validateNSFW: typeof validateNSFW;
-declare const Assertions$1_validateRequired: typeof validateRequired;
-declare namespace Assertions$1 {
- export {
- Assertions$1_assertReturnOfBuilder as assertReturnOfBuilder,
- Assertions$1_localizationMapPredicate as localizationMapPredicate,
- Assertions$1_validateChoicesLength as validateChoicesLength,
- validateDMPermission$1 as validateDMPermission,
- validateDefaultMemberPermissions$1 as validateDefaultMemberPermissions,
- validateDefaultPermission$1 as validateDefaultPermission,
- Assertions$1_validateDescription as validateDescription,
- Assertions$1_validateLocale as validateLocale,
- Assertions$1_validateLocalizationMap as validateLocalizationMap,
- Assertions$1_validateMaxOptionsLength as validateMaxOptionsLength,
- Assertions$1_validateNSFW as validateNSFW,
- validateName$1 as validateName,
- Assertions$1_validateRequired as validateRequired,
- validateRequiredParameters$1 as validateRequiredParameters,
- };
-}
-
-/**
- * The type a context menu command can be.
- */
-type ContextMenuCommandType = ApplicationCommandType.Message | ApplicationCommandType.User;
-/**
- * A builder that creates API-compatible JSON data for context menu commands.
- */
-declare class ContextMenuCommandBuilder {
- /**
- * The name of this command.
- */
- readonly name: string;
- /**
- * The name localizations of this command.
- */
- readonly name_localizations?: LocalizationMap;
- /**
- * The type of this command.
- */
- readonly type: ContextMenuCommandType;
- /**
- * Whether this command is enabled by default when the application is added to a guild.
- *
- * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- readonly default_permission: boolean | undefined;
- /**
- * The set of permissions represented as a bit set for the command.
- */
- readonly default_member_permissions: Permissions | null | undefined;
- /**
- * Indicates whether the command is available in direct messages with the application.
- *
- * @remarks
- * By default, commands are visible. This property is only for global commands.
- */
- readonly dm_permission: boolean | undefined;
- /**
- * Sets the name of this command.
- *
- * @param name - The name to use
- */
- setName(name: string): this;
- /**
- * Sets the type of this command.
- *
- * @param type - The type to use
- */
- setType(type: ContextMenuCommandType): this;
- /**
- * Sets whether the command is enabled by default when the application is added to a guild.
- *
- * @remarks
- * If set to `false`, you will have to later `PUT` the permissions for this command.
- * @param value - Whether to enable this command by default
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- setDefaultPermission(value: boolean): this;
- /**
- * Sets the default permissions a member should have in order to run this command.
- *
- * @remarks
- * You can set this to `'0'` to disable the command by default.
- * @param permissions - The permissions bit field to set
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- */
- setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined): this;
- /**
- * Sets if the command is available in direct messages with the application.
- *
- * @remarks
- * By default, commands are visible. This method is only for global commands.
- * @param enabled - Whether the command should be enabled in direct messages
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- */
- setDMPermission(enabled: boolean | null | undefined): this;
- /**
- * Sets a name localization for this command.
- *
- * @param locale - The locale to set
- * @param localizedName - The localized name for the given `locale`
- */
- setNameLocalization(locale: LocaleString, localizedName: string | null): this;
- /**
- * Sets the name localizations for this command.
- *
- * @param localizedNames - The object of localized names to set
- */
- setNameLocalizations(localizedNames: LocalizationMap | null): this;
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody;
-}
-
-declare function validateDefaultPermission(value: unknown): asserts value is boolean;
-declare function validateName(name: unknown): asserts name is string;
-declare function validateType(type: unknown): asserts type is ContextMenuCommandType;
-declare function validateRequiredParameters(name: string, type: number): void;
-declare function validateDMPermission(value: unknown): asserts value is boolean | null | undefined;
-declare function validateDefaultMemberPermissions(permissions: unknown): string | null | undefined;
-
-declare const Assertions_validateDMPermission: typeof validateDMPermission;
-declare const Assertions_validateDefaultMemberPermissions: typeof validateDefaultMemberPermissions;
-declare const Assertions_validateDefaultPermission: typeof validateDefaultPermission;
-declare const Assertions_validateName: typeof validateName;
-declare const Assertions_validateRequiredParameters: typeof validateRequiredParameters;
-declare const Assertions_validateType: typeof validateType;
-declare namespace Assertions {
- export {
- Assertions_validateDMPermission as validateDMPermission,
- Assertions_validateDefaultMemberPermissions as validateDefaultMemberPermissions,
- Assertions_validateDefaultPermission as validateDefaultPermission,
- Assertions_validateName as validateName,
- Assertions_validateRequiredParameters as validateRequiredParameters,
- Assertions_validateType as validateType,
- };
-}
-
-/**
- * Calculates the length of the embed.
- *
- * @param data - The embed data to check
- */
-declare function embedLength(data: APIEmbed): number;
-
-/**
- * Enables validators.
- *
- * @returns Whether validation is occurring.
- */
-declare function enableValidators(): boolean;
-/**
- * Disables validators.
- *
- * @returns Whether validation is occurring.
- */
-declare function disableValidators(): boolean;
-/**
- * Checks whether validation is occurring.
- */
-declare function isValidationEnabled(): boolean;
-
-/**
- * The {@link https://github.com/discordjs/discord.js/blob/main/packages/builders#readme | @discordjs/builders} version
- * that you are currently using.
- *
- * @privateRemarks This needs to explicitly be `string` so it is not typed as a "const string" that gets injected by esbuild.
- */
-declare const version: string;
-
-export { ActionRowBuilder, AnyAPIActionRowComponent, AnyComponentBuilder, ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionAllowedChannelTypes, ApplicationCommandOptionBase, ApplicationCommandOptionChannelTypesMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin, BaseSelectMenuBuilder, ButtonBuilder, ChannelSelectMenuBuilder, Assertions$4 as ComponentAssertions, ComponentBuilder, Assertions as ContextMenuCommandAssertions, ContextMenuCommandBuilder, ContextMenuCommandType, Assertions$5 as EmbedAssertions, EmbedAuthorData, EmbedAuthorOptions, EmbedBuilder, EmbedFooterData, EmbedFooterOptions, EmbedImageData, IconData, MappedComponentTypes, MentionableSelectMenuBuilder, MessageActionRowComponentBuilder, MessageComponentBuilder, ModalActionRowComponentBuilder, Assertions$2 as ModalAssertions, ModalBuilder, ModalComponentBuilder, RGBTuple, RestOrArray, RoleSelectMenuBuilder, StringSelectMenuBuilder as SelectMenuBuilder, StringSelectMenuOptionBuilder as SelectMenuOptionBuilder, SharedNameAndDescription, SharedSlashCommandOptions, Assertions$1 as SlashCommandAssertions, SlashCommandAttachmentOption, SlashCommandBooleanOption, SlashCommandBuilder, SlashCommandChannelOption, SlashCommandIntegerOption, SlashCommandMentionableOption, SlashCommandNumberOption, SlashCommandOptionsOnlyBuilder, SlashCommandRoleOption, SlashCommandStringOption, SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder, SlashCommandSubcommandsOnlyBuilder, SlashCommandUserOption, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, Assertions$3 as TextInputAssertions, TextInputBuilder, ToAPIApplicationCommandOptions, UserSelectMenuBuilder, createComponentBuilder, disableValidators, embedLength, enableValidators, isValidationEnabled, normalizeArray, version };
diff --git a/node_modules/@discordjs/builders/dist/index.js b/node_modules/@discordjs/builders/dist/index.js
deleted file mode 100644
index 456ed60..0000000
--- a/node_modules/@discordjs/builders/dist/index.js
+++ /dev/null
@@ -1,2562 +0,0 @@
-"use strict";
-var __create = Object.create;
-var __defProp = Object.defineProperty;
-var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
-var __getOwnPropNames = Object.getOwnPropertyNames;
-var __getProtoOf = Object.getPrototypeOf;
-var __hasOwnProp = Object.prototype.hasOwnProperty;
-var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
-var __export = (target, all) => {
- for (var name in all)
- __defProp(target, name, { get: all[name], enumerable: true });
-};
-var __copyProps = (to, from, except, desc) => {
- if (from && typeof from === "object" || typeof from === "function") {
- for (let key of __getOwnPropNames(from))
- if (!__hasOwnProp.call(to, key) && key !== except)
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
- }
- return to;
-};
-var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
-var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
- // If the importer is in node compatibility mode or this is not an ESM
- // file that has been converted to a CommonJS file using a Babel-
- // compatible transform (i.e. "__esModule" has not been set), then set
- // "default" to the CommonJS "module.exports" for node compatibility.
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
- mod
-));
-var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
-var __decorateClass = (decorators, target, key, kind) => {
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
- if (decorator = decorators[i])
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
- if (kind && result)
- __defProp(target, key, result);
- return result;
-};
-
-// src/index.ts
-var src_exports = {};
-__export(src_exports, {
- ActionRowBuilder: () => ActionRowBuilder,
- ApplicationCommandNumericOptionMinMaxValueMixin: () => ApplicationCommandNumericOptionMinMaxValueMixin,
- ApplicationCommandOptionBase: () => ApplicationCommandOptionBase,
- ApplicationCommandOptionChannelTypesMixin: () => ApplicationCommandOptionChannelTypesMixin,
- ApplicationCommandOptionWithChoicesAndAutocompleteMixin: () => ApplicationCommandOptionWithChoicesAndAutocompleteMixin,
- BaseSelectMenuBuilder: () => BaseSelectMenuBuilder,
- ButtonBuilder: () => ButtonBuilder,
- ChannelSelectMenuBuilder: () => ChannelSelectMenuBuilder,
- ComponentAssertions: () => Assertions_exports2,
- ComponentBuilder: () => ComponentBuilder,
- ContextMenuCommandAssertions: () => Assertions_exports6,
- ContextMenuCommandBuilder: () => ContextMenuCommandBuilder,
- EmbedAssertions: () => Assertions_exports,
- EmbedBuilder: () => EmbedBuilder,
- MentionableSelectMenuBuilder: () => MentionableSelectMenuBuilder,
- ModalAssertions: () => Assertions_exports4,
- ModalBuilder: () => ModalBuilder,
- RoleSelectMenuBuilder: () => RoleSelectMenuBuilder,
- SelectMenuBuilder: () => StringSelectMenuBuilder,
- SelectMenuOptionBuilder: () => StringSelectMenuOptionBuilder,
- SharedNameAndDescription: () => SharedNameAndDescription,
- SharedSlashCommandOptions: () => SharedSlashCommandOptions,
- SlashCommandAssertions: () => Assertions_exports5,
- SlashCommandAttachmentOption: () => SlashCommandAttachmentOption,
- SlashCommandBooleanOption: () => SlashCommandBooleanOption,
- SlashCommandBuilder: () => SlashCommandBuilder,
- SlashCommandChannelOption: () => SlashCommandChannelOption,
- SlashCommandIntegerOption: () => SlashCommandIntegerOption,
- SlashCommandMentionableOption: () => SlashCommandMentionableOption,
- SlashCommandNumberOption: () => SlashCommandNumberOption,
- SlashCommandRoleOption: () => SlashCommandRoleOption,
- SlashCommandStringOption: () => SlashCommandStringOption,
- SlashCommandSubcommandBuilder: () => SlashCommandSubcommandBuilder,
- SlashCommandSubcommandGroupBuilder: () => SlashCommandSubcommandGroupBuilder,
- SlashCommandUserOption: () => SlashCommandUserOption,
- StringSelectMenuBuilder: () => StringSelectMenuBuilder,
- StringSelectMenuOptionBuilder: () => StringSelectMenuOptionBuilder,
- TextInputAssertions: () => Assertions_exports3,
- TextInputBuilder: () => TextInputBuilder,
- UserSelectMenuBuilder: () => UserSelectMenuBuilder,
- createComponentBuilder: () => createComponentBuilder,
- disableValidators: () => disableValidators,
- embedLength: () => embedLength,
- enableValidators: () => enableValidators,
- isValidationEnabled: () => isValidationEnabled,
- normalizeArray: () => normalizeArray,
- version: () => version
-});
-module.exports = __toCommonJS(src_exports);
-
-// src/messages/embed/Assertions.ts
-var Assertions_exports = {};
-__export(Assertions_exports, {
- RGBPredicate: () => RGBPredicate,
- authorNamePredicate: () => authorNamePredicate,
- colorPredicate: () => colorPredicate,
- descriptionPredicate: () => descriptionPredicate,
- embedAuthorPredicate: () => embedAuthorPredicate,
- embedFieldPredicate: () => embedFieldPredicate,
- embedFieldsArrayPredicate: () => embedFieldsArrayPredicate,
- embedFooterPredicate: () => embedFooterPredicate,
- fieldInlinePredicate: () => fieldInlinePredicate,
- fieldLengthPredicate: () => fieldLengthPredicate,
- fieldNamePredicate: () => fieldNamePredicate,
- fieldValuePredicate: () => fieldValuePredicate,
- footerTextPredicate: () => footerTextPredicate,
- imageURLPredicate: () => imageURLPredicate,
- timestampPredicate: () => timestampPredicate,
- titlePredicate: () => titlePredicate,
- urlPredicate: () => urlPredicate,
- validateFieldLength: () => validateFieldLength
-});
-var import_shapeshift = require("@sapphire/shapeshift");
-
-// src/util/validation.ts
-var validate = true;
-function enableValidators() {
- return validate = true;
-}
-__name(enableValidators, "enableValidators");
-function disableValidators() {
- return validate = false;
-}
-__name(disableValidators, "disableValidators");
-function isValidationEnabled() {
- return validate;
-}
-__name(isValidationEnabled, "isValidationEnabled");
-
-// src/messages/embed/Assertions.ts
-var fieldNamePredicate = import_shapeshift.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(256).setValidationEnabled(isValidationEnabled);
-var fieldValuePredicate = import_shapeshift.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(1024).setValidationEnabled(isValidationEnabled);
-var fieldInlinePredicate = import_shapeshift.s.boolean.optional;
-var embedFieldPredicate = import_shapeshift.s.object({
- name: fieldNamePredicate,
- value: fieldValuePredicate,
- inline: fieldInlinePredicate
-}).setValidationEnabled(isValidationEnabled);
-var embedFieldsArrayPredicate = embedFieldPredicate.array.setValidationEnabled(isValidationEnabled);
-var fieldLengthPredicate = import_shapeshift.s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateFieldLength(amountAdding, fields) {
- fieldLengthPredicate.parse((fields?.length ?? 0) + amountAdding);
-}
-__name(validateFieldLength, "validateFieldLength");
-var authorNamePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);
-var imageURLPredicate = import_shapeshift.s.string.url({
- allowedProtocols: ["http:", "https:", "attachment:"]
-}).nullish.setValidationEnabled(isValidationEnabled);
-var urlPredicate = import_shapeshift.s.string.url({
- allowedProtocols: ["http:", "https:"]
-}).nullish.setValidationEnabled(isValidationEnabled);
-var embedAuthorPredicate = import_shapeshift.s.object({
- name: authorNamePredicate,
- iconURL: imageURLPredicate,
- url: urlPredicate
-}).setValidationEnabled(isValidationEnabled);
-var RGBPredicate = import_shapeshift.s.number.int.greaterThanOrEqual(0).lessThanOrEqual(255).setValidationEnabled(isValidationEnabled);
-var colorPredicate = import_shapeshift.s.number.int.greaterThanOrEqual(0).lessThanOrEqual(16777215).or(import_shapeshift.s.tuple([RGBPredicate, RGBPredicate, RGBPredicate])).nullable.setValidationEnabled(isValidationEnabled);
-var descriptionPredicate = import_shapeshift.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(4096).nullable.setValidationEnabled(isValidationEnabled);
-var footerTextPredicate = import_shapeshift.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(2048).nullable.setValidationEnabled(isValidationEnabled);
-var embedFooterPredicate = import_shapeshift.s.object({
- text: footerTextPredicate,
- iconURL: imageURLPredicate
-}).setValidationEnabled(isValidationEnabled);
-var timestampPredicate = import_shapeshift.s.union(import_shapeshift.s.number, import_shapeshift.s.date).nullable.setValidationEnabled(isValidationEnabled);
-var titlePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);
-
-// src/util/normalizeArray.ts
-function normalizeArray(arr) {
- if (Array.isArray(arr[0]))
- return arr[0];
- return arr;
-}
-__name(normalizeArray, "normalizeArray");
-
-// src/messages/embed/Embed.ts
-var EmbedBuilder = class {
- /**
- * The API data associated with this embed.
- */
- data;
- /**
- * Creates a new embed from API data.
- *
- * @param data - The API data to create this embed with
- */
- constructor(data = {}) {
- this.data = { ...data };
- if (data.timestamp)
- this.data.timestamp = new Date(data.timestamp).toISOString();
- }
- /**
- * Appends fields to the embed.
- *
- * @remarks
- * This method accepts either an array of fields or a variable number of field parameters.
- * The maximum amount of fields that can be added is 25.
- * @example
- * Using an array:
- * ```ts
- * const fields: APIEmbedField[] = ...;
- * const embed = new EmbedBuilder()
- * .addFields(fields);
- * ```
- * @example
- * Using rest parameters (variadic):
- * ```ts
- * const embed = new EmbedBuilder()
- * .addFields(
- * { name: 'Field 1', value: 'Value 1' },
- * { name: 'Field 2', value: 'Value 2' },
- * );
- * ```
- * @param fields - The fields to add
- */
- addFields(...fields) {
- const normalizedFields = normalizeArray(fields);
- validateFieldLength(normalizedFields.length, this.data.fields);
- embedFieldsArrayPredicate.parse(normalizedFields);
- if (this.data.fields)
- this.data.fields.push(...normalizedFields);
- else
- this.data.fields = normalizedFields;
- return this;
- }
- /**
- * Removes, replaces, or inserts fields for this embed.
- *
- * @remarks
- * This method behaves similarly
- * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.
- * The maximum amount of fields that can be added is 25.
- *
- * It's useful for modifying and adjusting order of the already-existing fields of an embed.
- * @example
- * Remove the first field:
- * ```ts
- * embed.spliceFields(0, 1);
- * ```
- * @example
- * Remove the first n fields:
- * ```ts
- * const n = 4;
- * embed.spliceFields(0, n);
- * ```
- * @example
- * Remove the last field:
- * ```ts
- * embed.spliceFields(-1, 1);
- * ```
- * @param index - The index to start at
- * @param deleteCount - The number of fields to remove
- * @param fields - The replacing field objects
- */
- spliceFields(index, deleteCount, ...fields) {
- validateFieldLength(fields.length - deleteCount, this.data.fields);
- embedFieldsArrayPredicate.parse(fields);
- if (this.data.fields)
- this.data.fields.splice(index, deleteCount, ...fields);
- else
- this.data.fields = fields;
- return this;
- }
- /**
- * Sets the fields for this embed.
- *
- * @remarks
- * This method is an alias for {@link EmbedBuilder.spliceFields}. More specifically,
- * it splices the entire array of fields, replacing them with the provided fields.
- *
- * You can set a maximum of 25 fields.
- * @param fields - The fields to set
- */
- setFields(...fields) {
- this.spliceFields(0, this.data.fields?.length ?? 0, ...normalizeArray(fields));
- return this;
- }
- /**
- * Sets the author of this embed.
- *
- * @param options - The options to use
- */
- setAuthor(options) {
- if (options === null) {
- this.data.author = void 0;
- return this;
- }
- embedAuthorPredicate.parse(options);
- this.data.author = { name: options.name, url: options.url, icon_url: options.iconURL };
- return this;
- }
- /**
- * Sets the color of this embed.
- *
- * @param color - The color to use
- */
- setColor(color) {
- colorPredicate.parse(color);
- if (Array.isArray(color)) {
- const [red, green, blue] = color;
- this.data.color = (red << 16) + (green << 8) + blue;
- return this;
- }
- this.data.color = color ?? void 0;
- return this;
- }
- /**
- * Sets the description of this embed.
- *
- * @param description - The description to use
- */
- setDescription(description) {
- descriptionPredicate.parse(description);
- this.data.description = description ?? void 0;
- return this;
- }
- /**
- * Sets the footer of this embed.
- *
- * @param options - The footer to use
- */
- setFooter(options) {
- if (options === null) {
- this.data.footer = void 0;
- return this;
- }
- embedFooterPredicate.parse(options);
- this.data.footer = { text: options.text, icon_url: options.iconURL };
- return this;
- }
- /**
- * Sets the image of this embed.
- *
- * @param url - The image URL to use
- */
- setImage(url) {
- imageURLPredicate.parse(url);
- this.data.image = url ? { url } : void 0;
- return this;
- }
- /**
- * Sets the thumbnail of this embed.
- *
- * @param url - The thumbnail URL to use
- */
- setThumbnail(url) {
- imageURLPredicate.parse(url);
- this.data.thumbnail = url ? { url } : void 0;
- return this;
- }
- /**
- * Sets the timestamp of this embed.
- *
- * @param timestamp - The timestamp or date to use
- */
- setTimestamp(timestamp = Date.now()) {
- timestampPredicate.parse(timestamp);
- this.data.timestamp = timestamp ? new Date(timestamp).toISOString() : void 0;
- return this;
- }
- /**
- * Sets the title for this embed.
- *
- * @param title - The title to use
- */
- setTitle(title) {
- titlePredicate.parse(title);
- this.data.title = title ?? void 0;
- return this;
- }
- /**
- * Sets the URL of this embed.
- *
- * @param url - The URL to use
- */
- setURL(url) {
- urlPredicate.parse(url);
- this.data.url = url ?? void 0;
- return this;
- }
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- return { ...this.data };
- }
-};
-__name(EmbedBuilder, "EmbedBuilder");
-
-// src/index.ts
-__reExport(src_exports, require("@discordjs/formatters"), module.exports);
-
-// src/components/Assertions.ts
-var Assertions_exports2 = {};
-__export(Assertions_exports2, {
- buttonLabelValidator: () => buttonLabelValidator,
- buttonStyleValidator: () => buttonStyleValidator,
- channelTypesValidator: () => channelTypesValidator,
- customIdValidator: () => customIdValidator,
- defaultValidator: () => defaultValidator,
- disabledValidator: () => disabledValidator,
- emojiValidator: () => emojiValidator,
- jsonOptionValidator: () => jsonOptionValidator,
- labelValueDescriptionValidator: () => labelValueDescriptionValidator,
- minMaxValidator: () => minMaxValidator,
- optionValidator: () => optionValidator,
- optionsLengthValidator: () => optionsLengthValidator,
- optionsValidator: () => optionsValidator,
- placeholderValidator: () => placeholderValidator,
- urlValidator: () => urlValidator,
- validateRequiredButtonParameters: () => validateRequiredButtonParameters,
- validateRequiredSelectMenuOptionParameters: () => validateRequiredSelectMenuOptionParameters,
- validateRequiredSelectMenuParameters: () => validateRequiredSelectMenuParameters
-});
-var import_shapeshift2 = require("@sapphire/shapeshift");
-var import_v10 = require("discord-api-types/v10");
-
-// src/components/selectMenu/StringSelectMenuOption.ts
-var StringSelectMenuOptionBuilder = class {
- /**
- * Creates a new string select menu option from API data.
- *
- * @param data - The API data to create this string select menu option with
- * @example
- * Creating a string select menu option from an API data object:
- * ```ts
- * const selectMenuOption = new SelectMenuOptionBuilder({
- * label: 'catchy label',
- * value: '1',
- * });
- * ```
- * @example
- * Creating a string select menu option using setters and API data:
- * ```ts
- * const selectMenuOption = new SelectMenuOptionBuilder({
- * default: true,
- * value: '1',
- * })
- * .setLabel('woah');
- * ```
- */
- constructor(data = {}) {
- this.data = data;
- }
- /**
- * Sets the label for this option.
- *
- * @param label - The label to use
- */
- setLabel(label) {
- this.data.label = labelValueDescriptionValidator.parse(label);
- return this;
- }
- /**
- * Sets the value for this option.
- *
- * @param value - The value to use
- */
- setValue(value) {
- this.data.value = labelValueDescriptionValidator.parse(value);
- return this;
- }
- /**
- * Sets the description for this option.
- *
- * @param description - The description to use
- */
- setDescription(description) {
- this.data.description = labelValueDescriptionValidator.parse(description);
- return this;
- }
- /**
- * Sets whether this option is selected by default.
- *
- * @param isDefault - Whether this option is selected by default
- */
- setDefault(isDefault = true) {
- this.data.default = defaultValidator.parse(isDefault);
- return this;
- }
- /**
- * Sets the emoji to display for this option.
- *
- * @param emoji - The emoji to use
- */
- setEmoji(emoji) {
- this.data.emoji = emojiValidator.parse(emoji);
- return this;
- }
- /**
- * {@inheritDoc BaseSelectMenuBuilder.toJSON}
- */
- toJSON() {
- validateRequiredSelectMenuOptionParameters(this.data.label, this.data.value);
- return {
- ...this.data
- };
- }
-};
-__name(StringSelectMenuOptionBuilder, "StringSelectMenuOptionBuilder");
-
-// src/components/Assertions.ts
-var customIdValidator = import_shapeshift2.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var emojiValidator = import_shapeshift2.s.object({
- id: import_shapeshift2.s.string,
- name: import_shapeshift2.s.string,
- animated: import_shapeshift2.s.boolean
-}).partial.strict.setValidationEnabled(isValidationEnabled);
-var disabledValidator = import_shapeshift2.s.boolean;
-var buttonLabelValidator = import_shapeshift2.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(80).setValidationEnabled(isValidationEnabled);
-var buttonStyleValidator = import_shapeshift2.s.nativeEnum(import_v10.ButtonStyle);
-var placeholderValidator = import_shapeshift2.s.string.lengthLessThanOrEqual(150).setValidationEnabled(isValidationEnabled);
-var minMaxValidator = import_shapeshift2.s.number.int.greaterThanOrEqual(0).lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-var labelValueDescriptionValidator = import_shapeshift2.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var jsonOptionValidator = import_shapeshift2.s.object({
- label: labelValueDescriptionValidator,
- value: labelValueDescriptionValidator,
- description: labelValueDescriptionValidator.optional,
- emoji: emojiValidator.optional,
- default: import_shapeshift2.s.boolean.optional
-}).setValidationEnabled(isValidationEnabled);
-var optionValidator = import_shapeshift2.s.instance(StringSelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled);
-var optionsValidator = optionValidator.array.lengthGreaterThanOrEqual(0).setValidationEnabled(isValidationEnabled);
-var optionsLengthValidator = import_shapeshift2.s.number.int.greaterThanOrEqual(0).lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateRequiredSelectMenuParameters(options, customId) {
- customIdValidator.parse(customId);
- optionsValidator.parse(options);
-}
-__name(validateRequiredSelectMenuParameters, "validateRequiredSelectMenuParameters");
-var defaultValidator = import_shapeshift2.s.boolean;
-function validateRequiredSelectMenuOptionParameters(label, value) {
- labelValueDescriptionValidator.parse(label);
- labelValueDescriptionValidator.parse(value);
-}
-__name(validateRequiredSelectMenuOptionParameters, "validateRequiredSelectMenuOptionParameters");
-var channelTypesValidator = import_shapeshift2.s.nativeEnum(import_v10.ChannelType).array.setValidationEnabled(isValidationEnabled);
-var urlValidator = import_shapeshift2.s.string.url({
- allowedProtocols: ["http:", "https:", "discord:"]
-}).setValidationEnabled(isValidationEnabled);
-function validateRequiredButtonParameters(style, label, emoji, customId, url) {
- if (url && customId) {
- throw new RangeError("URL and custom id are mutually exclusive");
- }
- if (!label && !emoji) {
- throw new RangeError("Buttons must have a label and/or an emoji");
- }
- if (style === import_v10.ButtonStyle.Link) {
- if (!url) {
- throw new RangeError("Link buttons must have a url");
- }
- } else if (url) {
- throw new RangeError("Non-link buttons cannot have a url");
- }
-}
-__name(validateRequiredButtonParameters, "validateRequiredButtonParameters");
-
-// src/components/ActionRow.ts
-var import_v1011 = require("discord-api-types/v10");
-
-// src/components/Component.ts
-var ComponentBuilder = class {
- /**
- * The API data associated with this component.
- */
- data;
- /**
- * Constructs a new kind of component.
- *
- * @param data - The data to construct a component out of
- */
- constructor(data) {
- this.data = data;
- }
-};
-__name(ComponentBuilder, "ComponentBuilder");
-
-// src/components/Components.ts
-var import_v1010 = require("discord-api-types/v10");
-
-// src/components/button/Button.ts
-var import_v102 = require("discord-api-types/v10");
-var ButtonBuilder = class extends ComponentBuilder {
- /**
- * Creates a new button from API data.
- *
- * @param data - The API data to create this button with
- * @example
- * Creating a button from an API data object:
- * ```ts
- * const button = new ButtonBuilder({
- * custom_id: 'a cool button',
- * style: ButtonStyle.Primary,
- * label: 'Click Me',
- * emoji: {
- * name: 'smile',
- * id: '123456789012345678',
- * },
- * });
- * ```
- * @example
- * Creating a button using setters and API data:
- * ```ts
- * const button = new ButtonBuilder({
- * style: ButtonStyle.Secondary,
- * label: 'Click Me',
- * })
- * .setEmoji({ name: '🙂' })
- * .setCustomId('another cool button');
- * ```
- */
- constructor(data) {
- super({ type: import_v102.ComponentType.Button, ...data });
- }
- /**
- * Sets the style of this button.
- *
- * @param style - The style to use
- */
- setStyle(style) {
- this.data.style = buttonStyleValidator.parse(style);
- return this;
- }
- /**
- * Sets the URL for this button.
- *
- * @remarks
- * This method is only available to buttons using the `Link` button style.
- * Only three types of URL schemes are currently supported: `https://`, `http://`, and `discord://`.
- * @param url - The URL to use
- */
- setURL(url) {
- this.data.url = urlValidator.parse(url);
- return this;
- }
- /**
- * Sets the custom id for this button.
- *
- * @remarks
- * This method is only applicable to buttons that are not using the `Link` button style.
- * @param customId - The custom id to use
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Sets the emoji to display on this button.
- *
- * @param emoji - The emoji to use
- */
- setEmoji(emoji) {
- this.data.emoji = emojiValidator.parse(emoji);
- return this;
- }
- /**
- * Sets whether this button is disabled.
- *
- * @param disabled - Whether to disable this button
- */
- setDisabled(disabled = true) {
- this.data.disabled = disabledValidator.parse(disabled);
- return this;
- }
- /**
- * Sets the label for this button.
- *
- * @param label - The label to use
- */
- setLabel(label) {
- this.data.label = buttonLabelValidator.parse(label);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredButtonParameters(
- this.data.style,
- this.data.label,
- this.data.emoji,
- this.data.custom_id,
- this.data.url
- );
- return {
- ...this.data
- };
- }
-};
-__name(ButtonBuilder, "ButtonBuilder");
-
-// src/components/selectMenu/ChannelSelectMenu.ts
-var import_v103 = require("discord-api-types/v10");
-
-// src/components/selectMenu/BaseSelectMenu.ts
-var BaseSelectMenuBuilder = class extends ComponentBuilder {
- /**
- * Sets the placeholder for this select menu.
- *
- * @param placeholder - The placeholder to use
- */
- setPlaceholder(placeholder) {
- this.data.placeholder = placeholderValidator.parse(placeholder);
- return this;
- }
- /**
- * Sets the minimum values that must be selected in the select menu.
- *
- * @param minValues - The minimum values that must be selected
- */
- setMinValues(minValues) {
- this.data.min_values = minMaxValidator.parse(minValues);
- return this;
- }
- /**
- * Sets the maximum values that must be selected in the select menu.
- *
- * @param maxValues - The maximum values that must be selected
- */
- setMaxValues(maxValues) {
- this.data.max_values = minMaxValidator.parse(maxValues);
- return this;
- }
- /**
- * Sets the custom id for this select menu.
- *
- * @param customId - The custom id to use
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Sets whether this select menu is disabled.
- *
- * @param disabled - Whether this select menu is disabled
- */
- setDisabled(disabled = true) {
- this.data.disabled = disabledValidator.parse(disabled);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- customIdValidator.parse(this.data.custom_id);
- return {
- ...this.data
- };
- }
-};
-__name(BaseSelectMenuBuilder, "BaseSelectMenuBuilder");
-
-// src/components/selectMenu/ChannelSelectMenu.ts
-var ChannelSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new ChannelSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new ChannelSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .addChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement)
- * .setMinValues(2);
- * ```
- */
- constructor(data) {
- super({ ...data, type: import_v103.ComponentType.ChannelSelect });
- }
- /**
- * Adds channel types to this select menu.
- *
- * @param types - The channel types to use
- */
- addChannelTypes(...types) {
- const normalizedTypes = normalizeArray(types);
- this.data.channel_types ??= [];
- this.data.channel_types.push(...channelTypesValidator.parse(normalizedTypes));
- return this;
- }
- /**
- * Sets channel types for this select menu.
- *
- * @param types - The channel types to use
- */
- setChannelTypes(...types) {
- const normalizedTypes = normalizeArray(types);
- this.data.channel_types ??= [];
- this.data.channel_types.splice(0, this.data.channel_types.length, ...channelTypesValidator.parse(normalizedTypes));
- return this;
- }
- /**
- * {@inheritDoc BaseSelectMenuBuilder.toJSON}
- */
- toJSON() {
- customIdValidator.parse(this.data.custom_id);
- return {
- ...this.data
- };
- }
-};
-__name(ChannelSelectMenuBuilder, "ChannelSelectMenuBuilder");
-
-// src/components/selectMenu/MentionableSelectMenu.ts
-var import_v104 = require("discord-api-types/v10");
-var MentionableSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new MentionableSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new MentionableSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1);
- * ```
- */
- constructor(data) {
- super({ ...data, type: import_v104.ComponentType.MentionableSelect });
- }
-};
-__name(MentionableSelectMenuBuilder, "MentionableSelectMenuBuilder");
-
-// src/components/selectMenu/RoleSelectMenu.ts
-var import_v105 = require("discord-api-types/v10");
-var RoleSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new RoleSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new RoleSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1);
- * ```
- */
- constructor(data) {
- super({ ...data, type: import_v105.ComponentType.RoleSelect });
- }
-};
-__name(RoleSelectMenuBuilder, "RoleSelectMenuBuilder");
-
-// src/components/selectMenu/StringSelectMenu.ts
-var import_v106 = require("discord-api-types/v10");
-var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * The options within this select menu.
- */
- options;
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new StringSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * options: [
- * { label: 'option 1', value: '1' },
- * { label: 'option 2', value: '2' },
- * { label: 'option 3', value: '3' },
- * ],
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new StringSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * .addOptions({
- * label: 'Catchy',
- * value: 'catch',
- * });
- * ```
- */
- constructor(data) {
- const { options, ...initData } = data ?? {};
- super({ ...initData, type: import_v106.ComponentType.StringSelect });
- this.options = options?.map((option) => new StringSelectMenuOptionBuilder(option)) ?? [];
- }
- /**
- * Adds options to this select menu.
- *
- * @param options - The options to add
- */
- addOptions(...options) {
- const normalizedOptions = normalizeArray(options);
- optionsLengthValidator.parse(this.options.length + normalizedOptions.length);
- this.options.push(
- ...normalizedOptions.map(
- (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption))
- )
- );
- return this;
- }
- /**
- * Sets the options for this select menu.
- *
- * @param options - The options to set
- */
- setOptions(...options) {
- return this.spliceOptions(0, this.options.length, ...options);
- }
- /**
- * Removes, replaces, or inserts options for this select menu.
- *
- * @remarks
- * This method behaves similarly
- * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice()}.
- * It's useful for modifying and adjusting the order of existing options.
- * @example
- * Remove the first option:
- * ```ts
- * selectMenu.spliceOptions(0, 1);
- * ```
- * @example
- * Remove the first n option:
- * ```ts
- * const n = 4;
- * selectMenu.spliceOptions(0, n);
- * ```
- * @example
- * Remove the last option:
- * ```ts
- * selectMenu.spliceOptions(-1, 1);
- * ```
- * @param index - The index to start at
- * @param deleteCount - The number of options to remove
- * @param options - The replacing option objects or builders
- */
- spliceOptions(index, deleteCount, ...options) {
- const normalizedOptions = normalizeArray(options);
- const clone = [...this.options];
- clone.splice(
- index,
- deleteCount,
- ...normalizedOptions.map(
- (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption))
- )
- );
- optionsLengthValidator.parse(clone.length);
- this.options.splice(0, this.options.length, ...clone);
- return this;
- }
- /**
- * {@inheritDoc BaseSelectMenuBuilder.toJSON}
- */
- toJSON() {
- validateRequiredSelectMenuParameters(this.options, this.data.custom_id);
- return {
- ...this.data,
- options: this.options.map((option) => option.toJSON())
- };
- }
-};
-__name(StringSelectMenuBuilder, "StringSelectMenuBuilder");
-
-// src/components/selectMenu/UserSelectMenu.ts
-var import_v107 = require("discord-api-types/v10");
-var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new UserSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new UserSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1);
- * ```
- */
- constructor(data) {
- super({ ...data, type: import_v107.ComponentType.UserSelect });
- }
-};
-__name(UserSelectMenuBuilder, "UserSelectMenuBuilder");
-
-// src/components/textInput/TextInput.ts
-var import_util = require("@discordjs/util");
-var import_v109 = require("discord-api-types/v10");
-var import_fast_deep_equal = __toESM(require("fast-deep-equal"));
-
-// src/components/textInput/Assertions.ts
-var Assertions_exports3 = {};
-__export(Assertions_exports3, {
- labelValidator: () => labelValidator,
- maxLengthValidator: () => maxLengthValidator,
- minLengthValidator: () => minLengthValidator,
- placeholderValidator: () => placeholderValidator2,
- requiredValidator: () => requiredValidator,
- textInputStyleValidator: () => textInputStyleValidator,
- validateRequiredParameters: () => validateRequiredParameters,
- valueValidator: () => valueValidator
-});
-var import_shapeshift3 = require("@sapphire/shapeshift");
-var import_v108 = require("discord-api-types/v10");
-var textInputStyleValidator = import_shapeshift3.s.nativeEnum(import_v108.TextInputStyle);
-var minLengthValidator = import_shapeshift3.s.number.int.greaterThanOrEqual(0).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled);
-var maxLengthValidator = import_shapeshift3.s.number.int.greaterThanOrEqual(1).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled);
-var requiredValidator = import_shapeshift3.s.boolean;
-var valueValidator = import_shapeshift3.s.string.lengthLessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled);
-var placeholderValidator2 = import_shapeshift3.s.string.lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var labelValidator = import_shapeshift3.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled);
-function validateRequiredParameters(customId, style, label) {
- customIdValidator.parse(customId);
- textInputStyleValidator.parse(style);
- labelValidator.parse(label);
-}
-__name(validateRequiredParameters, "validateRequiredParameters");
-
-// src/components/textInput/TextInput.ts
-var TextInputBuilder = class extends ComponentBuilder {
- /**
- * Creates a new text input from API data.
- *
- * @param data - The API data to create this text input with
- * @example
- * Creating a select menu option from an API data object:
- * ```ts
- * const textInput = new TextInputBuilder({
- * custom_id: 'a cool select menu',
- * label: 'Type something',
- * style: TextInputStyle.Short,
- * });
- * ```
- * @example
- * Creating a select menu option using setters and API data:
- * ```ts
- * const textInput = new TextInputBuilder({
- * label: 'Type something else',
- * })
- * .setCustomId('woah')
- * .setStyle(TextInputStyle.Paragraph);
- * ```
- */
- constructor(data) {
- super({ type: import_v109.ComponentType.TextInput, ...data });
- }
- /**
- * Sets the custom id for this text input.
- *
- * @param customId - The custom id to use
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Sets the label for this text input.
- *
- * @param label - The label to use
- */
- setLabel(label) {
- this.data.label = labelValidator.parse(label);
- return this;
- }
- /**
- * Sets the style for this text input.
- *
- * @param style - The style to use
- */
- setStyle(style) {
- this.data.style = textInputStyleValidator.parse(style);
- return this;
- }
- /**
- * Sets the minimum length of text for this text input.
- *
- * @param minLength - The minimum length of text for this text input
- */
- setMinLength(minLength) {
- this.data.min_length = minLengthValidator.parse(minLength);
- return this;
- }
- /**
- * Sets the maximum length of text for this text input.
- *
- * @param maxLength - The maximum length of text for this text input
- */
- setMaxLength(maxLength) {
- this.data.max_length = maxLengthValidator.parse(maxLength);
- return this;
- }
- /**
- * Sets the placeholder for this text input.
- *
- * @param placeholder - The placeholder to use
- */
- setPlaceholder(placeholder) {
- this.data.placeholder = placeholderValidator2.parse(placeholder);
- return this;
- }
- /**
- * Sets the value for this text input.
- *
- * @param value - The value to use
- */
- setValue(value) {
- this.data.value = valueValidator.parse(value);
- return this;
- }
- /**
- * Sets whether this text input is required.
- *
- * @param required - Whether this text input is required
- */
- setRequired(required = true) {
- this.data.required = requiredValidator.parse(required);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredParameters(this.data.custom_id, this.data.style, this.data.label);
- return {
- ...this.data
- };
- }
- /**
- * {@inheritDoc Equatable.equals}
- */
- equals(other) {
- if ((0, import_util.isJSONEncodable)(other)) {
- return (0, import_fast_deep_equal.default)(other.toJSON(), this.data);
- }
- return (0, import_fast_deep_equal.default)(other, this.data);
- }
-};
-__name(TextInputBuilder, "TextInputBuilder");
-
-// src/components/Components.ts
-function createComponentBuilder(data) {
- if (data instanceof ComponentBuilder) {
- return data;
- }
- switch (data.type) {
- case import_v1010.ComponentType.ActionRow:
- return new ActionRowBuilder(data);
- case import_v1010.ComponentType.Button:
- return new ButtonBuilder(data);
- case import_v1010.ComponentType.StringSelect:
- return new StringSelectMenuBuilder(data);
- case import_v1010.ComponentType.TextInput:
- return new TextInputBuilder(data);
- case import_v1010.ComponentType.UserSelect:
- return new UserSelectMenuBuilder(data);
- case import_v1010.ComponentType.RoleSelect:
- return new RoleSelectMenuBuilder(data);
- case import_v1010.ComponentType.MentionableSelect:
- return new MentionableSelectMenuBuilder(data);
- case import_v1010.ComponentType.ChannelSelect:
- return new ChannelSelectMenuBuilder(data);
- default:
- throw new Error(`Cannot properly serialize component type: ${data.type}`);
- }
-}
-__name(createComponentBuilder, "createComponentBuilder");
-
-// src/components/ActionRow.ts
-var ActionRowBuilder = class extends ComponentBuilder {
- /**
- * The components within this action row.
- */
- components;
- /**
- * Creates a new action row from API data.
- *
- * @param data - The API data to create this action row with
- * @example
- * Creating an action row from an API data object:
- * ```ts
- * const actionRow = new ActionRowBuilder({
- * components: [
- * {
- * custom_id: "custom id",
- * label: "Type something",
- * style: TextInputStyle.Short,
- * type: ComponentType.TextInput,
- * },
- * ],
- * });
- * ```
- * @example
- * Creating an action row using setters and API data:
- * ```ts
- * const actionRow = new ActionRowBuilder({
- * components: [
- * {
- * custom_id: "custom id",
- * label: "Click me",
- * style: ButtonStyle.Primary,
- * type: ComponentType.Button,
- * },
- * ],
- * })
- * .addComponents(button2, button3);
- * ```
- */
- constructor({ components, ...data } = {}) {
- super({ type: import_v1011.ComponentType.ActionRow, ...data });
- this.components = components?.map((component) => createComponentBuilder(component)) ?? [];
- }
- /**
- * Adds components to this action row.
- *
- * @param components - The components to add
- */
- addComponents(...components) {
- this.components.push(...normalizeArray(components));
- return this;
- }
- /**
- * Sets components for this action row.
- *
- * @param components - The components to set
- */
- setComponents(...components) {
- this.components.splice(0, this.components.length, ...normalizeArray(components));
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- return {
- ...this.data,
- components: this.components.map((component) => component.toJSON())
- };
- }
-};
-__name(ActionRowBuilder, "ActionRowBuilder");
-
-// src/interactions/modals/Assertions.ts
-var Assertions_exports4 = {};
-__export(Assertions_exports4, {
- componentsValidator: () => componentsValidator,
- titleValidator: () => titleValidator,
- validateRequiredParameters: () => validateRequiredParameters2
-});
-var import_shapeshift4 = require("@sapphire/shapeshift");
-var titleValidator = import_shapeshift4.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled);
-var componentsValidator = import_shapeshift4.s.instance(ActionRowBuilder).array.lengthGreaterThanOrEqual(1).setValidationEnabled(isValidationEnabled);
-function validateRequiredParameters2(customId, title, components) {
- customIdValidator.parse(customId);
- titleValidator.parse(title);
- componentsValidator.parse(components);
-}
-__name(validateRequiredParameters2, "validateRequiredParameters");
-
-// src/interactions/modals/Modal.ts
-var ModalBuilder = class {
- /**
- * The API data associated with this modal.
- */
- data;
- /**
- * The components within this modal.
- */
- components = [];
- /**
- * Creates a new modal from API data.
- *
- * @param data - The API data to create this modal with
- */
- constructor({ components, ...data } = {}) {
- this.data = { ...data };
- this.components = components?.map((component) => createComponentBuilder(component)) ?? [];
- }
- /**
- * Sets the title of this modal.
- *
- * @param title - The title to use
- */
- setTitle(title) {
- this.data.title = titleValidator.parse(title);
- return this;
- }
- /**
- * Sets the custom id of this modal.
- *
- * @param customId - The custom id to use
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Adds components to this modal.
- *
- * @param components - The components to add
- */
- addComponents(...components) {
- this.components.push(
- ...normalizeArray(components).map(
- (component) => component instanceof ActionRowBuilder ? component : new ActionRowBuilder(component)
- )
- );
- return this;
- }
- /**
- * Sets components for this modal.
- *
- * @param components - The components to set
- */
- setComponents(...components) {
- this.components.splice(0, this.components.length, ...normalizeArray(components));
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredParameters2(this.data.custom_id, this.data.title, this.components);
- return {
- ...this.data,
- components: this.components.map((component) => component.toJSON())
- };
- }
-};
-__name(ModalBuilder, "ModalBuilder");
-
-// src/interactions/slashCommands/Assertions.ts
-var Assertions_exports5 = {};
-__export(Assertions_exports5, {
- assertReturnOfBuilder: () => assertReturnOfBuilder,
- localizationMapPredicate: () => localizationMapPredicate,
- validateChoicesLength: () => validateChoicesLength,
- validateDMPermission: () => validateDMPermission,
- validateDefaultMemberPermissions: () => validateDefaultMemberPermissions,
- validateDefaultPermission: () => validateDefaultPermission,
- validateDescription: () => validateDescription,
- validateLocale: () => validateLocale,
- validateLocalizationMap: () => validateLocalizationMap,
- validateMaxOptionsLength: () => validateMaxOptionsLength,
- validateNSFW: () => validateNSFW,
- validateName: () => validateName,
- validateRequired: () => validateRequired,
- validateRequiredParameters: () => validateRequiredParameters3
-});
-var import_shapeshift5 = require("@sapphire/shapeshift");
-var import_v1012 = require("discord-api-types/v10");
-var namePredicate = import_shapeshift5.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/^[\p{Ll}\p{Lm}\p{Lo}\p{N}\p{sc=Devanagari}\p{sc=Thai}_-]+$/u).setValidationEnabled(isValidationEnabled);
-function validateName(name) {
- namePredicate.parse(name);
-}
-__name(validateName, "validateName");
-var descriptionPredicate2 = import_shapeshift5.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var localePredicate = import_shapeshift5.s.nativeEnum(import_v1012.Locale);
-function validateDescription(description) {
- descriptionPredicate2.parse(description);
-}
-__name(validateDescription, "validateDescription");
-var maxArrayLengthPredicate = import_shapeshift5.s.unknown.array.lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateLocale(locale) {
- return localePredicate.parse(locale);
-}
-__name(validateLocale, "validateLocale");
-function validateMaxOptionsLength(options) {
- maxArrayLengthPredicate.parse(options);
-}
-__name(validateMaxOptionsLength, "validateMaxOptionsLength");
-function validateRequiredParameters3(name, description, options) {
- validateName(name);
- validateDescription(description);
- validateMaxOptionsLength(options);
-}
-__name(validateRequiredParameters3, "validateRequiredParameters");
-var booleanPredicate = import_shapeshift5.s.boolean;
-function validateDefaultPermission(value) {
- booleanPredicate.parse(value);
-}
-__name(validateDefaultPermission, "validateDefaultPermission");
-function validateRequired(required) {
- booleanPredicate.parse(required);
-}
-__name(validateRequired, "validateRequired");
-var choicesLengthPredicate = import_shapeshift5.s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateChoicesLength(amountAdding, choices) {
- choicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding);
-}
-__name(validateChoicesLength, "validateChoicesLength");
-function assertReturnOfBuilder(input, ExpectedInstanceOf) {
- import_shapeshift5.s.instance(ExpectedInstanceOf).parse(input);
-}
-__name(assertReturnOfBuilder, "assertReturnOfBuilder");
-var localizationMapPredicate = import_shapeshift5.s.object(Object.fromEntries(Object.values(import_v1012.Locale).map((locale) => [locale, import_shapeshift5.s.string.nullish]))).strict.nullish.setValidationEnabled(isValidationEnabled);
-function validateLocalizationMap(value) {
- localizationMapPredicate.parse(value);
-}
-__name(validateLocalizationMap, "validateLocalizationMap");
-var dmPermissionPredicate = import_shapeshift5.s.boolean.nullish;
-function validateDMPermission(value) {
- dmPermissionPredicate.parse(value);
-}
-__name(validateDMPermission, "validateDMPermission");
-var memberPermissionPredicate = import_shapeshift5.s.union(
- import_shapeshift5.s.bigint.transform((value) => value.toString()),
- import_shapeshift5.s.number.safeInt.transform((value) => value.toString()),
- import_shapeshift5.s.string.regex(/^\d+$/)
-).nullish;
-function validateDefaultMemberPermissions(permissions) {
- return memberPermissionPredicate.parse(permissions);
-}
-__name(validateDefaultMemberPermissions, "validateDefaultMemberPermissions");
-function validateNSFW(value) {
- booleanPredicate.parse(value);
-}
-__name(validateNSFW, "validateNSFW");
-
-// src/interactions/slashCommands/SlashCommandBuilder.ts
-var import_ts_mixer6 = require("ts-mixer");
-
-// src/interactions/slashCommands/SlashCommandSubcommands.ts
-var import_v1024 = require("discord-api-types/v10");
-var import_ts_mixer5 = require("ts-mixer");
-
-// src/interactions/slashCommands/mixins/NameAndDescription.ts
-var SharedNameAndDescription = class {
- /**
- * The name of this command.
- */
- name;
- /**
- * The name localizations of this command.
- */
- name_localizations;
- /**
- * The description of this command.
- */
- description;
- /**
- * The description localizations of this command.
- */
- description_localizations;
- /**
- * Sets the name of this command.
- *
- * @param name - The name to use
- */
- setName(name) {
- validateName(name);
- Reflect.set(this, "name", name);
- return this;
- }
- /**
- * Sets the description of this command.
- *
- * @param description - The description to use
- */
- setDescription(description) {
- validateDescription(description);
- Reflect.set(this, "description", description);
- return this;
- }
- /**
- * SSets a name localization for this command.
- *
- * @param locale - The locale to set
- * @param localizedName - The localized name for the given `locale`
- */
- setNameLocalization(locale, localizedName) {
- if (!this.name_localizations) {
- Reflect.set(this, "name_localizations", {});
- }
- const parsedLocale = validateLocale(locale);
- if (localizedName === null) {
- this.name_localizations[parsedLocale] = null;
- return this;
- }
- validateName(localizedName);
- this.name_localizations[parsedLocale] = localizedName;
- return this;
- }
- /**
- * Sets the name localizations for this command.
- *
- * @param localizedNames - The object of localized names to set
- */
- setNameLocalizations(localizedNames) {
- if (localizedNames === null) {
- Reflect.set(this, "name_localizations", null);
- return this;
- }
- Reflect.set(this, "name_localizations", {});
- for (const args of Object.entries(localizedNames)) {
- this.setNameLocalization(...args);
- }
- return this;
- }
- /**
- * Sets a description localization for this command.
- *
- * @param locale - The locale to set
- * @param localizedDescription - The localized description for the given locale
- */
- setDescriptionLocalization(locale, localizedDescription) {
- if (!this.description_localizations) {
- Reflect.set(this, "description_localizations", {});
- }
- const parsedLocale = validateLocale(locale);
- if (localizedDescription === null) {
- this.description_localizations[parsedLocale] = null;
- return this;
- }
- validateDescription(localizedDescription);
- this.description_localizations[parsedLocale] = localizedDescription;
- return this;
- }
- /**
- * Sets the description localizations for this command.
- *
- * @param localizedDescriptions - The object of localized descriptions to set
- */
- setDescriptionLocalizations(localizedDescriptions) {
- if (localizedDescriptions === null) {
- Reflect.set(this, "description_localizations", null);
- return this;
- }
- Reflect.set(this, "description_localizations", {});
- for (const args of Object.entries(localizedDescriptions)) {
- this.setDescriptionLocalization(...args);
- }
- return this;
- }
-};
-__name(SharedNameAndDescription, "SharedNameAndDescription");
-
-// src/interactions/slashCommands/options/attachment.ts
-var import_v1013 = require("discord-api-types/v10");
-
-// src/interactions/slashCommands/mixins/ApplicationCommandOptionBase.ts
-var ApplicationCommandOptionBase = class extends SharedNameAndDescription {
- /**
- * Whether this option is required.
- *
- * @defaultValue `false`
- */
- required = false;
- /**
- * Sets whether this option is required.
- *
- * @param required - Whether this option should be required
- */
- setRequired(required) {
- validateRequired(required);
- Reflect.set(this, "required", required);
- return this;
- }
- /**
- * This method runs required validators on this builder.
- */
- runRequiredValidations() {
- validateRequiredParameters3(this.name, this.description, []);
- validateLocalizationMap(this.name_localizations);
- validateLocalizationMap(this.description_localizations);
- validateRequired(this.required);
- }
-};
-__name(ApplicationCommandOptionBase, "ApplicationCommandOptionBase");
-
-// src/interactions/slashCommands/options/attachment.ts
-var SlashCommandAttachmentOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = import_v1013.ApplicationCommandOptionType.Attachment;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- return { ...this };
- }
-};
-__name(SlashCommandAttachmentOption, "SlashCommandAttachmentOption");
-
-// src/interactions/slashCommands/options/boolean.ts
-var import_v1014 = require("discord-api-types/v10");
-var SlashCommandBooleanOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = import_v1014.ApplicationCommandOptionType.Boolean;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- return { ...this };
- }
-};
-__name(SlashCommandBooleanOption, "SlashCommandBooleanOption");
-
-// src/interactions/slashCommands/options/channel.ts
-var import_v1016 = require("discord-api-types/v10");
-var import_ts_mixer = require("ts-mixer");
-
-// src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts
-var import_shapeshift6 = require("@sapphire/shapeshift");
-var import_v1015 = require("discord-api-types/v10");
-var allowedChannelTypes = [
- import_v1015.ChannelType.GuildText,
- import_v1015.ChannelType.GuildVoice,
- import_v1015.ChannelType.GuildCategory,
- import_v1015.ChannelType.GuildAnnouncement,
- import_v1015.ChannelType.AnnouncementThread,
- import_v1015.ChannelType.PublicThread,
- import_v1015.ChannelType.PrivateThread,
- import_v1015.ChannelType.GuildStageVoice,
- import_v1015.ChannelType.GuildForum
-];
-var channelTypesPredicate = import_shapeshift6.s.array(import_shapeshift6.s.union(...allowedChannelTypes.map((type) => import_shapeshift6.s.literal(type))));
-var ApplicationCommandOptionChannelTypesMixin = class {
- /**
- * The channel types of this option.
- */
- channel_types;
- /**
- * Adds channel types to this option.
- *
- * @param channelTypes - The channel types
- */
- addChannelTypes(...channelTypes) {
- if (this.channel_types === void 0) {
- Reflect.set(this, "channel_types", []);
- }
- this.channel_types.push(...channelTypesPredicate.parse(channelTypes));
- return this;
- }
-};
-__name(ApplicationCommandOptionChannelTypesMixin, "ApplicationCommandOptionChannelTypesMixin");
-
-// src/interactions/slashCommands/options/channel.ts
-var SlashCommandChannelOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = import_v1016.ApplicationCommandOptionType.Channel;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- return { ...this };
- }
-};
-__name(SlashCommandChannelOption, "SlashCommandChannelOption");
-SlashCommandChannelOption = __decorateClass([
- (0, import_ts_mixer.mix)(ApplicationCommandOptionChannelTypesMixin)
-], SlashCommandChannelOption);
-
-// src/interactions/slashCommands/options/integer.ts
-var import_shapeshift8 = require("@sapphire/shapeshift");
-var import_v1018 = require("discord-api-types/v10");
-var import_ts_mixer2 = require("ts-mixer");
-
-// src/interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts
-var ApplicationCommandNumericOptionMinMaxValueMixin = class {
- /**
- * The maximum value of this option.
- */
- max_value;
- /**
- * The minimum value of this option.
- */
- min_value;
-};
-__name(ApplicationCommandNumericOptionMinMaxValueMixin, "ApplicationCommandNumericOptionMinMaxValueMixin");
-
-// src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.ts
-var import_shapeshift7 = require("@sapphire/shapeshift");
-var import_v1017 = require("discord-api-types/v10");
-var stringPredicate = import_shapeshift7.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100);
-var numberPredicate = import_shapeshift7.s.number.greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY);
-var choicesPredicate = import_shapeshift7.s.object({
- name: stringPredicate,
- name_localizations: localizationMapPredicate,
- value: import_shapeshift7.s.union(stringPredicate, numberPredicate)
-}).array;
-var booleanPredicate2 = import_shapeshift7.s.boolean;
-var ApplicationCommandOptionWithChoicesAndAutocompleteMixin = class {
- /**
- * The choices of this option.
- */
- choices;
- /**
- * Whether this option utilizes autocomplete.
- */
- autocomplete;
- /**
- * The type of this option.
- *
- * @privateRemarks Since this is present and this is a mixin, this is needed.
- */
- type;
- /**
- * Adds multiple choices to this option.
- *
- * @param choices - The choices to add
- */
- addChoices(...choices) {
- if (choices.length > 0 && this.autocomplete) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- choicesPredicate.parse(choices);
- if (this.choices === void 0) {
- Reflect.set(this, "choices", []);
- }
- validateChoicesLength(choices.length, this.choices);
- for (const { name, name_localizations, value } of choices) {
- if (this.type === import_v1017.ApplicationCommandOptionType.String) {
- stringPredicate.parse(value);
- } else {
- numberPredicate.parse(value);
- }
- this.choices.push({ name, name_localizations, value });
- }
- return this;
- }
- /**
- * Sets multiple choices for this option.
- *
- * @param choices - The choices to set
- */
- setChoices(...choices) {
- if (choices.length > 0 && this.autocomplete) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- choicesPredicate.parse(choices);
- Reflect.set(this, "choices", []);
- this.addChoices(...choices);
- return this;
- }
- /**
- * Whether this option uses autocomplete.
- *
- * @param autocomplete - Whether this option should use autocomplete
- */
- setAutocomplete(autocomplete) {
- booleanPredicate2.parse(autocomplete);
- if (autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- Reflect.set(this, "autocomplete", autocomplete);
- return this;
- }
-};
-__name(ApplicationCommandOptionWithChoicesAndAutocompleteMixin, "ApplicationCommandOptionWithChoicesAndAutocompleteMixin");
-
-// src/interactions/slashCommands/options/integer.ts
-var numberValidator = import_shapeshift8.s.number.int;
-var SlashCommandIntegerOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = import_v1018.ApplicationCommandOptionType.Integer;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}
- */
- setMaxValue(max) {
- numberValidator.parse(max);
- Reflect.set(this, "max_value", max);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}
- */
- setMinValue(min) {
- numberValidator.parse(min);
- Reflect.set(this, "min_value", min);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- return { ...this };
- }
-};
-__name(SlashCommandIntegerOption, "SlashCommandIntegerOption");
-SlashCommandIntegerOption = __decorateClass([
- (0, import_ts_mixer2.mix)(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)
-], SlashCommandIntegerOption);
-
-// src/interactions/slashCommands/options/mentionable.ts
-var import_v1019 = require("discord-api-types/v10");
-var SlashCommandMentionableOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = import_v1019.ApplicationCommandOptionType.Mentionable;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- return { ...this };
- }
-};
-__name(SlashCommandMentionableOption, "SlashCommandMentionableOption");
-
-// src/interactions/slashCommands/options/number.ts
-var import_shapeshift9 = require("@sapphire/shapeshift");
-var import_v1020 = require("discord-api-types/v10");
-var import_ts_mixer3 = require("ts-mixer");
-var numberValidator2 = import_shapeshift9.s.number;
-var SlashCommandNumberOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = import_v1020.ApplicationCommandOptionType.Number;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}
- */
- setMaxValue(max) {
- numberValidator2.parse(max);
- Reflect.set(this, "max_value", max);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}
- */
- setMinValue(min) {
- numberValidator2.parse(min);
- Reflect.set(this, "min_value", min);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- return { ...this };
- }
-};
-__name(SlashCommandNumberOption, "SlashCommandNumberOption");
-SlashCommandNumberOption = __decorateClass([
- (0, import_ts_mixer3.mix)(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)
-], SlashCommandNumberOption);
-
-// src/interactions/slashCommands/options/role.ts
-var import_v1021 = require("discord-api-types/v10");
-var SlashCommandRoleOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = import_v1021.ApplicationCommandOptionType.Role;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- return { ...this };
- }
-};
-__name(SlashCommandRoleOption, "SlashCommandRoleOption");
-
-// src/interactions/slashCommands/options/string.ts
-var import_shapeshift10 = require("@sapphire/shapeshift");
-var import_v1022 = require("discord-api-types/v10");
-var import_ts_mixer4 = require("ts-mixer");
-var minLengthValidator2 = import_shapeshift10.s.number.greaterThanOrEqual(0).lessThanOrEqual(6e3);
-var maxLengthValidator2 = import_shapeshift10.s.number.greaterThanOrEqual(1).lessThanOrEqual(6e3);
-var SlashCommandStringOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = import_v1022.ApplicationCommandOptionType.String;
- /**
- * The maximum length of this option.
- */
- max_length;
- /**
- * The minimum length of this option.
- */
- min_length;
- /**
- * Sets the maximum length of this string option.
- *
- * @param max - The maximum length this option can be
- */
- setMaxLength(max) {
- maxLengthValidator2.parse(max);
- Reflect.set(this, "max_length", max);
- return this;
- }
- /**
- * Sets the minimum length of this string option.
- *
- * @param min - The minimum length this option can be
- */
- setMinLength(min) {
- minLengthValidator2.parse(min);
- Reflect.set(this, "min_length", min);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- return { ...this };
- }
-};
-__name(SlashCommandStringOption, "SlashCommandStringOption");
-SlashCommandStringOption = __decorateClass([
- (0, import_ts_mixer4.mix)(ApplicationCommandOptionWithChoicesAndAutocompleteMixin)
-], SlashCommandStringOption);
-
-// src/interactions/slashCommands/options/user.ts
-var import_v1023 = require("discord-api-types/v10");
-var SlashCommandUserOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = import_v1023.ApplicationCommandOptionType.User;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- return { ...this };
- }
-};
-__name(SlashCommandUserOption, "SlashCommandUserOption");
-
-// src/interactions/slashCommands/mixins/SharedSlashCommandOptions.ts
-var SharedSlashCommandOptions = class {
- options;
- /**
- * Adds a boolean option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addBooleanOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandBooleanOption);
- }
- /**
- * Adds a user option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addUserOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandUserOption);
- }
- /**
- * Adds a channel option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addChannelOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandChannelOption);
- }
- /**
- * Adds a role option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addRoleOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandRoleOption);
- }
- /**
- * Adds an attachment option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addAttachmentOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandAttachmentOption);
- }
- /**
- * Adds a mentionable option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addMentionableOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandMentionableOption);
- }
- /**
- * Adds a string option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addStringOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandStringOption);
- }
- /**
- * Adds an integer option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addIntegerOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandIntegerOption);
- }
- /**
- * Adds a number option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addNumberOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandNumberOption);
- }
- /**
- * Where the actual adding magic happens. ✨
- *
- * @param input - The input. What else?
- * @param Instance - The instance of whatever is being added
- * @internal
- */
- _sharedAddOptionMethod(input, Instance) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new Instance()) : input;
- assertReturnOfBuilder(result, Instance);
- options.push(result);
- return this;
- }
-};
-__name(SharedSlashCommandOptions, "SharedSlashCommandOptions");
-
-// src/interactions/slashCommands/SlashCommandSubcommands.ts
-var SlashCommandSubcommandGroupBuilder = class {
- /**
- * The name of this subcommand group.
- */
- name = void 0;
- /**
- * The description of this subcommand group.
- */
- description = void 0;
- /**
- * The subcommands within this subcommand group.
- */
- options = [];
- /**
- * Adds a new subcommand to this group.
- *
- * @param input - A function that returns a subcommand builder or an already built builder
- */
- addSubcommand(input) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new SlashCommandSubcommandBuilder()) : input;
- assertReturnOfBuilder(result, SlashCommandSubcommandBuilder);
- options.push(result);
- return this;
- }
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- validateRequiredParameters3(this.name, this.description, this.options);
- return {
- type: import_v1024.ApplicationCommandOptionType.SubcommandGroup,
- name: this.name,
- name_localizations: this.name_localizations,
- description: this.description,
- description_localizations: this.description_localizations,
- options: this.options.map((option) => option.toJSON())
- };
- }
-};
-__name(SlashCommandSubcommandGroupBuilder, "SlashCommandSubcommandGroupBuilder");
-SlashCommandSubcommandGroupBuilder = __decorateClass([
- (0, import_ts_mixer5.mix)(SharedNameAndDescription)
-], SlashCommandSubcommandGroupBuilder);
-var SlashCommandSubcommandBuilder = class {
- /**
- * The name of this subcommand.
- */
- name = void 0;
- /**
- * The description of this subcommand.
- */
- description = void 0;
- /**
- * The options within this subcommand.
- */
- options = [];
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- validateRequiredParameters3(this.name, this.description, this.options);
- return {
- type: import_v1024.ApplicationCommandOptionType.Subcommand,
- name: this.name,
- name_localizations: this.name_localizations,
- description: this.description,
- description_localizations: this.description_localizations,
- options: this.options.map((option) => option.toJSON())
- };
- }
-};
-__name(SlashCommandSubcommandBuilder, "SlashCommandSubcommandBuilder");
-SlashCommandSubcommandBuilder = __decorateClass([
- (0, import_ts_mixer5.mix)(SharedNameAndDescription, SharedSlashCommandOptions)
-], SlashCommandSubcommandBuilder);
-
-// src/interactions/slashCommands/SlashCommandBuilder.ts
-var SlashCommandBuilder = class {
- /**
- * The name of this command.
- */
- name = void 0;
- /**
- * The name localizations of this command.
- */
- name_localizations;
- /**
- * The description of this command.
- */
- description = void 0;
- /**
- * The description localizations of this command.
- */
- description_localizations;
- /**
- * The options of this command.
- */
- options = [];
- /**
- * Whether this command is enabled by default when the application is added to a guild.
- *
- * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- default_permission = void 0;
- /**
- * The set of permissions represented as a bit set for the command.
- */
- default_member_permissions = void 0;
- /**
- * Indicates whether the command is available in direct messages with the application.
- *
- * @remarks
- * By default, commands are visible. This property is only for global commands.
- */
- dm_permission = void 0;
- /**
- * Whether this command is NSFW.
- */
- nsfw = void 0;
- /**
- * Sets whether the command is enabled by default when the application is added to a guild.
- *
- * @remarks
- * If set to `false`, you will have to later `PUT` the permissions for this command.
- * @param value - Whether or not to enable this command by default
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- * @deprecated Use {@link SlashCommandBuilder.setDefaultMemberPermissions} or {@link SlashCommandBuilder.setDMPermission} instead.
- */
- setDefaultPermission(value) {
- validateDefaultPermission(value);
- Reflect.set(this, "default_permission", value);
- return this;
- }
- /**
- * Sets the default permissions a member should have in order to run the command.
- *
- * @remarks
- * You can set this to `'0'` to disable the command by default.
- * @param permissions - The permissions bit field to set
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- */
- setDefaultMemberPermissions(permissions) {
- const permissionValue = validateDefaultMemberPermissions(permissions);
- Reflect.set(this, "default_member_permissions", permissionValue);
- return this;
- }
- /**
- * Sets if the command is available in direct messages with the application.
- *
- * @remarks
- * By default, commands are visible. This method is only for global commands.
- * @param enabled - Whether the command should be enabled in direct messages
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- */
- setDMPermission(enabled) {
- validateDMPermission(enabled);
- Reflect.set(this, "dm_permission", enabled);
- return this;
- }
- /**
- * Sets whether this command is NSFW.
- *
- * @param nsfw - Whether this command is NSFW
- */
- setNSFW(nsfw = true) {
- validateNSFW(nsfw);
- Reflect.set(this, "nsfw", nsfw);
- return this;
- }
- /**
- * Adds a new subcommand group to this command.
- *
- * @param input - A function that returns a subcommand group builder or an already built builder
- */
- addSubcommandGroup(input) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new SlashCommandSubcommandGroupBuilder()) : input;
- assertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);
- options.push(result);
- return this;
- }
- /**
- * Adds a new subcommand to this command.
- *
- * @param input - A function that returns a subcommand builder or an already built builder
- */
- addSubcommand(input) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new SlashCommandSubcommandBuilder()) : input;
- assertReturnOfBuilder(result, SlashCommandSubcommandBuilder);
- options.push(result);
- return this;
- }
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- validateRequiredParameters3(this.name, this.description, this.options);
- validateLocalizationMap(this.name_localizations);
- validateLocalizationMap(this.description_localizations);
- return {
- ...this,
- options: this.options.map((option) => option.toJSON())
- };
- }
-};
-__name(SlashCommandBuilder, "SlashCommandBuilder");
-SlashCommandBuilder = __decorateClass([
- (0, import_ts_mixer6.mix)(SharedSlashCommandOptions, SharedNameAndDescription)
-], SlashCommandBuilder);
-
-// src/interactions/contextMenuCommands/Assertions.ts
-var Assertions_exports6 = {};
-__export(Assertions_exports6, {
- validateDMPermission: () => validateDMPermission2,
- validateDefaultMemberPermissions: () => validateDefaultMemberPermissions2,
- validateDefaultPermission: () => validateDefaultPermission2,
- validateName: () => validateName2,
- validateRequiredParameters: () => validateRequiredParameters4,
- validateType: () => validateType
-});
-var import_shapeshift11 = require("@sapphire/shapeshift");
-var import_v1025 = require("discord-api-types/v10");
-var namePredicate2 = import_shapeshift11.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/^( *[\p{P}\p{L}\p{N}\p{sc=Devanagari}\p{sc=Thai}]+ *)+$/u).setValidationEnabled(isValidationEnabled);
-var typePredicate = import_shapeshift11.s.union(import_shapeshift11.s.literal(import_v1025.ApplicationCommandType.User), import_shapeshift11.s.literal(import_v1025.ApplicationCommandType.Message)).setValidationEnabled(isValidationEnabled);
-var booleanPredicate3 = import_shapeshift11.s.boolean;
-function validateDefaultPermission2(value) {
- booleanPredicate3.parse(value);
-}
-__name(validateDefaultPermission2, "validateDefaultPermission");
-function validateName2(name) {
- namePredicate2.parse(name);
-}
-__name(validateName2, "validateName");
-function validateType(type) {
- typePredicate.parse(type);
-}
-__name(validateType, "validateType");
-function validateRequiredParameters4(name, type) {
- validateName2(name);
- validateType(type);
-}
-__name(validateRequiredParameters4, "validateRequiredParameters");
-var dmPermissionPredicate2 = import_shapeshift11.s.boolean.nullish;
-function validateDMPermission2(value) {
- dmPermissionPredicate2.parse(value);
-}
-__name(validateDMPermission2, "validateDMPermission");
-var memberPermissionPredicate2 = import_shapeshift11.s.union(
- import_shapeshift11.s.bigint.transform((value) => value.toString()),
- import_shapeshift11.s.number.safeInt.transform((value) => value.toString()),
- import_shapeshift11.s.string.regex(/^\d+$/)
-).nullish;
-function validateDefaultMemberPermissions2(permissions) {
- return memberPermissionPredicate2.parse(permissions);
-}
-__name(validateDefaultMemberPermissions2, "validateDefaultMemberPermissions");
-
-// src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts
-var ContextMenuCommandBuilder = class {
- /**
- * The name of this command.
- */
- name = void 0;
- /**
- * The name localizations of this command.
- */
- name_localizations;
- /**
- * The type of this command.
- */
- type = void 0;
- /**
- * Whether this command is enabled by default when the application is added to a guild.
- *
- * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- default_permission = void 0;
- /**
- * The set of permissions represented as a bit set for the command.
- */
- default_member_permissions = void 0;
- /**
- * Indicates whether the command is available in direct messages with the application.
- *
- * @remarks
- * By default, commands are visible. This property is only for global commands.
- */
- dm_permission = void 0;
- /**
- * Sets the name of this command.
- *
- * @param name - The name to use
- */
- setName(name) {
- validateName2(name);
- Reflect.set(this, "name", name);
- return this;
- }
- /**
- * Sets the type of this command.
- *
- * @param type - The type to use
- */
- setType(type) {
- validateType(type);
- Reflect.set(this, "type", type);
- return this;
- }
- /**
- * Sets whether the command is enabled by default when the application is added to a guild.
- *
- * @remarks
- * If set to `false`, you will have to later `PUT` the permissions for this command.
- * @param value - Whether to enable this command by default
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- setDefaultPermission(value) {
- validateDefaultPermission2(value);
- Reflect.set(this, "default_permission", value);
- return this;
- }
- /**
- * Sets the default permissions a member should have in order to run this command.
- *
- * @remarks
- * You can set this to `'0'` to disable the command by default.
- * @param permissions - The permissions bit field to set
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- */
- setDefaultMemberPermissions(permissions) {
- const permissionValue = validateDefaultMemberPermissions2(permissions);
- Reflect.set(this, "default_member_permissions", permissionValue);
- return this;
- }
- /**
- * Sets if the command is available in direct messages with the application.
- *
- * @remarks
- * By default, commands are visible. This method is only for global commands.
- * @param enabled - Whether the command should be enabled in direct messages
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- */
- setDMPermission(enabled) {
- validateDMPermission2(enabled);
- Reflect.set(this, "dm_permission", enabled);
- return this;
- }
- /**
- * Sets a name localization for this command.
- *
- * @param locale - The locale to set
- * @param localizedName - The localized name for the given `locale`
- */
- setNameLocalization(locale, localizedName) {
- if (!this.name_localizations) {
- Reflect.set(this, "name_localizations", {});
- }
- const parsedLocale = validateLocale(locale);
- if (localizedName === null) {
- this.name_localizations[parsedLocale] = null;
- return this;
- }
- validateName2(localizedName);
- this.name_localizations[parsedLocale] = localizedName;
- return this;
- }
- /**
- * Sets the name localizations for this command.
- *
- * @param localizedNames - The object of localized names to set
- */
- setNameLocalizations(localizedNames) {
- if (localizedNames === null) {
- Reflect.set(this, "name_localizations", null);
- return this;
- }
- Reflect.set(this, "name_localizations", {});
- for (const args of Object.entries(localizedNames))
- this.setNameLocalization(...args);
- return this;
- }
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- validateRequiredParameters4(this.name, this.type);
- validateLocalizationMap(this.name_localizations);
- return { ...this };
- }
-};
-__name(ContextMenuCommandBuilder, "ContextMenuCommandBuilder");
-
-// src/util/componentUtil.ts
-function embedLength(data) {
- return (data.title?.length ?? 0) + (data.description?.length ?? 0) + (data.fields?.reduce((prev, curr) => prev + curr.name.length + curr.value.length, 0) ?? 0) + (data.footer?.text.length ?? 0) + (data.author?.name.length ?? 0);
-}
-__name(embedLength, "embedLength");
-
-// src/index.ts
-var version = "1.6.3";
-// Annotate the CommonJS export names for ESM import in node:
-0 && (module.exports = {
- ActionRowBuilder,
- ApplicationCommandNumericOptionMinMaxValueMixin,
- ApplicationCommandOptionBase,
- ApplicationCommandOptionChannelTypesMixin,
- ApplicationCommandOptionWithChoicesAndAutocompleteMixin,
- BaseSelectMenuBuilder,
- ButtonBuilder,
- ChannelSelectMenuBuilder,
- ComponentAssertions,
- ComponentBuilder,
- ContextMenuCommandAssertions,
- ContextMenuCommandBuilder,
- EmbedAssertions,
- EmbedBuilder,
- MentionableSelectMenuBuilder,
- ModalAssertions,
- ModalBuilder,
- RoleSelectMenuBuilder,
- SelectMenuBuilder,
- SelectMenuOptionBuilder,
- SharedNameAndDescription,
- SharedSlashCommandOptions,
- SlashCommandAssertions,
- SlashCommandAttachmentOption,
- SlashCommandBooleanOption,
- SlashCommandBuilder,
- SlashCommandChannelOption,
- SlashCommandIntegerOption,
- SlashCommandMentionableOption,
- SlashCommandNumberOption,
- SlashCommandRoleOption,
- SlashCommandStringOption,
- SlashCommandSubcommandBuilder,
- SlashCommandSubcommandGroupBuilder,
- SlashCommandUserOption,
- StringSelectMenuBuilder,
- StringSelectMenuOptionBuilder,
- TextInputAssertions,
- TextInputBuilder,
- UserSelectMenuBuilder,
- createComponentBuilder,
- disableValidators,
- embedLength,
- enableValidators,
- isValidationEnabled,
- normalizeArray,
- version,
- ...require("@discordjs/formatters")
-});
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/index.js.map b/node_modules/@discordjs/builders/dist/index.js.map
deleted file mode 100644
index 11b933a..0000000
--- a/node_modules/@discordjs/builders/dist/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../src/index.ts","../src/messages/embed/Assertions.ts","../src/util/validation.ts","../src/util/normalizeArray.ts","../src/messages/embed/Embed.ts","../src/components/Assertions.ts","../src/components/selectMenu/StringSelectMenuOption.ts","../src/components/ActionRow.ts","../src/components/Component.ts","../src/components/Components.ts","../src/components/button/Button.ts","../src/components/selectMenu/ChannelSelectMenu.ts","../src/components/selectMenu/BaseSelectMenu.ts","../src/components/selectMenu/MentionableSelectMenu.ts","../src/components/selectMenu/RoleSelectMenu.ts","../src/components/selectMenu/StringSelectMenu.ts","../src/components/selectMenu/UserSelectMenu.ts","../src/components/textInput/TextInput.ts","../src/components/textInput/Assertions.ts","../src/interactions/modals/Assertions.ts","../src/interactions/modals/Modal.ts","../src/interactions/slashCommands/Assertions.ts","../src/interactions/slashCommands/SlashCommandBuilder.ts","../src/interactions/slashCommands/SlashCommandSubcommands.ts","../src/interactions/slashCommands/mixins/NameAndDescription.ts","../src/interactions/slashCommands/options/attachment.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionBase.ts","../src/interactions/slashCommands/options/boolean.ts","../src/interactions/slashCommands/options/channel.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts","../src/interactions/slashCommands/options/integer.ts","../src/interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.ts","../src/interactions/slashCommands/options/mentionable.ts","../src/interactions/slashCommands/options/number.ts","../src/interactions/slashCommands/options/role.ts","../src/interactions/slashCommands/options/string.ts","../src/interactions/slashCommands/options/user.ts","../src/interactions/slashCommands/mixins/SharedSlashCommandOptions.ts","../src/interactions/contextMenuCommands/Assertions.ts","../src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts","../src/util/componentUtil.ts"],"sourcesContent":["export * as EmbedAssertions from './messages/embed/Assertions.js';\nexport * from './messages/embed/Embed.js';\n// TODO: Consider removing this dep in the next major version\nexport * from '@discordjs/formatters';\n\nexport * as ComponentAssertions from './components/Assertions.js';\nexport * from './components/ActionRow.js';\nexport * from './components/button/Button.js';\nexport * from './components/Component.js';\nexport * from './components/Components.js';\nexport * from './components/textInput/TextInput.js';\nexport * as TextInputAssertions from './components/textInput/Assertions.js';\nexport * from './interactions/modals/Modal.js';\nexport * as ModalAssertions from './interactions/modals/Assertions.js';\n\nexport * from './components/selectMenu/BaseSelectMenu.js';\nexport * from './components/selectMenu/ChannelSelectMenu.js';\nexport * from './components/selectMenu/MentionableSelectMenu.js';\nexport * from './components/selectMenu/RoleSelectMenu.js';\nexport * from './components/selectMenu/StringSelectMenu.js';\n// TODO: Remove those aliases in v2\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuBuilder} instead.\n\t */\n\tStringSelectMenuBuilder as SelectMenuBuilder,\n} from './components/selectMenu/StringSelectMenu.js';\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuOptionBuilder} instead.\n\t */\n\tStringSelectMenuOptionBuilder as SelectMenuOptionBuilder,\n} from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/UserSelectMenu.js';\n\nexport * as SlashCommandAssertions from './interactions/slashCommands/Assertions.js';\nexport * from './interactions/slashCommands/SlashCommandBuilder.js';\nexport * from './interactions/slashCommands/SlashCommandSubcommands.js';\nexport * from './interactions/slashCommands/options/boolean.js';\nexport * from './interactions/slashCommands/options/channel.js';\nexport * from './interactions/slashCommands/options/integer.js';\nexport * from './interactions/slashCommands/options/mentionable.js';\nexport * from './interactions/slashCommands/options/number.js';\nexport * from './interactions/slashCommands/options/role.js';\nexport * from './interactions/slashCommands/options/attachment.js';\nexport * from './interactions/slashCommands/options/string.js';\nexport * from './interactions/slashCommands/options/user.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionBase.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.js';\nexport * from './interactions/slashCommands/mixins/NameAndDescription.js';\nexport * from './interactions/slashCommands/mixins/SharedSlashCommandOptions.js';\n\nexport * as ContextMenuCommandAssertions from './interactions/contextMenuCommands/Assertions.js';\nexport * from './interactions/contextMenuCommands/ContextMenuCommandBuilder.js';\n\nexport * from './util/componentUtil.js';\nexport * from './util/normalizeArray.js';\nexport * from './util/validation.js';\n\n/**\n * The {@link https://github.com/discordjs/discord.js/blob/main/packages/builders#readme | @discordjs/builders} version\n * that you are currently using.\n *\n * @privateRemarks This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild.\n */\nexport const version = '1.6.3' as string;\n","import { s } from '@sapphire/shapeshift';\nimport type { APIEmbedField } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const fieldNamePredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(256)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const fieldValuePredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(1_024)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const fieldInlinePredicate = s.boolean.optional;\n\nexport const embedFieldPredicate = s\n\t.object({\n\t\tname: fieldNamePredicate,\n\t\tvalue: fieldValuePredicate,\n\t\tinline: fieldInlinePredicate,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const embedFieldsArrayPredicate = embedFieldPredicate.array.setValidationEnabled(isValidationEnabled);\n\nexport const fieldLengthPredicate = s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\n\nexport function validateFieldLength(amountAdding: number, fields?: APIEmbedField[]): void {\n\tfieldLengthPredicate.parse((fields?.length ?? 0) + amountAdding);\n}\n\nexport const authorNamePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const imageURLPredicate = s.string\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:', 'attachment:'],\n\t})\n\t.nullish.setValidationEnabled(isValidationEnabled);\n\nexport const urlPredicate = s.string\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:'],\n\t})\n\t.nullish.setValidationEnabled(isValidationEnabled);\n\nexport const embedAuthorPredicate = s\n\t.object({\n\t\tname: authorNamePredicate,\n\t\ticonURL: imageURLPredicate,\n\t\turl: urlPredicate,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const RGBPredicate = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(255)\n\t.setValidationEnabled(isValidationEnabled);\nexport const colorPredicate = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(0xffffff)\n\t.or(s.tuple([RGBPredicate, RGBPredicate, RGBPredicate]))\n\t.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const descriptionPredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(4_096)\n\t.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const footerTextPredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(2_048)\n\t.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const embedFooterPredicate = s\n\t.object({\n\t\ttext: footerTextPredicate,\n\t\ticonURL: imageURLPredicate,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const timestampPredicate = s.union(s.number, s.date).nullable.setValidationEnabled(isValidationEnabled);\n\nexport const titlePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);\n","let validate = true;\n\n/**\n * Enables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function enableValidators() {\n\treturn (validate = true);\n}\n\n/**\n * Disables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function disableValidators() {\n\treturn (validate = false);\n}\n\n/**\n * Checks whether validation is occurring.\n */\nexport function isValidationEnabled() {\n\treturn validate;\n}\n","/**\n * Normalizes data that is a rest parameter or an array into an array with a depth of 1.\n *\n * @typeParam T - The data that must satisfy {@link RestOrArray}.\n * @param arr - The (possibly variadic) data to normalize\n */\nexport function normalizeArray(arr: RestOrArray): T[] {\n\tif (Array.isArray(arr[0])) return arr[0];\n\treturn arr as T[];\n}\n\n/**\n * Represents data that may be an array or came from a rest parameter.\n *\n * @remarks\n * This type is used throughout builders to ensure both an array and variadic arguments\n * may be used. It is normalized with {@link normalizeArray}.\n */\nexport type RestOrArray = T[] | [T[]];\n","import type { APIEmbed, APIEmbedAuthor, APIEmbedField, APIEmbedFooter, APIEmbedImage } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport {\n\tcolorPredicate,\n\tdescriptionPredicate,\n\tembedAuthorPredicate,\n\tembedFieldsArrayPredicate,\n\tembedFooterPredicate,\n\timageURLPredicate,\n\ttimestampPredicate,\n\ttitlePredicate,\n\turlPredicate,\n\tvalidateFieldLength,\n} from './Assertions.js';\n\n/**\n * A tuple satisfying the RGB color model.\n *\n * @see {@link https://developer.mozilla.org/docs/Glossary/RGB}\n */\nexport type RGBTuple = [red: number, green: number, blue: number];\n\n/**\n * The base icon data typically used in payloads.\n */\nexport interface IconData {\n\t/**\n\t * The URL of the icon.\n\t */\n\ticonURL?: string;\n\t/**\n\t * The proxy URL of the icon.\n\t */\n\tproxyIconURL?: string;\n}\n\n/**\n * Represents the author data of an embed.\n */\nexport type EmbedAuthorData = IconData & Omit;\n\n/**\n * Represents the author options of an embed.\n */\nexport type EmbedAuthorOptions = Omit;\n\n/**\n * Represents the footer data of an embed.\n */\nexport type EmbedFooterData = IconData & Omit;\n\n/**\n * Represents the footer options of an embed.\n */\nexport type EmbedFooterOptions = Omit;\n\n/**\n * Represents the image data of an embed.\n */\nexport interface EmbedImageData extends Omit {\n\t/**\n\t * The proxy URL for the image.\n\t */\n\tproxyURL?: string;\n}\n\n/**\n * A builder that creates API-compatible JSON data for embeds.\n */\nexport class EmbedBuilder {\n\t/**\n\t * The API data associated with this embed.\n\t */\n\tpublic readonly data: APIEmbed;\n\n\t/**\n\t * Creates a new embed from API data.\n\t *\n\t * @param data - The API data to create this embed with\n\t */\n\tpublic constructor(data: APIEmbed = {}) {\n\t\tthis.data = { ...data };\n\t\tif (data.timestamp) this.data.timestamp = new Date(data.timestamp).toISOString();\n\t}\n\n\t/**\n\t * Appends fields to the embed.\n\t *\n\t * @remarks\n\t * This method accepts either an array of fields or a variable number of field parameters.\n\t * The maximum amount of fields that can be added is 25.\n\t * @example\n\t * Using an array:\n\t * ```ts\n\t * const fields: APIEmbedField[] = ...;\n\t * const embed = new EmbedBuilder()\n\t * \t.addFields(fields);\n\t * ```\n\t * @example\n\t * Using rest parameters (variadic):\n\t * ```ts\n\t * const embed = new EmbedBuilder()\n\t * \t.addFields(\n\t * \t\t{ name: 'Field 1', value: 'Value 1' },\n\t * \t\t{ name: 'Field 2', value: 'Value 2' },\n\t * \t);\n\t * ```\n\t * @param fields - The fields to add\n\t */\n\tpublic addFields(...fields: RestOrArray): this {\n\t\tconst normalizedFields = normalizeArray(fields);\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(normalizedFields.length, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(normalizedFields);\n\n\t\tif (this.data.fields) this.data.fields.push(...normalizedFields);\n\t\telse this.data.fields = normalizedFields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts fields for this embed.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of fields that can be added is 25.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing fields of an embed.\n\t * @example\n\t * Remove the first field:\n\t * ```ts\n\t * embed.spliceFields(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n fields:\n\t * ```ts\n\t * const n = 4;\n\t * embed.spliceFields(0, n);\n\t * ```\n\t * @example\n\t * Remove the last field:\n\t * ```ts\n\t * embed.spliceFields(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of fields to remove\n\t * @param fields - The replacing field objects\n\t */\n\tpublic spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this {\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(fields.length - deleteCount, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\t\tif (this.data.fields) this.data.fields.splice(index, deleteCount, ...fields);\n\t\telse this.data.fields = fields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the fields for this embed.\n\t *\n\t * @remarks\n\t * This method is an alias for {@link EmbedBuilder.spliceFields}. More specifically,\n\t * it splices the entire array of fields, replacing them with the provided fields.\n\t *\n\t * You can set a maximum of 25 fields.\n\t * @param fields - The fields to set\n\t */\n\tpublic setFields(...fields: RestOrArray) {\n\t\tthis.spliceFields(0, this.data.fields?.length ?? 0, ...normalizeArray(fields));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the author of this embed.\n\t *\n\t * @param options - The options to use\n\t */\n\n\tpublic setAuthor(options: EmbedAuthorOptions | null): this {\n\t\tif (options === null) {\n\t\t\tthis.data.author = undefined;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Data assertions\n\t\tembedAuthorPredicate.parse(options);\n\n\t\tthis.data.author = { name: options.name, url: options.url, icon_url: options.iconURL };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the color of this embed.\n\t *\n\t * @param color - The color to use\n\t */\n\tpublic setColor(color: RGBTuple | number | null): this {\n\t\t// Data assertions\n\t\tcolorPredicate.parse(color);\n\n\t\tif (Array.isArray(color)) {\n\t\t\tconst [red, green, blue] = color;\n\t\t\tthis.data.color = (red << 16) + (green << 8) + blue;\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.data.color = color ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this embed.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string | null): this {\n\t\t// Data assertions\n\t\tdescriptionPredicate.parse(description);\n\n\t\tthis.data.description = description ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the footer of this embed.\n\t *\n\t * @param options - The footer to use\n\t */\n\tpublic setFooter(options: EmbedFooterOptions | null): this {\n\t\tif (options === null) {\n\t\t\tthis.data.footer = undefined;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Data assertions\n\t\tembedFooterPredicate.parse(options);\n\n\t\tthis.data.footer = { text: options.text, icon_url: options.iconURL };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the image of this embed.\n\t *\n\t * @param url - The image URL to use\n\t */\n\tpublic setImage(url: string | null): this {\n\t\t// Data assertions\n\t\timageURLPredicate.parse(url);\n\n\t\tthis.data.image = url ? { url } : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the thumbnail of this embed.\n\t *\n\t * @param url - The thumbnail URL to use\n\t */\n\tpublic setThumbnail(url: string | null): this {\n\t\t// Data assertions\n\t\timageURLPredicate.parse(url);\n\n\t\tthis.data.thumbnail = url ? { url } : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the timestamp of this embed.\n\t *\n\t * @param timestamp - The timestamp or date to use\n\t */\n\tpublic setTimestamp(timestamp: Date | number | null = Date.now()): this {\n\t\t// Data assertions\n\t\ttimestampPredicate.parse(timestamp);\n\n\t\tthis.data.timestamp = timestamp ? new Date(timestamp).toISOString() : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the title for this embed.\n\t *\n\t * @param title - The title to use\n\t */\n\tpublic setTitle(title: string | null): this {\n\t\t// Data assertions\n\t\ttitlePredicate.parse(title);\n\n\t\tthis.data.title = title ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL of this embed.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string | null): this {\n\t\t// Data assertions\n\t\turlPredicate.parse(url);\n\n\t\tthis.data.url = url ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIEmbed {\n\t\treturn { ...this.data };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ButtonStyle, ChannelType, type APIMessageComponentEmoji } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../util/validation.js';\nimport { StringSelectMenuOptionBuilder } from './selectMenu/StringSelectMenuOption.js';\n\nexport const customIdValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const emojiValidator = s\n\t.object({\n\t\tid: s.string,\n\t\tname: s.string,\n\t\tanimated: s.boolean,\n\t})\n\t.partial.strict.setValidationEnabled(isValidationEnabled);\n\nexport const disabledValidator = s.boolean;\n\nexport const buttonLabelValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(80)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const buttonStyleValidator = s.nativeEnum(ButtonStyle);\n\nexport const placeholderValidator = s.string.lengthLessThanOrEqual(150).setValidationEnabled(isValidationEnabled);\nexport const minMaxValidator = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(25)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const labelValueDescriptionValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const jsonOptionValidator = s\n\t.object({\n\t\tlabel: labelValueDescriptionValidator,\n\t\tvalue: labelValueDescriptionValidator,\n\t\tdescription: labelValueDescriptionValidator.optional,\n\t\temoji: emojiValidator.optional,\n\t\tdefault: s.boolean.optional,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const optionValidator = s.instance(StringSelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled);\n\nexport const optionsValidator = optionValidator.array\n\t.lengthGreaterThanOrEqual(0)\n\t.setValidationEnabled(isValidationEnabled);\nexport const optionsLengthValidator = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(25)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredSelectMenuParameters(options: StringSelectMenuOptionBuilder[], customId?: string) {\n\tcustomIdValidator.parse(customId);\n\toptionsValidator.parse(options);\n}\n\nexport const defaultValidator = s.boolean;\n\nexport function validateRequiredSelectMenuOptionParameters(label?: string, value?: string) {\n\tlabelValueDescriptionValidator.parse(label);\n\tlabelValueDescriptionValidator.parse(value);\n}\n\nexport const channelTypesValidator = s.nativeEnum(ChannelType).array.setValidationEnabled(isValidationEnabled);\n\nexport const urlValidator = s.string\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:', 'discord:'],\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredButtonParameters(\n\tstyle?: ButtonStyle,\n\tlabel?: string,\n\temoji?: APIMessageComponentEmoji,\n\tcustomId?: string,\n\turl?: string,\n) {\n\tif (url && customId) {\n\t\tthrow new RangeError('URL and custom id are mutually exclusive');\n\t}\n\n\tif (!label && !emoji) {\n\t\tthrow new RangeError('Buttons must have a label and/or an emoji');\n\t}\n\n\tif (style === ButtonStyle.Link) {\n\t\tif (!url) {\n\t\t\tthrow new RangeError('Link buttons must have a url');\n\t\t}\n\t} else if (url) {\n\t\tthrow new RangeError('Non-link buttons cannot have a url');\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIMessageComponentEmoji, APISelectMenuOption } from 'discord-api-types/v10';\nimport {\n\tdefaultValidator,\n\temojiValidator,\n\tlabelValueDescriptionValidator,\n\tvalidateRequiredSelectMenuOptionParameters,\n} from '../Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for string select menu options.\n */\nexport class StringSelectMenuOptionBuilder implements JSONEncodable {\n\t/**\n\t * Creates a new string select menu option from API data.\n\t *\n\t * @param data - The API data to create this string select menu option with\n\t * @example\n\t * Creating a string select menu option from an API data object:\n\t * ```ts\n\t * const selectMenuOption = new SelectMenuOptionBuilder({\n\t * \tlabel: 'catchy label',\n\t * \tvalue: '1',\n\t * });\n\t * ```\n\t * @example\n\t * Creating a string select menu option using setters and API data:\n\t * ```ts\n\t * const selectMenuOption = new SelectMenuOptionBuilder({\n\t * \tdefault: true,\n\t * \tvalue: '1',\n\t * })\n\t * \t.setLabel('woah');\n\t * ```\n\t */\n\tpublic constructor(public data: Partial = {}) {}\n\n\t/**\n\t * Sets the label for this option.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = labelValueDescriptionValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value for this option.\n\t *\n\t * @param value - The value to use\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = labelValueDescriptionValidator.parse(value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description for this option.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = labelValueDescriptionValidator.parse(description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this option is selected by default.\n\t *\n\t * @param isDefault - Whether this option is selected by default\n\t */\n\tpublic setDefault(isDefault = true) {\n\t\tthis.data.default = defaultValidator.parse(isDefault);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display for this option.\n\t *\n\t * @param emoji - The emoji to use\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\tthis.data.emoji = emojiValidator.parse(emoji);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc BaseSelectMenuBuilder.toJSON}\n\t */\n\tpublic toJSON(): APISelectMenuOption {\n\t\tvalidateRequiredSelectMenuOptionParameters(this.data.label, this.data.value);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APISelectMenuOption;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport {\n\ttype APIActionRowComponent,\n\tComponentType,\n\ttype APIMessageActionRowComponent,\n\ttype APIModalActionRowComponent,\n\ttype APIActionRowComponentTypes,\n} from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../util/normalizeArray.js';\nimport { ComponentBuilder } from './Component.js';\nimport { createComponentBuilder } from './Components.js';\nimport type { ButtonBuilder } from './button/Button.js';\nimport type { ChannelSelectMenuBuilder } from './selectMenu/ChannelSelectMenu.js';\nimport type { MentionableSelectMenuBuilder } from './selectMenu/MentionableSelectMenu.js';\nimport type { RoleSelectMenuBuilder } from './selectMenu/RoleSelectMenu.js';\nimport type { StringSelectMenuBuilder } from './selectMenu/StringSelectMenu.js';\nimport type { UserSelectMenuBuilder } from './selectMenu/UserSelectMenu.js';\nimport type { TextInputBuilder } from './textInput/TextInput.js';\n\n/**\n * The builders that may be used for messages.\n */\nexport type MessageComponentBuilder =\n\t| ActionRowBuilder\n\t| MessageActionRowComponentBuilder;\n\n/**\n * The builders that may be used for modals.\n */\nexport type ModalComponentBuilder = ActionRowBuilder | ModalActionRowComponentBuilder;\n\n/**\n * The builders that may be used within an action row for messages.\n */\nexport type MessageActionRowComponentBuilder =\n\t| ButtonBuilder\n\t| ChannelSelectMenuBuilder\n\t| MentionableSelectMenuBuilder\n\t| RoleSelectMenuBuilder\n\t| StringSelectMenuBuilder\n\t| UserSelectMenuBuilder;\n\n/**\n * The builders that may be used within an action row for modals.\n */\nexport type ModalActionRowComponentBuilder = TextInputBuilder;\n\n/**\n * Any builder.\n */\nexport type AnyComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder;\n\n/**\n * A builder that creates API-compatible JSON data for action rows.\n *\n * @typeParam T - The types of components this action row holds\n */\nexport class ActionRowBuilder extends ComponentBuilder<\n\tAPIActionRowComponent\n> {\n\t/**\n\t * The components within this action row.\n\t */\n\tpublic readonly components: T[];\n\n\t/**\n\t * Creates a new action row from API data.\n\t *\n\t * @param data - The API data to create this action row with\n\t * @example\n\t * Creating an action row from an API data object:\n\t * ```ts\n\t * const actionRow = new ActionRowBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcustom_id: \"custom id\",\n\t * \t\t\tlabel: \"Type something\",\n\t * \t\t\tstyle: TextInputStyle.Short,\n\t * \t\t\ttype: ComponentType.TextInput,\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating an action row using setters and API data:\n\t * ```ts\n\t * const actionRow = new ActionRowBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcustom_id: \"custom id\",\n\t * \t\t\tlabel: \"Click me\",\n\t * \t\t\tstyle: ButtonStyle.Primary,\n\t * \t\t\ttype: ComponentType.Button,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addComponents(button2, button3);\n\t * ```\n\t */\n\tpublic constructor({ components, ...data }: Partial> = {}) {\n\t\tsuper({ type: ComponentType.ActionRow, ...data });\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ?? []) as T[];\n\t}\n\n\t/**\n\t * Adds components to this action row.\n\t *\n\t * @param components - The components to add\n\t */\n\tpublic addComponents(...components: RestOrArray) {\n\t\tthis.components.push(...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets components for this action row.\n\t *\n\t * @param components - The components to set\n\t */\n\tpublic setComponents(...components: RestOrArray) {\n\t\tthis.components.splice(0, this.components.length, ...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIActionRowComponent> {\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIActionRowComponent>;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPIActionRowComponent,\n\tAPIActionRowComponentTypes,\n\tAPIBaseComponent,\n\tComponentType,\n} from 'discord-api-types/v10';\n\n/**\n * Any action row component data represented as an object.\n */\nexport type AnyAPIActionRowComponent = APIActionRowComponent | APIActionRowComponentTypes;\n\n/**\n * The base component builder that contains common symbols for all sorts of components.\n *\n * @typeParam DataType - The type of internal API data that is stored within the component\n */\nexport abstract class ComponentBuilder<\n\tDataType extends Partial> = APIBaseComponent,\n> implements JSONEncodable\n{\n\t/**\n\t * The API data associated with this component.\n\t */\n\tpublic readonly data: Partial;\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic abstract toJSON(): AnyAPIActionRowComponent;\n\n\t/**\n\t * Constructs a new kind of component.\n\t *\n\t * @param data - The data to construct a component out of\n\t */\n\tpublic constructor(data: Partial) {\n\t\tthis.data = data;\n\t}\n}\n","import { ComponentType, type APIMessageComponent, type APIModalComponent } from 'discord-api-types/v10';\nimport {\n\tActionRowBuilder,\n\ttype AnyComponentBuilder,\n\ttype MessageComponentBuilder,\n\ttype ModalComponentBuilder,\n} from './ActionRow.js';\nimport { ComponentBuilder } from './Component.js';\nimport { ButtonBuilder } from './button/Button.js';\nimport { ChannelSelectMenuBuilder } from './selectMenu/ChannelSelectMenu.js';\nimport { MentionableSelectMenuBuilder } from './selectMenu/MentionableSelectMenu.js';\nimport { RoleSelectMenuBuilder } from './selectMenu/RoleSelectMenu.js';\nimport { StringSelectMenuBuilder } from './selectMenu/StringSelectMenu.js';\nimport { UserSelectMenuBuilder } from './selectMenu/UserSelectMenu.js';\nimport { TextInputBuilder } from './textInput/TextInput.js';\n\n/**\n * Components here are mapped to their respective builder.\n */\nexport interface MappedComponentTypes {\n\t/**\n\t * The action row component type is associated with an {@link ActionRowBuilder}.\n\t */\n\t[ComponentType.ActionRow]: ActionRowBuilder;\n\t/**\n\t * The button component type is associated with an {@link ButtonBuilder}.\n\t */\n\t[ComponentType.Button]: ButtonBuilder;\n\t/**\n\t * The string select component type is associated with an {@link StringSelectMenuBuilder}.\n\t */\n\t[ComponentType.StringSelect]: StringSelectMenuBuilder;\n\t/**\n\t * The text inpiut component type is associated with an {@link TextInputBuilder}.\n\t */\n\t[ComponentType.TextInput]: TextInputBuilder;\n\t/**\n\t * The user select component type is associated with an {@link UserSelectMenuBuilder}.\n\t */\n\t[ComponentType.UserSelect]: UserSelectMenuBuilder;\n\t/**\n\t * The role select component type is associated with an {@link RoleSelectMenuBuilder}.\n\t */\n\t[ComponentType.RoleSelect]: RoleSelectMenuBuilder;\n\t/**\n\t * The mentionable select component type is associated with an {@link MentionableSelectMenuBuilder}.\n\t */\n\t[ComponentType.MentionableSelect]: MentionableSelectMenuBuilder;\n\t/**\n\t * The channel select component type is associated with an {@link ChannelSelectMenuBuilder}.\n\t */\n\t[ComponentType.ChannelSelect]: ChannelSelectMenuBuilder;\n}\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam T - The type of component to use\n * @param data - The API data to transform to a component class\n */\nexport function createComponentBuilder(\n\t// eslint-disable-next-line @typescript-eslint/sort-type-union-intersection-members\n\tdata: (APIModalComponent | APIMessageComponent) & { type: T },\n): MappedComponentTypes[T];\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam C - The type of component to use\n * @param data - The API data to transform to a component class\n */\nexport function createComponentBuilder(data: C): C;\n\nexport function createComponentBuilder(\n\tdata: APIMessageComponent | APIModalComponent | MessageComponentBuilder,\n): ComponentBuilder {\n\tif (data instanceof ComponentBuilder) {\n\t\treturn data;\n\t}\n\n\tswitch (data.type) {\n\t\tcase ComponentType.ActionRow:\n\t\t\treturn new ActionRowBuilder(data);\n\t\tcase ComponentType.Button:\n\t\t\treturn new ButtonBuilder(data);\n\t\tcase ComponentType.StringSelect:\n\t\t\treturn new StringSelectMenuBuilder(data);\n\t\tcase ComponentType.TextInput:\n\t\t\treturn new TextInputBuilder(data);\n\t\tcase ComponentType.UserSelect:\n\t\t\treturn new UserSelectMenuBuilder(data);\n\t\tcase ComponentType.RoleSelect:\n\t\t\treturn new RoleSelectMenuBuilder(data);\n\t\tcase ComponentType.MentionableSelect:\n\t\t\treturn new MentionableSelectMenuBuilder(data);\n\t\tcase ComponentType.ChannelSelect:\n\t\t\treturn new ChannelSelectMenuBuilder(data);\n\t\tdefault:\n\t\t\t// @ts-expect-error This case can still occur if we get a newer unsupported component type\n\t\t\tthrow new Error(`Cannot properly serialize component type: ${data.type}`);\n\t}\n}\n","import {\n\tComponentType,\n\ttype APIMessageComponentEmoji,\n\ttype APIButtonComponent,\n\ttype APIButtonComponentWithURL,\n\ttype APIButtonComponentWithCustomId,\n\ttype ButtonStyle,\n} from 'discord-api-types/v10';\nimport {\n\tbuttonLabelValidator,\n\tbuttonStyleValidator,\n\tcustomIdValidator,\n\tdisabledValidator,\n\temojiValidator,\n\turlValidator,\n\tvalidateRequiredButtonParameters,\n} from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\n\n/**\n * A builder that creates API-compatible JSON data for buttons.\n */\nexport class ButtonBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new button from API data.\n\t *\n\t * @param data - The API data to create this button with\n\t * @example\n\t * Creating a button from an API data object:\n\t * ```ts\n\t * const button = new ButtonBuilder({\n\t * \tcustom_id: 'a cool button',\n\t * \tstyle: ButtonStyle.Primary,\n\t * \tlabel: 'Click Me',\n\t * \temoji: {\n\t * \t\tname: 'smile',\n\t * \t\tid: '123456789012345678',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a button using setters and API data:\n\t * ```ts\n\t * const button = new ButtonBuilder({\n\t * \tstyle: ButtonStyle.Secondary,\n\t * \tlabel: 'Click Me',\n\t * })\n\t * \t.setEmoji({ name: '🙂' })\n\t * \t.setCustomId('another cool button');\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ type: ComponentType.Button, ...data });\n\t}\n\n\t/**\n\t * Sets the style of this button.\n\t *\n\t * @param style - The style to use\n\t */\n\tpublic setStyle(style: ButtonStyle) {\n\t\tthis.data.style = buttonStyleValidator.parse(style);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL for this button.\n\t *\n\t * @remarks\n\t * This method is only available to buttons using the `Link` button style.\n\t * Only three types of URL schemes are currently supported: `https://`, `http://`, and `discord://`.\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\t(this.data as APIButtonComponentWithURL).url = urlValidator.parse(url);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id for this button.\n\t *\n\t * @remarks\n\t * This method is only applicable to buttons that are not using the `Link` button style.\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\t(this.data as APIButtonComponentWithCustomId).custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display on this button.\n\t *\n\t * @param emoji - The emoji to use\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\tthis.data.emoji = emojiValidator.parse(emoji);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this button is disabled.\n\t *\n\t * @param disabled - Whether to disable this button\n\t */\n\tpublic setDisabled(disabled = true) {\n\t\tthis.data.disabled = disabledValidator.parse(disabled);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this button.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = buttonLabelValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIButtonComponent {\n\t\tvalidateRequiredButtonParameters(\n\t\t\tthis.data.style,\n\t\t\tthis.data.label,\n\t\t\tthis.data.emoji,\n\t\t\t(this.data as APIButtonComponentWithCustomId).custom_id,\n\t\t\t(this.data as APIButtonComponentWithURL).url,\n\t\t);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APIButtonComponent;\n\t}\n}\n","import type { APIChannelSelectComponent, ChannelType } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { channelTypesValidator, customIdValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for channel select menus.\n */\nexport class ChannelSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data.\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new ChannelSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new ChannelSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.addChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement)\n\t * \t.setMinValues(2);\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.ChannelSelect });\n\t}\n\n\t/**\n\t * Adds channel types to this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic addChannelTypes(...types: RestOrArray) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.push(...channelTypesValidator.parse(normalizedTypes));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets channel types for this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic setChannelTypes(...types: RestOrArray) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.splice(0, this.data.channel_types.length, ...channelTypesValidator.parse(normalizedTypes));\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc BaseSelectMenuBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APIChannelSelectComponent {\n\t\tcustomIdValidator.parse(this.data.custom_id);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APIChannelSelectComponent;\n\t}\n}\n","import type { APISelectMenuComponent } from 'discord-api-types/v10';\nimport { customIdValidator, disabledValidator, minMaxValidator, placeholderValidator } from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\n\n/**\n * The base select menu builder that contains common symbols for select menu builders.\n *\n * @typeParam SelectMenuType - The type of select menu this would be instantiated for.\n */\nexport abstract class BaseSelectMenuBuilder<\n\tSelectMenuType extends APISelectMenuComponent,\n> extends ComponentBuilder {\n\t/**\n\t * Sets the placeholder for this select menu.\n\t *\n\t * @param placeholder - The placeholder to use\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tthis.data.placeholder = placeholderValidator.parse(placeholder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum values that must be selected in the select menu.\n\t *\n\t * @param minValues - The minimum values that must be selected\n\t */\n\tpublic setMinValues(minValues: number) {\n\t\tthis.data.min_values = minMaxValidator.parse(minValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum values that must be selected in the select menu.\n\t *\n\t * @param maxValues - The maximum values that must be selected\n\t */\n\tpublic setMaxValues(maxValues: number) {\n\t\tthis.data.max_values = minMaxValidator.parse(maxValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id for this select menu.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this select menu is disabled.\n\t *\n\t * @param disabled - Whether this select menu is disabled\n\t */\n\tpublic setDisabled(disabled = true) {\n\t\tthis.data.disabled = disabledValidator.parse(disabled);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): SelectMenuType {\n\t\tcustomIdValidator.parse(this.data.custom_id);\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as SelectMenuType;\n\t}\n}\n","import type { APIMentionableSelectComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for mentionable select menus.\n */\nexport class MentionableSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data.\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new MentionableSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new MentionableSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1);\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.MentionableSelect });\n\t}\n}\n","import type { APIRoleSelectComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for role select menus.\n */\nexport class RoleSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data.\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new RoleSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new RoleSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1);\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.RoleSelect });\n\t}\n}\n","import { ComponentType } from 'discord-api-types/v10';\nimport type { APIStringSelectComponent, APISelectMenuOption } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { jsonOptionValidator, optionsLengthValidator, validateRequiredSelectMenuParameters } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\nimport { StringSelectMenuOptionBuilder } from './StringSelectMenuOption.js';\n\n/**\n * A builder that creates API-compatible JSON data for string select menus.\n */\nexport class StringSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * The options within this select menu.\n\t */\n\tpublic readonly options: StringSelectMenuOptionBuilder[];\n\n\t/**\n\t * Creates a new select menu from API data.\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new StringSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * \toptions: [\n\t * \t\t{ label: 'option 1', value: '1' },\n\t * \t\t{ label: 'option 2', value: '2' },\n\t * \t\t{ label: 'option 3', value: '3' },\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new StringSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1)\n\t * \t.addOptions({\n\t * \t\tlabel: 'Catchy',\n\t * \t\tvalue: 'catch',\n\t * \t});\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tconst { options, ...initData } = data ?? {};\n\t\tsuper({ ...initData, type: ComponentType.StringSelect });\n\t\tthis.options = options?.map((option: APISelectMenuOption) => new StringSelectMenuOptionBuilder(option)) ?? [];\n\t}\n\n\t/**\n\t * Adds options to this select menu.\n\t *\n\t * @param options - The options to add\n\t */\n\tpublic addOptions(...options: RestOrArray) {\n\t\tconst normalizedOptions = normalizeArray(options);\n\t\toptionsLengthValidator.parse(this.options.length + normalizedOptions.length);\n\t\tthis.options.push(\n\t\t\t...normalizedOptions.map((normalizedOption) =>\n\t\t\t\tnormalizedOption instanceof StringSelectMenuOptionBuilder\n\t\t\t\t\t? normalizedOption\n\t\t\t\t\t: new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption)),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the options for this select menu.\n\t *\n\t * @param options - The options to set\n\t */\n\tpublic setOptions(...options: RestOrArray) {\n\t\treturn this.spliceOptions(0, this.options.length, ...options);\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts options for this select menu.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice()}.\n\t * It's useful for modifying and adjusting the order of existing options.\n\t * @example\n\t * Remove the first option:\n\t * ```ts\n\t * selectMenu.spliceOptions(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n option:\n\t * ```ts\n\t * const n = 4;\n\t * selectMenu.spliceOptions(0, n);\n\t * ```\n\t * @example\n\t * Remove the last option:\n\t * ```ts\n\t * selectMenu.spliceOptions(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of options to remove\n\t * @param options - The replacing option objects or builders\n\t */\n\tpublic spliceOptions(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...options: RestOrArray\n\t) {\n\t\tconst normalizedOptions = normalizeArray(options);\n\n\t\tconst clone = [...this.options];\n\n\t\tclone.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizedOptions.map((normalizedOption) =>\n\t\t\t\tnormalizedOption instanceof StringSelectMenuOptionBuilder\n\t\t\t\t\t? normalizedOption\n\t\t\t\t\t: new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption)),\n\t\t\t),\n\t\t);\n\n\t\toptionsLengthValidator.parse(clone.length);\n\t\tthis.options.splice(0, this.options.length, ...clone);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc BaseSelectMenuBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APIStringSelectComponent {\n\t\tvalidateRequiredSelectMenuParameters(this.options, this.data.custom_id);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t} as APIStringSelectComponent;\n\t}\n}\n","import type { APIUserSelectComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for user select menus.\n */\nexport class UserSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data.\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1);\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.UserSelect });\n\t}\n}\n","import { isJSONEncodable, type Equatable, type JSONEncodable } from '@discordjs/util';\nimport { ComponentType, type TextInputStyle, type APITextInputComponent } from 'discord-api-types/v10';\nimport isEqual from 'fast-deep-equal';\nimport { customIdValidator } from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\nimport {\n\tmaxLengthValidator,\n\tminLengthValidator,\n\tplaceholderValidator,\n\trequiredValidator,\n\tvalueValidator,\n\tvalidateRequiredParameters,\n\tlabelValidator,\n\ttextInputStyleValidator,\n} from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for text inputs.\n */\nexport class TextInputBuilder\n\textends ComponentBuilder\n\timplements Equatable>\n{\n\t/**\n\t * Creates a new text input from API data.\n\t *\n\t * @param data - The API data to create this text input with\n\t * @example\n\t * Creating a select menu option from an API data object:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tlabel: 'Type something',\n\t * \tstyle: TextInputStyle.Short,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu option using setters and API data:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tlabel: 'Type something else',\n\t * })\n\t * \t.setCustomId('woah')\n\t * \t.setStyle(TextInputStyle.Paragraph);\n\t * ```\n\t */\n\tpublic constructor(data?: APITextInputComponent & { type?: ComponentType.TextInput }) {\n\t\tsuper({ type: ComponentType.TextInput, ...data });\n\t}\n\n\t/**\n\t * Sets the custom id for this text input.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this text input.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = labelValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the style for this text input.\n\t *\n\t * @param style - The style to use\n\t */\n\tpublic setStyle(style: TextInputStyle) {\n\t\tthis.data.style = textInputStyleValidator.parse(style);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of text for this text input.\n\t *\n\t * @param minLength - The minimum length of text for this text input\n\t */\n\tpublic setMinLength(minLength: number) {\n\t\tthis.data.min_length = minLengthValidator.parse(minLength);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum length of text for this text input.\n\t *\n\t * @param maxLength - The maximum length of text for this text input\n\t */\n\tpublic setMaxLength(maxLength: number) {\n\t\tthis.data.max_length = maxLengthValidator.parse(maxLength);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the placeholder for this text input.\n\t *\n\t * @param placeholder - The placeholder to use\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tthis.data.placeholder = placeholderValidator.parse(placeholder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value for this text input.\n\t *\n\t * @param value - The value to use\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = valueValidator.parse(value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this text input is required.\n\t *\n\t * @param required - Whether this text input is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = requiredValidator.parse(required);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APITextInputComponent {\n\t\tvalidateRequiredParameters(this.data.custom_id, this.data.style, this.data.label);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APITextInputComponent;\n\t}\n\n\t/**\n\t * {@inheritDoc Equatable.equals}\n\t */\n\tpublic equals(other: APITextInputComponent | JSONEncodable): boolean {\n\t\tif (isJSONEncodable(other)) {\n\t\t\treturn isEqual(other.toJSON(), this.data);\n\t\t}\n\n\t\treturn isEqual(other, this.data);\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { TextInputStyle } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport { customIdValidator } from '../Assertions.js';\n\nexport const textInputStyleValidator = s.nativeEnum(TextInputStyle);\nexport const minLengthValidator = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\nexport const maxLengthValidator = s.number.int\n\t.greaterThanOrEqual(1)\n\t.lessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\nexport const requiredValidator = s.boolean;\nexport const valueValidator = s.string.lengthLessThanOrEqual(4_000).setValidationEnabled(isValidationEnabled);\nexport const placeholderValidator = s.string.lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);\nexport const labelValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(45)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredParameters(customId?: string, style?: TextInputStyle, label?: string) {\n\tcustomIdValidator.parse(customId);\n\ttextInputStyleValidator.parse(style);\n\tlabelValidator.parse(label);\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';\nimport { customIdValidator } from '../../components/Assertions.js';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const titleValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(45)\n\t.setValidationEnabled(isValidationEnabled);\nexport const componentsValidator = s\n\t.instance(ActionRowBuilder)\n\t.array.lengthGreaterThanOrEqual(1)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredParameters(\n\tcustomId?: string,\n\ttitle?: string,\n\tcomponents?: ActionRowBuilder[],\n) {\n\tcustomIdValidator.parse(customId);\n\ttitleValidator.parse(title);\n\tcomponentsValidator.parse(components);\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPIActionRowComponent,\n\tAPIModalActionRowComponent,\n\tAPIModalInteractionResponseCallbackData,\n} from 'discord-api-types/v10';\nimport { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';\nimport { customIdValidator } from '../../components/Assertions.js';\nimport { createComponentBuilder } from '../../components/Components.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { titleValidator, validateRequiredParameters } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for modals.\n */\nexport class ModalBuilder implements JSONEncodable {\n\t/**\n\t * The API data associated with this modal.\n\t */\n\tpublic readonly data: Partial;\n\n\t/**\n\t * The components within this modal.\n\t */\n\tpublic readonly components: ActionRowBuilder[] = [];\n\n\t/**\n\t * Creates a new modal from API data.\n\t *\n\t * @param data - The API data to create this modal with\n\t */\n\tpublic constructor({ components, ...data }: Partial = {}) {\n\t\tthis.data = { ...data };\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ??\n\t\t\t[]) as ActionRowBuilder[];\n\t}\n\n\t/**\n\t * Sets the title of this modal.\n\t *\n\t * @param title - The title to use\n\t */\n\tpublic setTitle(title: string) {\n\t\tthis.data.title = titleValidator.parse(title);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id of this modal.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds components to this modal.\n\t *\n\t * @param components - The components to add\n\t */\n\tpublic addComponents(\n\t\t...components: RestOrArray<\n\t\t\tActionRowBuilder | APIActionRowComponent\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) =>\n\t\t\t\tcomponent instanceof ActionRowBuilder\n\t\t\t\t\t? component\n\t\t\t\t\t: new ActionRowBuilder(component),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets components for this modal.\n\t *\n\t * @param components - The components to set\n\t */\n\tpublic setComponents(...components: RestOrArray>) {\n\t\tthis.components.splice(0, this.components.length, ...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIModalInteractionResponseCallbackData {\n\t\tvalidateRequiredParameters(this.data.custom_id, this.data.title, this.components);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIModalInteractionResponseCallbackData;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { Locale, type APIApplicationCommandOptionChoice, type LocalizationMap } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js';\nimport type { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands.js';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js';\n\nconst namePredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(32)\n\t.regex(/^[\\p{Ll}\\p{Lm}\\p{Lo}\\p{N}\\p{sc=Devanagari}\\p{sc=Thai}_-]+$/u)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nconst descriptionPredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\nconst localePredicate = s.nativeEnum(Locale);\n\nexport function validateDescription(description: unknown): asserts description is string {\n\tdescriptionPredicate.parse(description);\n}\n\nconst maxArrayLengthPredicate = s.unknown.array.lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\nexport function validateLocale(locale: unknown) {\n\treturn localePredicate.parse(locale);\n}\n\nexport function validateMaxOptionsLength(options: unknown): asserts options is ToAPIApplicationCommandOptions[] {\n\tmaxArrayLengthPredicate.parse(options);\n}\n\nexport function validateRequiredParameters(\n\tname: string,\n\tdescription: string,\n\toptions: ToAPIApplicationCommandOptions[],\n) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert description conditions\n\tvalidateDescription(description);\n\n\t// Assert options conditions\n\tvalidateMaxOptionsLength(options);\n}\n\nconst booleanPredicate = s.boolean;\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateRequired(required: unknown): asserts required is boolean {\n\tbooleanPredicate.parse(required);\n}\n\nconst choicesLengthPredicate = s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\n\nexport function validateChoicesLength(amountAdding: number, choices?: APIApplicationCommandOptionChoice[]): void {\n\tchoicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding);\n}\n\nexport function assertReturnOfBuilder<\n\tT extends ApplicationCommandOptionBase | SlashCommandSubcommandBuilder | SlashCommandSubcommandGroupBuilder,\n>(input: unknown, ExpectedInstanceOf: new () => T): asserts input is T {\n\ts.instance(ExpectedInstanceOf).parse(input);\n}\n\nexport const localizationMapPredicate = s\n\t.object(Object.fromEntries(Object.values(Locale).map((locale) => [locale, s.string.nullish])))\n\t.strict.nullish.setValidationEnabled(isValidationEnabled);\n\nexport function validateLocalizationMap(value: unknown): asserts value is LocalizationMap {\n\tlocalizationMapPredicate.parse(value);\n}\n\nconst dmPermissionPredicate = s.boolean.nullish;\n\nexport function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {\n\tdmPermissionPredicate.parse(value);\n}\n\nconst memberPermissionPredicate = s.union(\n\ts.bigint.transform((value) => value.toString()),\n\ts.number.safeInt.transform((value) => value.toString()),\n\ts.string.regex(/^\\d+$/),\n).nullish;\n\nexport function validateDefaultMemberPermissions(permissions: unknown) {\n\treturn memberPermissionPredicate.parse(permissions);\n}\n\nexport function validateNSFW(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n","import type {\n\tAPIApplicationCommandOption,\n\tLocalizationMap,\n\tPermissions,\n\tRESTPostAPIChatInputApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport {\n\tassertReturnOfBuilder,\n\tvalidateDefaultMemberPermissions,\n\tvalidateDefaultPermission,\n\tvalidateLocalizationMap,\n\tvalidateDMPermission,\n\tvalidateMaxOptionsLength,\n\tvalidateRequiredParameters,\n\tvalidateNSFW,\n} from './Assertions.js';\nimport { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands.js';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription.js';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions.js';\n\n/**\n * A builder that creates API-compatible JSON data for slash commands.\n */\n@mix(SharedSlashCommandOptions, SharedNameAndDescription)\nexport class SlashCommandBuilder {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The description of this command.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The description localizations of this command.\n\t */\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\t/**\n\t * The options of this command.\n\t */\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * Whether this command is enabled by default when the application is added to a guild.\n\t *\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The set of permissions represented as a bit set for the command.\n\t */\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * Indicates whether the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This property is only for global commands.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\t/**\n\t * Whether this command is NSFW.\n\t */\n\tpublic readonly nsfw: boolean | undefined = undefined;\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * @remarks\n\t * If set to `false`, you will have to later `PUT` the permissions for this command.\n\t * @param value - Whether or not to enable this command by default\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link SlashCommandBuilder.setDefaultMemberPermissions} or {@link SlashCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'default_permission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run the command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined) {\n\t\t// Assert the value and parse it\n\t\tconst permissionValue = validateDefaultMemberPermissions(permissions);\n\n\t\tReflect.set(this, 'default_member_permissions', permissionValue);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets if the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This method is only for global commands.\n\t * @param enabled - Whether the command should be enabled in direct messages\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDMPermission(enabled: boolean | null | undefined) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDMPermission(enabled);\n\n\t\tReflect.set(this, 'dm_permission', enabled);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this command is NSFW.\n\t *\n\t * @param nsfw - Whether this command is NSFW\n\t */\n\tpublic setNSFW(nsfw = true) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateNSFW(nsfw);\n\t\tReflect.set(this, 'nsfw', nsfw);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a new subcommand group to this command.\n\t *\n\t * @param input - A function that returns a subcommand group builder or an already built builder\n\t */\n\tpublic addSubcommandGroup(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandGroupBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandGroupBuilder) => SlashCommandSubcommandGroupBuilder),\n\t): SlashCommandSubcommandsOnlyBuilder {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandGroupBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a new subcommand to this command.\n\t *\n\t * @param input - A function that returns a subcommand builder or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t): SlashCommandSubcommandsOnlyBuilder {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): RESTPostAPIChatInputApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\tvalidateLocalizationMap(this.name_localizations);\n\t\tvalidateLocalizationMap(this.description_localizations);\n\n\t\treturn {\n\t\t\t...this,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {}\n\n/**\n * An interface specifically for slash command subcommands.\n */\nexport interface SlashCommandSubcommandsOnlyBuilder\n\textends Omit> {}\n\n/**\n * An interface specifically for slash command options.\n */\nexport interface SlashCommandOptionsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions,\n\t\tPick {}\n\n/**\n * An interface that ensures the `toJSON()` call will return something\n * that can be serialized into API-compatible data.\n */\nexport interface ToAPIApplicationCommandOptions {\n\ttoJSON(): APIApplicationCommandOption;\n}\n","import {\n\tApplicationCommandOptionType,\n\ttype APIApplicationCommandSubcommandGroupOption,\n\ttype APIApplicationCommandSubcommandOption,\n} from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { assertReturnOfBuilder, validateMaxOptionsLength, validateRequiredParameters } from './Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription.js';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions.js';\n\n/**\n * Represents a folder for subcommands.\n *\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\n@mix(SharedNameAndDescription)\nexport class SlashCommandSubcommandGroupBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand group.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand group.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The subcommands within this subcommand group.\n\t */\n\tpublic readonly options: SlashCommandSubcommandBuilder[] = [];\n\n\t/**\n\t * Adds a new subcommand to this group.\n\t *\n\t * @param input - A function that returns a subcommand builder or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t) {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIApplicationCommandSubcommandGroupOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.SubcommandGroup,\n\t\t\tname: this.name,\n\t\t\tname_localizations: this.name_localizations,\n\t\t\tdescription: this.description,\n\t\t\tdescription_localizations: this.description_localizations,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandGroupBuilder extends SharedNameAndDescription {}\n\n/**\n * A builder that creates API-compatible JSON data for slash command subcommands.\n *\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\n@mix(SharedNameAndDescription, SharedSlashCommandOptions)\nexport class SlashCommandSubcommandBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The options within this subcommand.\n\t */\n\tpublic readonly options: ApplicationCommandOptionBase[] = [];\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIApplicationCommandSubcommandOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.Subcommand,\n\t\t\tname: this.name,\n\t\t\tname_localizations: this.name_localizations,\n\t\t\tdescription: this.description,\n\t\t\tdescription_localizations: this.description_localizations,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {}\n","import type { LocaleString, LocalizationMap } from 'discord-api-types/v10';\nimport { validateDescription, validateLocale, validateName } from '../Assertions.js';\n\n/**\n * This mixin holds name and description symbols for slash commands.\n */\nexport class SharedNameAndDescription {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name!: string;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The description of this command.\n\t */\n\tpublic readonly description!: string;\n\n\t/**\n\t * The description localizations of this command.\n\t */\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\t/**\n\t * Sets the name of this command.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string): this {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this command.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\t// Assert the description matches the conditions\n\t\tvalidateDescription(description);\n\n\t\tReflect.set(this, 'description', description);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * SSets a name localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedName - The localized name for the given `locale`\n\t */\n\tpublic setNameLocalization(locale: LocaleString, localizedName: string | null) {\n\t\tif (!this.name_localizations) {\n\t\t\tReflect.set(this, 'name_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedName === null) {\n\t\t\tthis.name_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateName(localizedName);\n\n\t\tthis.name_localizations![parsedLocale] = localizedName;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations for this command.\n\t *\n\t * @param localizedNames - The object of localized names to set\n\t */\n\tpublic setNameLocalizations(localizedNames: LocalizationMap | null) {\n\t\tif (localizedNames === null) {\n\t\t\tReflect.set(this, 'name_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'name_localizations', {});\n\n\t\tfor (const args of Object.entries(localizedNames)) {\n\t\t\tthis.setNameLocalization(...(args as [LocaleString, string | null]));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a description localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedDescription - The localized description for the given locale\n\t */\n\tpublic setDescriptionLocalization(locale: LocaleString, localizedDescription: string | null) {\n\t\tif (!this.description_localizations) {\n\t\t\tReflect.set(this, 'description_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedDescription === null) {\n\t\t\tthis.description_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateDescription(localizedDescription);\n\n\t\tthis.description_localizations![parsedLocale] = localizedDescription;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description localizations for this command.\n\t *\n\t * @param localizedDescriptions - The object of localized descriptions to set\n\t */\n\tpublic setDescriptionLocalizations(localizedDescriptions: LocalizationMap | null) {\n\t\tif (localizedDescriptions === null) {\n\t\t\tReflect.set(this, 'description_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'description_localizations', {});\n\t\tfor (const args of Object.entries(localizedDescriptions)) {\n\t\t\tthis.setDescriptionLocalization(...(args as [LocaleString, string | null]));\n\t\t}\n\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandAttachmentOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command attachment option.\n */\nexport class SlashCommandAttachmentOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Attachment as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandAttachmentOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import type { APIApplicationCommandBasicOption, ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { validateRequiredParameters, validateRequired, validateLocalizationMap } from '../Assertions.js';\nimport { SharedNameAndDescription } from './NameAndDescription.js';\n\n/**\n * The base application command option builder that contains common symbols for application command builders.\n */\nexport abstract class ApplicationCommandOptionBase extends SharedNameAndDescription {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic abstract readonly type: ApplicationCommandOptionType;\n\n\t/**\n\t * Whether this option is required.\n\t *\n\t * @defaultValue `false`\n\t */\n\tpublic readonly required: boolean = false;\n\n\t/**\n\t * Sets whether this option is required.\n\t *\n\t * @param required - Whether this option should be required\n\t */\n\tpublic setRequired(required: boolean) {\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(required);\n\n\t\tReflect.set(this, 'required', required);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic abstract toJSON(): APIApplicationCommandBasicOption;\n\n\t/**\n\t * This method runs required validators on this builder.\n\t */\n\tprotected runRequiredValidations() {\n\t\tvalidateRequiredParameters(this.name, this.description, []);\n\n\t\t// Validate localizations\n\t\tvalidateLocalizationMap(this.name_localizations);\n\t\tvalidateLocalizationMap(this.description_localizations);\n\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(this.required);\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandBooleanOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command boolean option.\n */\nexport class SlashCommandBooleanOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Boolean as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandBooleanOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandChannelOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionChannelTypesMixin } from '../mixins/ApplicationCommandOptionChannelTypesMixin.js';\n\n/**\n * A slash command channel option.\n */\n@mix(ApplicationCommandOptionChannelTypesMixin)\nexport class SlashCommandChannelOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Channel as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandChannelOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandChannelOption extends ApplicationCommandOptionChannelTypesMixin {}\n","import { s } from '@sapphire/shapeshift';\nimport { ChannelType } from 'discord-api-types/v10';\n\n/**\n * The allowed channel types used for a channel option in a slash command builder.\n *\n * @privateRemarks This can't be dynamic because const enums are erased at runtime.\n * @internal\n */\nconst allowedChannelTypes = [\n\tChannelType.GuildText,\n\tChannelType.GuildVoice,\n\tChannelType.GuildCategory,\n\tChannelType.GuildAnnouncement,\n\tChannelType.AnnouncementThread,\n\tChannelType.PublicThread,\n\tChannelType.PrivateThread,\n\tChannelType.GuildStageVoice,\n\tChannelType.GuildForum,\n] as const;\n\n/**\n * The type of allowed channel types used for a channel option.\n */\nexport type ApplicationCommandOptionAllowedChannelTypes = (typeof allowedChannelTypes)[number];\n\nconst channelTypesPredicate = s.array(s.union(...allowedChannelTypes.map((type) => s.literal(type))));\n\n/**\n * This mixin holds channel type symbols used for options.\n */\nexport class ApplicationCommandOptionChannelTypesMixin {\n\t/**\n\t * The channel types of this option.\n\t */\n\tpublic readonly channel_types?: ApplicationCommandOptionAllowedChannelTypes[];\n\n\t/**\n\t * Adds channel types to this option.\n\t *\n\t * @param channelTypes - The channel types\n\t */\n\tpublic addChannelTypes(...channelTypes: ApplicationCommandOptionAllowedChannelTypes[]) {\n\t\tif (this.channel_types === undefined) {\n\t\t\tReflect.set(this, 'channel_types', []);\n\t\t}\n\n\t\tthis.channel_types!.push(...channelTypesPredicate.parse(channelTypes));\n\n\t\treturn this;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandIntegerOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithChoicesAndAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.js';\n\nconst numberValidator = s.number.int;\n\n/**\n * A slash command integer option.\n */\n@mix(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)\nexport class SlashCommandIntegerOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Integer as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandIntegerOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandIntegerOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesAndAutocompleteMixin {}\n","/**\n * This mixin holds minimum and maximum symbols used for options.\n */\nexport abstract class ApplicationCommandNumericOptionMinMaxValueMixin {\n\t/**\n\t * The maximum value of this option.\n\t */\n\tpublic readonly max_value?: number;\n\n\t/**\n\t * The minimum value of this option.\n\t */\n\tpublic readonly min_value?: number;\n\n\t/**\n\t * Sets the maximum number value of this option.\n\t *\n\t * @param max - The maximum value this option can be\n\t */\n\tpublic abstract setMaxValue(max: number): this;\n\n\t/**\n\t * Sets the minimum number value of this option.\n\t *\n\t * @param min - The minimum value this option can be\n\t */\n\tpublic abstract setMinValue(min: number): this;\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandOptionChoice } from 'discord-api-types/v10';\nimport { localizationMapPredicate, validateChoicesLength } from '../Assertions.js';\n\nconst stringPredicate = s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100);\nconst numberPredicate = s.number.greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY);\nconst choicesPredicate = s.object({\n\tname: stringPredicate,\n\tname_localizations: localizationMapPredicate,\n\tvalue: s.union(stringPredicate, numberPredicate),\n}).array;\nconst booleanPredicate = s.boolean;\n\n/**\n * This mixin holds choices and autocomplete symbols used for options.\n */\nexport class ApplicationCommandOptionWithChoicesAndAutocompleteMixin {\n\t/**\n\t * The choices of this option.\n\t */\n\tpublic readonly choices?: APIApplicationCommandOptionChoice[];\n\n\t/**\n\t * Whether this option utilizes autocomplete.\n\t */\n\tpublic readonly autocomplete?: boolean;\n\n\t/**\n\t * The type of this option.\n\t *\n\t * @privateRemarks Since this is present and this is a mixin, this is needed.\n\t */\n\tpublic readonly type!: ApplicationCommandOptionType;\n\n\t/**\n\t * Adds multiple choices to this option.\n\t *\n\t * @param choices - The choices to add\n\t */\n\tpublic addChoices(...choices: APIApplicationCommandOptionChoice[]): this {\n\t\tif (choices.length > 0 && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(choices);\n\n\t\tif (this.choices === undefined) {\n\t\t\tReflect.set(this, 'choices', []);\n\t\t}\n\n\t\tvalidateChoicesLength(choices.length, this.choices);\n\n\t\tfor (const { name, name_localizations, value } of choices) {\n\t\t\t// Validate the value\n\t\t\tif (this.type === ApplicationCommandOptionType.String) {\n\t\t\t\tstringPredicate.parse(value);\n\t\t\t} else {\n\t\t\t\tnumberPredicate.parse(value);\n\t\t\t}\n\n\t\t\tthis.choices!.push({ name, name_localizations, value });\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets multiple choices for this option.\n\t *\n\t * @param choices - The choices to set\n\t */\n\tpublic setChoices[]>(...choices: Input): this {\n\t\tif (choices.length > 0 && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(choices);\n\n\t\tReflect.set(this, 'choices', []);\n\t\tthis.addChoices(...choices);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Whether this option uses autocomplete.\n\t *\n\t * @param autocomplete - Whether this option should use autocomplete\n\t */\n\tpublic setAutocomplete(autocomplete: boolean): this {\n\t\t// Assert that you actually passed a boolean\n\t\tbooleanPredicate.parse(autocomplete);\n\n\t\tif (autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tReflect.set(this, 'autocomplete', autocomplete);\n\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandMentionableOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command mentionable option.\n */\nexport class SlashCommandMentionableOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Mentionable as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandMentionableOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandNumberOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithChoicesAndAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.js';\n\nconst numberValidator = s.number;\n\n/**\n * A slash command number option.\n */\n@mix(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)\nexport class SlashCommandNumberOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Number as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandNumberOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandNumberOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesAndAutocompleteMixin {}\n","import { ApplicationCommandOptionType, type APIApplicationCommandRoleOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command role option.\n */\nexport class SlashCommandRoleOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Role as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandRoleOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandStringOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithChoicesAndAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.js';\n\nconst minLengthValidator = s.number.greaterThanOrEqual(0).lessThanOrEqual(6_000);\nconst maxLengthValidator = s.number.greaterThanOrEqual(1).lessThanOrEqual(6_000);\n\n/**\n * A slash command string option.\n */\n@mix(ApplicationCommandOptionWithChoicesAndAutocompleteMixin)\nexport class SlashCommandStringOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.String as const;\n\n\t/**\n\t * The maximum length of this option.\n\t */\n\tpublic readonly max_length?: number;\n\n\t/**\n\t * The minimum length of this option.\n\t */\n\tpublic readonly min_length?: number;\n\n\t/**\n\t * Sets the maximum length of this string option.\n\t *\n\t * @param max - The maximum length this option can be\n\t */\n\tpublic setMaxLength(max: number): this {\n\t\tmaxLengthValidator.parse(max);\n\n\t\tReflect.set(this, 'max_length', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of this string option.\n\t *\n\t * @param min - The minimum length this option can be\n\t */\n\tpublic setMinLength(min: number): this {\n\t\tminLengthValidator.parse(min);\n\n\t\tReflect.set(this, 'min_length', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandStringOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandStringOption extends ApplicationCommandOptionWithChoicesAndAutocompleteMixin {}\n","import { ApplicationCommandOptionType, type APIApplicationCommandUserOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command user option.\n */\nexport class SlashCommandUserOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.User as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandUserOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { assertReturnOfBuilder, validateMaxOptionsLength } from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';\nimport { SlashCommandAttachmentOption } from '../options/attachment.js';\nimport { SlashCommandBooleanOption } from '../options/boolean.js';\nimport { SlashCommandChannelOption } from '../options/channel.js';\nimport { SlashCommandIntegerOption } from '../options/integer.js';\nimport { SlashCommandMentionableOption } from '../options/mentionable.js';\nimport { SlashCommandNumberOption } from '../options/number.js';\nimport { SlashCommandRoleOption } from '../options/role.js';\nimport { SlashCommandStringOption } from '../options/string.js';\nimport { SlashCommandUserOption } from '../options/user.js';\nimport type { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * This mixin holds symbols that can be shared in slash command options.\n *\n * @typeParam ShouldOmitSubcommandFunctions - Whether to omit subcommand functions.\n */\nexport class SharedSlashCommandOptions {\n\tpublic readonly options!: ToAPIApplicationCommandOptions[];\n\n\t/**\n\t * Adds a boolean option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addBooleanOption(\n\t\tinput: SlashCommandBooleanOption | ((builder: SlashCommandBooleanOption) => SlashCommandBooleanOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandBooleanOption);\n\t}\n\n\t/**\n\t * Adds a user option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandUserOption);\n\t}\n\n\t/**\n\t * Adds a channel option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addChannelOption(\n\t\tinput: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandChannelOption);\n\t}\n\n\t/**\n\t * Adds a role option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandRoleOption);\n\t}\n\n\t/**\n\t * Adds an attachment option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addAttachmentOption(\n\t\tinput: SlashCommandAttachmentOption | ((builder: SlashCommandAttachmentOption) => SlashCommandAttachmentOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandAttachmentOption);\n\t}\n\n\t/**\n\t * Adds a mentionable option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addMentionableOption(\n\t\tinput: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandMentionableOption);\n\t}\n\n\t/**\n\t * Adds a string option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addStringOption(\n\t\tinput:\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| SlashCommandStringOption\n\t\t\t| ((\n\t\t\t\t\tbuilder: SlashCommandStringOption,\n\t\t\t ) =>\n\t\t\t\t\t| Omit\n\t\t\t\t\t| Omit\n\t\t\t\t\t| SlashCommandStringOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandStringOption);\n\t}\n\n\t/**\n\t * Adds an integer option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addIntegerOption(\n\t\tinput:\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| SlashCommandIntegerOption\n\t\t\t| ((\n\t\t\t\t\tbuilder: SlashCommandIntegerOption,\n\t\t\t ) =>\n\t\t\t\t\t| Omit\n\t\t\t\t\t| Omit\n\t\t\t\t\t| SlashCommandIntegerOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandIntegerOption);\n\t}\n\n\t/**\n\t * Adds a number option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addNumberOption(\n\t\tinput:\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| SlashCommandNumberOption\n\t\t\t| ((\n\t\t\t\t\tbuilder: SlashCommandNumberOption,\n\t\t\t ) =>\n\t\t\t\t\t| Omit\n\t\t\t\t\t| Omit\n\t\t\t\t\t| SlashCommandNumberOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandNumberOption);\n\t}\n\n\t/**\n\t * Where the actual adding magic happens. ✨\n\t *\n\t * @param input - The input. What else?\n\t * @param Instance - The instance of whatever is being added\n\t * @internal\n\t */\n\tprivate _sharedAddOptionMethod(\n\t\tinput:\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| T\n\t\t\t| ((builder: T) => Omit | Omit | T),\n\t\tInstance: new () => T,\n\t): ShouldOmitSubcommandFunctions extends true ? Omit : this {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new Instance()) : input;\n\n\t\tassertReturnOfBuilder(result, Instance);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandType } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport type { ContextMenuCommandType } from './ContextMenuCommandBuilder.js';\n\nconst namePredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(32)\n\t// eslint-disable-next-line prefer-named-capture-group, unicorn/no-unsafe-regex\n\t.regex(/^( *[\\p{P}\\p{L}\\p{N}\\p{sc=Devanagari}\\p{sc=Thai}]+ *)+$/u)\n\t.setValidationEnabled(isValidationEnabled);\nconst typePredicate = s\n\t.union(s.literal(ApplicationCommandType.User), s.literal(ApplicationCommandType.Message))\n\t.setValidationEnabled(isValidationEnabled);\nconst booleanPredicate = s.boolean;\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nexport function validateType(type: unknown): asserts type is ContextMenuCommandType {\n\ttypePredicate.parse(type);\n}\n\nexport function validateRequiredParameters(name: string, type: number) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert type is valid\n\tvalidateType(type);\n}\n\nconst dmPermissionPredicate = s.boolean.nullish;\n\nexport function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {\n\tdmPermissionPredicate.parse(value);\n}\n\nconst memberPermissionPredicate = s.union(\n\ts.bigint.transform((value) => value.toString()),\n\ts.number.safeInt.transform((value) => value.toString()),\n\ts.string.regex(/^\\d+$/),\n).nullish;\n\nexport function validateDefaultMemberPermissions(permissions: unknown) {\n\treturn memberPermissionPredicate.parse(permissions);\n}\n","import type {\n\tApplicationCommandType,\n\tLocaleString,\n\tLocalizationMap,\n\tPermissions,\n\tRESTPostAPIContextMenuApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport { validateLocale, validateLocalizationMap } from '../slashCommands/Assertions.js';\nimport {\n\tvalidateRequiredParameters,\n\tvalidateName,\n\tvalidateType,\n\tvalidateDefaultPermission,\n\tvalidateDefaultMemberPermissions,\n\tvalidateDMPermission,\n} from './Assertions.js';\n\n/**\n * The type a context menu command can be.\n */\nexport type ContextMenuCommandType = ApplicationCommandType.Message | ApplicationCommandType.User;\n\n/**\n * A builder that creates API-compatible JSON data for context menu commands.\n */\nexport class ContextMenuCommandBuilder {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The type of this command.\n\t */\n\tpublic readonly type: ContextMenuCommandType = undefined!;\n\n\t/**\n\t * Whether this command is enabled by default when the application is added to a guild.\n\t *\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The set of permissions represented as a bit set for the command.\n\t */\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * Indicates whether the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This property is only for global commands.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\t/**\n\t * Sets the name of this command.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string) {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the type of this command.\n\t *\n\t * @param type - The type to use\n\t */\n\tpublic setType(type: ContextMenuCommandType) {\n\t\t// Assert the type is valid\n\t\tvalidateType(type);\n\n\t\tReflect.set(this, 'type', type);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * @remarks\n\t * If set to `false`, you will have to later `PUT` the permissions for this command.\n\t * @param value - Whether to enable this command by default\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'default_permission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run this command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined) {\n\t\t// Assert the value and parse it\n\t\tconst permissionValue = validateDefaultMemberPermissions(permissions);\n\n\t\tReflect.set(this, 'default_member_permissions', permissionValue);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets if the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This method is only for global commands.\n\t * @param enabled - Whether the command should be enabled in direct messages\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDMPermission(enabled: boolean | null | undefined) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDMPermission(enabled);\n\n\t\tReflect.set(this, 'dm_permission', enabled);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a name localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedName - The localized name for the given `locale`\n\t */\n\tpublic setNameLocalization(locale: LocaleString, localizedName: string | null) {\n\t\tif (!this.name_localizations) {\n\t\t\tReflect.set(this, 'name_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedName === null) {\n\t\t\tthis.name_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateName(localizedName);\n\n\t\tthis.name_localizations![parsedLocale] = localizedName;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations for this command.\n\t *\n\t * @param localizedNames - The object of localized names to set\n\t */\n\tpublic setNameLocalizations(localizedNames: LocalizationMap | null) {\n\t\tif (localizedNames === null) {\n\t\t\tReflect.set(this, 'name_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'name_localizations', {});\n\n\t\tfor (const args of Object.entries(localizedNames))\n\t\t\tthis.setNameLocalization(...(args as [LocaleString, string | null]));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.type);\n\n\t\tvalidateLocalizationMap(this.name_localizations);\n\n\t\treturn { ...this };\n\t}\n}\n","import type { APIEmbed } from 'discord-api-types/v10';\n\n/**\n * Calculates the length of the embed.\n *\n * @param data - The embed data to check\n */\nexport function embedLength(data: APIEmbed) {\n\treturn (\n\t\t(data.title?.length ?? 0) +\n\t\t(data.description?.length ?? 0) +\n\t\t(data.fields?.reduce((prev, curr) => prev + curr.name.length + curr.value.length, 0) ?? 0) +\n\t\t(data.footer?.text.length ?? 0) +\n\t\t(data.author?.name.length ?? 0)\n\t);\n}\n"],"mappings":"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","names":["Assertions_exports","Assertions_exports","import_shapeshift","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","Assertions_exports","placeholderValidator","import_shapeshift","import_v10","placeholderValidator","placeholderValidator","isEqual","Assertions_exports","validateRequiredParameters","import_shapeshift","validateRequiredParameters","validateRequiredParameters","Assertions_exports","validateRequiredParameters","import_shapeshift","import_v10","descriptionPredicate","validateRequiredParameters","import_ts_mixer","import_v10","import_ts_mixer","import_v10","validateRequiredParameters","import_v10","import_v10","import_shapeshift","import_v10","import_shapeshift","import_v10","import_ts_mixer","import_shapeshift","import_v10","booleanPredicate","import_v10","import_shapeshift","import_v10","import_ts_mixer","numberValidator","import_v10","import_shapeshift","import_v10","import_ts_mixer","minLengthValidator","maxLengthValidator","import_v10","validateRequiredParameters","validateRequiredParameters","Assertions_exports","validateDMPermission","validateDefaultMemberPermissions","validateDefaultPermission","validateName","validateRequiredParameters","import_shapeshift","import_v10","namePredicate","booleanPredicate","validateDefaultPermission","validateName","validateRequiredParameters","dmPermissionPredicate","validateDMPermission","memberPermissionPredicate","validateDefaultMemberPermissions","validateName","validateDefaultPermission","validateDefaultMemberPermissions","validateDMPermission","validateRequiredParameters"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/index.mjs b/node_modules/@discordjs/builders/dist/index.mjs
deleted file mode 100644
index 2f32e8d..0000000
--- a/node_modules/@discordjs/builders/dist/index.mjs
+++ /dev/null
@@ -1,2490 +0,0 @@
-var __defProp = Object.defineProperty;
-var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
-var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
-var __export = (target, all) => {
- for (var name in all)
- __defProp(target, name, { get: all[name], enumerable: true });
-};
-var __decorateClass = (decorators, target, key, kind) => {
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
- if (decorator = decorators[i])
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
- if (kind && result)
- __defProp(target, key, result);
- return result;
-};
-
-// src/messages/embed/Assertions.ts
-var Assertions_exports = {};
-__export(Assertions_exports, {
- RGBPredicate: () => RGBPredicate,
- authorNamePredicate: () => authorNamePredicate,
- colorPredicate: () => colorPredicate,
- descriptionPredicate: () => descriptionPredicate,
- embedAuthorPredicate: () => embedAuthorPredicate,
- embedFieldPredicate: () => embedFieldPredicate,
- embedFieldsArrayPredicate: () => embedFieldsArrayPredicate,
- embedFooterPredicate: () => embedFooterPredicate,
- fieldInlinePredicate: () => fieldInlinePredicate,
- fieldLengthPredicate: () => fieldLengthPredicate,
- fieldNamePredicate: () => fieldNamePredicate,
- fieldValuePredicate: () => fieldValuePredicate,
- footerTextPredicate: () => footerTextPredicate,
- imageURLPredicate: () => imageURLPredicate,
- timestampPredicate: () => timestampPredicate,
- titlePredicate: () => titlePredicate,
- urlPredicate: () => urlPredicate,
- validateFieldLength: () => validateFieldLength
-});
-import { s } from "@sapphire/shapeshift";
-
-// src/util/validation.ts
-var validate = true;
-function enableValidators() {
- return validate = true;
-}
-__name(enableValidators, "enableValidators");
-function disableValidators() {
- return validate = false;
-}
-__name(disableValidators, "disableValidators");
-function isValidationEnabled() {
- return validate;
-}
-__name(isValidationEnabled, "isValidationEnabled");
-
-// src/messages/embed/Assertions.ts
-var fieldNamePredicate = s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(256).setValidationEnabled(isValidationEnabled);
-var fieldValuePredicate = s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(1024).setValidationEnabled(isValidationEnabled);
-var fieldInlinePredicate = s.boolean.optional;
-var embedFieldPredicate = s.object({
- name: fieldNamePredicate,
- value: fieldValuePredicate,
- inline: fieldInlinePredicate
-}).setValidationEnabled(isValidationEnabled);
-var embedFieldsArrayPredicate = embedFieldPredicate.array.setValidationEnabled(isValidationEnabled);
-var fieldLengthPredicate = s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateFieldLength(amountAdding, fields) {
- fieldLengthPredicate.parse((fields?.length ?? 0) + amountAdding);
-}
-__name(validateFieldLength, "validateFieldLength");
-var authorNamePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);
-var imageURLPredicate = s.string.url({
- allowedProtocols: ["http:", "https:", "attachment:"]
-}).nullish.setValidationEnabled(isValidationEnabled);
-var urlPredicate = s.string.url({
- allowedProtocols: ["http:", "https:"]
-}).nullish.setValidationEnabled(isValidationEnabled);
-var embedAuthorPredicate = s.object({
- name: authorNamePredicate,
- iconURL: imageURLPredicate,
- url: urlPredicate
-}).setValidationEnabled(isValidationEnabled);
-var RGBPredicate = s.number.int.greaterThanOrEqual(0).lessThanOrEqual(255).setValidationEnabled(isValidationEnabled);
-var colorPredicate = s.number.int.greaterThanOrEqual(0).lessThanOrEqual(16777215).or(s.tuple([RGBPredicate, RGBPredicate, RGBPredicate])).nullable.setValidationEnabled(isValidationEnabled);
-var descriptionPredicate = s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(4096).nullable.setValidationEnabled(isValidationEnabled);
-var footerTextPredicate = s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(2048).nullable.setValidationEnabled(isValidationEnabled);
-var embedFooterPredicate = s.object({
- text: footerTextPredicate,
- iconURL: imageURLPredicate
-}).setValidationEnabled(isValidationEnabled);
-var timestampPredicate = s.union(s.number, s.date).nullable.setValidationEnabled(isValidationEnabled);
-var titlePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);
-
-// src/util/normalizeArray.ts
-function normalizeArray(arr) {
- if (Array.isArray(arr[0]))
- return arr[0];
- return arr;
-}
-__name(normalizeArray, "normalizeArray");
-
-// src/messages/embed/Embed.ts
-var EmbedBuilder = class {
- /**
- * The API data associated with this embed.
- */
- data;
- /**
- * Creates a new embed from API data.
- *
- * @param data - The API data to create this embed with
- */
- constructor(data = {}) {
- this.data = { ...data };
- if (data.timestamp)
- this.data.timestamp = new Date(data.timestamp).toISOString();
- }
- /**
- * Appends fields to the embed.
- *
- * @remarks
- * This method accepts either an array of fields or a variable number of field parameters.
- * The maximum amount of fields that can be added is 25.
- * @example
- * Using an array:
- * ```ts
- * const fields: APIEmbedField[] = ...;
- * const embed = new EmbedBuilder()
- * .addFields(fields);
- * ```
- * @example
- * Using rest parameters (variadic):
- * ```ts
- * const embed = new EmbedBuilder()
- * .addFields(
- * { name: 'Field 1', value: 'Value 1' },
- * { name: 'Field 2', value: 'Value 2' },
- * );
- * ```
- * @param fields - The fields to add
- */
- addFields(...fields) {
- const normalizedFields = normalizeArray(fields);
- validateFieldLength(normalizedFields.length, this.data.fields);
- embedFieldsArrayPredicate.parse(normalizedFields);
- if (this.data.fields)
- this.data.fields.push(...normalizedFields);
- else
- this.data.fields = normalizedFields;
- return this;
- }
- /**
- * Removes, replaces, or inserts fields for this embed.
- *
- * @remarks
- * This method behaves similarly
- * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.
- * The maximum amount of fields that can be added is 25.
- *
- * It's useful for modifying and adjusting order of the already-existing fields of an embed.
- * @example
- * Remove the first field:
- * ```ts
- * embed.spliceFields(0, 1);
- * ```
- * @example
- * Remove the first n fields:
- * ```ts
- * const n = 4;
- * embed.spliceFields(0, n);
- * ```
- * @example
- * Remove the last field:
- * ```ts
- * embed.spliceFields(-1, 1);
- * ```
- * @param index - The index to start at
- * @param deleteCount - The number of fields to remove
- * @param fields - The replacing field objects
- */
- spliceFields(index, deleteCount, ...fields) {
- validateFieldLength(fields.length - deleteCount, this.data.fields);
- embedFieldsArrayPredicate.parse(fields);
- if (this.data.fields)
- this.data.fields.splice(index, deleteCount, ...fields);
- else
- this.data.fields = fields;
- return this;
- }
- /**
- * Sets the fields for this embed.
- *
- * @remarks
- * This method is an alias for {@link EmbedBuilder.spliceFields}. More specifically,
- * it splices the entire array of fields, replacing them with the provided fields.
- *
- * You can set a maximum of 25 fields.
- * @param fields - The fields to set
- */
- setFields(...fields) {
- this.spliceFields(0, this.data.fields?.length ?? 0, ...normalizeArray(fields));
- return this;
- }
- /**
- * Sets the author of this embed.
- *
- * @param options - The options to use
- */
- setAuthor(options) {
- if (options === null) {
- this.data.author = void 0;
- return this;
- }
- embedAuthorPredicate.parse(options);
- this.data.author = { name: options.name, url: options.url, icon_url: options.iconURL };
- return this;
- }
- /**
- * Sets the color of this embed.
- *
- * @param color - The color to use
- */
- setColor(color) {
- colorPredicate.parse(color);
- if (Array.isArray(color)) {
- const [red, green, blue] = color;
- this.data.color = (red << 16) + (green << 8) + blue;
- return this;
- }
- this.data.color = color ?? void 0;
- return this;
- }
- /**
- * Sets the description of this embed.
- *
- * @param description - The description to use
- */
- setDescription(description) {
- descriptionPredicate.parse(description);
- this.data.description = description ?? void 0;
- return this;
- }
- /**
- * Sets the footer of this embed.
- *
- * @param options - The footer to use
- */
- setFooter(options) {
- if (options === null) {
- this.data.footer = void 0;
- return this;
- }
- embedFooterPredicate.parse(options);
- this.data.footer = { text: options.text, icon_url: options.iconURL };
- return this;
- }
- /**
- * Sets the image of this embed.
- *
- * @param url - The image URL to use
- */
- setImage(url) {
- imageURLPredicate.parse(url);
- this.data.image = url ? { url } : void 0;
- return this;
- }
- /**
- * Sets the thumbnail of this embed.
- *
- * @param url - The thumbnail URL to use
- */
- setThumbnail(url) {
- imageURLPredicate.parse(url);
- this.data.thumbnail = url ? { url } : void 0;
- return this;
- }
- /**
- * Sets the timestamp of this embed.
- *
- * @param timestamp - The timestamp or date to use
- */
- setTimestamp(timestamp = Date.now()) {
- timestampPredicate.parse(timestamp);
- this.data.timestamp = timestamp ? new Date(timestamp).toISOString() : void 0;
- return this;
- }
- /**
- * Sets the title for this embed.
- *
- * @param title - The title to use
- */
- setTitle(title) {
- titlePredicate.parse(title);
- this.data.title = title ?? void 0;
- return this;
- }
- /**
- * Sets the URL of this embed.
- *
- * @param url - The URL to use
- */
- setURL(url) {
- urlPredicate.parse(url);
- this.data.url = url ?? void 0;
- return this;
- }
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- return { ...this.data };
- }
-};
-__name(EmbedBuilder, "EmbedBuilder");
-
-// src/index.ts
-export * from "@discordjs/formatters";
-
-// src/components/Assertions.ts
-var Assertions_exports2 = {};
-__export(Assertions_exports2, {
- buttonLabelValidator: () => buttonLabelValidator,
- buttonStyleValidator: () => buttonStyleValidator,
- channelTypesValidator: () => channelTypesValidator,
- customIdValidator: () => customIdValidator,
- defaultValidator: () => defaultValidator,
- disabledValidator: () => disabledValidator,
- emojiValidator: () => emojiValidator,
- jsonOptionValidator: () => jsonOptionValidator,
- labelValueDescriptionValidator: () => labelValueDescriptionValidator,
- minMaxValidator: () => minMaxValidator,
- optionValidator: () => optionValidator,
- optionsLengthValidator: () => optionsLengthValidator,
- optionsValidator: () => optionsValidator,
- placeholderValidator: () => placeholderValidator,
- urlValidator: () => urlValidator,
- validateRequiredButtonParameters: () => validateRequiredButtonParameters,
- validateRequiredSelectMenuOptionParameters: () => validateRequiredSelectMenuOptionParameters,
- validateRequiredSelectMenuParameters: () => validateRequiredSelectMenuParameters
-});
-import { s as s2 } from "@sapphire/shapeshift";
-import { ButtonStyle, ChannelType } from "discord-api-types/v10";
-
-// src/components/selectMenu/StringSelectMenuOption.ts
-var StringSelectMenuOptionBuilder = class {
- /**
- * Creates a new string select menu option from API data.
- *
- * @param data - The API data to create this string select menu option with
- * @example
- * Creating a string select menu option from an API data object:
- * ```ts
- * const selectMenuOption = new SelectMenuOptionBuilder({
- * label: 'catchy label',
- * value: '1',
- * });
- * ```
- * @example
- * Creating a string select menu option using setters and API data:
- * ```ts
- * const selectMenuOption = new SelectMenuOptionBuilder({
- * default: true,
- * value: '1',
- * })
- * .setLabel('woah');
- * ```
- */
- constructor(data = {}) {
- this.data = data;
- }
- /**
- * Sets the label for this option.
- *
- * @param label - The label to use
- */
- setLabel(label) {
- this.data.label = labelValueDescriptionValidator.parse(label);
- return this;
- }
- /**
- * Sets the value for this option.
- *
- * @param value - The value to use
- */
- setValue(value) {
- this.data.value = labelValueDescriptionValidator.parse(value);
- return this;
- }
- /**
- * Sets the description for this option.
- *
- * @param description - The description to use
- */
- setDescription(description) {
- this.data.description = labelValueDescriptionValidator.parse(description);
- return this;
- }
- /**
- * Sets whether this option is selected by default.
- *
- * @param isDefault - Whether this option is selected by default
- */
- setDefault(isDefault = true) {
- this.data.default = defaultValidator.parse(isDefault);
- return this;
- }
- /**
- * Sets the emoji to display for this option.
- *
- * @param emoji - The emoji to use
- */
- setEmoji(emoji) {
- this.data.emoji = emojiValidator.parse(emoji);
- return this;
- }
- /**
- * {@inheritDoc BaseSelectMenuBuilder.toJSON}
- */
- toJSON() {
- validateRequiredSelectMenuOptionParameters(this.data.label, this.data.value);
- return {
- ...this.data
- };
- }
-};
-__name(StringSelectMenuOptionBuilder, "StringSelectMenuOptionBuilder");
-
-// src/components/Assertions.ts
-var customIdValidator = s2.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var emojiValidator = s2.object({
- id: s2.string,
- name: s2.string,
- animated: s2.boolean
-}).partial.strict.setValidationEnabled(isValidationEnabled);
-var disabledValidator = s2.boolean;
-var buttonLabelValidator = s2.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(80).setValidationEnabled(isValidationEnabled);
-var buttonStyleValidator = s2.nativeEnum(ButtonStyle);
-var placeholderValidator = s2.string.lengthLessThanOrEqual(150).setValidationEnabled(isValidationEnabled);
-var minMaxValidator = s2.number.int.greaterThanOrEqual(0).lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-var labelValueDescriptionValidator = s2.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var jsonOptionValidator = s2.object({
- label: labelValueDescriptionValidator,
- value: labelValueDescriptionValidator,
- description: labelValueDescriptionValidator.optional,
- emoji: emojiValidator.optional,
- default: s2.boolean.optional
-}).setValidationEnabled(isValidationEnabled);
-var optionValidator = s2.instance(StringSelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled);
-var optionsValidator = optionValidator.array.lengthGreaterThanOrEqual(0).setValidationEnabled(isValidationEnabled);
-var optionsLengthValidator = s2.number.int.greaterThanOrEqual(0).lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateRequiredSelectMenuParameters(options, customId) {
- customIdValidator.parse(customId);
- optionsValidator.parse(options);
-}
-__name(validateRequiredSelectMenuParameters, "validateRequiredSelectMenuParameters");
-var defaultValidator = s2.boolean;
-function validateRequiredSelectMenuOptionParameters(label, value) {
- labelValueDescriptionValidator.parse(label);
- labelValueDescriptionValidator.parse(value);
-}
-__name(validateRequiredSelectMenuOptionParameters, "validateRequiredSelectMenuOptionParameters");
-var channelTypesValidator = s2.nativeEnum(ChannelType).array.setValidationEnabled(isValidationEnabled);
-var urlValidator = s2.string.url({
- allowedProtocols: ["http:", "https:", "discord:"]
-}).setValidationEnabled(isValidationEnabled);
-function validateRequiredButtonParameters(style, label, emoji, customId, url) {
- if (url && customId) {
- throw new RangeError("URL and custom id are mutually exclusive");
- }
- if (!label && !emoji) {
- throw new RangeError("Buttons must have a label and/or an emoji");
- }
- if (style === ButtonStyle.Link) {
- if (!url) {
- throw new RangeError("Link buttons must have a url");
- }
- } else if (url) {
- throw new RangeError("Non-link buttons cannot have a url");
- }
-}
-__name(validateRequiredButtonParameters, "validateRequiredButtonParameters");
-
-// src/components/ActionRow.ts
-import {
- ComponentType as ComponentType9
-} from "discord-api-types/v10";
-
-// src/components/Component.ts
-var ComponentBuilder = class {
- /**
- * The API data associated with this component.
- */
- data;
- /**
- * Constructs a new kind of component.
- *
- * @param data - The data to construct a component out of
- */
- constructor(data) {
- this.data = data;
- }
-};
-__name(ComponentBuilder, "ComponentBuilder");
-
-// src/components/Components.ts
-import { ComponentType as ComponentType8 } from "discord-api-types/v10";
-
-// src/components/button/Button.ts
-import {
- ComponentType
-} from "discord-api-types/v10";
-var ButtonBuilder = class extends ComponentBuilder {
- /**
- * Creates a new button from API data.
- *
- * @param data - The API data to create this button with
- * @example
- * Creating a button from an API data object:
- * ```ts
- * const button = new ButtonBuilder({
- * custom_id: 'a cool button',
- * style: ButtonStyle.Primary,
- * label: 'Click Me',
- * emoji: {
- * name: 'smile',
- * id: '123456789012345678',
- * },
- * });
- * ```
- * @example
- * Creating a button using setters and API data:
- * ```ts
- * const button = new ButtonBuilder({
- * style: ButtonStyle.Secondary,
- * label: 'Click Me',
- * })
- * .setEmoji({ name: '🙂' })
- * .setCustomId('another cool button');
- * ```
- */
- constructor(data) {
- super({ type: ComponentType.Button, ...data });
- }
- /**
- * Sets the style of this button.
- *
- * @param style - The style to use
- */
- setStyle(style) {
- this.data.style = buttonStyleValidator.parse(style);
- return this;
- }
- /**
- * Sets the URL for this button.
- *
- * @remarks
- * This method is only available to buttons using the `Link` button style.
- * Only three types of URL schemes are currently supported: `https://`, `http://`, and `discord://`.
- * @param url - The URL to use
- */
- setURL(url) {
- this.data.url = urlValidator.parse(url);
- return this;
- }
- /**
- * Sets the custom id for this button.
- *
- * @remarks
- * This method is only applicable to buttons that are not using the `Link` button style.
- * @param customId - The custom id to use
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Sets the emoji to display on this button.
- *
- * @param emoji - The emoji to use
- */
- setEmoji(emoji) {
- this.data.emoji = emojiValidator.parse(emoji);
- return this;
- }
- /**
- * Sets whether this button is disabled.
- *
- * @param disabled - Whether to disable this button
- */
- setDisabled(disabled = true) {
- this.data.disabled = disabledValidator.parse(disabled);
- return this;
- }
- /**
- * Sets the label for this button.
- *
- * @param label - The label to use
- */
- setLabel(label) {
- this.data.label = buttonLabelValidator.parse(label);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredButtonParameters(
- this.data.style,
- this.data.label,
- this.data.emoji,
- this.data.custom_id,
- this.data.url
- );
- return {
- ...this.data
- };
- }
-};
-__name(ButtonBuilder, "ButtonBuilder");
-
-// src/components/selectMenu/ChannelSelectMenu.ts
-import { ComponentType as ComponentType2 } from "discord-api-types/v10";
-
-// src/components/selectMenu/BaseSelectMenu.ts
-var BaseSelectMenuBuilder = class extends ComponentBuilder {
- /**
- * Sets the placeholder for this select menu.
- *
- * @param placeholder - The placeholder to use
- */
- setPlaceholder(placeholder) {
- this.data.placeholder = placeholderValidator.parse(placeholder);
- return this;
- }
- /**
- * Sets the minimum values that must be selected in the select menu.
- *
- * @param minValues - The minimum values that must be selected
- */
- setMinValues(minValues) {
- this.data.min_values = minMaxValidator.parse(minValues);
- return this;
- }
- /**
- * Sets the maximum values that must be selected in the select menu.
- *
- * @param maxValues - The maximum values that must be selected
- */
- setMaxValues(maxValues) {
- this.data.max_values = minMaxValidator.parse(maxValues);
- return this;
- }
- /**
- * Sets the custom id for this select menu.
- *
- * @param customId - The custom id to use
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Sets whether this select menu is disabled.
- *
- * @param disabled - Whether this select menu is disabled
- */
- setDisabled(disabled = true) {
- this.data.disabled = disabledValidator.parse(disabled);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- customIdValidator.parse(this.data.custom_id);
- return {
- ...this.data
- };
- }
-};
-__name(BaseSelectMenuBuilder, "BaseSelectMenuBuilder");
-
-// src/components/selectMenu/ChannelSelectMenu.ts
-var ChannelSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new ChannelSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new ChannelSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .addChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement)
- * .setMinValues(2);
- * ```
- */
- constructor(data) {
- super({ ...data, type: ComponentType2.ChannelSelect });
- }
- /**
- * Adds channel types to this select menu.
- *
- * @param types - The channel types to use
- */
- addChannelTypes(...types) {
- const normalizedTypes = normalizeArray(types);
- this.data.channel_types ??= [];
- this.data.channel_types.push(...channelTypesValidator.parse(normalizedTypes));
- return this;
- }
- /**
- * Sets channel types for this select menu.
- *
- * @param types - The channel types to use
- */
- setChannelTypes(...types) {
- const normalizedTypes = normalizeArray(types);
- this.data.channel_types ??= [];
- this.data.channel_types.splice(0, this.data.channel_types.length, ...channelTypesValidator.parse(normalizedTypes));
- return this;
- }
- /**
- * {@inheritDoc BaseSelectMenuBuilder.toJSON}
- */
- toJSON() {
- customIdValidator.parse(this.data.custom_id);
- return {
- ...this.data
- };
- }
-};
-__name(ChannelSelectMenuBuilder, "ChannelSelectMenuBuilder");
-
-// src/components/selectMenu/MentionableSelectMenu.ts
-import { ComponentType as ComponentType3 } from "discord-api-types/v10";
-var MentionableSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new MentionableSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new MentionableSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1);
- * ```
- */
- constructor(data) {
- super({ ...data, type: ComponentType3.MentionableSelect });
- }
-};
-__name(MentionableSelectMenuBuilder, "MentionableSelectMenuBuilder");
-
-// src/components/selectMenu/RoleSelectMenu.ts
-import { ComponentType as ComponentType4 } from "discord-api-types/v10";
-var RoleSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new RoleSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new RoleSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1);
- * ```
- */
- constructor(data) {
- super({ ...data, type: ComponentType4.RoleSelect });
- }
-};
-__name(RoleSelectMenuBuilder, "RoleSelectMenuBuilder");
-
-// src/components/selectMenu/StringSelectMenu.ts
-import { ComponentType as ComponentType5 } from "discord-api-types/v10";
-var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * The options within this select menu.
- */
- options;
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new StringSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * options: [
- * { label: 'option 1', value: '1' },
- * { label: 'option 2', value: '2' },
- * { label: 'option 3', value: '3' },
- * ],
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new StringSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * .addOptions({
- * label: 'Catchy',
- * value: 'catch',
- * });
- * ```
- */
- constructor(data) {
- const { options, ...initData } = data ?? {};
- super({ ...initData, type: ComponentType5.StringSelect });
- this.options = options?.map((option) => new StringSelectMenuOptionBuilder(option)) ?? [];
- }
- /**
- * Adds options to this select menu.
- *
- * @param options - The options to add
- */
- addOptions(...options) {
- const normalizedOptions = normalizeArray(options);
- optionsLengthValidator.parse(this.options.length + normalizedOptions.length);
- this.options.push(
- ...normalizedOptions.map(
- (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption))
- )
- );
- return this;
- }
- /**
- * Sets the options for this select menu.
- *
- * @param options - The options to set
- */
- setOptions(...options) {
- return this.spliceOptions(0, this.options.length, ...options);
- }
- /**
- * Removes, replaces, or inserts options for this select menu.
- *
- * @remarks
- * This method behaves similarly
- * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice()}.
- * It's useful for modifying and adjusting the order of existing options.
- * @example
- * Remove the first option:
- * ```ts
- * selectMenu.spliceOptions(0, 1);
- * ```
- * @example
- * Remove the first n option:
- * ```ts
- * const n = 4;
- * selectMenu.spliceOptions(0, n);
- * ```
- * @example
- * Remove the last option:
- * ```ts
- * selectMenu.spliceOptions(-1, 1);
- * ```
- * @param index - The index to start at
- * @param deleteCount - The number of options to remove
- * @param options - The replacing option objects or builders
- */
- spliceOptions(index, deleteCount, ...options) {
- const normalizedOptions = normalizeArray(options);
- const clone = [...this.options];
- clone.splice(
- index,
- deleteCount,
- ...normalizedOptions.map(
- (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption))
- )
- );
- optionsLengthValidator.parse(clone.length);
- this.options.splice(0, this.options.length, ...clone);
- return this;
- }
- /**
- * {@inheritDoc BaseSelectMenuBuilder.toJSON}
- */
- toJSON() {
- validateRequiredSelectMenuParameters(this.options, this.data.custom_id);
- return {
- ...this.data,
- options: this.options.map((option) => option.toJSON())
- };
- }
-};
-__name(StringSelectMenuBuilder, "StringSelectMenuBuilder");
-
-// src/components/selectMenu/UserSelectMenu.ts
-import { ComponentType as ComponentType6 } from "discord-api-types/v10";
-var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data.
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object:
- * ```ts
- * const selectMenu = new UserSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data:
- * ```ts
- * const selectMenu = new UserSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1);
- * ```
- */
- constructor(data) {
- super({ ...data, type: ComponentType6.UserSelect });
- }
-};
-__name(UserSelectMenuBuilder, "UserSelectMenuBuilder");
-
-// src/components/textInput/TextInput.ts
-import { isJSONEncodable } from "@discordjs/util";
-import { ComponentType as ComponentType7 } from "discord-api-types/v10";
-import isEqual from "fast-deep-equal";
-
-// src/components/textInput/Assertions.ts
-var Assertions_exports3 = {};
-__export(Assertions_exports3, {
- labelValidator: () => labelValidator,
- maxLengthValidator: () => maxLengthValidator,
- minLengthValidator: () => minLengthValidator,
- placeholderValidator: () => placeholderValidator2,
- requiredValidator: () => requiredValidator,
- textInputStyleValidator: () => textInputStyleValidator,
- validateRequiredParameters: () => validateRequiredParameters,
- valueValidator: () => valueValidator
-});
-import { s as s3 } from "@sapphire/shapeshift";
-import { TextInputStyle } from "discord-api-types/v10";
-var textInputStyleValidator = s3.nativeEnum(TextInputStyle);
-var minLengthValidator = s3.number.int.greaterThanOrEqual(0).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled);
-var maxLengthValidator = s3.number.int.greaterThanOrEqual(1).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled);
-var requiredValidator = s3.boolean;
-var valueValidator = s3.string.lengthLessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled);
-var placeholderValidator2 = s3.string.lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var labelValidator = s3.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled);
-function validateRequiredParameters(customId, style, label) {
- customIdValidator.parse(customId);
- textInputStyleValidator.parse(style);
- labelValidator.parse(label);
-}
-__name(validateRequiredParameters, "validateRequiredParameters");
-
-// src/components/textInput/TextInput.ts
-var TextInputBuilder = class extends ComponentBuilder {
- /**
- * Creates a new text input from API data.
- *
- * @param data - The API data to create this text input with
- * @example
- * Creating a select menu option from an API data object:
- * ```ts
- * const textInput = new TextInputBuilder({
- * custom_id: 'a cool select menu',
- * label: 'Type something',
- * style: TextInputStyle.Short,
- * });
- * ```
- * @example
- * Creating a select menu option using setters and API data:
- * ```ts
- * const textInput = new TextInputBuilder({
- * label: 'Type something else',
- * })
- * .setCustomId('woah')
- * .setStyle(TextInputStyle.Paragraph);
- * ```
- */
- constructor(data) {
- super({ type: ComponentType7.TextInput, ...data });
- }
- /**
- * Sets the custom id for this text input.
- *
- * @param customId - The custom id to use
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Sets the label for this text input.
- *
- * @param label - The label to use
- */
- setLabel(label) {
- this.data.label = labelValidator.parse(label);
- return this;
- }
- /**
- * Sets the style for this text input.
- *
- * @param style - The style to use
- */
- setStyle(style) {
- this.data.style = textInputStyleValidator.parse(style);
- return this;
- }
- /**
- * Sets the minimum length of text for this text input.
- *
- * @param minLength - The minimum length of text for this text input
- */
- setMinLength(minLength) {
- this.data.min_length = minLengthValidator.parse(minLength);
- return this;
- }
- /**
- * Sets the maximum length of text for this text input.
- *
- * @param maxLength - The maximum length of text for this text input
- */
- setMaxLength(maxLength) {
- this.data.max_length = maxLengthValidator.parse(maxLength);
- return this;
- }
- /**
- * Sets the placeholder for this text input.
- *
- * @param placeholder - The placeholder to use
- */
- setPlaceholder(placeholder) {
- this.data.placeholder = placeholderValidator2.parse(placeholder);
- return this;
- }
- /**
- * Sets the value for this text input.
- *
- * @param value - The value to use
- */
- setValue(value) {
- this.data.value = valueValidator.parse(value);
- return this;
- }
- /**
- * Sets whether this text input is required.
- *
- * @param required - Whether this text input is required
- */
- setRequired(required = true) {
- this.data.required = requiredValidator.parse(required);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredParameters(this.data.custom_id, this.data.style, this.data.label);
- return {
- ...this.data
- };
- }
- /**
- * {@inheritDoc Equatable.equals}
- */
- equals(other) {
- if (isJSONEncodable(other)) {
- return isEqual(other.toJSON(), this.data);
- }
- return isEqual(other, this.data);
- }
-};
-__name(TextInputBuilder, "TextInputBuilder");
-
-// src/components/Components.ts
-function createComponentBuilder(data) {
- if (data instanceof ComponentBuilder) {
- return data;
- }
- switch (data.type) {
- case ComponentType8.ActionRow:
- return new ActionRowBuilder(data);
- case ComponentType8.Button:
- return new ButtonBuilder(data);
- case ComponentType8.StringSelect:
- return new StringSelectMenuBuilder(data);
- case ComponentType8.TextInput:
- return new TextInputBuilder(data);
- case ComponentType8.UserSelect:
- return new UserSelectMenuBuilder(data);
- case ComponentType8.RoleSelect:
- return new RoleSelectMenuBuilder(data);
- case ComponentType8.MentionableSelect:
- return new MentionableSelectMenuBuilder(data);
- case ComponentType8.ChannelSelect:
- return new ChannelSelectMenuBuilder(data);
- default:
- throw new Error(`Cannot properly serialize component type: ${data.type}`);
- }
-}
-__name(createComponentBuilder, "createComponentBuilder");
-
-// src/components/ActionRow.ts
-var ActionRowBuilder = class extends ComponentBuilder {
- /**
- * The components within this action row.
- */
- components;
- /**
- * Creates a new action row from API data.
- *
- * @param data - The API data to create this action row with
- * @example
- * Creating an action row from an API data object:
- * ```ts
- * const actionRow = new ActionRowBuilder({
- * components: [
- * {
- * custom_id: "custom id",
- * label: "Type something",
- * style: TextInputStyle.Short,
- * type: ComponentType.TextInput,
- * },
- * ],
- * });
- * ```
- * @example
- * Creating an action row using setters and API data:
- * ```ts
- * const actionRow = new ActionRowBuilder({
- * components: [
- * {
- * custom_id: "custom id",
- * label: "Click me",
- * style: ButtonStyle.Primary,
- * type: ComponentType.Button,
- * },
- * ],
- * })
- * .addComponents(button2, button3);
- * ```
- */
- constructor({ components, ...data } = {}) {
- super({ type: ComponentType9.ActionRow, ...data });
- this.components = components?.map((component) => createComponentBuilder(component)) ?? [];
- }
- /**
- * Adds components to this action row.
- *
- * @param components - The components to add
- */
- addComponents(...components) {
- this.components.push(...normalizeArray(components));
- return this;
- }
- /**
- * Sets components for this action row.
- *
- * @param components - The components to set
- */
- setComponents(...components) {
- this.components.splice(0, this.components.length, ...normalizeArray(components));
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- return {
- ...this.data,
- components: this.components.map((component) => component.toJSON())
- };
- }
-};
-__name(ActionRowBuilder, "ActionRowBuilder");
-
-// src/interactions/modals/Assertions.ts
-var Assertions_exports4 = {};
-__export(Assertions_exports4, {
- componentsValidator: () => componentsValidator,
- titleValidator: () => titleValidator,
- validateRequiredParameters: () => validateRequiredParameters2
-});
-import { s as s4 } from "@sapphire/shapeshift";
-var titleValidator = s4.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled);
-var componentsValidator = s4.instance(ActionRowBuilder).array.lengthGreaterThanOrEqual(1).setValidationEnabled(isValidationEnabled);
-function validateRequiredParameters2(customId, title, components) {
- customIdValidator.parse(customId);
- titleValidator.parse(title);
- componentsValidator.parse(components);
-}
-__name(validateRequiredParameters2, "validateRequiredParameters");
-
-// src/interactions/modals/Modal.ts
-var ModalBuilder = class {
- /**
- * The API data associated with this modal.
- */
- data;
- /**
- * The components within this modal.
- */
- components = [];
- /**
- * Creates a new modal from API data.
- *
- * @param data - The API data to create this modal with
- */
- constructor({ components, ...data } = {}) {
- this.data = { ...data };
- this.components = components?.map((component) => createComponentBuilder(component)) ?? [];
- }
- /**
- * Sets the title of this modal.
- *
- * @param title - The title to use
- */
- setTitle(title) {
- this.data.title = titleValidator.parse(title);
- return this;
- }
- /**
- * Sets the custom id of this modal.
- *
- * @param customId - The custom id to use
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Adds components to this modal.
- *
- * @param components - The components to add
- */
- addComponents(...components) {
- this.components.push(
- ...normalizeArray(components).map(
- (component) => component instanceof ActionRowBuilder ? component : new ActionRowBuilder(component)
- )
- );
- return this;
- }
- /**
- * Sets components for this modal.
- *
- * @param components - The components to set
- */
- setComponents(...components) {
- this.components.splice(0, this.components.length, ...normalizeArray(components));
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredParameters2(this.data.custom_id, this.data.title, this.components);
- return {
- ...this.data,
- components: this.components.map((component) => component.toJSON())
- };
- }
-};
-__name(ModalBuilder, "ModalBuilder");
-
-// src/interactions/slashCommands/Assertions.ts
-var Assertions_exports5 = {};
-__export(Assertions_exports5, {
- assertReturnOfBuilder: () => assertReturnOfBuilder,
- localizationMapPredicate: () => localizationMapPredicate,
- validateChoicesLength: () => validateChoicesLength,
- validateDMPermission: () => validateDMPermission,
- validateDefaultMemberPermissions: () => validateDefaultMemberPermissions,
- validateDefaultPermission: () => validateDefaultPermission,
- validateDescription: () => validateDescription,
- validateLocale: () => validateLocale,
- validateLocalizationMap: () => validateLocalizationMap,
- validateMaxOptionsLength: () => validateMaxOptionsLength,
- validateNSFW: () => validateNSFW,
- validateName: () => validateName,
- validateRequired: () => validateRequired,
- validateRequiredParameters: () => validateRequiredParameters3
-});
-import { s as s5 } from "@sapphire/shapeshift";
-import { Locale } from "discord-api-types/v10";
-var namePredicate = s5.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/^[\p{Ll}\p{Lm}\p{Lo}\p{N}\p{sc=Devanagari}\p{sc=Thai}_-]+$/u).setValidationEnabled(isValidationEnabled);
-function validateName(name) {
- namePredicate.parse(name);
-}
-__name(validateName, "validateName");
-var descriptionPredicate2 = s5.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var localePredicate = s5.nativeEnum(Locale);
-function validateDescription(description) {
- descriptionPredicate2.parse(description);
-}
-__name(validateDescription, "validateDescription");
-var maxArrayLengthPredicate = s5.unknown.array.lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateLocale(locale) {
- return localePredicate.parse(locale);
-}
-__name(validateLocale, "validateLocale");
-function validateMaxOptionsLength(options) {
- maxArrayLengthPredicate.parse(options);
-}
-__name(validateMaxOptionsLength, "validateMaxOptionsLength");
-function validateRequiredParameters3(name, description, options) {
- validateName(name);
- validateDescription(description);
- validateMaxOptionsLength(options);
-}
-__name(validateRequiredParameters3, "validateRequiredParameters");
-var booleanPredicate = s5.boolean;
-function validateDefaultPermission(value) {
- booleanPredicate.parse(value);
-}
-__name(validateDefaultPermission, "validateDefaultPermission");
-function validateRequired(required) {
- booleanPredicate.parse(required);
-}
-__name(validateRequired, "validateRequired");
-var choicesLengthPredicate = s5.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateChoicesLength(amountAdding, choices) {
- choicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding);
-}
-__name(validateChoicesLength, "validateChoicesLength");
-function assertReturnOfBuilder(input, ExpectedInstanceOf) {
- s5.instance(ExpectedInstanceOf).parse(input);
-}
-__name(assertReturnOfBuilder, "assertReturnOfBuilder");
-var localizationMapPredicate = s5.object(Object.fromEntries(Object.values(Locale).map((locale) => [locale, s5.string.nullish]))).strict.nullish.setValidationEnabled(isValidationEnabled);
-function validateLocalizationMap(value) {
- localizationMapPredicate.parse(value);
-}
-__name(validateLocalizationMap, "validateLocalizationMap");
-var dmPermissionPredicate = s5.boolean.nullish;
-function validateDMPermission(value) {
- dmPermissionPredicate.parse(value);
-}
-__name(validateDMPermission, "validateDMPermission");
-var memberPermissionPredicate = s5.union(
- s5.bigint.transform((value) => value.toString()),
- s5.number.safeInt.transform((value) => value.toString()),
- s5.string.regex(/^\d+$/)
-).nullish;
-function validateDefaultMemberPermissions(permissions) {
- return memberPermissionPredicate.parse(permissions);
-}
-__name(validateDefaultMemberPermissions, "validateDefaultMemberPermissions");
-function validateNSFW(value) {
- booleanPredicate.parse(value);
-}
-__name(validateNSFW, "validateNSFW");
-
-// src/interactions/slashCommands/SlashCommandBuilder.ts
-import { mix as mix6 } from "ts-mixer";
-
-// src/interactions/slashCommands/SlashCommandSubcommands.ts
-import {
- ApplicationCommandOptionType as ApplicationCommandOptionType11
-} from "discord-api-types/v10";
-import { mix as mix5 } from "ts-mixer";
-
-// src/interactions/slashCommands/mixins/NameAndDescription.ts
-var SharedNameAndDescription = class {
- /**
- * The name of this command.
- */
- name;
- /**
- * The name localizations of this command.
- */
- name_localizations;
- /**
- * The description of this command.
- */
- description;
- /**
- * The description localizations of this command.
- */
- description_localizations;
- /**
- * Sets the name of this command.
- *
- * @param name - The name to use
- */
- setName(name) {
- validateName(name);
- Reflect.set(this, "name", name);
- return this;
- }
- /**
- * Sets the description of this command.
- *
- * @param description - The description to use
- */
- setDescription(description) {
- validateDescription(description);
- Reflect.set(this, "description", description);
- return this;
- }
- /**
- * SSets a name localization for this command.
- *
- * @param locale - The locale to set
- * @param localizedName - The localized name for the given `locale`
- */
- setNameLocalization(locale, localizedName) {
- if (!this.name_localizations) {
- Reflect.set(this, "name_localizations", {});
- }
- const parsedLocale = validateLocale(locale);
- if (localizedName === null) {
- this.name_localizations[parsedLocale] = null;
- return this;
- }
- validateName(localizedName);
- this.name_localizations[parsedLocale] = localizedName;
- return this;
- }
- /**
- * Sets the name localizations for this command.
- *
- * @param localizedNames - The object of localized names to set
- */
- setNameLocalizations(localizedNames) {
- if (localizedNames === null) {
- Reflect.set(this, "name_localizations", null);
- return this;
- }
- Reflect.set(this, "name_localizations", {});
- for (const args of Object.entries(localizedNames)) {
- this.setNameLocalization(...args);
- }
- return this;
- }
- /**
- * Sets a description localization for this command.
- *
- * @param locale - The locale to set
- * @param localizedDescription - The localized description for the given locale
- */
- setDescriptionLocalization(locale, localizedDescription) {
- if (!this.description_localizations) {
- Reflect.set(this, "description_localizations", {});
- }
- const parsedLocale = validateLocale(locale);
- if (localizedDescription === null) {
- this.description_localizations[parsedLocale] = null;
- return this;
- }
- validateDescription(localizedDescription);
- this.description_localizations[parsedLocale] = localizedDescription;
- return this;
- }
- /**
- * Sets the description localizations for this command.
- *
- * @param localizedDescriptions - The object of localized descriptions to set
- */
- setDescriptionLocalizations(localizedDescriptions) {
- if (localizedDescriptions === null) {
- Reflect.set(this, "description_localizations", null);
- return this;
- }
- Reflect.set(this, "description_localizations", {});
- for (const args of Object.entries(localizedDescriptions)) {
- this.setDescriptionLocalization(...args);
- }
- return this;
- }
-};
-__name(SharedNameAndDescription, "SharedNameAndDescription");
-
-// src/interactions/slashCommands/options/attachment.ts
-import { ApplicationCommandOptionType } from "discord-api-types/v10";
-
-// src/interactions/slashCommands/mixins/ApplicationCommandOptionBase.ts
-var ApplicationCommandOptionBase = class extends SharedNameAndDescription {
- /**
- * Whether this option is required.
- *
- * @defaultValue `false`
- */
- required = false;
- /**
- * Sets whether this option is required.
- *
- * @param required - Whether this option should be required
- */
- setRequired(required) {
- validateRequired(required);
- Reflect.set(this, "required", required);
- return this;
- }
- /**
- * This method runs required validators on this builder.
- */
- runRequiredValidations() {
- validateRequiredParameters3(this.name, this.description, []);
- validateLocalizationMap(this.name_localizations);
- validateLocalizationMap(this.description_localizations);
- validateRequired(this.required);
- }
-};
-__name(ApplicationCommandOptionBase, "ApplicationCommandOptionBase");
-
-// src/interactions/slashCommands/options/attachment.ts
-var SlashCommandAttachmentOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = ApplicationCommandOptionType.Attachment;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- return { ...this };
- }
-};
-__name(SlashCommandAttachmentOption, "SlashCommandAttachmentOption");
-
-// src/interactions/slashCommands/options/boolean.ts
-import { ApplicationCommandOptionType as ApplicationCommandOptionType2 } from "discord-api-types/v10";
-var SlashCommandBooleanOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = ApplicationCommandOptionType2.Boolean;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- return { ...this };
- }
-};
-__name(SlashCommandBooleanOption, "SlashCommandBooleanOption");
-
-// src/interactions/slashCommands/options/channel.ts
-import { ApplicationCommandOptionType as ApplicationCommandOptionType3 } from "discord-api-types/v10";
-import { mix } from "ts-mixer";
-
-// src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts
-import { s as s6 } from "@sapphire/shapeshift";
-import { ChannelType as ChannelType2 } from "discord-api-types/v10";
-var allowedChannelTypes = [
- ChannelType2.GuildText,
- ChannelType2.GuildVoice,
- ChannelType2.GuildCategory,
- ChannelType2.GuildAnnouncement,
- ChannelType2.AnnouncementThread,
- ChannelType2.PublicThread,
- ChannelType2.PrivateThread,
- ChannelType2.GuildStageVoice,
- ChannelType2.GuildForum
-];
-var channelTypesPredicate = s6.array(s6.union(...allowedChannelTypes.map((type) => s6.literal(type))));
-var ApplicationCommandOptionChannelTypesMixin = class {
- /**
- * The channel types of this option.
- */
- channel_types;
- /**
- * Adds channel types to this option.
- *
- * @param channelTypes - The channel types
- */
- addChannelTypes(...channelTypes) {
- if (this.channel_types === void 0) {
- Reflect.set(this, "channel_types", []);
- }
- this.channel_types.push(...channelTypesPredicate.parse(channelTypes));
- return this;
- }
-};
-__name(ApplicationCommandOptionChannelTypesMixin, "ApplicationCommandOptionChannelTypesMixin");
-
-// src/interactions/slashCommands/options/channel.ts
-var SlashCommandChannelOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = ApplicationCommandOptionType3.Channel;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- return { ...this };
- }
-};
-__name(SlashCommandChannelOption, "SlashCommandChannelOption");
-SlashCommandChannelOption = __decorateClass([
- mix(ApplicationCommandOptionChannelTypesMixin)
-], SlashCommandChannelOption);
-
-// src/interactions/slashCommands/options/integer.ts
-import { s as s8 } from "@sapphire/shapeshift";
-import { ApplicationCommandOptionType as ApplicationCommandOptionType5 } from "discord-api-types/v10";
-import { mix as mix2 } from "ts-mixer";
-
-// src/interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts
-var ApplicationCommandNumericOptionMinMaxValueMixin = class {
- /**
- * The maximum value of this option.
- */
- max_value;
- /**
- * The minimum value of this option.
- */
- min_value;
-};
-__name(ApplicationCommandNumericOptionMinMaxValueMixin, "ApplicationCommandNumericOptionMinMaxValueMixin");
-
-// src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.ts
-import { s as s7 } from "@sapphire/shapeshift";
-import { ApplicationCommandOptionType as ApplicationCommandOptionType4 } from "discord-api-types/v10";
-var stringPredicate = s7.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100);
-var numberPredicate = s7.number.greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY);
-var choicesPredicate = s7.object({
- name: stringPredicate,
- name_localizations: localizationMapPredicate,
- value: s7.union(stringPredicate, numberPredicate)
-}).array;
-var booleanPredicate2 = s7.boolean;
-var ApplicationCommandOptionWithChoicesAndAutocompleteMixin = class {
- /**
- * The choices of this option.
- */
- choices;
- /**
- * Whether this option utilizes autocomplete.
- */
- autocomplete;
- /**
- * The type of this option.
- *
- * @privateRemarks Since this is present and this is a mixin, this is needed.
- */
- type;
- /**
- * Adds multiple choices to this option.
- *
- * @param choices - The choices to add
- */
- addChoices(...choices) {
- if (choices.length > 0 && this.autocomplete) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- choicesPredicate.parse(choices);
- if (this.choices === void 0) {
- Reflect.set(this, "choices", []);
- }
- validateChoicesLength(choices.length, this.choices);
- for (const { name, name_localizations, value } of choices) {
- if (this.type === ApplicationCommandOptionType4.String) {
- stringPredicate.parse(value);
- } else {
- numberPredicate.parse(value);
- }
- this.choices.push({ name, name_localizations, value });
- }
- return this;
- }
- /**
- * Sets multiple choices for this option.
- *
- * @param choices - The choices to set
- */
- setChoices(...choices) {
- if (choices.length > 0 && this.autocomplete) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- choicesPredicate.parse(choices);
- Reflect.set(this, "choices", []);
- this.addChoices(...choices);
- return this;
- }
- /**
- * Whether this option uses autocomplete.
- *
- * @param autocomplete - Whether this option should use autocomplete
- */
- setAutocomplete(autocomplete) {
- booleanPredicate2.parse(autocomplete);
- if (autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- Reflect.set(this, "autocomplete", autocomplete);
- return this;
- }
-};
-__name(ApplicationCommandOptionWithChoicesAndAutocompleteMixin, "ApplicationCommandOptionWithChoicesAndAutocompleteMixin");
-
-// src/interactions/slashCommands/options/integer.ts
-var numberValidator = s8.number.int;
-var SlashCommandIntegerOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = ApplicationCommandOptionType5.Integer;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}
- */
- setMaxValue(max) {
- numberValidator.parse(max);
- Reflect.set(this, "max_value", max);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}
- */
- setMinValue(min) {
- numberValidator.parse(min);
- Reflect.set(this, "min_value", min);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- return { ...this };
- }
-};
-__name(SlashCommandIntegerOption, "SlashCommandIntegerOption");
-SlashCommandIntegerOption = __decorateClass([
- mix2(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)
-], SlashCommandIntegerOption);
-
-// src/interactions/slashCommands/options/mentionable.ts
-import { ApplicationCommandOptionType as ApplicationCommandOptionType6 } from "discord-api-types/v10";
-var SlashCommandMentionableOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = ApplicationCommandOptionType6.Mentionable;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- return { ...this };
- }
-};
-__name(SlashCommandMentionableOption, "SlashCommandMentionableOption");
-
-// src/interactions/slashCommands/options/number.ts
-import { s as s9 } from "@sapphire/shapeshift";
-import { ApplicationCommandOptionType as ApplicationCommandOptionType7 } from "discord-api-types/v10";
-import { mix as mix3 } from "ts-mixer";
-var numberValidator2 = s9.number;
-var SlashCommandNumberOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = ApplicationCommandOptionType7.Number;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}
- */
- setMaxValue(max) {
- numberValidator2.parse(max);
- Reflect.set(this, "max_value", max);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}
- */
- setMinValue(min) {
- numberValidator2.parse(min);
- Reflect.set(this, "min_value", min);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- return { ...this };
- }
-};
-__name(SlashCommandNumberOption, "SlashCommandNumberOption");
-SlashCommandNumberOption = __decorateClass([
- mix3(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)
-], SlashCommandNumberOption);
-
-// src/interactions/slashCommands/options/role.ts
-import { ApplicationCommandOptionType as ApplicationCommandOptionType8 } from "discord-api-types/v10";
-var SlashCommandRoleOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = ApplicationCommandOptionType8.Role;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- return { ...this };
- }
-};
-__name(SlashCommandRoleOption, "SlashCommandRoleOption");
-
-// src/interactions/slashCommands/options/string.ts
-import { s as s10 } from "@sapphire/shapeshift";
-import { ApplicationCommandOptionType as ApplicationCommandOptionType9 } from "discord-api-types/v10";
-import { mix as mix4 } from "ts-mixer";
-var minLengthValidator2 = s10.number.greaterThanOrEqual(0).lessThanOrEqual(6e3);
-var maxLengthValidator2 = s10.number.greaterThanOrEqual(1).lessThanOrEqual(6e3);
-var SlashCommandStringOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = ApplicationCommandOptionType9.String;
- /**
- * The maximum length of this option.
- */
- max_length;
- /**
- * The minimum length of this option.
- */
- min_length;
- /**
- * Sets the maximum length of this string option.
- *
- * @param max - The maximum length this option can be
- */
- setMaxLength(max) {
- maxLengthValidator2.parse(max);
- Reflect.set(this, "max_length", max);
- return this;
- }
- /**
- * Sets the minimum length of this string option.
- *
- * @param min - The minimum length this option can be
- */
- setMinLength(min) {
- minLengthValidator2.parse(min);
- Reflect.set(this, "min_length", min);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- return { ...this };
- }
-};
-__name(SlashCommandStringOption, "SlashCommandStringOption");
-SlashCommandStringOption = __decorateClass([
- mix4(ApplicationCommandOptionWithChoicesAndAutocompleteMixin)
-], SlashCommandStringOption);
-
-// src/interactions/slashCommands/options/user.ts
-import { ApplicationCommandOptionType as ApplicationCommandOptionType10 } from "discord-api-types/v10";
-var SlashCommandUserOption = class extends ApplicationCommandOptionBase {
- /**
- * The type of this option.
- */
- type = ApplicationCommandOptionType10.User;
- /**
- * {@inheritDoc ApplicationCommandOptionBase.toJSON}
- */
- toJSON() {
- this.runRequiredValidations();
- return { ...this };
- }
-};
-__name(SlashCommandUserOption, "SlashCommandUserOption");
-
-// src/interactions/slashCommands/mixins/SharedSlashCommandOptions.ts
-var SharedSlashCommandOptions = class {
- options;
- /**
- * Adds a boolean option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addBooleanOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandBooleanOption);
- }
- /**
- * Adds a user option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addUserOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandUserOption);
- }
- /**
- * Adds a channel option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addChannelOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandChannelOption);
- }
- /**
- * Adds a role option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addRoleOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandRoleOption);
- }
- /**
- * Adds an attachment option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addAttachmentOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandAttachmentOption);
- }
- /**
- * Adds a mentionable option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addMentionableOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandMentionableOption);
- }
- /**
- * Adds a string option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addStringOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandStringOption);
- }
- /**
- * Adds an integer option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addIntegerOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandIntegerOption);
- }
- /**
- * Adds a number option.
- *
- * @param input - A function that returns an option builder or an already built builder
- */
- addNumberOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandNumberOption);
- }
- /**
- * Where the actual adding magic happens. ✨
- *
- * @param input - The input. What else?
- * @param Instance - The instance of whatever is being added
- * @internal
- */
- _sharedAddOptionMethod(input, Instance) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new Instance()) : input;
- assertReturnOfBuilder(result, Instance);
- options.push(result);
- return this;
- }
-};
-__name(SharedSlashCommandOptions, "SharedSlashCommandOptions");
-
-// src/interactions/slashCommands/SlashCommandSubcommands.ts
-var SlashCommandSubcommandGroupBuilder = class {
- /**
- * The name of this subcommand group.
- */
- name = void 0;
- /**
- * The description of this subcommand group.
- */
- description = void 0;
- /**
- * The subcommands within this subcommand group.
- */
- options = [];
- /**
- * Adds a new subcommand to this group.
- *
- * @param input - A function that returns a subcommand builder or an already built builder
- */
- addSubcommand(input) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new SlashCommandSubcommandBuilder()) : input;
- assertReturnOfBuilder(result, SlashCommandSubcommandBuilder);
- options.push(result);
- return this;
- }
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- validateRequiredParameters3(this.name, this.description, this.options);
- return {
- type: ApplicationCommandOptionType11.SubcommandGroup,
- name: this.name,
- name_localizations: this.name_localizations,
- description: this.description,
- description_localizations: this.description_localizations,
- options: this.options.map((option) => option.toJSON())
- };
- }
-};
-__name(SlashCommandSubcommandGroupBuilder, "SlashCommandSubcommandGroupBuilder");
-SlashCommandSubcommandGroupBuilder = __decorateClass([
- mix5(SharedNameAndDescription)
-], SlashCommandSubcommandGroupBuilder);
-var SlashCommandSubcommandBuilder = class {
- /**
- * The name of this subcommand.
- */
- name = void 0;
- /**
- * The description of this subcommand.
- */
- description = void 0;
- /**
- * The options within this subcommand.
- */
- options = [];
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- validateRequiredParameters3(this.name, this.description, this.options);
- return {
- type: ApplicationCommandOptionType11.Subcommand,
- name: this.name,
- name_localizations: this.name_localizations,
- description: this.description,
- description_localizations: this.description_localizations,
- options: this.options.map((option) => option.toJSON())
- };
- }
-};
-__name(SlashCommandSubcommandBuilder, "SlashCommandSubcommandBuilder");
-SlashCommandSubcommandBuilder = __decorateClass([
- mix5(SharedNameAndDescription, SharedSlashCommandOptions)
-], SlashCommandSubcommandBuilder);
-
-// src/interactions/slashCommands/SlashCommandBuilder.ts
-var SlashCommandBuilder = class {
- /**
- * The name of this command.
- */
- name = void 0;
- /**
- * The name localizations of this command.
- */
- name_localizations;
- /**
- * The description of this command.
- */
- description = void 0;
- /**
- * The description localizations of this command.
- */
- description_localizations;
- /**
- * The options of this command.
- */
- options = [];
- /**
- * Whether this command is enabled by default when the application is added to a guild.
- *
- * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- default_permission = void 0;
- /**
- * The set of permissions represented as a bit set for the command.
- */
- default_member_permissions = void 0;
- /**
- * Indicates whether the command is available in direct messages with the application.
- *
- * @remarks
- * By default, commands are visible. This property is only for global commands.
- */
- dm_permission = void 0;
- /**
- * Whether this command is NSFW.
- */
- nsfw = void 0;
- /**
- * Sets whether the command is enabled by default when the application is added to a guild.
- *
- * @remarks
- * If set to `false`, you will have to later `PUT` the permissions for this command.
- * @param value - Whether or not to enable this command by default
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- * @deprecated Use {@link SlashCommandBuilder.setDefaultMemberPermissions} or {@link SlashCommandBuilder.setDMPermission} instead.
- */
- setDefaultPermission(value) {
- validateDefaultPermission(value);
- Reflect.set(this, "default_permission", value);
- return this;
- }
- /**
- * Sets the default permissions a member should have in order to run the command.
- *
- * @remarks
- * You can set this to `'0'` to disable the command by default.
- * @param permissions - The permissions bit field to set
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- */
- setDefaultMemberPermissions(permissions) {
- const permissionValue = validateDefaultMemberPermissions(permissions);
- Reflect.set(this, "default_member_permissions", permissionValue);
- return this;
- }
- /**
- * Sets if the command is available in direct messages with the application.
- *
- * @remarks
- * By default, commands are visible. This method is only for global commands.
- * @param enabled - Whether the command should be enabled in direct messages
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- */
- setDMPermission(enabled) {
- validateDMPermission(enabled);
- Reflect.set(this, "dm_permission", enabled);
- return this;
- }
- /**
- * Sets whether this command is NSFW.
- *
- * @param nsfw - Whether this command is NSFW
- */
- setNSFW(nsfw = true) {
- validateNSFW(nsfw);
- Reflect.set(this, "nsfw", nsfw);
- return this;
- }
- /**
- * Adds a new subcommand group to this command.
- *
- * @param input - A function that returns a subcommand group builder or an already built builder
- */
- addSubcommandGroup(input) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new SlashCommandSubcommandGroupBuilder()) : input;
- assertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);
- options.push(result);
- return this;
- }
- /**
- * Adds a new subcommand to this command.
- *
- * @param input - A function that returns a subcommand builder or an already built builder
- */
- addSubcommand(input) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new SlashCommandSubcommandBuilder()) : input;
- assertReturnOfBuilder(result, SlashCommandSubcommandBuilder);
- options.push(result);
- return this;
- }
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- validateRequiredParameters3(this.name, this.description, this.options);
- validateLocalizationMap(this.name_localizations);
- validateLocalizationMap(this.description_localizations);
- return {
- ...this,
- options: this.options.map((option) => option.toJSON())
- };
- }
-};
-__name(SlashCommandBuilder, "SlashCommandBuilder");
-SlashCommandBuilder = __decorateClass([
- mix6(SharedSlashCommandOptions, SharedNameAndDescription)
-], SlashCommandBuilder);
-
-// src/interactions/contextMenuCommands/Assertions.ts
-var Assertions_exports6 = {};
-__export(Assertions_exports6, {
- validateDMPermission: () => validateDMPermission2,
- validateDefaultMemberPermissions: () => validateDefaultMemberPermissions2,
- validateDefaultPermission: () => validateDefaultPermission2,
- validateName: () => validateName2,
- validateRequiredParameters: () => validateRequiredParameters4,
- validateType: () => validateType
-});
-import { s as s11 } from "@sapphire/shapeshift";
-import { ApplicationCommandType } from "discord-api-types/v10";
-var namePredicate2 = s11.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/^( *[\p{P}\p{L}\p{N}\p{sc=Devanagari}\p{sc=Thai}]+ *)+$/u).setValidationEnabled(isValidationEnabled);
-var typePredicate = s11.union(s11.literal(ApplicationCommandType.User), s11.literal(ApplicationCommandType.Message)).setValidationEnabled(isValidationEnabled);
-var booleanPredicate3 = s11.boolean;
-function validateDefaultPermission2(value) {
- booleanPredicate3.parse(value);
-}
-__name(validateDefaultPermission2, "validateDefaultPermission");
-function validateName2(name) {
- namePredicate2.parse(name);
-}
-__name(validateName2, "validateName");
-function validateType(type) {
- typePredicate.parse(type);
-}
-__name(validateType, "validateType");
-function validateRequiredParameters4(name, type) {
- validateName2(name);
- validateType(type);
-}
-__name(validateRequiredParameters4, "validateRequiredParameters");
-var dmPermissionPredicate2 = s11.boolean.nullish;
-function validateDMPermission2(value) {
- dmPermissionPredicate2.parse(value);
-}
-__name(validateDMPermission2, "validateDMPermission");
-var memberPermissionPredicate2 = s11.union(
- s11.bigint.transform((value) => value.toString()),
- s11.number.safeInt.transform((value) => value.toString()),
- s11.string.regex(/^\d+$/)
-).nullish;
-function validateDefaultMemberPermissions2(permissions) {
- return memberPermissionPredicate2.parse(permissions);
-}
-__name(validateDefaultMemberPermissions2, "validateDefaultMemberPermissions");
-
-// src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts
-var ContextMenuCommandBuilder = class {
- /**
- * The name of this command.
- */
- name = void 0;
- /**
- * The name localizations of this command.
- */
- name_localizations;
- /**
- * The type of this command.
- */
- type = void 0;
- /**
- * Whether this command is enabled by default when the application is added to a guild.
- *
- * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- default_permission = void 0;
- /**
- * The set of permissions represented as a bit set for the command.
- */
- default_member_permissions = void 0;
- /**
- * Indicates whether the command is available in direct messages with the application.
- *
- * @remarks
- * By default, commands are visible. This property is only for global commands.
- */
- dm_permission = void 0;
- /**
- * Sets the name of this command.
- *
- * @param name - The name to use
- */
- setName(name) {
- validateName2(name);
- Reflect.set(this, "name", name);
- return this;
- }
- /**
- * Sets the type of this command.
- *
- * @param type - The type to use
- */
- setType(type) {
- validateType(type);
- Reflect.set(this, "type", type);
- return this;
- }
- /**
- * Sets whether the command is enabled by default when the application is added to a guild.
- *
- * @remarks
- * If set to `false`, you will have to later `PUT` the permissions for this command.
- * @param value - Whether to enable this command by default
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- setDefaultPermission(value) {
- validateDefaultPermission2(value);
- Reflect.set(this, "default_permission", value);
- return this;
- }
- /**
- * Sets the default permissions a member should have in order to run this command.
- *
- * @remarks
- * You can set this to `'0'` to disable the command by default.
- * @param permissions - The permissions bit field to set
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- */
- setDefaultMemberPermissions(permissions) {
- const permissionValue = validateDefaultMemberPermissions2(permissions);
- Reflect.set(this, "default_member_permissions", permissionValue);
- return this;
- }
- /**
- * Sets if the command is available in direct messages with the application.
- *
- * @remarks
- * By default, commands are visible. This method is only for global commands.
- * @param enabled - Whether the command should be enabled in direct messages
- * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
- */
- setDMPermission(enabled) {
- validateDMPermission2(enabled);
- Reflect.set(this, "dm_permission", enabled);
- return this;
- }
- /**
- * Sets a name localization for this command.
- *
- * @param locale - The locale to set
- * @param localizedName - The localized name for the given `locale`
- */
- setNameLocalization(locale, localizedName) {
- if (!this.name_localizations) {
- Reflect.set(this, "name_localizations", {});
- }
- const parsedLocale = validateLocale(locale);
- if (localizedName === null) {
- this.name_localizations[parsedLocale] = null;
- return this;
- }
- validateName2(localizedName);
- this.name_localizations[parsedLocale] = localizedName;
- return this;
- }
- /**
- * Sets the name localizations for this command.
- *
- * @param localizedNames - The object of localized names to set
- */
- setNameLocalizations(localizedNames) {
- if (localizedNames === null) {
- Reflect.set(this, "name_localizations", null);
- return this;
- }
- Reflect.set(this, "name_localizations", {});
- for (const args of Object.entries(localizedNames))
- this.setNameLocalization(...args);
- return this;
- }
- /**
- * Serializes this builder to API-compatible JSON data.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- validateRequiredParameters4(this.name, this.type);
- validateLocalizationMap(this.name_localizations);
- return { ...this };
- }
-};
-__name(ContextMenuCommandBuilder, "ContextMenuCommandBuilder");
-
-// src/util/componentUtil.ts
-function embedLength(data) {
- return (data.title?.length ?? 0) + (data.description?.length ?? 0) + (data.fields?.reduce((prev, curr) => prev + curr.name.length + curr.value.length, 0) ?? 0) + (data.footer?.text.length ?? 0) + (data.author?.name.length ?? 0);
-}
-__name(embedLength, "embedLength");
-
-// src/index.ts
-var version = "1.6.3";
-export {
- ActionRowBuilder,
- ApplicationCommandNumericOptionMinMaxValueMixin,
- ApplicationCommandOptionBase,
- ApplicationCommandOptionChannelTypesMixin,
- ApplicationCommandOptionWithChoicesAndAutocompleteMixin,
- BaseSelectMenuBuilder,
- ButtonBuilder,
- ChannelSelectMenuBuilder,
- Assertions_exports2 as ComponentAssertions,
- ComponentBuilder,
- Assertions_exports6 as ContextMenuCommandAssertions,
- ContextMenuCommandBuilder,
- Assertions_exports as EmbedAssertions,
- EmbedBuilder,
- MentionableSelectMenuBuilder,
- Assertions_exports4 as ModalAssertions,
- ModalBuilder,
- RoleSelectMenuBuilder,
- StringSelectMenuBuilder as SelectMenuBuilder,
- StringSelectMenuOptionBuilder as SelectMenuOptionBuilder,
- SharedNameAndDescription,
- SharedSlashCommandOptions,
- Assertions_exports5 as SlashCommandAssertions,
- SlashCommandAttachmentOption,
- SlashCommandBooleanOption,
- SlashCommandBuilder,
- SlashCommandChannelOption,
- SlashCommandIntegerOption,
- SlashCommandMentionableOption,
- SlashCommandNumberOption,
- SlashCommandRoleOption,
- SlashCommandStringOption,
- SlashCommandSubcommandBuilder,
- SlashCommandSubcommandGroupBuilder,
- SlashCommandUserOption,
- StringSelectMenuBuilder,
- StringSelectMenuOptionBuilder,
- Assertions_exports3 as TextInputAssertions,
- TextInputBuilder,
- UserSelectMenuBuilder,
- createComponentBuilder,
- disableValidators,
- embedLength,
- enableValidators,
- isValidationEnabled,
- normalizeArray,
- version
-};
-//# sourceMappingURL=index.mjs.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/index.mjs.map b/node_modules/@discordjs/builders/dist/index.mjs.map
deleted file mode 100644
index 38013f8..0000000
--- a/node_modules/@discordjs/builders/dist/index.mjs.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../src/messages/embed/Assertions.ts","../src/util/validation.ts","../src/util/normalizeArray.ts","../src/messages/embed/Embed.ts","../src/index.ts","../src/components/Assertions.ts","../src/components/selectMenu/StringSelectMenuOption.ts","../src/components/ActionRow.ts","../src/components/Component.ts","../src/components/Components.ts","../src/components/button/Button.ts","../src/components/selectMenu/ChannelSelectMenu.ts","../src/components/selectMenu/BaseSelectMenu.ts","../src/components/selectMenu/MentionableSelectMenu.ts","../src/components/selectMenu/RoleSelectMenu.ts","../src/components/selectMenu/StringSelectMenu.ts","../src/components/selectMenu/UserSelectMenu.ts","../src/components/textInput/TextInput.ts","../src/components/textInput/Assertions.ts","../src/interactions/modals/Assertions.ts","../src/interactions/modals/Modal.ts","../src/interactions/slashCommands/Assertions.ts","../src/interactions/slashCommands/SlashCommandBuilder.ts","../src/interactions/slashCommands/SlashCommandSubcommands.ts","../src/interactions/slashCommands/mixins/NameAndDescription.ts","../src/interactions/slashCommands/options/attachment.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionBase.ts","../src/interactions/slashCommands/options/boolean.ts","../src/interactions/slashCommands/options/channel.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts","../src/interactions/slashCommands/options/integer.ts","../src/interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.ts","../src/interactions/slashCommands/options/mentionable.ts","../src/interactions/slashCommands/options/number.ts","../src/interactions/slashCommands/options/role.ts","../src/interactions/slashCommands/options/string.ts","../src/interactions/slashCommands/options/user.ts","../src/interactions/slashCommands/mixins/SharedSlashCommandOptions.ts","../src/interactions/contextMenuCommands/Assertions.ts","../src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts","../src/util/componentUtil.ts"],"sourcesContent":["import { s } from '@sapphire/shapeshift';\nimport type { APIEmbedField } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const fieldNamePredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(256)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const fieldValuePredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(1_024)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const fieldInlinePredicate = s.boolean.optional;\n\nexport const embedFieldPredicate = s\n\t.object({\n\t\tname: fieldNamePredicate,\n\t\tvalue: fieldValuePredicate,\n\t\tinline: fieldInlinePredicate,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const embedFieldsArrayPredicate = embedFieldPredicate.array.setValidationEnabled(isValidationEnabled);\n\nexport const fieldLengthPredicate = s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\n\nexport function validateFieldLength(amountAdding: number, fields?: APIEmbedField[]): void {\n\tfieldLengthPredicate.parse((fields?.length ?? 0) + amountAdding);\n}\n\nexport const authorNamePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const imageURLPredicate = s.string\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:', 'attachment:'],\n\t})\n\t.nullish.setValidationEnabled(isValidationEnabled);\n\nexport const urlPredicate = s.string\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:'],\n\t})\n\t.nullish.setValidationEnabled(isValidationEnabled);\n\nexport const embedAuthorPredicate = s\n\t.object({\n\t\tname: authorNamePredicate,\n\t\ticonURL: imageURLPredicate,\n\t\turl: urlPredicate,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const RGBPredicate = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(255)\n\t.setValidationEnabled(isValidationEnabled);\nexport const colorPredicate = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(0xffffff)\n\t.or(s.tuple([RGBPredicate, RGBPredicate, RGBPredicate]))\n\t.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const descriptionPredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(4_096)\n\t.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const footerTextPredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(2_048)\n\t.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const embedFooterPredicate = s\n\t.object({\n\t\ttext: footerTextPredicate,\n\t\ticonURL: imageURLPredicate,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const timestampPredicate = s.union(s.number, s.date).nullable.setValidationEnabled(isValidationEnabled);\n\nexport const titlePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);\n","let validate = true;\n\n/**\n * Enables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function enableValidators() {\n\treturn (validate = true);\n}\n\n/**\n * Disables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function disableValidators() {\n\treturn (validate = false);\n}\n\n/**\n * Checks whether validation is occurring.\n */\nexport function isValidationEnabled() {\n\treturn validate;\n}\n","/**\n * Normalizes data that is a rest parameter or an array into an array with a depth of 1.\n *\n * @typeParam T - The data that must satisfy {@link RestOrArray}.\n * @param arr - The (possibly variadic) data to normalize\n */\nexport function normalizeArray(arr: RestOrArray): T[] {\n\tif (Array.isArray(arr[0])) return arr[0];\n\treturn arr as T[];\n}\n\n/**\n * Represents data that may be an array or came from a rest parameter.\n *\n * @remarks\n * This type is used throughout builders to ensure both an array and variadic arguments\n * may be used. It is normalized with {@link normalizeArray}.\n */\nexport type RestOrArray = T[] | [T[]];\n","import type { APIEmbed, APIEmbedAuthor, APIEmbedField, APIEmbedFooter, APIEmbedImage } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport {\n\tcolorPredicate,\n\tdescriptionPredicate,\n\tembedAuthorPredicate,\n\tembedFieldsArrayPredicate,\n\tembedFooterPredicate,\n\timageURLPredicate,\n\ttimestampPredicate,\n\ttitlePredicate,\n\turlPredicate,\n\tvalidateFieldLength,\n} from './Assertions.js';\n\n/**\n * A tuple satisfying the RGB color model.\n *\n * @see {@link https://developer.mozilla.org/docs/Glossary/RGB}\n */\nexport type RGBTuple = [red: number, green: number, blue: number];\n\n/**\n * The base icon data typically used in payloads.\n */\nexport interface IconData {\n\t/**\n\t * The URL of the icon.\n\t */\n\ticonURL?: string;\n\t/**\n\t * The proxy URL of the icon.\n\t */\n\tproxyIconURL?: string;\n}\n\n/**\n * Represents the author data of an embed.\n */\nexport type EmbedAuthorData = IconData & Omit;\n\n/**\n * Represents the author options of an embed.\n */\nexport type EmbedAuthorOptions = Omit;\n\n/**\n * Represents the footer data of an embed.\n */\nexport type EmbedFooterData = IconData & Omit;\n\n/**\n * Represents the footer options of an embed.\n */\nexport type EmbedFooterOptions = Omit;\n\n/**\n * Represents the image data of an embed.\n */\nexport interface EmbedImageData extends Omit {\n\t/**\n\t * The proxy URL for the image.\n\t */\n\tproxyURL?: string;\n}\n\n/**\n * A builder that creates API-compatible JSON data for embeds.\n */\nexport class EmbedBuilder {\n\t/**\n\t * The API data associated with this embed.\n\t */\n\tpublic readonly data: APIEmbed;\n\n\t/**\n\t * Creates a new embed from API data.\n\t *\n\t * @param data - The API data to create this embed with\n\t */\n\tpublic constructor(data: APIEmbed = {}) {\n\t\tthis.data = { ...data };\n\t\tif (data.timestamp) this.data.timestamp = new Date(data.timestamp).toISOString();\n\t}\n\n\t/**\n\t * Appends fields to the embed.\n\t *\n\t * @remarks\n\t * This method accepts either an array of fields or a variable number of field parameters.\n\t * The maximum amount of fields that can be added is 25.\n\t * @example\n\t * Using an array:\n\t * ```ts\n\t * const fields: APIEmbedField[] = ...;\n\t * const embed = new EmbedBuilder()\n\t * \t.addFields(fields);\n\t * ```\n\t * @example\n\t * Using rest parameters (variadic):\n\t * ```ts\n\t * const embed = new EmbedBuilder()\n\t * \t.addFields(\n\t * \t\t{ name: 'Field 1', value: 'Value 1' },\n\t * \t\t{ name: 'Field 2', value: 'Value 2' },\n\t * \t);\n\t * ```\n\t * @param fields - The fields to add\n\t */\n\tpublic addFields(...fields: RestOrArray): this {\n\t\tconst normalizedFields = normalizeArray(fields);\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(normalizedFields.length, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(normalizedFields);\n\n\t\tif (this.data.fields) this.data.fields.push(...normalizedFields);\n\t\telse this.data.fields = normalizedFields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts fields for this embed.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of fields that can be added is 25.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing fields of an embed.\n\t * @example\n\t * Remove the first field:\n\t * ```ts\n\t * embed.spliceFields(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n fields:\n\t * ```ts\n\t * const n = 4;\n\t * embed.spliceFields(0, n);\n\t * ```\n\t * @example\n\t * Remove the last field:\n\t * ```ts\n\t * embed.spliceFields(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of fields to remove\n\t * @param fields - The replacing field objects\n\t */\n\tpublic spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this {\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(fields.length - deleteCount, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\t\tif (this.data.fields) this.data.fields.splice(index, deleteCount, ...fields);\n\t\telse this.data.fields = fields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the fields for this embed.\n\t *\n\t * @remarks\n\t * This method is an alias for {@link EmbedBuilder.spliceFields}. More specifically,\n\t * it splices the entire array of fields, replacing them with the provided fields.\n\t *\n\t * You can set a maximum of 25 fields.\n\t * @param fields - The fields to set\n\t */\n\tpublic setFields(...fields: RestOrArray) {\n\t\tthis.spliceFields(0, this.data.fields?.length ?? 0, ...normalizeArray(fields));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the author of this embed.\n\t *\n\t * @param options - The options to use\n\t */\n\n\tpublic setAuthor(options: EmbedAuthorOptions | null): this {\n\t\tif (options === null) {\n\t\t\tthis.data.author = undefined;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Data assertions\n\t\tembedAuthorPredicate.parse(options);\n\n\t\tthis.data.author = { name: options.name, url: options.url, icon_url: options.iconURL };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the color of this embed.\n\t *\n\t * @param color - The color to use\n\t */\n\tpublic setColor(color: RGBTuple | number | null): this {\n\t\t// Data assertions\n\t\tcolorPredicate.parse(color);\n\n\t\tif (Array.isArray(color)) {\n\t\t\tconst [red, green, blue] = color;\n\t\t\tthis.data.color = (red << 16) + (green << 8) + blue;\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.data.color = color ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this embed.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string | null): this {\n\t\t// Data assertions\n\t\tdescriptionPredicate.parse(description);\n\n\t\tthis.data.description = description ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the footer of this embed.\n\t *\n\t * @param options - The footer to use\n\t */\n\tpublic setFooter(options: EmbedFooterOptions | null): this {\n\t\tif (options === null) {\n\t\t\tthis.data.footer = undefined;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Data assertions\n\t\tembedFooterPredicate.parse(options);\n\n\t\tthis.data.footer = { text: options.text, icon_url: options.iconURL };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the image of this embed.\n\t *\n\t * @param url - The image URL to use\n\t */\n\tpublic setImage(url: string | null): this {\n\t\t// Data assertions\n\t\timageURLPredicate.parse(url);\n\n\t\tthis.data.image = url ? { url } : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the thumbnail of this embed.\n\t *\n\t * @param url - The thumbnail URL to use\n\t */\n\tpublic setThumbnail(url: string | null): this {\n\t\t// Data assertions\n\t\timageURLPredicate.parse(url);\n\n\t\tthis.data.thumbnail = url ? { url } : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the timestamp of this embed.\n\t *\n\t * @param timestamp - The timestamp or date to use\n\t */\n\tpublic setTimestamp(timestamp: Date | number | null = Date.now()): this {\n\t\t// Data assertions\n\t\ttimestampPredicate.parse(timestamp);\n\n\t\tthis.data.timestamp = timestamp ? new Date(timestamp).toISOString() : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the title for this embed.\n\t *\n\t * @param title - The title to use\n\t */\n\tpublic setTitle(title: string | null): this {\n\t\t// Data assertions\n\t\ttitlePredicate.parse(title);\n\n\t\tthis.data.title = title ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL of this embed.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string | null): this {\n\t\t// Data assertions\n\t\turlPredicate.parse(url);\n\n\t\tthis.data.url = url ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIEmbed {\n\t\treturn { ...this.data };\n\t}\n}\n","export * as EmbedAssertions from './messages/embed/Assertions.js';\nexport * from './messages/embed/Embed.js';\n// TODO: Consider removing this dep in the next major version\nexport * from '@discordjs/formatters';\n\nexport * as ComponentAssertions from './components/Assertions.js';\nexport * from './components/ActionRow.js';\nexport * from './components/button/Button.js';\nexport * from './components/Component.js';\nexport * from './components/Components.js';\nexport * from './components/textInput/TextInput.js';\nexport * as TextInputAssertions from './components/textInput/Assertions.js';\nexport * from './interactions/modals/Modal.js';\nexport * as ModalAssertions from './interactions/modals/Assertions.js';\n\nexport * from './components/selectMenu/BaseSelectMenu.js';\nexport * from './components/selectMenu/ChannelSelectMenu.js';\nexport * from './components/selectMenu/MentionableSelectMenu.js';\nexport * from './components/selectMenu/RoleSelectMenu.js';\nexport * from './components/selectMenu/StringSelectMenu.js';\n// TODO: Remove those aliases in v2\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuBuilder} instead.\n\t */\n\tStringSelectMenuBuilder as SelectMenuBuilder,\n} from './components/selectMenu/StringSelectMenu.js';\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuOptionBuilder} instead.\n\t */\n\tStringSelectMenuOptionBuilder as SelectMenuOptionBuilder,\n} from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/UserSelectMenu.js';\n\nexport * as SlashCommandAssertions from './interactions/slashCommands/Assertions.js';\nexport * from './interactions/slashCommands/SlashCommandBuilder.js';\nexport * from './interactions/slashCommands/SlashCommandSubcommands.js';\nexport * from './interactions/slashCommands/options/boolean.js';\nexport * from './interactions/slashCommands/options/channel.js';\nexport * from './interactions/slashCommands/options/integer.js';\nexport * from './interactions/slashCommands/options/mentionable.js';\nexport * from './interactions/slashCommands/options/number.js';\nexport * from './interactions/slashCommands/options/role.js';\nexport * from './interactions/slashCommands/options/attachment.js';\nexport * from './interactions/slashCommands/options/string.js';\nexport * from './interactions/slashCommands/options/user.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionBase.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.js';\nexport * from './interactions/slashCommands/mixins/NameAndDescription.js';\nexport * from './interactions/slashCommands/mixins/SharedSlashCommandOptions.js';\n\nexport * as ContextMenuCommandAssertions from './interactions/contextMenuCommands/Assertions.js';\nexport * from './interactions/contextMenuCommands/ContextMenuCommandBuilder.js';\n\nexport * from './util/componentUtil.js';\nexport * from './util/normalizeArray.js';\nexport * from './util/validation.js';\n\n/**\n * The {@link https://github.com/discordjs/discord.js/blob/main/packages/builders#readme | @discordjs/builders} version\n * that you are currently using.\n *\n * @privateRemarks This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild.\n */\nexport const version = '1.6.3' as string;\n","import { s } from '@sapphire/shapeshift';\nimport { ButtonStyle, ChannelType, type APIMessageComponentEmoji } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../util/validation.js';\nimport { StringSelectMenuOptionBuilder } from './selectMenu/StringSelectMenuOption.js';\n\nexport const customIdValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const emojiValidator = s\n\t.object({\n\t\tid: s.string,\n\t\tname: s.string,\n\t\tanimated: s.boolean,\n\t})\n\t.partial.strict.setValidationEnabled(isValidationEnabled);\n\nexport const disabledValidator = s.boolean;\n\nexport const buttonLabelValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(80)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const buttonStyleValidator = s.nativeEnum(ButtonStyle);\n\nexport const placeholderValidator = s.string.lengthLessThanOrEqual(150).setValidationEnabled(isValidationEnabled);\nexport const minMaxValidator = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(25)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const labelValueDescriptionValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const jsonOptionValidator = s\n\t.object({\n\t\tlabel: labelValueDescriptionValidator,\n\t\tvalue: labelValueDescriptionValidator,\n\t\tdescription: labelValueDescriptionValidator.optional,\n\t\temoji: emojiValidator.optional,\n\t\tdefault: s.boolean.optional,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const optionValidator = s.instance(StringSelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled);\n\nexport const optionsValidator = optionValidator.array\n\t.lengthGreaterThanOrEqual(0)\n\t.setValidationEnabled(isValidationEnabled);\nexport const optionsLengthValidator = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(25)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredSelectMenuParameters(options: StringSelectMenuOptionBuilder[], customId?: string) {\n\tcustomIdValidator.parse(customId);\n\toptionsValidator.parse(options);\n}\n\nexport const defaultValidator = s.boolean;\n\nexport function validateRequiredSelectMenuOptionParameters(label?: string, value?: string) {\n\tlabelValueDescriptionValidator.parse(label);\n\tlabelValueDescriptionValidator.parse(value);\n}\n\nexport const channelTypesValidator = s.nativeEnum(ChannelType).array.setValidationEnabled(isValidationEnabled);\n\nexport const urlValidator = s.string\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:', 'discord:'],\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredButtonParameters(\n\tstyle?: ButtonStyle,\n\tlabel?: string,\n\temoji?: APIMessageComponentEmoji,\n\tcustomId?: string,\n\turl?: string,\n) {\n\tif (url && customId) {\n\t\tthrow new RangeError('URL and custom id are mutually exclusive');\n\t}\n\n\tif (!label && !emoji) {\n\t\tthrow new RangeError('Buttons must have a label and/or an emoji');\n\t}\n\n\tif (style === ButtonStyle.Link) {\n\t\tif (!url) {\n\t\t\tthrow new RangeError('Link buttons must have a url');\n\t\t}\n\t} else if (url) {\n\t\tthrow new RangeError('Non-link buttons cannot have a url');\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIMessageComponentEmoji, APISelectMenuOption } from 'discord-api-types/v10';\nimport {\n\tdefaultValidator,\n\temojiValidator,\n\tlabelValueDescriptionValidator,\n\tvalidateRequiredSelectMenuOptionParameters,\n} from '../Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for string select menu options.\n */\nexport class StringSelectMenuOptionBuilder implements JSONEncodable {\n\t/**\n\t * Creates a new string select menu option from API data.\n\t *\n\t * @param data - The API data to create this string select menu option with\n\t * @example\n\t * Creating a string select menu option from an API data object:\n\t * ```ts\n\t * const selectMenuOption = new SelectMenuOptionBuilder({\n\t * \tlabel: 'catchy label',\n\t * \tvalue: '1',\n\t * });\n\t * ```\n\t * @example\n\t * Creating a string select menu option using setters and API data:\n\t * ```ts\n\t * const selectMenuOption = new SelectMenuOptionBuilder({\n\t * \tdefault: true,\n\t * \tvalue: '1',\n\t * })\n\t * \t.setLabel('woah');\n\t * ```\n\t */\n\tpublic constructor(public data: Partial = {}) {}\n\n\t/**\n\t * Sets the label for this option.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = labelValueDescriptionValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value for this option.\n\t *\n\t * @param value - The value to use\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = labelValueDescriptionValidator.parse(value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description for this option.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = labelValueDescriptionValidator.parse(description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this option is selected by default.\n\t *\n\t * @param isDefault - Whether this option is selected by default\n\t */\n\tpublic setDefault(isDefault = true) {\n\t\tthis.data.default = defaultValidator.parse(isDefault);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display for this option.\n\t *\n\t * @param emoji - The emoji to use\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\tthis.data.emoji = emojiValidator.parse(emoji);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc BaseSelectMenuBuilder.toJSON}\n\t */\n\tpublic toJSON(): APISelectMenuOption {\n\t\tvalidateRequiredSelectMenuOptionParameters(this.data.label, this.data.value);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APISelectMenuOption;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport {\n\ttype APIActionRowComponent,\n\tComponentType,\n\ttype APIMessageActionRowComponent,\n\ttype APIModalActionRowComponent,\n\ttype APIActionRowComponentTypes,\n} from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../util/normalizeArray.js';\nimport { ComponentBuilder } from './Component.js';\nimport { createComponentBuilder } from './Components.js';\nimport type { ButtonBuilder } from './button/Button.js';\nimport type { ChannelSelectMenuBuilder } from './selectMenu/ChannelSelectMenu.js';\nimport type { MentionableSelectMenuBuilder } from './selectMenu/MentionableSelectMenu.js';\nimport type { RoleSelectMenuBuilder } from './selectMenu/RoleSelectMenu.js';\nimport type { StringSelectMenuBuilder } from './selectMenu/StringSelectMenu.js';\nimport type { UserSelectMenuBuilder } from './selectMenu/UserSelectMenu.js';\nimport type { TextInputBuilder } from './textInput/TextInput.js';\n\n/**\n * The builders that may be used for messages.\n */\nexport type MessageComponentBuilder =\n\t| ActionRowBuilder\n\t| MessageActionRowComponentBuilder;\n\n/**\n * The builders that may be used for modals.\n */\nexport type ModalComponentBuilder = ActionRowBuilder | ModalActionRowComponentBuilder;\n\n/**\n * The builders that may be used within an action row for messages.\n */\nexport type MessageActionRowComponentBuilder =\n\t| ButtonBuilder\n\t| ChannelSelectMenuBuilder\n\t| MentionableSelectMenuBuilder\n\t| RoleSelectMenuBuilder\n\t| StringSelectMenuBuilder\n\t| UserSelectMenuBuilder;\n\n/**\n * The builders that may be used within an action row for modals.\n */\nexport type ModalActionRowComponentBuilder = TextInputBuilder;\n\n/**\n * Any builder.\n */\nexport type AnyComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder;\n\n/**\n * A builder that creates API-compatible JSON data for action rows.\n *\n * @typeParam T - The types of components this action row holds\n */\nexport class ActionRowBuilder extends ComponentBuilder<\n\tAPIActionRowComponent\n> {\n\t/**\n\t * The components within this action row.\n\t */\n\tpublic readonly components: T[];\n\n\t/**\n\t * Creates a new action row from API data.\n\t *\n\t * @param data - The API data to create this action row with\n\t * @example\n\t * Creating an action row from an API data object:\n\t * ```ts\n\t * const actionRow = new ActionRowBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcustom_id: \"custom id\",\n\t * \t\t\tlabel: \"Type something\",\n\t * \t\t\tstyle: TextInputStyle.Short,\n\t * \t\t\ttype: ComponentType.TextInput,\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating an action row using setters and API data:\n\t * ```ts\n\t * const actionRow = new ActionRowBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcustom_id: \"custom id\",\n\t * \t\t\tlabel: \"Click me\",\n\t * \t\t\tstyle: ButtonStyle.Primary,\n\t * \t\t\ttype: ComponentType.Button,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addComponents(button2, button3);\n\t * ```\n\t */\n\tpublic constructor({ components, ...data }: Partial> = {}) {\n\t\tsuper({ type: ComponentType.ActionRow, ...data });\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ?? []) as T[];\n\t}\n\n\t/**\n\t * Adds components to this action row.\n\t *\n\t * @param components - The components to add\n\t */\n\tpublic addComponents(...components: RestOrArray) {\n\t\tthis.components.push(...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets components for this action row.\n\t *\n\t * @param components - The components to set\n\t */\n\tpublic setComponents(...components: RestOrArray) {\n\t\tthis.components.splice(0, this.components.length, ...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIActionRowComponent> {\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIActionRowComponent>;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPIActionRowComponent,\n\tAPIActionRowComponentTypes,\n\tAPIBaseComponent,\n\tComponentType,\n} from 'discord-api-types/v10';\n\n/**\n * Any action row component data represented as an object.\n */\nexport type AnyAPIActionRowComponent = APIActionRowComponent | APIActionRowComponentTypes;\n\n/**\n * The base component builder that contains common symbols for all sorts of components.\n *\n * @typeParam DataType - The type of internal API data that is stored within the component\n */\nexport abstract class ComponentBuilder<\n\tDataType extends Partial> = APIBaseComponent,\n> implements JSONEncodable\n{\n\t/**\n\t * The API data associated with this component.\n\t */\n\tpublic readonly data: Partial;\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic abstract toJSON(): AnyAPIActionRowComponent;\n\n\t/**\n\t * Constructs a new kind of component.\n\t *\n\t * @param data - The data to construct a component out of\n\t */\n\tpublic constructor(data: Partial) {\n\t\tthis.data = data;\n\t}\n}\n","import { ComponentType, type APIMessageComponent, type APIModalComponent } from 'discord-api-types/v10';\nimport {\n\tActionRowBuilder,\n\ttype AnyComponentBuilder,\n\ttype MessageComponentBuilder,\n\ttype ModalComponentBuilder,\n} from './ActionRow.js';\nimport { ComponentBuilder } from './Component.js';\nimport { ButtonBuilder } from './button/Button.js';\nimport { ChannelSelectMenuBuilder } from './selectMenu/ChannelSelectMenu.js';\nimport { MentionableSelectMenuBuilder } from './selectMenu/MentionableSelectMenu.js';\nimport { RoleSelectMenuBuilder } from './selectMenu/RoleSelectMenu.js';\nimport { StringSelectMenuBuilder } from './selectMenu/StringSelectMenu.js';\nimport { UserSelectMenuBuilder } from './selectMenu/UserSelectMenu.js';\nimport { TextInputBuilder } from './textInput/TextInput.js';\n\n/**\n * Components here are mapped to their respective builder.\n */\nexport interface MappedComponentTypes {\n\t/**\n\t * The action row component type is associated with an {@link ActionRowBuilder}.\n\t */\n\t[ComponentType.ActionRow]: ActionRowBuilder;\n\t/**\n\t * The button component type is associated with an {@link ButtonBuilder}.\n\t */\n\t[ComponentType.Button]: ButtonBuilder;\n\t/**\n\t * The string select component type is associated with an {@link StringSelectMenuBuilder}.\n\t */\n\t[ComponentType.StringSelect]: StringSelectMenuBuilder;\n\t/**\n\t * The text inpiut component type is associated with an {@link TextInputBuilder}.\n\t */\n\t[ComponentType.TextInput]: TextInputBuilder;\n\t/**\n\t * The user select component type is associated with an {@link UserSelectMenuBuilder}.\n\t */\n\t[ComponentType.UserSelect]: UserSelectMenuBuilder;\n\t/**\n\t * The role select component type is associated with an {@link RoleSelectMenuBuilder}.\n\t */\n\t[ComponentType.RoleSelect]: RoleSelectMenuBuilder;\n\t/**\n\t * The mentionable select component type is associated with an {@link MentionableSelectMenuBuilder}.\n\t */\n\t[ComponentType.MentionableSelect]: MentionableSelectMenuBuilder;\n\t/**\n\t * The channel select component type is associated with an {@link ChannelSelectMenuBuilder}.\n\t */\n\t[ComponentType.ChannelSelect]: ChannelSelectMenuBuilder;\n}\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam T - The type of component to use\n * @param data - The API data to transform to a component class\n */\nexport function createComponentBuilder(\n\t// eslint-disable-next-line @typescript-eslint/sort-type-union-intersection-members\n\tdata: (APIModalComponent | APIMessageComponent) & { type: T },\n): MappedComponentTypes[T];\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam C - The type of component to use\n * @param data - The API data to transform to a component class\n */\nexport function createComponentBuilder(data: C): C;\n\nexport function createComponentBuilder(\n\tdata: APIMessageComponent | APIModalComponent | MessageComponentBuilder,\n): ComponentBuilder {\n\tif (data instanceof ComponentBuilder) {\n\t\treturn data;\n\t}\n\n\tswitch (data.type) {\n\t\tcase ComponentType.ActionRow:\n\t\t\treturn new ActionRowBuilder(data);\n\t\tcase ComponentType.Button:\n\t\t\treturn new ButtonBuilder(data);\n\t\tcase ComponentType.StringSelect:\n\t\t\treturn new StringSelectMenuBuilder(data);\n\t\tcase ComponentType.TextInput:\n\t\t\treturn new TextInputBuilder(data);\n\t\tcase ComponentType.UserSelect:\n\t\t\treturn new UserSelectMenuBuilder(data);\n\t\tcase ComponentType.RoleSelect:\n\t\t\treturn new RoleSelectMenuBuilder(data);\n\t\tcase ComponentType.MentionableSelect:\n\t\t\treturn new MentionableSelectMenuBuilder(data);\n\t\tcase ComponentType.ChannelSelect:\n\t\t\treturn new ChannelSelectMenuBuilder(data);\n\t\tdefault:\n\t\t\t// @ts-expect-error This case can still occur if we get a newer unsupported component type\n\t\t\tthrow new Error(`Cannot properly serialize component type: ${data.type}`);\n\t}\n}\n","import {\n\tComponentType,\n\ttype APIMessageComponentEmoji,\n\ttype APIButtonComponent,\n\ttype APIButtonComponentWithURL,\n\ttype APIButtonComponentWithCustomId,\n\ttype ButtonStyle,\n} from 'discord-api-types/v10';\nimport {\n\tbuttonLabelValidator,\n\tbuttonStyleValidator,\n\tcustomIdValidator,\n\tdisabledValidator,\n\temojiValidator,\n\turlValidator,\n\tvalidateRequiredButtonParameters,\n} from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\n\n/**\n * A builder that creates API-compatible JSON data for buttons.\n */\nexport class ButtonBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new button from API data.\n\t *\n\t * @param data - The API data to create this button with\n\t * @example\n\t * Creating a button from an API data object:\n\t * ```ts\n\t * const button = new ButtonBuilder({\n\t * \tcustom_id: 'a cool button',\n\t * \tstyle: ButtonStyle.Primary,\n\t * \tlabel: 'Click Me',\n\t * \temoji: {\n\t * \t\tname: 'smile',\n\t * \t\tid: '123456789012345678',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a button using setters and API data:\n\t * ```ts\n\t * const button = new ButtonBuilder({\n\t * \tstyle: ButtonStyle.Secondary,\n\t * \tlabel: 'Click Me',\n\t * })\n\t * \t.setEmoji({ name: '🙂' })\n\t * \t.setCustomId('another cool button');\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ type: ComponentType.Button, ...data });\n\t}\n\n\t/**\n\t * Sets the style of this button.\n\t *\n\t * @param style - The style to use\n\t */\n\tpublic setStyle(style: ButtonStyle) {\n\t\tthis.data.style = buttonStyleValidator.parse(style);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL for this button.\n\t *\n\t * @remarks\n\t * This method is only available to buttons using the `Link` button style.\n\t * Only three types of URL schemes are currently supported: `https://`, `http://`, and `discord://`.\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\t(this.data as APIButtonComponentWithURL).url = urlValidator.parse(url);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id for this button.\n\t *\n\t * @remarks\n\t * This method is only applicable to buttons that are not using the `Link` button style.\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\t(this.data as APIButtonComponentWithCustomId).custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display on this button.\n\t *\n\t * @param emoji - The emoji to use\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\tthis.data.emoji = emojiValidator.parse(emoji);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this button is disabled.\n\t *\n\t * @param disabled - Whether to disable this button\n\t */\n\tpublic setDisabled(disabled = true) {\n\t\tthis.data.disabled = disabledValidator.parse(disabled);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this button.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = buttonLabelValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIButtonComponent {\n\t\tvalidateRequiredButtonParameters(\n\t\t\tthis.data.style,\n\t\t\tthis.data.label,\n\t\t\tthis.data.emoji,\n\t\t\t(this.data as APIButtonComponentWithCustomId).custom_id,\n\t\t\t(this.data as APIButtonComponentWithURL).url,\n\t\t);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APIButtonComponent;\n\t}\n}\n","import type { APIChannelSelectComponent, ChannelType } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { channelTypesValidator, customIdValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for channel select menus.\n */\nexport class ChannelSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data.\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new ChannelSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new ChannelSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.addChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement)\n\t * \t.setMinValues(2);\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.ChannelSelect });\n\t}\n\n\t/**\n\t * Adds channel types to this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic addChannelTypes(...types: RestOrArray) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.push(...channelTypesValidator.parse(normalizedTypes));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets channel types for this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic setChannelTypes(...types: RestOrArray