diff --git a/.editorconfig b/.editorconfig index c1e2c64..ce873b1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,3 +10,6 @@ end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true + +[*.yml] +indent_size = 2 diff --git a/.gitignore b/.gitignore index cb6e5b1..e3be25e 100644 --- a/.gitignore +++ b/.gitignore @@ -132,4 +132,4 @@ modules .stignore # config -config/EPlayer +config diff --git a/Procfile b/Procfile deleted file mode 100644 index b5ae038..0000000 --- a/Procfile +++ /dev/null @@ -1 +0,0 @@ -worker: npx reciple -D diff --git a/clearmodules.js b/clearmodules.js deleted file mode 100644 index 820fc2a..0000000 --- a/clearmodules.js +++ /dev/null @@ -1,3 +0,0 @@ -const fs = require('fs'); - -fs.rmSync('modules', { recursive: true, force: true }); diff --git a/config/BotStatus/config.yml b/config/BotStatus/config.yml deleted file mode 100644 index b25cc24..0000000 --- a/config/BotStatus/config.yml +++ /dev/null @@ -1,19 +0,0 @@ -changeInterval: 300000 -shuffleStatus: false -activities: - - activity: - name: you | e!play - type: WATCHING - status: online - - activity: - name: e!help | e!play - type: LISTENING - status: online - - activity: - name: you | /play - type: WATCHING - status: online - - activity: - name: /help | /play - type: LISTENING - status: online diff --git a/config/nocrash/config.yml b/config/nocrash/config.yml deleted file mode 100644 index ab2a303..0000000 --- a/config/nocrash/config.yml +++ /dev/null @@ -1,3 +0,0 @@ -ownerId: "749120018771345488" -reportToOwner: true -preventCrash: true diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7eae6fc --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2566 @@ +{ + "name": "e-player", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "e-player", + "license": "GPL-3.0", + "dependencies": { + "@discordjs/opus": "^0.8.0", + "discord-player": "^5.3.2", + "discord.js": "^14.7.1", + "fallout-utility": "^1.5.21", + "play-dl": "^1.9.6", + "reciple": "^6.0.0", + "soundcloud-scraper": "^5.0.3", + "spotify-url-info": "^3.1.9", + "yaml": "^2.1.3", + "youtube-sr": "^4.3.4", + "ytdl-core": "^4.11.2" + }, + "devDependencies": { + "@types/ms": "^0.7.31", + "@types/node": "^18.7.17", + "typescript": "^4.8.3" + } + }, + "node_modules/@discordjs/builders": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.4.0.tgz", + "integrity": "sha512-nEeTCheTTDw5kO93faM1j8ZJPonAX86qpq/QVoznnSa8WWcCgJpjlu6GylfINTDW6o7zZY0my2SYdxx2mfNwGA==", + "dependencies": { + "@discordjs/util": "^0.1.0", + "@sapphire/shapeshift": "^3.7.1", + "discord-api-types": "^0.37.20", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.2", + "tslib": "^2.4.1" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.37.21", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.21.tgz", + "integrity": "sha512-GB4ThibZEzWXcvgL2QfjKoDX5j1sNLWtgibodiJ9M9PM0u9bdR2t3vZ24oQWLKlksJehSJmZDtRsAibhcr46vw==" + }, + "node_modules/@discordjs/collection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.3.0.tgz", + "integrity": "sha512-ylt2NyZ77bJbRij4h9u/wVy7qYw/aDqQLWnadjvDqW/WoWCxrsX6M3CIw9GVP5xcGCDxsrKj5e0r5evuFYwrKg==", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/node-pre-gyp": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.5.tgz", + "integrity": "sha512-YJOVVZ545x24mHzANfYoy0BJX5PDyeZlpiJjDkUBM/V/Ao7TFX9lcUvCN4nr0tbr5ubeaXxtEBILUrHtTphVeQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@discordjs/opus": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.8.0.tgz", + "integrity": "sha512-uHE7OmHEmP8YM0yvsH3iSdacdeghO0qTkF0CIkV07Tg0qdyOLUVkoZHj5Zcpge9rC4qb/JvTS2xRgttSZLM43Q==", + "hasInstallScript": true, + "dependencies": { + "@discordjs/node-pre-gyp": "^0.4.4", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@discordjs/rest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.4.0.tgz", + "integrity": "sha512-k3Ip7ffFSAfp7Mu4H/3BEXFvFz+JsbXRrRtpeBMnSp1LefhtlZWJE6xdXzNlblktKNQltnRwY+z0NZrGQdxAMw==", + "dependencies": { + "@discordjs/collection": "^1.3.0", + "@discordjs/util": "^0.1.0", + "@sapphire/async-queue": "^1.5.0", + "@sapphire/snowflake": "^3.2.2", + "discord-api-types": "^0.37.20", + "file-type": "^18.0.0", + "tslib": "^2.4.1", + "undici": "^5.13.0" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/rest/node_modules/discord-api-types": { + "version": "0.37.21", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.21.tgz", + "integrity": "sha512-GB4ThibZEzWXcvgL2QfjKoDX5j1sNLWtgibodiJ9M9PM0u9bdR2t3vZ24oQWLKlksJehSJmZDtRsAibhcr46vw==" + }, + "node_modules/@discordjs/util": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.1.0.tgz", + "integrity": "sha512-e7d+PaTLVQav6rOc2tojh2y6FE8S7REkqLldq1XF4soCx74XB/DIjbVbVLtBemf0nLW77ntz0v+o5DytKwFNLQ==", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/voice": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.11.0.tgz", + "integrity": "sha512-6+9cj1dxzBJm7WJ9qyG2XZZQ8rcLl6x2caW0C0OxuTtMLAaEDntpb6lqMTFiBg/rDc4Rd59g1w0gJmib33CuHw==", + "dependencies": { + "@types/ws": "^8.5.3", + "discord-api-types": "^0.36.2", + "prism-media": "^1.3.4", + "tslib": "^2.4.0", + "ws": "^8.8.1" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@sapphire/async-queue": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", + "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/shapeshift": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.7.1.tgz", + "integrity": "sha512-JmYN/0GW49Vl8Hi4PwrsDBNjcuCylH78vWYolVys74LRIzilAAMINxx4RHQOdvYoz+ceJKVp4+zBbQ5kuIFOLw==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "lodash.uniqwith": "^4.5.0" + }, + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/snowflake": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.3.0.tgz", + "integrity": "sha512-Hec5N6zEkZuZFLybVKyLFLlcSgYmR6C1/+9NkIhxPwOf6tgX52ndJCSz8ADejmbrNE0VuNCNkpzhRZzenEC9vA==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.11.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.11.tgz", + "integrity": "sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g==" + }, + "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/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/discord-api-types": { + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" + }, + "node_modules/discord-player": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/discord-player/-/discord-player-5.3.2.tgz", + "integrity": "sha512-MVIL6VNBD9JWA0QIaqx6y7/e9a5uDjStp9zOaXvDgY291J+z7k14NU886+fYbczMPaIJYjHkVvy4TtbNdOxWFQ==", + "dependencies": { + "@discordjs/voice": "^0.11.0", + "libsodium-wrappers": "^0.7.10", + "tiny-typed-emitter": "^2.1.0", + "tslib": "^2.4.0" + }, + "funding": { + "url": "https://github.com/Androz2091/discord-player?sponsor=1" + }, + "peerDependencies": { + "soundcloud-scraper": "5.x", + "spotify-url-info": "3.x", + "youtube-sr": "4.x", + "ytdl-core": "4.x" + } + }, + "node_modules/discord.js": { + "version": "14.7.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.7.1.tgz", + "integrity": "sha512-1FECvqJJjjeYcjSm0IGMnPxLqja/pmG1B0W2l3lUY2Gi4KXiyTeQmU1IxWcbXHn2k+ytP587mMWqva2IA87EbA==", + "dependencies": { + "@discordjs/builders": "^1.4.0", + "@discordjs/collection": "^1.3.0", + "@discordjs/rest": "^1.4.0", + "@discordjs/util": "^0.1.0", + "@sapphire/snowflake": "^3.2.2", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.37.20", + "fast-deep-equal": "^3.1.3", + "lodash.snakecase": "^4.1.1", + "tslib": "^2.4.1", + "undici": "^5.13.0", + "ws": "^8.11.0" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/discord.js/node_modules/discord-api-types": { + "version": "0.37.21", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.21.tgz", + "integrity": "sha512-GB4ThibZEzWXcvgL2QfjKoDX5j1sNLWtgibodiJ9M9PM0u9bdR2t3vZ24oQWLKlksJehSJmZDtRsAibhcr46vw==" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/fallout-utility": { + "version": "1.5.21", + "resolved": "https://registry.npmjs.org/fallout-utility/-/fallout-utility-1.5.21.tgz", + "integrity": "sha512-ti6HvybOh6EVWytOIUiAFOWdN14P6xD6QRXlnx/YLJMCT2rmurffaOqRYOuhzXvQRjZdFAGN9O4YUOPmRzstqg==", + "dependencies": { + "chalk": "^4.1.2", + "prompt-sync": "^4.2.0", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/file-type": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.0.0.tgz", + "integrity": "sha512-jjMwFpnW8PKofLE/4ohlhqwDk5k0NC6iy0UHAJFKoY1fQeGMN0GDdLgHQrvCbSpMwbqzoCZhRI5dETCZna5qVA==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0", + "token-types": "^5.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/himalaya": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/himalaya/-/himalaya-1.1.0.tgz", + "integrity": "sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw==" + }, + "node_modules/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/libsodium": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", + "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" + }, + "node_modules/libsodium-wrappers": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", + "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", + "dependencies": { + "libsodium": "^0.7.0" + } + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, + "node_modules/lodash.uniqwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", + "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/m3u8stream": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz", + "integrity": "sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==", + "dependencies": { + "miniget": "^4.2.2", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miniget": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.2.tgz", + "integrity": "sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + }, + "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/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/play-audio": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/play-audio/-/play-audio-0.5.2.tgz", + "integrity": "sha512-ZAqHUKkQLix2Iga7pPbsf1LpUoBjcpwU93F1l3qBIfxYddQLhxS6GKmS0d3jV8kSVaUbr6NnOEcEMFvuX93SWQ==" + }, + "node_modules/play-dl": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/play-dl/-/play-dl-1.9.6.tgz", + "integrity": "sha512-JW44bQbME9fNfGhGXQ/rdcsHr4BfgJabVlSgpS9QY/NscfprFH1asv+q9atrZThP3+hHIpgtFNABccg9rFWlwg==", + "dependencies": { + "play-audio": "^0.5.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/prism-media": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz", + "integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==", + "peerDependencies": { + "@discordjs/opus": "^0.8.0", + "ffmpeg-static": "^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0", + "node-opus": "^0.3.3", + "opusscript": "^0.0.8" + }, + "peerDependenciesMeta": { + "@discordjs/opus": { + "optional": true + }, + "ffmpeg-static": { + "optional": true + }, + "node-opus": { + "optional": true + }, + "opusscript": { + "optional": true + } + } + }, + "node_modules/prompt-sync": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", + "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", + "dependencies": { + "strip-ansi": "^5.0.0" + } + }, + "node_modules/prompt-sync/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompt-sync/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/reciple": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/reciple/-/reciple-6.0.0.tgz", + "integrity": "sha512-RFDpZfdtgb+EW6BmcOjtlFmW3mfD1wDA3wMaYmr0DCAiqXVB4Jds3VE0StU4dR7cbK1vqH5THaK1cavfchEcVw==", + "dependencies": { + "chalk": "4.1.2", + "commander": "^9.4.1", + "dotenv": "^16.0.3", + "fallout-utility": "^1.5.17", + "micromatch": "^4.0.5", + "semver": "^7.3.7", + "yaml": "^2.1.1" + }, + "bin": { + "reciple": "dist/lib/bin.mjs" + }, + "engines": { + "node": ">=16.9.0" + }, + "peerDependencies": { + "discord.js": "^14.5.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/soundcloud-scraper": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/soundcloud-scraper/-/soundcloud-scraper-5.0.3.tgz", + "integrity": "sha512-AmS9KmK7mMaPVzHzBk40rANpAttZila3+iAet6EA47EeiTBUzVwjq4B+1LCOLtgPmzDSGk0qn+LZOEd5UhnZTQ==", + "dependencies": { + "cheerio": "^1.0.0-rc.10", + "m3u8stream": "^0.8.4", + "node-fetch": "^2.6.1" + } + }, + "node_modules/spotify-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spotify-uri/-/spotify-uri-3.0.3.tgz", + "integrity": "sha512-mMstJ4dAMki6GbUjg94kp/h9ZH+7T7+ro/KUC00WVh+WKoLgMRrTKLkWMIwCZNO53Xa8DRHQw/6jwYtRZrVI3g==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/spotify-url-info": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/spotify-url-info/-/spotify-url-info-3.1.9.tgz", + "integrity": "sha512-1iMvLEpXve8/QB8JnkbBTOOGi7UpCiQ5QJeTt+koJiMfIZIyrN+afRtRr0UOTKJp/KlAUYTJPGYDeNbqKDjIJw==", + "dependencies": { + "himalaya": "~1.1.0", + "spotify-uri": "~3.0.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-mixer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.2.tgz", + "integrity": "sha512-zvHx3VM83m2WYCE8XL99uaM7mFwYSkjR2OZti98fabHrwkjsCvgwChda5xctein3xGOyaQhtTeDq/1H/GNvF3A==" + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undici": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.13.0.tgz", + "integrity": "sha512-UDZKtwb2k7KRsK4SdXWG7ErXiL7yTGgLWvk2AXO1JMjgjh404nFo6tWSCM2xMpJwMPx3J8i/vfqEh1zOqvj82Q==", + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "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/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.3.tgz", + "integrity": "sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/youtube-sr": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/youtube-sr/-/youtube-sr-4.3.4.tgz", + "integrity": "sha512-olSYcR80XigutCrePEXBX3/RJJrWfonJQj7+/ggBiWU0CzTDLE1q8+lpWTWCG0JpzhzILp/IB/Bq/glGqqr1TQ==" + }, + "node_modules/ytdl-core": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.11.2.tgz", + "integrity": "sha512-D939t9b4ZzP3v0zDvehR2q+KgG97UTgrTKju3pOPGQcXtl4W6W5z0EpznzcJFu+OOpl7S7Ge8hv8zU65QnxYug==", + "dependencies": { + "m3u8stream": "^0.8.6", + "miniget": "^4.2.2", + "sax": "^1.1.3" + }, + "engines": { + "node": ">=12" + } + } + }, + "dependencies": { + "@discordjs/builders": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.4.0.tgz", + "integrity": "sha512-nEeTCheTTDw5kO93faM1j8ZJPonAX86qpq/QVoznnSa8WWcCgJpjlu6GylfINTDW6o7zZY0my2SYdxx2mfNwGA==", + "requires": { + "@discordjs/util": "^0.1.0", + "@sapphire/shapeshift": "^3.7.1", + "discord-api-types": "^0.37.20", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.2", + "tslib": "^2.4.1" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.21", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.21.tgz", + "integrity": "sha512-GB4ThibZEzWXcvgL2QfjKoDX5j1sNLWtgibodiJ9M9PM0u9bdR2t3vZ24oQWLKlksJehSJmZDtRsAibhcr46vw==" + } + } + }, + "@discordjs/collection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.3.0.tgz", + "integrity": "sha512-ylt2NyZ77bJbRij4h9u/wVy7qYw/aDqQLWnadjvDqW/WoWCxrsX6M3CIw9GVP5xcGCDxsrKj5e0r5evuFYwrKg==" + }, + "@discordjs/node-pre-gyp": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.5.tgz", + "integrity": "sha512-YJOVVZ545x24mHzANfYoy0BJX5PDyeZlpiJjDkUBM/V/Ao7TFX9lcUvCN4nr0tbr5ubeaXxtEBILUrHtTphVeQ==", + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + } + }, + "@discordjs/opus": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.8.0.tgz", + "integrity": "sha512-uHE7OmHEmP8YM0yvsH3iSdacdeghO0qTkF0CIkV07Tg0qdyOLUVkoZHj5Zcpge9rC4qb/JvTS2xRgttSZLM43Q==", + "requires": { + "@discordjs/node-pre-gyp": "^0.4.4", + "node-addon-api": "^5.0.0" + } + }, + "@discordjs/rest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.4.0.tgz", + "integrity": "sha512-k3Ip7ffFSAfp7Mu4H/3BEXFvFz+JsbXRrRtpeBMnSp1LefhtlZWJE6xdXzNlblktKNQltnRwY+z0NZrGQdxAMw==", + "requires": { + "@discordjs/collection": "^1.3.0", + "@discordjs/util": "^0.1.0", + "@sapphire/async-queue": "^1.5.0", + "@sapphire/snowflake": "^3.2.2", + "discord-api-types": "^0.37.20", + "file-type": "^18.0.0", + "tslib": "^2.4.1", + "undici": "^5.13.0" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.21", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.21.tgz", + "integrity": "sha512-GB4ThibZEzWXcvgL2QfjKoDX5j1sNLWtgibodiJ9M9PM0u9bdR2t3vZ24oQWLKlksJehSJmZDtRsAibhcr46vw==" + } + } + }, + "@discordjs/util": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.1.0.tgz", + "integrity": "sha512-e7d+PaTLVQav6rOc2tojh2y6FE8S7REkqLldq1XF4soCx74XB/DIjbVbVLtBemf0nLW77ntz0v+o5DytKwFNLQ==" + }, + "@discordjs/voice": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.11.0.tgz", + "integrity": "sha512-6+9cj1dxzBJm7WJ9qyG2XZZQ8rcLl6x2caW0C0OxuTtMLAaEDntpb6lqMTFiBg/rDc4Rd59g1w0gJmib33CuHw==", + "requires": { + "@types/ws": "^8.5.3", + "discord-api-types": "^0.36.2", + "prism-media": "^1.3.4", + "tslib": "^2.4.0", + "ws": "^8.8.1" + } + }, + "@sapphire/async-queue": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", + "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==" + }, + "@sapphire/shapeshift": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.7.1.tgz", + "integrity": "sha512-JmYN/0GW49Vl8Hi4PwrsDBNjcuCylH78vWYolVys74LRIzilAAMINxx4RHQOdvYoz+ceJKVp4+zBbQ5kuIFOLw==", + "requires": { + "fast-deep-equal": "^3.1.3", + "lodash.uniqwith": "^4.5.0" + } + }, + "@sapphire/snowflake": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.3.0.tgz", + "integrity": "sha512-Hec5N6zEkZuZFLybVKyLFLlcSgYmR6C1/+9NkIhxPwOf6tgX52ndJCSz8ADejmbrNE0VuNCNkpzhRZzenEC9vA==" + }, + "@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, + "@types/node": { + "version": "18.11.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.11.tgz", + "integrity": "sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g==" + }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "requires": { + "@types/node": "*" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "discord-api-types": { + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" + }, + "discord-player": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/discord-player/-/discord-player-5.3.2.tgz", + "integrity": "sha512-MVIL6VNBD9JWA0QIaqx6y7/e9a5uDjStp9zOaXvDgY291J+z7k14NU886+fYbczMPaIJYjHkVvy4TtbNdOxWFQ==", + "requires": { + "@discordjs/voice": "^0.11.0", + "libsodium-wrappers": "^0.7.10", + "tiny-typed-emitter": "^2.1.0", + "tslib": "^2.4.0" + } + }, + "discord.js": { + "version": "14.7.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.7.1.tgz", + "integrity": "sha512-1FECvqJJjjeYcjSm0IGMnPxLqja/pmG1B0W2l3lUY2Gi4KXiyTeQmU1IxWcbXHn2k+ytP587mMWqva2IA87EbA==", + "requires": { + "@discordjs/builders": "^1.4.0", + "@discordjs/collection": "^1.3.0", + "@discordjs/rest": "^1.4.0", + "@discordjs/util": "^0.1.0", + "@sapphire/snowflake": "^3.2.2", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.37.20", + "fast-deep-equal": "^3.1.3", + "lodash.snakecase": "^4.1.1", + "tslib": "^2.4.1", + "undici": "^5.13.0", + "ws": "^8.11.0" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.21", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.21.tgz", + "integrity": "sha512-GB4ThibZEzWXcvgL2QfjKoDX5j1sNLWtgibodiJ9M9PM0u9bdR2t3vZ24oQWLKlksJehSJmZDtRsAibhcr46vw==" + } + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" + }, + "fallout-utility": { + "version": "1.5.21", + "resolved": "https://registry.npmjs.org/fallout-utility/-/fallout-utility-1.5.21.tgz", + "integrity": "sha512-ti6HvybOh6EVWytOIUiAFOWdN14P6xD6QRXlnx/YLJMCT2rmurffaOqRYOuhzXvQRjZdFAGN9O4YUOPmRzstqg==", + "requires": { + "chalk": "^4.1.2", + "prompt-sync": "^4.2.0", + "strip-ansi": "^6.0.1" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "file-type": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.0.0.tgz", + "integrity": "sha512-jjMwFpnW8PKofLE/4ohlhqwDk5k0NC6iy0UHAJFKoY1fQeGMN0GDdLgHQrvCbSpMwbqzoCZhRI5dETCZna5qVA==", + "requires": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0", + "token-types": "^5.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "himalaya": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/himalaya/-/himalaya-1.1.0.tgz", + "integrity": "sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw==" + }, + "htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "libsodium": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", + "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" + }, + "libsodium-wrappers": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", + "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", + "requires": { + "libsodium": "^0.7.0" + } + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, + "lodash.uniqwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", + "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "m3u8stream": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz", + "integrity": "sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==", + "requires": { + "miniget": "^4.2.2", + "sax": "^1.2.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "miniget": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.2.tgz", + "integrity": "sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "play-audio": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/play-audio/-/play-audio-0.5.2.tgz", + "integrity": "sha512-ZAqHUKkQLix2Iga7pPbsf1LpUoBjcpwU93F1l3qBIfxYddQLhxS6GKmS0d3jV8kSVaUbr6NnOEcEMFvuX93SWQ==" + }, + "play-dl": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/play-dl/-/play-dl-1.9.6.tgz", + "integrity": "sha512-JW44bQbME9fNfGhGXQ/rdcsHr4BfgJabVlSgpS9QY/NscfprFH1asv+q9atrZThP3+hHIpgtFNABccg9rFWlwg==", + "requires": { + "play-audio": "^0.5.2" + } + }, + "prism-media": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz", + "integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==", + "requires": {} + }, + "prompt-sync": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", + "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", + "requires": { + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "requires": { + "readable-stream": "^3.6.0" + } + }, + "reciple": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/reciple/-/reciple-6.0.0.tgz", + "integrity": "sha512-RFDpZfdtgb+EW6BmcOjtlFmW3mfD1wDA3wMaYmr0DCAiqXVB4Jds3VE0StU4dR7cbK1vqH5THaK1cavfchEcVw==", + "requires": { + "chalk": "4.1.2", + "commander": "^9.4.1", + "dotenv": "^16.0.3", + "fallout-utility": "^1.5.17", + "micromatch": "^4.0.5", + "semver": "^7.3.7", + "yaml": "^2.1.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "soundcloud-scraper": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/soundcloud-scraper/-/soundcloud-scraper-5.0.3.tgz", + "integrity": "sha512-AmS9KmK7mMaPVzHzBk40rANpAttZila3+iAet6EA47EeiTBUzVwjq4B+1LCOLtgPmzDSGk0qn+LZOEd5UhnZTQ==", + "requires": { + "cheerio": "^1.0.0-rc.10", + "m3u8stream": "^0.8.4", + "node-fetch": "^2.6.1" + } + }, + "spotify-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spotify-uri/-/spotify-uri-3.0.3.tgz", + "integrity": "sha512-mMstJ4dAMki6GbUjg94kp/h9ZH+7T7+ro/KUC00WVh+WKoLgMRrTKLkWMIwCZNO53Xa8DRHQw/6jwYtRZrVI3g==" + }, + "spotify-url-info": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/spotify-url-info/-/spotify-url-info-3.1.9.tgz", + "integrity": "sha512-1iMvLEpXve8/QB8JnkbBTOOGi7UpCiQ5QJeTt+koJiMfIZIyrN+afRtRr0UOTKJp/KlAUYTJPGYDeNbqKDjIJw==", + "requires": { + "himalaya": "~1.1.0", + "spotify-uri": "~3.0.3" + } + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "requires": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "requires": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "ts-mixer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.2.tgz", + "integrity": "sha512-zvHx3VM83m2WYCE8XL99uaM7mFwYSkjR2OZti98fabHrwkjsCvgwChda5xctein3xGOyaQhtTeDq/1H/GNvF3A==" + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true + }, + "undici": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.13.0.tgz", + "integrity": "sha512-UDZKtwb2k7KRsK4SdXWG7ErXiL7yTGgLWvk2AXO1JMjgjh404nFo6tWSCM2xMpJwMPx3J8i/vfqEh1zOqvj82Q==", + "requires": { + "busboy": "^1.6.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.3.tgz", + "integrity": "sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==" + }, + "youtube-sr": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/youtube-sr/-/youtube-sr-4.3.4.tgz", + "integrity": "sha512-olSYcR80XigutCrePEXBX3/RJJrWfonJQj7+/ggBiWU0CzTDLE1q8+lpWTWCG0JpzhzILp/IB/Bq/glGqqr1TQ==" + }, + "ytdl-core": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.11.2.tgz", + "integrity": "sha512-D939t9b4ZzP3v0zDvehR2q+KgG97UTgrTKju3pOPGQcXtl4W6W5z0EpznzcJFu+OOpl7S7Ge8hv8zU65QnxYug==", + "requires": { + "m3u8stream": "^0.8.6", + "miniget": "^4.2.2", + "sax": "^1.1.3" + } + } + } +} diff --git a/package.json b/package.json index aa3c133..cd0fe3e 100644 --- a/package.json +++ b/package.json @@ -1,35 +1,30 @@ { "name": "e-player", - "version": "1.2.0", "description": "Discord music player", "author": "FalloutStudios", "license": "GPL-3.0", "scripts": { - "clean": "node clearmodules.js", - "build": "yarn run clean && npx tsc", - "test": "yarn run build && npx reciple -D -c reciple.test.yml", - "postinstall": "yarn build", + "clean": "npx rimraf modules", + "build": "npm run clean && npx tsc", + "test": "npm run build && npx rimraf config/e-player && npx reciple -D -c reciple.yml", "start": "npx reciple" }, "dependencies": { "@discordjs/opus": "^0.8.0", - "@ghextercortes/djs-pagination": "^1.0.0", - "discord-player": "^5.2.2", - "discord.js": "^13.8.1", - "fallout-utility": "^1.4.2", - "genius-lyrics": "^4.3.8", - "libsodium-wrappers": "^0.7.10", - "ms": "^2.1.3", - "opusscript": "^0.0.8", - "reciple": "^1.7.0", - "sodium": "^3.0.2", - "tweetnacl": "^1.0.3", - "yaml": "^2.1.1" + "discord-player": "^5.3.2", + "discord.js": "^14.7.1", + "fallout-utility": "^1.5.21", + "play-dl": "^1.9.6", + "reciple": "^6.0.0", + "soundcloud-scraper": "^5.0.3", + "spotify-url-info": "^3.1.9", + "yaml": "^2.1.3", + "youtube-sr": "^4.3.4", + "ytdl-core": "^4.11.2" }, "devDependencies": { "@types/ms": "^0.7.31", - "@types/node": "^18.0.3", - "axios": "^0.27.2", - "typescript": "^4.7.4" + "@types/node": "^18.7.17", + "typescript": "^4.8.3" } } diff --git a/reciple.test.yml b/reciple.test.yml deleted file mode 100644 index 35fa7e2..0000000 --- a/reciple.test.yml +++ /dev/null @@ -1,109 +0,0 @@ -# Your bot token here -# To use env variable as a token just do it like this env:env:TOKEN_ENV -token: env:TOKEN - -# Message command prefix -prefix: 'e!' - - -# Commands options -commands: - messageCommand: - # enable message commands - enabled: true - # reply when an error occured - replyOnError: true - # Allow executing commands via aliases - allowCommandAlias: true - # command argument separator - commandArgumentSeparator: ' ' - interactionCommand: - # enable interaction commands - enabled: true - # reply when an error occured - replyOnError: true - # register interaction commands on bot ready - registerCommands: true - # set required permissions for interaction commands - setRequiredPermissions: true - # register commands to specific guild(s) empty to make it global - guilds: ['876039624814899220'] - - -# Commands permissions -permissions: - messageCommands: - # enable command permissions - enabled: true - commands: [] - interactionCommands: - # enable command permissions - enabled: true - commands: [] - - -# Ignored channel IDs -ignoredChannels: - # enable ignored channels - enabled: false - # convert to only allowed channels - convertToAllowList: false - # channel IDs - channels: [] - - -# Logger options -fileLogging: - # enable console output to file - enabled: true - # enable debug mode - debugmode: false - # Client logs - clientLogs: true - # stringify logged JSONs - stringifyLoggedJSON: true - # log file path - logFilePath: './logs/latest.log' - -# Client options -client: - repliedUser: false - allowedMentions: - parse: ['users', 'roles'] - failIfNotExists: false - intents: - - 'GUILDS' - - 'GUILD_MEMBERS' - - 'GUILD_MESSAGES' - - 'GUILD_VOICE_STATES' - -# Bot replies -messages: - notEnoughArguments: 'Not enough arguments.' - noPermissions: - content: 'You do not have permission to use this command.' - ephemeral: true - error: - content: 'An error occurred.' - ephemeral: true - -# Ignored Files -ignoredFiles: [] - - -################################################### -# # -# ##### ##### # # ### ##### #### # -# # # # # # # # # # # # # -# # # ##### # # # # ### ### #### # -# # # # # # # # # # # # # -# ### # # # # ### ##### # # # -# # -################################################### -## Modifying these values below can cause errors ## - -# Modules folder -modulesFolder: 'modules' - -# Current version -version: 1.7.0 diff --git a/reciple.yml b/reciple.yml index cbb3f16..89a1612 100644 --- a/reciple.yml +++ b/reciple.yml @@ -1,56 +1,58 @@ # Your bot token here -# To use env variable as a token just do it like this env:env:TOKEN_ENV +# To use env variable as a token just do it like this env:TOKEN_ENV token: env:TOKEN -# Message command prefix -prefix: 'e!' - - # Commands options commands: - messageCommand: - # enable message commands - enabled: true - # reply when an error occured - replyOnError: true - # Allow executing commands via aliases - allowCommandAlias: true - # command argument separator - commandArgumentSeparator: ' ' - interactionCommand: + # Interaction command options + slashCommand: # enable interaction commands enabled: true # reply when an error occured - replyOnError: true + replyOnError: false + # enable the use of command cooldowns + enableCooldown: true # register interaction commands on bot ready registerCommands: true + # allow register empty list of application commands + allowRegisterEmptyCommandList: true # set required permissions for interaction commands setRequiredPermissions: true + # accept replied or deffered command interaction + acceptRepliedInteractions: false # register commands to specific guild(s) empty to make it global guilds: [] - - -# Commands permissions -permissions: - messageCommands: - # enable command permissions - enabled: true - commands: [] - interactionCommands: - # enable command permissions + # overwrite command permissions + permissions: + # enable overwriten command permissions + enabled: false + commands: + - command: example-command + permissions: + - Administrator + + # message command options + messageCommand: + # enable message commands enabled: true - commands: [] - - -# Ignored channel IDs -ignoredChannels: - # enable ignored channels - enabled: false - # convert to only allowed channels - convertToAllowList: false - # channel IDs - channels: [] - + # command prefix + prefix: '!' + # reply when an error occured + replyOnError: false + # enable the use of command cooldowns + enableCooldown: true + # allow executing commands via aliases + allowCommandAlias: true + # command argument separator + commandArgumentSeparator: ' ' + # overwrite command permissions + permissions: + # enable overwriten command permissions + enabled: false + commands: + - command: example-command + permissions: + - Administrator # Logger options fileLogging: @@ -58,52 +60,62 @@ fileLogging: enabled: true # enable debug mode debugmode: false - # Client logs + # enable if reciple will use the logger clientLogs: true # stringify logged JSONs - stringifyLoggedJSON: true + stringifyLoggedJSON: false # log file path - logFilePath: './logs/latest.log' + logFilePath: logs/latest.log # Client options +# Learn more about client options at https://discord.js.org/#/docs/discord.js/main/typedef/ClientOptions client: - repliedUser: false - allowedMentions: - parse: ['users', 'roles'] - failIfNotExists: false intents: - - 'GUILDS' - - 'GUILD_MEMBERS' - - 'GUILD_MESSAGES' - - 'GUILD_VOICE_STATES' + - Guilds + - GuildMembers + - GuildMessages + - MessageContent + - GuildVoiceStates -# Bot replies +# Bot messages messages: - notEnoughArguments: 'Not enough arguments.' + missingArguments: Not enough arguments. + invalidArguments: Invalid argument(s) given. + insufficientBotPerms: + content: Insufficient bot permissions. + ephemeral: true noPermissions: - content: 'You do not have permission to use this command.' + content: You do not have permission to use this command. + ephemeral: true + cooldown: + content: You cannot execute this command right now due to the cooldown. ephemeral: true error: - content: 'An error occurred.' + content: An error occurred. ephemeral: true # Ignored Files -ignoredFiles: [] - - -################################################### -# # -# ##### ##### # # ### ##### #### # -# # # # # # # # # # # # # -# # # ##### # # # # ### ### #### # -# # # # # # # # # # # # # -# ### # # # # ### ##### # # # -# # -################################################### -## Modifying these values below can cause errors ## +ignoredFiles: + - '_*' + - '.*' + + +#################################################### +# # +# ##### ##### # # ### ##### #### # +# # # # # # # # # # # # # +# # # ##### # # # # ### ### #### # +# # # # # # # # # # # # # +# ### # # # # ### ##### # # # +# # +#################################################### +## Modifying the values below could break reciple ## # Modules folder modulesFolder: 'modules' +# Load modules regardless of its supported versions +disableVersionCheck: false + # Current version -version: 1.7.0 +version: ^6.0.0 diff --git a/src/EPlayerCommands/clear.ts b/src/EPlayerCommands/clear.ts deleted file mode 100644 index fe8824c..0000000 --- a/src/EPlayerCommands/clear.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { GuildMember } from 'discord.js'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders } from 'reciple'; -import { EPlayer } from '../e-player'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - return [ - new InteractionCommandBuilder() - .setName('clear') - .setExecute(async command => { - const interaction = command.interaction; - const member = interaction.member as GuildMember; - const guild = interaction.guild; - if (!guild || !member) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return interaction.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - if (member.voice.channelId !== guild.me?.voice.channelId) return interaction.reply({ embeds: [Player.getMessageEmbed('InDifferentVoiceChannel')] }); - - const tracks = queue.tracks.length; - queue.clear(); - - interaction.reply({ - embeds: [ - Player.getMessageEmbed('clear', true, tracks.toString(), member.user.tag, member.user.id) - ] - }); - }), - new MessageCommandBuilder() - .setName('clear') - .addAliases('c') - .setExecute(async command => { - const message = command.message; - const member = message.member; - const guild = message.guild; - if (!guild || !member) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return message.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - if (member.voice.channelId !== guild.me?.voice.channelId) return message.reply({ embeds: [Player.getMessageEmbed('InDifferentVoiceChannel')] }); - - const tracks = queue.tracks.length; - queue.clear(); - - message.reply({ - embeds: [ - Player.getMessageEmbed('clear', true, tracks.toString(), member.user.tag, member.user.id) - ] - }); - }) - ]; -} diff --git a/src/EPlayerCommands/loop.ts b/src/EPlayerCommands/loop.ts deleted file mode 100644 index d97d97d..0000000 --- a/src/EPlayerCommands/loop.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { Queue, QueueRepeatMode } from 'discord-player'; -import { GuildMember } from 'discord.js'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders } from 'reciple'; -import { EPlayer } from '../e-player'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - const setLoop = (queue: Queue, modeString: string): boolean => { - let mode: QueueRepeatMode; - - switch (modeString) { - case 'TRACK': - mode = QueueRepeatMode.TRACK; - break; - case 'QUEUE': - mode = QueueRepeatMode.QUEUE; - break; - case 'AUTOPLAY': - mode = QueueRepeatMode.AUTOPLAY; - break; - default: - mode = QueueRepeatMode.OFF; - } - - return queue.setRepeatMode(mode); - } - - return [ - new InteractionCommandBuilder() - .setName('loop') - .addStringOption(mode => mode - .setName('mode') - .setDescription('Set loop mode.') - .setRequired(true) - .setChoices( - { - name: 'Loop currently playing track', - value: 'TRACK' - }, - { - name: 'Loop current queue', - value: 'QUEUE' - }, - { - name: 'Autoplay similar tracks', - value: 'AUTOPLAY' - }, - { - name: 'Turn off loop', - value: 'OFF' - } - ) - ) - .setExecute(async command => { - const interaction = command.interaction; - const member = interaction.member as GuildMember; - const guild = interaction.guild; - if (!guild || !member) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return interaction.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - - const mode = interaction.options.getString('mode', true); - const repeat = setLoop(queue, mode); - - interaction.reply({ - embeds: [ - Player.getMessageEmbed(repeat ? 'repeat' : 'error', repeat, mode.toUpperCase(), member.user.tag, member.user.id) - ] - }); - }), - new MessageCommandBuilder() - .setName('loop') - .addAliases('l') - .addOption(mode => mode - .setName('mode') - .setDescription('Set loop mode.') - .setRequired(true) - .setValidator(val => ['track', 'queue', 'off', 'autoplay'].some(f => f == val.toLowerCase())) - ) - .setExecute(async command => { - const message = command.message; - const member = message.member; - const guild = message.guild; - if (!guild || !member) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return message.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - - const mode = command.options.getValue('mode', true).toUpperCase(); - const repeat = setLoop(queue, mode); - - message.reply({ - embeds: [ - Player.getMessageEmbed(repeat ? 'repeat' : 'error', repeat, mode.toUpperCase(), member.user.tag, member.user.id) - ] - }); - }) - ]; -} diff --git a/src/EPlayerCommands/lyrics.ts b/src/EPlayerCommands/lyrics.ts deleted file mode 100644 index 7a849cc..0000000 --- a/src/EPlayerCommands/lyrics.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { EPlayer } from '../e-player'; - -import { ColorResolvable, Message, MessageEmbed } from 'discord.js'; -import { Client } from 'genius-lyrics'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders } from 'reciple'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - const genius = new Client(); - - const makeBold = (str: string) => str.replace(/\[([^\]]+)\]/g, '**$1**'); - const splitString = (str: string, maxLength: number) => { - let split = []; - let i = 0; - while (i < str.length) { - split.push(str.substring(i, i += maxLength)); - } - - return split; - } - - const searchLyrics = async (query: string, command: Message) => { - const song = await genius.songs.search(query).then(songs => songs.shift()).catch(() => undefined); - if (!song) return command.edit({ content: ' ', embeds: [Player.getMessageEmbed('noResults')] }); - - const fetchedLyrics = await song.lyrics().then(l => splitString(l, 4000)).catch(() => undefined); - if (!fetchedLyrics) return command.edit({ content: ' ', embeds: [Player.getMessageEmbed('noResults')] }); - - const embeds = fetchedLyrics.map((lyrics, i) => { - const embed = new MessageEmbed() - .setColor(Player.getMessage('embedColor') as ColorResolvable) - .setAuthor({ name: song?.artist.name ?? 'unknown artist', iconURL: song?.artist.thumbnail }) - .setThumbnail(song?.thumbnail ?? '') - .setURL(song?.url ?? '') - .setFooter({ text: `Lyrics provided by Genius`, iconURL: 'https://images.genius.com/ba9fba1d0cdbb5e3f8218cbf779c1a49.300x300x1.jpg' }); - - if (!i) embed.setTitle(makeBold(song?.title ?? query)); - - return embed.setDescription(makeBold(lyrics)); - }); - - return command.edit({ content: ' ', embeds: embeds.slice(0, 10) }); - } - - return [ - new InteractionCommandBuilder() - .setName('lyrics') - .addStringOption(search => search - .setName('search') - .setDescription('Search lyrics') - ) - .setExecute(async command => { - const interaction = command.interaction; - const member = interaction.member; - const guild = interaction.guild; - const search = interaction.options.getString('search') ?? undefined; - if (!guild || !member) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - await interaction.reply({ embeds: [Player.getMessageEmbed('loading', true)] }); - const reply = await interaction.fetchReply() as Message; - - if (search) return searchLyrics(search, reply); - - const queue = Player.player.getQueue(guild); - if ((!queue || queue.destroyed) && !search) return reply.edit({ embeds: [Player.getMessageEmbed('noQueue')] }); - - const nowPlaying = queue.nowPlaying(); - if (!nowPlaying) return reply.edit({ embeds: [Player.getMessageEmbed('noQueue')] }); - - searchLyrics(nowPlaying?.title, reply); - }), - new MessageCommandBuilder() - .setName('lyrics') - .addAliases('lr') - .addOption(search => search - .setName('search') - .setDescription('Search lyrics') - ) - .setExecute(async command => { - const message = command.message; - const member = message.member; - const guild = message.guild; - const search = command.command.args.join(' ') || undefined; - if (!guild || !member) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const reply = await message.reply({ embeds: [Player.getMessageEmbed('loading', true)] }); - if (search) return searchLyrics(search, reply); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed && !search) return reply.edit({ embeds: [Player.getMessageEmbed('noQueue')] }); - - const nowPlaying = queue.nowPlaying(); - if (!nowPlaying) return reply.edit({ embeds: [Player.getMessageEmbed('noQueue')] }); - - searchLyrics(nowPlaying?.title, reply); - }) - ]; -} diff --git a/src/EPlayerCommands/move.ts b/src/EPlayerCommands/move.ts deleted file mode 100644 index 879ca45..0000000 --- a/src/EPlayerCommands/move.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { Queue } from 'discord-player'; -import { GuildMember } from 'discord.js'; -import { isNumber } from 'fallout-utility'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders } from 'reciple'; -import { EPlayer } from '../e-player'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - const moveTrack = (queue: Queue, trackId: number, moveAfter: number) => { - const move = queue.tracks[trackId]; - const position = queue.getTrackPosition(moveAfter); - - queue.remove(move); - queue.insert(move, position); - - return move; - } - - return [ - new InteractionCommandBuilder() - .setName('move') - .addNumberOption(trackId => trackId - .setName('track-id') - .setDescription('Track number of the track you want to move.') - .setMinValue(1) - ) - .addNumberOption(moveAfter => moveAfter - .setName('move-after') - .setDescription('Move the selected track after the specified track id') - .setMinValue(1) - ) - .setExecute(async command => { - const interaction = command.interaction; - const member = interaction.member as GuildMember; - const guild = interaction.guild; - if (!guild || !member) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return interaction.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - - let trackId = interaction.options.getNumber('track-id', true); - let moveAfter = interaction.options.getNumber('move-after', true); - - trackId = trackId - 1 < 0 ? 0 : trackId - 1; - moveAfter = moveAfter - 1 < 0 ? 0 : moveAfter - 1; - - if (trackId > queue.tracks.length || moveAfter > queue.tracks.length) return interaction.reply({ - embeds: [Player.getMessageEmbed('trackNotFound')] - }); - - const track = moveTrack(queue, trackId, moveAfter); - interaction.reply({ - embeds: [Player.getMessageEmbed('move', true, track.title, member.user.tag, member.user.id)] - }) - }), - new MessageCommandBuilder() - .setName('move') - .addAliases('mv') - .setValidateOptions(true) - .addOption(trackId => trackId - .setName('track-id') - .setDescription('Track number of the track you want to move.') - .setValidator((val) => isNumber(val) && Number(val) >= 1) - .setRequired(true) - ) - .addOption(moveAfter => moveAfter - .setName('move-after') - .setDescription('Move the selected track after the specified track id') - .setValidator((val) => isNumber(val) && Number(val) >= 1) - .setRequired(true) - ) - .setExecute(async command => { - const message = command.message; - const member = message.member; - const guild = message.guild; - if (!guild || !member) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return message.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - - let trackId = Number(command.options.getValue('track-id', true)); - let moveAfter = Number(command.options.getValue('move-after', true)); - - trackId = isNumber(trackId) ? trackId : 0; - trackId = trackId - 1 < 0 ? 0 : trackId - 1; - moveAfter = isNumber(moveAfter) ? moveAfter : 0; - moveAfter = moveAfter - 1 < 0 ? 0 : moveAfter - 1; - - if (trackId > queue.tracks.length || moveAfter > queue.tracks.length) return message.reply({ - embeds: [Player.getMessageEmbed('trackNotFound')] - }); - - const track = moveTrack(queue, trackId, moveAfter); - message.reply({ - embeds: [Player.getMessageEmbed('move', true, track.title, member.user.tag, member.user.id)] - }) - }) - ]; -} diff --git a/src/EPlayerCommands/now-playing.ts b/src/EPlayerCommands/now-playing.ts deleted file mode 100644 index c05e88e..0000000 --- a/src/EPlayerCommands/now-playing.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Queue } from 'discord-player'; -import { ColorResolvable, GuildMember, MessageEmbed } from 'discord.js'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders } from 'reciple'; -import { EPlayer } from '../e-player'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - const getEmbed = (queue: Queue): MessageEmbed => { - const embed = new MessageEmbed().setColor(Player.getMessage('embedColor') as ColorResolvable); - const nowPlaying = queue.nowPlaying(); - - embed.setTitle(nowPlaying.title); - embed.setURL(nowPlaying.url); - embed.setThumbnail(nowPlaying.thumbnail); - embed.setDescription(queue.createProgressBar({ - line: '-', - indicator: '●', - length: 30, - timecodes: true - })) - embed.setAuthor({ - name: 'Now Playing', - iconURL: Player.client.user?.displayAvatarURL() - }); - embed.setFooter({ - text: `Requested by: ${nowPlaying.requestedBy.tag}`, - iconURL: nowPlaying.requestedBy.displayAvatarURL() - }); - - return embed; - } - - return [ - new InteractionCommandBuilder() - .setName('now-playing') - .setExecute(async command => { - const interaction = command.interaction; - const member = interaction.member as GuildMember; - const guild = interaction.guild; - - if (!guild || !member) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return interaction.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - - interaction.reply({ embeds: [getEmbed(queue)] }); - }), - new MessageCommandBuilder() - .setName('now-playing') - .addAliases('np', 'now') - .setExecute(async command => { - const message = command.message; - const member = message.member; - const guild = message.guild; - - if (!guild || !member) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return message.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - - message.reply({ embeds: [getEmbed(queue)] }); - }) - ]; -} diff --git a/src/EPlayerCommands/pause-resume.ts b/src/EPlayerCommands/pause-resume.ts deleted file mode 100644 index fd8ecc0..0000000 --- a/src/EPlayerCommands/pause-resume.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { GuildMember } from 'discord.js'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders, RecipleInteractionCommandExecute, RecipleMessageCommandExecute } from 'reciple'; -import { EPlayer } from '../e-player'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - const pauseMessageCommand = async (command: RecipleMessageCommandExecute) => { - const message = command.message; - const member = message.member; - const guild = message.guild; - if (!guild || !member) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return message.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - - const pause = Player.pauseToggle(queue); - if (pause == 'ERROR') return message.reply({ embeds: [Player.getMessageEmbed('error')] }); - - message.reply({ - embeds: [ - Player.getMessageEmbed(pause == 'PAUSED' ? 'pause' : 'resume', true, queue.nowPlaying().title, member.user.tag, member.user.id) - ] - }); - }; - - const pauseInteractionCommand = async (command: RecipleInteractionCommandExecute) => { - const interaction = command.interaction; - const member = interaction.member as GuildMember; - const guild = interaction.guild; - if (!guild || !member) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return interaction.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - - const pause = Player.pauseToggle(queue); - if (pause == 'ERROR') return interaction.reply({ embeds: [Player.getMessageEmbed('error')] }); - - interaction.reply({ - embeds: [ - Player.getMessageEmbed(pause == 'PAUSED' ? 'pause' : 'resume', true, queue.nowPlaying().title, member.user.tag, member.user.id) - ] - }); - }; - - return [ - new InteractionCommandBuilder() - .setName('pause') - .setExecute(async command => pauseInteractionCommand(command)), - new InteractionCommandBuilder() - .setName('resume') - .setExecute(async command => pauseInteractionCommand(command)), - new MessageCommandBuilder() - .setName('pause') - .setExecute(async command => pauseMessageCommand(command)), - new MessageCommandBuilder() - .setName('resume') - .setExecute(async command => pauseMessageCommand(command)), - ]; -} diff --git a/src/EPlayerCommands/play.ts b/src/EPlayerCommands/play.ts deleted file mode 100644 index 088a344..0000000 --- a/src/EPlayerCommands/play.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { QueryType } from 'discord-player'; -import { ColorResolvable, Guild, GuildMember, MessageEmbed, TextBasedChannel } from 'discord.js'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders } from 'reciple'; -import { EPlayer, EPlayerMetadata } from '../e-player'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - const play = async (query: string, guild: Guild, member: GuildMember, textChannel: TextBasedChannel): Promise => { - if (!query) return 'noQueryProvided'; - if (!member.voice.channel) return 'notInVoiceChannel'; - if (guild.me?.voice.channel && member.voice.channelId !== guild.me.voice.channelId) return 'InDifferentVoiceChannel'; - - const search = await Player.player.search(query, { - requestedBy: member.user, - searchEngine: QueryType.AUTO - }).catch(() => undefined); - - if (!search || !(search.playlist?.tracks ?? search.tracks).length) return 'noResults'; - - const queue = Player.player.createQueue(guild, { ...Player.config.settings, metadata: { textChannel } }); - const connection = !queue.connection || !guild.me?.voice.channel - ? await queue.connect(member.voice.channel).catch(() => false) - : true; - - if (!connection) { - queue.destroy(true); - return 'cantConnectToVoiceChannel'; - } - - const embed = new MessageEmbed().setColor(Player.getMessage('embedColor') as ColorResolvable); - - if (search.playlist) { - queue.addTracks(search.playlist.tracks); - - embed.setTitle(search.playlist.title); - embed.setURL(search.playlist.url); - embed.setDescription(search.playlist.description ?? ' '); - embed.setAuthor({ - name: search.playlist.type == 'playlist' ? 'Playlist' : 'Album', - iconURL: Player.client.user?.displayAvatarURL() - }); - - if (!Player.config.largeThumbnailPlayCommand) { - embed.setThumbnail(search.playlist.thumbnail); - } else { - embed.setImage(search.playlist.thumbnail); - } - } else { - const track = search.tracks[0]; - queue.addTrack(track); - - embed.setTitle(track.title); - embed.setURL(track.url); - embed.setDescription(track.description ?? ' '); - embed.setAuthor({ - name: `Track`, - iconURL: Player.client.user?.displayAvatarURL() - }); - - if (!Player.config.largeThumbnailPlayCommand) { - embed.setThumbnail(track.thumbnail); - } else { - embed.setImage(track.thumbnail); - } - } - - embed.setFooter({ - text: `Requested by ${member.user.tag}`, - iconURL: member.user.displayAvatarURL() - }); - - if (!queue.playing) queue.play().catch(err => { - Player.logger.error(`Error while trying to play queue`); - Player.logger.error(err); - }); - - return embed; - } - - return [ - new InteractionCommandBuilder() - .setName('play') - .addStringOption(query => query - .setName('query') - .setDescription('Media to play') - .setRequired(true) - ) - .setExecute(async command => { - const interaction = command.interaction; - const guild = interaction.guild; - const member = interaction.member; - const channel = interaction.channel; - const query = interaction.options.getString('query', true); - if (!guild || !member || !channel) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - await interaction.deferReply(); - - const embed = await play(query, guild, member as GuildMember, channel).catch(err => { - Player.logger.error(`An error occured while executing play command:`); - Player.logger.error(err); - - return 'unknownError'; - }); - - if (typeof embed == 'string') return interaction.editReply({ embeds: [Player.getMessageEmbed(embed)] }); - interaction.editReply({ embeds: [embed] }); - }), - new MessageCommandBuilder() - .setName('play') - .addAliases('p', 'add') - .addOption(query => query - .setName('query') - .setDescription('Media to play') - .setRequired(true) - ) - .setExecute(async command => { - const message = command.message; - const guild = message.guild; - const member = message.member; - const channel = message.channel; - const query = command.command.args.join(' ').replace(/(?:\\(.))/, '$1'); - if (!guild || !member || !channel) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const reply = await message.reply({ embeds: [Player.getMessageEmbed('loading', true)] }); - const embed = await play(query, guild, member, channel).catch(err => { - Player.logger.error(`An error occured while executing play command:`); - Player.logger.error(err); - - return 'unknownError'; - }); - - if (typeof embed == 'string') return reply.edit({ embeds: [Player.getMessageEmbed(embed)] }); - reply.edit({ embeds: [embed] }); - }) - ]; -} diff --git a/src/EPlayerCommands/previous.ts b/src/EPlayerCommands/previous.ts deleted file mode 100644 index a750dfa..0000000 --- a/src/EPlayerCommands/previous.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { GuildMember } from 'discord.js'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders } from 'reciple'; -import { EPlayer } from '../e-player'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - return [ - new InteractionCommandBuilder() - .setName('previous') - .setExecute(async command => { - const interaction = command.interaction; - const member = interaction.member as GuildMember; - const guild = interaction.guild; - if (!guild || !member) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return interaction.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - if (member.voice.channelId !== guild.me?.voice.channelId) return interaction.reply({ embeds: [Player.getMessageEmbed('InDifferentVoiceChannel')] }); - - await interaction.deferReply(); - const err = await queue.back().catch(() => true); - - interaction.editReply({ embeds: [Player.getMessageEmbed(err ? 'noTracks' : 'previous', !!err, member.user.tag, member.user.id)] }); - }), - new MessageCommandBuilder() - .setName('previous') - .addAliases('prev', 'back') - .setExecute(async command => { - const message = command.message; - const member = message.member; - const guild = message.guild; - if (!guild || !member) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return message.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - if (member.voice.channelId !== guild.me?.voice.channelId) return message.reply({ embeds: [Player.getMessageEmbed('InDifferentVoiceChannel')] }); - - const reply = await message.reply({ embeds: [Player.getMessageEmbed('loading')] }); - const err = await queue.back().catch(() => true); - - reply.edit({ embeds: [Player.getMessageEmbed(err ? 'noTracks' : 'previous', !!err, member.user.tag, member.user.id)] }); - }) - ]; -} diff --git a/src/EPlayerCommands/queue.ts b/src/EPlayerCommands/queue.ts deleted file mode 100644 index 3301bbd..0000000 --- a/src/EPlayerCommands/queue.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { ButtonType, OnDisableAction, Pagination, SendAs } from '@ghextercortes/djs-pagination'; -import { PaginationButton } from '@ghextercortes/djs-pagination/dist/util/Buttons'; -import { Queue } from 'discord-player'; -import { ColorResolvable, GuildMember, MessageButton, MessageEmbed, User } from 'discord.js'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders } from 'reciple'; -import { EPlayer } from '../e-player'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - const paginationButtons = new PaginationButton() - .addButton(ButtonType.FIRST_PAGE, new MessageButton().setCustomId('firstpage').setStyle('SECONDARY').setLabel('First')) - .addButton(ButtonType.PREVIOUS_PAGE, new MessageButton().setCustomId('previouspage').setStyle('PRIMARY').setLabel('Previous')) - .addButton(ButtonType.NEXT_PAGE, new MessageButton().setCustomId('nextpage').setStyle('SUCCESS').setLabel('Next')) - .addButton(ButtonType.LAST_PAGE, new MessageButton().setCustomId('lastpage').setStyle('SECONDARY').setLabel('Last')); - - const getEmbeds = (queue: Queue, author: User): Pagination => { - let embedDescription = `Playing: **${queue.nowPlaying()?.title || 'none'}**\n`; - let embeds: MessageEmbed[] = []; - let page = 1; - let id = 0; - let i = 0; - - for (const track of queue.tracks) { - i++; - - embedDescription += `\n\`${id + 1}.\` **${track.title}** — <@${track?.requestedBy.id}>`; - id++; - - if (i === 10 || i === queue.tracks.length) { - i = 0; - embeds.push( - new MessageEmbed() - .setAuthor({ name: `Queue`, iconURL: Player.client.user?.displayAvatarURL() }) - .setDescription(embedDescription) - .setColor(Player.getMessage('embedColor') as ColorResolvable) - .setFooter({ text: `Page ${page}`, iconURL: author.displayAvatarURL() }) - ); - embedDescription = `Playing: **${queue.nowPlaying().title || 'none'}**\n`; - page++; - } - } - - return new Pagination() - .setAuthor(author) - .setOnDisableAction(OnDisableAction.DISABLE_BUTTONS) - .setButtons(paginationButtons) - .setTimer(20000) - .addPages( - embeds.length - ? embeds - : [ - new MessageEmbed() - .setAuthor({ name: `Queue`, iconURL: Player.client.user?.displayAvatarURL() }) - .setDescription(`${embedDescription}\n*No tracks left*`) - .setColor(Player.getMessage('embedColor') as ColorResolvable) - .setFooter({ text: `Page 1`, iconURL: author.displayAvatarURL() }) - ] - ); - } - - return [ - new InteractionCommandBuilder() - .setName('queue') - .setExecute(async command => { - const interaction = command.interaction; - const member = interaction.member as GuildMember; - const guild = interaction.guild; - - if (!guild || !member) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return interaction.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - - const pagination = getEmbeds(queue, member.user); - - pagination.paginate(interaction, SendAs.REPLY_MESSAGE); - }), - new MessageCommandBuilder() - .setName('queue') - .addAliases('q') - .setExecute(async command => { - const message = command.message; - const member = message.member; - const guild = message.guild; - - if (!guild || !member) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return message.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - - const pagination = getEmbeds(queue, member.user); - - pagination.paginate(message, SendAs.REPLY_MESSAGE); - }) - ]; -} diff --git a/src/EPlayerCommands/remove.ts b/src/EPlayerCommands/remove.ts deleted file mode 100644 index a3ea529..0000000 --- a/src/EPlayerCommands/remove.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Queue, Track } from 'discord-player'; -import { GuildMember } from 'discord.js'; -import { isNumber } from 'fallout-utility'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders } from 'reciple'; -import { EPlayer } from '../e-player'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - const removeTrack = (queue: Queue, track: number): string|Track => { - track = track - 1 < 0 ? 0 : track - 1; - if (track > queue.tracks.length) return 'trackNotFound'; - - return queue.remove(track); - } - - return [ - new InteractionCommandBuilder() - .setName('remove') - .addNumberOption(skipTo => skipTo - .setName('track-id') - .setDescription('Track to remove') - .setRequired(true) - .setMinValue(1) - ) - .setExecute(async command => { - const interaction = command.interaction; - const member = interaction.member as GuildMember; - const guild = interaction.guild; - const track = interaction.options.getNumber('track-id', true); - if (!guild || !member) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return interaction.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - if (member.voice.channelId !== guild.me?.voice.channelId) return interaction.reply({ embeds: [Player.getMessageEmbed('InDifferentVoiceChannel')] }); - - const removedTrack = removeTrack(queue, track); - if (typeof removedTrack == 'string') return interaction.reply({ embeds: [Player.getMessageEmbed(removedTrack)] }); - - interaction.reply({ - embeds: [ - Player.getMessageEmbed(!!removedTrack ? 'removeTrack' : 'error', !!removedTrack, removedTrack.title, member.user.tag, member.user.id) - ] - }); - }), - new MessageCommandBuilder() - .setName('remove') - .addAliases('rm') - .setValidateOptions(true) - .addOption(skipTo => skipTo - .setName('track-id') - .setDescription('Track to remove') - .setRequired(true) - .setValidator((val) => isNumber(val) && Number(val) >= 1) - ) - .setExecute(async command => { - const message = command.message; - const member = message.member; - const guild = message.guild; - const track = isNumber(command.command.args[0]) ? Number(command.command.args[0]) : undefined; - - if (!track) return message.reply({ embeds: [Player.getMessageEmbed('isRequired', false, 'track-id')] }); - if (!guild || !member) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return message.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - if (member.voice.channelId !== guild.me?.voice.channelId) return message.reply({ embeds: [Player.getMessageEmbed('InDifferentVoiceChannel')] }); - - const removedTrack = removeTrack(queue, track); - if (typeof removedTrack == 'string') return message.reply({ embeds: [Player.getMessageEmbed(removedTrack)] }); - - message.reply({ - embeds: [ - Player.getMessageEmbed(!!removedTrack ? 'removeTrack' : 'error', !!removedTrack, removedTrack.title, member.user.tag, member.user.id) - ] - }); - }) - ]; -} diff --git a/src/EPlayerCommands/search.ts b/src/EPlayerCommands/search.ts deleted file mode 100644 index 96119b9..0000000 --- a/src/EPlayerCommands/search.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { QueryType, Track } from 'discord-player'; -import { ColorResolvable, MessageEmbed, User } from 'discord.js'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders } from 'reciple'; -import { EPlayer } from '../e-player'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - const search = async (query: string, requestedBy: User): Promise => { - query = query.replace(/(?:\\(.))/, '$1'); - - const results = await Player.player.search(query, { - requestedBy, - searchEngine: QueryType.AUTO - }).catch(() => ({ tracks: [] as Track[], playlist: null })); - - if (!results.tracks.length || results.playlist && !results.playlist.tracks.length) { - return Player.getMessageEmbed('noResults'); - } - - const embed = new MessageEmbed().setColor(Player.getMessage('embedColor') as ColorResolvable); - - embed.setAuthor({ name: results.playlist ? `Playlist` : `Tracks`, iconURL: requestedBy.client.user?.displayAvatarURL() }); - embed.setFooter({ text: `Result${!results.playlist ? 's' : ''} for "${query.slice(0, 50)}"`, iconURL: requestedBy.displayAvatarURL() }); - - if (results.playlist) { - embed.setTitle(results.playlist.title); - embed.setDescription(results.playlist.description ?? ' '); - embed.addField('Tracks', `${results.tracks.length} ${results.tracks.length > 1 ? 'Tracks' : 'Track'}`, true); - embed.setThumbnail(results.playlist.thumbnail); - embed.setURL(results.playlist.url); - - return embed; - } else { - embed.setTitle(results.tracks.length > 10 ? `Showing 10 out of ${results.tracks.length} tracks` : `${results.tracks.length} Track(s)`); - embed.setThumbnail(results.tracks[0].thumbnail); - - let description = ''; - for (const track of results.tracks) { - description += `[${track.title}](${track.url}) \`${track.duration}\`\n`; - } - - return embed.setDescription(description); - } - }; - - return [ - new InteractionCommandBuilder() - .setName('search') - .addStringOption(query => query - .setName('query') - .setDescription('Search query.') - .setRequired(true) - ) - .setExecute(async command => { - const interaction = command.interaction; - const member = interaction.member; - const guild = interaction.guild; - const query = interaction.options.getString('query', true); - if (!guild || !member) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - await interaction.deferReply(); - const embed = await search(query, member.user as User); - - interaction.reply({ embeds: [embed] }); - }), - new MessageCommandBuilder() - .setName('search') - .addAliases('s', 'find') - .addOption(query => query - .setName('query') - .setDescription('Search query.') - .setRequired(true) - ) - .setExecute(async command => { - const message = command.message; - const member = message.member; - const guild = member?.guild; - const query = command.command.args.join(' '); - if (!guild || !member) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const reply = await message.reply({ embeds: [Player.getMessageEmbed('loading')] }); - const embed = await search(query, member.user); - - reply.edit({ embeds: [embed] }); - }) - ]; -} diff --git a/src/EPlayerCommands/shuffle.ts b/src/EPlayerCommands/shuffle.ts deleted file mode 100644 index d9dc7cb..0000000 --- a/src/EPlayerCommands/shuffle.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { GuildMember } from 'discord.js'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders } from 'reciple'; -import { EPlayer } from '../e-player'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - return [ - new InteractionCommandBuilder() - .setName('shuffle') - .setExecute(async command => { - const interaction = command.interaction; - const member = interaction.member as GuildMember; - const guild = interaction.guild; - if (!guild || !member) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return interaction.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - if (member.voice.channelId !== guild.me?.voice.channelId) return interaction.reply({ embeds: [Player.getMessageEmbed('InDifferentVoiceChannel')] }); - - const shuffle = queue.shuffle(); - interaction.reply({ - embeds: [ - Player.getMessageEmbed(shuffle ? 'shuffle' : 'error', !!shuffle, member.user.tag, member.user.id) - ] - }); - }), - new MessageCommandBuilder() - .setName('shuffle') - .addAliases('sh', 'rand', 'random') - .setExecute(async command => { - const message = command.message; - const member = message.member; - const guild = message.guild; - if (!guild || !member) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return message.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - if (member.voice.channelId !== guild.me?.voice.channelId) return message.reply({ embeds: [Player.getMessageEmbed('InDifferentVoiceChannel')] }); - - const shuffle = queue.shuffle(); - message.reply({ - embeds: [ - Player.getMessageEmbed(shuffle ? 'shuffle' : 'error', !!shuffle, member.user.tag, member.user.id) - ] - }); - }) - ]; -} diff --git a/src/EPlayerCommands/skip.ts b/src/EPlayerCommands/skip.ts deleted file mode 100644 index c26175e..0000000 --- a/src/EPlayerCommands/skip.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Queue } from 'discord-player'; -import { GuildMember } from 'discord.js'; -import { isNumber } from 'fallout-utility'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders } from 'reciple'; -import { EPlayer } from '../e-player'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - const skip = (queue: Queue, track?: number): string|boolean => { - if (track) track = track - 1 < 0 ? 0 : track - 1; - if (track && track > queue.tracks.length) return 'trackNotFound'; - - const isSkipped = typeof track !== 'undefined' ? queue.skipTo(track) : queue.skip(); - return isSkipped === undefined ? true : isSkipped; - } - - return [ - new InteractionCommandBuilder() - .setName('skip') - .addNumberOption(skipTo => skipTo - .setName('skip-to') - .setDescription('Skip to track number') - .setMinValue(1) - ) - .setExecute(async command => { - const interaction = command.interaction; - const member = interaction.member as GuildMember; - const guild = interaction.guild; - const track = interaction.options.getNumber('skip-to') ?? undefined; - if (!guild || !member) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return interaction.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - if (member.voice.channelId !== guild.me?.voice.channelId) return interaction.reply({ embeds: [Player.getMessageEmbed('InDifferentVoiceChannel')] }); - - const skippedTrack = queue.nowPlaying(); - const skipped = skip(queue, track); - - if (typeof skipped == 'string') return interaction.reply({ embeds: [Player.getMessageEmbed(skipped)] }); - - interaction.reply({ - embeds: [ - Player.getMessageEmbed(skipped ? 'skip' : 'error', skipped, skippedTrack.title, member.user.tag, member.user.id) - ] - }); - }), - new MessageCommandBuilder() - .setName('skip') - .addAliases('next') - .setValidateOptions(true) - .addOption(skipTo => skipTo - .setName('skip-to') - .setDescription('Skip to track number') - .setValidator((val) => isNumber(val) && Number(val) >= 1) - ) - .setExecute(async command => { - const message = command.message; - const member = message.member; - const guild = message.guild; - const track = isNumber(command.command.args[0]) ? Number(command.command.args[0]) : undefined; - if (!guild || !member) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return message.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - if (member.voice.channelId !== guild.me?.voice.channelId) return message.reply({ embeds: [Player.getMessageEmbed('InDifferentVoiceChannel')] }); - - const skippedTrack = queue.nowPlaying(); - const skipped = skip(queue, track); - - if (typeof skipped == 'string') return message.reply({ embeds: [Player.getMessageEmbed(skipped)] }); - - message.reply({ - embeds: [ - Player.getMessageEmbed(skipped ? 'skip' : 'error', skipped, skippedTrack.title, member.user.tag, member.user.id) - ] - }); - }) - ]; -} diff --git a/src/EPlayerCommands/stop.ts b/src/EPlayerCommands/stop.ts deleted file mode 100644 index a554155..0000000 --- a/src/EPlayerCommands/stop.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { EPlayer } from '../e-player'; - -import { GuildMember } from 'discord.js'; -import { InteractionCommandBuilder, MessageCommandBuilder, recipleCommandBuilders } from 'reciple'; - -export default (Player: EPlayer): recipleCommandBuilders[] => { - return [ - new InteractionCommandBuilder() - .setName('stop') - .setExecute(async command => { - const interaction = command.interaction; - const guild = interaction.guild; - const member = interaction.member as GuildMember; - if (!guild || !member) return interaction.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return interaction.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - if (member.voice.channelId !== guild.me?.voice.channelId) return interaction.reply({ embeds: [Player.getMessageEmbed('InDifferentVoiceChannel')] }); - - queue.stop(); - interaction.reply({ embeds: [Player.getMessageEmbed('stop', true, member.user.tag, member.user.id)] }); - }), - new MessageCommandBuilder() - .setName('stop') - .setExecute(async command => { - const message = command.message; - const guild = message.guild; - const member = message.member; - if (!guild || !member) return message.reply({ embeds: [Player.getMessageEmbed('notAMember')] }); - - const queue = Player.player.getQueue(guild); - if (!queue || queue.destroyed) return message.reply({ embeds: [Player.getMessageEmbed('noQueue')] }); - if (member.voice.channelId !== guild.me?.voice.channelId) return message.reply({ embeds: [Player.getMessageEmbed('InDifferentVoiceChannel')] }); - - queue.stop(); - message.reply({ embeds: [Player.getMessageEmbed('stop', true, member.user.tag, member.user.id)] }); - }) - ]; -} diff --git a/src/_createConfig.ts b/src/_createConfig.ts deleted file mode 100644 index 39576be..0000000 --- a/src/_createConfig.ts +++ /dev/null @@ -1,16 +0,0 @@ -import fs from 'fs'; -import yml from 'yaml'; -import path from 'path'; - -export function createConfig(configPath: string, defaultData: string|{}|any[]): string { - if (fs.existsSync(configPath)) return fs.readFileSync(configPath, 'utf8'); - - const filename = path.extname(configPath); - const data = typeof defaultData === 'object' && (filename == '.yml' || filename == '.yaml') ? yml.stringify(defaultData) : defaultData; - - fs.mkdirSync(path.dirname(configPath), { recursive: true }); - fs.writeFileSync(configPath, typeof data === 'object' ? JSON.stringify(data, null, 2) : `${data}`); - if (fs.existsSync(configPath)) return fs.readFileSync(configPath, 'utf8'); - - throw new Error(`Failed to create config file at ${configPath}`); -} diff --git a/src/bot-status.ts b/src/bot-status.ts deleted file mode 100644 index 246825d..0000000 --- a/src/bot-status.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { ActivitiesOptions, PresenceStatusData } from 'discord.js'; -import { Logger } from 'fallout-utility'; -import ms from 'ms'; -import path from 'path'; -import { RecipleClient, RecipleScript } from 'reciple'; -import yml from 'yaml'; -import { createConfig } from './_createConfig'; - -export interface BotStatusConfig { - shuffleStatus: boolean; - changeInterval: string|number; - activities: { - status: PresenceStatusData; - activity: ActivitiesOptions; - }[]; -} - -export class BotStatus implements RecipleScript { - public versions: string = '1.7.x'; - public config: BotStatusConfig = BotStatus.getConfig(); - public activities: BotStatusConfig["activities"] = []; - public currentStatus: number = 0; - public logger!: Logger; - - public onStart(client: RecipleClient): boolean { - this.logger = client.logger.cloneLogger({ loggerName: 'BotStatus' }); - - return true; - } - - public onLoad(client: RecipleClient): void { - const activities = !this.config.shuffleStatus - ? this.config.activities - : this.config.activities.map(value => ({ value, sort: Math.random() })) - .sort((a, b) => a.sort - b.sort) - .map(({ value }) => value); - - if (!activities.length) return; - - this.activities = activities; - this.updateStatus(client, this.activities.length > 1); - } - - public updateStatus(client: RecipleClient, repeat: boolean = false): void { - const status = this.activities[this.currentStatus ?? 0]; - if (!status) return; - - this.logger.debug(`Changing status`); - client.user?.setPresence({ - activities: [status.activity], - status: status.status - }); - - this.logger.debug(`Status updated!`); - this.currentStatus = this.currentStatus >= this.activities.length ? 0 : this.currentStatus + 1; - - if (repeat && this.activities.length) setTimeout(() => this.updateStatus(client, repeat), typeof this.config.changeInterval == 'number' ? this.config.changeInterval : ms(this.config.changeInterval)); - } - - public static getConfig(): BotStatusConfig { - const configPath = path.join(process.cwd(), 'config/BotStatus/config.yml'); - const defaultConfig: BotStatusConfig = { - changeInterval: 60 * 1000 * 5, - shuffleStatus: false, - activities: [ - { - activity: { - name: 'Music', - type: 'PLAYING', - }, - status: 'online' - } - ] - }; - - return yml.parse(createConfig(configPath, defaultConfig)); - } -} - -export default new BotStatus(); diff --git a/src/contribute.ts b/src/contribute.ts deleted file mode 100644 index 0953054..0000000 --- a/src/contribute.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { InteractionCommandBuilder, MessageCommandBuilder, RecipleClient, recipleCommandBuilders, RecipleScript } from 'reciple'; -import { ColorResolvable, MessageActionRow, MessageButton, MessageEmbed } from 'discord.js'; -import player from './e-player'; - -export class Contribute implements RecipleScript { - public versions: string = '1.7.x'; - public commands?: recipleCommandBuilders[] = []; - public category: string = '🪄 Miscellaneous'; - - public onStart(client: RecipleClient): boolean { - this.commands = [ - new MessageCommandBuilder() - .setName('contribute') - .addAliases('github') - .setDescription('Contribute to this bot.') - .setExecute(async command => command.message.reply(this.getMessage(client))), - new InteractionCommandBuilder() - .setName('contribute') - .setDescription('Contribute to this bot.') - .setExecute(async command => command.interaction.reply(this.getMessage(client))) - ]; - - return true; - } - - public getMessage(client: RecipleClient) { - return { - embeds: [ - new MessageEmbed() - .setAuthor({ name: `Contribute`, iconURL: client.user?.displayAvatarURL() }) - .setColor(player.getMessage('embedColor') as ColorResolvable) - .setTitle(`${client.user?.username} is open source!`) - .setThumbnail(`https://avatars.githubusercontent.com/u/88924248?s=200&v=4`) - .setDescription(`Click the link below to view source code.`) - ], - components: [ - new MessageActionRow() - .setComponents( - new MessageButton() - .setLabel(`View Source Code`) - .setEmoji(`<:github:857030640100442133>`) - .setURL('https://github.com/FalloutStudios/e-player') - .setStyle('LINK') - ) - ] - }; - } -} - -export default new Contribute(); diff --git a/src/e-player.ts b/src/e-player.ts deleted file mode 100644 index c91ec77..0000000 --- a/src/e-player.ts +++ /dev/null @@ -1,364 +0,0 @@ -import { createConfig } from './_createConfig'; - -import { Player, PlayerInitOptions, PlayerOptions, Queue, Track } from 'discord-player'; -import { Awaitable, ColorResolvable, GuildMember, Message, MessageActionRow, MessageButton, MessageEmbed, TextBasedChannel } from 'discord.js'; -import { escapeRegExp, Logger, replaceAll, trimChars } from 'fallout-utility'; -import { existsSync, mkdirSync, readdirSync } from 'fs'; -import path from 'path'; -import { RecipleClient, recipleCommandBuilders, RecipleScript } from 'reciple'; -import yml from 'yaml'; - -export interface EPlayerConfig { - ignoredCommands: string[]; - largeThumbnailPlayCommand: boolean; - destroyQueueOnEmpty: boolean; - nowPlayingMessage: { - enabled: boolean; - addButtons: boolean; - largeThumbnail: boolean; - deletedSentPlayedMessage: boolean; - }; - commandDescriptions: { - [commandName: string]: string; - }; - player: PlayerInitOptions; - settings: PlayerOptions; - messages: { - [messageKey: string]: string; - } -} - -export interface EPlayerMetadata { - textChannel: TextBasedChannel; -} - -export type PlayerCommandModule = (Player: EPlayer) => Awaitable<(recipleCommandBuilders)[]>; - -export class EPlayer implements RecipleScript { - public versions: string = '1.7.x'; - public config: EPlayerConfig = EPlayer.getConfig(); - public commands: recipleCommandBuilders[] = []; - public category: string = '🎶 Music'; - public modules: PlayerCommandModule[] = []; - public client!: RecipleClient; - public logger!: Logger; - public player!: Player; - - public async onStart(client: RecipleClient): Promise { - this.client = client; - this.logger = this.client.logger.cloneLogger({ loggerName: 'EPlayer' }); - this.player = new Player(this.client, this.config.player); - - this.logger.log(`Starting E Player...`); - await this.loadCommands(); - - this.commands = this.commands.map(c => c.setDescription(this.config.commandDescriptions[c.name] ?? EPlayer.getDefaultCommandDescriptions()[c.name] ?? 'No description provided')); - this.commands = this.commands.filter(c => !this.config.ignoredCommands.some(i => i.toLowerCase() == c.name.toLowerCase())); - - this.player.on('connectionError', (queue, error) => this.connectionError(queue as Queue, error)); - this.player.on('error', (queue, error) => this.connectionError(queue as Queue, error)); - this.player.on('debug', (queue, message) => this.logger.debug(`${queue.id}: ${message}`)) - this.player.on('trackStart', (queue, track) => this.nowPlayingMessage(queue as Queue, track)); - this.player.on('queueEnd', queue => (this.config.destroyQueueOnEmpty && !queue.destroyed ? queue.stop() : void 0)); - - return true; - } - - public async onLoad(): Promise { - this.logger.log(`Loaded E Player!`); - } - - public async nowPlayingMessage(queue: Queue, track: Track): Promise { - this.logger?.debug(`Track started queue ${queue.id} in guild ${queue.guild.name}: ${track.title}`); - if (!queue.metadata?.textChannel || !this.config.nowPlayingMessage.enabled) return; - - const embed = new MessageEmbed().setColor(this.getMessage('embedColor') as ColorResolvable); - - embed.setAuthor({ name: `Now playing`, iconURL: this.client.user?.displayAvatarURL() }); - embed.setFooter({ text: `Requested by ${track.requestedBy.tag}`, iconURL: track.requestedBy.displayAvatarURL() }); - embed.setTitle(track.title); - embed.setURL(track.url); - - if (!this.config.nowPlayingMessage.largeThumbnail) { - embed.setThumbnail(track.thumbnail); - } else { - embed.setImage(track.thumbnail); - } - - const message = await queue.metadata.textChannel.send({ embeds: [embed], components: [EPlayer.playerButtons()] }).catch(() => {}); - if (!message) return; - - const collector = this.addPlayingCollector(message, track, queue); - - queue.connection.once('start', (a) => { - if (a.metadata.id === track.id) return; - collector.stop(); - - this.logger?.debug(`Track ended queue ${queue.id} in guild ${queue.guild.name}: ${track.title}`); - }); - - queue.connection.once('finish', (a) => { - if (a.metadata.id !== track.id) return; - collector.stop(); - - this.logger?.debug(`Track ended queue ${queue.id} in guild ${queue.guild.name}: ${track.title}`); - }); - } - - public addPlayingCollector(message: Message, track: Track, queue: Queue) { - const collector = message.createMessageComponentCollector({ - filter: (c) => ['player-pause-toggle', 'player-previous', 'player-skip', 'player-stop'].includes(c.customId) - }); - - collector.on('collect', async (c) => { - if (queue.destroyed) { - collector.stop(); - await c.deferUpdate().catch(() => {}); - return; - } - - if (queue.nowPlaying().id !== track.id) { - collector.stop(); - await c.deferUpdate().catch(() => {}); - return; - } - - if ((c.member as GuildMember).voice.channelId !== queue.connection.channel.id) { - await c.deferUpdate().catch(() => {}); - return; - } - - await c.deferReply().catch(() => {}); - - switch (c.customId) { - case 'player-pause-toggle': - const pause = this.pauseToggle(queue); - if (pause == 'ERROR') { - c.editReply({ embeds: [this.getMessageEmbed('error')] }).catch(() => {}); - break; - } - - c.editReply({ embeds: [this.getMessageEmbed(pause == 'PAUSED' ? 'pause' : 'resume', true, track.title, c.user.tag, c.user.id)] }).catch(() => {}); - break; - case 'player-previous': - const errPrev = await queue.back().catch(() => true); - - c.editReply({ embeds: [this.getMessageEmbed(errPrev ? 'noTracks' : 'previous', !errPrev, c.user.tag, c.user.id)] }); - break; - case 'player-skip': - const skip = queue.skip(); - - c.editReply({ embeds: [this.getMessageEmbed(skip ? 'skip' : 'error', skip, track.title, c.user.tag, c.user.id)] }).catch(() => {}); - break; - case 'player-stop': - queue.stop(); - c.editReply({ embeds: [this.getMessageEmbed('stop', true, c.user.tag, c.user.id)] }).catch(() => {}); - } - }); - - collector.on('end', async () => { - if (this.config.nowPlayingMessage.deletedSentPlayedMessage) { - message.delete().catch(() => {}); - return; - } - - await message.edit({ components: [EPlayer.playerButtons(true)] }).catch(() => {}); - }); - - return collector; - } - - public connectionError(queue: Queue, error: Error) { - const channel = queue.metadata?.textChannel; - - this.logger.debug(`ERROR: Connection Error: ${queue.id}`); - this.logger.debug(error); - - if (!queue.destroyed) queue.stop(); - if (channel) channel.send({ embeds: [this.getMessageEmbed('connectionError', false, error.message, error.name)] }).catch(() => {}); - } - - public pauseToggle(queue: Queue): 'PAUSED'|'RESUMED'|'ERROR' { - if (!queue.connection.paused && queue.setPaused(true)) { - return 'PAUSED'; - } else if (queue.connection.paused && queue.setPaused(false)) { - return 'RESUMED'; - } else { - return 'ERROR'; - } - } - - public getMessageEmbed(messageKey: string, positive: boolean = false, ...placeholders: string[]): MessageEmbed { - let message = this.getMessage(messageKey, ...placeholders); - const embed = new MessageEmbed() - .setColor(( - positive - ? this.getMessage('embedColor') - : this.getMessage('errorEmbedColor') - ) as ColorResolvable); - - if (message.toLowerCase().startsWith('description:')) { - message = `\n${trimChars(message, 'description:')}`; - } else if (message.toLowerCase().startsWith('author:')) { - message = replaceAll(trimChars(message, 'author:'), '\n', '\\n'); - } - - if (message.includes('\n')) { - embed.setDescription(message); - } else { - embed.setAuthor({ name: message, iconURL: this.client.user?.displayAvatarURL() }) - } - - return embed; - } - - public getMessage(messageKey: string, ...placeholders: string[]): string { - let message = this.config.messages[messageKey] ?? EPlayer.getDefaultMessages()[messageKey] ?? messageKey; - if (!placeholders?.length) return message; - - for (let i=0; i < placeholders.length; i++) { - message = replaceAll(message, [`{${i}}`, `%${i}%`].map(p => escapeRegExp(p)), [placeholders[i], placeholders[i]]); - } - - return message; - } - - public async loadCommands(): Promise { - const commandDir = path.join(__dirname, 'EPlayerCommands/'); - if (!existsSync(commandDir)) mkdirSync(commandDir, { recursive: true }); - - const commandFiles = readdirSync(commandDir) - .filter(f => f.endsWith('.js') || f.endsWith('.ts')) - .map(f => path.join(__dirname, 'EPlayerCommands/', f)); - - this.logger.log(`${commandFiles.length} Player command module(s) found!`); - - for (const commandFile of commandFiles) { - this.logger.debug(`Loading ${commandFile}`); - - try { - const commandInit = require(commandFile); - const command: PlayerCommandModule|undefined = typeof commandInit?.default == 'undefined' ? commandInit : commandInit.default; - if (typeof command == 'undefined') throw new Error('Command is undefined'); - - this.commands.push(...(await command(this))); - this.modules.push(command); - - this.logger.debug(`Loaded ${commandFile}`); - } catch (err) { - this.logger.error(`Error loading player command module ${commandFile}`); - this.logger.error(err); - } - } - } - - public static getConfig(): EPlayerConfig { - const configPath = path.join(process.cwd(), 'config/EPlayer/config.yml'); - const defaultConfig: EPlayerConfig = { - ignoredCommands: [], - largeThumbnailPlayCommand: true, - destroyQueueOnEmpty: true, - nowPlayingMessage: { - enabled: true, - addButtons: true, - largeThumbnail: false, - deletedSentPlayedMessage: false - }, - commandDescriptions: this.getDefaultCommandDescriptions(), - settings: { - autoSelfDeaf: true, - disableVolume: true, - leaveOnEmpty: true, - leaveOnEmptyCooldown: 10000, - leaveOnEnd: true, - leaveOnStop: true, - spotifyBridge: true, - }, - player: { - connectionTimeout: 10000 - }, - messages: this.getDefaultMessages() - }; - - return yml.parse(createConfig(configPath, defaultConfig)); - } - - public static getDefaultCommandDescriptions(): EPlayerConfig["commandDescriptions"] { - return { - play: "Play media.", - pause: "Toggle pause currently playing media.", - resume: "Toggle resume currently playing media.", - shuffle: "Shuffle tracks in queue.", - loop: 'Set loop mode for this queue.', - lyrics: "Search or get lyrics of currently playing media.", - clear: "Clear tracks in queue.", - 'now-playing': "Show current playing media.", - remove: "Remove track from queue.", - previous: "Play previous track.", - move: 'Move track to another position.', - stop: "Stop playing and clear queue.", - queue: "Show queue tracks", - search: "Search tracks." - }; - } - - public static getDefaultMessages(): EPlayerConfig["messages"] { - return { - embedColor: '#de111e', - errorEmbedColor: 'RED', - loading: 'Please wait...', - connectionError: 'Bot has experienced a connection error', - noQueryProvided: 'Enter a search query or link', - notInVoiceChannel: 'Join a voice channel', - InDifferentVoiceChannel: 'You are not in my current voice channel', - noResults: 'No results found', - cantConnectToVoiceChannel: 'Cant connect to voice channel', - notAMember: 'Command not available', - unknownError: 'Unknown error occurred', - trackNotFound: 'Track not found', - isRequired: 'description:\`{0}\` is required', - invalid: 'description:Invalid **{0}** value', - error: 'Error occurred', - noQueue: 'No queue available', - noTracks: 'No tracks left', - clear: 'description:<@{2}> cleared `{0} track(s)`', - skip: 'description:<@{2}> skipped **{0}**', - move: 'description:<@{2}> moved **{0}**', - pause: 'description:<@{2}> paused **{0}**', - resume: 'description:<@{2}> resumed **{0}**', - repeat: 'description:<@{2}> set loop mode to `{0}`', - removeTrack: `description:<@{2}> removed **{0}** from queue`, - shuffle: `description:<@{1}> shuffled the queue`, - previous: `description:<@{1}> playing previous track`, - stop: `description:<@{1}> stopped the player` - }; - } - - public static playerButtons(disabled: boolean = false): MessageActionRow { - return new MessageActionRow() - .setComponents( - new MessageButton() - .setCustomId('player-pause-toggle') - .setLabel('Pause/Resume') - .setStyle('PRIMARY') - .setDisabled(disabled), - new MessageButton() - .setCustomId('player-previous') - .setLabel('Previous') - .setStyle('SECONDARY') - .setDisabled(disabled), - new MessageButton() - .setCustomId('player-skip') - .setLabel('Skip') - .setStyle('SECONDARY') - .setDisabled(disabled), - new MessageButton() - .setCustomId('player-stop') - .setLabel('Stop') - .setStyle('DANGER') - .setDisabled(disabled) - ); - } -} - -export default new EPlayer(); diff --git a/src/eplayer.ts b/src/eplayer.ts new file mode 100644 index 0000000..1129a94 --- /dev/null +++ b/src/eplayer.ts @@ -0,0 +1,68 @@ +import { Player, Queue } from 'discord-player'; +import { Awaitable, Interaction, TextBasedChannel, TextChannel } from 'discord.js'; +import { Logger } from 'fallout-utility'; +import { AnyCommandBuilder, AnyCommandData, cwd, path, RecipleClient, RecipleScript } from 'reciple'; +import defaultConfig, { Config } from './eplayer/config'; +import { createYmlFile, getMessageEmbed, loadCommandFiles } from './eplayer/util'; + +export interface EPlayerMetadata { + textChannel?: TextBasedChannel; +} + +export class EPlayer implements RecipleScript { + public versions: string[] = ['^6']; + public commands: (AnyCommandBuilder|AnyCommandData)[] = []; + public client!: RecipleClient; + public logger!: Logger; + public player!: Player; + public config: Config = createYmlFile(path.join(cwd, 'config/eplayer/config.yml'), defaultConfig); + public interactionHandlers: ((interaction: Interaction) => Awaitable)[] = []; + + public async onStart(client: RecipleClient): Promise { + this.client = client; + this.logger = client.logger.cloneLogger({ loggerName: 'EPlayer' }); + + this.logger.log(`Starting EPlayer...`); + this.player = new Player(client, this.config.playerOptions); + + return true; + } + + public async onLoad(client: RecipleClient): Promise { + this.commands = await loadCommandFiles(path.join(__dirname, 'eplayer/commands/')); + + client.on('interactionCreate', async interaction => { + await Promise.all(this.interactionHandlers.map(f => Promise.resolve(f(interaction)).catch(err => this.logger.err(err)))) + }); + + this.player.on('error', async (_queue, error) => { + this.logger.err(`An error occured:`, error); + + const queue = _queue as Queue; + if (!queue.destroyed) queue.stop(); + + await queue.metadata?.textChannel?.send({ + embeds: [getMessageEmbed('unexpectedError', false)] + }).catch(() => null); + }); + + this.player.on('connectionError', async (_queue, error) => { + this.logger.err(`A connection error occured:`, error); + + const queue = _queue as Queue; + if (!queue.destroyed) queue.stop(); + + await queue.metadata?.textChannel?.send({ + embeds: [getMessageEmbed('connectionError', false)] + }).catch(() => null); + }); + + this.logger.log(`Loaded ${this.commands.length} commands`, `Loaded EPlayer!`); + } + + public async onUnload(reason: unknown, client: RecipleClient): Promise { + this.logger.log(`Unloaded EPlayer!`); + } +} + +export default new EPlayer(); diff --git a/src/eplayer/commands/play.ts b/src/eplayer/commands/play.ts new file mode 100644 index 0000000..091cc41 --- /dev/null +++ b/src/eplayer/commands/play.ts @@ -0,0 +1,50 @@ +import { QueryType } from 'discord-player'; +import { GuildMember } from 'discord.js'; +import { EPlayer } from '../../eplayer'; +import { createSlashCommand, getMessageEmbed, isOfficialSound, play } from '../util'; + +export default (eplayer: EPlayer) => { + eplayer.interactionHandlers.push(async interaction => { + if (!interaction.isAutocomplete() || interaction.commandName !== 'play') return; + + const query = interaction.options.getFocused().trim(); + if (!query.length) return interaction.respond([]); + + const results = (await eplayer.player.search(query, { + requestedBy: interaction.user + })).tracks.filter(track => isOfficialSound(track.title)).slice(0, 15); + + await interaction.respond( + results.map(r => ({ + name: r.title, + value: r.url + })) + ); + }); + + return [ + createSlashCommand() + .setName('play') + .setDescription('Enter a search term to add the result to queue') + .addStringOption(search => search + .setName('search') + .setDescription('Search song query') + .setAutocomplete(true) + .setRequired(true) + ) + .setExecute(async ({ interaction }) => { + if (!interaction.inCachedGuild() || !interaction.channel || interaction.channel.isDMBased()) { + await interaction.reply({ embeds: [getMessageEmbed('notInGuild')] }); + return; + } + + const member = interaction.member as GuildMember; + const query = interaction.options.getString('search', true); + + await interaction.deferReply(); + const embed = await play(query, member, interaction.channel); + + await interaction.editReply({ embeds: [embed] }); + }) + ]; +} diff --git a/src/eplayer/config.ts b/src/eplayer/config.ts new file mode 100644 index 0000000..17c5025 --- /dev/null +++ b/src/eplayer/config.ts @@ -0,0 +1,20 @@ +import { PlayerOptions, PlayerInitOptions } from 'discord-player'; +import { PermissionResolvable } from 'discord.js'; +import messages from './messages'; + +export interface BaseConfigType { + playerOptions: PlayerOptions & PlayerInitOptions; + requiredVoiceChannelPermissions: PermissionResolvable; + messages: typeof messages, + [k: string]: any +} + +export const defaultConfig = { + playerOptions: {}, + requiredVoiceChannelPermissions: ['Connect', 'Speak'], + messages, + e: 'e' +} satisfies BaseConfigType; + +export type Config = typeof defaultConfig & BaseConfigType; +export default defaultConfig; diff --git a/src/eplayer/messages.ts b/src/eplayer/messages.ts new file mode 100644 index 0000000..55533ae --- /dev/null +++ b/src/eplayer/messages.ts @@ -0,0 +1,25 @@ +import { ColorResolvable } from 'discord.js'; + +export interface BaseMessagesType { + embedColor: ColorResolvable; + errorEmbedColor: ColorResolvable; + [k: string]: any +} + +export const defaultMessages = { + embedColor: 'Red', + errorEmbedColor: 'Grey', + unexpectedError: 'An unexpected error occured', + connectionError: 'A connection error occured', + noSearchQuery: 'Invalid search term', + noSearchResults: 'No results found', + notInGuild: 'You can only use this in a server', + noVoiceChannelPermissions: 'description:**Bot has no permissions to connect to** {0}', + notInVoiceChannel: 'You need to be in a voice channel', + inDifferentVoiceChannel: 'I\'m already in another voice channel', + cantConnectVoiceChannel: 'description:**Unable to connect to** {0}', + playbackError: 'description:Couldn\'t play **{0}**' +} satisfies BaseMessagesType; + +export type Messages = typeof defaultMessages & BaseMessagesType; +export default defaultMessages; diff --git a/src/eplayer/util.ts b/src/eplayer/util.ts new file mode 100644 index 0000000..459ab80 --- /dev/null +++ b/src/eplayer/util.ts @@ -0,0 +1,160 @@ +import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'fs'; +import yml from 'yaml'; +import { Awaitable, EmbedBuilder, GuildMember, normalizeArray, RestOrArray, TextBasedChannel, User } from 'discord.js'; +import eplayer, { EPlayerMetadata } from '../eplayer'; +import { AnyCommandBuilder, AnyCommandData, MessageCommandBuilder, path, SlashCommandBuilder } from 'reciple'; +import messages from './messages'; +import { escapeRegExp, replaceAll, trimChars } from 'fallout-utility'; +import { PlayerOptions, Playlist, Track } from 'discord-player'; +import playdl from 'play-dl'; + +export async function play(query: string, author: GuildMember, textChannel?: TextBasedChannel, options?: PlayerOptions): Promise { + if (!query) return getMessageEmbed('noSearchQuery', false); + + const guild = author.guild; + const me = guild.members.me; + + if (!guild || !me) return getMessageEmbed('notInGuild', false); + if (!author.voice.channel) return getMessageEmbed('notInVoiceChannel', false); + if (me.voice.channel && author.voice.channel.id !== me.voice.channel.id) return getMessageEmbed('inDifferentVoiceChannel', false); + if (!author.voice.channel.permissionsFor(me).has(eplayer.config.requiredVoiceChannelPermissions)) return getMessageEmbed('noVoiceChannelPermissions'); + + const results = await eplayer.player.search(query, { requestedBy: author }).catch(() => null); + const tracks = results?.playlist ? results.playlist.tracks : results?.tracks.filter(track => isOfficialSound(track.title)); + + if (!tracks || !tracks?.length) return getMessageEmbed('noSearchResults'); + + const queue = eplayer.player.createQueue(guild, { + ...eplayer.config.player, + ...options, + metadata: {textChannel} + }); + + const connection = queue.connection ?? await queue.connect(author.voice.channel).catch(() => null); + + if (!connection) { + if (!queue.destroyed) queue.stop(); + + return getMessageEmbed('cantConnectVoiceChannel', false, author.voice.channel.toString()); + } + + queue.addTracks(tracks); + + let playError = false; + + if (!queue.playing) await queue.play().catch(() => playError = true); + + return playError ? getMessageEmbed('playbackError', false, (results?.playlist ?? tracks[0]).title) : createQueueEmbed(results?.playlist ?? tracks[0], author.user); +} + +export function createQueueEmbed(details: Track|Playlist, requestedBy: User, embed?: EmbedBuilder): EmbedBuilder { + embed = embed ?? new EmbedBuilder().setColor(getMessage('embedColor')); + + embed + .setURL(details.url) + .setTitle(details.title) + .setThumbnail(details.thumbnail) + .setDescription(details.description || ' ') + .setAuthor({ name: typeof details.author === 'string' ? details.author : details.author.name }) + .setFooter({ + text: `Requested by ${requestedBy.tag}`, + iconURL: requestedBy.displayAvatarURL() + }); + + return embed; +} + +export function getMessageEmbed(key: K, positive: boolean = true, ...placeholders: RestOrArray): EmbedBuilder { + const originalMessage = getMessage(key, ...normalizeArray(placeholders)); + let message: string = (originalMessage as any)?.toString !== undefined ? (originalMessage as any).toString() : String(originalMessage); + + const embed = new EmbedBuilder() + .setColor(positive ? getMessage('embedColor') : getMessage('errorEmbedColor')); + + if (message.toLowerCase().startsWith('description:')) { + message = `\n${trimChars(message, 'description:')}`; + } else if (message.toLowerCase().startsWith('author:')) { + message = replaceAll(trimChars(message, 'author:'), '\n', '\\n'); + } + + if (message.includes('\n')) { + embed.setDescription(message); + } else { + embed.setAuthor({ name: message, iconURL: eplayer.client.user?.displayAvatarURL() }) + } + + return embed; +} + +export function getMessage(key: K, ...placeholders: RestOrArray): (typeof messages)[K] { + let message = messages[key]; + + placeholders = normalizeArray(placeholders); + + if (placeholders.length && typeof message === 'string') { + for (let i=0; i < placeholders.length; i++) { + message = replaceAll(message, [`{${i}}`, `%${i}%`].map(p => escapeRegExp(p)), [placeholders[i], placeholders[i]]) as (typeof messages)[K]; + } + } + + return message; +} + +export async function loadCommandFiles(dir: string, filter?: (file: string) => Awaitable): Promise<(AnyCommandBuilder|AnyCommandData)[]> { + if (!existsSync(dir)) { + mkdirSync(dir, { recursive: true }); + return []; + } + + const files = readdirSync(dir).filter(file => filter ? filter(file) : file.endsWith('.js') || file.endsWith('.mjs') || file.endsWith('.cjs')).map(file => path.join(dir, file)); + const commands: (AnyCommandBuilder|AnyCommandData)[] = []; + + for (const file of files) { + try { + const resolve = await import((path.isAbsolute(file) ? 'file://' : '') + file); + const command = resolve?.default + ? typeof resolve.default === 'function' + ? resolve.default + : resolve.default?.default + : resolve; + + if (typeof command !== 'function') throw new Error('Default export is not a function'); + + commands.push(...await command(eplayer)); + } catch (err) { + eplayer.logger.err(`Couldn't load command: ${file}`, err); + } + } + + return commands; +} + +export function createYmlFile(file: string, contents: T): T { + if (existsSync(file)) { + const contents = readFileSync(file, 'utf-8'); + + return yml.parse(contents); + } + + mkdirSync(path.dirname(file), { recursive: true }); + writeFileSync(file, yml.stringify(contents)); + + return contents; +} + +export function createSlashCommand(builder?: SlashCommandBuilder): SlashCommandBuilder { + return (builder ?? new SlashCommandBuilder()) + .setCooldown(3000) + .setDMPermission(false); +} + +export function createMessageCommand(builder?: MessageCommandBuilder): MessageCommandBuilder { + return (builder ?? new MessageCommandBuilder()) + .setCooldown(3000) + .setAllowExecuteInDM(false); +} + +export function isOfficialSound(title: string): boolean { + title = title.toLowerCase().trim(); + return title.toLowerCase().includes('lyric') || title.toLowerCase().includes('official') && ['sound', 'video', 'music', 'visualizer'].some(keyword => title.includes(keyword)); +} diff --git a/src/help.ts b/src/help.ts deleted file mode 100644 index feeb919..0000000 --- a/src/help.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { hasPermissions, MessageCommandBuilder, RecipleClient, recipleCommandBuilders, RecipleScript } from 'reciple'; -import { ColorResolvable, GuildMember, MessageEmbed } from 'discord.js'; -import player from './e-player'; - -export class HelpCommand implements RecipleScript { - public versions: string = '1.7.x'; - public commands: recipleCommandBuilders[] = []; - - public async onStart(client: RecipleClient): Promise { - this.commands = [ - new MessageCommandBuilder() - .setName('help') - .addAliases('h') - .setDescription('Show message commands') - .addOption(filter => filter - .setName('filter') - .setDescription('Filter commands') - ) - .setExecute(async command => { - const message = command.message; - const member = message.member; - const filter = command.options.getValue('filter') ?? undefined; - const embed = this.getCommand(client, filter ?? '') ?? this.getAll(client, filter, member ?? undefined); - - message.reply({ embeds: [embed], failIfNotExists: false }); - }) - ]; - - return true; - } - - public getAll(client: RecipleClient, filter?: string, member?: GuildMember): MessageEmbed { - const categories: { [category: string]: MessageCommandBuilder[] } = {}; - const embed = new MessageEmbed() - .setColor(player.getMessage('embedColor') as ColorResolvable) - .setAuthor({ name: `Commands`, iconURL: client.user?.displayAvatarURL() }) - .setDescription(`**Prefix:** \`${client.config.prefix}\`\n` + (filter ? `**Results for:** \`${filter}\`\n\n` : '\n')); - - for (const script of Object.values(client.modules.map(s => s.script)) as (RecipleScript & { category?: string })[]) { - if (!script.category) continue; - - let commands = (script.commands?.filter(c => c.builder == 'MESSAGE_COMMAND' && (filter ? c.name.includes(filter) : true)) as MessageCommandBuilder[]) ?? []; - commands = !member ? commands : commands.filter(c => hasPermissions(c.name, member.permissions, client.config.permissions.messageCommands)); - - if (!commands.length) continue; - if (!categories[script.category]) { - categories[script.category] = commands; - } else { - categories[script.category].push(...commands); - } - } - - for (const category in categories) { - const commands = categories[category]; - embed.addField(category, commands.map(c => '`'+ c.name +'`').join(' '), false); - } - - return embed; - } - - public getCommand(client: RecipleClient, name: string): MessageEmbed|void { - const command = client.commands.MESSAGE_COMMANDS[name] ?? Object.values(client.commands.MESSAGE_COMMANDS).find(c => c.aliases.includes(name)); - if (!command) return; - - const embed = new MessageEmbed() - .setColor(player.getMessage('embedColor') as ColorResolvable) - .setAuthor({ name: `Command Info`, iconURL: client.user?.displayAvatarURL() }) - .setDescription(`**Command:** \`${command.name}\`\n**Description:**\n\`\`\`\n${command.description}\n\`\`\`\n**Aliases:**\n\`${command.aliases.join('` `') || 'None'}\``); - - for (const option of command.options) { - embed.addField(`**${option.name}** \` ${option.required ? 'REQUIRED' : 'OPTIONAL'} \``, `${option.description}`, true); - } - - return embed; - } -} - -export default new HelpCommand(); diff --git a/src/invite.ts b/src/invite.ts deleted file mode 100644 index c8d534a..0000000 --- a/src/invite.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { ColorResolvable, MessageActionRow, MessageButton, MessageEmbed } from 'discord.js'; -import { InteractionCommandBuilder, MessageCommandBuilder, RecipleClient, recipleCommandBuilders, RecipleScript } from 'reciple'; -import player from './e-player'; - -export class Invite implements RecipleScript { - public versions: string = '1.7.x'; - public commands: recipleCommandBuilders[] = []; - public category: string = '🪄 Miscellaneous'; - public message!: { embeds: MessageEmbed[], components: MessageActionRow[] }; - - public async onStart(): Promise { - this.commands = [ - new InteractionCommandBuilder() - .setName('invite') - .setDescription('Get bot invite link.') - .setExecute(async command => { - command.interaction.reply({ ...this.message, ephemeral: true }); - }), - new MessageCommandBuilder() - .setName('invite') - .addAliases('inv') - .setDescription('Get bot invite link.') - .setExecute(async command => { - command.message.reply({ ...this.message }); - }) - ]; - - return true; - } - - public onLoad(client: RecipleClient): void { - this.message = { - embeds: [ - new MessageEmbed() - .setColor(player.getMessage('embedColor') as ColorResolvable) - .setAuthor({ name: 'Invite', iconURL: client.user?.displayAvatarURL() }) - .setDescription(`Click the link below to invite me to your server!`) - ], - components: [ - new MessageActionRow() - .setComponents( - new MessageButton() - .setStyle('LINK') - .setLabel('Bot Invite') - .setURL(`https://discord.com/api/oauth2/authorize?client_id=986850355897851914&permissions=274944321856&scope=bot+applications.commands`) - ) - ] - }; - } -} - -export default new Invite(); diff --git a/src/nocrash.ts b/src/nocrash.ts deleted file mode 100644 index 72c15de..0000000 --- a/src/nocrash.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { MessageCommandBuilder, RecipleClient, recipleCommandBuilders, RecipleScript } from 'reciple'; -import { Logger } from 'fallout-utility'; -import { User, MessageEmbed } from 'discord.js'; -import path from 'path'; -import yml from 'yaml'; -import { createConfig } from './_createConfig'; - -export interface NoCrashConfig { - ownerId: string; - reportToOwner: boolean; - preventCrash: boolean; -} - -export class NoCrash implements RecipleScript { - public versions: string = '1.7.x'; - public config: NoCrashConfig = NoCrash.getConfig(); - public commands: recipleCommandBuilders[] = []; - public logger?: Logger; - public owner?: User; - protected preventedCrashes: number = 0; - protected recentPreventedCrash: any; - - public onStart(client: RecipleClient) { - this.commands = [ - new MessageCommandBuilder() - .setName('crash-reports') - .setDescription('Show crash reports info.') - .setExecute(async command => { - const message = command.message; - - if (message.author.id !== this.owner?.id) { - return message.reply('You do not have permissions to execute this command.'); - } - - const err = this.recentPreventedCrash?.stack - ? this.recentPreventedCrash.stack - : `${this.recentPreventedCrash?.toString()}`; - - message.reply({ - embeds: [ - new MessageEmbed() - .setAuthor({ name: `Crash Reports`,iconURL: client.user?.displayAvatarURL() }) - .setDescription(' ') - .addField(`Config`, `\`\`\`json\n${JSON.stringify(this.config, null, 2)}\`\`\``) - .addField(`Recent Crash Report`, `\`\`\`js\n${this.recentPreventedCrash ? err : 'None'}\n\`\`\``) - .setFooter({ text: `Prevented Crashes: ${this.preventedCrashes || 'None'}` }) - ] - }); - }) - ]; - - return true; - } - - public async onLoad(client: RecipleClient) { - this.logger = client.logger.cloneLogger({ loggerName: 'NoCrash' }); - - if (this.config.reportToOwner && this.config.ownerId) { - this.logger.info('Attempting to find owner...'); - - const owner = client.users.cache.find(u => u.id == this.config.ownerId || u.tag == this.config.ownerId) || await client.users.fetch(this.config.ownerId).catch(() => undefined) || undefined; - if (owner) { - this.logger.info(`Found owner: ${owner.tag}`); - this.owner = owner; - } else { - this.logger.warn(`Could not find owner with id ${this.config.ownerId}`); - } - } - - this.logger.warn('Anti Crash Enabled!'); - - process.on('uncaughtException', async (err) => { - await this.reportCrash(err); - if (!this.config.preventCrash) process.exit(1); - }); - process.on('unhandledRejection', async (err) => { - await this.reportCrash(err); - if (!this.config.preventCrash) process.exit(1); - }); - } - - public async reportCrash(message: any) { - this.logger?.error('Crash Detected! Ignore this message if it does not appear to be fatal.'); - this.logger?.error(message); - - this.preventedCrashes++; - this.recentPreventedCrash = message; - - if (!this.config.reportToOwner || !this.config.ownerId) return; - - const embed = new MessageEmbed() - .setAuthor({ name: this.config.preventCrash ? 'Crash Detected!' : 'Uncaught Exception' }) - .setColor('RED') - .setDescription(`**Message:** ${message.message}\n\`\`\`\n${message.stack}\n\`\`\``) - .setTimestamp(); - - await this.owner?.send({ embeds: [embed] }).catch(err => { - this.logger?.error(`Failed to send crash report to owner: ${err.message}`); - this.logger?.error(err); - }); - } - - public static getConfig(): NoCrashConfig { - const configPath = path.join(process.cwd(), 'config/nocrash/config.yml'); - const defaultConfig = { ownerId: '', reportToOwner: false, preventCrash: true }; - - return yml.parse(createConfig(configPath, defaultConfig)); - } -} - -export default new NoCrash(); diff --git a/src/ping.ts b/src/ping.ts deleted file mode 100644 index 4af67e6..0000000 --- a/src/ping.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { ColorResolvable, Message, MessageEmbed } from 'discord.js'; -import { getRandomKey } from 'fallout-utility'; -import ms from 'ms'; -import { InteractionCommandBuilder, MessageCommandBuilder, RecipleClient, RecipleScript } from 'reciple'; -import player from './e-player'; - -export default new (class implements RecipleScript { - public versions: string = '1.7.x'; - public category: string = '🪄 Miscellaneous'; - public commands: (MessageCommandBuilder|InteractionCommandBuilder)[] = []; - - public onStart(client: RecipleClient) { - this.commands = [ - new MessageCommandBuilder() - .setName('ping') - .addAliases('pong') - .setDescription('Pong!') - .setExecute(async command => { - const message = command.message; - const reply = await message.reply({ - embeds: [ - new MessageEmbed() - .setAuthor({ name: player.getMessage('loading'), iconURL: client.user?.displayAvatarURL() }) - .setColor(player.getMessage('embedColor') as ColorResolvable) - ] - }); - - reply.edit({ embeds: [this.getEmbed(client, reply)] }); - }), - new InteractionCommandBuilder() - .setName('ping') - .setDescription('Shows bot latency') - .setExecute(async command => { - const interaction = command.interaction; - - await interaction.deferReply(); - - const reply = await interaction.fetchReply() as Message; - await interaction.editReply({ embeds: [this.getEmbed(client, reply)] }); - }) - ]; - - return true; - } - - public getEmbed(client: RecipleClient, reply: Message) { - const latency = Date.now() - reply.createdTimestamp; - const apiLatency = client.ws.ping; - - return new MessageEmbed() - .setAuthor({ name: 'Pong!', iconURL: client.user?.displayAvatarURL() }) - .setDescription(`\`\`\`bash\nBot Latency: ${ms(latency < 0 ? 0 : latency, { long: true })}\nWS Latency: ${ms(apiLatency < 0 ? 0 : apiLatency, { long: true })}\nUptime: ${ms(process.uptime() * 1000, { long: true })}\`\`\``) - .setColor(player.getMessage('embedColor') as ColorResolvable); - } -})(); diff --git a/tsconfig.json b/tsconfig.json index 2fbb590..b825fc3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,13 +3,14 @@ "src/**/*" ], "compilerOptions": { - "target": "es2016", - "module": "commonjs", + "target": "ESNext", + "module": "Node16", "rootDir": "./src", "outDir": "./modules", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, + "sourceMap": true, "skipLibCheck": true } } diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 603a6e8..0000000 --- a/yarn.lock +++ /dev/null @@ -1,1126 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@discordjs/builders@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.14.0.tgz#1915af10fa1c30d738b08b1ed0ae3c224fd491d7" - integrity sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ== - dependencies: - "@sapphire/shapeshift" "^3.1.0" - "@sindresorhus/is" "^4.6.0" - discord-api-types "^0.33.3" - fast-deep-equal "^3.1.3" - ts-mixer "^6.0.1" - tslib "^2.4.0" - -"@discordjs/collection@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.7.0.tgz#1a6c00198b744ba2b73a64442145da637ac073b8" - integrity sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA== - -"@discordjs/node-pre-gyp@^0.4.4": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.4.tgz#33eea1038784ffc5715ef775e4f9d6cffaa96c73" - integrity sha512-x569MMtdk6jdGo2S58iiZoyv4p/N2Ju8Nh6vvzZb1wyouV7IE3VuU0hg2kqUmTfD0z6r4uD6acvMTuc+iA3f8g== - dependencies: - detect-libc "^2.0.0" - https-proxy-agent "^5.0.0" - make-dir "^3.1.0" - node-fetch "^2.6.7" - nopt "^5.0.0" - npmlog "^5.0.1" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.11" - -"@discordjs/opus@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@discordjs/opus/-/opus-0.8.0.tgz#dae2d220a7942736343021f9af2b2b921d482c46" - integrity sha512-uHE7OmHEmP8YM0yvsH3iSdacdeghO0qTkF0CIkV07Tg0qdyOLUVkoZHj5Zcpge9rC4qb/JvTS2xRgttSZLM43Q== - dependencies: - "@discordjs/node-pre-gyp" "^0.4.4" - node-addon-api "^5.0.0" - -"@discordjs/voice@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.8.0.tgz#5d790fc25b883698f6eb7762efe1af00b6440947" - integrity sha512-o0JfVLMs3eLjUzPf6oxMydEeum40I7xzfUc66SLN+RrKpSAsTbngf5qnCF53nm+KDNSvrwg1AZqNm4LEAdxJIA== - dependencies: - "@types/ws" "^8.2.0" - discord-api-types "^0.26.1" - prism-media "^1.3.2" - tiny-typed-emitter "^2.1.0" - tslib "^2.3.1" - ws "^8.4.2" - -"@ghextercortes/djs-pagination@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@ghextercortes/djs-pagination/-/djs-pagination-1.0.0.tgz#acc25a83165819566ec1bc43e5dac8558039f39e" - integrity sha512-7oMbZPWq6XUN0yVQqLSA+roaOEuxGLTvplakFVxy+LwUhYRL6u455mMH4qQ/TaUgwaXTafE+bvpWKwbAQmVg2A== - -"@sapphire/async-queue@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.3.1.tgz#9d861e626dbffae02d808e13f823d4510e450a78" - integrity sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g== - -"@sapphire/shapeshift@^3.1.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.2.0.tgz#f26298ed472e73ee89e0a164c9f98305676bf101" - integrity sha512-asNgE5Ooil2/oGIAj6vZMoUc2ZFED0TGYD7jwvZsjHPQZBEh9ITj94ca4bCgiCR1s2ER/UjzykH+5wE3ebVZnQ== - -"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@szmarczak/http-timer@^4.0.5": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" - -"@types/cacheable-request@^6.0.1": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" - integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "*" - "@types/node" "*" - "@types/responselike" "*" - -"@types/http-cache-semantics@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" - integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== - -"@types/json-buffer@~3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64" - integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ== - -"@types/keyv@*": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" - integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== - dependencies: - "@types/node" "*" - -"@types/ms@^0.7.31": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== - -"@types/node-fetch@^2.6.1": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" - integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== - dependencies: - "@types/node" "*" - form-data "^3.0.0" - -"@types/node@*": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a" - integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA== - -"@types/node@^18.0.3": - version "18.0.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.3.tgz#463fc47f13ec0688a33aec75d078a0541a447199" - integrity sha512-HzNRZtp4eepNitP+BD6k2L6DROIDG4Q0fm4x+dwfsr6LGmROENnok75VGw40628xf+iR24WeMFcHuuBDUAzzsQ== - -"@types/prompt-sync@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@types/prompt-sync/-/prompt-sync-4.1.1.tgz#c3a2a6e974110b2ff4d703d19ed0c0a1b85bc65b" - integrity sha512-ww0S+dKSnuiO+PstYQM7yyxEkl2Y0r5lhg/g/p4ObA6m4OWsXdtuQtB+ORj/+lQ5U5OeLNNnmYVaWVB/y2JjdA== - -"@types/responselike@*", "@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== - dependencies: - "@types/node" "*" - -"@types/ws@^8.2.0", "@types/ws@^8.5.3": - version "8.5.3" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" - integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== - dependencies: - "@types/node" "*" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ansi-regex@^5.0.0, ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -"aproba@^1.0.3 || ^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - -are-we-there-yet@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" - integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axios@^0.27.2: - version "0.27.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== - dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - -cacheable-request@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" - integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - -chalk@4.1.2, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -cheerio-select@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" - integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== - dependencies: - boolbase "^1.0.0" - css-select "^5.1.0" - css-what "^6.1.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - -cheerio@^1.0.0-rc.10, cheerio@^1.0.0-rc.9: - version "1.0.0-rc.11" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.11.tgz#1be84be1a126958366bcc57a11648cd9b30a60c2" - integrity sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag== - dependencies: - cheerio-select "^2.1.0" - dom-serializer "^2.0.0" - domhandler "^5.0.3" - domutils "^3.0.1" - htmlparser2 "^8.0.1" - parse5 "^7.0.0" - parse5-htmlparser2-tree-adapter "^7.0.0" - tslib "^2.4.0" - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q== - dependencies: - mimic-response "^1.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-support@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^9.3.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.3.0.tgz#f619114a5a2d2054e0d9ff1b31d5ccf89255e26b" - integrity sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw== - -compress-brotli@^1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/compress-brotli/-/compress-brotli-1.3.8.tgz#0c0a60c97a989145314ec381e84e26682e7b38db" - integrity sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ== - dependencies: - "@types/json-buffer" "~3.0.0" - json-buffer "~3.0.1" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -console-control-strings@^1.0.0, console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - -cross-fetch@~3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -debug@4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -defer-to-connect@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -detect-libc@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" - integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== - -discord-api-types@^0.26.1: - version "0.26.1" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.26.1.tgz#726f766ddc37d60da95740991d22cb6ef2ed787b" - integrity sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ== - -discord-api-types@^0.33.3: - version "0.33.5" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.33.5.tgz#6548b70520f7b944c60984dca4ab58654d664a12" - integrity sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg== - -discord-player@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/discord-player/-/discord-player-5.2.2.tgz#ecc2396b787e78dea01006def14ed9280d6702ff" - integrity sha512-YtGGRNv2597rwzoR4UQPEaa1BNNspxvxl0qli34Jj8ZKYqlS2n5FXFChmYIw9dd/7vI5I+e78BSD7nQcPcFUJw== - dependencies: - "@discordjs/voice" "^0.8.0" - discord-ytdl-core "^5.0.4" - libsodium-wrappers "^0.7.9" - soundcloud-scraper "^5.0.2" - spotify-url-info "^2.2.5" - tiny-typed-emitter "^2.1.0" - youtube-sr "^4.1.13" - ytdl-core "^4.10.0" - -discord-ytdl-core@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/discord-ytdl-core/-/discord-ytdl-core-5.0.4.tgz#84a2af1a8e8c235b4fc109b23350d12782ab66cd" - integrity sha512-O+G9wuCw5TERR9iHZFMYnYQbs/ZGudDc9cxa1OKSV5TdcBYrHGS1JqvE90ZvSQ6SmS4XvqtOf/Okls6yiGJ3sg== - dependencies: - prism-media "^1.2.9" - -discord.js@^13.8.1: - version "13.8.1" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.8.1.tgz#37627154a887ac395ca72dd814bc7366776bb90a" - integrity sha512-jOsD+4tEZWWx0RHVyH+FBcqoTrsL+d5Mm5p+ULQOdU0qSaxhLNkWYig+yDHNZoND7nlkXX3qi+BW+gO5erWylg== - dependencies: - "@discordjs/builders" "^0.14.0" - "@discordjs/collection" "^0.7.0" - "@sapphire/async-queue" "^1.3.1" - "@types/node-fetch" "^2.6.1" - "@types/ws" "^8.5.3" - discord-api-types "^0.33.3" - form-data "^4.0.0" - node-fetch "^2.6.1" - ws "^8.7.0" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.1" - -dotenv@^16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d" - integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -entities@^4.2.0, entities@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.3.0.tgz#62915f08d67353bb4eb67e3d62641a4059aec656" - integrity sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg== - -fallout-utility@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/fallout-utility/-/fallout-utility-1.4.2.tgz#d431e7a1af548d6b5ff0c8872564ef1270be4df5" - integrity sha512-UarmRxc+zkrL7jyb2dhN3ykWqfh1YD5/17Bu3T9qx9+4XQFCrpzjhnmOHSwsuu4kqcHPvDLYywhZKwKaWCWzLg== - dependencies: - "@types/prompt-sync" "^4.1.1" - chalk "^4.1.2" - prompt-sync "4.1.6" - strip-ansi "6.0.0" - -fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -follow-redirects@^1.14.9: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -gauge@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" - integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.2" - console-control-strings "^1.0.0" - has-unicode "^2.0.1" - object-assign "^4.1.1" - signal-exit "^3.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.2" - -genius-lyrics@^4.3.8: - version "4.3.8" - resolved "https://registry.yarnpkg.com/genius-lyrics/-/genius-lyrics-4.3.8.tgz#6759ed1f334b65b49665117b8f2ecce69981ddf2" - integrity sha512-Gy5JrSoWQKAWK54qfmgJFJIgbHDhfq3vXvYRJdh5QpX0DFic+7NxA88HVtkF7NdhCGtCCS2F9YeNGDiXYXMVIw== - dependencies: - cheerio "^1.0.0-rc.9" - got "^11.8.2" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -got@^11.8.2: - version "11.8.5" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" - integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - -himalaya@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/himalaya/-/himalaya-1.1.0.tgz#31724ae9d35714cd7c6f4be94888953f3604606a" - integrity sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw== - -htmlparser2@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" - integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - domutils "^3.0.1" - entities "^4.3.0" - -http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -json-buffer@3.0.1, json-buffer@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -keyv@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.3.0.tgz#b4352e0e4fe7c94111947d6738a6d3fe7903027c" - integrity sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ== - dependencies: - compress-brotli "^1.3.8" - json-buffer "3.0.1" - -libsodium-wrappers@^0.7.10, libsodium-wrappers@^0.7.9: - version "0.7.10" - resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz#13ced44cacb0fc44d6ac9ce67d725956089ce733" - integrity sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg== - dependencies: - libsodium "^0.7.0" - -libsodium@^0.7.0: - version "0.7.10" - resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.10.tgz#c2429a7e4c0836f879d701fec2c8a208af024159" - integrity sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -m3u8stream@^0.8.4, m3u8stream@^0.8.6: - version "0.8.6" - resolved "https://registry.yarnpkg.com/m3u8stream/-/m3u8stream-0.8.6.tgz#0d6de4ce8ee69731734e6b616e7b05dd9d9a55b1" - integrity sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA== - dependencies: - miniget "^4.2.2" - sax "^1.2.4" - -make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -miniget@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/miniget/-/miniget-4.2.2.tgz#db20320f265efdc4c1826a0be431d56753074475" - integrity sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA== - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minipass@^3.0.0: - version "3.1.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" - integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== - dependencies: - yallist "^4.0.0" - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -node-addon-api@*, node-addon-api@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.0.0.tgz#7d7e6f9ef89043befdb20c1989c905ebde18c501" - integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA== - -node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npmlog@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" - integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== - dependencies: - are-we-there-yet "^2.0.0" - console-control-strings "^1.1.0" - gauge "^3.0.0" - set-blocking "^2.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -opusscript@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/opusscript/-/opusscript-0.0.8.tgz#00b49e81281b4d99092d013b1812af8654bd0a87" - integrity sha512-VSTi1aWFuCkRCVq+tx/BQ5q9fMnQ9pVZ3JU4UHKqTkf0ED3fKEPdr+gKAAl3IA2hj9rrP6iyq3hlcJq3HELtNQ== - -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - -parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== - dependencies: - domhandler "^5.0.2" - parse5 "^7.0.0" - -parse5@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.0.0.tgz#51f74a5257f5fcc536389e8c2d0b3802e1bfa91a" - integrity sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g== - dependencies: - entities "^4.3.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -prism-media@^1.2.9, prism-media@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.3.2.tgz#a1f04423ec15d22f3d62b1987b6a25dc49aad13b" - integrity sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g== - -prompt-sync@4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/prompt-sync/-/prompt-sync-4.1.6.tgz#416ee21d92a95601d421a582d7cbf38cf7b53ff7" - integrity sha512-dYjDha0af2vefm6soqnPnFEz2tAzwH/kb+pPoaCohRoPUxFXj+mymkOFgxX7Ylv59TdEr7OzktEizdK7MIMvIw== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -reciple@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/reciple/-/reciple-1.7.0.tgz#1b651c5c7bf7357a5f55b2b0de9d3f12898aa10e" - integrity sha512-yAyUAfq/43a7/mvq2qIdse2LbciszHIsundSTwk76EjLM891wFnM73s29sA8AnCnFdkZksV6O3oEaUm7VKrJ+g== - dependencies: - chalk "4.1.2" - commander "^9.3.0" - dotenv "^16.0.1" - fallout-utility "^1.4.2" - semver "^7.3.7" - wildcard-match "^5.1.2" - yaml "^2.1.1" - -resolve-alpn@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - -responselike@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" - integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== - dependencies: - lowercase-keys "^2.0.0" - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -sax@^1.1.3, sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -semver@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.5, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -signal-exit@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sodium@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/sodium/-/sodium-3.0.2.tgz#4dbd7eb4a21c92ca7e7f684756cd733fee78112e" - integrity sha512-IsTwTJeoNBU97km3XkrbCGC/n/9aUQejgD3QPr2YY2gtbSPru3TI6nhCqgoez9Mv88frF9oVZS/jrXFbd6WXyA== - dependencies: - node-addon-api "*" - -soundcloud-scraper@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/soundcloud-scraper/-/soundcloud-scraper-5.0.2.tgz#3ec6bc74688869164eb7ca1b0759078e09e1d8c2" - integrity sha512-QAPvRIG4eefc7JdmCQCG/QEhm4D90XgHbe9lJMHmKIxU0INdAD2LycUR1m0mCIKF3F2dk4NvGEkxGfVLI8Af+A== - dependencies: - cheerio "^1.0.0-rc.10" - m3u8stream "^0.8.4" - node-fetch "^2.6.1" - -spotify-uri@~2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/spotify-uri/-/spotify-uri-2.2.2.tgz#08be39a14fb2ea1194cb31f9b78d47ce37230322" - integrity sha512-PuzfD74PB/NZPRDoMMpjFyrGdQn7PLHt0ivMWW9KNh6K9vlytFRVTNgaIWka/WShkdCUzlndHJpRq1L47hAfpA== - -spotify-url-info@^2.2.5: - version "2.2.9" - resolved "https://registry.yarnpkg.com/spotify-url-info/-/spotify-url-info-2.2.9.tgz#661cf7e699534fb4b02fc7c15c47605b88bc076b" - integrity sha512-sUZTKZqdM2H2AGSLj0cOn4tkvKRAI3japNo8CZdyMzLleHH4YsyH5sf96SffTy7kglUf5MfV96RHzm0R6AGxPA== - dependencies: - cross-fetch "~3.1.4" - himalaya "~1.1.0" - spotify-uri "~2.2.0" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -tar@^6.1.11: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -tiny-typed-emitter@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz#b3b027fdd389ff81a152c8e847ee2f5be9fad7b5" - integrity sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-mixer@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.1.tgz#7c2627fb98047eb5f3c7f2fee39d1521d18fe87a" - integrity sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg== - -tslib@^2.3.1, tslib@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -typescript@^4.7.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -wide-align@^1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -wildcard-match@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/wildcard-match/-/wildcard-match-5.1.2.tgz#66b438001391674d8599b45da051e0bd9f33cd2a" - integrity sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ== - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@^8.4.2, ws@^8.7.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.0.tgz#8e71c75e2f6348dbf8d78005107297056cb77769" - integrity sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.1.tgz#1e06fb4ca46e60d9da07e4f786ea370ed3c3cfec" - integrity sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw== - -youtube-sr@^4.1.13: - version "4.1.17" - resolved "https://registry.yarnpkg.com/youtube-sr/-/youtube-sr-4.1.17.tgz#bfdfe24b35d952cf2280dead1b3cd6e4d2ed4f80" - integrity sha512-d517Loy3GB0Z+gGJxd+k6SbiaePb1OMPah5ZWMLACle9THS9VluU4OzSKv/vL9Dafx1fCCCmkkJ2kumUlWMoRg== - -ytdl-core@^4.10.0: - version "4.11.0" - resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.11.0.tgz#79a3ea94d9d662b4b3acecdb1372ed3f1a9ea9db" - integrity sha512-Q3hCLiUA9AOGQXzPvno14GN+HgF9wsO1ZBHlj0COTcyxjIyFpWvMfii0UC4/cAbVaIjEdbWB71GdcGuc4J1Lmw== - dependencies: - m3u8stream "^0.8.6" - miniget "^4.2.2" - sax "^1.1.3"