diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..dfe0770
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Auto detect text files and perform LF normalization
+* text=auto
diff --git a/cleaner.js b/cleaner.js
new file mode 100644
index 0000000..87e964b
--- /dev/null
+++ b/cleaner.js
@@ -0,0 +1,18 @@
+const axios = require('axios');
+
+
+const clean = async (client) => {
+ try {
+ client.channels.fetch(1382140739001127002n)
+ .then(channel => {
+ channel.messages.fetch({ limit: 100 })
+ .then(messages => {
+ messages = messages.filter(m => !m.pinned);
+ channel.bulkDelete(messages)
+ })
+ })
+ } catch (error) {
+ console.log("Bot : "+error);
+ }
+};
+module.exports = clean;
\ No newline at end of file
diff --git a/commands/bienvenue/bienvenue.js b/commands/bienvenue/bienvenue.js
new file mode 100644
index 0000000..35442ef
--- /dev/null
+++ b/commands/bienvenue/bienvenue.js
@@ -0,0 +1,18 @@
+const { SlashCommandBuilder } = require('discord.js');
+const welcomeMessage = require("./welcomeMessage.json")
+
+
+module.exports = {
+ data: new SlashCommandBuilder()
+ .setName('bienvenue')
+ .setDescription('Souhaitez la bienvenue !')
+ .addUserOption(option =>
+ option.setName('user')
+ .setDescription('Utilisateur ร mentionner')
+ .setRequired(false)),
+ async execute(interaction) {
+ user = interaction.options.getUser('user');
+ welcomeMessage.content = user ? "||<@"+user.id+">||" : "";
+ await interaction.reply(welcomeMessage);
+ },
+};
\ No newline at end of file
diff --git a/commands/bienvenue/welcomeMessage.json b/commands/bienvenue/welcomeMessage.json
new file mode 100644
index 0000000..e6e65a1
--- /dev/null
+++ b/commands/bienvenue/welcomeMessage.json
@@ -0,0 +1,25 @@
+{
+ "content": "",
+ "tts": false,
+ "embeds": [
+ {
+ "id": 652627557,
+ "description": "# ๐ฎ ๐๐ข๐๐ง๐ฏ๐๐ง๐ฎ๐ ๐๐๐ง๐ฌ ๐ฅ'๐๐ฏ๐๐ง๐ญ๐ฎ๐ซ๐ ๐๐๐ฅ๐ฐ๐จ๐ซ๐ฅ๐ ! ๐\n### **On est super heureux de t'accueillir parmi nous ! Que tu sois un expert ou un novice, ici, on partage tout : stratรฉgies, astuces et bien sรปr, nos Pals prรฉfรฉrรฉs !** ",
+ "color": 2326507,
+ "fields": [],
+ "thumbnail": {
+ "url": "https://sm.ign.com/ign_fr/cover/p/palworld/palworld_g7rv.jpg"
+ }
+ },
+ {
+ "id": 313857863,
+ "description": "# **ร NE PAS MANQUER DE LA COMMUNAUTร**\n\n## **๐น ๐๐ง ๐ฅ๐จ๐ ๐ข๐๐ข๐๐ฅ ๐ข๐ง๐๐ข๐ฌ๐ฉ๐๐ง๐ฌ๐๐๐ฅ๐ :**\n### Notre excellent modรฉrateur Louis Mazin ร crรฉer un super outil pour faciliter le breeding de Pals ! ๐ฑ\n### Si รงa vous intรฉresse, faites **/pbt** ! ๐\n\n## **๐ธ๐๐ง ๐ฌ๐๐ซ๐ฏ๐๐ฎ๐ซ ๐๐๐ฅ๐ฐ๐จ๐ซ๐ฅ๐ ๐๐จ๐ฆ๐ฆ๐ฎ๐ง๐๐ฎ๐ญ๐๐ข๐ซ๐ :**\n### Et oui ! Nous avons notre propre serveur Palworld ! ๐คฉ\n### Mรชme s'il n'est disponible que pour les joueurs Steam...๐ญ\n### Si รงa te tente, les infos dont tu as besoin sont juste [ici](https://discord.com/channels/1068240252092813373/1253054206424649822/1253740268352569415) !\n\n## **๐น ๐๐ง๐ ๐ฉ๐๐ซ๐ฌ๐จ๐ง๐ง๐ ๐ช๐ฎ๐ข ๐ฌ๐ ๐ฅ๐ ๐๐จ๐ง๐ง๐ :**\n### Si tu es sur ce serveur, c'est sans doute grรขce ร lui, mais je vous le prรฉsente quand mรชme :\n### Notre trรจs cher [Rygain](https://www.youtube.com/Rygain) ! ๐จ๐ต\n### Et si tu ne le connais pas, va voir sa chaรฎne.......s'il te plaรฎt ? ๐ฅน",
+ "color": 2326507,
+ "fields": []
+ }
+ ],
+ "components": [],
+ "actions": {},
+ "username": "Couteau Suisse",
+ "avatar_url": "https://srv.latostadora.com/designall.dll/couteau-suisse---dessin-drole-sketchy--i:141385141697014138520;d:1416970;w:520;b:FFFFFF;m:1.jpg"
+ }
\ No newline at end of file
diff --git a/commands/pbt/pbt.js b/commands/pbt/pbt.js
new file mode 100644
index 0000000..38d8103
--- /dev/null
+++ b/commands/pbt/pbt.js
@@ -0,0 +1,53 @@
+const { SlashCommandBuilder } = require('discord.js');
+const axios = require('axios');
+const programMessage = require("./programMessage.json")
+
+const getDownloadCount = async () => {
+ try {
+ const response = await axios.get('https://api.github.com/repos/LouisMazin/Palworld_Breeding_Tree/releases', {
+ headers: {
+ 'Accept': 'application/vnd.github.v3+json',
+ 'User-Agent': 'Palworld-Discord-Bot'
+ }
+ });
+
+ let totalDownloads = 0;
+
+ for (const asset of response.data[0].assets) {
+ totalDownloads += asset.download_count;
+ }
+
+ return totalDownloads;
+ } catch (error) {
+ console.log('Erreur lors de la rรฉcupรฉration du nombre de tรฉlรฉchargements:', error.message);
+ return null;
+ }
+};
+
+module.exports = {
+ data: new SlashCommandBuilder()
+ .setName('pbt')
+ .setDescription('Afichez les informations sur le programme de Louis !')
+ .addUserOption(option =>
+ option.setName('user')
+ .setDescription('Utilisateur ร mentionner')
+ .setRequired(false)),
+ async execute(interaction) {
+ const user = interaction.options.getUser('user');
+ const downloadCount = await getDownloadCount();
+
+ // Clone the message to avoid modifying the original
+ const message = JSON.parse(JSON.stringify(programMessage));
+ // Add download count to the embed description
+ if (downloadCount !== null) {
+ const actual = downloadCount.toString();
+ let next = (downloadCount + 1).toString();
+ const lastNumber = actual[actual.length - 1];
+ next += next=='1' ? "รจre" : "รจme";
+ message.embeds[0].description = message.embeds[0].description.replace("X", actual).replace("Y", next);
+ }
+
+ message.content = user ? "||<@"+user.id+">||" : "";
+ await interaction.reply(message);
+ },
+};
\ No newline at end of file
diff --git a/commands/pbt/programMessage.json b/commands/pbt/programMessage.json
new file mode 100644
index 0000000..02af017
--- /dev/null
+++ b/commands/pbt/programMessage.json
@@ -0,0 +1,16 @@
+{
+ "content": "",
+ "tts": false,
+ "embeds": [
+ {
+ "id": 313857863,
+ "description": "# **LE PROGRAMME DE LOUIS**\n\n## Merci de faire confiance ร mon travail !:heart:\n\n### Il y a dรฉjร X personnes sur la derniรจre version :\n### -> soit la Y ! :wink:\n### - Windows : [Github](https://www.github.com/LouisMazin/Palworld_Breeding_Tree/releases/latest) \n### - Si tu n'as pas Windows : [Google Sheet](https://docs.google.com/spreadsheets/d/1LkY9d6fbXS77c6P6A3uTKhdNxzEn86TLtdlemA4bUe8/edit?usp=sharing)",
+ "color": 2326507,
+ "fields": []
+ }
+ ],
+ "components": [],
+ "actions": {},
+ "username": "Couteau Suisse",
+ "avatar_url": "https://srv.latostadora.com/designall.dll/couteau-suisse---dessin-drole-sketchy--i:141385141697014138520;d:1416970;w:520;b:FFFFFF;m:1.jpg"
+}
\ No newline at end of file
diff --git a/commands/server-stats/server-stats.js b/commands/server-stats/server-stats.js
new file mode 100644
index 0000000..09fe90e
--- /dev/null
+++ b/commands/server-stats/server-stats.js
@@ -0,0 +1,111 @@
+const axios = require('axios');
+const { SlashCommandBuilder } = require('discord.js');
+const { EmbedBuilder } = require('discord.js');
+
+const getPlayersNumberAndFPS = (token) => {
+ return new Promise((resolve, reject) => {
+ let infos = "";
+
+ axios({
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: 'http://play.louismazin.ovh:8212/v1/api/metrics',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': `Basic ${token}`
+ }
+ })
+ .then((response) => {
+ infos += "## FPS du Serveur : "+response.data["serverfps"]+'\n';
+ infos += "## Nombre de joueurs connectรฉs : "+response.data["currentplayernum"]+'\n';
+ resolve(infos);
+ })
+ .catch((error) => {
+ console.log("Erreur lors de l'appel ร l'api pterodactyl (serveur injoignable)");
+ reject("Le serveur est hors ligne.");
+ });
+ });
+}
+const getPlayers = (token) => {
+ return new Promise((resolve, reject) => {
+ let infos = "";
+
+ axios({
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: 'http://play.louismazin.ovh:8212/v1/api/players',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': `Basic ${token}`
+ }
+ })
+ .then((response) => {
+ const players = Object.entries(response.data.players);
+ if (players.length === 0) {
+ resolve(infos);
+ return;
+ }
+ for(const player of players) {
+ const joueur = player[1];
+ infos += "### - "+joueur.name+' - niveau '+joueur.level+' - ping : '+Math.round(joueur.ping)+'ms\n';
+ }
+ resolve(infos);
+ })
+ .catch((error) => {
+ console.log("Erreur lors de l'appel ร l'api pterodactyl (serveur injoignable)");
+ reject("Le serveur est hors ligne.");
+ });
+ });
+}
+const getParams = (token) => {
+ return new Promise((resolve, reject) => {
+ let infos = "## Paramรจtres du Serveur : \n";
+
+ axios({
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: 'http://play.louismazin.ovh:8212/v1/api/settings',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': `Basic ${token}`
+ }
+ })
+ .then((response) => {
+ const paramNames = {'Difficulty': 'Difficultรฉ', 'DeathPenalty': 'Pรฉnalitรฉ de mort', 'bEnableInvaderEnemy': 'Ennemis envahisseurs', 'BaseCampMaxNumInGuild': 'Nombre max de camps par guilde', 'BaseCampWorkerMaxNum': 'Nombre max de pals par camp'}
+ const params = Object.entries(response.data);
+ for(const [key, value] of params) {
+ if(Object.keys(paramNames).indexOf(key) !== -1) {
+ infos += "### - "+paramNames[key]+' : '+value+'\n';
+ }
+ }
+ resolve(infos);
+ })
+ .catch((error) => {
+ console.log("Erreur lors de l'appel ร l'api pterodactyl (serveur injoignable)");
+ reject("Le serveur est hors ligne.");
+ });
+ });
+}
+module.exports = {
+ data: new SlashCommandBuilder()
+ .setName('server-stats')
+ .setDescription('Afichez les informations sur le Serveur Palworld !')
+ .addUserOption(option =>
+ option.setName('user')
+ .setDescription('Utilisateur ร mentionner')
+ .setRequired(false)),
+ async execute(interaction,token) {
+ try {
+ const infos = await getPlayersNumberAndFPS(token);
+ const params = await getParams(token);
+ const players = await getPlayers(token);
+ const user = interaction.options.getUser('user')
+ const message = new EmbedBuilder()
+ .setColor('#0099ff')
+ .setDescription('# Informations sur le Serveur Palworld\n\n## :video_game: Nom du serveur :\n### Rygainland\n\n## :wireless: IP :\n### play.louismazin.ovh:1028\n\n## :no_entry: Mot de passe :\n### serverpassword\n\n## :repeat: รtat :\n### https://discord.com/channels/1068240252092813373/1263481798667796623\n'+infos+(players==="" ? "" : players+"\n")+'\n'+params);
+ await interaction.reply({ content: (user ? "||<@"+interaction.options.getUser('user').id+">||\n" : null), embeds: [message] });
+ } catch (error) {
+ await interaction.reply({ content: "Une erreur est survenue : " + error, ephemeral: true });
+ }
+ },
+};
\ No newline at end of file
diff --git a/deploy_command.js b/deploy_command.js
new file mode 100644
index 0000000..d3786a5
--- /dev/null
+++ b/deploy_command.js
@@ -0,0 +1,45 @@
+const { REST, Routes } = require('discord.js');
+const fs = require('node:fs');
+const path = require('node:path');
+module.exports = (token) => {
+ const guildIds = ["1230809896744779777","1068240252092813373"];
+ const commands = [];
+ // Grab all the command folders from the commands directory you created earlier
+ const foldersPath = path.join(__dirname, 'commands');
+ const commandFolders = fs.readdirSync(foldersPath);
+
+ for (const folder of commandFolders) {
+ // Grab all the command files from the commands directory you created earlier
+ const commandsPath = path.join(foldersPath, folder);
+ const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js'));
+ // Grab the SlashCommandBuilder#toJSON() output of each command's data for deployment
+ for (const file of commandFiles) {
+ const filePath = path.join(commandsPath, file);
+ const command = require(filePath);
+ if ('data' in command && 'execute' in command) {
+ commands.push(command.data.toJSON());
+ } else {
+ console.log(`[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`);
+ }
+ }
+ }
+ // Construct and prepare an instance of the REST module
+ const rest = new REST().setToken(token);
+
+ // and deploy your commands!
+ (async () => {
+ try {
+ // The put method is used to fully refresh all commands in the guild with the current set
+ for(const guildId of guildIds){
+ console.log(`Started refreshing ${commands.length} application (/) commands.`);
+ const data = await rest.put(
+ Routes.applicationGuildCommands(1256304109393547305n, guildId),
+ { body: commands },
+ ).then(data=>console.log(`Successfully reloaded ${data.length} application (/) commands.`))
+ }
+ } catch (error) {
+ // And of course, make sure you catch and log any errors!
+ console.error(error);
+ }
+ })();
+}
\ No newline at end of file
diff --git a/displayer.js b/displayer.js
new file mode 100644
index 0000000..2d47ba5
--- /dev/null
+++ b/displayer.js
@@ -0,0 +1,48 @@
+const axios = require('axios');
+
+
+const update = async (headers,numbers,client) => {
+ try {
+ let state = "๐ด";
+ let players = "0";
+ let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: 'http://play.louismazin.ovh:8212/v1/api/metrics',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Basic YWRtaW46Q2FjYXBpcGlkdTc5',
+ }
+ };
+
+ axios(config)
+ .then((response) => {
+ players = response.data["currentplayernum"];
+ })
+ .catch((error) => {
+ console.log("Erreur lors de l'appel ร l'api pterodactyl (serveur injoignable)");
+ players = "0";
+ });
+
+ const state_reponse = await fetch("https://panel.louismazin.ovh/api/client/servers/ae4a628f/resources", { method : "GET", headers });
+ const state_data = await state_reponse.json();
+ if(state_data["attributes"]["current_state"] === "running"){
+ state = "๐ข";
+ }else{
+ state = "๐ด";
+ }
+ const title = "๐๐๐ซ๐ฏ๐๐ซ : "+state+" ๐๐จ๐ฎ๐๐ฎ๐ซ๐ฌ : "+numbers[parseInt(players)];
+ client.channels.fetch(1263481798667796623n)
+ .then(channel => {
+ if(state !== channel.name.split(" ")[2] || numbers[parseInt(players)] !== channel.name.split(" ")[5]){
+ channel.setName(title);
+ console.log("Channel's name changed for : "+title);
+ }
+ })
+ .catch(error => {console.log("Bot : error :"+error);});
+
+ } catch (error) {
+ console.log("Bot : "+error);
+ }
+};
+module.exports = update;
\ No newline at end of file
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..eed59cc
--- /dev/null
+++ b/index.js
@@ -0,0 +1,74 @@
+const fs = require('node:fs');
+const path = require('node:path');
+const deploy = require('./deploy_command.js')
+const update = require('./displayer.js');
+const clean = require('./cleaner.js');
+const { Client, GatewayIntentBits, Collection, Events } = require('discord.js');
+
+const client = new Client({ intents: [GatewayIntentBits.GuildMembers,GatewayIntentBits.GuildMessages] });
+const args = process.argv;
+const token = args[2].toString();
+const pterodactyl = args[3].toString();
+const palworldToken = args[4].toString();
+const headers = {
+ "Accept": "application/json",
+ "Content-Type": "application/json",
+ "Authorization": "Bearer "+pterodactyl
+};
+const numbers=["๐","๐","๐","๐","๐","๐","๐","๐","๐","๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐","๐๐"];
+
+client.commands = new Collection();
+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);
+ // Set a new item in the Collection with the key as the command name and the value as the exported module
+ if ('data' in command && 'execute' in command) {
+ client.commands.set(command.data.name, command);
+ } else {
+ console.log(`[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`);
+ }
+ }
+}
+
+client.on('ready', () => {
+ console.log('Bot started !');
+ deploy(token);
+ client.user.setPresence({ activities: [{ name: 'des vidรฉos de Rygain.', type: 'WATCHING' }], status: 'online' });
+});
+
+client.on(Events.InteractionCreate, async interaction => {
+ if (!interaction.isChatInputCommand()) return;
+
+ const command = interaction.client.commands.get(interaction.commandName);
+
+ if (!command) {
+ console.error(`No command matching ${interaction.commandName} was found.`);
+ return;
+ }
+
+ try {
+ if (interaction.commandName === 'server-stats') {
+ await command.execute(interaction, palworldToken);
+ }else{
+ await command.execute(interaction);
+ }
+ } catch (error) {
+ console.error(error);
+ if (interaction.replied || interaction.deferred) {
+ await interaction.followUp({ content: 'There was an error while executing this command!', ephemeral: true });
+ } else {
+ await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true });
+ }
+ }
+});
+
+client.login(token);
+
+setInterval(()=>{update(headers,numbers,client)}, 300000);
+setInterval(()=>{clean(client)}, 86400000);
\ No newline at end of file
diff --git a/node_modules/.bin/node b/node_modules/.bin/node
new file mode 100644
index 0000000..5e4341d
--- /dev/null
+++ b/node_modules/.bin/node
@@ -0,0 +1,12 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*)
+ if command -v cygpath > /dev/null 2>&1; then
+ basedir=`cygpath -w "$basedir"`
+ fi
+ ;;
+esac
+
+exec "$basedir/../node/bin/node" "$@"
diff --git a/node_modules/.bin/node.cmd b/node_modules/.bin/node.cmd
new file mode 100644
index 0000000..fb2c308
--- /dev/null
+++ b/node_modules/.bin/node.cmd
@@ -0,0 +1,9 @@
+@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+"%dp0%\..\node\bin\node" %*
diff --git a/node_modules/.bin/node.ps1 b/node_modules/.bin/node.ps1
new file mode 100644
index 0000000..99a0aac
--- /dev/null
+++ b/node_modules/.bin/node.ps1
@@ -0,0 +1,16 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+# Support pipeline input
+if ($MyInvocation.ExpectingInput) {
+ $input | & "$basedir/../node/bin/node" $args
+} else {
+ & "$basedir/../node/bin/node" $args
+}
+exit $LASTEXITCODE
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
new file mode 100644
index 0000000..701b06b
--- /dev/null
+++ b/node_modules/.package-lock.json
@@ -0,0 +1,524 @@
+{
+ "name": "bot-discord",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "node_modules/@discordjs/builders": {
+ "version": "1.11.2",
+ "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.11.2.tgz",
+ "integrity": "sha512-F1WTABdd8/R9D1icJzajC4IuLyyS8f3rTOz66JsSI3pKvpCAtsMBweu8cyNYsIyvcrKAVn9EPK+Psoymq+XC0A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@discordjs/formatters": "^0.6.1",
+ "@discordjs/util": "^1.1.1",
+ "@sapphire/shapeshift": "^4.0.0",
+ "discord-api-types": "^0.38.1",
+ "fast-deep-equal": "^3.1.3",
+ "ts-mixer": "^6.0.4",
+ "tslib": "^2.6.3"
+ },
+ "engines": {
+ "node": ">=16.11.0"
+ },
+ "funding": {
+ "url": "https://github.com/discordjs/discord.js?sponsor"
+ }
+ },
+ "node_modules/@discordjs/collection": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz",
+ "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=16.11.0"
+ }
+ },
+ "node_modules/@discordjs/formatters": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.1.tgz",
+ "integrity": "sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "discord-api-types": "^0.38.1"
+ },
+ "engines": {
+ "node": ">=16.11.0"
+ },
+ "funding": {
+ "url": "https://github.com/discordjs/discord.js?sponsor"
+ }
+ },
+ "node_modules/@discordjs/rest": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.5.0.tgz",
+ "integrity": "sha512-PWhchxTzpn9EV3vvPRpwS0EE2rNYB9pvzDU/eLLW3mByJl0ZHZjHI2/wA8EbH2gRMQV7nu+0FoDF84oiPl8VAQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@discordjs/collection": "^2.1.1",
+ "@discordjs/util": "^1.1.1",
+ "@sapphire/async-queue": "^1.5.3",
+ "@sapphire/snowflake": "^3.5.3",
+ "@vladfrangu/async_event_emitter": "^2.4.6",
+ "discord-api-types": "^0.38.1",
+ "magic-bytes.js": "^1.10.0",
+ "tslib": "^2.6.3",
+ "undici": "6.21.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/discordjs/discord.js?sponsor"
+ }
+ },
+ "node_modules/@discordjs/rest/node_modules/@discordjs/collection": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz",
+ "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/discordjs/discord.js?sponsor"
+ }
+ },
+ "node_modules/@discordjs/util": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz",
+ "integrity": "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/discordjs/discord.js?sponsor"
+ }
+ },
+ "node_modules/@discordjs/ws": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.2.tgz",
+ "integrity": "sha512-dyfq7yn0wO0IYeYOs3z79I6/HumhmKISzFL0Z+007zQJMtAFGtt3AEoq1nuLXtcunUE5YYYQqgKvybXukAK8/w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@discordjs/collection": "^2.1.0",
+ "@discordjs/rest": "^2.5.0",
+ "@discordjs/util": "^1.1.0",
+ "@sapphire/async-queue": "^1.5.2",
+ "@types/ws": "^8.5.10",
+ "@vladfrangu/async_event_emitter": "^2.2.4",
+ "discord-api-types": "^0.38.1",
+ "tslib": "^2.6.2",
+ "ws": "^8.17.0"
+ },
+ "engines": {
+ "node": ">=16.11.0"
+ },
+ "funding": {
+ "url": "https://github.com/discordjs/discord.js?sponsor"
+ }
+ },
+ "node_modules/@discordjs/ws/node_modules/@discordjs/collection": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz",
+ "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/discordjs/discord.js?sponsor"
+ }
+ },
+ "node_modules/@sapphire/async-queue": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.5.tgz",
+ "integrity": "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=v14.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@sapphire/shapeshift": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz",
+ "integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "lodash": "^4.17.21"
+ },
+ "engines": {
+ "node": ">=v16"
+ }
+ },
+ "node_modules/@sapphire/snowflake": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz",
+ "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=v14.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "24.0.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.0.tgz",
+ "integrity": "sha512-yZQa2zm87aRVcqDyH5+4Hv9KYgSdgwX1rFnGvpbzMaC7YAljmhBET93TPiTd3ObwTL+gSpIzPKg5BqVxdCvxKg==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.8.0"
+ }
+ },
+ "node_modules/@types/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@vladfrangu/async_event_emitter": {
+ "version": "2.4.6",
+ "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz",
+ "integrity": "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/axios": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz",
+ "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.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==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/discord-api-types": {
+ "version": "0.38.11",
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.11.tgz",
+ "integrity": "sha512-XN0qhcQpetkyb/49hcDHuoeUPsQqOkb17wbV/t48gUkoEDi4ajhsxqugGcxvcN17BBtI9FPPWEgzv6IhQmCwyw==",
+ "license": "MIT",
+ "workspaces": [
+ "scripts/actions/documentation"
+ ]
+ },
+ "node_modules/discord.js": {
+ "version": "14.19.3",
+ "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.19.3.tgz",
+ "integrity": "sha512-lncTRk0k+8Q5D3nThnODBR8fR8x2fM798o8Vsr40Krx0DjPwpZCuxxTcFMrXMQVOqM1QB9wqWgaXPg3TbmlHqA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@discordjs/builders": "^1.11.2",
+ "@discordjs/collection": "1.5.3",
+ "@discordjs/formatters": "^0.6.1",
+ "@discordjs/rest": "^2.5.0",
+ "@discordjs/util": "^1.1.1",
+ "@discordjs/ws": "^1.2.2",
+ "@sapphire/snowflake": "3.5.3",
+ "discord-api-types": "^0.38.1",
+ "fast-deep-equal": "3.1.3",
+ "lodash.snakecase": "4.1.1",
+ "magic-bytes.js": "^1.10.0",
+ "tslib": "^2.6.3",
+ "undici": "6.21.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/discordjs/discord.js?sponsor"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/fetch-blob": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "node-domexception": "^1.0.0",
+ "web-streams-polyfill": "^3.0.3"
+ },
+ "engines": {
+ "node": "^12.20 || >= 14.13"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/formdata-polyfill": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fetch-blob": "^3.1.2"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/magic-bytes.js": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz",
+ "integrity": "sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/node": {
+ "version": "18.20.5",
+ "resolved": "https://registry.npmjs.org/node/-/node-18.20.5.tgz",
+ "integrity": "sha512-v4kVqf+wQAEGAODwH6GZLH8ur8gCcGESjO1lpfgIEMT4DzU4XgYhnq4yJ5sNwO7MTsxTG9m66vMjVzRf/4Okqg==",
+ "hasInstallScript": true,
+ "license": "ISC",
+ "dependencies": {
+ "node-bin-setup": "^1.0.0"
+ },
+ "bin": {
+ "node": "bin/node"
+ },
+ "engines": {
+ "npm": ">=5.0.0"
+ }
+ },
+ "node_modules/node-bin-setup": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz",
+ "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==",
+ "license": "ISC"
+ },
+ "node_modules/node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "github",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.5.0"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+ "license": "MIT",
+ "dependencies": {
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/node-fetch"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
+ "node_modules/pterosocket": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/pterosocket/-/pterosocket-1.0.6.tgz",
+ "integrity": "sha512-5zkWwb4/19PM3iQGSP7QgYjr3+OSORPbdE5pWMbl/kedSzAKwGmS404+/3et6KvoAohXfoZeQSF+rJ+4QVBu3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "node-fetch": "^3.2.4"
+ }
+ },
+ "node_modules/ts-mixer": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz",
+ "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==",
+ "license": "MIT"
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/undici": {
+ "version": "6.21.1",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.1.tgz",
+ "integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
+ "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
+ "license": "MIT"
+ },
+ "node_modules/web-streams-polyfill": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.18.2",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz",
+ "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==",
+ "license": "MIT",
+ "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/LICENSE b/node_modules/@discordjs/builders/LICENSE
new file mode 100644
index 0000000..cbe9c65
--- /dev/null
+++ b/node_modules/@discordjs/builders/LICENSE
@@ -0,0 +1,191 @@
+ 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
new file mode 100644
index 0000000..dc88b7f
--- /dev/null
+++ b/node_modules/@discordjs/builders/README.md
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## About
+
+`@discordjs/builders` is a utility package for easily building Discord API payloads.
+
+## Installation
+
+**Node.js 16.11.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.mts b/node_modules/@discordjs/builders/dist/index.d.mts
new file mode 100644
index 0000000..428a46b
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.d.mts
@@ -0,0 +1,2611 @@
+import * as _sapphire_shapeshift from '@sapphire/shapeshift';
+import { APIEmbedField, APIEmbedAuthor, APIEmbedFooter, APIEmbedImage, APIEmbed, APISelectMenuOption, APIMessageComponentEmoji, ButtonStyle, ChannelType, APIActionRowComponent, APIComponentInActionRow, APIMessageComponent, APIBaseComponent, ComponentType, APIButtonComponent, Snowflake, APISelectMenuComponent, APIChannelSelectComponent, APIMentionableSelectComponent, APISelectMenuDefaultValue, SelectMenuDefaultValueType, APIRoleSelectComponent, APIStringSelectComponent, APIUserSelectComponent, APITextInputComponent, TextInputStyle, APIComponentInMessageActionRow, APIComponentInModalActionRow, APIFileComponent, APISeparatorComponent, SeparatorSpacingSize, APITextDisplayComponent, APIContainerComponent, APIMediaGalleryComponent, APISectionComponent, APIComponentInContainer, APIMediaGalleryItem, APIThumbnailComponent, APIModalComponent, APIModalInteractionResponseCallbackData, LocalizationMap, LocaleString, InteractionContextType, Permissions, ApplicationIntegrationType, RESTPostAPIChatInputApplicationCommandsJSONBody, ApplicationCommandOptionType, APIApplicationCommandBasicOption, APIApplicationCommandAttachmentOption, APIApplicationCommandBooleanOption, APIApplicationCommandChannelOption, APIApplicationCommandOptionChoice, APIApplicationCommandIntegerOption, APIApplicationCommandMentionableOption, APIApplicationCommandNumberOption, APIApplicationCommandRoleOption, APIApplicationCommandStringOption, APIApplicationCommandUserOption, APIApplicationCommandSubcommandGroupOption, APIApplicationCommandSubcommandOption, 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$1: _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$6_RGBPredicate: typeof RGBPredicate;
+declare const Assertions$6_authorNamePredicate: typeof authorNamePredicate;
+declare const Assertions$6_colorPredicate: typeof colorPredicate;
+declare const Assertions$6_embedAuthorPredicate: typeof embedAuthorPredicate;
+declare const Assertions$6_embedFieldPredicate: typeof embedFieldPredicate;
+declare const Assertions$6_embedFieldsArrayPredicate: typeof embedFieldsArrayPredicate;
+declare const Assertions$6_embedFooterPredicate: typeof embedFooterPredicate;
+declare const Assertions$6_fieldInlinePredicate: typeof fieldInlinePredicate;
+declare const Assertions$6_fieldLengthPredicate: typeof fieldLengthPredicate;
+declare const Assertions$6_fieldNamePredicate: typeof fieldNamePredicate;
+declare const Assertions$6_fieldValuePredicate: typeof fieldValuePredicate;
+declare const Assertions$6_footerTextPredicate: typeof footerTextPredicate;
+declare const Assertions$6_imageURLPredicate: typeof imageURLPredicate;
+declare const Assertions$6_timestampPredicate: typeof timestampPredicate;
+declare const Assertions$6_titlePredicate: typeof titlePredicate;
+declare const Assertions$6_urlPredicate: typeof urlPredicate;
+declare const Assertions$6_validateFieldLength: typeof validateFieldLength;
+declare namespace Assertions$6 {
+ export { Assertions$6_RGBPredicate as RGBPredicate, Assertions$6_authorNamePredicate as authorNamePredicate, Assertions$6_colorPredicate as colorPredicate, descriptionPredicate$1 as descriptionPredicate, Assertions$6_embedAuthorPredicate as embedAuthorPredicate, Assertions$6_embedFieldPredicate as embedFieldPredicate, Assertions$6_embedFieldsArrayPredicate as embedFieldsArrayPredicate, Assertions$6_embedFooterPredicate as embedFooterPredicate, Assertions$6_fieldInlinePredicate as fieldInlinePredicate, Assertions$6_fieldLengthPredicate as fieldLengthPredicate, Assertions$6_fieldNamePredicate as fieldNamePredicate, Assertions$6_fieldValuePredicate as fieldValuePredicate, Assertions$6_footerTextPredicate as footerTextPredicate, Assertions$6_imageURLPredicate as imageURLPredicate, Assertions$6_timestampPredicate as timestampPredicate, Assertions$6_titlePredicate as titlePredicate, Assertions$6_urlPredicate as urlPredicate, Assertions$6_validateFieldLength as validateFieldLength };
+}
+
+/**
+ * Normalizes data that is a rest parameter or an array into an array with a depth of 1.
+ *
+ * @typeParam ItemType - The data that must satisfy {@link RestOrArray}.
+ * @param arr - The (possibly variadic) data to normalize
+ */
+declare function normalizeArray(arr: RestOrArray): ItemType[];
+/**
+ * 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 = Type[] | [Type[]];
+
+/**
+ * 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.
+ */
+interface EmbedAuthorData extends IconData, Omit {
+}
+/**
+ * Represents the author options of an embed.
+ */
+interface EmbedAuthorOptions extends Omit {
+}
+/**
+ * Represents the footer data of an embed.
+ */
+interface EmbedFooterData extends IconData, Omit {
+}
+/**
+ * Represents the footer options of an embed.
+ */
+interface EmbedFooterOptions extends 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 idValidator: _sapphire_shapeshift.NumberValidator;
+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, skuId?: string, url?: string): void;
+
+declare const Assertions$5_buttonLabelValidator: typeof buttonLabelValidator;
+declare const Assertions$5_buttonStyleValidator: typeof buttonStyleValidator;
+declare const Assertions$5_channelTypesValidator: typeof channelTypesValidator;
+declare const Assertions$5_customIdValidator: typeof customIdValidator;
+declare const Assertions$5_defaultValidator: typeof defaultValidator;
+declare const Assertions$5_disabledValidator: typeof disabledValidator;
+declare const Assertions$5_emojiValidator: typeof emojiValidator;
+declare const Assertions$5_idValidator: typeof idValidator;
+declare const Assertions$5_jsonOptionValidator: typeof jsonOptionValidator;
+declare const Assertions$5_labelValueDescriptionValidator: typeof labelValueDescriptionValidator;
+declare const Assertions$5_minMaxValidator: typeof minMaxValidator;
+declare const Assertions$5_optionValidator: typeof optionValidator;
+declare const Assertions$5_optionsLengthValidator: typeof optionsLengthValidator;
+declare const Assertions$5_optionsValidator: typeof optionsValidator;
+declare const Assertions$5_urlValidator: typeof urlValidator;
+declare const Assertions$5_validateRequiredButtonParameters: typeof validateRequiredButtonParameters;
+declare const Assertions$5_validateRequiredSelectMenuOptionParameters: typeof validateRequiredSelectMenuOptionParameters;
+declare const Assertions$5_validateRequiredSelectMenuParameters: typeof validateRequiredSelectMenuParameters;
+declare namespace Assertions$5 {
+ export { Assertions$5_buttonLabelValidator as buttonLabelValidator, Assertions$5_buttonStyleValidator as buttonStyleValidator, Assertions$5_channelTypesValidator as channelTypesValidator, Assertions$5_customIdValidator as customIdValidator, Assertions$5_defaultValidator as defaultValidator, Assertions$5_disabledValidator as disabledValidator, Assertions$5_emojiValidator as emojiValidator, Assertions$5_idValidator as idValidator, Assertions$5_jsonOptionValidator as jsonOptionValidator, Assertions$5_labelValueDescriptionValidator as labelValueDescriptionValidator, Assertions$5_minMaxValidator as minMaxValidator, Assertions$5_optionValidator as optionValidator, Assertions$5_optionsLengthValidator as optionsLengthValidator, Assertions$5_optionsValidator as optionsValidator, placeholderValidator$1 as placeholderValidator, Assertions$5_urlValidator as urlValidator, Assertions$5_validateRequiredButtonParameters as validateRequiredButtonParameters, Assertions$5_validateRequiredSelectMenuOptionParameters as validateRequiredSelectMenuOptionParameters, Assertions$5_validateRequiredSelectMenuParameters as validateRequiredSelectMenuParameters };
+}
+
+/**
+ * Any action row component data represented as an object.
+ */
+type AnyAPIActionRowComponent = APIActionRowComponent | APIComponentInActionRow | APIMessageComponent;
+/**
+ * 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);
+ /**
+ * Sets the id (not the custom id) for this component.
+ *
+ * @param id - The id for this component
+ */
+ setId(id: number): this;
+ /**
+ * Clears the id of this component, defaulting to a default incremented id.
+ */
+ clearId(): this;
+}
+
+/**
+ * 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 SKU id that represents a purchasable SKU for this button.
+ *
+ * @remarks Only available when using premium-style buttons.
+ * @param skuId - The SKU id to use
+ */
+ setSKUId(skuId: Snowflake): 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;
+ /**
+ * Adds default channels to this auto populated select menu.
+ *
+ * @param channels - The channels to add
+ */
+ addDefaultChannels(...channels: RestOrArray): this;
+ /**
+ * Sets default channels for this auto populated select menu.
+ *
+ * @param channels - The channels to set
+ */
+ setDefaultChannels(...channels: 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);
+ /**
+ * Adds default roles to this auto populated select menu.
+ *
+ * @param roles - The roles to add
+ */
+ addDefaultRoles(...roles: RestOrArray): this;
+ /**
+ * Adds default users to this auto populated select menu.
+ *
+ * @param users - The users to add
+ */
+ addDefaultUsers(...users: RestOrArray): this;
+ /**
+ * Adds default values to this auto populated select menu.
+ *
+ * @param values - The values to add
+ */
+ addDefaultValues(...values: RestOrArray | APISelectMenuDefaultValue>): this;
+ /**
+ * Sets default values for this auto populated select menu.
+ *
+ * @param values - The values to set
+ */
+ setDefaultValues(...values: RestOrArray | APISelectMenuDefaultValue>): this;
+}
+
+/**
+ * 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);
+ /**
+ * Adds default roles to this auto populated select menu.
+ *
+ * @param roles - The roles to add
+ */
+ addDefaultRoles(...roles: RestOrArray): this;
+ /**
+ * Sets default roles for this auto populated select menu.
+ *
+ * @param roles - The roles to set
+ */
+ setDefaultRoles(...roles: RestOrArray): this;
+}
+
+/**
+ * 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);
+ /**
+ * Adds default users to this auto populated select menu.
+ *
+ * @param users - The users to add
+ */
+ addDefaultUsers(...users: RestOrArray): this;
+ /**
+ * Sets default users for this auto populated select menu.
+ *
+ * @param users - The users to set
+ */
+ setDefaultUsers(...users: RestOrArray): this;
+}
+
+/**
+ * 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 text input from an API data object:
+ * ```ts
+ * const textInput = new TextInputBuilder({
+ * custom_id: 'a cool text input',
+ * label: 'Type something',
+ * style: TextInputStyle.Short,
+ * });
+ * ```
+ * @example
+ * Creating a text input 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;
+ /**
+ * Whether this is equal to another structure.
+ */
+ equals(other: APITextInputComponent | JSONEncodable): boolean;
+}
+
+/**
+ * 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 ComponentType - The types of components this action row holds
+ */
+declare class ActionRowBuilder extends ComponentBuilder> {
+ /**
+ * The components within this action row.
+ */
+ readonly components: ComponentType[];
+ /**
+ * 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>;
+}
+
+declare class FileBuilder extends ComponentBuilder {
+ /**
+ * Creates a new file from API data.
+ *
+ * @param data - The API data to create this file with
+ * @example
+ * Creating a file from an API data object:
+ * ```ts
+ * const file = new FileBuilder({
+ * spoiler: true,
+ * file: {
+ * url: 'attachment://file.png',
+ * },
+ * });
+ * ```
+ * @example
+ * Creating a file using setters and API data:
+ * ```ts
+ * const file = new FileBuilder({
+ * file: {
+ * url: 'attachment://image.jpg',
+ * },
+ * })
+ * .setSpoiler(false);
+ * ```
+ */
+ constructor(data?: Partial);
+ /**
+ * Sets the spoiler status of this file.
+ *
+ * @param spoiler - The spoiler status to use
+ */
+ setSpoiler(spoiler?: boolean): this;
+ /**
+ * Sets the media URL of this file.
+ *
+ * @param url - The URL to use
+ */
+ setURL(url: string): this;
+ /**
+ * {@inheritDoc ComponentBuilder.toJSON}
+ */
+ toJSON(): APIFileComponent;
+}
+
+declare class SeparatorBuilder extends ComponentBuilder {
+ /**
+ * Creates a new separator from API data.
+ *
+ * @param data - The API data to create this separator with
+ * @example
+ * Creating a separator from an API data object:
+ * ```ts
+ * const separator = new SeparatorBuilder({
+ * spacing: SeparatorSpacingSize.Small,
+ * divider: true,
+ * });
+ * ```
+ * @example
+ * Creating a separator using setters and API data:
+ * ```ts
+ * const separator = new SeparatorBuilder({
+ * spacing: SeparatorSpacingSize.Large,
+ * })
+ * .setDivider(false);
+ * ```
+ */
+ constructor(data?: Partial);
+ /**
+ * Sets whether this separator should show a divider line.
+ *
+ * @param divider - Whether to show a divider line
+ */
+ setDivider(divider?: boolean): this;
+ /**
+ * Sets the spacing of this separator.
+ *
+ * @param spacing - The spacing to use
+ */
+ setSpacing(spacing: SeparatorSpacingSize): this;
+ /**
+ * Clears the spacing of this separator.
+ */
+ clearSpacing(): this;
+ /**
+ * {@inheritDoc ComponentBuilder.toJSON}
+ */
+ toJSON(): APISeparatorComponent;
+}
+
+declare class TextDisplayBuilder extends ComponentBuilder {
+ /**
+ * Creates a new text display from API data.
+ *
+ * @param data - The API data to create this text display with
+ * @example
+ * Creating a text display from an API data object:
+ * ```ts
+ * const textDisplay = new TextDisplayBuilder({
+ * content: 'some text',
+ * });
+ * ```
+ * @example
+ * Creating a text display using setters and API data:
+ * ```ts
+ * const textDisplay = new TextDisplayBuilder({
+ * content: 'old text',
+ * })
+ * .setContent('new text');
+ * ```
+ */
+ constructor(data?: Partial);
+ /**
+ * Sets the text of this text display.
+ *
+ * @param content - The text to use
+ */
+ setContent(content: string): this;
+ /**
+ * {@inheritDoc ComponentBuilder.toJSON}
+ */
+ toJSON(): APITextDisplayComponent;
+}
+
+/**
+ * The builders that may be used within a container.
+ */
+type ContainerComponentBuilder = ActionRowBuilder | FileBuilder | MediaGalleryBuilder | SectionBuilder | SeparatorBuilder | TextDisplayBuilder;
+/**
+ * A builder that creates API-compatible JSON data for a container.
+ */
+declare class ContainerBuilder extends ComponentBuilder {
+ /**
+ * The components within this container.
+ */
+ readonly components: ContainerComponentBuilder[];
+ /**
+ * Creates a new container from API data.
+ *
+ * @param data - The API data to create this container with
+ * @example
+ * Creating a container from an API data object:
+ * ```ts
+ * const container = new ContainerBuilder({
+ * components: [
+ * {
+ * content: "Some text here",
+ * type: ComponentType.TextDisplay,
+ * },
+ * ],
+ * });
+ * ```
+ * @example
+ * Creating a container using setters and API data:
+ * ```ts
+ * const container = new ContainerBuilder({
+ * components: [
+ * {
+ * content: "# Heading",
+ * type: ComponentType.TextDisplay,
+ * },
+ * ],
+ * })
+ * .addComponents(separator, section);
+ * ```
+ */
+ constructor({ components, ...data }?: Partial);
+ /**
+ * Sets the accent color of this container.
+ *
+ * @param color - The color to use
+ */
+ setAccentColor(color?: RGBTuple | number): this;
+ /**
+ * Clears the accent color of this container.
+ */
+ clearAccentColor(): this;
+ /**
+ * Adds action row components to this container.
+ *
+ * @param components - The action row components to add
+ */
+ addActionRowComponents(...components: RestOrArray | APIActionRowComponent | ((builder: ActionRowBuilder) => ActionRowBuilder)>): this;
+ /**
+ * Adds file components to this container.
+ *
+ * @param components - The file components to add
+ */
+ addFileComponents(...components: RestOrArray FileBuilder)>): this;
+ /**
+ * Adds media gallery components to this container.
+ *
+ * @param components - The media gallery components to add
+ */
+ addMediaGalleryComponents(...components: RestOrArray MediaGalleryBuilder)>): this;
+ /**
+ * Adds section components to this container.
+ *
+ * @param components - The section components to add
+ */
+ addSectionComponents(...components: RestOrArray SectionBuilder)>): this;
+ /**
+ * Adds separator components to this container.
+ *
+ * @param components - The separator components to add
+ */
+ addSeparatorComponents(...components: RestOrArray SeparatorBuilder)>): this;
+ /**
+ * Adds text display components to this container.
+ *
+ * @param components - The text display components to add
+ */
+ addTextDisplayComponents(...components: RestOrArray TextDisplayBuilder)>): this;
+ /**
+ * Removes, replaces, or inserts components for this container.
+ *
+ * @param index - The index to start removing, replacing or inserting components
+ * @param deleteCount - The amount of components to remove
+ * @param components - The components to set
+ */
+ spliceComponents(index: number, deleteCount: number, ...components: RestOrArray): this;
+ /**
+ * Sets the spoiler status of this container.
+ *
+ * @param spoiler - The spoiler status to use
+ */
+ setSpoiler(spoiler?: boolean): this;
+ /**
+ * {@inheritDoc ComponentBuilder.toJSON}
+ */
+ toJSON(): APIContainerComponent;
+}
+
+declare class MediaGalleryItemBuilder implements JSONEncodable {
+ /**
+ * The API data associated with this media gallery item.
+ */
+ readonly data: Partial;
+ /**
+ * Creates a new media gallery item from API data.
+ *
+ * @param data - The API data to create this media gallery item with
+ * @example
+ * Creating a media gallery item from an API data object:
+ * ```ts
+ * const item = new MediaGalleryItemBuilder({
+ * description: "Some text here",
+ * media: {
+ * url: 'https://cdn.discordapp.com/embed/avatars/2.png',
+ * },
+ * });
+ * ```
+ * @example
+ * Creating a media gallery item using setters and API data:
+ * ```ts
+ * const item = new MediaGalleryItemBuilder({
+ * media: {
+ * url: 'https://cdn.discordapp.com/embed/avatars/5.png',
+ * },
+ * })
+ * .setDescription("alt text");
+ * ```
+ */
+ constructor(data?: Partial);
+ /**
+ * Sets the description of this media gallery item.
+ *
+ * @param description - The description to use
+ */
+ setDescription(description: string): this;
+ /**
+ * Clears the description of this media gallery item.
+ */
+ clearDescription(): this;
+ /**
+ * Sets the spoiler status of this media gallery item.
+ *
+ * @param spoiler - The spoiler status to use
+ */
+ setSpoiler(spoiler?: boolean): this;
+ /**
+ * Sets the media URL of this media gallery item.
+ *
+ * @param url - The URL to use
+ */
+ setURL(url: string): 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(): APIMediaGalleryItem;
+}
+
+/**
+ * A builder that creates API-compatible JSON data for a container.
+ */
+declare class MediaGalleryBuilder extends ComponentBuilder {
+ /**
+ * The components within this container.
+ */
+ readonly items: MediaGalleryItemBuilder[];
+ /**
+ * Creates a new media gallery from API data.
+ *
+ * @param data - The API data to create this media gallery with
+ * @example
+ * Creating a media gallery from an API data object:
+ * ```ts
+ * const mediaGallery = new MediaGalleryBuilder({
+ * items: [
+ * {
+ * description: "Some text here",
+ * media: {
+ * url: 'https://cdn.discordapp.com/embed/avatars/2.png',
+ * },
+ * },
+ * ],
+ * });
+ * ```
+ * @example
+ * Creating a media gallery using setters and API data:
+ * ```ts
+ * const mediaGallery = new MediaGalleryBuilder({
+ * items: [
+ * {
+ * description: "alt text",
+ * media: {
+ * url: 'https://cdn.discordapp.com/embed/avatars/5.png',
+ * },
+ * },
+ * ],
+ * })
+ * .addItems(item2, item3);
+ * ```
+ */
+ constructor({ items, ...data }?: Partial);
+ /**
+ * Adds items to this media gallery.
+ *
+ * @param items - The items to add
+ */
+ addItems(...items: RestOrArray MediaGalleryItemBuilder)>): this;
+ /**
+ * Removes, replaces, or inserts media gallery items for this media gallery.
+ *
+ * @param index - The index to start removing, replacing or inserting items
+ * @param deleteCount - The amount of items to remove
+ * @param items - The items to insert
+ */
+ spliceItems(index: number, deleteCount: number, ...items: RestOrArray MediaGalleryItemBuilder)>): this;
+ /**
+ * {@inheritDoc ComponentBuilder.toJSON}
+ */
+ toJSON(): APIMediaGalleryComponent;
+}
+
+/**
+ * A builder that creates API-compatible JSON data for a section.
+ */
+declare class SectionBuilder extends ComponentBuilder {
+ /**
+ * The components within this section.
+ */
+ readonly components: ComponentBuilder[];
+ /**
+ * The accessory of this section.
+ */
+ readonly accessory?: ButtonBuilder | ThumbnailBuilder;
+ /**
+ * Creates a new section from API data.
+ *
+ * @param data - The API data to create this section with
+ * @example
+ * Creating a section from an API data object:
+ * ```ts
+ * const section = new SectionBuilder({
+ * components: [
+ * {
+ * content: "Some text here",
+ * type: ComponentType.TextDisplay,
+ * },
+ * ],
+ * accessory: {
+ * media: {
+ * url: 'https://cdn.discordapp.com/embed/avatars/3.png',
+ * },
+ * }
+ * });
+ * ```
+ * @example
+ * Creating a section using setters and API data:
+ * ```ts
+ * const section = new SectionBuilder({
+ * components: [
+ * {
+ * content: "# Heading",
+ * type: ComponentType.TextDisplay,
+ * },
+ * ],
+ * })
+ * .setPrimaryButtonAccessory(button);
+ * ```
+ */
+ constructor({ components, accessory, ...data }?: Partial);
+ /**
+ * Sets the accessory of this section to a button.
+ *
+ * @param accessory - The accessory to use
+ */
+ setButtonAccessory(accessory: APIButtonComponent | ButtonBuilder | ((builder: ButtonBuilder) => ButtonBuilder)): this;
+ /**
+ * Sets the accessory of this section to a thumbnail.
+ *
+ * @param accessory - The accessory to use
+ */
+ setThumbnailAccessory(accessory: APIThumbnailComponent | ThumbnailBuilder | ((builder: ThumbnailBuilder) => ThumbnailBuilder)): this;
+ /**
+ * Adds text display components to this section.
+ *
+ * @param components - The text display components to add
+ */
+ addTextDisplayComponents(...components: RestOrArray TextDisplayBuilder)>): this;
+ /**
+ * Removes, replaces, or inserts text display components for this section.
+ *
+ * @param index - The index to start removing, replacing or inserting text display components
+ * @param deleteCount - The amount of text display components to remove
+ * @param components - The text display components to insert
+ */
+ spliceTextDisplayComponents(index: number, deleteCount: number, ...components: RestOrArray TextDisplayBuilder)>): this;
+ /**
+ * {@inheritDoc ComponentBuilder.toJSON}
+ */
+ toJSON(): APISectionComponent;
+}
+
+declare class ThumbnailBuilder extends ComponentBuilder {
+ /**
+ * Creates a new thumbnail from API data.
+ *
+ * @param data - The API data to create this thumbnail with
+ * @example
+ * Creating a thumbnail from an API data object:
+ * ```ts
+ * const thumbnail = new ThumbnailBuilder({
+ * description: 'some text',
+ * media: {
+ * url: 'https://cdn.discordapp.com/embed/avatars/4.png',
+ * },
+ * });
+ * ```
+ * @example
+ * Creating a thumbnail using setters and API data:
+ * ```ts
+ * const thumbnail = new ThumbnailBuilder({
+ * media: {
+ * url: 'attachment://image.png',
+ * },
+ * })
+ * .setDescription('alt text');
+ * ```
+ */
+ constructor(data?: Partial);
+ /**
+ * Sets the description of this thumbnail.
+ *
+ * @param description - The description to use
+ */
+ setDescription(description: string): this;
+ /**
+ * Clears the description of this thumbnail.
+ */
+ clearDescription(): this;
+ /**
+ * Sets the spoiler status of this thumbnail.
+ *
+ * @param spoiler - The spoiler status to use
+ */
+ setSpoiler(spoiler?: boolean): this;
+ /**
+ * Sets the media URL of this thumbnail.
+ *
+ * @param url - The URL to use
+ */
+ setURL(url: string): this;
+ /**
+ * {@inheritdoc ComponentBuilder.toJSON}
+ */
+ toJSON(): APIThumbnailComponent;
+}
+
+/**
+ * The builders that may be used for messages.
+ */
+type MessageComponentBuilder = ActionRowBuilder | ContainerBuilder | FileBuilder | MediaGalleryBuilder | MessageActionRowComponentBuilder | SectionBuilder | SeparatorBuilder | TextDisplayBuilder | ThumbnailBuilder;
+/**
+ * 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 a {@link ButtonBuilder}.
+ */
+ [ComponentType.Button]: ButtonBuilder;
+ /**
+ * The string select component type is associated with a {@link StringSelectMenuBuilder}.
+ */
+ [ComponentType.StringSelect]: StringSelectMenuBuilder;
+ /**
+ * The text input component type is associated with a {@link TextInputBuilder}.
+ */
+ [ComponentType.TextInput]: TextInputBuilder;
+ /**
+ * The user select component type is associated with a {@link UserSelectMenuBuilder}.
+ */
+ [ComponentType.UserSelect]: UserSelectMenuBuilder;
+ /**
+ * The role select component type is associated with a {@link RoleSelectMenuBuilder}.
+ */
+ [ComponentType.RoleSelect]: RoleSelectMenuBuilder;
+ /**
+ * The mentionable select component type is associated with a {@link MentionableSelectMenuBuilder}.
+ */
+ [ComponentType.MentionableSelect]: MentionableSelectMenuBuilder;
+ /**
+ * The channel select component type is associated with a {@link ChannelSelectMenuBuilder}.
+ */
+ [ComponentType.ChannelSelect]: ChannelSelectMenuBuilder;
+ /**
+ * The file component type is associated with a {@link FileBuilder}.
+ */
+ [ComponentType.File]: FileBuilder;
+ /**
+ * The separator component type is associated with a {@link SeparatorBuilder}.
+ */
+ [ComponentType.Separator]: SeparatorBuilder;
+ /**
+ * The container component type is associated with a {@link ContainerBuilder}.
+ */
+ [ComponentType.Container]: ContainerBuilder;
+ /**
+ * The text display component type is associated with a {@link TextDisplayBuilder}.
+ */
+ [ComponentType.TextDisplay]: TextDisplayBuilder;
+ /**
+ * The thumbnail component type is associated with a {@link ThumbnailBuilder}.
+ */
+ [ComponentType.Thumbnail]: ThumbnailBuilder;
+ /**
+ * The section component type is associated with a {@link SectionBuilder}.
+ */
+ [ComponentType.Section]: SectionBuilder;
+ /**
+ * The media gallery component type is associated with a {@link MediaGalleryBuilder}.
+ */
+ [ComponentType.MediaGallery]: MediaGalleryBuilder;
+}
+/**
+ * Factory for creating components from API data.
+ *
+ * @typeParam ComponentType - The type of component to use
+ * @param data - The API data to transform to a component class
+ */
+declare function createComponentBuilder(data: (APIModalComponent | APIMessageComponent) & {
+ type: ComponentType;
+}): MappedComponentTypes[ComponentType];
+/**
+ * Factory for creating components from API data.
+ *
+ * @typeParam ComponentBuilder - The type of component to use
+ * @param data - The API data to transform to a component class
+ */
+declare function createComponentBuilder(data: ComponentBuilder): ComponentBuilder;
+declare function resolveBuilder, Builder extends JSONEncodable>(builder: Builder | ComponentType | ((builder: Builder) => Builder), Constructor: new (data?: ComponentType) => Builder): Builder;
+
+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$4_labelValidator: typeof labelValidator;
+declare const Assertions$4_maxLengthValidator: typeof maxLengthValidator;
+declare const Assertions$4_minLengthValidator: typeof minLengthValidator;
+declare const Assertions$4_placeholderValidator: typeof placeholderValidator;
+declare const Assertions$4_requiredValidator: typeof requiredValidator;
+declare const Assertions$4_textInputStyleValidator: typeof textInputStyleValidator;
+declare const Assertions$4_valueValidator: typeof valueValidator;
+declare namespace Assertions$4 {
+ export { Assertions$4_labelValidator as labelValidator, Assertions$4_maxLengthValidator as maxLengthValidator, Assertions$4_minLengthValidator as minLengthValidator, Assertions$4_placeholderValidator as placeholderValidator, Assertions$4_requiredValidator as requiredValidator, Assertions$4_textInputStyleValidator as textInputStyleValidator, validateRequiredParameters$3 as validateRequiredParameters, Assertions$4_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$3_componentsValidator: typeof componentsValidator;
+declare const Assertions$3_titleValidator: typeof titleValidator;
+declare namespace Assertions$3 {
+ export { Assertions$3_componentsValidator as componentsValidator, Assertions$3_titleValidator as titleValidator, validateRequiredParameters$2 as validateRequiredParameters };
+}
+
+declare const unfurledMediaItemPredicate: _sapphire_shapeshift.ObjectValidator<{
+ url: string;
+}, _sapphire_shapeshift.UndefinedToOptional<{
+ url: string;
+}>>;
+declare const descriptionPredicate: _sapphire_shapeshift.StringValidator;
+declare const filePredicate: _sapphire_shapeshift.ObjectValidator<{
+ url: string;
+}, _sapphire_shapeshift.UndefinedToOptional<{
+ url: string;
+}>>;
+declare const spoilerPredicate: _sapphire_shapeshift.BooleanValidator;
+declare const dividerPredicate: _sapphire_shapeshift.BooleanValidator;
+declare const spacingPredicate: _sapphire_shapeshift.NativeEnumValidator;
+declare const textDisplayContentPredicate: _sapphire_shapeshift.StringValidator;
+declare const accessoryPredicate: _sapphire_shapeshift.UnionValidator;
+declare const containerColorPredicate: _sapphire_shapeshift.UnionValidator;
+declare function assertReturnOfBuilder$1(input: unknown, ExpectedInstanceOf: new () => ReturnType): asserts input is ReturnType;
+declare function validateComponentArray(input: unknown, min: number, max: number, ExpectedInstanceOf?: new () => ReturnType): asserts input is ReturnType[];
+
+declare const Assertions$2_accessoryPredicate: typeof accessoryPredicate;
+declare const Assertions$2_containerColorPredicate: typeof containerColorPredicate;
+declare const Assertions$2_descriptionPredicate: typeof descriptionPredicate;
+declare const Assertions$2_dividerPredicate: typeof dividerPredicate;
+declare const Assertions$2_filePredicate: typeof filePredicate;
+declare const Assertions$2_spacingPredicate: typeof spacingPredicate;
+declare const Assertions$2_spoilerPredicate: typeof spoilerPredicate;
+declare const Assertions$2_textDisplayContentPredicate: typeof textDisplayContentPredicate;
+declare const Assertions$2_unfurledMediaItemPredicate: typeof unfurledMediaItemPredicate;
+declare const Assertions$2_validateComponentArray: typeof validateComponentArray;
+declare namespace Assertions$2 {
+ export { Assertions$2_accessoryPredicate as accessoryPredicate, assertReturnOfBuilder$1 as assertReturnOfBuilder, Assertions$2_containerColorPredicate as containerColorPredicate, Assertions$2_descriptionPredicate as descriptionPredicate, Assertions$2_dividerPredicate as dividerPredicate, Assertions$2_filePredicate as filePredicate, Assertions$2_spacingPredicate as spacingPredicate, Assertions$2_spoilerPredicate as spoilerPredicate, Assertions$2_textDisplayContentPredicate as textDisplayContentPredicate, Assertions$2_unfurledMediaItemPredicate as unfurledMediaItemPredicate, Assertions$2_validateComponentArray as validateComponentArray };
+}
+
+/**
+ * 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;
+ /**
+ * 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;
+ /**
+ * 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;
+}
+
+/**
+ * This mixin holds symbols that can be shared in slashcommands independent of options or subcommands.
+ */
+declare class SharedSlashCommand {
+ readonly name: string;
+ readonly name_localizations?: LocalizationMap;
+ readonly description: string;
+ readonly description_localizations?: LocalizationMap;
+ readonly options: ToAPIApplicationCommandOptions[];
+ readonly contexts?: InteractionContextType[];
+ /**
+ * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead.
+ */
+ readonly default_permission: boolean | undefined;
+ readonly default_member_permissions: Permissions | null | undefined;
+ /**
+ * @deprecated Use {@link SharedSlashCommand.contexts} instead.
+ */
+ readonly dm_permission: boolean | undefined;
+ readonly integration_types?: ApplicationIntegrationType[];
+ readonly nsfw: boolean | undefined;
+ /**
+ * Sets the contexts of this command.
+ *
+ * @param contexts - The contexts
+ */
+ setContexts(...contexts: RestOrArray): this;
+ /**
+ * Sets the integration types of this command.
+ *
+ * @param integrationTypes - The integration types
+ */
+ setIntegrationTypes(...integrationTypes: RestOrArray): 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 or not to enable this command by default
+ * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}
+ * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.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}
+ * @deprecated
+ * Use {@link SharedSlashCommand.setContexts} instead.
+ */
+ setDMPermission(enabled: boolean | null | undefined): this;
+ /**
+ * Sets whether this command is NSFW.
+ *
+ * @param nsfw - Whether this command is NSFW
+ */
+ setNSFW(nsfw?: 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.
+ */
+ toJSON(): RESTPostAPIChatInputApplicationCommandsJSONBody;
+}
+
+/**
+ * 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, ChannelType.GuildMedia];
+/**
+ * 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: RestOrArray): 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 ApplicationCommandOptionWithAutocompleteMixin {
+ /**
+ * 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;
+ /**
+ * Whether this option uses autocomplete.
+ *
+ * @param autocomplete - Whether this option should use autocomplete
+ */
+ setAutocomplete(autocomplete: boolean): this;
+}
+
+/**
+ * This mixin holds choices and autocomplete symbols used for options.
+ */
+declare class ApplicationCommandOptionWithChoicesMixin {
+ /**
+ * The choices of this option.
+ */
+ readonly choices?: APIApplicationCommandOptionChoice[];
+ /**
+ * 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: RestOrArray>): this;
+ /**
+ * Sets multiple choices for this option.
+ *
+ * @param choices - The choices to set
+ */
+ setChoices>(...choices: RestOrArray): 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, ApplicationCommandOptionWithChoicesMixin, ApplicationCommandOptionWithAutocompleteMixin {
+}
+
+/**
+ * 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, ApplicationCommandOptionWithChoicesMixin, ApplicationCommandOptionWithAutocompleteMixin {
+}
+
+/**
+ * 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 ApplicationCommandOptionWithChoicesMixin, ApplicationCommandOptionWithAutocompleteMixin {
+}
+
+/**
+ * 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 TypeAfterAddingOptions - The type this class should return after adding an option.
+ */
+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)): TypeAfterAddingOptions;
+ /**
+ * Adds a user option.
+ *
+ * @param input - A function that returns an option builder or an already built builder
+ */
+ addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)): TypeAfterAddingOptions;
+ /**
+ * Adds a channel option.
+ *
+ * @param input - A function that returns an option builder or an already built builder
+ */
+ addChannelOption(input: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption)): TypeAfterAddingOptions;
+ /**
+ * Adds a role option.
+ *
+ * @param input - A function that returns an option builder or an already built builder
+ */
+ addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)): TypeAfterAddingOptions;
+ /**
+ * Adds an attachment option.
+ *
+ * @param input - A function that returns an option builder or an already built builder
+ */
+ addAttachmentOption(input: SlashCommandAttachmentOption | ((builder: SlashCommandAttachmentOption) => SlashCommandAttachmentOption)): TypeAfterAddingOptions;
+ /**
+ * Adds a mentionable option.
+ *
+ * @param input - A function that returns an option builder or an already built builder
+ */
+ addMentionableOption(input: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption)): TypeAfterAddingOptions;
+ /**
+ * Adds a string option.
+ *
+ * @param input - A function that returns an option builder or an already built builder
+ */
+ addStringOption(input: SlashCommandStringOption | ((builder: SlashCommandStringOption) => SlashCommandStringOption)): TypeAfterAddingOptions;
+ /**
+ * Adds an integer option.
+ *
+ * @param input - A function that returns an option builder or an already built builder
+ */
+ addIntegerOption(input: SlashCommandIntegerOption | ((builder: SlashCommandIntegerOption) => SlashCommandIntegerOption)): TypeAfterAddingOptions;
+ /**
+ * Adds a number option.
+ *
+ * @param input - A function that returns an option builder or an already built builder
+ */
+ addNumberOption(input: SlashCommandNumberOption | ((builder: SlashCommandNumberOption) => SlashCommandNumberOption)): TypeAfterAddingOptions;
+ /**
+ * 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 {
+}
+
+/**
+ * This mixin holds symbols that can be shared in slash subcommands.
+ *
+ * @typeParam TypeAfterAddingSubcommands - The type this class should return after adding a subcommand or subcommand group.
+ */
+declare class SharedSlashCommandSubcommands> {
+ readonly options: ToAPIApplicationCommandOptions[];
+ /**
+ * 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)): TypeAfterAddingSubcommands;
+ /**
+ * 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)): TypeAfterAddingSubcommands;
+}
+
+/**
+ * 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[];
+ /**
+ * The contexts for this command.
+ */
+ readonly contexts?: InteractionContextType[];
+ /**
+ * Whether this command is enabled by default when the application is added to a guild.
+ *
+ * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.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.
+ * @deprecated
+ * Use {@link SlashCommandBuilder.contexts} instead.
+ */
+ readonly dm_permission: boolean | undefined;
+ /**
+ * The integration types for this command.
+ */
+ readonly integration_types?: ApplicationIntegrationType[];
+ /**
+ * Whether this command is NSFW.
+ */
+ readonly nsfw: boolean | undefined;
+}
+interface SlashCommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions, SharedSlashCommandSubcommands, SharedSlashCommand {
+}
+/**
+ * An interface specifically for slash command subcommands.
+ */
+interface SlashCommandSubcommandsOnlyBuilder extends SharedNameAndDescription, SharedSlashCommandSubcommands, SharedSlashCommand {
+}
+/**
+ * An interface specifically for slash command options.
+ */
+interface SlashCommandOptionsOnlyBuilder extends SharedNameAndDescription, SharedSlashCommandOptions, SharedSlashCommand {
+}
+/**
+ * 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 () => ReturnType): asserts input is ReturnType;
+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 contextsPredicate$1: _sapphire_shapeshift.ArrayValidator;
+declare const integrationTypesPredicate$1: _sapphire_shapeshift.ArrayValidator;
+
+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, contextsPredicate$1 as contextsPredicate, integrationTypesPredicate$1 as integrationTypesPredicate, 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;
+ /**
+ * The contexts for this command.
+ */
+ readonly contexts?: InteractionContextType[];
+ /**
+ * 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.
+ * @deprecated
+ * Use {@link ContextMenuCommandBuilder.contexts} instead.
+ */
+ readonly dm_permission: boolean | undefined;
+ /**
+ * The integration types for this command.
+ */
+ readonly integration_types?: ApplicationIntegrationType[];
+ /**
+ * Sets the contexts of this command.
+ *
+ * @param contexts - The contexts
+ */
+ setContexts(...contexts: RestOrArray): this;
+ /**
+ * Sets integration types of this command.
+ *
+ * @param integrationTypes - The integration types
+ */
+ setIntegrationTypes(...integrationTypes: RestOrArray): this;
+ /**
+ * 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}
+ * @deprecated Use {@link ContextMenuCommandBuilder.setContexts} instead.
+ */
+ 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 contextsPredicate: _sapphire_shapeshift.ArrayValidator;
+declare const integrationTypesPredicate: _sapphire_shapeshift.ArrayValidator;
+
+declare const Assertions_contextsPredicate: typeof contextsPredicate;
+declare const Assertions_integrationTypesPredicate: typeof integrationTypesPredicate;
+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_contextsPredicate as contextsPredicate, Assertions_integrationTypesPredicate as integrationTypesPredicate, 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, type AnyAPIActionRowComponent, type AnyComponentBuilder, ApplicationCommandNumericOptionMinMaxValueMixin, type ApplicationCommandOptionAllowedChannelTypes, ApplicationCommandOptionBase, ApplicationCommandOptionChannelTypesMixin, ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin, BaseSelectMenuBuilder, ButtonBuilder, ChannelSelectMenuBuilder, Assertions$5 as ComponentAssertions, ComponentBuilder, Assertions$2 as ComponentsV2Assertions, ContainerBuilder, type ContainerComponentBuilder, Assertions as ContextMenuCommandAssertions, ContextMenuCommandBuilder, type ContextMenuCommandType, Assertions$6 as EmbedAssertions, type EmbedAuthorData, type EmbedAuthorOptions, EmbedBuilder, type EmbedFooterData, type EmbedFooterOptions, type EmbedImageData, FileBuilder, type IconData, type MappedComponentTypes, MediaGalleryBuilder, MediaGalleryItemBuilder, MentionableSelectMenuBuilder, type MessageActionRowComponentBuilder, type MessageComponentBuilder, type ModalActionRowComponentBuilder, Assertions$3 as ModalAssertions, ModalBuilder, type ModalComponentBuilder, type RGBTuple, type RestOrArray, RoleSelectMenuBuilder, SectionBuilder, StringSelectMenuBuilder as SelectMenuBuilder, StringSelectMenuOptionBuilder as SelectMenuOptionBuilder, SeparatorBuilder, SharedNameAndDescription, SharedSlashCommand, SharedSlashCommandOptions, SharedSlashCommandSubcommands, Assertions$1 as SlashCommandAssertions, SlashCommandAttachmentOption, SlashCommandBooleanOption, SlashCommandBuilder, SlashCommandChannelOption, SlashCommandIntegerOption, SlashCommandMentionableOption, SlashCommandNumberOption, type SlashCommandOptionsOnlyBuilder, SlashCommandRoleOption, SlashCommandStringOption, SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder, type SlashCommandSubcommandsOnlyBuilder, SlashCommandUserOption, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, TextDisplayBuilder, Assertions$4 as TextInputAssertions, TextInputBuilder, ThumbnailBuilder, type ToAPIApplicationCommandOptions, UserSelectMenuBuilder, createComponentBuilder, disableValidators, embedLength, enableValidators, isValidationEnabled, normalizeArray, resolveBuilder, version };
diff --git a/node_modules/@discordjs/builders/dist/index.d.ts b/node_modules/@discordjs/builders/dist/index.d.ts
new file mode 100644
index 0000000..428a46b
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.d.ts
@@ -0,0 +1,2611 @@
+import * as _sapphire_shapeshift from '@sapphire/shapeshift';
+import { APIEmbedField, APIEmbedAuthor, APIEmbedFooter, APIEmbedImage, APIEmbed, APISelectMenuOption, APIMessageComponentEmoji, ButtonStyle, ChannelType, APIActionRowComponent, APIComponentInActionRow, APIMessageComponent, APIBaseComponent, ComponentType, APIButtonComponent, Snowflake, APISelectMenuComponent, APIChannelSelectComponent, APIMentionableSelectComponent, APISelectMenuDefaultValue, SelectMenuDefaultValueType, APIRoleSelectComponent, APIStringSelectComponent, APIUserSelectComponent, APITextInputComponent, TextInputStyle, APIComponentInMessageActionRow, APIComponentInModalActionRow, APIFileComponent, APISeparatorComponent, SeparatorSpacingSize, APITextDisplayComponent, APIContainerComponent, APIMediaGalleryComponent, APISectionComponent, APIComponentInContainer, APIMediaGalleryItem, APIThumbnailComponent, APIModalComponent, APIModalInteractionResponseCallbackData, LocalizationMap, LocaleString, InteractionContextType, Permissions, ApplicationIntegrationType, RESTPostAPIChatInputApplicationCommandsJSONBody, ApplicationCommandOptionType, APIApplicationCommandBasicOption, APIApplicationCommandAttachmentOption, APIApplicationCommandBooleanOption, APIApplicationCommandChannelOption, APIApplicationCommandOptionChoice, APIApplicationCommandIntegerOption, APIApplicationCommandMentionableOption, APIApplicationCommandNumberOption, APIApplicationCommandRoleOption, APIApplicationCommandStringOption, APIApplicationCommandUserOption, APIApplicationCommandSubcommandGroupOption, APIApplicationCommandSubcommandOption, 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$1: _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$6_RGBPredicate: typeof RGBPredicate;
+declare const Assertions$6_authorNamePredicate: typeof authorNamePredicate;
+declare const Assertions$6_colorPredicate: typeof colorPredicate;
+declare const Assertions$6_embedAuthorPredicate: typeof embedAuthorPredicate;
+declare const Assertions$6_embedFieldPredicate: typeof embedFieldPredicate;
+declare const Assertions$6_embedFieldsArrayPredicate: typeof embedFieldsArrayPredicate;
+declare const Assertions$6_embedFooterPredicate: typeof embedFooterPredicate;
+declare const Assertions$6_fieldInlinePredicate: typeof fieldInlinePredicate;
+declare const Assertions$6_fieldLengthPredicate: typeof fieldLengthPredicate;
+declare const Assertions$6_fieldNamePredicate: typeof fieldNamePredicate;
+declare const Assertions$6_fieldValuePredicate: typeof fieldValuePredicate;
+declare const Assertions$6_footerTextPredicate: typeof footerTextPredicate;
+declare const Assertions$6_imageURLPredicate: typeof imageURLPredicate;
+declare const Assertions$6_timestampPredicate: typeof timestampPredicate;
+declare const Assertions$6_titlePredicate: typeof titlePredicate;
+declare const Assertions$6_urlPredicate: typeof urlPredicate;
+declare const Assertions$6_validateFieldLength: typeof validateFieldLength;
+declare namespace Assertions$6 {
+ export { Assertions$6_RGBPredicate as RGBPredicate, Assertions$6_authorNamePredicate as authorNamePredicate, Assertions$6_colorPredicate as colorPredicate, descriptionPredicate$1 as descriptionPredicate, Assertions$6_embedAuthorPredicate as embedAuthorPredicate, Assertions$6_embedFieldPredicate as embedFieldPredicate, Assertions$6_embedFieldsArrayPredicate as embedFieldsArrayPredicate, Assertions$6_embedFooterPredicate as embedFooterPredicate, Assertions$6_fieldInlinePredicate as fieldInlinePredicate, Assertions$6_fieldLengthPredicate as fieldLengthPredicate, Assertions$6_fieldNamePredicate as fieldNamePredicate, Assertions$6_fieldValuePredicate as fieldValuePredicate, Assertions$6_footerTextPredicate as footerTextPredicate, Assertions$6_imageURLPredicate as imageURLPredicate, Assertions$6_timestampPredicate as timestampPredicate, Assertions$6_titlePredicate as titlePredicate, Assertions$6_urlPredicate as urlPredicate, Assertions$6_validateFieldLength as validateFieldLength };
+}
+
+/**
+ * Normalizes data that is a rest parameter or an array into an array with a depth of 1.
+ *
+ * @typeParam ItemType - The data that must satisfy {@link RestOrArray}.
+ * @param arr - The (possibly variadic) data to normalize
+ */
+declare function normalizeArray(arr: RestOrArray): ItemType[];
+/**
+ * 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 = Type[] | [Type[]];
+
+/**
+ * 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.
+ */
+interface EmbedAuthorData extends IconData, Omit {
+}
+/**
+ * Represents the author options of an embed.
+ */
+interface EmbedAuthorOptions extends Omit {
+}
+/**
+ * Represents the footer data of an embed.
+ */
+interface EmbedFooterData extends IconData, Omit {
+}
+/**
+ * Represents the footer options of an embed.
+ */
+interface EmbedFooterOptions extends 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 idValidator: _sapphire_shapeshift.NumberValidator;
+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, skuId?: string, url?: string): void;
+
+declare const Assertions$5_buttonLabelValidator: typeof buttonLabelValidator;
+declare const Assertions$5_buttonStyleValidator: typeof buttonStyleValidator;
+declare const Assertions$5_channelTypesValidator: typeof channelTypesValidator;
+declare const Assertions$5_customIdValidator: typeof customIdValidator;
+declare const Assertions$5_defaultValidator: typeof defaultValidator;
+declare const Assertions$5_disabledValidator: typeof disabledValidator;
+declare const Assertions$5_emojiValidator: typeof emojiValidator;
+declare const Assertions$5_idValidator: typeof idValidator;
+declare const Assertions$5_jsonOptionValidator: typeof jsonOptionValidator;
+declare const Assertions$5_labelValueDescriptionValidator: typeof labelValueDescriptionValidator;
+declare const Assertions$5_minMaxValidator: typeof minMaxValidator;
+declare const Assertions$5_optionValidator: typeof optionValidator;
+declare const Assertions$5_optionsLengthValidator: typeof optionsLengthValidator;
+declare const Assertions$5_optionsValidator: typeof optionsValidator;
+declare const Assertions$5_urlValidator: typeof urlValidator;
+declare const Assertions$5_validateRequiredButtonParameters: typeof validateRequiredButtonParameters;
+declare const Assertions$5_validateRequiredSelectMenuOptionParameters: typeof validateRequiredSelectMenuOptionParameters;
+declare const Assertions$5_validateRequiredSelectMenuParameters: typeof validateRequiredSelectMenuParameters;
+declare namespace Assertions$5 {
+ export { Assertions$5_buttonLabelValidator as buttonLabelValidator, Assertions$5_buttonStyleValidator as buttonStyleValidator, Assertions$5_channelTypesValidator as channelTypesValidator, Assertions$5_customIdValidator as customIdValidator, Assertions$5_defaultValidator as defaultValidator, Assertions$5_disabledValidator as disabledValidator, Assertions$5_emojiValidator as emojiValidator, Assertions$5_idValidator as idValidator, Assertions$5_jsonOptionValidator as jsonOptionValidator, Assertions$5_labelValueDescriptionValidator as labelValueDescriptionValidator, Assertions$5_minMaxValidator as minMaxValidator, Assertions$5_optionValidator as optionValidator, Assertions$5_optionsLengthValidator as optionsLengthValidator, Assertions$5_optionsValidator as optionsValidator, placeholderValidator$1 as placeholderValidator, Assertions$5_urlValidator as urlValidator, Assertions$5_validateRequiredButtonParameters as validateRequiredButtonParameters, Assertions$5_validateRequiredSelectMenuOptionParameters as validateRequiredSelectMenuOptionParameters, Assertions$5_validateRequiredSelectMenuParameters as validateRequiredSelectMenuParameters };
+}
+
+/**
+ * Any action row component data represented as an object.
+ */
+type AnyAPIActionRowComponent = APIActionRowComponent | APIComponentInActionRow | APIMessageComponent;
+/**
+ * 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);
+ /**
+ * Sets the id (not the custom id) for this component.
+ *
+ * @param id - The id for this component
+ */
+ setId(id: number): this;
+ /**
+ * Clears the id of this component, defaulting to a default incremented id.
+ */
+ clearId(): this;
+}
+
+/**
+ * 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 SKU id that represents a purchasable SKU for this button.
+ *
+ * @remarks Only available when using premium-style buttons.
+ * @param skuId - The SKU id to use
+ */
+ setSKUId(skuId: Snowflake): 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;
+ /**
+ * Adds default channels to this auto populated select menu.
+ *
+ * @param channels - The channels to add
+ */
+ addDefaultChannels(...channels: RestOrArray): this;
+ /**
+ * Sets default channels for this auto populated select menu.
+ *
+ * @param channels - The channels to set
+ */
+ setDefaultChannels(...channels: 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);
+ /**
+ * Adds default roles to this auto populated select menu.
+ *
+ * @param roles - The roles to add
+ */
+ addDefaultRoles(...roles: RestOrArray): this;
+ /**
+ * Adds default users to this auto populated select menu.
+ *
+ * @param users - The users to add
+ */
+ addDefaultUsers(...users: RestOrArray): this;
+ /**
+ * Adds default values to this auto populated select menu.
+ *
+ * @param values - The values to add
+ */
+ addDefaultValues(...values: RestOrArray | APISelectMenuDefaultValue>): this;
+ /**
+ * Sets default values for this auto populated select menu.
+ *
+ * @param values - The values to set
+ */
+ setDefaultValues(...values: RestOrArray | APISelectMenuDefaultValue>): this;
+}
+
+/**
+ * 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);
+ /**
+ * Adds default roles to this auto populated select menu.
+ *
+ * @param roles - The roles to add
+ */
+ addDefaultRoles(...roles: RestOrArray): this;
+ /**
+ * Sets default roles for this auto populated select menu.
+ *
+ * @param roles - The roles to set
+ */
+ setDefaultRoles(...roles: RestOrArray): this;
+}
+
+/**
+ * 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);
+ /**
+ * Adds default users to this auto populated select menu.
+ *
+ * @param users - The users to add
+ */
+ addDefaultUsers(...users: RestOrArray): this;
+ /**
+ * Sets default users for this auto populated select menu.
+ *
+ * @param users - The users to set
+ */
+ setDefaultUsers(...users: RestOrArray): this;
+}
+
+/**
+ * A builder that creates API-compatible JSON data for text inputs.
+ */
+declare class TextInputBuilder extends ComponentBuilder