diff --git a/config.json b/config.json
new file mode 100644
index 0000000..b150276
--- /dev/null
+++ b/config.json
@@ -0,0 +1,6 @@
+{
+ "clientId": "890975056400904242",
+ "guildId": "876543210987654321",
+ "token": "ODkwOTc1MDU2NDAwOTA0MjQy.YU3nLg.T5wCbJ4UuDBanMjVaE-JX-aSELo",
+ "authorId": "307975903999164416"
+}
\ No newline at end of file
diff --git a/friendsCommands.json b/friendsCommands.json
new file mode 100644
index 0000000..a94022c
--- /dev/null
+++ b/friendsCommands.json
@@ -0,0 +1,72 @@
+{
+ "commands": [
+ {
+ "key": "ping",
+ "value": "pong"
+ },
+ {
+ "key": "pong",
+ "value": "ping"
+ },
+ {
+ "key": "stop",
+ "value": "Pas envie !"
+ },
+ {
+ "key": "chink",
+ "value": "Sale raciste"
+ },
+ {
+ "key": "egg",
+ "value": "xue hua piao piao bei feng xiao xiao... "
+ },
+ {
+ "key": "marvin",
+ "value": "Sortira de ses études à 30 ans OKLM il sera millionaire après !"
+ },
+ {
+ "key": "anthony",
+ "value": "Oh Anthony the Almighty, Allahu Allaaaah, Protect me and Guide me, Allahu Allaaaaah... "
+ },
+ {
+ "key": "robin",
+ "value": "Robin est un putain de dieu vivant !"
+ },
+ {
+ "key": "steph",
+ "value": "Baisse la tête* - Ah tu étais donc là Steph !"
+ },
+ {
+ "key": "maxime",
+ "value": "Il est toujours vivant lui ?"
+ },
+ {
+ "key": "flo",
+ "value": "*Boum* *Boum* , c'est un éléphant ? godzilla ? thanos ? Biensûr que non, c'est FLo et son énorme Ch... charisme"
+ },
+ {
+ "key": "jean",
+ "value": "FDP va"
+ },
+ {
+ "key": "hugo",
+ "value": "Intestable au blindtest et plus tanky qu'un pilier de bar, c'est notre Scaix national"
+ },
+ {
+ "key": "ludo",
+ "value": "Number One à la Gileppe, mais qui peut test Ludo en fait"
+ },
+ {
+ "key": "greg",
+ "value": "Allez voir ce Streameur, c'est un putain de dieu : https://www.twitch.tv/regigigreg"
+ },
+ {
+ "key": "lulu",
+ "value": "Aime avoir mal au cul sur un vélo et s'est fait chier dessus par alderiate alors qu'il aime Skyrim tout comme lui... C'est lulu"
+ },
+ {
+ "key": "tg",
+ "value": "Non twa tagueule !"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
new file mode 100644
index 0000000..5de2467
--- /dev/null
+++ b/node_modules/.package-lock.json
@@ -0,0 +1,310 @@
+{
+ "name": "BOT_DISCORD",
+ "version": "1.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "node_modules/@discordjs/builders": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.12.0.tgz",
+ "integrity": "sha512-Vx2MjUZd6QVo1uS2uWt708Fd6cHWGFblAvbpL5EBO+kLl0BADmPwwvts+YJ/VfSywed6Vsk6K2cEooR/Ytjhjw==",
+ "dependencies": {
+ "@sindresorhus/is": "^4.3.0",
+ "discord-api-types": "^0.26.1",
+ "ts-mixer": "^6.0.0",
+ "tslib": "^2.3.1",
+ "zod": "^3.11.6"
+ },
+ "engines": {
+ "node": ">=16.9.0"
+ }
+ },
+ "node_modules/@discordjs/builders/node_modules/discord-api-types": {
+ "version": "0.26.1",
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz",
+ "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@discordjs/collection": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.4.0.tgz",
+ "integrity": "sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw==",
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@discordjs/rest": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-0.3.0.tgz",
+ "integrity": "sha512-F9aeP3odlAlllM1ciBZLdd+adiAyBj4VaZBejj4UMj4afE2wfCkNTGvYYiRxrXUE9fN7e/BuDP2ePl0tVA2m7Q==",
+ "dependencies": {
+ "@discordjs/collection": "^0.4.0",
+ "@sapphire/async-queue": "^1.1.9",
+ "@sapphire/snowflake": "^3.0.1",
+ "discord-api-types": "^0.26.1",
+ "form-data": "^4.0.0",
+ "node-fetch": "^2.6.5",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=16.9.0"
+ }
+ },
+ "node_modules/@discordjs/rest/node_modules/discord-api-types": {
+ "version": "0.26.1",
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz",
+ "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@sapphire/async-queue": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.0.tgz",
+ "integrity": "sha512-z+CDw5X4UgIEpZL8KM+ThVx1i8V60HBg0l/oFewTNbQQeRDJHdVxHyJykv+SF1H+Rc8EkMS81VTWo95jVYgO/g==",
+ "engines": {
+ "node": ">=v14.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@sapphire/snowflake": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.2.0.tgz",
+ "integrity": "sha512-tfHzY+6/5bbHdB+uNqsEQ5rhjaZAoFUrqP/l1S5jwxMdKeSCIiGkJjcE99/WGGdzyWGjTNgNVX/dt4Me/FdMlg==",
+ "engines": {
+ "node": ">=v14.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "17.0.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz",
+ "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw=="
+ },
+ "node_modules/@types/node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==",
+ "dependencies": {
+ "@types/node": "*",
+ "form-data": "^3.0.0"
+ }
+ },
+ "node_modules/@types/node-fetch/node_modules/form-data": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
+ "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@types/ws": {
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
+ "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/discord-api-types": {
+ "version": "0.30.0",
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.30.0.tgz",
+ "integrity": "sha512-wYst0jrT8EJs2tVlwUTQ2xT0oWMjUrRMpFTkNY3NMleWyQNHgWaKhqFfxdLPdC2im9IuR5EsxcEgjhf/npeftw=="
+ },
+ "node_modules/discord.js": {
+ "version": "13.6.0",
+ "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.6.0.tgz",
+ "integrity": "sha512-tXNR8zgsEPxPBvGk3AQjJ9ljIIC6/LOPjzKwpwz8Y1Q2X66Vi3ZqFgRHYwnHKC0jC0F+l4LzxlhmOJsBZDNg9g==",
+ "dependencies": {
+ "@discordjs/builders": "^0.11.0",
+ "@discordjs/collection": "^0.4.0",
+ "@sapphire/async-queue": "^1.1.9",
+ "@types/node-fetch": "^2.5.12",
+ "@types/ws": "^8.2.2",
+ "discord-api-types": "^0.26.0",
+ "form-data": "^4.0.0",
+ "node-fetch": "^2.6.1",
+ "ws": "^8.4.0"
+ },
+ "engines": {
+ "node": ">=16.6.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/discord.js/node_modules/@discordjs/builders": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.11.0.tgz",
+ "integrity": "sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==",
+ "dependencies": {
+ "@sindresorhus/is": "^4.2.0",
+ "discord-api-types": "^0.26.0",
+ "ts-mixer": "^6.0.0",
+ "tslib": "^2.3.1",
+ "zod": "^3.11.6"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/discord.js/node_modules/discord-api-types": {
+ "version": "0.26.1",
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz",
+ "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
+ },
+ "node_modules/ts-mixer": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz",
+ "integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg=="
+ },
+ "node_modules/tslib": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz",
+ "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==",
+ "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
+ }
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.14.3",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.14.3.tgz",
+ "integrity": "sha512-OzwRCSXB1+/8F6w6HkYHdbuWysYWnAF4fkRgKDcSFc54CE+Sv0rHXKfeNUReGCrHukm1LNpi6AYeXotznhYJbQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ }
+ }
+}
diff --git a/node_modules/@discordjs/builders/CHANGELOG.md b/node_modules/@discordjs/builders/CHANGELOG.md
new file mode 100644
index 0000000..de844f7
--- /dev/null
+++ b/node_modules/@discordjs/builders/CHANGELOG.md
@@ -0,0 +1,126 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+# [0.12.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@0.11.0...@discordjs/builders@0.12.0) (2021-12-08)
+
+## Bug Fixes
+
+- **builders:** Dont export `Button` component stuff twice (#7289) ([86d9d06](https://github.com/discordjs/discord.js/commit/86d9d0674347c08d056cd054cb4ce4253195bf94))
+
+## Documentation
+
+- **SlashCommandSubcommands:** Updating old links from Discord developer portal (#7224) ([bd7a6f2](https://github.com/discordjs/discord.js/commit/bd7a6f265212624199fb0b2ddc8ece39759c63de))
+
+## Features
+
+- Add components to /builders (#7195) ([2bb40fd](https://github.com/discordjs/discord.js/commit/2bb40fd767cf5918e3ba422ff73082734bfa05b0))
+
+## Typings
+
+- Make `required` a boolean (#7307) ([c10afea](https://github.com/discordjs/discord.js/commit/c10afeadc702ab98bec5e077b3b92494a9596f9c))
+
+# [0.11.0](https://github.com/discordjs/builders/compare/v0.10.0...v0.11.0) (2021-12-29)
+
+## Bug Fixes
+
+- **ApplicationCommandOptions:** clean up code for builder options ([#68](https://github.com/discordjs/builders/issues/68)) ([b5d0b15](https://github.com/discordjs/builders/commit/b5d0b157b1262bd01fa011f8e0cf33adb82776e7))
+
+# [0.10.0](https://github.com/discordjs/builders/compare/v0.9.0...v0.10.0) (2021-12-24)
+
+## Bug Fixes
+
+- use zod instead of ow for max/min option validation ([#66](https://github.com/discordjs/builders/issues/66)) ([beb35fb](https://github.com/discordjs/builders/commit/beb35fb1f65bd6be2321e17cc792f67e8615fd48))
+
+## Features
+
+- add max/min option for int and number builder options ([#47](https://github.com/discordjs/builders/issues/47)) ([2e1e860](https://github.com/discordjs/builders/commit/2e1e860b46e3453398b20df63dabb6d4325e32d1))
+
+# [0.9.0](https://github.com/discordjs/builders/compare/v0.8.2...v0.9.0) (2021-12-02)
+
+## Bug Fixes
+
+- replace ow with zod ([#58](https://github.com/discordjs/builders/issues/58)) ([0b6fb81](https://github.com/discordjs/builders/commit/0b6fb8161b858e42781855fb73aaa873fec58160))
+
+## Features
+
+- **SlashCommandBuilder:** add autocomplete ([#53](https://github.com/discordjs/builders/issues/53)) ([05b07a7](https://github.com/discordjs/builders/commit/05b07a7e88848188c27d7380d9f948cba25ef778))
+
+## [0.8.2](https://github.com/discordjs/builders/compare/v0.8.1...v0.8.2) (2021-10-30)
+
+## Bug Fixes
+
+- downgrade ow because of esm issues ([#55](https://github.com/discordjs/builders/issues/55)) ([3722d2c](https://github.com/discordjs/builders/commit/3722d2c1109a7a5c0abad63c1a7eb944df6e46c8))
+
+## [0.8.1](https://github.com/discordjs/builders/compare/v0.8.0...v0.8.1) (2021-10-29)
+
+## Bug Fixes
+
+- documentation ([e33ec8d](https://github.com/discordjs/builders/commit/e33ec8dfd5785312f82e0afb017a3dac614fd71d))
+
+# [0.7.0](https://github.com/discordjs/builders/compare/v0.6.0...v0.7.0) (2021-10-18)
+
+## Bug Fixes
+
+- properly type `toJSON` methods ([#34](https://github.com/discordjs/builders/issues/34)) ([7723ad0](https://github.com/discordjs/builders/commit/7723ad0da169386e638188de220451a97513bc25))
+
+## Features
+
+- **ContextMenus:** add context menu command builder ([#29](https://github.com/discordjs/builders/issues/29)) ([f0641e5](https://github.com/discordjs/builders/commit/f0641e55733de8992600f3082bcf054e6f815cf7))
+- add support for channel types on channel options ([#41](https://github.com/discordjs/builders/issues/41)) ([f6c187e](https://github.com/discordjs/builders/commit/f6c187e0ad6ebe03e65186ece3e95cb1db5aeb50))
+
+# [0.6.0](https://github.com/discordjs/builders/compare/v0.5.0...v0.6.0) (2021-08-24)
+
+## Bug Fixes
+
+- **SlashCommandBuilder:** allow subcommands and groups to coexist at the root level ([#26](https://github.com/discordjs/builders/issues/26)) ([0be4daf](https://github.com/discordjs/builders/commit/0be4dafdfc0b5747c880be0078c00ada913eb4fb))
+
+## Features
+
+- create `Embed` builder ([#11](https://github.com/discordjs/builders/issues/11)) ([eb942a4](https://github.com/discordjs/builders/commit/eb942a4d1f3bcec9a4e370b6af602a713ad8f9b7))
+- **SlashCommandBuilder:** create setDefaultPermission function ([#19](https://github.com/discordjs/builders/issues/19)) ([5d53759](https://github.com/discordjs/builders/commit/5d537593937a8da330153ce4711b7d093a80330e))
+- **SlashCommands:** add number option type ([#23](https://github.com/discordjs/builders/issues/23)) ([1563991](https://github.com/discordjs/builders/commit/1563991d421bb07bf7a412c87e7613692d770f04))
+
+# [0.5.0](https://github.com/discordjs/builders/compare/v0.3.0...v0.5.0) (2021-08-10)
+
+## Features
+
+- **Formatters:** add `formatEmoji` ([#20](https://github.com/discordjs/builders/issues/20)) ([c3d8bb5](https://github.com/discordjs/builders/commit/c3d8bb5363a1d46b45c0def4277da6921e2ba209))
+
+# [0.4.0](https://github.com/discordjs/builders/compare/v0.3.0...v0.4.0) (2021-08-05)
+
+## Features
+
+- `sub command` => `subcommand` ([#18](https://github.com/discordjs/builders/pull/18)) ([95599c5](https://github.com/discordjs/builders/commit/95599c5b5366ebd054c4c277c52f1a44cda1209d))
+
+# [0.3.0](https://github.com/discordjs/builders/compare/v0.2.0...v0.3.0) (2021-08-01)
+
+## Bug Fixes
+
+- **Shrug:** Update comment ([#14](https://github.com/discordjs/builders/issues/14)) ([6fa6c40](https://github.com/discordjs/builders/commit/6fa6c405f2ea733811677d3d1bfb1e2806d504d5))
+- shrug face rendering ([#13](https://github.com/discordjs/builders/issues/13)) ([6ad24ec](https://github.com/discordjs/builders/commit/6ad24ecd96c82b0f576e78e9e53fc7bf9c36ef5d))
+
+## Features
+
+- **formatters:** mentions ([#9](https://github.com/discordjs/builders/issues/9)) ([f83fe99](https://github.com/discordjs/builders/commit/f83fe99b83188ed999845751ffb005c687dbd60a))
+- **Formatters:** Add a spoiler function ([#16](https://github.com/discordjs/builders/issues/16)) ([c213a6a](https://github.com/discordjs/builders/commit/c213a6abb114f65653017a4edec4bdba2162d771))
+- **SlashCommands:** add slash command builders ([#3](https://github.com/discordjs/builders/issues/3)) ([6aa3af0](https://github.com/discordjs/builders/commit/6aa3af07b0ee342fff91f080914bb12b3ab773f8))
+- shrug, tableflip and unflip strings ([#5](https://github.com/discordjs/builders/issues/5)) ([de5fa82](https://github.com/discordjs/builders/commit/de5fa823cd6f1feba5b2d0a63b2cb1761dfd1814))
+
+# [0.2.0](https://github.com/discordjs/builders/compare/v0.1.1...v0.2.0) (2021-07-03)
+
+## Features
+
+- **Formatters:** added `hyperlink` and `hideLinkEmbed` ([#4](https://github.com/discordjs/builders/issues/4)) ([c532daf](https://github.com/discordjs/builders/commit/c532daf2ba2feae75bf9668f63462e96a5314cff))
+
+# [0.1.1](https://github.com/discordjs/builders/compare/v0.1.0...v0.1.1) (2021-06-30)
+
+## Bug Fixes
+
+- **Deps:** added `tslib` as dependency ([#2](https://github.com/discordjs/builders/issues/2)) ([5576ff3](https://github.com/discordjs/builders/commit/5576ff3b67136b957bed0ab8a4c655d5de322813))
+
+# 0.1.0 (2021-06-30)
+
+## Features
+
+- added message formatters ([#1](https://github.com/discordjs/builders/issues/1)) ([765e46d](https://github.com/discordjs/builders/commit/765e46dac96c4e49d350243e5fad34c2bc738a7c))
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..211fc2f
--- /dev/null
+++ b/node_modules/@discordjs/builders/README.md
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Installation
+
+**Node.js 16.9.0 or newer is required.**
+
+```sh-session
+npm install @discordjs/builders
+yarn add @discordjs/builders
+pnpm add @discordjs/builders
+```
+
+## Examples
+
+Here are some examples for the builders and utilities you can find in this package:
+
+- [Slash Command Builders](./docs/examples/Slash%20Command%20Builders.md)
+
+## Links
+
+- [Website](https://discord.js.org/) ([source](https://github.com/discordjs/website))
+- [Documentation](https://discord.js.org/#/docs/builders)
+- [Guide](https://discordjs.guide/) ([source](https://github.com/discordjs/guide))
+ See also the [Update Guide](https://discordjs.guide/additional-info/changes-in-v13.html), including updated and removed items in the library.
+- [discord.js Discord server](https://discord.gg/djs)
+- [Discord API Discord server](https://discord.gg/discord-api)
+- [GitHub](https://github.com/discordjs/discord.js/tree/main/packages/builders)
+- [npm](https://www.npmjs.com/package/@discordjs/builders)
+- [Related libraries](https://discord.com/developers/docs/topics/community-resources#libraries)
+
+## Contributing
+
+Before creating an issue, please ensure that it hasn't already been reported/suggested, and double-check the
+[documentation](https://discord.js.org/#/docs/builders).
+See [the contribution guide](https://github.com/discordjs/discord.js/blob/main/.github/CONTRIBUTING.md) 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](https://discord.gg/djs).
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..d3e84b1
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.d.ts
@@ -0,0 +1,1084 @@
+import { APIEmbedField, APIEmbed, APIEmbedThumbnail, APIEmbedImage, APIEmbedVideo, APIEmbedAuthor, APIEmbedProvider, APIEmbedFooter, APIMessageComponentEmoji, APISelectMenuOption, ButtonStyle, ComponentType, APIMessageComponent, APIActionRowComponent, APIButtonComponent, APISelectMenuComponent, ApplicationCommandOptionType, APIApplicationCommandBasicOption, APIApplicationCommandBooleanOption, ChannelType, APIApplicationCommandChannelOption, APIApplicationCommandOptionChoice, APIApplicationCommandIntegerOption, APIApplicationCommandMentionableOption, APIApplicationCommandNumberOption, APIApplicationCommandRoleOption, APIApplicationCommandStringOption, APIApplicationCommandUserOption, APIApplicationCommandSubcommandGroupOption, APIApplicationCommandSubcommandOption, RESTPostAPIApplicationCommandsJSONBody, APIApplicationCommandOption, ApplicationCommandType } from 'discord-api-types/v9';
+import { z } from 'zod';
+import { Snowflake } from 'discord-api-types/globals';
+import { URL } from 'url';
+
+declare const fieldNamePredicate: z.ZodString;
+declare const fieldValuePredicate: z.ZodString;
+declare const fieldInlinePredicate: z.ZodOptional;
+declare const embedFieldPredicate: z.ZodObject<{
+ name: z.ZodString;
+ value: z.ZodString;
+ inline: z.ZodOptional;
+}, "strip", z.ZodTypeAny, {
+ inline?: boolean | undefined;
+ name: string;
+ value: string;
+}, {
+ inline?: boolean | undefined;
+ name: string;
+ value: string;
+}>;
+declare const embedFieldsArrayPredicate: z.ZodArray;
+}, "strip", z.ZodTypeAny, {
+ inline?: boolean | undefined;
+ name: string;
+ value: string;
+}, {
+ inline?: boolean | undefined;
+ name: string;
+ value: string;
+}>, "many">;
+declare const fieldLengthPredicate: z.ZodNumber;
+declare function validateFieldLength(fields: APIEmbedField[], amountAdding: number): void;
+declare const authorNamePredicate: z.ZodNullable;
+declare const urlPredicate: z.ZodNullable>;
+declare const colorPredicate: z.ZodNullable;
+declare const descriptionPredicate: z.ZodNullable;
+declare const footerTextPredicate: z.ZodNullable;
+declare const timestampPredicate: z.ZodNullable>;
+declare const titlePredicate: z.ZodNullable;
+
+declare const Assertions$3_fieldNamePredicate: typeof fieldNamePredicate;
+declare const Assertions$3_fieldValuePredicate: typeof fieldValuePredicate;
+declare const Assertions$3_fieldInlinePredicate: typeof fieldInlinePredicate;
+declare const Assertions$3_embedFieldPredicate: typeof embedFieldPredicate;
+declare const Assertions$3_embedFieldsArrayPredicate: typeof embedFieldsArrayPredicate;
+declare const Assertions$3_fieldLengthPredicate: typeof fieldLengthPredicate;
+declare const Assertions$3_validateFieldLength: typeof validateFieldLength;
+declare const Assertions$3_authorNamePredicate: typeof authorNamePredicate;
+declare const Assertions$3_urlPredicate: typeof urlPredicate;
+declare const Assertions$3_colorPredicate: typeof colorPredicate;
+declare const Assertions$3_descriptionPredicate: typeof descriptionPredicate;
+declare const Assertions$3_footerTextPredicate: typeof footerTextPredicate;
+declare const Assertions$3_timestampPredicate: typeof timestampPredicate;
+declare const Assertions$3_titlePredicate: typeof titlePredicate;
+declare namespace Assertions$3 {
+ export {
+ Assertions$3_fieldNamePredicate as fieldNamePredicate,
+ Assertions$3_fieldValuePredicate as fieldValuePredicate,
+ Assertions$3_fieldInlinePredicate as fieldInlinePredicate,
+ Assertions$3_embedFieldPredicate as embedFieldPredicate,
+ Assertions$3_embedFieldsArrayPredicate as embedFieldsArrayPredicate,
+ Assertions$3_fieldLengthPredicate as fieldLengthPredicate,
+ Assertions$3_validateFieldLength as validateFieldLength,
+ Assertions$3_authorNamePredicate as authorNamePredicate,
+ Assertions$3_urlPredicate as urlPredicate,
+ Assertions$3_colorPredicate as colorPredicate,
+ Assertions$3_descriptionPredicate as descriptionPredicate,
+ Assertions$3_footerTextPredicate as footerTextPredicate,
+ Assertions$3_timestampPredicate as timestampPredicate,
+ Assertions$3_titlePredicate as titlePredicate,
+ };
+}
+
+interface AuthorOptions {
+ name: string;
+ url?: string;
+ iconURL?: string;
+}
+interface FooterOptions {
+ text: string;
+ iconURL?: string;
+}
+/**
+ * Represents an embed in a message (image/video preview, rich embed, etc.)
+ */
+declare class Embed implements APIEmbed {
+ /**
+ * An array of fields of this embed
+ */
+ fields: APIEmbedField[];
+ /**
+ * The embed title
+ */
+ title?: string;
+ /**
+ * The embed description
+ */
+ description?: string;
+ /**
+ * The embed url
+ */
+ url?: string;
+ /**
+ * The embed color
+ */
+ color?: number;
+ /**
+ * The timestamp of the embed in the ISO format
+ */
+ timestamp?: string;
+ /**
+ * The embed thumbnail data
+ */
+ thumbnail?: APIEmbedThumbnail;
+ /**
+ * The embed image data
+ */
+ image?: APIEmbedImage;
+ /**
+ * Received video data
+ */
+ video?: APIEmbedVideo;
+ /**
+ * The embed author data
+ */
+ author?: APIEmbedAuthor;
+ /**
+ * Received data about the embed provider
+ */
+ provider?: APIEmbedProvider;
+ /**
+ * The embed footer data
+ */
+ footer?: APIEmbedFooter;
+ constructor(data?: APIEmbed);
+ /**
+ * The accumulated length for the embed title, description, fields, footer text, and author name
+ */
+ get length(): number;
+ /**
+ * Adds a field to the embed (max 25)
+ *
+ * @param field The field to add.
+ */
+ addField(field: APIEmbedField): this;
+ /**
+ * Adds fields to the embed (max 25)
+ *
+ * @param fields The fields to add
+ */
+ addFields(...fields: APIEmbedField[]): this;
+ /**
+ * Removes, replaces, or inserts fields in the embed (max 25)
+ *
+ * @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 author of this embed
+ *
+ * @param options The options for the author
+ */
+ setAuthor(options: AuthorOptions | null): this;
+ /**
+ * Sets the color of this embed
+ *
+ * @param color The color of the embed
+ */
+ setColor(color: number | null): this;
+ /**
+ * Sets the description of this embed
+ *
+ * @param description The description
+ */
+ setDescription(description: string | null): this;
+ /**
+ * Sets the footer of this embed
+ *
+ * @param options The options for the footer
+ */
+ setFooter(options: FooterOptions | null): this;
+ /**
+ * Sets the image of this embed
+ *
+ * @param url The URL of the image
+ */
+ setImage(url: string | null): this;
+ /**
+ * Sets the thumbnail of this embed
+ *
+ * @param url The URL of the thumbnail
+ */
+ setThumbnail(url: string | null): this;
+ /**
+ * Sets the timestamp of this embed
+ *
+ * @param timestamp The timestamp or date
+ */
+ setTimestamp(timestamp?: number | Date | null): this;
+ /**
+ * Sets the title of this embed
+ *
+ * @param title The title
+ */
+ setTitle(title: string | null): this;
+ /**
+ * Sets the URL of this embed
+ *
+ * @param url The URL
+ */
+ setURL(url: string | null): this;
+ /**
+ * Transforms the embed to a plain object
+ */
+ toJSON(): APIEmbed;
+ /**
+ * Normalizes field input and resolves strings
+ *
+ * @param fields Fields to normalize
+ */
+ static normalizeFields(...fields: APIEmbedField[]): APIEmbedField[];
+}
+
+/**
+ * Wraps the content inside a codeblock with no language
+ *
+ * @param content The content to wrap
+ */
+declare function codeBlock(content: C): `\`\`\`\n${C}\`\`\``;
+/**
+ * Wraps the content inside a codeblock with the specified language
+ *
+ * @param language The language for the codeblock
+ * @param content The content to wrap
+ */
+declare function codeBlock(language: L, content: C): `\`\`\`${L}\n${C}\`\`\``;
+/**
+ * Wraps the content inside \`backticks\`, which formats it as inline code
+ *
+ * @param content The content to wrap
+ */
+declare function inlineCode(content: C): `\`${C}\``;
+/**
+ * Formats the content into italic text
+ *
+ * @param content The content to wrap
+ */
+declare function italic(content: C): `_${C}_`;
+/**
+ * Formats the content into bold text
+ *
+ * @param content The content to wrap
+ */
+declare function bold(content: C): `**${C}**`;
+/**
+ * Formats the content into underscored text
+ *
+ * @param content The content to wrap
+ */
+declare function underscore(content: C): `__${C}__`;
+/**
+ * Formats the content into strike-through text
+ *
+ * @param content The content to wrap
+ */
+declare function strikethrough(content: C): `~~${C}~~`;
+/**
+ * Formats the content into a quote. This needs to be at the start of the line for Discord to format it
+ *
+ * @param content The content to wrap
+ */
+declare function quote(content: C): `> ${C}`;
+/**
+ * Formats the content into a block quote. This needs to be at the start of the line for Discord to format it
+ *
+ * @param content The content to wrap
+ */
+declare function blockQuote(content: C): `>>> ${C}`;
+/**
+ * Wraps the URL into `<>`, which stops it from embedding
+ *
+ * @param url The URL to wrap
+ */
+declare function hideLinkEmbed(url: C): `<${C}>`;
+/**
+ * Wraps the URL into `<>`, which stops it from embedding
+ *
+ * @param url The URL to wrap
+ */
+declare function hideLinkEmbed(url: URL): `<${string}>`;
+/**
+ * Formats the content and the URL into a masked URL
+ *
+ * @param content The content to display
+ * @param url The URL the content links to
+ */
+declare function hyperlink(content: C, url: URL): `[${C}](${string})`;
+/**
+ * Formats the content and the URL into a masked URL
+ *
+ * @param content The content to display
+ * @param url The URL the content links to
+ */
+declare function hyperlink(content: C, url: U): `[${C}](${U})`;
+/**
+ * Formats the content and the URL into a masked URL
+ *
+ * @param content The content to display
+ * @param url The URL the content links to
+ * @param title The title shown when hovering on the masked link
+ */
+declare function hyperlink(content: C, url: URL, title: T): `[${C}](${string} "${T}")`;
+/**
+ * Formats the content and the URL into a masked URL
+ *
+ * @param content The content to display
+ * @param url The URL the content links to
+ * @param title The title shown when hovering on the masked link
+ */
+declare function hyperlink(content: C, url: U, title: T): `[${C}](${U} "${T}")`;
+/**
+ * Wraps the content inside spoiler (hidden text)
+ *
+ * @param content The content to wrap
+ */
+declare function spoiler(content: C): `||${C}||`;
+/**
+ * Formats a user ID into a user mention
+ *
+ * @param userId The user ID to format
+ */
+declare function userMention(userId: C): `<@${C}>`;
+/**
+ * Formats a user ID into a member-nickname mention
+ *
+ * @param memberId The user ID to format
+ */
+declare function memberNicknameMention(memberId: C): `<@!${C}>`;
+/**
+ * Formats a channel ID into a channel mention
+ *
+ * @param channelId The channel ID to format
+ */
+declare function channelMention(channelId: C): `<#${C}>`;
+/**
+ * Formats a role ID into a role mention
+ *
+ * @param roleId The role ID to format
+ */
+declare function roleMention(roleId: C): `<@&${C}>`;
+/**
+ * Formats an emoji ID into a fully qualified emoji identifier
+ *
+ * @param emojiId The emoji ID to format
+ */
+declare function formatEmoji(emojiId: C, animated?: false): `<:_:${C}>`;
+/**
+ * Formats an emoji ID into a fully qualified emoji identifier
+ *
+ * @param emojiId The emoji ID to format
+ * @param animated Whether the emoji is animated or not. Defaults to `false`
+ */
+declare function formatEmoji(emojiId: C, animated?: true): ``;
+/**
+ * Formats a date into a short date-time string
+ *
+ * @param date The date to format, defaults to the current time
+ */
+declare function time(date?: Date): ``;
+/**
+ * Formats a date given a format style
+ *
+ * @param date The date to format
+ * @param style The style to use
+ */
+declare function time(date: Date, style: S): ``;
+/**
+ * Formats the given timestamp into a short date-time string
+ *
+ * @param seconds The time to format, represents an UNIX timestamp in seconds
+ */
+declare function time(seconds: C): ``;
+/**
+ * Formats the given timestamp into a short date-time string
+ *
+ * @param seconds The time to format, represents an UNIX timestamp in seconds
+ * @param style The style to use
+ */
+declare function time(seconds: C, style: S): ``;
+/**
+ * The [message formatting timestamp styles](https://discord.com/developers/docs/reference#message-formatting-timestamp-styles) supported by Discord
+ */
+declare const TimestampStyles: {
+ /**
+ * Short time format, consisting of hours and minutes, e.g. 16:20
+ */
+ readonly ShortTime: "t";
+ /**
+ * Long time format, consisting of hours, minutes, and seconds, e.g. 16:20:30
+ */
+ readonly LongTime: "T";
+ /**
+ * Short date format, consisting of day, month, and year, e.g. 20/04/2021
+ */
+ readonly ShortDate: "d";
+ /**
+ * Long date format, consisting of day, month, and year, e.g. 20 April 2021
+ */
+ readonly LongDate: "D";
+ /**
+ * Short date-time format, consisting of short date and short time formats, e.g. 20 April 2021 16:20
+ */
+ readonly ShortDateTime: "f";
+ /**
+ * Long date-time format, consisting of long date and short time formats, e.g. Tuesday, 20 April 2021 16:20
+ */
+ readonly LongDateTime: "F";
+ /**
+ * Relative time format, consisting of a relative duration format, e.g. 2 months ago
+ */
+ readonly RelativeTime: "R";
+};
+/**
+ * The possible values, see {@link TimestampStyles} for more information
+ */
+declare type TimestampStylesString = typeof TimestampStyles[keyof typeof TimestampStyles];
+/**
+ * An enum with all the available faces from Discord's native slash commands
+ */
+declare enum Faces {
+ /**
+ * ¯\\_(ツ)\\_/¯
+ */
+ Shrug = "\u00AF\\_(\u30C4)\\_/\u00AF",
+ /**
+ * (╯°□°)╯︵ ┻━┻
+ */
+ Tableflip = "(\u256F\u00B0\u25A1\u00B0\uFF09\u256F\uFE35 \u253B\u2501\u253B",
+ /**
+ * ┬─┬ ノ( ゜-゜ノ)
+ */
+ Unflip = "\u252C\u2500\u252C \u30CE( \u309C-\u309C\u30CE)"
+}
+
+/**
+ * Represents an option within a select menu component
+ */
+declare class SelectMenuOption {
+ readonly label: string;
+ readonly value: string;
+ readonly description?: string;
+ readonly emoji?: APIMessageComponentEmoji;
+ readonly default?: boolean;
+ constructor(data?: APISelectMenuOption);
+ /**
+ * Sets the label of this option
+ * @param label The label to show on this option
+ */
+ setLabel(label: string): this;
+ /**
+ * Sets the value of this option
+ * @param value The value of this option
+ */
+ setValue(value: string): this;
+ /**
+ * Sets the description of this option.
+ * @param description The description of this option
+ */
+ setDescription(description: string): this;
+ /**
+ * Sets whether this option is selected by default
+ * @param isDefault Whether or not this option is selected by default
+ */
+ setDefault(isDefault: boolean): this;
+ /**
+ * Sets the emoji to display on this button
+ * @param emoji The emoji to display on this button
+ */
+ setEmoji(emoji: APIMessageComponentEmoji): this;
+ toJSON(): APISelectMenuOption;
+}
+
+declare const customIdValidator: z.ZodString;
+declare const emojiValidator: z.ZodObject<{
+ id: z.ZodOptional;
+ name: z.ZodOptional;
+ animated: z.ZodOptional;
+}, "strict", z.ZodTypeAny, {
+ name?: string | undefined;
+ id?: string | undefined;
+ animated?: boolean | undefined;
+}, {
+ name?: string | undefined;
+ id?: string | undefined;
+ animated?: boolean | undefined;
+}>;
+declare const disabledValidator: z.ZodBoolean;
+declare const buttonLabelValidator: z.ZodString;
+declare const buttonStyleValidator: z.ZodNumber;
+declare const placeholderValidator: z.ZodString;
+declare const minMaxValidator: z.ZodNumber;
+declare const optionsValidator: z.ZodArray, "atleastone">;
+declare function validateRequiredSelectMenuParameters(options: SelectMenuOption[], customId?: string): void;
+declare const labelValueValidator: z.ZodString;
+declare const defaultValidator: z.ZodBoolean;
+declare function validateRequiredSelectMenuOptionParameters(label?: string, value?: string): void;
+declare const urlValidator: z.ZodString;
+declare function validateRequiredButtonParameters(style: ButtonStyle, label?: string, emoji?: APIMessageComponentEmoji, customId?: string, url?: string): void;
+
+declare const Assertions$2_customIdValidator: typeof customIdValidator;
+declare const Assertions$2_emojiValidator: typeof emojiValidator;
+declare const Assertions$2_disabledValidator: typeof disabledValidator;
+declare const Assertions$2_buttonLabelValidator: typeof buttonLabelValidator;
+declare const Assertions$2_buttonStyleValidator: typeof buttonStyleValidator;
+declare const Assertions$2_placeholderValidator: typeof placeholderValidator;
+declare const Assertions$2_minMaxValidator: typeof minMaxValidator;
+declare const Assertions$2_optionsValidator: typeof optionsValidator;
+declare const Assertions$2_validateRequiredSelectMenuParameters: typeof validateRequiredSelectMenuParameters;
+declare const Assertions$2_labelValueValidator: typeof labelValueValidator;
+declare const Assertions$2_defaultValidator: typeof defaultValidator;
+declare const Assertions$2_validateRequiredSelectMenuOptionParameters: typeof validateRequiredSelectMenuOptionParameters;
+declare const Assertions$2_urlValidator: typeof urlValidator;
+declare const Assertions$2_validateRequiredButtonParameters: typeof validateRequiredButtonParameters;
+declare namespace Assertions$2 {
+ export {
+ Assertions$2_customIdValidator as customIdValidator,
+ Assertions$2_emojiValidator as emojiValidator,
+ Assertions$2_disabledValidator as disabledValidator,
+ Assertions$2_buttonLabelValidator as buttonLabelValidator,
+ Assertions$2_buttonStyleValidator as buttonStyleValidator,
+ Assertions$2_placeholderValidator as placeholderValidator,
+ Assertions$2_minMaxValidator as minMaxValidator,
+ Assertions$2_optionsValidator as optionsValidator,
+ Assertions$2_validateRequiredSelectMenuParameters as validateRequiredSelectMenuParameters,
+ Assertions$2_labelValueValidator as labelValueValidator,
+ Assertions$2_defaultValidator as defaultValidator,
+ Assertions$2_validateRequiredSelectMenuOptionParameters as validateRequiredSelectMenuOptionParameters,
+ Assertions$2_urlValidator as urlValidator,
+ Assertions$2_validateRequiredButtonParameters as validateRequiredButtonParameters,
+ };
+}
+
+/**
+ * Represents a discord component
+ */
+interface Component {
+ /**
+ * The type of this component
+ */
+ readonly type: ComponentType;
+ /**
+ * Converts this component to an API-compatible JSON object
+ */
+ toJSON: () => APIMessageComponent;
+}
+
+declare type ActionRowComponent = ButtonComponent | SelectMenuComponent;
+/**
+ * Represents an action row component
+ */
+declare class ActionRow implements Component {
+ readonly components: T[];
+ readonly type = ComponentType.ActionRow;
+ constructor(data?: APIActionRowComponent);
+ /**
+ * Adds components to this action row.
+ * @param components The components to add to this action row.
+ * @returns
+ */
+ addComponents(...components: T[]): this;
+ /**
+ * Sets the components in this action row
+ * @param components The components to set this row to
+ */
+ setComponents(components: T[]): this;
+ toJSON(): APIActionRowComponent;
+}
+
+declare class ButtonComponent implements Component {
+ readonly type: ComponentType.Button;
+ readonly style: ButtonStyle;
+ readonly label?: string;
+ readonly emoji?: APIMessageComponentEmoji;
+ readonly disabled?: boolean;
+ readonly custom_id: string;
+ readonly url: string;
+ constructor(data?: APIButtonComponent);
+ /**
+ * Sets the style of this button
+ * @param style The style of the button
+ */
+ setStyle(style: ButtonStyle): this;
+ /**
+ * Sets the URL for this button
+ * @param url The URL to open when this button is clicked
+ */
+ setURL(url: string): this;
+ /**
+ * Sets the custom Id for this button
+ * @param customId The custom ID to use for this button
+ */
+ setCustomId(customId: string): this;
+ /**
+ * Sets the emoji to display on this button
+ * @param emoji The emoji to display on this button
+ */
+ setEmoji(emoji: APIMessageComponentEmoji): this;
+ /**
+ * Sets whether this button is disable or not
+ * @param disabled Whether or not to disable this button or not
+ */
+ setDisabled(disabled: boolean): this;
+ /**
+ * Sets the label for this button
+ * @param label The label to display on this button
+ */
+ setLabel(label: string): this;
+ toJSON(): APIButtonComponent;
+}
+
+interface MappedComponentTypes {
+ [ComponentType.ActionRow]: ActionRow;
+ [ComponentType.Button]: ButtonComponent;
+ [ComponentType.SelectMenu]: SelectMenuComponent;
+}
+/**
+ * Factory for creating components from API data
+ * @param data The api data to transform to a component class
+ */
+declare function createComponent(data: APIMessageComponent & {
+ type: T;
+}): MappedComponentTypes[T];
+
+/**
+ * Represents a select menu component
+ */
+declare class SelectMenuComponent implements Component {
+ readonly type: ComponentType.SelectMenu;
+ readonly options: SelectMenuOption[];
+ readonly placeholder?: string;
+ readonly min_values?: number;
+ readonly max_values?: number;
+ readonly custom_id: string;
+ readonly disabled?: boolean;
+ constructor(data?: APISelectMenuComponent);
+ /**
+ * Sets the placeholder for this select menu
+ * @param placeholder The placeholder to use for this select menu
+ */
+ setPlaceholder(placeholder: string): this;
+ /**
+ * Sets thes minimum values that must be selected in the select menu
+ * @param minValues The minimum values that must be selected
+ */
+ setMinValues(minValues: number): this;
+ /**
+ * Sets thes maximum values that must be selected in the select menu
+ * @param minValues 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 for this select menu
+ */
+ setCustomId(customId: string): this;
+ /**
+ * Sets whether or not this select menu is disabled
+ * @param disabled Whether or not this select menu is disabled
+ */
+ setDisabled(disabled: boolean): this;
+ /**
+ * Adds options to this select menu
+ * @param options The options to add to this select menu
+ * @returns
+ */
+ addOptions(...options: SelectMenuOption[]): this;
+ /**
+ * Sets the options on this select menu
+ * @param options The options to set on this select menu
+ */
+ setOptions(options: SelectMenuOption[]): this;
+ toJSON(): APISelectMenuComponent;
+}
+
+declare class SharedNameAndDescription {
+ readonly name: string;
+ readonly description: string;
+ /**
+ * Sets the name
+ *
+ * @param name The name
+ */
+ setName(name: string): this;
+ /**
+ * Sets the description
+ *
+ * @param description The description
+ */
+ setDescription(description: string): this;
+}
+
+declare abstract class ApplicationCommandOptionBase extends SharedNameAndDescription {
+ abstract readonly type: ApplicationCommandOptionType;
+ readonly required: boolean;
+ /**
+ * Marks the option as required
+ *
+ * @param required If this option should be required
+ */
+ setRequired(required: boolean): this;
+ abstract toJSON(): APIApplicationCommandBasicOption;
+ protected runRequiredValidations(): void;
+}
+
+declare class SlashCommandBooleanOption extends ApplicationCommandOptionBase {
+ readonly type: ApplicationCommandOptionType.Boolean;
+ toJSON(): APIApplicationCommandBooleanOption;
+}
+
+declare const allowedChannelTypes: readonly [ChannelType.GuildText, ChannelType.GuildVoice, ChannelType.GuildCategory, ChannelType.GuildNews, ChannelType.GuildStore, ChannelType.GuildNewsThread, ChannelType.GuildPublicThread, ChannelType.GuildPrivateThread, ChannelType.GuildStageVoice];
+declare type ApplicationCommandOptionAllowedChannelTypes = typeof allowedChannelTypes[number];
+declare class ApplicationCommandOptionChannelTypesMixin {
+ readonly channel_types?: ApplicationCommandOptionAllowedChannelTypes[];
+ /**
+ * Adds a channel type to this option
+ *
+ * @param channelType The type of channel to allow
+ */
+ addChannelType(channelType: ApplicationCommandOptionAllowedChannelTypes): this;
+ /**
+ * Adds channel types to this option
+ *
+ * @param channelTypes The channel types to add
+ */
+ addChannelTypes(channelTypes: ApplicationCommandOptionAllowedChannelTypes[]): this;
+}
+
+declare class SlashCommandChannelOption extends ApplicationCommandOptionBase {
+ readonly type: ApplicationCommandOptionType.Channel;
+ toJSON(): APIApplicationCommandChannelOption;
+}
+interface SlashCommandChannelOption extends ApplicationCommandOptionChannelTypesMixin {
+}
+
+declare abstract class ApplicationCommandNumericOptionMinMaxValueMixin {
+ readonly max_value?: number;
+ 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;
+}
+
+declare class ApplicationCommandOptionWithChoicesAndAutocompleteMixin {
+ readonly choices?: APIApplicationCommandOptionChoice[];
+ readonly autocomplete?: boolean;
+ readonly type: ApplicationCommandOptionType;
+ /**
+ * Adds a choice for this option
+ *
+ * @param name The name of the choice
+ * @param value The value of the choice
+ */
+ addChoice(name: string, value: T): Omit;
+ /**
+ * Adds multiple choices for this option
+ *
+ * @param choices The choices to add
+ */
+ addChoices(choices: [name: string, value: T][]): Omit;
+ setChoices(choices: Input): Input extends [] ? this & Pick, 'setAutocomplete'> : Omit;
+ /**
+ * Marks the option as autocompletable
+ * @param autocomplete If this option should be autocompletable
+ */
+ setAutocomplete(autocomplete: U): U extends true ? Omit : this & Pick, 'addChoice' | 'addChoices'>;
+}
+
+declare class SlashCommandIntegerOption extends ApplicationCommandOptionBase implements ApplicationCommandNumericOptionMinMaxValueMixin {
+ readonly type: ApplicationCommandOptionType.Integer;
+ setMaxValue(max: number): this;
+ setMinValue(min: number): this;
+ toJSON(): APIApplicationCommandIntegerOption;
+}
+interface SlashCommandIntegerOption extends ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin {
+}
+
+declare class SlashCommandMentionableOption extends ApplicationCommandOptionBase {
+ readonly type: ApplicationCommandOptionType.Mentionable;
+ toJSON(): APIApplicationCommandMentionableOption;
+}
+
+declare class SlashCommandNumberOption extends ApplicationCommandOptionBase implements ApplicationCommandNumericOptionMinMaxValueMixin {
+ readonly type: ApplicationCommandOptionType.Number;
+ setMaxValue(max: number): this;
+ setMinValue(min: number): this;
+ toJSON(): APIApplicationCommandNumberOption;
+}
+interface SlashCommandNumberOption extends ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin {
+}
+
+declare class SlashCommandRoleOption extends ApplicationCommandOptionBase {
+ readonly type: ApplicationCommandOptionType.Role;
+ toJSON(): APIApplicationCommandRoleOption;
+}
+
+declare class SlashCommandStringOption extends ApplicationCommandOptionBase {
+ readonly type: ApplicationCommandOptionType.String;
+ toJSON(): APIApplicationCommandStringOption;
+}
+interface SlashCommandStringOption extends ApplicationCommandOptionWithChoicesAndAutocompleteMixin {
+}
+
+declare class SlashCommandUserOption extends ApplicationCommandOptionBase {
+ readonly type: ApplicationCommandOptionType.User;
+ toJSON(): APIApplicationCommandUserOption;
+}
+
+declare class SharedSlashCommandOptions {
+ readonly options: ToAPIApplicationCommandOptions[];
+ /**
+ * Adds a boolean option
+ *
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addBooleanOption(input: SlashCommandBooleanOption | ((builder: SlashCommandBooleanOption) => SlashCommandBooleanOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ /**
+ * Adds a user option
+ *
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ /**
+ * Adds a channel option
+ *
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addChannelOption(input: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ /**
+ * Adds a role option
+ *
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ /**
+ * Adds a mentionable option
+ *
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addMentionableOption(input: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ /**
+ * Adds a string option
+ *
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addStringOption(input: SlashCommandStringOption | Omit | Omit | ((builder: SlashCommandStringOption) => SlashCommandStringOption | Omit | Omit)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ /**
+ * Adds an integer option
+ *
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addIntegerOption(input: SlashCommandIntegerOption | Omit | Omit | ((builder: SlashCommandIntegerOption) => SlashCommandIntegerOption | Omit | Omit)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ /**
+ * Adds a number option
+ *
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addNumberOption(input: SlashCommandNumberOption | Omit | Omit | ((builder: SlashCommandNumberOption) => SlashCommandNumberOption | Omit | Omit)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ private _sharedAddOptionMethod;
+}
+
+/**
+ * Represents a folder for subcommands
+ *
+ * For more information, go to 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 part of 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;
+ toJSON(): APIApplicationCommandSubcommandGroupOption;
+}
+interface SlashCommandSubcommandGroupBuilder extends SharedNameAndDescription {
+}
+/**
+ * Represents a subcommand
+ *
+ * For more information, go to 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 of this subcommand
+ */
+ readonly options: ApplicationCommandOptionBase[];
+ toJSON(): APIApplicationCommandSubcommandOption;
+}
+interface SlashCommandSubcommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {
+}
+
+declare class SlashCommandBuilder {
+ /**
+ * The name of this slash command
+ */
+ readonly name: string;
+ /**
+ * The description of this slash command
+ */
+ readonly description: string;
+ /**
+ * The options of this slash command
+ */
+ readonly options: ToAPIApplicationCommandOptions[];
+ /**
+ * Whether the command is enabled by default when the app is added to a guild
+ *
+ * @default true
+ */
+ readonly defaultPermission: boolean | undefined;
+ /**
+ * Returns the final data that should be sent to Discord.
+ *
+ * **Note:** Calling this function will validate required properties based on their conditions.
+ */
+ toJSON(): RESTPostAPIApplicationCommandsJSONBody;
+ /**
+ * Sets whether the command is enabled by default when the application is added to a guild.
+ *
+ * **Note**: 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 https://discord.com/developers/docs/interactions/application-commands#permissions
+ */
+ setDefaultPermission(value: boolean): this;
+ /**
+ * Adds a new subcommand group to this command
+ *
+ * @param input A function that returns a subcommand group builder, or an already built builder
+ */
+ addSubcommandGroup(input: SlashCommandSubcommandGroupBuilder | ((subcommandGroup: SlashCommandSubcommandGroupBuilder) => SlashCommandSubcommandGroupBuilder)): SlashCommandSubcommandsOnlyBuilder;
+ /**
+ * Adds a new subcommand to this command
+ *
+ * @param input A function that returns a subcommand builder, or an already built builder
+ */
+ addSubcommand(input: SlashCommandSubcommandBuilder | ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder)): SlashCommandSubcommandsOnlyBuilder;
+}
+interface SlashCommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {
+}
+interface SlashCommandSubcommandsOnlyBuilder extends SharedNameAndDescription, Pick {
+}
+interface SlashCommandOptionsOnlyBuilder extends SharedNameAndDescription, SharedSlashCommandOptions, Pick {
+}
+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 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 validateMaxChoicesLength(choices: APIApplicationCommandOptionChoice[]): void;
+declare function assertReturnOfBuilder(input: unknown, ExpectedInstanceOf: new () => T): asserts input is T;
+
+declare const Assertions$1_validateDescription: typeof validateDescription;
+declare const Assertions$1_validateMaxOptionsLength: typeof validateMaxOptionsLength;
+declare const Assertions$1_validateRequired: typeof validateRequired;
+declare const Assertions$1_validateMaxChoicesLength: typeof validateMaxChoicesLength;
+declare const Assertions$1_assertReturnOfBuilder: typeof assertReturnOfBuilder;
+declare namespace Assertions$1 {
+ export {
+ validateName$1 as validateName,
+ Assertions$1_validateDescription as validateDescription,
+ Assertions$1_validateMaxOptionsLength as validateMaxOptionsLength,
+ validateRequiredParameters$1 as validateRequiredParameters,
+ validateDefaultPermission$1 as validateDefaultPermission,
+ Assertions$1_validateRequired as validateRequired,
+ Assertions$1_validateMaxChoicesLength as validateMaxChoicesLength,
+ Assertions$1_assertReturnOfBuilder as assertReturnOfBuilder,
+ };
+}
+
+declare class ContextMenuCommandBuilder {
+ /**
+ * The name of this context menu command
+ */
+ readonly name: string;
+ /**
+ * The type of this context menu command
+ */
+ readonly type: ContextMenuCommandType;
+ /**
+ * Whether the command is enabled by default when the app is added to a guild
+ *
+ * @default true
+ */
+ readonly defaultPermission: boolean | undefined;
+ /**
+ * Sets the name
+ *
+ * @param name The name
+ */
+ setName(name: string): this;
+ /**
+ * Sets the type
+ *
+ * @param type The type
+ */
+ setType(type: ContextMenuCommandType): this;
+ /**
+ * Sets whether the command is enabled by default when the application is added to a guild.
+ *
+ * **Note**: 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 https://discord.com/developers/docs/interactions/application-commands#permissions
+ */
+ setDefaultPermission(value: boolean): this;
+ /**
+ * Returns the final data that should be sent to Discord.
+ *
+ * **Note:** Calling this function will validate required properties based on their conditions.
+ */
+ toJSON(): RESTPostAPIApplicationCommandsJSONBody;
+}
+declare type ContextMenuCommandType = ApplicationCommandType.User | ApplicationCommandType.Message;
+
+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 const Assertions_validateDefaultPermission: typeof validateDefaultPermission;
+declare const Assertions_validateName: typeof validateName;
+declare const Assertions_validateType: typeof validateType;
+declare const Assertions_validateRequiredParameters: typeof validateRequiredParameters;
+declare namespace Assertions {
+ export {
+ Assertions_validateDefaultPermission as validateDefaultPermission,
+ Assertions_validateName as validateName,
+ Assertions_validateType as validateType,
+ Assertions_validateRequiredParameters as validateRequiredParameters,
+ };
+}
+
+export { ActionRow, ActionRowComponent, AuthorOptions, ButtonComponent, Component, Assertions$2 as ComponentAssertions, Assertions as ContextMenuCommandAssertions, ContextMenuCommandBuilder, ContextMenuCommandType, Embed, Assertions$3 as EmbedAssertions, Faces, FooterOptions, MappedComponentTypes, SelectMenuComponent, SelectMenuOption, Assertions$1 as SlashCommandAssertions, SlashCommandBooleanOption, SlashCommandBuilder, SlashCommandChannelOption, SlashCommandIntegerOption, SlashCommandMentionableOption, SlashCommandNumberOption, SlashCommandOptionsOnlyBuilder, SlashCommandRoleOption, SlashCommandStringOption, SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder, SlashCommandSubcommandsOnlyBuilder, SlashCommandUserOption, TimestampStyles, TimestampStylesString, ToAPIApplicationCommandOptions, blockQuote, bold, channelMention, codeBlock, createComponent, formatEmoji, hideLinkEmbed, hyperlink, inlineCode, italic, memberNicknameMention, quote, roleMention, spoiler, strikethrough, time, underscore, userMention };
diff --git a/node_modules/@discordjs/builders/dist/index.js b/node_modules/@discordjs/builders/dist/index.js
new file mode 100644
index 0000000..14c9f4d
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.js
@@ -0,0 +1,4 @@
+var bt=Object.create;var O=Object.defineProperty;var Le=Object.getOwnPropertyDescriptor;var Ct=Object.getOwnPropertyNames;var ft=Object.getPrototypeOf,xt=Object.prototype.hasOwnProperty;var At=(t,e,i)=>e in t?O(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i;var ke=t=>O(t,"__esModule",{value:!0});var B=(t,e)=>{for(var i in e)O(t,i,{get:e[i],enumerable:!0})},De=(t,e,i,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of Ct(e))!xt.call(t,a)&&(i||a!=="default")&&O(t,a,{get:()=>e[a],enumerable:!(n=Le(e,a))||n.enumerable});return t},yt=(t,e)=>De(ke(O(t!=null?bt(ft(t)):{},"default",!e&&t&&t.__esModule?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t),Ot=(t=>(e,i)=>t&&t.get(e)||(i=De(ke({}),e,1),t&&t.set(e,i),i))(typeof WeakMap!="undefined"?new WeakMap:0),m=(t,e,i,n)=>{for(var a=n>1?void 0:n?Le(e,i):e,y=t.length-1,w;y>=0;y--)(w=t[y])&&(a=(n?w(e,i,a):w(a))||a);return n&&a&&O(e,i,a),a};var o=(t,e,i)=>(At(t,typeof e!="symbol"?e+"":e,i),i);var Zt={};B(Zt,{ActionRow:()=>z,ButtonComponent:()=>W,ComponentAssertions:()=>Pe,ContextMenuCommandAssertions:()=>Ve,ContextMenuCommandBuilder:()=>ht,Embed:()=>N,EmbedAssertions:()=>be,Faces:()=>je,SelectMenuComponent:()=>Z,SelectMenuOption:()=>Q,SlashCommandAssertions:()=>Re,SlashCommandBooleanOption:()=>te,SlashCommandBuilder:()=>ae,SlashCommandChannelOption:()=>P,SlashCommandIntegerOption:()=>I,SlashCommandMentionableOption:()=>ie,SlashCommandNumberOption:()=>M,SlashCommandRoleOption:()=>ne,SlashCommandStringOption:()=>R,SlashCommandSubcommandBuilder:()=>u,SlashCommandSubcommandGroupBuilder:()=>A,SlashCommandUserOption:()=>re,TimestampStyles:()=>Dt,blockQuote:()=>vt,bold:()=>Tt,channelMention:()=>_t,codeBlock:()=>St,createComponent:()=>Te,formatEmoji:()=>Lt,hideLinkEmbed:()=>wt,hyperlink:()=>Bt,inlineCode:()=>gt,italic:()=>Pt,memberNicknameMention:()=>Et,quote:()=>Rt,roleMention:()=>Vt,spoiler:()=>Nt,strikethrough:()=>Mt,time:()=>kt,underscore:()=>It,userMention:()=>$t});var be={};B(be,{authorNamePredicate:()=>me,colorPredicate:()=>le,descriptionPredicate:()=>de,embedFieldPredicate:()=>Ue,embedFieldsArrayPredicate:()=>J,fieldInlinePredicate:()=>U,fieldLengthPredicate:()=>Je,fieldNamePredicate:()=>S,fieldValuePredicate:()=>D,footerTextPredicate:()=>ce,timestampPredicate:()=>ue,titlePredicate:()=>he,urlPredicate:()=>h,validateFieldLength:()=>j});var l=require("zod"),S=l.z.string().min(1).max(256),D=l.z.string().min(1).max(1024),U=l.z.boolean().optional(),Ue=l.z.object({name:S,value:D,inline:U}),J=Ue.array(),Je=l.z.number().lte(25);function j(t,e){Je.parse(t.length+e)}var me=S.nullable(),h=l.z.string().url().nullish(),le=l.z.number().gte(0).lte(16777215).nullable(),de=l.z.string().min(1).max(4096).nullable(),ce=l.z.string().min(1).max(2048).nullable(),ue=l.z.union([l.z.number(),l.z.date()]).nullable(),he=S.nullable();var N=class{constructor(e={}){o(this,"fields");o(this,"title");o(this,"description");o(this,"url");o(this,"color");o(this,"timestamp");o(this,"thumbnail");o(this,"image");o(this,"video");o(this,"author");o(this,"provider");o(this,"footer");this.title=e.title,this.description=e.description,this.url=e.url,this.color=e.color,this.thumbnail=e.thumbnail,this.image=e.image,this.video=e.video,this.author=e.author,this.provider=e.provider,this.footer=e.footer,this.fields=e.fields??[],e.timestamp&&(this.timestamp=new Date(e.timestamp).toISOString())}get length(){return(this.title?.length??0)+(this.description?.length??0)+this.fields.reduce((e,i)=>e+i.name.length+i.value.length,0)+(this.footer?.text.length??0)+(this.author?.name.length??0)}addField(e){return this.addFields(e)}addFields(...e){return J.parse(e),j(this.fields,e.length),this.fields.push(...N.normalizeFields(...e)),this}spliceFields(e,i,...n){return J.parse(n),j(this.fields,n.length-i),this.fields.splice(e,i,...N.normalizeFields(...n)),this}setAuthor(e){if(e===null)return this.author=void 0,this;let{name:i,iconURL:n,url:a}=e;return me.parse(i),h.parse(n),h.parse(a),this.author={name:i,url:a,icon_url:n},this}setColor(e){return le.parse(e),this.color=e??void 0,this}setDescription(e){return de.parse(e),this.description=e??void 0,this}setFooter(e){if(e===null)return this.footer=void 0,this;let{text:i,iconURL:n}=e;return ce.parse(i),h.parse(n),this.footer={text:i,icon_url:n},this}setImage(e){return h.parse(e),this.image=e?{url:e}:void 0,this}setThumbnail(e){return h.parse(e),this.thumbnail=e?{url:e}:void 0,this}setTimestamp(e=Date.now()){return ue.parse(e),this.timestamp=e?new Date(e).toISOString():void 0,this}setTitle(e){return he.parse(e),this.title=e??void 0,this}setURL(e){return h.parse(e),this.url=e??void 0,this}toJSON(){return{...this}}static normalizeFields(...e){return e.flat(1/0).map(i=>(S.parse(i.name),D.parse(i.value),U.parse(i.inline),{name:i.name,value:i.value,inline:i.inline??void 0}))}};function St(t,e){return typeof e=="undefined"?`\`\`\`
+${t}\`\`\``:`\`\`\`${t}
+${e}\`\`\``}function gt(t){return`\`${t}\``}function Pt(t){return`_${t}_`}function Tt(t){return`**${t}**`}function It(t){return`__${t}__`}function Mt(t){return`~~${t}~~`}function Rt(t){return`> ${t}`}function vt(t){return`>>> ${t}`}function wt(t){return`<${t}>`}function Bt(t,e,i){return i?`[${t}](${e} "${i}")`:`[${t}](${e})`}function Nt(t){return`||${t}||`}function $t(t){return`<@${t}>`}function Et(t){return`<@!${t}>`}function _t(t){return`<#${t}>`}function Vt(t){return`<@&${t}>`}function Lt(t,e=!1){return`<${e?"a":""}:_:${t}>`}function kt(t,e){return typeof t!="number"&&(t=Math.floor((t?.getTime()??Date.now())/1e3)),typeof e=="string"?``:``}var Dt={ShortTime:"t",LongTime:"T",ShortDate:"d",LongDate:"D",ShortDateTime:"f",LongDateTime:"F",RelativeTime:"R"},je=(n=>(n.Shrug="\xAF\\_(\u30C4)\\_/\xAF",n.Tableflip="(\u256F\xB0\u25A1\xB0\uFF09\u256F\uFE35 \u253B\u2501\u253B",n.Unflip="\u252C\u2500\u252C \u30CE( \u309C-\u309C\u30CE)",n))(je||{});var Pe={};B(Pe,{buttonLabelValidator:()=>Ce,buttonStyleValidator:()=>fe,customIdValidator:()=>g,defaultValidator:()=>ye,disabledValidator:()=>E,emojiValidator:()=>$,labelValueValidator:()=>_,minMaxValidator:()=>F,optionsValidator:()=>qe,placeholderValidator:()=>xe,urlValidator:()=>Se,validateRequiredButtonParameters:()=>ge,validateRequiredSelectMenuOptionParameters:()=>Oe,validateRequiredSelectMenuParameters:()=>Ae});var q=require("discord-api-types/v9"),p=require("zod"),g=p.z.string().min(1).max(100),$=p.z.object({id:p.z.string(),name:p.z.string(),animated:p.z.boolean()}).partial().strict(),E=p.z.boolean(),Ce=p.z.string().nonempty().max(80),fe=p.z.number().int().min(q.ButtonStyle.Primary).max(q.ButtonStyle.Link),xe=p.z.string().max(100),F=p.z.number().int().min(0).max(25),qe=p.z.object({}).array().nonempty();function Ae(t,e){g.parse(e),qe.parse(t)}var _=p.z.string().min(1).max(100),ye=p.z.boolean();function Oe(t,e){_.parse(t),_.parse(e)}var Se=p.z.string().url();function ge(t,e,i,n,a){if(a&&n)throw new RangeError("URL and custom id are mutually exclusive");if(!e&&!i)throw new RangeError("Buttons must have a label and/or an emoji");if(t===q.ButtonStyle.Link){if(!a)throw new RangeError("Link buttons must have a url")}else if(a)throw new RangeError("Non-link buttons cannot have a url")}var Fe=require("discord-api-types/v9");var G=require("discord-api-types/v9");function Te(t){switch(t.type){case G.ComponentType.ActionRow:return new z(t);case G.ComponentType.Button:return new W(t);case G.ComponentType.SelectMenu:return new Z(t);default:throw new Error(`Cannot serialize component type: ${t.type}`)}}var z=class{constructor(e){o(this,"components",[]);o(this,"type",Fe.ComponentType.ActionRow);this.components=e?.components.map(Te)??[]}addComponents(...e){return this.components.push(...e),this}setComponents(e){return Reflect.set(this,"components",[...e]),this}toJSON(){return{...this,components:this.components.map(e=>e.toJSON())}}};var K=require("discord-api-types/v9");var W=class{constructor(e){o(this,"type",K.ComponentType.Button);o(this,"style");o(this,"label");o(this,"emoji");o(this,"disabled");o(this,"custom_id");o(this,"url");this.style=e?.style,this.label=e?.label,this.emoji=e?.emoji,this.disabled=e?.disabled,e?.style===K.ButtonStyle.Link?this.url=e.url:this.custom_id=e?.custom_id}setStyle(e){return fe.parse(e),Reflect.set(this,"style",e),this}setURL(e){return Se.parse(e),Reflect.set(this,"url",e),this}setCustomId(e){return g.parse(e),Reflect.set(this,"custom_id",e),this}setEmoji(e){return $.parse(e),Reflect.set(this,"emoji",e),this}setDisabled(e){return E.parse(e),Reflect.set(this,"disabled",e),this}setLabel(e){return Ce.parse(e),Reflect.set(this,"label",e),this}toJSON(){return ge(this.style,this.label,this.emoji,this.custom_id,this.url),{...this}}};var Ge=require("discord-api-types/v9");var Q=class{constructor(e){o(this,"label");o(this,"value");o(this,"description");o(this,"emoji");o(this,"default");this.label=e?.label,this.value=e?.value,this.description=e?.description,this.emoji=e?.emoji,this.default=e?.default}setLabel(e){return Reflect.set(this,"label",e),this}setValue(e){return Reflect.set(this,"value",e),this}setDescription(e){return _.parse(e),Reflect.set(this,"description",e),this}setDefault(e){return ye.parse(e),Reflect.set(this,"default",e),this}setEmoji(e){return $.parse(e),Reflect.set(this,"emoji",e),this}toJSON(){return Oe(this.label,this.value),{...this}}};var Z=class{constructor(e){o(this,"type",Ge.ComponentType.SelectMenu);o(this,"options");o(this,"placeholder");o(this,"min_values");o(this,"max_values");o(this,"custom_id");o(this,"disabled");this.options=e?.options.map(i=>new Q(i))??[],this.placeholder=e?.placeholder,this.min_values=e?.min_values,this.max_values=e?.max_values,this.custom_id=e?.custom_id,this.disabled=e?.disabled}setPlaceholder(e){return xe.parse(e),Reflect.set(this,"placeholder",e),this}setMinValues(e){return F.parse(e),Reflect.set(this,"min_values",e),this}setMaxValues(e){return F.parse(e),Reflect.set(this,"max_values",e),this}setCustomId(e){return g.parse(e),Reflect.set(this,"custom_id",e),this}setDisabled(e){return E.parse(e),Reflect.set(this,"disabled",e),this}addOptions(...e){return this.options.push(...e),this}setOptions(e){return Reflect.set(this,"options",[...e]),this}toJSON(){return Ae(this.options,this.custom_id),{...this,options:this.options.map(e=>e.toJSON())}}};var Re={};B(Re,{assertReturnOfBuilder:()=>C,validateDefaultPermission:()=>Ie,validateDescription:()=>Y,validateMaxChoicesLength:()=>Me,validateMaxOptionsLength:()=>c,validateName:()=>X,validateRequired:()=>ee,validateRequiredParameters:()=>b});var H=yt(require("@sindresorhus/is")),V=require("zod"),Ut=V.z.string().min(1).max(32).regex(/^[\P{Lu}\p{N}_-]+$/u);function X(t){Ut.parse(t)}var Jt=V.z.string().min(1).max(100);function Y(t){Jt.parse(t)}var ze=V.z.unknown().array().max(25);function c(t){ze.parse(t)}function b(t,e,i){X(t),Y(e),c(i)}var We=V.z.boolean();function Ie(t){We.parse(t)}function ee(t){We.parse(t)}function Me(t){ze.parse(t)}function C(t,e){let i=e.name;if(H.default.nullOrUndefined(t))throw new TypeError(`Expected to receive a ${i} builder, got ${t===null?"null":"undefined"} instead.`);if(H.default.primitive(t))throw new TypeError(`Expected to receive a ${i} builder, got a primitive (${typeof t}) instead.`);if(!(t instanceof e)){let n=t,a=H.default.function_(t)?t.name:n.constructor.name,y=Reflect.get(n,Symbol.toStringTag),w=y?`${a} [${y}]`:a;throw new TypeError(`Expected to receive a ${i} builder, got ${w} instead.`)}}var ut=require("ts-mixer");var Ze=require("discord-api-types/v9");var f=class{constructor(){o(this,"name");o(this,"description")}setName(e){return X(e),Reflect.set(this,"name",e),this}setDescription(e){return Y(e),Reflect.set(this,"description",e),this}};var s=class extends f{constructor(){super(...arguments);o(this,"required",!1)}setRequired(e){return ee(e),Reflect.set(this,"required",e),this}runRequiredValidations(){b(this.name,this.description,[]),ee(this.required)}};var te=class extends s{constructor(){super(...arguments);o(this,"type",Ze.ApplicationCommandOptionType.Boolean)}toJSON(){return this.runRequiredValidations(),{...this}}};var Ke=require("discord-api-types/v9"),Qe=require("ts-mixer");var d=require("discord-api-types/v9"),ve=require("zod"),jt=[d.ChannelType.GuildText,d.ChannelType.GuildVoice,d.ChannelType.GuildCategory,d.ChannelType.GuildNews,d.ChannelType.GuildStore,d.ChannelType.GuildNewsThread,d.ChannelType.GuildPublicThread,d.ChannelType.GuildPrivateThread,d.ChannelType.GuildStageVoice],qt=ve.z.union(jt.map(t=>ve.z.literal(t))),we=class{constructor(){o(this,"channel_types")}addChannelType(e){return this.channel_types===void 0&&Reflect.set(this,"channel_types",[]),qt.parse(e),this.channel_types.push(e),this}addChannelTypes(e){return e.forEach(i=>this.addChannelType(i)),this}};var P=class extends s{constructor(){super(...arguments);o(this,"type",Ke.ApplicationCommandOptionType.Channel)}toJSON(){return this.runRequiredValidations(),{...this}}};P=m([(0,Qe.mix)(we)],P);var et=require("discord-api-types/v9"),tt=require("ts-mixer"),ot=require("zod");var L=class{constructor(){o(this,"max_value");o(this,"min_value")}};var He=require("discord-api-types/v9"),T=require("zod");var oe=T.z.string().min(1).max(100),Xe=T.z.number().gt(-1/0).lt(1/0),Ye=T.z.tuple([oe,T.z.union([oe,Xe])]).array(),Ft=T.z.boolean(),x=class{constructor(){o(this,"choices");o(this,"autocomplete");o(this,"type")}addChoice(e,i){if(this.autocomplete)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");return this.choices===void 0&&Reflect.set(this,"choices",[]),Me(this.choices),oe.parse(e),this.type===He.ApplicationCommandOptionType.String?oe.parse(i):Xe.parse(i),this.choices.push({name:e,value:i}),this}addChoices(e){if(this.autocomplete)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");Ye.parse(e);for(let[i,n]of e)this.addChoice(i,n);return this}setChoices(e){if(e.length>0&&this.autocomplete)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");Ye.parse(e),Reflect.set(this,"choices",[]);for(let[i,n]of e)this.addChoice(i,n);return this}setAutocomplete(e){if(Ft.parse(e),e&&Array.isArray(this.choices)&&this.choices.length>0)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");return Reflect.set(this,"autocomplete",e),this}};var it=ot.z.number().int().nonnegative(),I=class extends s{constructor(){super(...arguments);o(this,"type",et.ApplicationCommandOptionType.Integer)}setMaxValue(e){return it.parse(e),Reflect.set(this,"max_value",e),this}setMinValue(e){return it.parse(e),Reflect.set(this,"min_value",e),this}toJSON(){if(this.runRequiredValidations(),this.autocomplete&&Array.isArray(this.choices)&&this.choices.length>0)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");return{...this}}};I=m([(0,tt.mix)(L,x)],I);var nt=require("discord-api-types/v9");var ie=class extends s{constructor(){super(...arguments);o(this,"type",nt.ApplicationCommandOptionType.Mentionable)}toJSON(){return this.runRequiredValidations(),{...this}}};var rt=require("discord-api-types/v9"),at=require("ts-mixer"),st=require("zod");var pt=st.z.number().nonnegative(),M=class extends s{constructor(){super(...arguments);o(this,"type",rt.ApplicationCommandOptionType.Number)}setMaxValue(e){return pt.parse(e),Reflect.set(this,"max_value",e),this}setMinValue(e){return pt.parse(e),Reflect.set(this,"min_value",e),this}toJSON(){if(this.runRequiredValidations(),this.autocomplete&&Array.isArray(this.choices)&&this.choices.length>0)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");return{...this}}};M=m([(0,at.mix)(L,x)],M);var mt=require("discord-api-types/v9");var ne=class extends s{constructor(){super(...arguments);o(this,"type",mt.ApplicationCommandOptionType.Role)}toJSON(){return this.runRequiredValidations(),{...this}}};var lt=require("discord-api-types/v9"),dt=require("ts-mixer");var R=class extends s{constructor(){super(...arguments);o(this,"type",lt.ApplicationCommandOptionType.String)}toJSON(){if(this.runRequiredValidations(),this.autocomplete&&Array.isArray(this.choices)&&this.choices.length>0)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");return{...this}}};R=m([(0,dt.mix)(x)],R);var ct=require("discord-api-types/v9");var re=class extends s{constructor(){super(...arguments);o(this,"type",ct.ApplicationCommandOptionType.User)}toJSON(){return this.runRequiredValidations(),{...this}}};var k=class{constructor(){o(this,"options")}addBooleanOption(e){return this._sharedAddOptionMethod(e,te)}addUserOption(e){return this._sharedAddOptionMethod(e,re)}addChannelOption(e){return this._sharedAddOptionMethod(e,P)}addRoleOption(e){return this._sharedAddOptionMethod(e,ne)}addMentionableOption(e){return this._sharedAddOptionMethod(e,ie)}addStringOption(e){return this._sharedAddOptionMethod(e,R)}addIntegerOption(e){return this._sharedAddOptionMethod(e,I)}addNumberOption(e){return this._sharedAddOptionMethod(e,M)}_sharedAddOptionMethod(e,i){let{options:n}=this;c(n);let a=typeof e=="function"?e(new i):e;return C(a,i),n.push(a),this}};var Be=require("discord-api-types/v9"),Ne=require("ts-mixer");var A=class{constructor(){o(this,"name");o(this,"description");o(this,"options",[])}addSubcommand(e){let{options:i}=this;c(i);let n=typeof e=="function"?e(new u):e;return C(n,u),i.push(n),this}toJSON(){return b(this.name,this.description,this.options),{type:Be.ApplicationCommandOptionType.SubcommandGroup,name:this.name,description:this.description,options:this.options.map(e=>e.toJSON())}}};A=m([(0,Ne.mix)(f)],A);var u=class{constructor(){o(this,"name");o(this,"description");o(this,"options",[])}toJSON(){return b(this.name,this.description,this.options),{type:Be.ApplicationCommandOptionType.Subcommand,name:this.name,description:this.description,options:this.options.map(e=>e.toJSON())}}};u=m([(0,Ne.mix)(f,k)],u);var ae=class{constructor(){o(this,"name");o(this,"description");o(this,"options",[]);o(this,"defaultPermission")}toJSON(){return b(this.name,this.description,this.options),{name:this.name,description:this.description,options:this.options.map(e=>e.toJSON()),default_permission:this.defaultPermission}}setDefaultPermission(e){return Ie(e),Reflect.set(this,"defaultPermission",e),this}addSubcommandGroup(e){let{options:i}=this;c(i);let n=typeof e=="function"?e(new A):e;return C(n,A),i.push(n),this}addSubcommand(e){let{options:i}=this;c(i);let n=typeof e=="function"?e(new u):e;return C(n,u),i.push(n),this}};ae=m([(0,ut.mix)(k,f)],ae);var Ve={};B(Ve,{validateDefaultPermission:()=>Ee,validateName:()=>se,validateRequiredParameters:()=>_e,validateType:()=>pe});var v=require("zod"),$e=require("discord-api-types/v9"),Gt=v.z.string().min(1).max(32).regex(/^( *[\p{L}\p{N}_-]+ *)+$/u),zt=v.z.union([v.z.literal($e.ApplicationCommandType.User),v.z.literal($e.ApplicationCommandType.Message)]),Wt=v.z.boolean();function Ee(t){Wt.parse(t)}function se(t){Gt.parse(t)}function pe(t){zt.parse(t)}function _e(t,e){se(t),pe(e)}var ht=class{constructor(){o(this,"name");o(this,"type");o(this,"defaultPermission")}setName(e){return se(e),Reflect.set(this,"name",e),this}setType(e){return pe(e),Reflect.set(this,"type",e),this}setDefaultPermission(e){return Ee(e),Reflect.set(this,"defaultPermission",e),this}toJSON(){return _e(this.name,this.type),{name:this.name,type:this.type,default_permission:this.defaultPermission}}};module.exports=Ot(Zt);0&&(module.exports={ActionRow,ButtonComponent,ComponentAssertions,ContextMenuCommandAssertions,ContextMenuCommandBuilder,Embed,EmbedAssertions,Faces,SelectMenuComponent,SelectMenuOption,SlashCommandAssertions,SlashCommandBooleanOption,SlashCommandBuilder,SlashCommandChannelOption,SlashCommandIntegerOption,SlashCommandMentionableOption,SlashCommandNumberOption,SlashCommandRoleOption,SlashCommandStringOption,SlashCommandSubcommandBuilder,SlashCommandSubcommandGroupBuilder,SlashCommandUserOption,TimestampStyles,blockQuote,bold,channelMention,codeBlock,createComponent,formatEmoji,hideLinkEmbed,hyperlink,inlineCode,italic,memberNicknameMention,quote,roleMention,spoiler,strikethrough,time,underscore,userMention});
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/index.js.map b/node_modules/@discordjs/builders/dist/index.js.map
new file mode 100644
index 0000000..882665a
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../src/index.ts","../src/messages/embed/Assertions.ts","../src/messages/embed/Embed.ts","../src/messages/formatters.ts","../src/components/Assertions.ts","../src/components/ActionRow.ts","../src/components/Components.ts","../src/components/Button.ts","../src/components/selectMenu/SelectMenu.ts","../src/components/selectMenu/SelectMenuOption.ts","../src/interactions/slashCommands/Assertions.ts","../src/interactions/slashCommands/SlashCommandBuilder.ts","../src/interactions/slashCommands/options/boolean.ts","../src/interactions/slashCommands/mixins/NameAndDescription.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionBase.ts","../src/interactions/slashCommands/options/channel.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts","../src/interactions/slashCommands/options/integer.ts","../src/interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.ts","../src/interactions/slashCommands/options/mentionable.ts","../src/interactions/slashCommands/options/number.ts","../src/interactions/slashCommands/options/role.ts","../src/interactions/slashCommands/options/string.ts","../src/interactions/slashCommands/options/user.ts","../src/interactions/slashCommands/mixins/SharedSlashCommandOptions.ts","../src/interactions/slashCommands/SlashCommandSubcommands.ts","../src/interactions/contextMenuCommands/Assertions.ts","../src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts"],"sourcesContent":["export * as EmbedAssertions from './messages/embed/Assertions';\nexport * from './messages/embed/Embed';\nexport * from './messages/formatters';\n\nexport * as ComponentAssertions from './components/Assertions';\nexport * from './components/ActionRow';\nexport * from './components/Button';\nexport * from './components/Component';\nexport * from './components/Components';\nexport * from './components/selectMenu/SelectMenu';\nexport * from './components/selectMenu/SelectMenuOption';\n\nexport * as SlashCommandAssertions from './interactions/slashCommands/Assertions';\nexport * from './interactions/slashCommands/SlashCommandBuilder';\nexport * from './interactions/slashCommands/SlashCommandSubcommands';\nexport * from './interactions/slashCommands/options/boolean';\nexport * from './interactions/slashCommands/options/channel';\nexport * from './interactions/slashCommands/options/integer';\nexport * from './interactions/slashCommands/options/mentionable';\nexport * from './interactions/slashCommands/options/number';\nexport * from './interactions/slashCommands/options/role';\nexport * from './interactions/slashCommands/options/string';\nexport * from './interactions/slashCommands/options/user';\n\nexport * as ContextMenuCommandAssertions from './interactions/contextMenuCommands/Assertions';\nexport * from './interactions/contextMenuCommands/ContextMenuCommandBuilder';\n","import type { APIEmbedField } from 'discord-api-types/v9';\nimport { z } from 'zod';\n\nexport const fieldNamePredicate = z.string().min(1).max(256);\n\nexport const fieldValuePredicate = z.string().min(1).max(1024);\n\nexport const fieldInlinePredicate = z.boolean().optional();\n\nexport const embedFieldPredicate = z.object({\n\tname: fieldNamePredicate,\n\tvalue: fieldValuePredicate,\n\tinline: fieldInlinePredicate,\n});\n\nexport const embedFieldsArrayPredicate = embedFieldPredicate.array();\n\nexport const fieldLengthPredicate = z.number().lte(25);\n\nexport function validateFieldLength(fields: APIEmbedField[], amountAdding: number): void {\n\tfieldLengthPredicate.parse(fields.length + amountAdding);\n}\n\nexport const authorNamePredicate = fieldNamePredicate.nullable();\n\nexport const urlPredicate = z.string().url().nullish();\n\nexport const colorPredicate = z.number().gte(0).lte(0xffffff).nullable();\n\nexport const descriptionPredicate = z.string().min(1).max(4096).nullable();\n\nexport const footerTextPredicate = z.string().min(1).max(2048).nullable();\n\nexport const timestampPredicate = z.union([z.number(), z.date()]).nullable();\n\nexport const titlePredicate = fieldNamePredicate.nullable();\n","import type {\n\tAPIEmbed,\n\tAPIEmbedAuthor,\n\tAPIEmbedField,\n\tAPIEmbedFooter,\n\tAPIEmbedImage,\n\tAPIEmbedProvider,\n\tAPIEmbedThumbnail,\n\tAPIEmbedVideo,\n} from 'discord-api-types/v9';\nimport {\n\tauthorNamePredicate,\n\tcolorPredicate,\n\tdescriptionPredicate,\n\tembedFieldsArrayPredicate,\n\tfieldInlinePredicate,\n\tfieldNamePredicate,\n\tfieldValuePredicate,\n\tfooterTextPredicate,\n\ttimestampPredicate,\n\ttitlePredicate,\n\turlPredicate,\n\tvalidateFieldLength,\n} from './Assertions';\n\nexport interface AuthorOptions {\n\tname: string;\n\turl?: string;\n\ticonURL?: string;\n}\n\nexport interface FooterOptions {\n\ttext: string;\n\ticonURL?: string;\n}\n\n/**\n * Represents an embed in a message (image/video preview, rich embed, etc.)\n */\nexport class Embed implements APIEmbed {\n\t/**\n\t * An array of fields of this embed\n\t */\n\tpublic fields: APIEmbedField[];\n\n\t/**\n\t * The embed title\n\t */\n\tpublic title?: string;\n\n\t/**\n\t * The embed description\n\t */\n\tpublic description?: string;\n\n\t/**\n\t * The embed url\n\t */\n\tpublic url?: string;\n\n\t/**\n\t * The embed color\n\t */\n\tpublic color?: number;\n\n\t/**\n\t * The timestamp of the embed in the ISO format\n\t */\n\tpublic timestamp?: string;\n\n\t/**\n\t * The embed thumbnail data\n\t */\n\tpublic thumbnail?: APIEmbedThumbnail;\n\n\t/**\n\t * The embed image data\n\t */\n\tpublic image?: APIEmbedImage;\n\n\t/**\n\t * Received video data\n\t */\n\tpublic video?: APIEmbedVideo;\n\n\t/**\n\t * The embed author data\n\t */\n\tpublic author?: APIEmbedAuthor;\n\n\t/**\n\t * Received data about the embed provider\n\t */\n\tpublic provider?: APIEmbedProvider;\n\n\t/**\n\t * The embed footer data\n\t */\n\tpublic footer?: APIEmbedFooter;\n\n\tpublic constructor(data: APIEmbed = {}) {\n\t\tthis.title = data.title;\n\t\tthis.description = data.description;\n\t\tthis.url = data.url;\n\t\tthis.color = data.color;\n\t\tthis.thumbnail = data.thumbnail;\n\t\tthis.image = data.image;\n\t\tthis.video = data.video;\n\t\tthis.author = data.author;\n\t\tthis.provider = data.provider;\n\t\tthis.footer = data.footer;\n\t\tthis.fields = data.fields ?? [];\n\n\t\tif (data.timestamp) this.timestamp = new Date(data.timestamp).toISOString();\n\t}\n\n\t/**\n\t * The accumulated length for the embed title, description, fields, footer text, and author name\n\t */\n\tpublic get length(): number {\n\t\treturn (\n\t\t\t(this.title?.length ?? 0) +\n\t\t\t(this.description?.length ?? 0) +\n\t\t\tthis.fields.reduce((prev, curr) => prev + curr.name.length + curr.value.length, 0) +\n\t\t\t(this.footer?.text.length ?? 0) +\n\t\t\t(this.author?.name.length ?? 0)\n\t\t);\n\t}\n\n\t/**\n\t * Adds a field to the embed (max 25)\n\t *\n\t * @param field The field to add.\n\t */\n\tpublic addField(field: APIEmbedField): this {\n\t\treturn this.addFields(field);\n\t}\n\n\t/**\n\t * Adds fields to the embed (max 25)\n\t *\n\t * @param fields The fields to add\n\t */\n\tpublic addFields(...fields: APIEmbedField[]): this {\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(this.fields, fields.length);\n\n\t\tthis.fields.push(...Embed.normalizeFields(...fields));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts fields in the embed (max 25)\n\t *\n\t * @param index The index to start at\n\t * @param deleteCount The number of fields to remove\n\t * @param fields The replacing field objects\n\t */\n\tpublic spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this {\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(this.fields, fields.length - deleteCount);\n\n\t\tthis.fields.splice(index, deleteCount, ...Embed.normalizeFields(...fields));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the author of this embed\n\t *\n\t * @param options The options for the author\n\t */\n\tpublic setAuthor(options: AuthorOptions | null): this {\n\t\tif (options === null) {\n\t\t\tthis.author = undefined;\n\t\t\treturn this;\n\t\t}\n\n\t\tconst { name, iconURL, url } = options;\n\t\t// Data assertions\n\t\tauthorNamePredicate.parse(name);\n\t\turlPredicate.parse(iconURL);\n\t\turlPredicate.parse(url);\n\n\t\tthis.author = { name, url, icon_url: iconURL };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the color of this embed\n\t *\n\t * @param color The color of the embed\n\t */\n\tpublic setColor(color: number | null): this {\n\t\t// Data assertions\n\t\tcolorPredicate.parse(color);\n\n\t\tthis.color = color ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this embed\n\t *\n\t * @param description The description\n\t */\n\tpublic setDescription(description: string | null): this {\n\t\t// Data assertions\n\t\tdescriptionPredicate.parse(description);\n\n\t\tthis.description = description ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the footer of this embed\n\t *\n\t * @param options The options for the footer\n\t */\n\tpublic setFooter(options: FooterOptions | null): this {\n\t\tif (options === null) {\n\t\t\tthis.footer = undefined;\n\t\t\treturn this;\n\t\t}\n\n\t\tconst { text, iconURL } = options;\n\t\t// Data assertions\n\t\tfooterTextPredicate.parse(text);\n\t\turlPredicate.parse(iconURL);\n\n\t\tthis.footer = { text, icon_url: iconURL };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the image of this embed\n\t *\n\t * @param url The URL of the image\n\t */\n\tpublic setImage(url: string | null): this {\n\t\t// Data assertions\n\t\turlPredicate.parse(url);\n\n\t\tthis.image = url ? { url } : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the thumbnail of this embed\n\t *\n\t * @param url The URL of the thumbnail\n\t */\n\tpublic setThumbnail(url: string | null): this {\n\t\t// Data assertions\n\t\turlPredicate.parse(url);\n\n\t\tthis.thumbnail = url ? { url } : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the timestamp of this embed\n\t *\n\t * @param timestamp The timestamp or date\n\t */\n\tpublic setTimestamp(timestamp: number | Date | null = Date.now()): this {\n\t\t// Data assertions\n\t\ttimestampPredicate.parse(timestamp);\n\n\t\tthis.timestamp = timestamp ? new Date(timestamp).toISOString() : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the title of this embed\n\t *\n\t * @param title The title\n\t */\n\tpublic setTitle(title: string | null): this {\n\t\t// Data assertions\n\t\ttitlePredicate.parse(title);\n\n\t\tthis.title = title ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL of this embed\n\t *\n\t * @param url The URL\n\t */\n\tpublic setURL(url: string | null): this {\n\t\t// Data assertions\n\t\turlPredicate.parse(url);\n\n\t\tthis.url = url ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transforms the embed to a plain object\n\t */\n\tpublic toJSON(): APIEmbed {\n\t\treturn { ...this };\n\t}\n\n\t/**\n\t * Normalizes field input and resolves strings\n\t *\n\t * @param fields Fields to normalize\n\t */\n\tpublic static normalizeFields(...fields: APIEmbedField[]): APIEmbedField[] {\n\t\treturn fields.flat(Infinity).map((field) => {\n\t\t\tfieldNamePredicate.parse(field.name);\n\t\t\tfieldValuePredicate.parse(field.value);\n\t\t\tfieldInlinePredicate.parse(field.inline);\n\n\t\t\treturn { name: field.name, value: field.value, inline: field.inline ?? undefined };\n\t\t});\n\t}\n}\n","import type { Snowflake } from 'discord-api-types/globals';\nimport type { URL } from 'url';\n\n/**\n * Wraps the content inside a codeblock with no language\n *\n * @param content The content to wrap\n */\nexport function codeBlock(content: C): `\\`\\`\\`\\n${C}\\`\\`\\``;\n\n/**\n * Wraps the content inside a codeblock with the specified language\n *\n * @param language The language for the codeblock\n * @param content The content to wrap\n */\nexport function codeBlock(language: L, content: C): `\\`\\`\\`${L}\\n${C}\\`\\`\\``;\nexport function codeBlock(language: string, content?: string): string {\n\treturn typeof content === 'undefined' ? `\\`\\`\\`\\n${language}\\`\\`\\`` : `\\`\\`\\`${language}\\n${content}\\`\\`\\``;\n}\n\n/**\n * Wraps the content inside \\`backticks\\`, which formats it as inline code\n *\n * @param content The content to wrap\n */\nexport function inlineCode(content: C): `\\`${C}\\`` {\n\treturn `\\`${content}\\``;\n}\n\n/**\n * Formats the content into italic text\n *\n * @param content The content to wrap\n */\nexport function italic(content: C): `_${C}_` {\n\treturn `_${content}_`;\n}\n\n/**\n * Formats the content into bold text\n *\n * @param content The content to wrap\n */\nexport function bold(content: C): `**${C}**` {\n\treturn `**${content}**`;\n}\n\n/**\n * Formats the content into underscored text\n *\n * @param content The content to wrap\n */\nexport function underscore(content: C): `__${C}__` {\n\treturn `__${content}__`;\n}\n\n/**\n * Formats the content into strike-through text\n *\n * @param content The content to wrap\n */\nexport function strikethrough(content: C): `~~${C}~~` {\n\treturn `~~${content}~~`;\n}\n\n/**\n * Formats the content into a quote. This needs to be at the start of the line for Discord to format it\n *\n * @param content The content to wrap\n */\nexport function quote(content: C): `> ${C}` {\n\treturn `> ${content}`;\n}\n\n/**\n * Formats the content into a block quote. This needs to be at the start of the line for Discord to format it\n *\n * @param content The content to wrap\n */\nexport function blockQuote(content: C): `>>> ${C}` {\n\treturn `>>> ${content}`;\n}\n\n/**\n * Wraps the URL into `<>`, which stops it from embedding\n *\n * @param url The URL to wrap\n */\nexport function hideLinkEmbed(url: C): `<${C}>`;\n\n/**\n * Wraps the URL into `<>`, which stops it from embedding\n *\n * @param url The URL to wrap\n */\nexport function hideLinkEmbed(url: URL): `<${string}>`;\nexport function hideLinkEmbed(url: string | URL) {\n\t// eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n\treturn `<${url}>`;\n}\n\n/**\n * Formats the content and the URL into a masked URL\n *\n * @param content The content to display\n * @param url The URL the content links to\n */\nexport function hyperlink(content: C, url: URL): `[${C}](${string})`;\n\n/**\n * Formats the content and the URL into a masked URL\n *\n * @param content The content to display\n * @param url The URL the content links to\n */\nexport function hyperlink(content: C, url: U): `[${C}](${U})`;\n\n/**\n * Formats the content and the URL into a masked URL\n *\n * @param content The content to display\n * @param url The URL the content links to\n * @param title The title shown when hovering on the masked link\n */\nexport function hyperlink(\n\tcontent: C,\n\turl: URL,\n\ttitle: T,\n): `[${C}](${string} \"${T}\")`;\n\n/**\n * Formats the content and the URL into a masked URL\n *\n * @param content The content to display\n * @param url The URL the content links to\n * @param title The title shown when hovering on the masked link\n */\nexport function hyperlink(\n\tcontent: C,\n\turl: U,\n\ttitle: T,\n): `[${C}](${U} \"${T}\")`;\nexport function hyperlink(content: string, url: string | URL, title?: string) {\n\t// eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n\treturn title ? `[${content}](${url} \"${title}\")` : `[${content}](${url})`;\n}\n\n/**\n * Wraps the content inside spoiler (hidden text)\n *\n * @param content The content to wrap\n */\nexport function spoiler(content: C): `||${C}||` {\n\treturn `||${content}||`;\n}\n\n/**\n * Formats a user ID into a user mention\n *\n * @param userId The user ID to format\n */\nexport function userMention(userId: C): `<@${C}>` {\n\treturn `<@${userId}>`;\n}\n\n/**\n * Formats a user ID into a member-nickname mention\n *\n * @param memberId The user ID to format\n */\nexport function memberNicknameMention(memberId: C): `<@!${C}>` {\n\treturn `<@!${memberId}>`;\n}\n\n/**\n * Formats a channel ID into a channel mention\n *\n * @param channelId The channel ID to format\n */\nexport function channelMention(channelId: C): `<#${C}>` {\n\treturn `<#${channelId}>`;\n}\n\n/**\n * Formats a role ID into a role mention\n *\n * @param roleId The role ID to format\n */\nexport function roleMention(roleId: C): `<@&${C}>` {\n\treturn `<@&${roleId}>`;\n}\n\n/**\n * Formats an emoji ID into a fully qualified emoji identifier\n *\n * @param emojiId The emoji ID to format\n */\nexport function formatEmoji(emojiId: C, animated?: false): `<:_:${C}>`;\n\n/**\n * Formats an emoji ID into a fully qualified emoji identifier\n *\n * @param emojiId The emoji ID to format\n * @param animated Whether the emoji is animated or not. Defaults to `false`\n */\nexport function formatEmoji(emojiId: C, animated?: true): ``;\n\n/**\n * Formats an emoji ID into a fully qualified emoji identifier\n *\n * @param emojiId The emoji ID to format\n * @param animated Whether the emoji is animated or not. Defaults to `false`\n */\nexport function formatEmoji(emojiId: C, animated = false): `` | `<:_:${C}>` {\n\treturn `<${animated ? 'a' : ''}:_:${emojiId}>`;\n}\n\n/**\n * Formats a date into a short date-time string\n *\n * @param date The date to format, defaults to the current time\n */\nexport function time(date?: Date): ``;\n\n/**\n * Formats a date given a format style\n *\n * @param date The date to format\n * @param style The style to use\n */\nexport function time(date: Date, style: S): ``;\n\n/**\n * Formats the given timestamp into a short date-time string\n *\n * @param seconds The time to format, represents an UNIX timestamp in seconds\n */\nexport function time(seconds: C): ``;\n\n/**\n * Formats the given timestamp into a short date-time string\n *\n * @param seconds The time to format, represents an UNIX timestamp in seconds\n * @param style The style to use\n */\nexport function time(seconds: C, style: S): ``;\nexport function time(timeOrSeconds?: number | Date, style?: TimestampStylesString): string {\n\tif (typeof timeOrSeconds !== 'number') {\n\t\ttimeOrSeconds = Math.floor((timeOrSeconds?.getTime() ?? Date.now()) / 1000);\n\t}\n\n\treturn typeof style === 'string' ? `` : ``;\n}\n\n/**\n * The [message formatting timestamp styles](https://discord.com/developers/docs/reference#message-formatting-timestamp-styles) supported by Discord\n */\nexport const TimestampStyles = {\n\t/**\n\t * Short time format, consisting of hours and minutes, e.g. 16:20\n\t */\n\tShortTime: 't',\n\n\t/**\n\t * Long time format, consisting of hours, minutes, and seconds, e.g. 16:20:30\n\t */\n\tLongTime: 'T',\n\n\t/**\n\t * Short date format, consisting of day, month, and year, e.g. 20/04/2021\n\t */\n\tShortDate: 'd',\n\n\t/**\n\t * Long date format, consisting of day, month, and year, e.g. 20 April 2021\n\t */\n\tLongDate: 'D',\n\n\t/**\n\t * Short date-time format, consisting of short date and short time formats, e.g. 20 April 2021 16:20\n\t */\n\tShortDateTime: 'f',\n\n\t/**\n\t * Long date-time format, consisting of long date and short time formats, e.g. Tuesday, 20 April 2021 16:20\n\t */\n\tLongDateTime: 'F',\n\n\t/**\n\t * Relative time format, consisting of a relative duration format, e.g. 2 months ago\n\t */\n\tRelativeTime: 'R',\n} as const;\n\n/**\n * The possible values, see {@link TimestampStyles} for more information\n */\nexport type TimestampStylesString = typeof TimestampStyles[keyof typeof TimestampStyles];\n\n/**\n * An enum with all the available faces from Discord's native slash commands\n */\nexport enum Faces {\n\t/**\n\t * ¯\\\\_(ツ)\\\\_/¯\n\t */\n\tShrug = '¯\\\\_(ツ)\\\\_/¯',\n\n\t/**\n\t * (╯°□°)╯︵ ┻━┻\n\t */\n\tTableflip = '(╯°□°)╯︵ ┻━┻',\n\n\t/**\n\t * ┬─┬ ノ( ゜-゜ノ)\n\t */\n\tUnflip = '┬─┬ ノ( ゜-゜ノ)',\n}\n","import { APIMessageComponentEmoji, ButtonStyle } from 'discord-api-types/v9';\nimport { z } from 'zod';\nimport type { SelectMenuOption } from './selectMenu/SelectMenuOption';\n\nexport const customIdValidator = z.string().min(1).max(100);\n\nexport const emojiValidator = z\n\t.object({\n\t\tid: z.string(),\n\t\tname: z.string(),\n\t\tanimated: z.boolean(),\n\t})\n\t.partial()\n\t.strict();\n\nexport const disabledValidator = z.boolean();\n\nexport const buttonLabelValidator = z.string().nonempty().max(80);\n\nexport const buttonStyleValidator = z.number().int().min(ButtonStyle.Primary).max(ButtonStyle.Link);\n\nexport const placeholderValidator = z.string().max(100);\nexport const minMaxValidator = z.number().int().min(0).max(25);\n\nexport const optionsValidator = z.object({}).array().nonempty();\n\nexport function validateRequiredSelectMenuParameters(options: SelectMenuOption[], customId?: string) {\n\tcustomIdValidator.parse(customId);\n\toptionsValidator.parse(options);\n}\n\nexport const labelValueValidator = z.string().min(1).max(100);\nexport const defaultValidator = z.boolean();\n\nexport function validateRequiredSelectMenuOptionParameters(label?: string, value?: string) {\n\tlabelValueValidator.parse(label);\n\tlabelValueValidator.parse(value);\n}\n\nexport const urlValidator = z.string().url();\n\nexport function validateRequiredButtonParameters(\n\tstyle: ButtonStyle,\n\tlabel?: string,\n\temoji?: APIMessageComponentEmoji,\n\tcustomId?: string,\n\turl?: string,\n) {\n\tif (url && customId) {\n\t\tthrow new RangeError('URL and custom id are mutually exclusive');\n\t}\n\n\tif (!label && !emoji) {\n\t\tthrow new RangeError('Buttons must have a label and/or an emoji');\n\t}\n\n\tif (style === ButtonStyle.Link) {\n\t\tif (!url) {\n\t\t\tthrow new RangeError('Link buttons must have a url');\n\t\t}\n\t} else if (url) {\n\t\tthrow new RangeError('Non-link buttons cannot have a url');\n\t}\n}\n","import { APIActionRowComponent, ComponentType } from 'discord-api-types/v9';\nimport type { ButtonComponent, SelectMenuComponent } from '..';\nimport type { Component } from './Component';\nimport { createComponent } from './Components';\n\nexport type ActionRowComponent = ButtonComponent | SelectMenuComponent;\n\n// TODO: Add valid form component types\n\n/**\n * Represents an action row component\n */\nexport class ActionRow implements Component {\n\tpublic readonly components: T[] = [];\n\tpublic readonly type = ComponentType.ActionRow;\n\n\tpublic constructor(data?: APIActionRowComponent) {\n\t\tthis.components = (data?.components.map(createComponent) ?? []) as T[];\n\t}\n\n\t/**\n\t * Adds components to this action row.\n\t * @param components The components to add to this action row.\n\t * @returns\n\t */\n\tpublic addComponents(...components: T[]) {\n\t\tthis.components.push(...components);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the components in this action row\n\t * @param components The components to set this row to\n\t */\n\tpublic setComponents(components: T[]) {\n\t\tReflect.set(this, 'components', [...components]);\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIActionRowComponent {\n\t\treturn {\n\t\t\t...this,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t};\n\t}\n}\n","import { APIMessageComponent, ComponentType } from 'discord-api-types/v9';\nimport { ActionRow, ButtonComponent, Component, SelectMenuComponent } from '../index';\nimport type { ActionRowComponent } from './ActionRow';\n\nexport interface MappedComponentTypes {\n\t[ComponentType.ActionRow]: ActionRow;\n\t[ComponentType.Button]: ButtonComponent;\n\t[ComponentType.SelectMenu]: SelectMenuComponent;\n}\n\n/**\n * Factory for creating components from API data\n * @param data The api data to transform to a component class\n */\nexport function createComponent(\n\tdata: APIMessageComponent & { type: T },\n): MappedComponentTypes[T];\nexport function createComponent(data: APIMessageComponent): Component {\n\tswitch (data.type) {\n\t\tcase ComponentType.ActionRow:\n\t\t\treturn new ActionRow(data);\n\t\tcase ComponentType.Button:\n\t\t\treturn new ButtonComponent(data);\n\t\tcase ComponentType.SelectMenu:\n\t\t\treturn new SelectMenuComponent(data);\n\t\tdefault:\n\t\t\t// @ts-expect-error\n\t\t\tthrow new Error(`Cannot serialize component type: ${data.type as number}`);\n\t}\n}\n","import { APIButtonComponent, APIMessageComponentEmoji, ButtonStyle, ComponentType } from 'discord-api-types/v9';\nimport {\n\tbuttonLabelValidator,\n\tbuttonStyleValidator,\n\tcustomIdValidator,\n\tdisabledValidator,\n\temojiValidator,\n\turlValidator,\n\tvalidateRequiredButtonParameters,\n} from './Assertions';\nimport type { Component } from './Component';\n\nexport class ButtonComponent implements Component {\n\tpublic readonly type = ComponentType.Button as const;\n\tpublic readonly style!: ButtonStyle;\n\tpublic readonly label?: string;\n\tpublic readonly emoji?: APIMessageComponentEmoji;\n\tpublic readonly disabled?: boolean;\n\tpublic readonly custom_id!: string;\n\tpublic readonly url!: string;\n\n\tpublic constructor(data?: APIButtonComponent) {\n\t\t/* eslint-disable @typescript-eslint/non-nullable-type-assertion-style */\n\t\tthis.style = data?.style as ButtonStyle;\n\t\tthis.label = data?.label;\n\t\tthis.emoji = data?.emoji;\n\t\tthis.disabled = data?.disabled;\n\n\t\t// This if/else makes typescript happy\n\t\tif (data?.style === ButtonStyle.Link) {\n\t\t\tthis.url = data.url;\n\t\t} else {\n\t\t\tthis.custom_id = data?.custom_id as string;\n\t\t}\n\n\t\t/* eslint-enable @typescript-eslint/non-nullable-type-assertion-style */\n\t}\n\n\t/**\n\t * Sets the style of this button\n\t * @param style The style of the button\n\t */\n\tpublic setStyle(style: ButtonStyle) {\n\t\tbuttonStyleValidator.parse(style);\n\t\tReflect.set(this, 'style', style);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL for this button\n\t * @param url The URL to open when this button is clicked\n\t */\n\tpublic setURL(url: string) {\n\t\turlValidator.parse(url);\n\t\tReflect.set(this, 'url', url);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom Id for this button\n\t * @param customId The custom ID to use for this button\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tcustomIdValidator.parse(customId);\n\t\tReflect.set(this, 'custom_id', customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display on this button\n\t * @param emoji The emoji to display on this button\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\temojiValidator.parse(emoji);\n\t\tReflect.set(this, 'emoji', emoji);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this button is disable or not\n\t * @param disabled Whether or not to disable this button or not\n\t */\n\tpublic setDisabled(disabled: boolean) {\n\t\tdisabledValidator.parse(disabled);\n\t\tReflect.set(this, 'disabled', disabled);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this button\n\t * @param label The label to display on this button\n\t */\n\tpublic setLabel(label: string) {\n\t\tbuttonLabelValidator.parse(label);\n\t\tReflect.set(this, 'label', label);\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIButtonComponent {\n\t\tvalidateRequiredButtonParameters(this.style, this.label, this.emoji, this.custom_id, this.url);\n\t\treturn {\n\t\t\t...this,\n\t\t};\n\t}\n}\n","import { APISelectMenuComponent, ComponentType } from 'discord-api-types/v9';\nimport {\n\tcustomIdValidator,\n\tdisabledValidator,\n\tminMaxValidator,\n\tplaceholderValidator,\n\tvalidateRequiredSelectMenuParameters,\n} from '../Assertions';\nimport type { Component } from '../Component';\nimport { SelectMenuOption } from './SelectMenuOption';\n\n/**\n * Represents a select menu component\n */\nexport class SelectMenuComponent implements Component {\n\tpublic readonly type = ComponentType.SelectMenu as const;\n\tpublic readonly options: SelectMenuOption[];\n\tpublic readonly placeholder?: string;\n\tpublic readonly min_values?: number;\n\tpublic readonly max_values?: number;\n\tpublic readonly custom_id!: string;\n\tpublic readonly disabled?: boolean;\n\n\tpublic constructor(data?: APISelectMenuComponent) {\n\t\tthis.options = data?.options.map((option) => new SelectMenuOption(option)) ?? [];\n\t\tthis.placeholder = data?.placeholder;\n\t\tthis.min_values = data?.min_values;\n\t\tthis.max_values = data?.max_values;\n\t\t/* eslint-disable @typescript-eslint/non-nullable-type-assertion-style */\n\t\tthis.custom_id = data?.custom_id as string;\n\t\t/* eslint-enable @typescript-eslint/non-nullable-type-assertion-style */\n\t\tthis.disabled = data?.disabled;\n\t}\n\n\t/**\n\t * Sets the placeholder for this select menu\n\t * @param placeholder The placeholder to use for this select menu\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tplaceholderValidator.parse(placeholder);\n\t\tReflect.set(this, 'placeholder', placeholder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets thes minimum values that must be selected in the select menu\n\t * @param minValues The minimum values that must be selected\n\t */\n\tpublic setMinValues(minValues: number) {\n\t\tminMaxValidator.parse(minValues);\n\t\tReflect.set(this, 'min_values', minValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets thes maximum values that must be selected in the select menu\n\t * @param minValues The maximum values that must be selected\n\t */\n\tpublic setMaxValues(maxValues: number) {\n\t\tminMaxValidator.parse(maxValues);\n\t\tReflect.set(this, 'max_values', maxValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom Id for this select menu\n\t * @param customId The custom ID to use for this select menu\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tcustomIdValidator.parse(customId);\n\t\tReflect.set(this, 'custom_id', customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether or not this select menu is disabled\n\t * @param disabled Whether or not this select menu is disabled\n\t */\n\tpublic setDisabled(disabled: boolean) {\n\t\tdisabledValidator.parse(disabled);\n\t\tReflect.set(this, 'disabled', disabled);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds options to this select menu\n\t * @param options The options to add to this select menu\n\t * @returns\n\t */\n\tpublic addOptions(...options: SelectMenuOption[]) {\n\t\tthis.options.push(...options);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the options on this select menu\n\t * @param options The options to set on this select menu\n\t */\n\tpublic setOptions(options: SelectMenuOption[]) {\n\t\tReflect.set(this, 'options', [...options]);\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APISelectMenuComponent {\n\t\tvalidateRequiredSelectMenuParameters(this.options, this.custom_id);\n\t\treturn {\n\t\t\t...this,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n","import type { APIMessageComponentEmoji, APISelectMenuOption } from 'discord-api-types/v9';\nimport {\n\tdefaultValidator,\n\temojiValidator,\n\tlabelValueValidator,\n\tvalidateRequiredSelectMenuOptionParameters,\n} from '../Assertions';\n\n/**\n * Represents an option within a select menu component\n */\nexport class SelectMenuOption {\n\tpublic readonly label!: string;\n\tpublic readonly value!: string;\n\tpublic readonly description?: string;\n\tpublic readonly emoji?: APIMessageComponentEmoji;\n\tpublic readonly default?: boolean;\n\n\tpublic constructor(data?: APISelectMenuOption) {\n\t\t/* eslint-disable @typescript-eslint/non-nullable-type-assertion-style */\n\t\tthis.label = data?.label as string;\n\t\tthis.value = data?.value as string;\n\t\t/* eslint-enable @typescript-eslint/non-nullable-type-assertion-style */\n\t\tthis.description = data?.description;\n\t\tthis.emoji = data?.emoji;\n\t\tthis.default = data?.default;\n\t}\n\n\t/**\n\t * Sets the label of this option\n\t * @param label The label to show on this option\n\t */\n\tpublic setLabel(label: string) {\n\t\tReflect.set(this, 'label', label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value of this option\n\t * @param value The value of this option\n\t */\n\tpublic setValue(value: string) {\n\t\tReflect.set(this, 'value', value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this option.\n\t * @param description The description of this option\n\t */\n\tpublic setDescription(description: string) {\n\t\tlabelValueValidator.parse(description);\n\t\tReflect.set(this, 'description', description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this option is selected by default\n\t * @param isDefault Whether or not this option is selected by default\n\t */\n\tpublic setDefault(isDefault: boolean) {\n\t\tdefaultValidator.parse(isDefault);\n\t\tReflect.set(this, 'default', isDefault);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display on this button\n\t * @param emoji The emoji to display on this button\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\temojiValidator.parse(emoji);\n\t\tReflect.set(this, 'emoji', emoji);\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APISelectMenuOption {\n\t\tvalidateRequiredSelectMenuOptionParameters(this.label, this.value);\n\t\treturn {\n\t\t\t...this,\n\t\t};\n\t}\n}\n","import is from '@sindresorhus/is';\nimport type { APIApplicationCommandOptionChoice } from 'discord-api-types/v9';\nimport { z } from 'zod';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder';\nimport type { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands';\n\nconst namePredicate = z\n\t.string()\n\t.min(1)\n\t.max(32)\n\t.regex(/^[\\P{Lu}\\p{N}_-]+$/u);\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nconst descriptionPredicate = z.string().min(1).max(100);\n\nexport function validateDescription(description: unknown): asserts description is string {\n\tdescriptionPredicate.parse(description);\n}\n\nconst maxArrayLengthPredicate = z.unknown().array().max(25);\n\nexport function validateMaxOptionsLength(options: unknown): asserts options is ToAPIApplicationCommandOptions[] {\n\tmaxArrayLengthPredicate.parse(options);\n}\n\nexport function validateRequiredParameters(\n\tname: string,\n\tdescription: string,\n\toptions: ToAPIApplicationCommandOptions[],\n) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert description conditions\n\tvalidateDescription(description);\n\n\t// Assert options conditions\n\tvalidateMaxOptionsLength(options);\n}\n\nconst booleanPredicate = z.boolean();\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateRequired(required: unknown): asserts required is boolean {\n\tbooleanPredicate.parse(required);\n}\n\nexport function validateMaxChoicesLength(choices: APIApplicationCommandOptionChoice[]) {\n\tmaxArrayLengthPredicate.parse(choices);\n}\n\nexport function assertReturnOfBuilder<\n\tT extends ApplicationCommandOptionBase | SlashCommandSubcommandBuilder | SlashCommandSubcommandGroupBuilder,\n>(input: unknown, ExpectedInstanceOf: new () => T): asserts input is T {\n\tconst instanceName = ExpectedInstanceOf.name;\n\n\tif (is.nullOrUndefined(input)) {\n\t\tthrow new TypeError(\n\t\t\t`Expected to receive a ${instanceName} builder, got ${input === null ? 'null' : 'undefined'} instead.`,\n\t\t);\n\t}\n\n\tif (is.primitive(input)) {\n\t\tthrow new TypeError(`Expected to receive a ${instanceName} builder, got a primitive (${typeof input}) instead.`);\n\t}\n\n\tif (!(input instanceof ExpectedInstanceOf)) {\n\t\tconst casted = input as Record;\n\n\t\tconst constructorName = is.function_(input) ? input.name : casted.constructor.name;\n\t\tconst stringTag = Reflect.get(casted, Symbol.toStringTag) as string | undefined;\n\n\t\tconst fullResultName = stringTag ? `${constructorName} [${stringTag}]` : constructorName;\n\n\t\tthrow new TypeError(`Expected to receive a ${instanceName} builder, got ${fullResultName} instead.`);\n\t}\n}\n","import type { APIApplicationCommandOption, RESTPostAPIApplicationCommandsJSONBody } from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport {\n\tassertReturnOfBuilder,\n\tvalidateDefaultPermission,\n\tvalidateMaxOptionsLength,\n\tvalidateRequiredParameters,\n} from './Assertions';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription';\nimport { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands';\n\n@mix(SharedSlashCommandOptions, SharedNameAndDescription)\nexport class SlashCommandBuilder {\n\t/**\n\t * The name of this slash command\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this slash command\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The options of this slash command\n\t */\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * Whether the command is enabled by default when the app is added to a guild\n\t *\n\t * @default true\n\t */\n\tpublic readonly defaultPermission: boolean | undefined = undefined;\n\n\t/**\n\t * Returns the final data that should be sent to Discord.\n\t *\n\t * **Note:** Calling this function will validate required properties based on their conditions.\n\t */\n\tpublic toJSON(): RESTPostAPIApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tdescription: this.description,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t\tdefault_permission: this.defaultPermission,\n\t\t};\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * **Note**: If set to `false`, you will have to later `PUT` the permissions for this command.\n\t *\n\t * @param value Whether or not to enable this command by default\n\t *\n\t * @see https://discord.com/developers/docs/interactions/application-commands#permissions\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'defaultPermission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a new subcommand group to this command\n\t *\n\t * @param input A function that returns a subcommand group builder, or an already built builder\n\t */\n\tpublic addSubcommandGroup(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandGroupBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandGroupBuilder) => SlashCommandSubcommandGroupBuilder),\n\t): SlashCommandSubcommandsOnlyBuilder {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandGroupBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a new subcommand to this command\n\t *\n\t * @param input A function that returns a subcommand builder, or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t): SlashCommandSubcommandsOnlyBuilder {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n}\n\nexport interface SlashCommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {}\n\nexport interface SlashCommandSubcommandsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tPick {}\n\nexport interface SlashCommandOptionsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions,\n\t\tPick {}\n\nexport interface ToAPIApplicationCommandOptions {\n\ttoJSON: () => APIApplicationCommandOption;\n}\n","import { APIApplicationCommandBooleanOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\n\nexport class SlashCommandBooleanOption extends ApplicationCommandOptionBase {\n\tpublic readonly type = ApplicationCommandOptionType.Boolean as const;\n\n\tpublic toJSON(): APIApplicationCommandBooleanOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { validateDescription, validateName } from '../Assertions';\n\nexport class SharedNameAndDescription {\n\tpublic readonly name!: string;\n\tpublic readonly description!: string;\n\n\t/**\n\t * Sets the name\n\t *\n\t * @param name The name\n\t */\n\tpublic setName(name: string): this {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description\n\t *\n\t * @param description The description\n\t */\n\tpublic setDescription(description: string) {\n\t\t// Assert the description matches the conditions\n\t\tvalidateDescription(description);\n\n\t\tReflect.set(this, 'description', description);\n\n\t\treturn this;\n\t}\n}\n","import type { APIApplicationCommandBasicOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { validateRequiredParameters, validateRequired } from '../Assertions';\nimport { SharedNameAndDescription } from './NameAndDescription';\n\nexport abstract class ApplicationCommandOptionBase extends SharedNameAndDescription {\n\tpublic abstract readonly type: ApplicationCommandOptionType;\n\n\tpublic readonly required: boolean = false;\n\n\t/**\n\t * Marks the option as required\n\t *\n\t * @param required If this option should be required\n\t */\n\tpublic setRequired(required: boolean) {\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(required);\n\n\t\tReflect.set(this, 'required', required);\n\n\t\treturn this;\n\t}\n\n\tpublic abstract toJSON(): APIApplicationCommandBasicOption;\n\n\tprotected runRequiredValidations() {\n\t\tvalidateRequiredParameters(this.name, this.description, []);\n\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(this.required);\n\t}\n}\n","import { APIApplicationCommandChannelOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\nimport { ApplicationCommandOptionChannelTypesMixin } from '../mixins/ApplicationCommandOptionChannelTypesMixin';\n\n@mix(ApplicationCommandOptionChannelTypesMixin)\nexport class SlashCommandChannelOption extends ApplicationCommandOptionBase {\n\tpublic override readonly type = ApplicationCommandOptionType.Channel as const;\n\n\tpublic toJSON(): APIApplicationCommandChannelOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandChannelOption extends ApplicationCommandOptionChannelTypesMixin {}\n","import { ChannelType } from 'discord-api-types/v9';\nimport { z, ZodLiteral } from 'zod';\n\n// Only allow valid channel types to be used. (This can't be dynamic because const enums are erased at runtime)\nconst allowedChannelTypes = [\n\tChannelType.GuildText,\n\tChannelType.GuildVoice,\n\tChannelType.GuildCategory,\n\tChannelType.GuildNews,\n\tChannelType.GuildStore,\n\tChannelType.GuildNewsThread,\n\tChannelType.GuildPublicThread,\n\tChannelType.GuildPrivateThread,\n\tChannelType.GuildStageVoice,\n] as const;\n\nexport type ApplicationCommandOptionAllowedChannelTypes = typeof allowedChannelTypes[number];\n\nconst channelTypePredicate = z.union(\n\tallowedChannelTypes.map((type) => z.literal(type)) as [\n\t\tZodLiteral,\n\t\tZodLiteral,\n\t\t...ZodLiteral[]\n\t],\n);\n\nexport class ApplicationCommandOptionChannelTypesMixin {\n\tpublic readonly channel_types?: ApplicationCommandOptionAllowedChannelTypes[];\n\n\t/**\n\t * Adds a channel type to this option\n\t *\n\t * @param channelType The type of channel to allow\n\t */\n\tpublic addChannelType(channelType: ApplicationCommandOptionAllowedChannelTypes) {\n\t\tif (this.channel_types === undefined) {\n\t\t\tReflect.set(this, 'channel_types', []);\n\t\t}\n\n\t\tchannelTypePredicate.parse(channelType);\n\t\tthis.channel_types!.push(channelType);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds channel types to this option\n\t *\n\t * @param channelTypes The channel types to add\n\t */\n\tpublic addChannelTypes(channelTypes: ApplicationCommandOptionAllowedChannelTypes[]) {\n\t\tchannelTypes.forEach((channelType) => this.addChannelType(channelType));\n\t\treturn this;\n\t}\n}\n","import { APIApplicationCommandIntegerOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport { z } from 'zod';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\nimport { ApplicationCommandOptionWithChoicesAndAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin';\n\nconst numberValidator = z.number().int().nonnegative();\n\n@mix(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)\nexport class SlashCommandIntegerOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\tpublic readonly type = ApplicationCommandOptionType.Integer as const;\n\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIApplicationCommandIntegerOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandIntegerOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesAndAutocompleteMixin {}\n","export abstract class ApplicationCommandNumericOptionMinMaxValueMixin {\n\tpublic readonly max_value?: number;\n\tpublic readonly min_value?: number;\n\n\t/**\n\t * Sets the maximum number value of this option\n\t * @param max The maximum value this option can be\n\t */\n\tpublic abstract setMaxValue(max: number): this;\n\n\t/**\n\t * Sets the minimum number value of this option\n\t * @param min The minimum value this option can be\n\t */\n\tpublic abstract setMinValue(min: number): this;\n}\n","import { APIApplicationCommandOptionChoice, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { z } from 'zod';\nimport { validateMaxChoicesLength } from '../Assertions';\n\nconst stringPredicate = z.string().min(1).max(100);\nconst numberPredicate = z.number().gt(-Infinity).lt(Infinity);\nconst choicesPredicate = z.tuple([stringPredicate, z.union([stringPredicate, numberPredicate])]).array();\nconst booleanPredicate = z.boolean();\n\nexport class ApplicationCommandOptionWithChoicesAndAutocompleteMixin {\n\tpublic readonly choices?: APIApplicationCommandOptionChoice[];\n\tpublic readonly autocomplete?: boolean;\n\n\t// Since this is present and this is a mixin, this is needed\n\tpublic readonly type!: ApplicationCommandOptionType;\n\n\t/**\n\t * Adds a choice for this option\n\t *\n\t * @param name The name of the choice\n\t * @param value The value of the choice\n\t */\n\tpublic addChoice(name: string, value: T): Omit {\n\t\tif (this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tif (this.choices === undefined) {\n\t\t\tReflect.set(this, 'choices', []);\n\t\t}\n\n\t\tvalidateMaxChoicesLength(this.choices!);\n\n\t\t// Validate name\n\t\tstringPredicate.parse(name);\n\n\t\t// Validate the value\n\t\tif (this.type === ApplicationCommandOptionType.String) {\n\t\t\tstringPredicate.parse(value);\n\t\t} else {\n\t\t\tnumberPredicate.parse(value);\n\t\t}\n\n\t\tthis.choices!.push({ name, value });\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds multiple choices for this option\n\t *\n\t * @param choices The choices to add\n\t */\n\tpublic addChoices(choices: [name: string, value: T][]): Omit {\n\t\tif (this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(choices);\n\n\t\tfor (const [label, value] of choices) this.addChoice(label, value);\n\t\treturn this;\n\t}\n\n\tpublic setChoices(\n\t\tchoices: Input,\n\t): Input extends []\n\t\t? this & Pick, 'setAutocomplete'>\n\t\t: Omit {\n\t\tif (choices.length > 0 && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(choices);\n\n\t\tReflect.set(this, 'choices', []);\n\t\tfor (const [label, value] of choices) this.addChoice(label, value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Marks the option as autocompletable\n\t * @param autocomplete If this option should be autocompletable\n\t */\n\tpublic setAutocomplete(\n\t\tautocomplete: U,\n\t): U extends true\n\t\t? Omit\n\t\t: this & Pick, 'addChoice' | 'addChoices'> {\n\t\t// Assert that you actually passed a boolean\n\t\tbooleanPredicate.parse(autocomplete);\n\n\t\tif (autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tReflect.set(this, 'autocomplete', autocomplete);\n\n\t\treturn this;\n\t}\n}\n","import { APIApplicationCommandMentionableOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\n\nexport class SlashCommandMentionableOption extends ApplicationCommandOptionBase {\n\tpublic readonly type = ApplicationCommandOptionType.Mentionable as const;\n\n\tpublic toJSON(): APIApplicationCommandMentionableOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { APIApplicationCommandNumberOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport { z } from 'zod';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\nimport { ApplicationCommandOptionWithChoicesAndAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin';\n\nconst numberValidator = z.number().nonnegative();\n\n@mix(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)\nexport class SlashCommandNumberOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\tpublic readonly type = ApplicationCommandOptionType.Number as const;\n\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIApplicationCommandNumberOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandNumberOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesAndAutocompleteMixin {}\n","import { APIApplicationCommandRoleOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\n\nexport class SlashCommandRoleOption extends ApplicationCommandOptionBase {\n\tpublic override readonly type = ApplicationCommandOptionType.Role as const;\n\n\tpublic toJSON(): APIApplicationCommandRoleOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { APIApplicationCommandStringOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\nimport { ApplicationCommandOptionWithChoicesAndAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin';\n\n@mix(ApplicationCommandOptionWithChoicesAndAutocompleteMixin)\nexport class SlashCommandStringOption extends ApplicationCommandOptionBase {\n\tpublic readonly type = ApplicationCommandOptionType.String as const;\n\n\tpublic toJSON(): APIApplicationCommandStringOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandStringOption extends ApplicationCommandOptionWithChoicesAndAutocompleteMixin {}\n","import { APIApplicationCommandUserOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\n\nexport class SlashCommandUserOption extends ApplicationCommandOptionBase {\n\tpublic readonly type = ApplicationCommandOptionType.User as const;\n\n\tpublic toJSON(): APIApplicationCommandUserOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { assertReturnOfBuilder, validateMaxOptionsLength } from '../Assertions';\nimport type { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase';\nimport { SlashCommandBooleanOption } from '../options/boolean';\nimport { SlashCommandChannelOption } from '../options/channel';\nimport { SlashCommandIntegerOption } from '../options/integer';\nimport { SlashCommandMentionableOption } from '../options/mentionable';\nimport { SlashCommandNumberOption } from '../options/number';\nimport { SlashCommandRoleOption } from '../options/role';\nimport { SlashCommandStringOption } from '../options/string';\nimport { SlashCommandUserOption } from '../options/user';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';\n\nexport class SharedSlashCommandOptions {\n\tpublic readonly options!: ToAPIApplicationCommandOptions[];\n\n\t/**\n\t * Adds a boolean option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addBooleanOption(\n\t\tinput: SlashCommandBooleanOption | ((builder: SlashCommandBooleanOption) => SlashCommandBooleanOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandBooleanOption);\n\t}\n\n\t/**\n\t * Adds a user option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandUserOption);\n\t}\n\n\t/**\n\t * Adds a channel option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addChannelOption(\n\t\tinput: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandChannelOption);\n\t}\n\n\t/**\n\t * Adds a role option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandRoleOption);\n\t}\n\n\t/**\n\t * Adds a mentionable option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addMentionableOption(\n\t\tinput: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandMentionableOption);\n\t}\n\n\t/**\n\t * Adds a string option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addStringOption(\n\t\tinput:\n\t\t\t| SlashCommandStringOption\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| ((\n\t\t\t\t\tbuilder: SlashCommandStringOption,\n\t\t\t ) =>\n\t\t\t\t\t| SlashCommandStringOption\n\t\t\t\t\t| Omit\n\t\t\t\t\t| Omit),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandStringOption);\n\t}\n\n\t/**\n\t * Adds an integer option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addIntegerOption(\n\t\tinput:\n\t\t\t| SlashCommandIntegerOption\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| ((\n\t\t\t\t\tbuilder: SlashCommandIntegerOption,\n\t\t\t ) =>\n\t\t\t\t\t| SlashCommandIntegerOption\n\t\t\t\t\t| Omit\n\t\t\t\t\t| Omit),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandIntegerOption);\n\t}\n\n\t/**\n\t * Adds a number option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addNumberOption(\n\t\tinput:\n\t\t\t| SlashCommandNumberOption\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| ((\n\t\t\t\t\tbuilder: SlashCommandNumberOption,\n\t\t\t ) =>\n\t\t\t\t\t| SlashCommandNumberOption\n\t\t\t\t\t| Omit\n\t\t\t\t\t| Omit),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandNumberOption);\n\t}\n\n\tprivate _sharedAddOptionMethod(\n\t\tinput:\n\t\t\t| T\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| ((builder: T) => T | Omit | Omit),\n\t\tInstance: new () => T,\n\t): ShouldOmitSubcommandFunctions extends true ? Omit : this {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new Instance()) : input;\n\n\t\tassertReturnOfBuilder(result, Instance);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n}\n","import {\n\tAPIApplicationCommandSubcommandGroupOption,\n\tAPIApplicationCommandSubcommandOption,\n\tApplicationCommandOptionType,\n} from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport { assertReturnOfBuilder, validateMaxOptionsLength, validateRequiredParameters } from './Assertions';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder';\n\n/**\n * Represents a folder for subcommands\n *\n * For more information, go to https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups\n */\n@mix(SharedNameAndDescription)\nexport class SlashCommandSubcommandGroupBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand group\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand group\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The subcommands part of this subcommand group\n\t */\n\tpublic readonly options: SlashCommandSubcommandBuilder[] = [];\n\n\t/**\n\t * Adds a new subcommand to this group\n\t *\n\t * @param input A function that returns a subcommand builder, or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t) {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIApplicationCommandSubcommandGroupOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.SubcommandGroup,\n\t\t\tname: this.name,\n\t\t\tdescription: this.description,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandGroupBuilder extends SharedNameAndDescription {}\n\n/**\n * Represents a subcommand\n *\n * For more information, go to https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups\n */\n@mix(SharedNameAndDescription, SharedSlashCommandOptions)\nexport class SlashCommandSubcommandBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The options of this subcommand\n\t */\n\tpublic readonly options: ApplicationCommandOptionBase[] = [];\n\n\tpublic toJSON(): APIApplicationCommandSubcommandOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.Subcommand,\n\t\t\tname: this.name,\n\t\t\tdescription: this.description,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {}\n","import { z } from 'zod';\nimport { ApplicationCommandType } from 'discord-api-types/v9';\nimport type { ContextMenuCommandType } from './ContextMenuCommandBuilder';\n\nconst namePredicate = z\n\t.string()\n\t.min(1)\n\t.max(32)\n\t.regex(/^( *[\\p{L}\\p{N}_-]+ *)+$/u);\n\nconst typePredicate = z.union([z.literal(ApplicationCommandType.User), z.literal(ApplicationCommandType.Message)]);\n\nconst booleanPredicate = z.boolean();\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nexport function validateType(type: unknown): asserts type is ContextMenuCommandType {\n\ttypePredicate.parse(type);\n}\n\nexport function validateRequiredParameters(name: string, type: number) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert type is valid\n\tvalidateType(type);\n}\n","import { validateRequiredParameters, validateName, validateType, validateDefaultPermission } from './Assertions';\nimport type { ApplicationCommandType, RESTPostAPIApplicationCommandsJSONBody } from 'discord-api-types/v9';\n\nexport class ContextMenuCommandBuilder {\n\t/**\n\t * The name of this context menu command\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The type of this context menu command\n\t */\n\tpublic readonly type: ContextMenuCommandType = undefined!;\n\n\t/**\n\t * Whether the command is enabled by default when the app is added to a guild\n\t *\n\t * @default true\n\t */\n\tpublic readonly defaultPermission: boolean | undefined = undefined;\n\n\t/**\n\t * Sets the name\n\t *\n\t * @param name The name\n\t */\n\tpublic setName(name: string) {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the type\n\t *\n\t * @param type The type\n\t */\n\tpublic setType(type: ContextMenuCommandType) {\n\t\t// Assert the type is valid\n\t\tvalidateType(type);\n\n\t\tReflect.set(this, 'type', type);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * **Note**: If set to `false`, you will have to later `PUT` the permissions for this command.\n\t *\n\t * @param value Whether or not to enable this command by default\n\t *\n\t * @see https://discord.com/developers/docs/interactions/application-commands#permissions\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'defaultPermission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the final data that should be sent to Discord.\n\t *\n\t * **Note:** Calling this function will validate required properties based on their conditions.\n\t */\n\tpublic toJSON(): RESTPostAPIApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.type);\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\ttype: this.type,\n\t\t\tdefault_permission: this.defaultPermission,\n\t\t};\n\t}\n}\n\nexport type ContextMenuCommandType = ApplicationCommandType.User | ApplicationCommandType.Message;\n"],"mappings":"w9BAAA,69BCAA,4XACA,MAAkB,eAEL,EAAqB,IAAE,SAAS,IAAI,GAAG,IAAI,KAE3C,EAAsB,IAAE,SAAS,IAAI,GAAG,IAAI,MAE5C,EAAuB,IAAE,UAAU,WAEnC,GAAsB,IAAE,OAAO,CAC3C,KAAM,EACN,MAAO,EACP,OAAQ,IAGI,EAA4B,GAAoB,QAEhD,GAAuB,IAAE,SAAS,IAAI,IAE5C,WAA6B,EAAyB,EAA4B,CACxF,GAAqB,MAAM,EAAO,OAAS,GAGrC,GAAM,IAAsB,EAAmB,WAEzC,EAAe,IAAE,SAAS,MAAM,UAEhC,GAAiB,IAAE,SAAS,IAAI,GAAG,IAAI,UAAU,WAEjD,GAAuB,IAAE,SAAS,IAAI,GAAG,IAAI,MAAM,WAEnD,GAAsB,IAAE,SAAS,IAAI,GAAG,IAAI,MAAM,WAElD,GAAqB,IAAE,MAAM,CAAC,IAAE,SAAU,IAAE,SAAS,WAErD,GAAiB,EAAmB,WCI1C,WAAgC,CA6D/B,YAAY,EAAiB,GAAI,CAzDjC,iBAKA,gBAKA,sBAKA,cAKA,gBAKA,oBAKA,oBAKA,gBAKA,gBAKA,iBAKA,mBAKA,iBAGN,KAAK,MAAQ,EAAK,MAClB,KAAK,YAAc,EAAK,YACxB,KAAK,IAAM,EAAK,IAChB,KAAK,MAAQ,EAAK,MAClB,KAAK,UAAY,EAAK,UACtB,KAAK,MAAQ,EAAK,MAClB,KAAK,MAAQ,EAAK,MAClB,KAAK,OAAS,EAAK,OACnB,KAAK,SAAW,EAAK,SACrB,KAAK,OAAS,EAAK,OACnB,KAAK,OAAS,EAAK,QAAU,GAEzB,EAAK,WAAW,MAAK,UAAY,GAAI,MAAK,EAAK,WAAW,kBAMpD,SAAiB,CAC3B,MACE,MAAK,OAAO,QAAU,GACtB,MAAK,aAAa,QAAU,GAC7B,KAAK,OAAO,OAAO,CAAC,EAAM,IAAS,EAAO,EAAK,KAAK,OAAS,EAAK,MAAM,OAAQ,GAC/E,MAAK,QAAQ,KAAK,QAAU,GAC5B,MAAK,QAAQ,KAAK,QAAU,GASxB,SAAS,EAA4B,CAC3C,MAAO,MAAK,UAAU,GAQhB,aAAa,EAA+B,CAElD,SAA0B,MAAM,GAGhC,EAAoB,KAAK,OAAQ,EAAO,QAExC,KAAK,OAAO,KAAK,GAAG,EAAM,gBAAgB,GAAG,IACtC,KAUD,aAAa,EAAe,KAAwB,EAA+B,CAEzF,SAA0B,MAAM,GAGhC,EAAoB,KAAK,OAAQ,EAAO,OAAS,GAEjD,KAAK,OAAO,OAAO,EAAO,EAAa,GAAG,EAAM,gBAAgB,GAAG,IAC5D,KAQD,UAAU,EAAqC,CACrD,GAAI,IAAY,KACf,YAAK,OAAS,OACP,KAGR,GAAM,CAAE,OAAM,UAAS,OAAQ,EAE/B,UAAoB,MAAM,GAC1B,EAAa,MAAM,GACnB,EAAa,MAAM,GAEnB,KAAK,OAAS,CAAE,OAAM,MAAK,SAAU,GAC9B,KAQD,SAAS,EAA4B,CAE3C,UAAe,MAAM,GAErB,KAAK,MAAQ,GAAS,OACf,KAQD,eAAe,EAAkC,CAEvD,UAAqB,MAAM,GAE3B,KAAK,YAAc,GAAe,OAC3B,KAQD,UAAU,EAAqC,CACrD,GAAI,IAAY,KACf,YAAK,OAAS,OACP,KAGR,GAAM,CAAE,OAAM,WAAY,EAE1B,UAAoB,MAAM,GAC1B,EAAa,MAAM,GAEnB,KAAK,OAAS,CAAE,OAAM,SAAU,GACzB,KAQD,SAAS,EAA0B,CAEzC,SAAa,MAAM,GAEnB,KAAK,MAAQ,EAAM,CAAE,OAAQ,OACtB,KAQD,aAAa,EAA0B,CAE7C,SAAa,MAAM,GAEnB,KAAK,UAAY,EAAM,CAAE,OAAQ,OAC1B,KAQD,aAAa,EAAkC,KAAK,MAAa,CAEvE,UAAmB,MAAM,GAEzB,KAAK,UAAY,EAAY,GAAI,MAAK,GAAW,cAAgB,OAC1D,KAQD,SAAS,EAA4B,CAE3C,UAAe,MAAM,GAErB,KAAK,MAAQ,GAAS,OACf,KAQD,OAAO,EAA0B,CAEvC,SAAa,MAAM,GAEnB,KAAK,IAAM,GAAO,OACX,KAMD,QAAmB,CACzB,MAAO,IAAK,YAQC,oBAAmB,EAA0C,CAC1E,MAAO,GAAO,KAAK,KAAU,IAAI,AAAC,GACjC,GAAmB,MAAM,EAAM,MAC/B,EAAoB,MAAM,EAAM,OAChC,EAAqB,MAAM,EAAM,QAE1B,CAAE,KAAM,EAAM,KAAM,MAAO,EAAM,MAAO,OAAQ,EAAM,QAAU,YCjTnE,YAAmB,EAAkB,EAA0B,CACrE,MAAO,OAAO,IAAY,YAAc;AAAA,EAAW,UAAmB,SAAS;AAAA,EAAa,UAQtF,YAAsC,EAAwB,CACpE,MAAO,KAAK,MAQN,YAAkC,EAAsB,CAC9D,MAAO,IAAI,KAQL,YAAgC,EAAwB,CAC9D,MAAO,KAAK,MAQN,YAAsC,EAAwB,CACpE,MAAO,KAAK,MAQN,YAAyC,EAAwB,CACvE,MAAO,KAAK,MAQN,YAAiC,EAAsB,CAC7D,MAAO,KAAK,IAQN,YAAsC,EAAwB,CACpE,MAAO,OAAO,IAgBR,YAAuB,EAAmB,CAEhD,MAAO,IAAI,KA4CL,YAAmB,EAAiB,EAAmB,EAAgB,CAE7E,MAAO,GAAQ,IAAI,MAAY,MAAQ,MAAY,IAAI,MAAY,KAQ7D,YAAmC,EAAwB,CACjE,MAAO,KAAK,MAQN,YAA0C,EAAsB,CACtE,MAAO,KAAK,KAQN,YAAoD,EAAyB,CACnF,MAAO,MAAM,KAQP,YAA6C,EAAyB,CAC5E,MAAO,KAAK,KAQN,YAA0C,EAAuB,CACvE,MAAO,MAAM,KAwBP,YAA0C,EAAY,EAAW,GAAmC,CAC1G,MAAO,IAAI,EAAW,IAAM,QAAQ,KAgC9B,YAAc,EAA+B,EAAuC,CAC1F,MAAI,OAAO,IAAkB,UAC5B,GAAgB,KAAK,MAAO,IAAe,WAAa,KAAK,OAAS,MAGhE,MAAO,IAAU,SAAW,MAAM,KAAiB,KAAW,MAAM,KAMrE,GAAM,IAAkB,CAI9B,UAAW,IAKX,SAAU,IAKV,UAAW,IAKX,SAAU,IAKV,cAAe,IAKf,aAAc,IAKd,aAAc,KAWH,GAAL,CAAK,GAIX,SAAQ,0BAKR,YAAY,6DAKZ,SAAS,kDAdE,YC/SZ,qaAAA,MAAsD,gCACtD,EAAkB,eAGL,EAAoB,IAAE,SAAS,IAAI,GAAG,IAAI,KAE1C,EAAiB,IAC5B,OAAO,CACP,GAAI,IAAE,SACN,KAAM,IAAE,SACR,SAAU,IAAE,YAEZ,UACA,SAEW,EAAoB,IAAE,UAEtB,GAAuB,IAAE,SAAS,WAAW,IAAI,IAEjD,GAAuB,IAAE,SAAS,MAAM,IAAI,cAAY,SAAS,IAAI,cAAY,MAEjF,GAAuB,IAAE,SAAS,IAAI,KACtC,EAAkB,IAAE,SAAS,MAAM,IAAI,GAAG,IAAI,IAE9C,GAAmB,IAAE,OAAO,IAAI,QAAQ,WAE9C,YAA8C,EAA6B,EAAmB,CACpG,EAAkB,MAAM,GACxB,GAAiB,MAAM,GAGjB,GAAM,GAAsB,IAAE,SAAS,IAAI,GAAG,IAAI,KAC5C,GAAmB,IAAE,UAE3B,YAAoD,EAAgB,EAAgB,CAC1F,EAAoB,MAAM,GAC1B,EAAoB,MAAM,GAGpB,GAAM,IAAe,IAAE,SAAS,MAEhC,YACN,EACA,EACA,EACA,EACA,EACC,CACD,GAAI,GAAO,EACV,KAAM,IAAI,YAAW,4CAGtB,GAAI,CAAC,GAAS,CAAC,EACd,KAAM,IAAI,YAAW,6CAGtB,GAAI,IAAU,cAAY,MACzB,GAAI,CAAC,EACJ,KAAM,IAAI,YAAW,wCAEZ,EACV,KAAM,IAAI,YAAW,sCC7DvB,OAAqD,gCCArD,MAAmD,gCAiB5C,YAAyB,EAAsC,CACrE,OAAQ,EAAK,UACP,iBAAc,UAClB,MAAO,IAAI,GAAU,OACjB,iBAAc,OAClB,MAAO,IAAI,GAAgB,OACvB,iBAAc,WAClB,MAAO,IAAI,GAAoB,WAG/B,KAAM,IAAI,OAAM,oCAAoC,EAAK,SDfrD,WAAmE,CAIlE,YAAY,EAA8B,CAHjC,oBAAkB,IAClB,cAAO,iBAAc,WAGpC,KAAK,WAAc,GAAM,WAAW,IAAI,KAAoB,GAQtD,iBAAiB,EAAiB,CACxC,YAAK,WAAW,KAAK,GAAG,GACjB,KAOD,cAAc,EAAiB,CACrC,eAAQ,IAAI,KAAM,aAAc,CAAC,GAAG,IAC7B,KAGD,QAAgC,CACtC,MAAO,IACH,KACH,WAAY,KAAK,WAAW,IAAI,AAAC,GAAc,EAAU,aE1C5D,MAAyF,gCAYlF,WAA2C,CAS1C,YAAY,EAA2B,CAR9B,cAAO,gBAAc,QACrB,gBACA,gBACA,gBACA,mBACA,oBACA,cAIf,KAAK,MAAQ,GAAM,MACnB,KAAK,MAAQ,GAAM,MACnB,KAAK,MAAQ,GAAM,MACnB,KAAK,SAAW,GAAM,SAGtB,AAAI,GAAM,QAAU,cAAY,KAC/B,KAAK,IAAM,EAAK,IAEhB,KAAK,UAAY,GAAM,UAUlB,SAAS,EAAoB,CACnC,UAAqB,MAAM,GAC3B,QAAQ,IAAI,KAAM,QAAS,GACpB,KAOD,OAAO,EAAa,CAC1B,UAAa,MAAM,GACnB,QAAQ,IAAI,KAAM,MAAO,GAClB,KAOD,YAAY,EAAkB,CACpC,SAAkB,MAAM,GACxB,QAAQ,IAAI,KAAM,YAAa,GACxB,KAOD,SAAS,EAAiC,CAChD,SAAe,MAAM,GACrB,QAAQ,IAAI,KAAM,QAAS,GACpB,KAOD,YAAY,EAAmB,CACrC,SAAkB,MAAM,GACxB,QAAQ,IAAI,KAAM,WAAY,GACvB,KAOD,SAAS,EAAe,CAC9B,UAAqB,MAAM,GAC3B,QAAQ,IAAI,KAAM,QAAS,GACpB,KAGD,QAA6B,CACnC,UAAiC,KAAK,MAAO,KAAK,MAAO,KAAK,MAAO,KAAK,UAAW,KAAK,KACnF,IACH,QCrGN,OAAsD,gCCW/C,WAAuB,CAOtB,YAAY,EAA4B,CAN/B,gBACA,gBACA,sBACA,gBACA,kBAIf,KAAK,MAAQ,GAAM,MACnB,KAAK,MAAQ,GAAM,MAEnB,KAAK,YAAc,GAAM,YACzB,KAAK,MAAQ,GAAM,MACnB,KAAK,QAAU,GAAM,QAOf,SAAS,EAAe,CAC9B,eAAQ,IAAI,KAAM,QAAS,GACpB,KAOD,SAAS,EAAe,CAC9B,eAAQ,IAAI,KAAM,QAAS,GACpB,KAOD,eAAe,EAAqB,CAC1C,SAAoB,MAAM,GAC1B,QAAQ,IAAI,KAAM,cAAe,GAC1B,KAOD,WAAW,EAAoB,CACrC,UAAiB,MAAM,GACvB,QAAQ,IAAI,KAAM,UAAW,GACtB,KAOD,SAAS,EAAiC,CAChD,SAAe,MAAM,GACrB,QAAQ,IAAI,KAAM,QAAS,GACpB,KAGD,QAA8B,CACpC,UAA2C,KAAK,MAAO,KAAK,OACrD,IACH,QDjEC,WAA+C,CAS9C,YAAY,EAA+B,CARlC,cAAO,iBAAc,YACrB,kBACA,sBACA,qBACA,qBACA,oBACA,mBAGf,KAAK,QAAU,GAAM,QAAQ,IAAI,AAAC,GAAW,GAAI,GAAiB,KAAY,GAC9E,KAAK,YAAc,GAAM,YACzB,KAAK,WAAa,GAAM,WACxB,KAAK,WAAa,GAAM,WAExB,KAAK,UAAY,GAAM,UAEvB,KAAK,SAAW,GAAM,SAOhB,eAAe,EAAqB,CAC1C,UAAqB,MAAM,GAC3B,QAAQ,IAAI,KAAM,cAAe,GAC1B,KAOD,aAAa,EAAmB,CACtC,SAAgB,MAAM,GACtB,QAAQ,IAAI,KAAM,aAAc,GACzB,KAOD,aAAa,EAAmB,CACtC,SAAgB,MAAM,GACtB,QAAQ,IAAI,KAAM,aAAc,GACzB,KAOD,YAAY,EAAkB,CACpC,SAAkB,MAAM,GACxB,QAAQ,IAAI,KAAM,YAAa,GACxB,KAOD,YAAY,EAAmB,CACrC,SAAkB,MAAM,GACxB,QAAQ,IAAI,KAAM,WAAY,GACvB,KAQD,cAAc,EAA6B,CACjD,YAAK,QAAQ,KAAK,GAAG,GACd,KAOD,WAAW,EAA6B,CAC9C,eAAQ,IAAI,KAAM,UAAW,CAAC,GAAG,IAC1B,KAGD,QAAiC,CACvC,UAAqC,KAAK,QAAS,KAAK,WACjD,IACH,KACH,QAAS,KAAK,QAAQ,IAAI,AAAC,GAAW,EAAO,aE3GhD,oPAAA,MAAe,gCAEf,EAAkB,eAKZ,GAAgB,IACpB,SACA,IAAI,GACJ,IAAI,IACJ,MAAM,uBAED,WAAsB,EAAuC,CACnE,GAAc,MAAM,GAGrB,GAAM,IAAuB,IAAE,SAAS,IAAI,GAAG,IAAI,KAE5C,WAA6B,EAAqD,CACxF,GAAqB,MAAM,GAG5B,GAAM,IAA0B,IAAE,UAAU,QAAQ,IAAI,IAEjD,WAAkC,EAAuE,CAC/G,GAAwB,MAAM,GAGxB,WACN,EACA,EACA,EACC,CAED,EAAa,GAGb,EAAoB,GAGpB,EAAyB,GAG1B,GAAM,IAAmB,IAAE,UAEpB,YAAmC,EAA0C,CACnF,GAAiB,MAAM,GAGjB,YAA0B,EAAgD,CAChF,GAAiB,MAAM,GAGjB,YAAkC,EAA8C,CACtF,GAAwB,MAAM,GAGxB,WAEL,EAAgB,EAAqD,CACtE,GAAM,GAAe,EAAmB,KAExC,GAAI,UAAG,gBAAgB,GACtB,KAAM,IAAI,WACT,yBAAyB,kBAA6B,IAAU,KAAO,OAAS,wBAIlF,GAAI,UAAG,UAAU,GAChB,KAAM,IAAI,WAAU,yBAAyB,+BAA0C,MAAO,gBAG/F,GAAI,CAAE,aAAiB,IAAqB,CAC3C,GAAM,GAAS,EAET,EAAkB,UAAG,UAAU,GAAS,EAAM,KAAO,EAAO,YAAY,KACxE,EAAY,QAAQ,IAAI,EAAQ,OAAO,aAEvC,EAAiB,EAAY,GAAG,MAAoB,KAAe,EAEzE,KAAM,IAAI,WAAU,yBAAyB,kBAA6B,eChF5E,OAAoB,oBCDpB,OAAiF,gCCE1E,WAA+B,CAA/B,aAFP,CAGiB,eACA,sBAOT,QAAQ,EAAoB,CAElC,SAAa,GAEb,QAAQ,IAAI,KAAM,OAAQ,GAEnB,KAQD,eAAe,EAAqB,CAE1C,SAAoB,GAEpB,QAAQ,IAAI,KAAM,cAAe,GAE1B,OC3BF,mBAAoD,EAAyB,CAA7E,aAJP,CAIO,oBAGU,kBAAoB,IAO7B,YAAY,EAAmB,CAErC,UAAiB,GAEjB,QAAQ,IAAI,KAAM,WAAY,GAEvB,KAKE,wBAAyB,CAClC,EAA2B,KAAK,KAAM,KAAK,YAAa,IAGxD,GAAiB,KAAK,YF1BjB,oBAAwC,EAA6B,CAArE,aAHP,CAGO,oBACU,cAAO,gCAA6B,SAE7C,QAA6C,CACnD,YAAK,yBAEE,IAAK,QGTd,OAAiF,gCACjF,GAAoB,oBCDpB,MAA4B,gCAC5B,GAA8B,eAGxB,GAAsB,CAC3B,cAAY,UACZ,cAAY,WACZ,cAAY,cACZ,cAAY,UACZ,cAAY,WACZ,cAAY,gBACZ,cAAY,kBACZ,cAAY,mBACZ,cAAY,iBAKP,GAAuB,KAAE,MAC9B,GAAoB,IAAI,AAAC,GAAS,KAAE,QAAQ,KAOtC,QAAgD,CAAhD,aA1BP,CA2BiB,wBAOT,eAAe,EAA0D,CAC/E,MAAI,MAAK,gBAAkB,QAC1B,QAAQ,IAAI,KAAM,gBAAiB,IAGpC,GAAqB,MAAM,GAC3B,KAAK,cAAe,KAAK,GAElB,KAQD,gBAAgB,EAA6D,CACnF,SAAa,QAAQ,AAAC,GAAgB,KAAK,eAAe,IACnD,OD9CF,mBAAwC,EAA6B,CAArE,aANP,CAMO,oBACmB,cAAO,gCAA6B,SAEtD,QAA6C,CACnD,YAAK,yBAEE,IAAK,QANP,KADN,WAAI,KACE,GENP,OAAiF,gCACjF,GAAoB,oBACpB,GAAkB,eCFX,WAA+D,CAA/D,aAAP,CACiB,oBACA,sBCFjB,OAAgF,gCAChF,EAAkB,eAGlB,GAAM,IAAkB,IAAE,SAAS,IAAI,GAAG,IAAI,KACxC,GAAkB,IAAE,SAAS,GAAG,MAAW,GAAG,KAC9C,GAAmB,IAAE,MAAM,CAAC,GAAiB,IAAE,MAAM,CAAC,GAAiB,OAAoB,QAC3F,GAAmB,IAAE,UAEpB,OAAyF,CAAzF,aATP,CAUiB,kBACA,uBAGA,eAQT,UAAU,EAAc,EAAyC,CACvE,GAAI,KAAK,aACR,KAAM,IAAI,YAAW,kEAGtB,MAAI,MAAK,UAAY,QACpB,QAAQ,IAAI,KAAM,UAAW,IAG9B,GAAyB,KAAK,SAG9B,GAAgB,MAAM,GAGtB,AAAI,KAAK,OAAS,gCAA6B,OAC9C,GAAgB,MAAM,GAEtB,GAAgB,MAAM,GAGvB,KAAK,QAAS,KAAK,CAAE,OAAM,UAEpB,KAQD,WAAW,EAAoE,CACrF,GAAI,KAAK,aACR,KAAM,IAAI,YAAW,kEAGtB,GAAiB,MAAM,GAEvB,OAAW,CAAC,EAAO,IAAU,GAAS,KAAK,UAAU,EAAO,GAC5D,MAAO,MAGD,WACN,EAGgC,CAChC,GAAI,EAAQ,OAAS,GAAK,KAAK,aAC9B,KAAM,IAAI,YAAW,kEAGtB,GAAiB,MAAM,GAEvB,QAAQ,IAAI,KAAM,UAAW,IAC7B,OAAW,CAAC,EAAO,IAAU,GAAS,KAAK,UAAU,EAAO,GAE5D,MAAO,MAOD,gBACN,EAGsG,CAItG,GAFA,GAAiB,MAAM,GAEnB,GAAgB,MAAM,QAAQ,KAAK,UAAY,KAAK,QAAQ,OAAS,EACxE,KAAM,IAAI,YAAW,kEAGtB,eAAQ,IAAI,KAAM,eAAgB,GAE3B,OF5FT,GAAM,IAAkB,KAAE,SAAS,MAAM,cAGlC,eACE,EAET,CAHO,aAVP,CAUO,oBAIU,cAAO,gCAA6B,SAE7C,YAAY,EAAmB,CACrC,UAAgB,MAAM,GAEtB,QAAQ,IAAI,KAAM,YAAa,GAExB,KAGD,YAAY,EAAmB,CACrC,UAAgB,MAAM,GAEtB,QAAQ,IAAI,KAAM,YAAa,GAExB,KAGD,QAA6C,CAGnD,GAFA,KAAK,yBAED,KAAK,cAAgB,MAAM,QAAQ,KAAK,UAAY,KAAK,QAAQ,OAAS,EAC7E,KAAM,IAAI,YAAW,kEAGtB,MAAO,IAAK,QA7BP,KADN,WAAI,EAAiD,IAC/C,GGVP,OAAqF,gCAG9E,oBAA4C,EAA6B,CAAzE,aAHP,CAGO,oBACU,cAAO,gCAA6B,aAE7C,QAAiD,CACvD,YAAK,yBAEE,IAAK,QCTd,OAAgF,gCAChF,GAAoB,oBACpB,GAAkB,eAKlB,GAAM,IAAkB,KAAE,SAAS,cAG5B,eACE,EAET,CAHO,aAVP,CAUO,oBAIU,cAAO,gCAA6B,QAE7C,YAAY,EAAmB,CACrC,UAAgB,MAAM,GAEtB,QAAQ,IAAI,KAAM,YAAa,GAExB,KAGD,YAAY,EAAmB,CACrC,UAAgB,MAAM,GAEtB,QAAQ,IAAI,KAAM,YAAa,GAExB,KAGD,QAA4C,CAGlD,GAFA,KAAK,yBAED,KAAK,cAAgB,MAAM,QAAQ,KAAK,UAAY,KAAK,QAAQ,OAAS,EAC7E,KAAM,IAAI,YAAW,kEAGtB,MAAO,IAAK,QA7BP,KADN,WAAI,EAAiD,IAC/C,GCVP,OAA8E,gCAGvE,oBAAqC,EAA6B,CAAlE,aAHP,CAGO,oBACmB,cAAO,gCAA6B,MAEtD,QAA0C,CAChD,YAAK,yBAEE,IAAK,QCTd,OAAgF,gCAChF,GAAoB,oBAKb,mBAAuC,EAA6B,CAApE,aANP,CAMO,oBACU,cAAO,gCAA6B,QAE7C,QAA4C,CAGlD,GAFA,KAAK,yBAED,KAAK,cAAgB,MAAM,QAAQ,KAAK,UAAY,KAAK,QAAQ,OAAS,EAC7E,KAAM,IAAI,YAAW,kEAGtB,MAAO,IAAK,QAVP,KADN,WAAI,IACE,GCNP,OAA8E,gCAGvE,oBAAqC,EAA6B,CAAlE,aAHP,CAGO,oBACU,cAAO,gCAA6B,MAE7C,QAA0C,CAChD,YAAK,yBAEE,IAAK,QCGP,WAAsE,CAAtE,aAZP,CAaiB,kBAOT,iBACN,EACC,CACD,MAAO,MAAK,uBAAuB,EAAO,IAQpC,cAAc,EAA+F,CACnH,MAAO,MAAK,uBAAuB,EAAO,IAQpC,iBACN,EACC,CACD,MAAO,MAAK,uBAAuB,EAAO,GAQpC,cAAc,EAA+F,CACnH,MAAO,MAAK,uBAAuB,EAAO,IAQpC,qBACN,EACC,CACD,MAAO,MAAK,uBAAuB,EAAO,IAQpC,gBACN,EAUC,CACD,MAAO,MAAK,uBAAuB,EAAO,GAQpC,iBACN,EAUC,CACD,MAAO,MAAK,uBAAuB,EAAO,GAQpC,gBACN,EAUC,CACD,MAAO,MAAK,uBAAuB,EAAO,GAGnC,uBACP,EAKA,EACyG,CACzG,GAAM,CAAE,WAAY,KAGpB,EAAyB,GAGzB,GAAM,GAAS,MAAO,IAAU,WAAa,EAAM,GAAI,IAAc,EAErE,SAAsB,EAAQ,GAG9B,EAAQ,KAAK,GAEN,OCnJT,OAIO,gCACP,GAAoB,oBAab,WAAmF,CAAnF,aAlBP,CAsBiB,eAKA,sBAKA,iBAA2C,IAOpD,cACN,EAGC,CACD,GAAM,CAAE,WAAY,KAGpB,EAAyB,GAIzB,GAAM,GAAS,MAAO,IAAU,WAAa,EAAM,GAAI,IAAmC,EAG1F,SAAsB,EAAQ,GAG9B,EAAQ,KAAK,GAEN,KAGD,QAAqD,CAC3D,SAA2B,KAAK,KAAM,KAAK,YAAa,KAAK,SAEtD,CACN,KAAM,gCAA6B,gBACnC,KAAM,KAAK,KACX,YAAa,KAAK,YAClB,QAAS,KAAK,QAAQ,IAAI,AAAC,GAAW,EAAO,aAnDzC,KADN,WAAI,IACE,GAgEA,WAA8E,CAA9E,aAlFP,CAsFiB,eAKA,sBAKA,iBAA0C,IAEnD,QAAgD,CACtD,SAA2B,KAAK,KAAM,KAAK,YAAa,KAAK,SAEtD,CACN,KAAM,gCAA6B,WACnC,KAAM,KAAK,KACX,YAAa,KAAK,YAClB,QAAS,KAAK,QAAQ,IAAI,AAAC,GAAW,EAAO,aAvBzC,KADN,WAAI,EAA0B,IACxB,GfrEA,YAA0B,CAA1B,aAbP,CAiBiB,eAKA,sBAKA,iBAA4C,IAO5C,4BAOT,QAAiD,CACvD,SAA2B,KAAK,KAAM,KAAK,YAAa,KAAK,SAEtD,CACN,KAAM,KAAK,KACX,YAAa,KAAK,YAClB,QAAS,KAAK,QAAQ,IAAI,AAAC,GAAW,EAAO,UAC7C,mBAAoB,KAAK,mBAapB,qBAAqB,EAAgB,CAE3C,UAA0B,GAE1B,QAAQ,IAAI,KAAM,oBAAqB,GAEhC,KAQD,mBACN,EAGqC,CACrC,GAAM,CAAE,WAAY,KAGpB,EAAyB,GAGzB,GAAM,GAAS,MAAO,IAAU,WAAa,EAAM,GAAI,IAAwC,EAE/F,SAAsB,EAAQ,GAG9B,EAAQ,KAAK,GAEN,KAQD,cACN,EAGqC,CACrC,GAAM,CAAE,WAAY,KAGpB,EAAyB,GAGzB,GAAM,GAAS,MAAO,IAAU,WAAa,EAAM,GAAI,IAAmC,EAE1F,SAAsB,EAAQ,GAG9B,EAAQ,KAAK,GAEN,OA1GF,MADN,WAAI,EAA2B,IACzB,IgBbP,6HAAA,MAAkB,eAClB,GAAuC,gCAGjC,GAAgB,IACpB,SACA,IAAI,GACJ,IAAI,IACJ,MAAM,6BAEF,GAAgB,IAAE,MAAM,CAAC,IAAE,QAAQ,0BAAuB,MAAO,IAAE,QAAQ,0BAAuB,WAElG,GAAmB,IAAE,UAEpB,YAAmC,EAA0C,CACnF,GAAiB,MAAM,GAGjB,YAAsB,EAAuC,CACnE,GAAc,MAAM,GAGd,YAAsB,EAAuD,CACnF,GAAc,MAAM,GAGd,YAAoC,EAAc,EAAc,CAEtE,GAAa,GAGb,GAAa,GC5BP,YAAgC,CAAhC,aAHP,CAOiB,eAKA,eAOA,4BAOT,QAAQ,EAAc,CAE5B,UAAa,GAEb,QAAQ,IAAI,KAAM,OAAQ,GAEnB,KAQD,QAAQ,EAA8B,CAE5C,UAAa,GAEb,QAAQ,IAAI,KAAM,OAAQ,GAEnB,KAYD,qBAAqB,EAAgB,CAE3C,UAA0B,GAE1B,QAAQ,IAAI,KAAM,oBAAqB,GAEhC,KAQD,QAAiD,CACvD,UAA2B,KAAK,KAAM,KAAK,MACpC,CACN,KAAM,KAAK,KACX,KAAM,KAAK,KACX,mBAAoB,KAAK","names":[]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/index.mjs b/node_modules/@discordjs/builders/dist/index.mjs
new file mode 100644
index 0000000..18dae28
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.mjs
@@ -0,0 +1,4 @@
+var Q=Object.defineProperty;var ze=Object.getOwnPropertyDescriptor;var We=(t,e,i)=>e in t?Q(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i;var V=(t,e)=>{for(var i in e)Q(t,i,{get:e[i],enumerable:!0})};var l=(t,e,i,n)=>{for(var s=n>1?void 0:n?ze(e,i):e,y=t.length-1,P;y>=0;y--)(P=t[y])&&(s=(n?P(e,i,s):P(s))||s);return n&&s&&Q(e,i,s),s};var o=(t,e,i)=>(We(t,typeof e!="symbol"?e+"":e,i),i);var we={};V(we,{authorNamePredicate:()=>H,colorPredicate:()=>X,descriptionPredicate:()=>Y,embedFieldPredicate:()=>Re,embedFieldsArrayPredicate:()=>D,fieldInlinePredicate:()=>k,fieldLengthPredicate:()=>ve,fieldNamePredicate:()=>O,fieldValuePredicate:()=>L,footerTextPredicate:()=>ee,timestampPredicate:()=>te,titlePredicate:()=>oe,urlPredicate:()=>h,validateFieldLength:()=>U});import{z as d}from"zod";var O=d.string().min(1).max(256),L=d.string().min(1).max(1024),k=d.boolean().optional(),Re=d.object({name:O,value:L,inline:k}),D=Re.array(),ve=d.number().lte(25);function U(t,e){ve.parse(t.length+e)}var H=O.nullable(),h=d.string().url().nullish(),X=d.number().gte(0).lte(16777215).nullable(),Y=d.string().min(1).max(4096).nullable(),ee=d.string().min(1).max(2048).nullable(),te=d.union([d.number(),d.date()]).nullable(),oe=O.nullable();var J=class{constructor(e={}){o(this,"fields");o(this,"title");o(this,"description");o(this,"url");o(this,"color");o(this,"timestamp");o(this,"thumbnail");o(this,"image");o(this,"video");o(this,"author");o(this,"provider");o(this,"footer");this.title=e.title,this.description=e.description,this.url=e.url,this.color=e.color,this.thumbnail=e.thumbnail,this.image=e.image,this.video=e.video,this.author=e.author,this.provider=e.provider,this.footer=e.footer,this.fields=e.fields??[],e.timestamp&&(this.timestamp=new Date(e.timestamp).toISOString())}get length(){return(this.title?.length??0)+(this.description?.length??0)+this.fields.reduce((e,i)=>e+i.name.length+i.value.length,0)+(this.footer?.text.length??0)+(this.author?.name.length??0)}addField(e){return this.addFields(e)}addFields(...e){return D.parse(e),U(this.fields,e.length),this.fields.push(...J.normalizeFields(...e)),this}spliceFields(e,i,...n){return D.parse(n),U(this.fields,n.length-i),this.fields.splice(e,i,...J.normalizeFields(...n)),this}setAuthor(e){if(e===null)return this.author=void 0,this;let{name:i,iconURL:n,url:s}=e;return H.parse(i),h.parse(n),h.parse(s),this.author={name:i,url:s,icon_url:n},this}setColor(e){return X.parse(e),this.color=e??void 0,this}setDescription(e){return Y.parse(e),this.description=e??void 0,this}setFooter(e){if(e===null)return this.footer=void 0,this;let{text:i,iconURL:n}=e;return ee.parse(i),h.parse(n),this.footer={text:i,icon_url:n},this}setImage(e){return h.parse(e),this.image=e?{url:e}:void 0,this}setThumbnail(e){return h.parse(e),this.thumbnail=e?{url:e}:void 0,this}setTimestamp(e=Date.now()){return te.parse(e),this.timestamp=e?new Date(e).toISOString():void 0,this}setTitle(e){return oe.parse(e),this.title=e??void 0,this}setURL(e){return h.parse(e),this.url=e??void 0,this}toJSON(){return{...this}}static normalizeFields(...e){return e.flat(1/0).map(i=>(O.parse(i.name),L.parse(i.value),k.parse(i.inline),{name:i.name,value:i.value,inline:i.inline??void 0}))}};function Rt(t,e){return typeof e=="undefined"?`\`\`\`
+${t}\`\`\``:`\`\`\`${t}
+${e}\`\`\``}function vt(t){return`\`${t}\``}function wt(t){return`_${t}_`}function Bt(t){return`**${t}**`}function Nt(t){return`__${t}__`}function $t(t){return`~~${t}~~`}function Et(t){return`> ${t}`}function _t(t){return`>>> ${t}`}function Vt(t){return`<${t}>`}function Lt(t,e,i){return i?`[${t}](${e} "${i}")`:`[${t}](${e})`}function kt(t){return`||${t}||`}function Dt(t){return`<@${t}>`}function Ut(t){return`<@!${t}>`}function Jt(t){return`<#${t}>`}function jt(t){return`<@&${t}>`}function qt(t,e=!1){return`<${e?"a":""}:_:${t}>`}function Ft(t,e){return typeof t!="number"&&(t=Math.floor((t?.getTime()??Date.now())/1e3)),typeof e=="string"?``:``}var Gt={ShortTime:"t",LongTime:"T",ShortDate:"d",LongDate:"D",ShortDateTime:"f",LongDateTime:"F",RelativeTime:"R"},Ze=(n=>(n.Shrug="\xAF\\_(\u30C4)\\_/\xAF",n.Tableflip="(\u256F\xB0\u25A1\xB0\uFF09\u256F\uFE35 \u253B\u2501\u253B",n.Unflip="\u252C\u2500\u252C \u30CE( \u309C-\u309C\u30CE)",n))(Ze||{});var Ne={};V(Ne,{buttonLabelValidator:()=>ne,buttonStyleValidator:()=>re,customIdValidator:()=>S,defaultValidator:()=>pe,disabledValidator:()=>I,emojiValidator:()=>T,labelValueValidator:()=>M,minMaxValidator:()=>j,optionsValidator:()=>Be,placeholderValidator:()=>ae,urlValidator:()=>le,validateRequiredButtonParameters:()=>de,validateRequiredSelectMenuOptionParameters:()=>me,validateRequiredSelectMenuParameters:()=>se});import{ButtonStyle as ie}from"discord-api-types/v9";import{z as m}from"zod";var S=m.string().min(1).max(100),T=m.object({id:m.string(),name:m.string(),animated:m.boolean()}).partial().strict(),I=m.boolean(),ne=m.string().nonempty().max(80),re=m.number().int().min(ie.Primary).max(ie.Link),ae=m.string().max(100),j=m.number().int().min(0).max(25),Be=m.object({}).array().nonempty();function se(t,e){S.parse(e),Be.parse(t)}var M=m.string().min(1).max(100),pe=m.boolean();function me(t,e){M.parse(t),M.parse(e)}var le=m.string().url();function de(t,e,i,n,s){if(s&&n)throw new RangeError("URL and custom id are mutually exclusive");if(!e&&!i)throw new RangeError("Buttons must have a label and/or an emoji");if(t===ie.Link){if(!s)throw new RangeError("Link buttons must have a url")}else if(s)throw new RangeError("Non-link buttons cannot have a url")}import{ComponentType as Ke}from"discord-api-types/v9";import{ComponentType as ce}from"discord-api-types/v9";function $e(t){switch(t.type){case ce.ActionRow:return new ue(t);case ce.Button:return new he(t);case ce.SelectMenu:return new be(t);default:throw new Error(`Cannot serialize component type: ${t.type}`)}}var ue=class{constructor(e){o(this,"components",[]);o(this,"type",Ke.ActionRow);this.components=e?.components.map($e)??[]}addComponents(...e){return this.components.push(...e),this}setComponents(e){return Reflect.set(this,"components",[...e]),this}toJSON(){return{...this,components:this.components.map(e=>e.toJSON())}}};import{ButtonStyle as Qe,ComponentType as He}from"discord-api-types/v9";var he=class{constructor(e){o(this,"type",He.Button);o(this,"style");o(this,"label");o(this,"emoji");o(this,"disabled");o(this,"custom_id");o(this,"url");this.style=e?.style,this.label=e?.label,this.emoji=e?.emoji,this.disabled=e?.disabled,e?.style===Qe.Link?this.url=e.url:this.custom_id=e?.custom_id}setStyle(e){return re.parse(e),Reflect.set(this,"style",e),this}setURL(e){return le.parse(e),Reflect.set(this,"url",e),this}setCustomId(e){return S.parse(e),Reflect.set(this,"custom_id",e),this}setEmoji(e){return T.parse(e),Reflect.set(this,"emoji",e),this}setDisabled(e){return I.parse(e),Reflect.set(this,"disabled",e),this}setLabel(e){return ne.parse(e),Reflect.set(this,"label",e),this}toJSON(){return de(this.style,this.label,this.emoji,this.custom_id,this.url),{...this}}};import{ComponentType as Xe}from"discord-api-types/v9";var Ce=class{constructor(e){o(this,"label");o(this,"value");o(this,"description");o(this,"emoji");o(this,"default");this.label=e?.label,this.value=e?.value,this.description=e?.description,this.emoji=e?.emoji,this.default=e?.default}setLabel(e){return Reflect.set(this,"label",e),this}setValue(e){return Reflect.set(this,"value",e),this}setDescription(e){return M.parse(e),Reflect.set(this,"description",e),this}setDefault(e){return pe.parse(e),Reflect.set(this,"default",e),this}setEmoji(e){return T.parse(e),Reflect.set(this,"emoji",e),this}toJSON(){return me(this.label,this.value),{...this}}};var be=class{constructor(e){o(this,"type",Xe.SelectMenu);o(this,"options");o(this,"placeholder");o(this,"min_values");o(this,"max_values");o(this,"custom_id");o(this,"disabled");this.options=e?.options.map(i=>new Ce(i))??[],this.placeholder=e?.placeholder,this.min_values=e?.min_values,this.max_values=e?.max_values,this.custom_id=e?.custom_id,this.disabled=e?.disabled}setPlaceholder(e){return ae.parse(e),Reflect.set(this,"placeholder",e),this}setMinValues(e){return j.parse(e),Reflect.set(this,"min_values",e),this}setMaxValues(e){return j.parse(e),Reflect.set(this,"max_values",e),this}setCustomId(e){return S.parse(e),Reflect.set(this,"custom_id",e),this}setDisabled(e){return I.parse(e),Reflect.set(this,"disabled",e),this}addOptions(...e){return this.options.push(...e),this}setOptions(e){return Reflect.set(this,"options",[...e]),this}toJSON(){return se(this.options,this.custom_id),{...this,options:this.options.map(e=>e.toJSON())}}};var Ve={};V(Ve,{assertReturnOfBuilder:()=>C,validateDefaultPermission:()=>xe,validateDescription:()=>G,validateMaxChoicesLength:()=>Ae,validateMaxOptionsLength:()=>c,validateName:()=>F,validateRequired:()=>z,validateRequiredParameters:()=>b});import fe from"@sindresorhus/is";import{z as q}from"zod";var Ye=q.string().min(1).max(32).regex(/^[\P{Lu}\p{N}_-]+$/u);function F(t){Ye.parse(t)}var et=q.string().min(1).max(100);function G(t){et.parse(t)}var Ee=q.unknown().array().max(25);function c(t){Ee.parse(t)}function b(t,e,i){F(t),G(e),c(i)}var _e=q.boolean();function xe(t){_e.parse(t)}function z(t){_e.parse(t)}function Ae(t){Ee.parse(t)}function C(t,e){let i=e.name;if(fe.nullOrUndefined(t))throw new TypeError(`Expected to receive a ${i} builder, got ${t===null?"null":"undefined"} instead.`);if(fe.primitive(t))throw new TypeError(`Expected to receive a ${i} builder, got a primitive (${typeof t}) instead.`);if(!(t instanceof e)){let n=t,s=fe.function_(t)?t.name:n.constructor.name,y=Reflect.get(n,Symbol.toStringTag),P=y?`${s} [${y}]`:s;throw new TypeError(`Expected to receive a ${i} builder, got ${P} instead.`)}}import{mix as At}from"ts-mixer";import{ApplicationCommandOptionType as tt}from"discord-api-types/v9";var f=class{constructor(){o(this,"name");o(this,"description")}setName(e){return F(e),Reflect.set(this,"name",e),this}setDescription(e){return G(e),Reflect.set(this,"description",e),this}};var p=class extends f{constructor(){super(...arguments);o(this,"required",!1)}setRequired(e){return z(e),Reflect.set(this,"required",e),this}runRequiredValidations(){b(this.name,this.description,[]),z(this.required)}};var ye=class extends p{constructor(){super(...arguments);o(this,"type",tt.Boolean)}toJSON(){return this.runRequiredValidations(),{...this}}};import{ApplicationCommandOptionType as nt}from"discord-api-types/v9";import{mix as rt}from"ts-mixer";import{ChannelType as u}from"discord-api-types/v9";import{z as Le}from"zod";var ot=[u.GuildText,u.GuildVoice,u.GuildCategory,u.GuildNews,u.GuildStore,u.GuildNewsThread,u.GuildPublicThread,u.GuildPrivateThread,u.GuildStageVoice],it=Le.union(ot.map(t=>Le.literal(t))),Oe=class{constructor(){o(this,"channel_types")}addChannelType(e){return this.channel_types===void 0&&Reflect.set(this,"channel_types",[]),it.parse(e),this.channel_types.push(e),this}addChannelTypes(e){return e.forEach(i=>this.addChannelType(i)),this}};var R=class extends p{constructor(){super(...arguments);o(this,"type",nt.Channel)}toJSON(){return this.runRequiredValidations(),{...this}}};R=l([rt(Oe)],R);import{ApplicationCommandOptionType as pt}from"discord-api-types/v9";import{mix as mt}from"ts-mixer";import{z as lt}from"zod";var v=class{constructor(){o(this,"max_value");o(this,"min_value")}};import{ApplicationCommandOptionType as at}from"discord-api-types/v9";import{z as w}from"zod";var W=w.string().min(1).max(100),ke=w.number().gt(-1/0).lt(1/0),De=w.tuple([W,w.union([W,ke])]).array(),st=w.boolean(),A=class{constructor(){o(this,"choices");o(this,"autocomplete");o(this,"type")}addChoice(e,i){if(this.autocomplete)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");return this.choices===void 0&&Reflect.set(this,"choices",[]),Ae(this.choices),W.parse(e),this.type===at.String?W.parse(i):ke.parse(i),this.choices.push({name:e,value:i}),this}addChoices(e){if(this.autocomplete)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");De.parse(e);for(let[i,n]of e)this.addChoice(i,n);return this}setChoices(e){if(e.length>0&&this.autocomplete)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");De.parse(e),Reflect.set(this,"choices",[]);for(let[i,n]of e)this.addChoice(i,n);return this}setAutocomplete(e){if(st.parse(e),e&&Array.isArray(this.choices)&&this.choices.length>0)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");return Reflect.set(this,"autocomplete",e),this}};var Ue=lt.number().int().nonnegative(),B=class extends p{constructor(){super(...arguments);o(this,"type",pt.Integer)}setMaxValue(e){return Ue.parse(e),Reflect.set(this,"max_value",e),this}setMinValue(e){return Ue.parse(e),Reflect.set(this,"min_value",e),this}toJSON(){if(this.runRequiredValidations(),this.autocomplete&&Array.isArray(this.choices)&&this.choices.length>0)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");return{...this}}};B=l([mt(v,A)],B);import{ApplicationCommandOptionType as dt}from"discord-api-types/v9";var Se=class extends p{constructor(){super(...arguments);o(this,"type",dt.Mentionable)}toJSON(){return this.runRequiredValidations(),{...this}}};import{ApplicationCommandOptionType as ct}from"discord-api-types/v9";import{mix as ut}from"ts-mixer";import{z as ht}from"zod";var Je=ht.number().nonnegative(),N=class extends p{constructor(){super(...arguments);o(this,"type",ct.Number)}setMaxValue(e){return Je.parse(e),Reflect.set(this,"max_value",e),this}setMinValue(e){return Je.parse(e),Reflect.set(this,"min_value",e),this}toJSON(){if(this.runRequiredValidations(),this.autocomplete&&Array.isArray(this.choices)&&this.choices.length>0)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");return{...this}}};N=l([ut(v,A)],N);import{ApplicationCommandOptionType as bt}from"discord-api-types/v9";var ge=class extends p{constructor(){super(...arguments);o(this,"type",bt.Role)}toJSON(){return this.runRequiredValidations(),{...this}}};import{ApplicationCommandOptionType as Ct}from"discord-api-types/v9";import{mix as ft}from"ts-mixer";var $=class extends p{constructor(){super(...arguments);o(this,"type",Ct.String)}toJSON(){if(this.runRequiredValidations(),this.autocomplete&&Array.isArray(this.choices)&&this.choices.length>0)throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");return{...this}}};$=l([ft(A)],$);import{ApplicationCommandOptionType as xt}from"discord-api-types/v9";var Pe=class extends p{constructor(){super(...arguments);o(this,"type",xt.User)}toJSON(){return this.runRequiredValidations(),{...this}}};var E=class{constructor(){o(this,"options")}addBooleanOption(e){return this._sharedAddOptionMethod(e,ye)}addUserOption(e){return this._sharedAddOptionMethod(e,Pe)}addChannelOption(e){return this._sharedAddOptionMethod(e,R)}addRoleOption(e){return this._sharedAddOptionMethod(e,ge)}addMentionableOption(e){return this._sharedAddOptionMethod(e,Se)}addStringOption(e){return this._sharedAddOptionMethod(e,$)}addIntegerOption(e){return this._sharedAddOptionMethod(e,B)}addNumberOption(e){return this._sharedAddOptionMethod(e,N)}_sharedAddOptionMethod(e,i){let{options:n}=this;c(n);let s=typeof e=="function"?e(new i):e;return C(s,i),n.push(s),this}};import{ApplicationCommandOptionType as je}from"discord-api-types/v9";import{mix as qe}from"ts-mixer";var g=class{constructor(){o(this,"name");o(this,"description");o(this,"options",[])}addSubcommand(e){let{options:i}=this;c(i);let n=typeof e=="function"?e(new x):e;return C(n,x),i.push(n),this}toJSON(){return b(this.name,this.description,this.options),{type:je.SubcommandGroup,name:this.name,description:this.description,options:this.options.map(e=>e.toJSON())}}};g=l([qe(f)],g);var x=class{constructor(){o(this,"name");o(this,"description");o(this,"options",[])}toJSON(){return b(this.name,this.description,this.options),{type:je.Subcommand,name:this.name,description:this.description,options:this.options.map(e=>e.toJSON())}}};x=l([qe(f,E)],x);var Te=class{constructor(){o(this,"name");o(this,"description");o(this,"options",[]);o(this,"defaultPermission")}toJSON(){return b(this.name,this.description,this.options),{name:this.name,description:this.description,options:this.options.map(e=>e.toJSON()),default_permission:this.defaultPermission}}setDefaultPermission(e){return xe(e),Reflect.set(this,"defaultPermission",e),this}addSubcommandGroup(e){let{options:i}=this;c(i);let n=typeof e=="function"?e(new g):e;return C(n,g),i.push(n),this}addSubcommand(e){let{options:i}=this;c(i);let n=typeof e=="function"?e(new x):e;return C(n,x),i.push(n),this}};Te=l([At(E,f)],Te);var Ge={};V(Ge,{validateDefaultPermission:()=>Ie,validateName:()=>Z,validateRequiredParameters:()=>Me,validateType:()=>K});import{z as _}from"zod";import{ApplicationCommandType as Fe}from"discord-api-types/v9";var yt=_.string().min(1).max(32).regex(/^( *[\p{L}\p{N}_-]+ *)+$/u),Ot=_.union([_.literal(Fe.User),_.literal(Fe.Message)]),St=_.boolean();function Ie(t){St.parse(t)}function Z(t){yt.parse(t)}function K(t){Ot.parse(t)}function Me(t,e){Z(t),K(e)}var gt=class{constructor(){o(this,"name");o(this,"type");o(this,"defaultPermission")}setName(e){return Z(e),Reflect.set(this,"name",e),this}setType(e){return K(e),Reflect.set(this,"type",e),this}setDefaultPermission(e){return Ie(e),Reflect.set(this,"defaultPermission",e),this}toJSON(){return Me(this.name,this.type),{name:this.name,type:this.type,default_permission:this.defaultPermission}}};export{ue as ActionRow,he as ButtonComponent,Ne as ComponentAssertions,Ge as ContextMenuCommandAssertions,gt as ContextMenuCommandBuilder,J as Embed,we as EmbedAssertions,Ze as Faces,be as SelectMenuComponent,Ce as SelectMenuOption,Ve as SlashCommandAssertions,ye as SlashCommandBooleanOption,Te as SlashCommandBuilder,R as SlashCommandChannelOption,B as SlashCommandIntegerOption,Se as SlashCommandMentionableOption,N as SlashCommandNumberOption,ge as SlashCommandRoleOption,$ as SlashCommandStringOption,x as SlashCommandSubcommandBuilder,g as SlashCommandSubcommandGroupBuilder,Pe as SlashCommandUserOption,Gt as TimestampStyles,_t as blockQuote,Bt as bold,Jt as channelMention,Rt as codeBlock,$e as createComponent,qt as formatEmoji,Vt as hideLinkEmbed,Lt as hyperlink,vt as inlineCode,wt as italic,Ut as memberNicknameMention,Et as quote,jt as roleMention,kt as spoiler,$t as strikethrough,Ft as time,Nt as underscore,Dt as userMention};
+//# sourceMappingURL=index.mjs.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/index.mjs.map b/node_modules/@discordjs/builders/dist/index.mjs.map
new file mode 100644
index 0000000..e0a21b0
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.mjs.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../src/messages/embed/Assertions.ts","../src/messages/embed/Embed.ts","../src/messages/formatters.ts","../src/components/Assertions.ts","../src/components/ActionRow.ts","../src/components/Components.ts","../src/components/Button.ts","../src/components/selectMenu/SelectMenu.ts","../src/components/selectMenu/SelectMenuOption.ts","../src/interactions/slashCommands/Assertions.ts","../src/interactions/slashCommands/SlashCommandBuilder.ts","../src/interactions/slashCommands/options/boolean.ts","../src/interactions/slashCommands/mixins/NameAndDescription.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionBase.ts","../src/interactions/slashCommands/options/channel.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts","../src/interactions/slashCommands/options/integer.ts","../src/interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.ts","../src/interactions/slashCommands/options/mentionable.ts","../src/interactions/slashCommands/options/number.ts","../src/interactions/slashCommands/options/role.ts","../src/interactions/slashCommands/options/string.ts","../src/interactions/slashCommands/options/user.ts","../src/interactions/slashCommands/mixins/SharedSlashCommandOptions.ts","../src/interactions/slashCommands/SlashCommandSubcommands.ts","../src/interactions/contextMenuCommands/Assertions.ts","../src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts"],"sourcesContent":["import type { APIEmbedField } from 'discord-api-types/v9';\nimport { z } from 'zod';\n\nexport const fieldNamePredicate = z.string().min(1).max(256);\n\nexport const fieldValuePredicate = z.string().min(1).max(1024);\n\nexport const fieldInlinePredicate = z.boolean().optional();\n\nexport const embedFieldPredicate = z.object({\n\tname: fieldNamePredicate,\n\tvalue: fieldValuePredicate,\n\tinline: fieldInlinePredicate,\n});\n\nexport const embedFieldsArrayPredicate = embedFieldPredicate.array();\n\nexport const fieldLengthPredicate = z.number().lte(25);\n\nexport function validateFieldLength(fields: APIEmbedField[], amountAdding: number): void {\n\tfieldLengthPredicate.parse(fields.length + amountAdding);\n}\n\nexport const authorNamePredicate = fieldNamePredicate.nullable();\n\nexport const urlPredicate = z.string().url().nullish();\n\nexport const colorPredicate = z.number().gte(0).lte(0xffffff).nullable();\n\nexport const descriptionPredicate = z.string().min(1).max(4096).nullable();\n\nexport const footerTextPredicate = z.string().min(1).max(2048).nullable();\n\nexport const timestampPredicate = z.union([z.number(), z.date()]).nullable();\n\nexport const titlePredicate = fieldNamePredicate.nullable();\n","import type {\n\tAPIEmbed,\n\tAPIEmbedAuthor,\n\tAPIEmbedField,\n\tAPIEmbedFooter,\n\tAPIEmbedImage,\n\tAPIEmbedProvider,\n\tAPIEmbedThumbnail,\n\tAPIEmbedVideo,\n} from 'discord-api-types/v9';\nimport {\n\tauthorNamePredicate,\n\tcolorPredicate,\n\tdescriptionPredicate,\n\tembedFieldsArrayPredicate,\n\tfieldInlinePredicate,\n\tfieldNamePredicate,\n\tfieldValuePredicate,\n\tfooterTextPredicate,\n\ttimestampPredicate,\n\ttitlePredicate,\n\turlPredicate,\n\tvalidateFieldLength,\n} from './Assertions';\n\nexport interface AuthorOptions {\n\tname: string;\n\turl?: string;\n\ticonURL?: string;\n}\n\nexport interface FooterOptions {\n\ttext: string;\n\ticonURL?: string;\n}\n\n/**\n * Represents an embed in a message (image/video preview, rich embed, etc.)\n */\nexport class Embed implements APIEmbed {\n\t/**\n\t * An array of fields of this embed\n\t */\n\tpublic fields: APIEmbedField[];\n\n\t/**\n\t * The embed title\n\t */\n\tpublic title?: string;\n\n\t/**\n\t * The embed description\n\t */\n\tpublic description?: string;\n\n\t/**\n\t * The embed url\n\t */\n\tpublic url?: string;\n\n\t/**\n\t * The embed color\n\t */\n\tpublic color?: number;\n\n\t/**\n\t * The timestamp of the embed in the ISO format\n\t */\n\tpublic timestamp?: string;\n\n\t/**\n\t * The embed thumbnail data\n\t */\n\tpublic thumbnail?: APIEmbedThumbnail;\n\n\t/**\n\t * The embed image data\n\t */\n\tpublic image?: APIEmbedImage;\n\n\t/**\n\t * Received video data\n\t */\n\tpublic video?: APIEmbedVideo;\n\n\t/**\n\t * The embed author data\n\t */\n\tpublic author?: APIEmbedAuthor;\n\n\t/**\n\t * Received data about the embed provider\n\t */\n\tpublic provider?: APIEmbedProvider;\n\n\t/**\n\t * The embed footer data\n\t */\n\tpublic footer?: APIEmbedFooter;\n\n\tpublic constructor(data: APIEmbed = {}) {\n\t\tthis.title = data.title;\n\t\tthis.description = data.description;\n\t\tthis.url = data.url;\n\t\tthis.color = data.color;\n\t\tthis.thumbnail = data.thumbnail;\n\t\tthis.image = data.image;\n\t\tthis.video = data.video;\n\t\tthis.author = data.author;\n\t\tthis.provider = data.provider;\n\t\tthis.footer = data.footer;\n\t\tthis.fields = data.fields ?? [];\n\n\t\tif (data.timestamp) this.timestamp = new Date(data.timestamp).toISOString();\n\t}\n\n\t/**\n\t * The accumulated length for the embed title, description, fields, footer text, and author name\n\t */\n\tpublic get length(): number {\n\t\treturn (\n\t\t\t(this.title?.length ?? 0) +\n\t\t\t(this.description?.length ?? 0) +\n\t\t\tthis.fields.reduce((prev, curr) => prev + curr.name.length + curr.value.length, 0) +\n\t\t\t(this.footer?.text.length ?? 0) +\n\t\t\t(this.author?.name.length ?? 0)\n\t\t);\n\t}\n\n\t/**\n\t * Adds a field to the embed (max 25)\n\t *\n\t * @param field The field to add.\n\t */\n\tpublic addField(field: APIEmbedField): this {\n\t\treturn this.addFields(field);\n\t}\n\n\t/**\n\t * Adds fields to the embed (max 25)\n\t *\n\t * @param fields The fields to add\n\t */\n\tpublic addFields(...fields: APIEmbedField[]): this {\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(this.fields, fields.length);\n\n\t\tthis.fields.push(...Embed.normalizeFields(...fields));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts fields in the embed (max 25)\n\t *\n\t * @param index The index to start at\n\t * @param deleteCount The number of fields to remove\n\t * @param fields The replacing field objects\n\t */\n\tpublic spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this {\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(this.fields, fields.length - deleteCount);\n\n\t\tthis.fields.splice(index, deleteCount, ...Embed.normalizeFields(...fields));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the author of this embed\n\t *\n\t * @param options The options for the author\n\t */\n\tpublic setAuthor(options: AuthorOptions | null): this {\n\t\tif (options === null) {\n\t\t\tthis.author = undefined;\n\t\t\treturn this;\n\t\t}\n\n\t\tconst { name, iconURL, url } = options;\n\t\t// Data assertions\n\t\tauthorNamePredicate.parse(name);\n\t\turlPredicate.parse(iconURL);\n\t\turlPredicate.parse(url);\n\n\t\tthis.author = { name, url, icon_url: iconURL };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the color of this embed\n\t *\n\t * @param color The color of the embed\n\t */\n\tpublic setColor(color: number | null): this {\n\t\t// Data assertions\n\t\tcolorPredicate.parse(color);\n\n\t\tthis.color = color ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this embed\n\t *\n\t * @param description The description\n\t */\n\tpublic setDescription(description: string | null): this {\n\t\t// Data assertions\n\t\tdescriptionPredicate.parse(description);\n\n\t\tthis.description = description ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the footer of this embed\n\t *\n\t * @param options The options for the footer\n\t */\n\tpublic setFooter(options: FooterOptions | null): this {\n\t\tif (options === null) {\n\t\t\tthis.footer = undefined;\n\t\t\treturn this;\n\t\t}\n\n\t\tconst { text, iconURL } = options;\n\t\t// Data assertions\n\t\tfooterTextPredicate.parse(text);\n\t\turlPredicate.parse(iconURL);\n\n\t\tthis.footer = { text, icon_url: iconURL };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the image of this embed\n\t *\n\t * @param url The URL of the image\n\t */\n\tpublic setImage(url: string | null): this {\n\t\t// Data assertions\n\t\turlPredicate.parse(url);\n\n\t\tthis.image = url ? { url } : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the thumbnail of this embed\n\t *\n\t * @param url The URL of the thumbnail\n\t */\n\tpublic setThumbnail(url: string | null): this {\n\t\t// Data assertions\n\t\turlPredicate.parse(url);\n\n\t\tthis.thumbnail = url ? { url } : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the timestamp of this embed\n\t *\n\t * @param timestamp The timestamp or date\n\t */\n\tpublic setTimestamp(timestamp: number | Date | null = Date.now()): this {\n\t\t// Data assertions\n\t\ttimestampPredicate.parse(timestamp);\n\n\t\tthis.timestamp = timestamp ? new Date(timestamp).toISOString() : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the title of this embed\n\t *\n\t * @param title The title\n\t */\n\tpublic setTitle(title: string | null): this {\n\t\t// Data assertions\n\t\ttitlePredicate.parse(title);\n\n\t\tthis.title = title ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL of this embed\n\t *\n\t * @param url The URL\n\t */\n\tpublic setURL(url: string | null): this {\n\t\t// Data assertions\n\t\turlPredicate.parse(url);\n\n\t\tthis.url = url ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transforms the embed to a plain object\n\t */\n\tpublic toJSON(): APIEmbed {\n\t\treturn { ...this };\n\t}\n\n\t/**\n\t * Normalizes field input and resolves strings\n\t *\n\t * @param fields Fields to normalize\n\t */\n\tpublic static normalizeFields(...fields: APIEmbedField[]): APIEmbedField[] {\n\t\treturn fields.flat(Infinity).map((field) => {\n\t\t\tfieldNamePredicate.parse(field.name);\n\t\t\tfieldValuePredicate.parse(field.value);\n\t\t\tfieldInlinePredicate.parse(field.inline);\n\n\t\t\treturn { name: field.name, value: field.value, inline: field.inline ?? undefined };\n\t\t});\n\t}\n}\n","import type { Snowflake } from 'discord-api-types/globals';\nimport type { URL } from 'url';\n\n/**\n * Wraps the content inside a codeblock with no language\n *\n * @param content The content to wrap\n */\nexport function codeBlock(content: C): `\\`\\`\\`\\n${C}\\`\\`\\``;\n\n/**\n * Wraps the content inside a codeblock with the specified language\n *\n * @param language The language for the codeblock\n * @param content The content to wrap\n */\nexport function codeBlock(language: L, content: C): `\\`\\`\\`${L}\\n${C}\\`\\`\\``;\nexport function codeBlock(language: string, content?: string): string {\n\treturn typeof content === 'undefined' ? `\\`\\`\\`\\n${language}\\`\\`\\`` : `\\`\\`\\`${language}\\n${content}\\`\\`\\``;\n}\n\n/**\n * Wraps the content inside \\`backticks\\`, which formats it as inline code\n *\n * @param content The content to wrap\n */\nexport function inlineCode(content: C): `\\`${C}\\`` {\n\treturn `\\`${content}\\``;\n}\n\n/**\n * Formats the content into italic text\n *\n * @param content The content to wrap\n */\nexport function italic(content: C): `_${C}_` {\n\treturn `_${content}_`;\n}\n\n/**\n * Formats the content into bold text\n *\n * @param content The content to wrap\n */\nexport function bold(content: C): `**${C}**` {\n\treturn `**${content}**`;\n}\n\n/**\n * Formats the content into underscored text\n *\n * @param content The content to wrap\n */\nexport function underscore(content: C): `__${C}__` {\n\treturn `__${content}__`;\n}\n\n/**\n * Formats the content into strike-through text\n *\n * @param content The content to wrap\n */\nexport function strikethrough(content: C): `~~${C}~~` {\n\treturn `~~${content}~~`;\n}\n\n/**\n * Formats the content into a quote. This needs to be at the start of the line for Discord to format it\n *\n * @param content The content to wrap\n */\nexport function quote(content: C): `> ${C}` {\n\treturn `> ${content}`;\n}\n\n/**\n * Formats the content into a block quote. This needs to be at the start of the line for Discord to format it\n *\n * @param content The content to wrap\n */\nexport function blockQuote(content: C): `>>> ${C}` {\n\treturn `>>> ${content}`;\n}\n\n/**\n * Wraps the URL into `<>`, which stops it from embedding\n *\n * @param url The URL to wrap\n */\nexport function hideLinkEmbed(url: C): `<${C}>`;\n\n/**\n * Wraps the URL into `<>`, which stops it from embedding\n *\n * @param url The URL to wrap\n */\nexport function hideLinkEmbed(url: URL): `<${string}>`;\nexport function hideLinkEmbed(url: string | URL) {\n\t// eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n\treturn `<${url}>`;\n}\n\n/**\n * Formats the content and the URL into a masked URL\n *\n * @param content The content to display\n * @param url The URL the content links to\n */\nexport function hyperlink(content: C, url: URL): `[${C}](${string})`;\n\n/**\n * Formats the content and the URL into a masked URL\n *\n * @param content The content to display\n * @param url The URL the content links to\n */\nexport function hyperlink(content: C, url: U): `[${C}](${U})`;\n\n/**\n * Formats the content and the URL into a masked URL\n *\n * @param content The content to display\n * @param url The URL the content links to\n * @param title The title shown when hovering on the masked link\n */\nexport function hyperlink(\n\tcontent: C,\n\turl: URL,\n\ttitle: T,\n): `[${C}](${string} \"${T}\")`;\n\n/**\n * Formats the content and the URL into a masked URL\n *\n * @param content The content to display\n * @param url The URL the content links to\n * @param title The title shown when hovering on the masked link\n */\nexport function hyperlink(\n\tcontent: C,\n\turl: U,\n\ttitle: T,\n): `[${C}](${U} \"${T}\")`;\nexport function hyperlink(content: string, url: string | URL, title?: string) {\n\t// eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n\treturn title ? `[${content}](${url} \"${title}\")` : `[${content}](${url})`;\n}\n\n/**\n * Wraps the content inside spoiler (hidden text)\n *\n * @param content The content to wrap\n */\nexport function spoiler(content: C): `||${C}||` {\n\treturn `||${content}||`;\n}\n\n/**\n * Formats a user ID into a user mention\n *\n * @param userId The user ID to format\n */\nexport function userMention(userId: C): `<@${C}>` {\n\treturn `<@${userId}>`;\n}\n\n/**\n * Formats a user ID into a member-nickname mention\n *\n * @param memberId The user ID to format\n */\nexport function memberNicknameMention(memberId: C): `<@!${C}>` {\n\treturn `<@!${memberId}>`;\n}\n\n/**\n * Formats a channel ID into a channel mention\n *\n * @param channelId The channel ID to format\n */\nexport function channelMention(channelId: C): `<#${C}>` {\n\treturn `<#${channelId}>`;\n}\n\n/**\n * Formats a role ID into a role mention\n *\n * @param roleId The role ID to format\n */\nexport function roleMention(roleId: C): `<@&${C}>` {\n\treturn `<@&${roleId}>`;\n}\n\n/**\n * Formats an emoji ID into a fully qualified emoji identifier\n *\n * @param emojiId The emoji ID to format\n */\nexport function formatEmoji(emojiId: C, animated?: false): `<:_:${C}>`;\n\n/**\n * Formats an emoji ID into a fully qualified emoji identifier\n *\n * @param emojiId The emoji ID to format\n * @param animated Whether the emoji is animated or not. Defaults to `false`\n */\nexport function formatEmoji(emojiId: C, animated?: true): ``;\n\n/**\n * Formats an emoji ID into a fully qualified emoji identifier\n *\n * @param emojiId The emoji ID to format\n * @param animated Whether the emoji is animated or not. Defaults to `false`\n */\nexport function formatEmoji(emojiId: C, animated = false): `` | `<:_:${C}>` {\n\treturn `<${animated ? 'a' : ''}:_:${emojiId}>`;\n}\n\n/**\n * Formats a date into a short date-time string\n *\n * @param date The date to format, defaults to the current time\n */\nexport function time(date?: Date): ``;\n\n/**\n * Formats a date given a format style\n *\n * @param date The date to format\n * @param style The style to use\n */\nexport function time(date: Date, style: S): ``;\n\n/**\n * Formats the given timestamp into a short date-time string\n *\n * @param seconds The time to format, represents an UNIX timestamp in seconds\n */\nexport function time(seconds: C): ``;\n\n/**\n * Formats the given timestamp into a short date-time string\n *\n * @param seconds The time to format, represents an UNIX timestamp in seconds\n * @param style The style to use\n */\nexport function time(seconds: C, style: S): ``;\nexport function time(timeOrSeconds?: number | Date, style?: TimestampStylesString): string {\n\tif (typeof timeOrSeconds !== 'number') {\n\t\ttimeOrSeconds = Math.floor((timeOrSeconds?.getTime() ?? Date.now()) / 1000);\n\t}\n\n\treturn typeof style === 'string' ? `` : ``;\n}\n\n/**\n * The [message formatting timestamp styles](https://discord.com/developers/docs/reference#message-formatting-timestamp-styles) supported by Discord\n */\nexport const TimestampStyles = {\n\t/**\n\t * Short time format, consisting of hours and minutes, e.g. 16:20\n\t */\n\tShortTime: 't',\n\n\t/**\n\t * Long time format, consisting of hours, minutes, and seconds, e.g. 16:20:30\n\t */\n\tLongTime: 'T',\n\n\t/**\n\t * Short date format, consisting of day, month, and year, e.g. 20/04/2021\n\t */\n\tShortDate: 'd',\n\n\t/**\n\t * Long date format, consisting of day, month, and year, e.g. 20 April 2021\n\t */\n\tLongDate: 'D',\n\n\t/**\n\t * Short date-time format, consisting of short date and short time formats, e.g. 20 April 2021 16:20\n\t */\n\tShortDateTime: 'f',\n\n\t/**\n\t * Long date-time format, consisting of long date and short time formats, e.g. Tuesday, 20 April 2021 16:20\n\t */\n\tLongDateTime: 'F',\n\n\t/**\n\t * Relative time format, consisting of a relative duration format, e.g. 2 months ago\n\t */\n\tRelativeTime: 'R',\n} as const;\n\n/**\n * The possible values, see {@link TimestampStyles} for more information\n */\nexport type TimestampStylesString = typeof TimestampStyles[keyof typeof TimestampStyles];\n\n/**\n * An enum with all the available faces from Discord's native slash commands\n */\nexport enum Faces {\n\t/**\n\t * ¯\\\\_(ツ)\\\\_/¯\n\t */\n\tShrug = '¯\\\\_(ツ)\\\\_/¯',\n\n\t/**\n\t * (╯°□°)╯︵ ┻━┻\n\t */\n\tTableflip = '(╯°□°)╯︵ ┻━┻',\n\n\t/**\n\t * ┬─┬ ノ( ゜-゜ノ)\n\t */\n\tUnflip = '┬─┬ ノ( ゜-゜ノ)',\n}\n","import { APIMessageComponentEmoji, ButtonStyle } from 'discord-api-types/v9';\nimport { z } from 'zod';\nimport type { SelectMenuOption } from './selectMenu/SelectMenuOption';\n\nexport const customIdValidator = z.string().min(1).max(100);\n\nexport const emojiValidator = z\n\t.object({\n\t\tid: z.string(),\n\t\tname: z.string(),\n\t\tanimated: z.boolean(),\n\t})\n\t.partial()\n\t.strict();\n\nexport const disabledValidator = z.boolean();\n\nexport const buttonLabelValidator = z.string().nonempty().max(80);\n\nexport const buttonStyleValidator = z.number().int().min(ButtonStyle.Primary).max(ButtonStyle.Link);\n\nexport const placeholderValidator = z.string().max(100);\nexport const minMaxValidator = z.number().int().min(0).max(25);\n\nexport const optionsValidator = z.object({}).array().nonempty();\n\nexport function validateRequiredSelectMenuParameters(options: SelectMenuOption[], customId?: string) {\n\tcustomIdValidator.parse(customId);\n\toptionsValidator.parse(options);\n}\n\nexport const labelValueValidator = z.string().min(1).max(100);\nexport const defaultValidator = z.boolean();\n\nexport function validateRequiredSelectMenuOptionParameters(label?: string, value?: string) {\n\tlabelValueValidator.parse(label);\n\tlabelValueValidator.parse(value);\n}\n\nexport const urlValidator = z.string().url();\n\nexport function validateRequiredButtonParameters(\n\tstyle: ButtonStyle,\n\tlabel?: string,\n\temoji?: APIMessageComponentEmoji,\n\tcustomId?: string,\n\turl?: string,\n) {\n\tif (url && customId) {\n\t\tthrow new RangeError('URL and custom id are mutually exclusive');\n\t}\n\n\tif (!label && !emoji) {\n\t\tthrow new RangeError('Buttons must have a label and/or an emoji');\n\t}\n\n\tif (style === ButtonStyle.Link) {\n\t\tif (!url) {\n\t\t\tthrow new RangeError('Link buttons must have a url');\n\t\t}\n\t} else if (url) {\n\t\tthrow new RangeError('Non-link buttons cannot have a url');\n\t}\n}\n","import { APIActionRowComponent, ComponentType } from 'discord-api-types/v9';\nimport type { ButtonComponent, SelectMenuComponent } from '..';\nimport type { Component } from './Component';\nimport { createComponent } from './Components';\n\nexport type ActionRowComponent = ButtonComponent | SelectMenuComponent;\n\n// TODO: Add valid form component types\n\n/**\n * Represents an action row component\n */\nexport class ActionRow implements Component {\n\tpublic readonly components: T[] = [];\n\tpublic readonly type = ComponentType.ActionRow;\n\n\tpublic constructor(data?: APIActionRowComponent) {\n\t\tthis.components = (data?.components.map(createComponent) ?? []) as T[];\n\t}\n\n\t/**\n\t * Adds components to this action row.\n\t * @param components The components to add to this action row.\n\t * @returns\n\t */\n\tpublic addComponents(...components: T[]) {\n\t\tthis.components.push(...components);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the components in this action row\n\t * @param components The components to set this row to\n\t */\n\tpublic setComponents(components: T[]) {\n\t\tReflect.set(this, 'components', [...components]);\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIActionRowComponent {\n\t\treturn {\n\t\t\t...this,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t};\n\t}\n}\n","import { APIMessageComponent, ComponentType } from 'discord-api-types/v9';\nimport { ActionRow, ButtonComponent, Component, SelectMenuComponent } from '../index';\nimport type { ActionRowComponent } from './ActionRow';\n\nexport interface MappedComponentTypes {\n\t[ComponentType.ActionRow]: ActionRow;\n\t[ComponentType.Button]: ButtonComponent;\n\t[ComponentType.SelectMenu]: SelectMenuComponent;\n}\n\n/**\n * Factory for creating components from API data\n * @param data The api data to transform to a component class\n */\nexport function createComponent(\n\tdata: APIMessageComponent & { type: T },\n): MappedComponentTypes[T];\nexport function createComponent(data: APIMessageComponent): Component {\n\tswitch (data.type) {\n\t\tcase ComponentType.ActionRow:\n\t\t\treturn new ActionRow(data);\n\t\tcase ComponentType.Button:\n\t\t\treturn new ButtonComponent(data);\n\t\tcase ComponentType.SelectMenu:\n\t\t\treturn new SelectMenuComponent(data);\n\t\tdefault:\n\t\t\t// @ts-expect-error\n\t\t\tthrow new Error(`Cannot serialize component type: ${data.type as number}`);\n\t}\n}\n","import { APIButtonComponent, APIMessageComponentEmoji, ButtonStyle, ComponentType } from 'discord-api-types/v9';\nimport {\n\tbuttonLabelValidator,\n\tbuttonStyleValidator,\n\tcustomIdValidator,\n\tdisabledValidator,\n\temojiValidator,\n\turlValidator,\n\tvalidateRequiredButtonParameters,\n} from './Assertions';\nimport type { Component } from './Component';\n\nexport class ButtonComponent implements Component {\n\tpublic readonly type = ComponentType.Button as const;\n\tpublic readonly style!: ButtonStyle;\n\tpublic readonly label?: string;\n\tpublic readonly emoji?: APIMessageComponentEmoji;\n\tpublic readonly disabled?: boolean;\n\tpublic readonly custom_id!: string;\n\tpublic readonly url!: string;\n\n\tpublic constructor(data?: APIButtonComponent) {\n\t\t/* eslint-disable @typescript-eslint/non-nullable-type-assertion-style */\n\t\tthis.style = data?.style as ButtonStyle;\n\t\tthis.label = data?.label;\n\t\tthis.emoji = data?.emoji;\n\t\tthis.disabled = data?.disabled;\n\n\t\t// This if/else makes typescript happy\n\t\tif (data?.style === ButtonStyle.Link) {\n\t\t\tthis.url = data.url;\n\t\t} else {\n\t\t\tthis.custom_id = data?.custom_id as string;\n\t\t}\n\n\t\t/* eslint-enable @typescript-eslint/non-nullable-type-assertion-style */\n\t}\n\n\t/**\n\t * Sets the style of this button\n\t * @param style The style of the button\n\t */\n\tpublic setStyle(style: ButtonStyle) {\n\t\tbuttonStyleValidator.parse(style);\n\t\tReflect.set(this, 'style', style);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL for this button\n\t * @param url The URL to open when this button is clicked\n\t */\n\tpublic setURL(url: string) {\n\t\turlValidator.parse(url);\n\t\tReflect.set(this, 'url', url);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom Id for this button\n\t * @param customId The custom ID to use for this button\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tcustomIdValidator.parse(customId);\n\t\tReflect.set(this, 'custom_id', customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display on this button\n\t * @param emoji The emoji to display on this button\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\temojiValidator.parse(emoji);\n\t\tReflect.set(this, 'emoji', emoji);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this button is disable or not\n\t * @param disabled Whether or not to disable this button or not\n\t */\n\tpublic setDisabled(disabled: boolean) {\n\t\tdisabledValidator.parse(disabled);\n\t\tReflect.set(this, 'disabled', disabled);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this button\n\t * @param label The label to display on this button\n\t */\n\tpublic setLabel(label: string) {\n\t\tbuttonLabelValidator.parse(label);\n\t\tReflect.set(this, 'label', label);\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIButtonComponent {\n\t\tvalidateRequiredButtonParameters(this.style, this.label, this.emoji, this.custom_id, this.url);\n\t\treturn {\n\t\t\t...this,\n\t\t};\n\t}\n}\n","import { APISelectMenuComponent, ComponentType } from 'discord-api-types/v9';\nimport {\n\tcustomIdValidator,\n\tdisabledValidator,\n\tminMaxValidator,\n\tplaceholderValidator,\n\tvalidateRequiredSelectMenuParameters,\n} from '../Assertions';\nimport type { Component } from '../Component';\nimport { SelectMenuOption } from './SelectMenuOption';\n\n/**\n * Represents a select menu component\n */\nexport class SelectMenuComponent implements Component {\n\tpublic readonly type = ComponentType.SelectMenu as const;\n\tpublic readonly options: SelectMenuOption[];\n\tpublic readonly placeholder?: string;\n\tpublic readonly min_values?: number;\n\tpublic readonly max_values?: number;\n\tpublic readonly custom_id!: string;\n\tpublic readonly disabled?: boolean;\n\n\tpublic constructor(data?: APISelectMenuComponent) {\n\t\tthis.options = data?.options.map((option) => new SelectMenuOption(option)) ?? [];\n\t\tthis.placeholder = data?.placeholder;\n\t\tthis.min_values = data?.min_values;\n\t\tthis.max_values = data?.max_values;\n\t\t/* eslint-disable @typescript-eslint/non-nullable-type-assertion-style */\n\t\tthis.custom_id = data?.custom_id as string;\n\t\t/* eslint-enable @typescript-eslint/non-nullable-type-assertion-style */\n\t\tthis.disabled = data?.disabled;\n\t}\n\n\t/**\n\t * Sets the placeholder for this select menu\n\t * @param placeholder The placeholder to use for this select menu\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tplaceholderValidator.parse(placeholder);\n\t\tReflect.set(this, 'placeholder', placeholder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets thes minimum values that must be selected in the select menu\n\t * @param minValues The minimum values that must be selected\n\t */\n\tpublic setMinValues(minValues: number) {\n\t\tminMaxValidator.parse(minValues);\n\t\tReflect.set(this, 'min_values', minValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets thes maximum values that must be selected in the select menu\n\t * @param minValues The maximum values that must be selected\n\t */\n\tpublic setMaxValues(maxValues: number) {\n\t\tminMaxValidator.parse(maxValues);\n\t\tReflect.set(this, 'max_values', maxValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom Id for this select menu\n\t * @param customId The custom ID to use for this select menu\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tcustomIdValidator.parse(customId);\n\t\tReflect.set(this, 'custom_id', customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether or not this select menu is disabled\n\t * @param disabled Whether or not this select menu is disabled\n\t */\n\tpublic setDisabled(disabled: boolean) {\n\t\tdisabledValidator.parse(disabled);\n\t\tReflect.set(this, 'disabled', disabled);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds options to this select menu\n\t * @param options The options to add to this select menu\n\t * @returns\n\t */\n\tpublic addOptions(...options: SelectMenuOption[]) {\n\t\tthis.options.push(...options);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the options on this select menu\n\t * @param options The options to set on this select menu\n\t */\n\tpublic setOptions(options: SelectMenuOption[]) {\n\t\tReflect.set(this, 'options', [...options]);\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APISelectMenuComponent {\n\t\tvalidateRequiredSelectMenuParameters(this.options, this.custom_id);\n\t\treturn {\n\t\t\t...this,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n","import type { APIMessageComponentEmoji, APISelectMenuOption } from 'discord-api-types/v9';\nimport {\n\tdefaultValidator,\n\temojiValidator,\n\tlabelValueValidator,\n\tvalidateRequiredSelectMenuOptionParameters,\n} from '../Assertions';\n\n/**\n * Represents an option within a select menu component\n */\nexport class SelectMenuOption {\n\tpublic readonly label!: string;\n\tpublic readonly value!: string;\n\tpublic readonly description?: string;\n\tpublic readonly emoji?: APIMessageComponentEmoji;\n\tpublic readonly default?: boolean;\n\n\tpublic constructor(data?: APISelectMenuOption) {\n\t\t/* eslint-disable @typescript-eslint/non-nullable-type-assertion-style */\n\t\tthis.label = data?.label as string;\n\t\tthis.value = data?.value as string;\n\t\t/* eslint-enable @typescript-eslint/non-nullable-type-assertion-style */\n\t\tthis.description = data?.description;\n\t\tthis.emoji = data?.emoji;\n\t\tthis.default = data?.default;\n\t}\n\n\t/**\n\t * Sets the label of this option\n\t * @param label The label to show on this option\n\t */\n\tpublic setLabel(label: string) {\n\t\tReflect.set(this, 'label', label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value of this option\n\t * @param value The value of this option\n\t */\n\tpublic setValue(value: string) {\n\t\tReflect.set(this, 'value', value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this option.\n\t * @param description The description of this option\n\t */\n\tpublic setDescription(description: string) {\n\t\tlabelValueValidator.parse(description);\n\t\tReflect.set(this, 'description', description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this option is selected by default\n\t * @param isDefault Whether or not this option is selected by default\n\t */\n\tpublic setDefault(isDefault: boolean) {\n\t\tdefaultValidator.parse(isDefault);\n\t\tReflect.set(this, 'default', isDefault);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display on this button\n\t * @param emoji The emoji to display on this button\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\temojiValidator.parse(emoji);\n\t\tReflect.set(this, 'emoji', emoji);\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APISelectMenuOption {\n\t\tvalidateRequiredSelectMenuOptionParameters(this.label, this.value);\n\t\treturn {\n\t\t\t...this,\n\t\t};\n\t}\n}\n","import is from '@sindresorhus/is';\nimport type { APIApplicationCommandOptionChoice } from 'discord-api-types/v9';\nimport { z } from 'zod';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder';\nimport type { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands';\n\nconst namePredicate = z\n\t.string()\n\t.min(1)\n\t.max(32)\n\t.regex(/^[\\P{Lu}\\p{N}_-]+$/u);\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nconst descriptionPredicate = z.string().min(1).max(100);\n\nexport function validateDescription(description: unknown): asserts description is string {\n\tdescriptionPredicate.parse(description);\n}\n\nconst maxArrayLengthPredicate = z.unknown().array().max(25);\n\nexport function validateMaxOptionsLength(options: unknown): asserts options is ToAPIApplicationCommandOptions[] {\n\tmaxArrayLengthPredicate.parse(options);\n}\n\nexport function validateRequiredParameters(\n\tname: string,\n\tdescription: string,\n\toptions: ToAPIApplicationCommandOptions[],\n) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert description conditions\n\tvalidateDescription(description);\n\n\t// Assert options conditions\n\tvalidateMaxOptionsLength(options);\n}\n\nconst booleanPredicate = z.boolean();\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateRequired(required: unknown): asserts required is boolean {\n\tbooleanPredicate.parse(required);\n}\n\nexport function validateMaxChoicesLength(choices: APIApplicationCommandOptionChoice[]) {\n\tmaxArrayLengthPredicate.parse(choices);\n}\n\nexport function assertReturnOfBuilder<\n\tT extends ApplicationCommandOptionBase | SlashCommandSubcommandBuilder | SlashCommandSubcommandGroupBuilder,\n>(input: unknown, ExpectedInstanceOf: new () => T): asserts input is T {\n\tconst instanceName = ExpectedInstanceOf.name;\n\n\tif (is.nullOrUndefined(input)) {\n\t\tthrow new TypeError(\n\t\t\t`Expected to receive a ${instanceName} builder, got ${input === null ? 'null' : 'undefined'} instead.`,\n\t\t);\n\t}\n\n\tif (is.primitive(input)) {\n\t\tthrow new TypeError(`Expected to receive a ${instanceName} builder, got a primitive (${typeof input}) instead.`);\n\t}\n\n\tif (!(input instanceof ExpectedInstanceOf)) {\n\t\tconst casted = input as Record;\n\n\t\tconst constructorName = is.function_(input) ? input.name : casted.constructor.name;\n\t\tconst stringTag = Reflect.get(casted, Symbol.toStringTag) as string | undefined;\n\n\t\tconst fullResultName = stringTag ? `${constructorName} [${stringTag}]` : constructorName;\n\n\t\tthrow new TypeError(`Expected to receive a ${instanceName} builder, got ${fullResultName} instead.`);\n\t}\n}\n","import type { APIApplicationCommandOption, RESTPostAPIApplicationCommandsJSONBody } from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport {\n\tassertReturnOfBuilder,\n\tvalidateDefaultPermission,\n\tvalidateMaxOptionsLength,\n\tvalidateRequiredParameters,\n} from './Assertions';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription';\nimport { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands';\n\n@mix(SharedSlashCommandOptions, SharedNameAndDescription)\nexport class SlashCommandBuilder {\n\t/**\n\t * The name of this slash command\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this slash command\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The options of this slash command\n\t */\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * Whether the command is enabled by default when the app is added to a guild\n\t *\n\t * @default true\n\t */\n\tpublic readonly defaultPermission: boolean | undefined = undefined;\n\n\t/**\n\t * Returns the final data that should be sent to Discord.\n\t *\n\t * **Note:** Calling this function will validate required properties based on their conditions.\n\t */\n\tpublic toJSON(): RESTPostAPIApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tdescription: this.description,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t\tdefault_permission: this.defaultPermission,\n\t\t};\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * **Note**: If set to `false`, you will have to later `PUT` the permissions for this command.\n\t *\n\t * @param value Whether or not to enable this command by default\n\t *\n\t * @see https://discord.com/developers/docs/interactions/application-commands#permissions\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'defaultPermission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a new subcommand group to this command\n\t *\n\t * @param input A function that returns a subcommand group builder, or an already built builder\n\t */\n\tpublic addSubcommandGroup(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandGroupBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandGroupBuilder) => SlashCommandSubcommandGroupBuilder),\n\t): SlashCommandSubcommandsOnlyBuilder {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandGroupBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a new subcommand to this command\n\t *\n\t * @param input A function that returns a subcommand builder, or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t): SlashCommandSubcommandsOnlyBuilder {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n}\n\nexport interface SlashCommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {}\n\nexport interface SlashCommandSubcommandsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tPick {}\n\nexport interface SlashCommandOptionsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions,\n\t\tPick {}\n\nexport interface ToAPIApplicationCommandOptions {\n\ttoJSON: () => APIApplicationCommandOption;\n}\n","import { APIApplicationCommandBooleanOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\n\nexport class SlashCommandBooleanOption extends ApplicationCommandOptionBase {\n\tpublic readonly type = ApplicationCommandOptionType.Boolean as const;\n\n\tpublic toJSON(): APIApplicationCommandBooleanOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { validateDescription, validateName } from '../Assertions';\n\nexport class SharedNameAndDescription {\n\tpublic readonly name!: string;\n\tpublic readonly description!: string;\n\n\t/**\n\t * Sets the name\n\t *\n\t * @param name The name\n\t */\n\tpublic setName(name: string): this {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description\n\t *\n\t * @param description The description\n\t */\n\tpublic setDescription(description: string) {\n\t\t// Assert the description matches the conditions\n\t\tvalidateDescription(description);\n\n\t\tReflect.set(this, 'description', description);\n\n\t\treturn this;\n\t}\n}\n","import type { APIApplicationCommandBasicOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { validateRequiredParameters, validateRequired } from '../Assertions';\nimport { SharedNameAndDescription } from './NameAndDescription';\n\nexport abstract class ApplicationCommandOptionBase extends SharedNameAndDescription {\n\tpublic abstract readonly type: ApplicationCommandOptionType;\n\n\tpublic readonly required: boolean = false;\n\n\t/**\n\t * Marks the option as required\n\t *\n\t * @param required If this option should be required\n\t */\n\tpublic setRequired(required: boolean) {\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(required);\n\n\t\tReflect.set(this, 'required', required);\n\n\t\treturn this;\n\t}\n\n\tpublic abstract toJSON(): APIApplicationCommandBasicOption;\n\n\tprotected runRequiredValidations() {\n\t\tvalidateRequiredParameters(this.name, this.description, []);\n\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(this.required);\n\t}\n}\n","import { APIApplicationCommandChannelOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\nimport { ApplicationCommandOptionChannelTypesMixin } from '../mixins/ApplicationCommandOptionChannelTypesMixin';\n\n@mix(ApplicationCommandOptionChannelTypesMixin)\nexport class SlashCommandChannelOption extends ApplicationCommandOptionBase {\n\tpublic override readonly type = ApplicationCommandOptionType.Channel as const;\n\n\tpublic toJSON(): APIApplicationCommandChannelOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandChannelOption extends ApplicationCommandOptionChannelTypesMixin {}\n","import { ChannelType } from 'discord-api-types/v9';\nimport { z, ZodLiteral } from 'zod';\n\n// Only allow valid channel types to be used. (This can't be dynamic because const enums are erased at runtime)\nconst allowedChannelTypes = [\n\tChannelType.GuildText,\n\tChannelType.GuildVoice,\n\tChannelType.GuildCategory,\n\tChannelType.GuildNews,\n\tChannelType.GuildStore,\n\tChannelType.GuildNewsThread,\n\tChannelType.GuildPublicThread,\n\tChannelType.GuildPrivateThread,\n\tChannelType.GuildStageVoice,\n] as const;\n\nexport type ApplicationCommandOptionAllowedChannelTypes = typeof allowedChannelTypes[number];\n\nconst channelTypePredicate = z.union(\n\tallowedChannelTypes.map((type) => z.literal(type)) as [\n\t\tZodLiteral,\n\t\tZodLiteral,\n\t\t...ZodLiteral[]\n\t],\n);\n\nexport class ApplicationCommandOptionChannelTypesMixin {\n\tpublic readonly channel_types?: ApplicationCommandOptionAllowedChannelTypes[];\n\n\t/**\n\t * Adds a channel type to this option\n\t *\n\t * @param channelType The type of channel to allow\n\t */\n\tpublic addChannelType(channelType: ApplicationCommandOptionAllowedChannelTypes) {\n\t\tif (this.channel_types === undefined) {\n\t\t\tReflect.set(this, 'channel_types', []);\n\t\t}\n\n\t\tchannelTypePredicate.parse(channelType);\n\t\tthis.channel_types!.push(channelType);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds channel types to this option\n\t *\n\t * @param channelTypes The channel types to add\n\t */\n\tpublic addChannelTypes(channelTypes: ApplicationCommandOptionAllowedChannelTypes[]) {\n\t\tchannelTypes.forEach((channelType) => this.addChannelType(channelType));\n\t\treturn this;\n\t}\n}\n","import { APIApplicationCommandIntegerOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport { z } from 'zod';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\nimport { ApplicationCommandOptionWithChoicesAndAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin';\n\nconst numberValidator = z.number().int().nonnegative();\n\n@mix(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)\nexport class SlashCommandIntegerOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\tpublic readonly type = ApplicationCommandOptionType.Integer as const;\n\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIApplicationCommandIntegerOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandIntegerOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesAndAutocompleteMixin {}\n","export abstract class ApplicationCommandNumericOptionMinMaxValueMixin {\n\tpublic readonly max_value?: number;\n\tpublic readonly min_value?: number;\n\n\t/**\n\t * Sets the maximum number value of this option\n\t * @param max The maximum value this option can be\n\t */\n\tpublic abstract setMaxValue(max: number): this;\n\n\t/**\n\t * Sets the minimum number value of this option\n\t * @param min The minimum value this option can be\n\t */\n\tpublic abstract setMinValue(min: number): this;\n}\n","import { APIApplicationCommandOptionChoice, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { z } from 'zod';\nimport { validateMaxChoicesLength } from '../Assertions';\n\nconst stringPredicate = z.string().min(1).max(100);\nconst numberPredicate = z.number().gt(-Infinity).lt(Infinity);\nconst choicesPredicate = z.tuple([stringPredicate, z.union([stringPredicate, numberPredicate])]).array();\nconst booleanPredicate = z.boolean();\n\nexport class ApplicationCommandOptionWithChoicesAndAutocompleteMixin {\n\tpublic readonly choices?: APIApplicationCommandOptionChoice[];\n\tpublic readonly autocomplete?: boolean;\n\n\t// Since this is present and this is a mixin, this is needed\n\tpublic readonly type!: ApplicationCommandOptionType;\n\n\t/**\n\t * Adds a choice for this option\n\t *\n\t * @param name The name of the choice\n\t * @param value The value of the choice\n\t */\n\tpublic addChoice(name: string, value: T): Omit {\n\t\tif (this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tif (this.choices === undefined) {\n\t\t\tReflect.set(this, 'choices', []);\n\t\t}\n\n\t\tvalidateMaxChoicesLength(this.choices!);\n\n\t\t// Validate name\n\t\tstringPredicate.parse(name);\n\n\t\t// Validate the value\n\t\tif (this.type === ApplicationCommandOptionType.String) {\n\t\t\tstringPredicate.parse(value);\n\t\t} else {\n\t\t\tnumberPredicate.parse(value);\n\t\t}\n\n\t\tthis.choices!.push({ name, value });\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds multiple choices for this option\n\t *\n\t * @param choices The choices to add\n\t */\n\tpublic addChoices(choices: [name: string, value: T][]): Omit {\n\t\tif (this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(choices);\n\n\t\tfor (const [label, value] of choices) this.addChoice(label, value);\n\t\treturn this;\n\t}\n\n\tpublic setChoices(\n\t\tchoices: Input,\n\t): Input extends []\n\t\t? this & Pick, 'setAutocomplete'>\n\t\t: Omit {\n\t\tif (choices.length > 0 && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(choices);\n\n\t\tReflect.set(this, 'choices', []);\n\t\tfor (const [label, value] of choices) this.addChoice(label, value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Marks the option as autocompletable\n\t * @param autocomplete If this option should be autocompletable\n\t */\n\tpublic setAutocomplete(\n\t\tautocomplete: U,\n\t): U extends true\n\t\t? Omit\n\t\t: this & Pick, 'addChoice' | 'addChoices'> {\n\t\t// Assert that you actually passed a boolean\n\t\tbooleanPredicate.parse(autocomplete);\n\n\t\tif (autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tReflect.set(this, 'autocomplete', autocomplete);\n\n\t\treturn this;\n\t}\n}\n","import { APIApplicationCommandMentionableOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\n\nexport class SlashCommandMentionableOption extends ApplicationCommandOptionBase {\n\tpublic readonly type = ApplicationCommandOptionType.Mentionable as const;\n\n\tpublic toJSON(): APIApplicationCommandMentionableOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { APIApplicationCommandNumberOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport { z } from 'zod';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\nimport { ApplicationCommandOptionWithChoicesAndAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin';\n\nconst numberValidator = z.number().nonnegative();\n\n@mix(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)\nexport class SlashCommandNumberOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\tpublic readonly type = ApplicationCommandOptionType.Number as const;\n\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIApplicationCommandNumberOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandNumberOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesAndAutocompleteMixin {}\n","import { APIApplicationCommandRoleOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\n\nexport class SlashCommandRoleOption extends ApplicationCommandOptionBase {\n\tpublic override readonly type = ApplicationCommandOptionType.Role as const;\n\n\tpublic toJSON(): APIApplicationCommandRoleOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { APIApplicationCommandStringOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\nimport { ApplicationCommandOptionWithChoicesAndAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin';\n\n@mix(ApplicationCommandOptionWithChoicesAndAutocompleteMixin)\nexport class SlashCommandStringOption extends ApplicationCommandOptionBase {\n\tpublic readonly type = ApplicationCommandOptionType.String as const;\n\n\tpublic toJSON(): APIApplicationCommandStringOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandStringOption extends ApplicationCommandOptionWithChoicesAndAutocompleteMixin {}\n","import { APIApplicationCommandUserOption, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase';\n\nexport class SlashCommandUserOption extends ApplicationCommandOptionBase {\n\tpublic readonly type = ApplicationCommandOptionType.User as const;\n\n\tpublic toJSON(): APIApplicationCommandUserOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { assertReturnOfBuilder, validateMaxOptionsLength } from '../Assertions';\nimport type { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase';\nimport { SlashCommandBooleanOption } from '../options/boolean';\nimport { SlashCommandChannelOption } from '../options/channel';\nimport { SlashCommandIntegerOption } from '../options/integer';\nimport { SlashCommandMentionableOption } from '../options/mentionable';\nimport { SlashCommandNumberOption } from '../options/number';\nimport { SlashCommandRoleOption } from '../options/role';\nimport { SlashCommandStringOption } from '../options/string';\nimport { SlashCommandUserOption } from '../options/user';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';\n\nexport class SharedSlashCommandOptions {\n\tpublic readonly options!: ToAPIApplicationCommandOptions[];\n\n\t/**\n\t * Adds a boolean option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addBooleanOption(\n\t\tinput: SlashCommandBooleanOption | ((builder: SlashCommandBooleanOption) => SlashCommandBooleanOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandBooleanOption);\n\t}\n\n\t/**\n\t * Adds a user option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandUserOption);\n\t}\n\n\t/**\n\t * Adds a channel option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addChannelOption(\n\t\tinput: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandChannelOption);\n\t}\n\n\t/**\n\t * Adds a role option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandRoleOption);\n\t}\n\n\t/**\n\t * Adds a mentionable option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addMentionableOption(\n\t\tinput: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandMentionableOption);\n\t}\n\n\t/**\n\t * Adds a string option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addStringOption(\n\t\tinput:\n\t\t\t| SlashCommandStringOption\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| ((\n\t\t\t\t\tbuilder: SlashCommandStringOption,\n\t\t\t ) =>\n\t\t\t\t\t| SlashCommandStringOption\n\t\t\t\t\t| Omit\n\t\t\t\t\t| Omit),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandStringOption);\n\t}\n\n\t/**\n\t * Adds an integer option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addIntegerOption(\n\t\tinput:\n\t\t\t| SlashCommandIntegerOption\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| ((\n\t\t\t\t\tbuilder: SlashCommandIntegerOption,\n\t\t\t ) =>\n\t\t\t\t\t| SlashCommandIntegerOption\n\t\t\t\t\t| Omit\n\t\t\t\t\t| Omit),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandIntegerOption);\n\t}\n\n\t/**\n\t * Adds a number option\n\t *\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addNumberOption(\n\t\tinput:\n\t\t\t| SlashCommandNumberOption\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| ((\n\t\t\t\t\tbuilder: SlashCommandNumberOption,\n\t\t\t ) =>\n\t\t\t\t\t| SlashCommandNumberOption\n\t\t\t\t\t| Omit\n\t\t\t\t\t| Omit),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandNumberOption);\n\t}\n\n\tprivate _sharedAddOptionMethod(\n\t\tinput:\n\t\t\t| T\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| ((builder: T) => T | Omit | Omit),\n\t\tInstance: new () => T,\n\t): ShouldOmitSubcommandFunctions extends true ? Omit : this {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new Instance()) : input;\n\n\t\tassertReturnOfBuilder(result, Instance);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n}\n","import {\n\tAPIApplicationCommandSubcommandGroupOption,\n\tAPIApplicationCommandSubcommandOption,\n\tApplicationCommandOptionType,\n} from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport { assertReturnOfBuilder, validateMaxOptionsLength, validateRequiredParameters } from './Assertions';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder';\n\n/**\n * Represents a folder for subcommands\n *\n * For more information, go to https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups\n */\n@mix(SharedNameAndDescription)\nexport class SlashCommandSubcommandGroupBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand group\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand group\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The subcommands part of this subcommand group\n\t */\n\tpublic readonly options: SlashCommandSubcommandBuilder[] = [];\n\n\t/**\n\t * Adds a new subcommand to this group\n\t *\n\t * @param input A function that returns a subcommand builder, or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t) {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIApplicationCommandSubcommandGroupOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.SubcommandGroup,\n\t\t\tname: this.name,\n\t\t\tdescription: this.description,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandGroupBuilder extends SharedNameAndDescription {}\n\n/**\n * Represents a subcommand\n *\n * For more information, go to https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups\n */\n@mix(SharedNameAndDescription, SharedSlashCommandOptions)\nexport class SlashCommandSubcommandBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The options of this subcommand\n\t */\n\tpublic readonly options: ApplicationCommandOptionBase[] = [];\n\n\tpublic toJSON(): APIApplicationCommandSubcommandOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.Subcommand,\n\t\t\tname: this.name,\n\t\t\tdescription: this.description,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {}\n","import { z } from 'zod';\nimport { ApplicationCommandType } from 'discord-api-types/v9';\nimport type { ContextMenuCommandType } from './ContextMenuCommandBuilder';\n\nconst namePredicate = z\n\t.string()\n\t.min(1)\n\t.max(32)\n\t.regex(/^( *[\\p{L}\\p{N}_-]+ *)+$/u);\n\nconst typePredicate = z.union([z.literal(ApplicationCommandType.User), z.literal(ApplicationCommandType.Message)]);\n\nconst booleanPredicate = z.boolean();\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nexport function validateType(type: unknown): asserts type is ContextMenuCommandType {\n\ttypePredicate.parse(type);\n}\n\nexport function validateRequiredParameters(name: string, type: number) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert type is valid\n\tvalidateType(type);\n}\n","import { validateRequiredParameters, validateName, validateType, validateDefaultPermission } from './Assertions';\nimport type { ApplicationCommandType, RESTPostAPIApplicationCommandsJSONBody } from 'discord-api-types/v9';\n\nexport class ContextMenuCommandBuilder {\n\t/**\n\t * The name of this context menu command\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The type of this context menu command\n\t */\n\tpublic readonly type: ContextMenuCommandType = undefined!;\n\n\t/**\n\t * Whether the command is enabled by default when the app is added to a guild\n\t *\n\t * @default true\n\t */\n\tpublic readonly defaultPermission: boolean | undefined = undefined;\n\n\t/**\n\t * Sets the name\n\t *\n\t * @param name The name\n\t */\n\tpublic setName(name: string) {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the type\n\t *\n\t * @param type The type\n\t */\n\tpublic setType(type: ContextMenuCommandType) {\n\t\t// Assert the type is valid\n\t\tvalidateType(type);\n\n\t\tReflect.set(this, 'type', type);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * **Note**: If set to `false`, you will have to later `PUT` the permissions for this command.\n\t *\n\t * @param value Whether or not to enable this command by default\n\t *\n\t * @see https://discord.com/developers/docs/interactions/application-commands#permissions\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'defaultPermission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the final data that should be sent to Discord.\n\t *\n\t * **Note:** Calling this function will validate required properties based on their conditions.\n\t */\n\tpublic toJSON(): RESTPostAPIApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.type);\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\ttype: this.type,\n\t\t\tdefault_permission: this.defaultPermission,\n\t\t};\n\t}\n}\n\nexport type ContextMenuCommandType = ApplicationCommandType.User | ApplicationCommandType.Message;\n"],"mappings":"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","names":[]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/docs/README.md b/node_modules/@discordjs/builders/docs/README.md
new file mode 100644
index 0000000..b5a4bb0
--- /dev/null
+++ b/node_modules/@discordjs/builders/docs/README.md
@@ -0,0 +1 @@
+## [View the documentation here.](https://discord.js.org/#/docs/builders)
diff --git a/node_modules/@discordjs/builders/docs/index.yml b/node_modules/@discordjs/builders/docs/index.yml
new file mode 100644
index 0000000..2c99351
--- /dev/null
+++ b/node_modules/@discordjs/builders/docs/index.yml
@@ -0,0 +1,5 @@
+- name: General
+ files:
+ - name: Welcome
+ id: welcome
+ path: ../../README.md
diff --git a/node_modules/@discordjs/builders/node_modules/discord-api-types/LICENSE b/node_modules/@discordjs/builders/node_modules/discord-api-types/LICENSE
new file mode 100644
index 0000000..a8b1694
--- /dev/null
+++ b/node_modules/@discordjs/builders/node_modules/discord-api-types/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 vladfrangu
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/@discordjs/builders/node_modules/discord-api-types/README.md b/node_modules/@discordjs/builders/node_modules/discord-api-types/README.md
new file mode 100644
index 0000000..e0ab3b3
--- /dev/null
+++ b/node_modules/@discordjs/builders/node_modules/discord-api-types/README.md
@@ -0,0 +1,97 @@
+# Discord API Types
+
+[![GitHub](https://img.shields.io/github/license/discordjs/discord-api-types)](https://github.com/discordjs/discord-api-types/blob/main/LICENSE.md)
+[![npm](https://img.shields.io/npm/v/discord-api-types?color=crimson&logo=npm)](https://www.npmjs.com/package/discord-api-types)
+[![deno](https://img.shields.io/npm/v/discord-api-types?color=blue&label=deno&logo=deno)](https://deno.land/x/discord_api_types)
+[![Patreon Donate](https://img.shields.io/badge/patreon-donate-brightgreen.svg?label=Donate%20with%20Patreon&logo=patreon&colorB=F96854&link=https://www.patreon.com/vladfrangu)](https://www.patreon.com/vladfrangu)
+[![Ko-fi Donate](https://img.shields.io/badge/kofi-donate-brightgreen.svg?label=Donate%20with%20Ko-fi&logo=ko-fi&colorB=F16061&link=https://ko-fi.com/wolfgalvlad&logoColor=FFFFFF)](https://ko-fi.com/wolfgalvlad)
+[![GitHub Sponsors](https://img.shields.io/badge/patreon-donate-brightgreen.svg?label=Sponsor%20through%20GitHub&logo=github&colorB=F96854&link=https://github.com/sponsors/vladfrangu)](https://github.com/sponsors/vladfrangu)
+
+Simple type definitions for the [Discord API](https://discord.com/developers/docs/intro).
+
+## Installation
+
+Install with [npm](https://www.npmjs.com/) / [yarn](https://yarnpkg.com) / [pnpm](https://pnpm.js.org/):
+
+```sh
+npm install discord-api-types
+yarn add discord-api-types
+pnpm add discord-api-types
+```
+
+### Usage
+
+You can only import this module by specifying the API version you want to target. Append `/v*` to the import path, where the `*` represents the API version. Below are some examples
+
+```js
+const { APIUser } = require('discord-api-types/v9');
+```
+
+```ts
+// TypeScript/ES Module support
+import { APIUser } from 'discord-api-types/v9';
+```
+
+You may also import just certain parts of the module that you need. The possible values are: `globals`, `gateway`, `gateway/v*`, `payloads`, `payloads/v*`, `rest`, `rest/v*`, `rpc`, `rpc/v*`, `utils`, `utils/v*`, `voice`, and `voice/v*`. Below are some examples
+
+```js
+const { GatewayVersion } = require('discord-api-types/gateway/v9');
+```
+
+```ts
+// TypeScript/ES Module support
+import { GatewayVersion } from 'discord-api-types/gateway/v9';
+```
+
+> _**Note:** The `v*` exports (`discord-api-type/v*`) include the appropriate version of `gateway`, `payloads`, `rest`, `rpc`, and `utils` you specified, alongside the `globals` exports_
+
+### Deno
+
+We also provide typings compatible with the [deno](https://deno.land/) runtime. You have 3 ways you can import them:
+
+1. Directly from GitHub
+
+```ts
+// Importing a specific API version
+import { APIUser } from 'https://raw.githubusercontent.com/discordjs/discord-api-types/main/deno/v9.ts';
+```
+
+2. From [deno.land/x](https://deno.land/x)
+
+```ts
+// Importing a specific API version
+import { APIUser } from 'https://deno.land/x/discord_api_types/v9.ts';
+```
+
+3. From [skypack.dev](https://www.skypack.dev/)
+
+```ts
+// Importing a specific API version
+import { APIUser } from 'https://cdn.skypack.dev/discord-api-types/v9?dts';
+```
+
+## Project Structure
+
+The exports of each API version is split into three main parts:
+
+- Everything exported with the `API` prefix represents a payload you may get from the REST API _or_ the Gateway.
+
+- Everything exported with the `Gateway` prefix represents data that ONLY comes from or is directly related to the Gateway.
+
+- Everything exported with the `REST` prefix represents data that ONLY comes from or is directly related to the REST API.
+
+ - For endpoint options, they will follow the following structure: `REST` where the type represents what it will return.
+
+ - For example, `RESTPostAPIChannelMessageJSONBody` or `RESTGetAPIGatewayBotInfoResult`.
+
+ - Some exported types (specifically OAuth2 related ones) may not respect this entire structure due to the nature of the fields. They will start with either `RESTOAuth2` or with something similar to `RESTOAuth2`
+
+ - If a type ends with `Result`, then it represents the expected result by calling its accompanying route.
+
+ - Types that are exported as `never` usually mean the result will be a `204 No Content`, so you can safely ignore it. This does **not** account for errors.
+
+- Anything else that is miscellaneous will be exported based on what it represents (for example the `REST` route object).
+
+- There may be types exported that are identical for all versions. These will be exported as is and can be found in the `globals` file. They will still be prefixed accordingly as described above.
+
+**Warning**: This package documents just KNOWN (and documented) properties. Anything that isn't documented will NOT be added to this package (unless said properties are in an open Pull Request to Discord's [API Documentation repository](https://github.com/discord/discord-api-docs) or known through other means _and have received the green light to be used_). For clarification's sake, this means that properties that are only known through the process of data mining and have not yet been confirmed in a way as described will **NOT** be included.
diff --git a/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/common.d.ts b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/common.d.ts
new file mode 100644
index 0000000..d8bcf32
--- /dev/null
+++ b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/common.d.ts
@@ -0,0 +1,9 @@
+/**
+ * https://discord.com/developers/docs/topics/gateway#connecting-gateway-url-params
+ */
+export interface GatewayURLQuery {
+ v: string;
+ encoding: 'json' | 'etf';
+ compress?: 'zlib-stream';
+}
+//# sourceMappingURL=common.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/common.d.ts.map b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/common.d.ts.map
new file mode 100644
index 0000000..59c2f60
--- /dev/null
+++ b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/common.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["common.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,CAAC;CACzB"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/common.js b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/common.js
new file mode 100644
index 0000000..023264f
--- /dev/null
+++ b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/common.js
@@ -0,0 +1,3 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+//# sourceMappingURL=common.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/common.js.map b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/common.js.map
new file mode 100644
index 0000000..d0f541d
--- /dev/null
+++ b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/common.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"common.js","sourceRoot":"","sources":["common.ts"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.d.ts b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.d.ts
new file mode 100644
index 0000000..e5b0d5c
--- /dev/null
+++ b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.d.ts
@@ -0,0 +1,2 @@
+export * from './v9';
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.d.ts.map b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.d.ts.map
new file mode 100644
index 0000000..c1a119e
--- /dev/null
+++ b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAGA,cAAc,MAAM,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.js b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.js
new file mode 100644
index 0000000..f9a73ed
--- /dev/null
+++ b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.js
@@ -0,0 +1,16 @@
+"use strict";
+// This file exports all the types available in the recommended gateway version
+// Thereby, things MAY break in the future. Try sticking to imports from a specific version
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+__exportStar(require("./v9"), exports);
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.js.map b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.js.map
new file mode 100644
index 0000000..e8cb276
--- /dev/null
+++ b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,2FAA2F;;;;;;;;;;;;AAE3F,uCAAqB"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.mjs b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.mjs
new file mode 100644
index 0000000..fd4ff25
--- /dev/null
+++ b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/index.mjs
@@ -0,0 +1,8 @@
+import mod from "./index.js";
+
+export default mod;
+export const GatewayCloseCodes = mod.GatewayCloseCodes;
+export const GatewayDispatchEvents = mod.GatewayDispatchEvents;
+export const GatewayIntentBits = mod.GatewayIntentBits;
+export const GatewayOpcodes = mod.GatewayOpcodes;
+export const GatewayVersion = mod.GatewayVersion;
diff --git a/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/v6.d.ts b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/v6.d.ts
new file mode 100644
index 0000000..13aa6ad
--- /dev/null
+++ b/node_modules/@discordjs/builders/node_modules/discord-api-types/gateway/v6.d.ts
@@ -0,0 +1,608 @@
+/**
+ * Types extracted from https://discord.com/developers/docs/topics/gateway
+ */
+import type { APIChannel, APIEmoji, APIGuild, APIGuildMember, APIMessage, APIRole, APIUnavailableGuild, APIUser, GatewayActivity, GatewayPresenceUpdate as RawGatewayPresenceUpdate, GatewayVoiceState, InviteTargetUserType, PresenceUpdateStatus } from '../payloads/v6/index';
+export * from './common';
+/**
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare const GatewayVersion = "6";
+/**
+ * https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway-gateway-opcodes
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare enum GatewayOPCodes {
+ Dispatch = 0,
+ Heartbeat = 1,
+ Identify = 2,
+ PresenceUpdate = 3,
+ VoiceStateUpdate = 4,
+ Resume = 6,
+ Reconnect = 7,
+ RequestGuildMembers = 8,
+ InvalidSession = 9,
+ Hello = 10,
+ HeartbeatAck = 11
+}
+/**
+ * https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway-gateway-close-event-codes
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare enum GatewayCloseCodes {
+ UnknownError = 4000,
+ UnknownOpCode = 4001,
+ DecodeError = 4002,
+ NotAuthenticated = 4003,
+ AuthenticationFailed = 4004,
+ AlreadyAuthenticated = 4005,
+ InvalidSeq = 4007,
+ RateLimited = 4008,
+ SessionTimedOut = 4009,
+ InvalidShard = 4010,
+ ShardingRequired = 4011,
+ InvalidAPIVersion = 4012,
+ InvalidIntents = 4013,
+ DisallowedIntents = 4014
+}
+/**
+ * https://discord.com/developers/docs/topics/opcodes-and-status-codes#voice-voice-opcodes
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare enum VoiceOPCodes {
+ Identify = 0,
+ SelectProtocol = 1,
+ Ready = 2,
+ Heartbeat = 3,
+ SessionDescription = 4,
+ Speaking = 5,
+ HeartbeatAck = 6,
+ Resume = 7,
+ Hello = 8,
+ Resumed = 9,
+ ClientDisconnect = 13
+}
+/**
+ * https://discord.com/developers/docs/topics/opcodes-and-status-codes#voice-voice-close-event-codes
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare enum VoiceCloseCodes {
+ UnknownOpCode = 4001,
+ NotAuthenticated = 4003,
+ AuthenticationFailed = 4004,
+ AlreadyAuthenticated = 4005,
+ SessionNoLongerValid = 4006,
+ SessionTimeout = 4009,
+ ServerNotFound = 4011,
+ UnknownProtocol = 4012,
+ Disconnected = 4014,
+ VoiceServerCrashed = 4015,
+ UnknownEncryptionMode = 4016
+}
+/**
+ * https://discord.com/developers/docs/topics/gateway#list-of-intents
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare enum GatewayIntentBits {
+ GUILDS = 1,
+ GUILD_MEMBERS = 2,
+ GUILD_BANS = 4,
+ GUILD_EMOJIS = 8,
+ GUILD_INTEGRATIONS = 16,
+ GUILD_WEBHOOKS = 32,
+ GUILD_INVITES = 64,
+ GUILD_VOICE_STATES = 128,
+ GUILD_PRESENCES = 256,
+ GUILD_MESSAGES = 512,
+ GUILD_MESSAGE_REACTIONS = 1024,
+ GUILD_MESSAGE_TYPING = 2048,
+ DIRECT_MESSAGES = 4096,
+ DIRECT_MESSAGE_REACTIONS = 8192,
+ DIRECT_MESSAGE_TYPING = 16384
+}
+/**
+ * https://discord.com/developers/docs/topics/gateway#commands-and-events-gateway-events
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare enum GatewayDispatchEvents {
+ Ready = "READY",
+ Resumed = "RESUMED",
+ ChannelCreate = "CHANNEL_CREATE",
+ ChannelUpdate = "CHANNEL_UPDATE",
+ ChannelDelete = "CHANNEL_DELETE",
+ ChannelPinsUpdate = "CHANNEL_PINS_UPDATE",
+ GuildCreate = "GUILD_CREATE",
+ GuildUpdate = "GUILD_UPDATE",
+ GuildDelete = "GUILD_DELETE",
+ GuildBanAdd = "GUILD_BAN_ADD",
+ GuildBanRemove = "GUILD_BAN_REMOVE",
+ GuildEmojisUpdate = "GUILD_EMOJIS_UPDATE",
+ GuildIntegrationsUpdate = "GUILD_INTEGRATIONS_UPDATE",
+ GuildMemberAdd = "GUILD_MEMBER_ADD",
+ GuildMemberRemove = "GUILD_MEMBER_REMOVE",
+ GuildMemberUpdate = "GUILD_MEMBER_UPDATE",
+ GuildMembersChunk = "GUILD_MEMBERS_CHUNK",
+ GuildRoleCreate = "GUILD_ROLE_CREATE",
+ GuildRoleUpdate = "GUILD_ROLE_UPDATE",
+ GuildRoleDelete = "GUILD_ROLE_DELETE",
+ InviteCreate = "INVITE_CREATE",
+ InviteDelete = "INVITE_DELETE",
+ MessageCreate = "MESSAGE_CREATE",
+ MessageUpdate = "MESSAGE_UPDATE",
+ MessageDelete = "MESSAGE_DELETE",
+ MessageDeleteBulk = "MESSAGE_DELETE_BULK",
+ MessageReactionAdd = "MESSAGE_REACTION_ADD",
+ MessageReactionRemove = "MESSAGE_REACTION_REMOVE",
+ MessageReactionRemoveAll = "MESSAGE_REACTION_REMOVE_ALL",
+ MessageReactionRemoveEmoji = "MESSAGE_REACTION_REMOVE_EMOJI",
+ PresenceUpdate = "PRESENCE_UPDATE",
+ TypingStart = "TYPING_START",
+ UserUpdate = "USER_UPDATE",
+ VoiceStateUpdate = "VOICE_STATE_UPDATE",
+ VoiceServerUpdate = "VOICE_SERVER_UPDATE",
+ WebhooksUpdate = "WEBHOOKS_UPDATE"
+}
+/**
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewaySendPayload = GatewayHeartbeat | GatewayIdentify | GatewayUpdatePresence | GatewayVoiceStateUpdate | GatewayResume | GatewayRequestGuildMembers;
+/**
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayReceivePayload = GatewayHello | GatewayHeartbeatRequest | GatewayHeartbeatAck | GatewayInvalidSession | GatewayReconnect | GatewayDispatchPayload;
+/**
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayDispatchPayload = GatewayReadyDispatch | GatewayResumedDispatch | GatewayChannelModifyDispatch | GatewayChannelPinsUpdateDispatch | GatewayGuildModifyDispatch | GatewayGuildDeleteDispatch | GatewayGuildBanModifyDispatch | GatewayGuildEmojisUpdateDispatch | GatewayGuildIntegrationsUpdateDispatch | GatewayGuildMemberAddDispatch | GatewayGuildMemberRemoveDispatch | GatewayGuildMemberUpdateDispatch | GatewayGuildMembersChunkDispatch | GatewayGuildRoleModifyDispatch | GatewayGuildRoleDeleteDispatch | GatewayInviteCreateDispatch | GatewayInviteDeleteDispatch | GatewayMessageCreateDispatch | GatewayMessageUpdateDispatch | GatewayMessageDeleteDispatch | GatewayMessageDeleteBulkDispatch | GatewayMessageReactionAddDispatch | GatewayMessageReactionRemoveDispatch | GatewayMessageReactionRemoveAllDispatch | GatewayMessageReactionRemoveEmojiDispatch | GatewayPresenceUpdateDispatch | GatewayTypingStartDispatch | GatewayUserUpdateDispatch | GatewayVoiceStateUpdateDispatch | GatewayVoiceServerUpdateDispatch | GatewayWebhooksUpdateDispatch;
+/**
+ * https://discord.com/developers/docs/topics/gateway#hello
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export interface GatewayHello extends NonDispatchPayload {
+ op: GatewayOPCodes.Hello;
+ d: {
+ heartbeat_interval: number;
+ };
+}
+/**
+ * https://discord.com/developers/docs/topics/gateway#heartbeating
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export interface GatewayHeartbeatRequest extends NonDispatchPayload {
+ op: GatewayOPCodes.Heartbeat;
+ d: never;
+}
+/**
+ * https://discord.com/developers/docs/topics/gateway#heartbeating-example-gateway-heartbeat-ack
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export interface GatewayHeartbeatAck extends NonDispatchPayload {
+ op: GatewayOPCodes.HeartbeatAck;
+ d: never;
+}
+/**
+ * https://discord.com/developers/docs/topics/gateway#invalid-session
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export interface GatewayInvalidSession extends NonDispatchPayload {
+ op: GatewayOPCodes.InvalidSession;
+ d: boolean;
+}
+/**
+ * https://discord.com/developers/docs/topics/gateway#reconnect
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export interface GatewayReconnect extends NonDispatchPayload {
+ op: GatewayOPCodes.Reconnect;
+ d: never;
+}
+/**
+ * https://discord.com/developers/docs/topics/gateway#ready
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayReadyDispatch = DataPayload;
+/**
+ * https://discord.com/developers/docs/topics/gateway#resumed
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayResumedDispatch = DataPayload;
+/**
+ * https://discord.com/developers/docs/topics/gateway#channel-create
+ * https://discord.com/developers/docs/topics/gateway#channel-update
+ * https://discord.com/developers/docs/topics/gateway#channel-delete
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayChannelModifyDispatch = DataPayload;
+/**
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayChannelCreateDispatch = GatewayChannelModifyDispatch;
+/**
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayChannelUpdateDispatch = GatewayChannelModifyDispatch;
+/**
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayChannelDeleteDispatch = GatewayChannelModifyDispatch;
+/**
+ * https://discord.com/developers/docs/topics/gateway#channel-pins-update
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayChannelPinsUpdateDispatch = DataPayload;
+/**
+ * https://discord.com/developers/docs/topics/gateway#guild-create
+ * https://discord.com/developers/docs/topics/gateway#guild-update
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildModifyDispatch = DataPayload;
+/**
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildCreateDispatch = GatewayGuildModifyDispatch;
+/**
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildUpdateDispatch = GatewayGuildModifyDispatch;
+/**
+ * https://discord.com/developers/docs/topics/gateway#guild-delete
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildDeleteDispatch = DataPayload;
+/**
+ * https://discord.com/developers/docs/topics/gateway#guild-ban-add
+ * https://discord.com/developers/docs/topics/gateway#guild-ban-remove
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildBanModifyDispatch = DataPayload;
+/**
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildBanAddDispatch = GatewayGuildBanModifyDispatch;
+/**
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildBanRemoveDispatch = GatewayGuildBanModifyDispatch;
+/**
+ * https://discord.com/developers/docs/topics/gateway#guild-emojis-update
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildEmojisUpdateDispatch = DataPayload;
+/**
+ * https://discord.com/developers/docs/topics/gateway#guild-integrations-update
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildIntegrationsUpdateDispatch = DataPayload;
+/**
+ * https://discord.com/developers/docs/topics/gateway#guild-member-add
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildMemberAddDispatch = DataPayload;
+/**
+ * https://discord.com/developers/docs/topics/gateway#guild-member-remove
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildMemberRemoveDispatch = DataPayload;
+/**
+ * https://discord.com/developers/docs/topics/gateway#guild-member-update
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildMemberUpdateDispatch = DataPayload & {
+ guild_id: string;
+}>;
+/**
+ * https://discord.com/developers/docs/topics/gateway#guild-members-chunk
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildMembersChunkDispatch = DataPayload;
+/**
+ * https://discord.com/developers/docs/topics/gateway#guild-role-create
+ * https://discord.com/developers/docs/topics/gateway#guild-role-update
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildRoleModifyDispatch = DataPayload;
+/**
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildRoleCreateDispatch = GatewayGuildRoleModifyDispatch;
+/**
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildRoleUpdateDispatch = GatewayGuildRoleModifyDispatch;
+/**
+ * https://discord.com/developers/docs/topics/gateway#guild-role-delete
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayGuildRoleDeleteDispatch = DataPayload;
+/**
+ * https://discord.com/developers/docs/topics/gateway#invite-create
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayInviteCreateDispatch = DataPayload;
+/**
+ * https://discord.com/developers/docs/topics/gateway#invite-delete
+ * @deprecated Gateway v6 is deprecated and the types will not receive further updates, please update to v8.
+ */
+export declare type GatewayInviteDeleteDispatch = DataPayload