diff --git a/package-lock.json b/package-lock.json index 6fb7d78..3f82cb1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,20 @@ { "name": "subsonics-discord", - "version": "4.0", + "version": "5.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "subsonics-discord", - "version": "4.0", + "version": "5.5", "dependencies": { + "cookie-parser": "^1.4.6", "discord.js": "^14.9.0", "erela.js": "^2.4.0", + "express": "^4.18.2", "nodemon": "^2.0.22", + "socket.io": "^4.6.1", + "uuid": "^9.0.0", "ytfps": "^1.1.0" } }, @@ -107,11 +111,29 @@ "npm": ">=7.0.0" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, "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/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "18.15.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", @@ -130,6 +152,18 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -142,6 +176,11 @@ "node": ">= 8" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "node_modules/axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", @@ -155,6 +194,14 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -163,6 +210,42 @@ "node": ">=8" } }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -194,6 +277,26 @@ "node": ">=10.16.0" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -225,6 +328,70 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -233,6 +400,23 @@ "ms": "^2.1.1" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/discord-api-types": { "version": "0.37.37", "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.37.tgz", @@ -261,6 +445,96 @@ "node": ">=16.9.0" } }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz", + "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/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/engine.io/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/engine.io/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/erela.js": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/erela.js/-/erela.js-2.4.0.tgz", @@ -275,6 +549,73 @@ "node": ">=16.0.0" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -307,6 +648,36 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -326,6 +697,22 @@ } } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -339,6 +726,24 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -350,6 +755,17 @@ "node": ">= 6" } }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -358,6 +774,43 @@ "node": ">=4" } }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -387,6 +840,14 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -435,6 +896,57 @@ "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -451,6 +963,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/nodemon": { "version": "2.0.22", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", @@ -500,6 +1020,46 @@ "node": ">=0.10.0" } }, + "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/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, "node_modules/peek-readable": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", @@ -523,11 +1083,59 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -586,6 +1194,11 @@ } ] }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -594,6 +1207,74 @@ "semver": "bin/semver" } }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/simple-update-notifier": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", @@ -613,6 +1294,112 @@ "semver": "bin/semver.js" } }, + "node_modules/socket.io": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/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/socket.io-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/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/socket.io-parser/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/socket.io/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/socket.io/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/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -667,6 +1454,14 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/token-types": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", @@ -704,6 +1499,18 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -720,11 +1527,43 @@ "node": ">=12.18" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "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/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/ws": { "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", @@ -821,11 +1660,29 @@ "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.0.tgz", "integrity": "sha512-zZxymtVO6zeXVMPds+6d7gv/OfnCc25M1Z+7ZLB0oPmeMTPeRWVPQSS16oDJy5ZsyCOLj7M6mbZml5gWXcVRNw==" }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, "@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "requires": { + "@types/node": "*" + } + }, "@types/node": { "version": "18.15.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", @@ -844,6 +1701,15 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -853,6 +1719,11 @@ "picomatch": "^2.0.4" } }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", @@ -866,11 +1737,50 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -896,6 +1806,20 @@ "streamsearch": "^1.1.0" } }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -916,6 +1840,54 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "requires": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + } + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -924,6 +1896,16 @@ "ms": "^2.1.1" } }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, "discord-api-types": { "version": "0.37.37", "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.37.tgz", @@ -949,6 +1931,64 @@ "ws": "^8.13.0" } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "engine.io": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz", + "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==", + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0" + }, + "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "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": {} + } + } + }, + "engine.io-parser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==" + }, "erela.js": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/erela.js/-/erela.js-2.4.0.tgz", @@ -960,6 +2000,69 @@ "ws": "^8.8.1" } }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -983,17 +2086,71 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1002,11 +2159,44 @@ "is-glob": "^4.0.1" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -1022,6 +2212,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1058,6 +2253,39 @@ "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1071,6 +2299,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, "nodemon": { "version": "2.0.22", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", @@ -1101,6 +2334,34 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, + "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==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, "peek-readable": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", @@ -1111,11 +2372,44 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, "pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -1147,11 +2441,79 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "simple-update-notifier": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", @@ -1167,6 +2529,79 @@ } } }, + "socket.io": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "requires": { + "ws": "~8.11.0" + }, + "dependencies": { + "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": {} + } + } + }, + "socket.io-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, "streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -1205,6 +2640,11 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, "token-types": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", @@ -1232,6 +2672,15 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -1245,11 +2694,31 @@ "busboy": "^1.6.0" } }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, "ws": { "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", diff --git a/package.json b/package.json index 341f242..0eea871 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,22 @@ "name": "subsonics-discord", "author": "Raphix", "version": "5.5", + "nodemonConfig": { + "ext": "js, html", + "ignore": [ + "*.json", + "*.html" + ], + "delay": "2" + }, "dependencies": { + "cookie-parser": "^1.4.6", "discord.js": "^14.9.0", "erela.js": "^2.4.0", + "express": "^4.18.2", "nodemon": "^2.0.22", + "socket.io": "^4.6.1", + "uuid": "^9.0.0", "ytfps": "^1.1.0" }, "scripts": { diff --git a/src/close.html b/src/close.html new file mode 100644 index 0000000..c45dd98 --- /dev/null +++ b/src/close.html @@ -0,0 +1,12 @@ + + + + + + + Submanager - + + + + + \ No newline at end of file diff --git a/src/commands/back.js b/src/commands/back.js index 7f25918..4e03db0 100644 --- a/src/commands/back.js +++ b/src/commands/back.js @@ -1,4 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -32,6 +33,7 @@ module.exports = { async function makeAction() { + let embed = new EmbedBuilder() .setColor(0xe033ff) .setTitle('Liste de lecture') @@ -40,6 +42,7 @@ module.exports = { let player = client.manager.players.get(interaction.guild.id) + if(!player) { @@ -53,8 +56,7 @@ module.exports = { interaction.reply({embeds: [embed]}) } else { - console.log("------------------------QUEUE.JS---------------------") - console.log(client.manager.players.get(interaction.guild.id).queue) + let queue = client.manager.players.get(interaction.guild.id).queue; @@ -85,6 +87,9 @@ module.exports = { } } + + process.emit("discordDoing") + } } } \ No newline at end of file diff --git a/src/commands/dictator.js b/src/commands/dictator.js index b589b40..c38d8c5 100644 --- a/src/commands/dictator.js +++ b/src/commands/dictator.js @@ -1,4 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -8,7 +9,7 @@ module.exports = { async execute(client, interaction) { - console.log(interaction.member._roles) + if(interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119") { if(client.dictator == true) { @@ -52,7 +53,7 @@ module.exports = { - + process.emit("discordDoing") } } \ No newline at end of file diff --git a/src/commands/help.js b/src/commands/help.js index 0cdca62..b871919 100644 --- a/src/commands/help.js +++ b/src/commands/help.js @@ -1,4 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -8,7 +9,7 @@ module.exports = { async execute(client, interaction) { - + const embed = new EmbedBuilder() .setColor(0x03ff2d) diff --git a/src/commands/leave.js b/src/commands/leave.js index a7e547c..41cf678 100644 --- a/src/commands/leave.js +++ b/src/commands/leave.js @@ -1,5 +1,6 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); const { Player } = require("erela.js"); +const log = require("../sublog") module.exports = { @@ -56,6 +57,8 @@ module.exports = { interaction.reply("**Aucune musique n'est actuellement jouée !**") } + + process.emit("discordDoing") } } diff --git a/src/commands/loop.js b/src/commands/loop.js index f0af338..2782446 100644 --- a/src/commands/loop.js +++ b/src/commands/loop.js @@ -1,4 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -31,7 +32,7 @@ module.exports = { } async function makeAction() { - + if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true}) let player = client.manager.players.get(interaction.guild.id) @@ -75,6 +76,10 @@ module.exports = { interaction.reply("**Aucune musique n'est actuellement jouée !**") } + + + process.emit("discordDoing") + } } } \ No newline at end of file diff --git a/src/commands/pause.js b/src/commands/pause.js index 97d1c62..ab6b54d 100644 --- a/src/commands/pause.js +++ b/src/commands/pause.js @@ -1,4 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -8,6 +9,8 @@ module.exports = { async execute(client, interaction) { + + if(client.dictator == true ) { if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) { @@ -32,6 +35,7 @@ module.exports = { async function makeAction() { + if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true}) let player = client.manager.players.get(interaction.guild.id) @@ -59,6 +63,9 @@ module.exports = { interaction.reply("**Aucune musique n'est actuellement jouée !**") } + + + process.emit("discordDoing") } } } \ No newline at end of file diff --git a/src/commands/ping.js b/src/commands/ping.js index 7dfed9b..72539ea 100644 --- a/src/commands/ping.js +++ b/src/commands/ping.js @@ -1,4 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -8,7 +9,7 @@ module.exports = { async execute(client, interaction) { - + process.emit("discordDoing") const embed = new EmbedBuilder() .setColor(0xb0f542) .setTitle('Résultat du ping') diff --git a/src/commands/play.js b/src/commands/play.js index 3c376d8..805db8f 100644 --- a/src/commands/play.js +++ b/src/commands/play.js @@ -1,5 +1,6 @@ const { EmbedBuilder } = require("@discordjs/builders"); const { SlashCommandBuilder, Embed } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -9,7 +10,7 @@ module.exports = { .addStringOption(option => option.setName("nom_ou_lien").setDescription("Le nom de la musique recherchée !").setRequired(true)), async execute(client, interaction) { - + if(client.dictator == true ) { if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) { @@ -34,9 +35,11 @@ module.exports = { async function makeAction() { + + const song_name = interaction.options.getString("nom_ou_lien") - if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true}) + if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true}) let player = client.manager.players.get(interaction.guild.id) @@ -71,8 +74,8 @@ module.exports = { interaction.reply({embeds: [embed]}) } catch(error) { - - console.log(error) + log.bot.error("Error processing /play") + log.bot.error(error); } @@ -92,20 +95,20 @@ module.exports = { .setTimestamp(); client.manager.players.get(interaction.guild.id).queue.add(songs.tracks[0]) - console.log("------------------------PLAY.JS---------------------") - console.log(player.queue) - console.log("--------------------------------------------") + try { - interaction.reply({embeds: [embed]}) + interaction.reply({embeds: [embed]}) } catch(error) { - - console.log(error) + log.bot.error("Error processing /play") + log.bot.error(error); } } + process.emit("discordDoing") + } } } \ No newline at end of file diff --git a/src/commands/playlist.js b/src/commands/playlist.js index cc0afc5..954ca91 100644 --- a/src/commands/playlist.js +++ b/src/commands/playlist.js @@ -1,5 +1,6 @@ const { EmbedBuilder } = require("@discordjs/builders"); const { SlashCommandBuilder, Embed } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -35,6 +36,8 @@ module.exports = { async function makeAction() { + process.emit("discordDoing") + const song_name = interaction.options.getString("lien") if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true}) @@ -62,12 +65,19 @@ module.exports = { try { var playlist = await ytfps(song_name) + var author = "Artiste inconnu !" + + if(typeof playlist.author != "undefined" ) { + + author == playlist.author.name + } + const embed = await new EmbedBuilder() .setColor(0x15e6ed) .setTitle('**Lecture de la playlist : **' + playlist.title) .setDescription('**Demandé par **' + interaction.member.user.username) - .addFields({name: "Auteur", value: playlist.author.name}, + .addFields({name: "Auteur", value: author}, {name: "URL", value:playlist.url}, {name: "Nombre de videos", value:playlist.video_count + " vidéos"}) .setThumbnail(playlist.thumbnail_url) @@ -78,18 +88,32 @@ module.exports = { await interaction.reply({embeds: [embed]}) } catch(error) { - console.log(error) + log.bot.error(error); } + addList(playlist, player) - for(var song of playlist.videos) { + async function addList(Pplaylist, Pplayer) { + + for(var song of Pplaylist.videos) { - const song_finded = await client.manager.search(song.url) - await client.manager.players.get(interaction.guild.id).queue.add(song_finded.tracks[0]) - + const song_finded = await client.manager.search(song.url) + await client.manager.players.get(interaction.guild.id).queue.add(song_finded.tracks[0]) + + } + + if(Pplayer.playing == false) { + + await Pplayer.play() + + } } - } catch(err) { + + + await process.emit("discordDoing") + + } catch(error) { const embed = new EmbedBuilder() .setColor(0xff0303) @@ -100,27 +124,21 @@ module.exports = { embed.addFields(song_show) interaction.reply({embeds: [embed]}) - console.log(err) + log.bot.error(error); }; - if(playlist != null) { + - if(!player.playing) { - - - player.play() - - - - } - } + + + process.emit("discordDoing") diff --git a/src/commands/queue.js b/src/commands/queue.js index f776793..2f38ddd 100644 --- a/src/commands/queue.js +++ b/src/commands/queue.js @@ -1,4 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -36,6 +37,8 @@ module.exports = { } async function makeAction() { + + if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true}) @@ -62,8 +65,6 @@ module.exports = { interaction.reply({embeds: [embed]}) } else { - console.log("------------------------QUEUE.JS---------------------") - console.log(client.manager.players.get(interaction.guild.id).queue) let queue = client.manager.players.get(interaction.guild.id).queue; @@ -75,12 +76,15 @@ module.exports = { interaction.reply({embeds: [embed]}) } else { - - for(song of queue) { - - const song_show = {name: queue.indexOf(song) + " - " + song.title, value: song.author} + var fieldmax = 0 + for(var song of queue) { + fieldmax += 1 + if(fieldmax <= 25) { + const song_show = {name: queue.indexOf(song) + " - " + song.title, value: song.author} - embed.addFields(song_show) + embed.addFields(song_show) + + } } await interaction.reply({embeds: [embed]}) @@ -110,8 +114,6 @@ module.exports = { interaction.reply({embeds: [embed]}) } else { - console.log("------------------------QUEUE.JS---------------------") - console.log(client.manager.players.get(interaction.guild.id).queue) let queue = client.manager.players.get(interaction.guild.id).queue; @@ -129,8 +131,7 @@ module.exports = { const number = interaction.options.getInteger("number") - console.log(number) - + if(number != null) { try { queue.splice(number, 1) @@ -179,6 +180,8 @@ module.exports = { await interaction.reply("**La commande a été mal éxécutée !**") } + + process.emit("discordDoing") } } } \ No newline at end of file diff --git a/src/commands/restart.js b/src/commands/restart.js index 9591f4f..4faf570 100644 --- a/src/commands/restart.js +++ b/src/commands/restart.js @@ -1,4 +1,6 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const log = require("../sublog") + const { Manager } = require("erela.js") @@ -10,7 +12,7 @@ module.exports = { async execute(client, interaction) { - console.log(interaction.member._roles) + if(interaction.member._roles.includes("397725956598530050") == true | interaction.member._roles.includes("397724656548970508") == true| interaction.member._roles.includes("397725128198455299") == true| interaction.member._roles.includes("397725552968204288") == true | interaction.member.user.id == "486943594893017119") { const embed = new EmbedBuilder() @@ -56,7 +58,7 @@ module.exports = { } - + process.emit("discordDoing") } } diff --git a/src/commands/resume.js b/src/commands/resume.js index 48a3518..352403a 100644 --- a/src/commands/resume.js +++ b/src/commands/resume.js @@ -1,4 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -8,6 +9,8 @@ module.exports = { async execute(client, interaction) { + + if(client.dictator == true ) { if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) { @@ -60,6 +63,8 @@ module.exports = { interaction.reply("**Aucune musique n'est actuellement jouée !**") } + + process.emit("discordDoing") } } } \ No newline at end of file diff --git a/src/commands/seek.js b/src/commands/seek.js index d6ec597..e6d18d4 100644 --- a/src/commands/seek.js +++ b/src/commands/seek.js @@ -1,4 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -9,6 +10,8 @@ module.exports = { async execute(client, interaction) { + + if(client.dictator == true ) { if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) { @@ -58,7 +61,7 @@ module.exports = { } catch (error) { - console.log(error) + log.bot.error(error); interaction.reply("**Aucune musique n'est actuellement jouée !**") } @@ -71,6 +74,8 @@ module.exports = { interaction.reply("**Aucune musique n'est actuellement jouée !**") } + + process.emit("discordDoing") } } } \ No newline at end of file diff --git a/src/commands/shuffle.js b/src/commands/shuffle.js index a0df581..6b95985 100644 --- a/src/commands/shuffle.js +++ b/src/commands/shuffle.js @@ -1,4 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -8,6 +9,8 @@ module.exports = { async execute(client, interaction) { + + if(client.dictator == true ) { if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) { @@ -61,6 +64,8 @@ module.exports = { interaction.reply("**Aucune musique n'est actuellement jouée !**") } + + process.emit("discordDoing") } } } \ No newline at end of file diff --git a/src/commands/skip.js b/src/commands/skip.js index d1bb929..a0acb1d 100644 --- a/src/commands/skip.js +++ b/src/commands/skip.js @@ -1,4 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -7,6 +8,7 @@ module.exports = { .setDescription("Permet de passer à la musique suivante !"), async execute(client, interaction) { + if(client.dictator == true ) { @@ -53,8 +55,7 @@ module.exports = { interaction.reply({embeds: [embed]}) } else { - console.log("------------------------QUEUE.JS---------------------") - console.log(client.manager.players.get(interaction.guild.id).queue) + let queue = client.manager.players.get(interaction.guild.id).queue; @@ -83,7 +84,7 @@ module.exports = { } } - + process.emit("discordDoing") } } } \ No newline at end of file diff --git a/src/commands/state.js b/src/commands/state.js index 602b94b..9365dfc 100644 --- a/src/commands/state.js +++ b/src/commands/state.js @@ -1,4 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const log = require("../sublog") module.exports = { @@ -8,6 +9,8 @@ module.exports = { async execute(client, interaction) { + + if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true}) let player = client.manager.players.get(interaction.guild.id) diff --git a/src/commands/version.js b/src/commands/version.js index d6861f7..72f2b43 100644 --- a/src/commands/version.js +++ b/src/commands/version.js @@ -1,5 +1,6 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); const packageJson = require('../../package.json'); +const log = require("../sublog") module.exports = { @@ -9,7 +10,8 @@ module.exports = { async execute(client, interaction) { - + process.emit("discordDoing") + const uptime = process.uptime(); const minutes = Math.floor(uptime / 60); const seconds = Math.floor(uptime % 60); diff --git a/src/main.js b/src/main.js index 5e81800..46d4a12 100644 --- a/src/main.js +++ b/src/main.js @@ -1,185 +1,716 @@ -const { channel } = require("node:diagnostics_channel"); - -let tryTime = 0; - if ("ENV" in process.env) { if(process.env.ENV == "TEST") { process.exit(0) } - } -function startApp() { -const { Client, GatewayIntentBits, Collection } = require("discord.js") -const { REST, Routes } = require("discord.js") -const fs = require("node:fs") -const config = require("./config.json") -const path = require("path") -const { Manager } = require("erela.js") +const { error } = require("node:console") +const log = require("./sublog.js") +const { config } = require("node:process") +const { platform } = require("node:os") -const client = new Client({ - intents:[GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates, GatewayIntentBits.GuildMembers] -}) -client.commands = new Collection() -client.dictator = false; +function startDiscordBot() { -const commands = []; -// Grab all the command files from the commands directory you created earlier -const commandsPath = path.join(__dirname , 'commands'); -const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js')); -// Grab the SlashCommandBuilder#toJSON() output of each command's data for deployment -for (const file of commandFiles) { - const command = require(`./commands/${file}`); - client.commands.set(command.data.name, command) - commands.push(command.data.toJSON()); + + const { Client, GatewayIntentBits, Collection } = require("discord.js") + const { REST, Routes } = require("discord.js") + const fs = require("node:fs") + const config = require("./config.json") + const path = require("path") + const { Manager, TrackUtils } = require("erela.js") + + const client = new Client({ + intents:[GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates, GatewayIntentBits.GuildMembers] + }) + + client.commands = new Collection() + client.dictator = false; + + const commands = []; + // Grab all the command files from the commands directory you created earlier + const commandsPath = path.join(__dirname , 'commands'); + const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js')); + + // Grab the SlashCommandBuilder#toJSON() output of each command's data for deployment + for (const file of commandFiles) { + const command = require(`./commands/${file}`); + client.commands.set(command.data.name, command) + commands.push(command.data.toJSON()); + } + + // Construct and prepare an instance of the REST module + const rest = new REST().setToken(config.token); + + // and deploy your commands! + (async () => { + try { + + + + + log.bot(`Started refreshing ${commands.length} application (/) commands.`); + + // The put method is used to fully refresh all commands in the guild with the current set + const data = await rest.put( + Routes.applicationGuildCommands(config.clientID, config.guildID), + { body: commands }, + ); + + log.bot(`Successfully reloaded ${data.length} application (/) commands.`); + } catch (error) { + // And of course, make sure you catch and log any errors! + log.bot.error(error); + } + })(); + + // Command Slash + + + // Client Event + + client.once("ready", () => { + + log.bot("Le meilleur groupe de musique est prêt !") + client.user.setActivity(`beaucoup de choses !`, { type: "LISTENING" }) + client.manager.init(client.user.id); + + const commandManager = client.application.commands; + + if (!commandManager) { + log.bot('Command manager not available.'); + + } else { + + commandManager.set([]); + } + }) + + client.on("voiceStateUpdate", (oldMember, newMember) => { + + let player = client.manager.players.get(oldMember.guild.id) + + if(player) { + + client.channels.fetch(player.options.voiceChannel).then(channel => { + + if(channel.members.size <= 1) { + + player.destroy() + } + }) + } + }) + + client.on("interactionCreate", (interaction) => { + + if(!interaction.isCommand()) return; + + const command = client.commands.get(interaction.commandName) + + try { + + log.bot(interaction.member.displayName + "-> /" + interaction.commandName) + command.execute(client, interaction) + } catch(error) { + + interaction.reply({content:"Erreur lors de l'éxécution de la commande !", ephemeral: true}) + } + }) + + + + + + + const nodes = [ + { + host: "lavalink.devamop.in", + password: "DevamOP", + port: 443, + secure: true + } + ]; + + client.manager = new Manager({ + // The nodes to connect to, optional if using default lavalink options + nodes, + // Method to send voice data to Discord + send: (id, payload) => { + const guild = client.guilds.cache.get(id); + // NOTE: FOR ERIS YOU NEED JSON.stringify() THE PAYLOAD + if (guild) guild.shard.send(payload); + } + }); + + // Emitted whenever a node connects + client.manager.on("nodeConnect", node => { + log.bot(`Node "${node.options.identifier}" connected.`) + }) + + // Emitted whenever a node encountered an error + client.manager.on("nodeError", (node, error) => { + log.bot(`Node "${node.options.identifier}" encountered an error: ${error.message}.`) + }) + + + // THIS IS REQUIRED. Send raw events to Erela.js + client.on("raw", d => client.manager.updateVoiceState(d)); + + + // Client Manager + + startServer(client) + + + client.login(config.token) + + + } -// Construct and prepare an instance of the REST module -const rest = new REST().setToken(config.token); +function startServer(client) { -// and deploy your commands! -(async () => { - try { + const express = require('express'); + const app = express(); + const http = require('http'); + const server = http.createServer(app); + var cookieParser = require('cookie-parser') + const { Server } = require("socket.io"); + const io = new Server(server); + const uuid = require("uuid") + const fs = require("fs") + const path = require("path") - - + //const link = "http://localhost:4000" + const link = "https://subsonics.raphix.fr" + //const discordlink = "https://discord.com/api/oauth2/authorize?client_id=1094727789682380922&redirect_uri=http%3A%2F%2Flocalhost%3A4000%2Fredirect&response_type=code&scope=guilds%20identify" + const discordlink = "https://discord.com/api/oauth2/authorize?client_id=1094727789682380922&redirect_uri=https%3A%2F%2Fsubsonics.raphix.fr%2Fredirect&response_type=code&scope=identify%20guilds" - console.log(`Started refreshing ${commands.length} application (/) commands.`); - - // The put method is used to fully refresh all commands in the guild with the current set - const data = await rest.put( - Routes.applicationGuildCommands(config.clientID, config.guildID), - { body: commands }, - ); - - console.log(`Successfully reloaded ${data.length} application (/) commands.`); - } catch (error) { - // And of course, make sure you catch and log any errors! - console.error(error); - } -})(); - -// Command Slash + var authTokenWait = new Map() + var users = new Map() + var onlineNumber = 0; -// Client Event + const tokens = require(__dirname + path.sep + "tokens.json") -client.once("ready", () => { + users = new Map() + for(var user in tokens) { - console.log("Le meilleur groupe de musique est prêt !") - client.user.setActivity(`beaucoup de choses !`, { type: "LISTENING" }) - client.manager.init(client.user.id); - - const commandManager = client.application.commands; - - if (!commandManager) { - console.log('Command manager not available.'); - - } else { - - commandManager.set([]); + users.set(user , tokens[user]) } -}) -client.on("voiceStateUpdate", (oldMember, newMember) => { - - let player = client.manager.players.get(oldMember.guild.id) - - if(player) { - - client.channels.fetch(player.options.voiceChannel).then(channel => { - - if(channel.members.size <= 1) { - - player.destroy() - } - }) - } -}) - -client.on("interactionCreate", (interaction) => { - - if(!interaction.isCommand()) return; - - const command = client.commands.get(interaction.commandName) - - try { - command.execute(client, interaction) - } catch(error) { - - interaction.reply({content:"Erreur lors de l'éxécution de la commande !", ephemeral: true}) - } -}) - - - - - - -const nodes = [ - { - host: "lavalink.devamop.in", - password: "DevamOP", - port: 443, - secure: true - } - ]; - - client.manager = new Manager({ - // The nodes to connect to, optional if using default lavalink options - nodes, - // Method to send voice data to Discord - send: (id, payload) => { - const guild = client.guilds.cache.get(id); - // NOTE: FOR ERIS YOU NEED JSON.stringify() THE PAYLOAD - if (guild) guild.shard.send(payload); - } - }); - - // Emitted whenever a node connects -client.manager.on("nodeConnect", node => { - console.log(`Node "${node.options.identifier}" connected.`) -}) - -// Emitted whenever a node encountered an error -client.manager.on("nodeError", (node, error) => { - console.log(`Node "${node.options.identifier}" encountered an error: ${error.message}.`) -}) - - -// THIS IS REQUIRED. Send raw events to Erela.js -client.on("raw", d => client.manager.updateVoiceState(d)); - -// Client Manager + app.use(cookieParser()) + io.on('connection', (socket) => { + log.server("Nouvelle Connexion - Client : " + socket.id) + onlineNumber += 1 + actualize() -client.login(config.token) + socket.on('disconnect', () => { + log.server("Déconnexion - Client : " + socket.id); + onlineNumber -= 1 + actualize() + }); -tryTime = 0 + socket.on("find", (token, value) => { + + async function find() { + + const searchList = await client.manager.search(value) + await socket.emit("findResult", searchList) + + } + + + if(users.has(token)) { + + log.server("Recherche avec les mots clés : " + value + " de musique de " + users.get(token).username + "#" + users.get(token).discriminator) + + find() + + } + + + }) + + socket.on("addQueue", (token, url) => { + + async function play() { + if(users.has(token)) { + + let player = client.manager.players.get("137291455336022018") + + if(!player) { + + player = client.manager.create({ + guild: "137291455336022018", + voiceChannel: "664355808250953739", + textChannel: "664355808250953739", + }); + + player.connect(); + } + + + const songtrack = await client.manager.search(url) + player.queue.add(songtrack.tracks[0]) + + + log.server("Lecture / Ajout du titre : " + songtrack.tracks[0].title + " de musique de " + users.get(token).username + "#" + users.get(token).discriminator) + + if(!player.playing) { + player.play() + } + + } + + + actualize() + } + + play() + + }) + + socket.on("authNeedLogin", () => { + + log.server("Discord Auth : Demande Token de " + socket.id) + const token = uuid.v4().toString() + + authTokenWait.set(token, socket) + + socket.emit("authOpenLink", link + "/" + token) + + app.get("/" + token, (req, res) => { + + res.cookie("authLoginFollow", token) + log.server("Discord Auth : Redirection vers le service Discord pour " + socket.id) + res.redirect(discordlink) + + }) + + //socket.emit("authFailed") + + }) + + socket.on("authByToken", (token) => { + + var answer = false + + if(users.has(token)) { + answer = true + + log.server("Connexion au serveur par Token - SOCKET_ID : " + socket.id + " - DISCORD_USER : " + users.get(token).username + "#" + users.get(token).discriminator) + actualize() + } + + socket.emit("authByTokenAnswer", answer, token) + }) + + socket.on("getState", (token) => { + actualize() + sendState(socket, token) + }) + + socket.on("play", (token) => { + if(users.has(token)) { + + log.server("Mise en Play / Pause demandé par " + users.get(token).username + "#" + users.get(token).discriminator) + + let player = client.manager.players.get("137291455336022018") + + if(player && player.playing == true && player.paused == false) { + + player.pause(true) + + } else if(player && player.playing == false && player.paused == true) { + + player.pause(false) + } + + actualize() + } else { + socket.emit("authFailed") + + } + + }) + + process.on("discordDoing", () => { + log.server("Discord BOT - Doing an action need actualisation !") + actualize() + }) + + socket.on("listClear", (token) => { + if(users.has(token)) { + + + log.server("Clear liste demandé par " + users.get(token).username + "#" + users.get(token).discriminator) + + let player = client.manager.players.get("137291455336022018") + + if(player) { + + player.queue.clear() + } + + actualize() + } else { + + socket.emit("authFailed") + } + + }) + + + socket.on("deleteQueue", (token, identifier) => { + + if(users.has(token)) { + + let player = client.manager.players.get("137291455336022018") + + if(player) { + + log.server("Supression (n°" + identifier + ") d'un morceau demandé par " + users.get(token).username + "#" + users.get(token).discriminator) + + player.queue.remove(identifier) + + + } + + actualize() + } else { + socket.emit("authFailed") + + } + + }) + + socket.on("backward", (token) => { + + if(users.has(token)) { + + log.server("Retour arrière demandé par " + users.get(token).username + "#" + users.get(token).discriminator) + + let player = client.manager.players.get("137291455336022018") + + if(player && player.queue.previous) { + + player.play(player.queue.previous) + + } else if(player && player.queue.current) { + + + player.play(player.queue.current) + + } + + actualize() + } else { + socket.emit("authFailed") + + } + + + }) + + socket.on("forward", (token) => { + + if(users.has(token)) { + + log.server("Skip demandé par " + users.get(token).username + "#" + users.get(token).discriminator) + + let player = client.manager.players.get("137291455336022018") + + if(player && player.queue.length != 0) { + + player.stop() + + + } else if(player && player.queue.current) { + + + player.play(player.queue.current) + + } + + actualize() + } else { + socket.emit("authFailed") + + } + + + }) + + socket.on("exit", (token) => { + + if(users.has(token)) { + + log.server("Skip demandé par " + users.get(token).username + "#" + users.get(token).discriminator) + + let player = client.manager.players.get("137291455336022018") + + if(player) { + + player.destroy() + } + + actualize() + } else { + socket.emit("authFailed") + + } + + + }) + + + + }); + + + client.manager.on("playerCreate", () => { + log.server("Player : Player Created -> Actualize all client !") + actualize() + + }) + + client.manager.on("playerDestroy", () => { + log.server("Player : Player Destroyed -> Actualize all client !") + actualize("end") + + }) + + client.manager.on("trackStart", () => { + + log.server("Player : New Track Start-> Actualize all client !") + actualize() + + }) + + client.manager.on("queueEnd", () => { + + log.server("Player : End Queue -> Actualize all client !") + actualize() + + + + + }) + + + + function actualize(action) { + + let player = client.manager.players.get("137291455336022018") + + + const data = { + "onlineNumber":onlineNumber, + "playing": 0, + "current":null, + "isOnline": false, + "queue": null + } + + if(player) { + + data["current"] = player.queue.current + + if(player.playing == true && player.paused == false) { + + data["playing"] = 1 + } else { + data["playing"] = 0 + + } + + data["queue"] = player.queue; + + if(player.playing == true) { + + log.server("Musique : Musique actuelle : " + player.queue.current.title) + } + + data["isOnline"] = true + + } + + log.server("Actualisation Client : Online Number : " + data.onlineNumber + " - PlayingState : " + data.playing + " - Current : " + data.current + " - Player : " + player) + + + + if(action == "end") { + + data["current"] = null; + data["isOnline"] = false + } + + try { + + io.sockets.emit("actualize", data) + } catch(error) { + + log.server("ERROR OF ACT") + } + + } + function sendState(socket, token) { + + const data = { + "username":users.get(token).username + "#" + users.get(token).discriminator, + "avatar": users.get(token).avatar, + "id": users.get(token).id, + } + socket.emit("updateState", data) + + + } + + app.get("/redirect", (req, res) => { + + + let token = req.cookies.authLoginFollow + + + + if(token != null) { + + if(authTokenWait.has(token) == true) { + + const socket = authTokenWait.get(token) + + + + + const code = req.query.code + + + log.server("Discord Auth : Récupération du service Discord : Token de Connexion : " + token + " associé à Client ID : " + socket.id) + + if(code) { + + try { + log.server("Discord Auth : REQUESTING DATA - TOKEN : " + token + " - DISCORD_CODE : " + code) + + const params = new URLSearchParams(); + params.append('client_id', "1094727789682380922"); + params.append('client_secret', "uwtyPOPKCgw6ciBs20qiJ7LJrW9Ziclo"); + params.append('grant_type', 'authorization_code'); + params.append('code', code); + params.append('redirect_uri', req.protocol + "://" + req.get('host') + "/redirect"); + params.append('scope', 'identify guild'); + + fetch('https://discord.com/api/oauth2/token', { + method: "POST", + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, body : params + }).then(resp => resp.json()).then(resp => createIdentity(resp, token, socket)).catch(error => log.server.error(error)) + + + + res.clearCookie("authLoginFollow") + res.send("SubSonics Manager : Vous pouvez fermer cette fenêtre ! Si rien ne ce passe sur l'application, prévenez Raphix !") + + + } catch(error) { + + console.log(error) + } + + } else { + res.send("SubSonics Manager : ERREUR : DISCORD AUTH FAILED !") + + } + + + + + } else { + res.send("SubSonics Manager : ERREUR : AUCUN TOKEN ENREGISTRÉ !") + + } + } else { + + res.send("SubSonics Manager : ERREUR : AUCUN TOKEN ENREGISTRÉ !") + + } + + + }) + + function createIdentity(response, token, socket) { + + + log.server("Discord Auth : REQUESTING DATA - TOKEN : " + token + " - DISCORD_ACCESS_TOKEN : " + response.access_token) + + fetch('https://discord.com/api/users/@me', { + headers: { + authorization: `${response.token_type} ${response.access_token}`, + }, + }).then(resp => resp.json()).then(resp => addIdentity(resp, token, socket)).catch(error => log.server.error(error)) + + + + + } + + function addIdentity(response, token, socket) { + + log.server("Discord Auth : [IDENTITE] : Nouvelle identité - SOCKET_ID : " + socket.id + " - DISCORD_USER : " + response.username + "#" + response.discriminator) + socket.emit("registerToken", token) + + socket.emit("successLogin") + + + const tokens = require(__dirname + path.sep + "tokens.json") + + tokens[token] = response + + fs.writeFileSync(__dirname + path.sep + "tokens.json", JSON.stringify(tokens, null, 2)) + + + users = new Map() + for(var user in tokens) { + + users.set(user , tokens[user]) + } + + actualize() + authTokenWait.delete(token) + + } + + + + var port = 4000; + + server.listen(port, () => { + log.server("Ecoute sur le PORT : " + port) + }); + + } function handleFatalError(error) { - console.error('Erreur fatale :', error); - console.log('Redémarrage en cours...'); - - if(tryTime == 10) { - - process.exit(1) - } - - tryTime += 1; + log.bot.error('Erreur fatale :', error); + console.log(error) client = null - startApp(); + + } process.on('uncaughtException', handleFatalError); -startApp(); +startDiscordBot(); + diff --git a/src/sublog.js b/src/sublog.js new file mode 100644 index 0000000..e2ba57f --- /dev/null +++ b/src/sublog.js @@ -0,0 +1,152 @@ +module.exports.server = (message) => { + + var date = new Date() + + // [Date Format] - Format de la date + + var gmonth = date.getMonth() + var gday = date.getDate() + var gHour = date.getHours() + var gMinute = date.getMinutes() + var gSecondes = date.getSeconds() + + + if(date.getMonth() + 1 <= 9) { + gmonth = "0" + (date.getMonth() + 1) + } + + if(date.getDate() + 1 <= 9) { + gday = "0" + date.getDate() + } + + if(date.getHours() + 1 <= 9) { + gHour = "0" + date.getHours() + } + + if(date.getMinutes() + 1 <= 9) { + gMinute = "0" + date.getMinutes() + } + + if(date.getSeconds() + 1 <= 9) { + gSecondes = "0" + date.getSeconds() + } + + var currentDate = date.getFullYear() + "-" + gmonth + "-" + gday + "-" + gHour + "h" + "-" + gMinute + "m" + "-" + gSecondes + "s" + + console.log("[Subsonics-Server] - " + currentDate + " - " + message) +} + +module.exports.server.error = (message) => { + + var date = new Date() + + // [Date Format] - Format de la date + + var gmonth = date.getMonth() + var gday = date.getDate() + var gHour = date.getHours() + var gMinute = date.getMinutes() + var gSecondes = date.getSeconds() + + + if(date.getMonth() + 1 <= 9) { + gmonth = "0" + (date.getMonth() + 1) + } + + if(date.getDate() + 1 <= 9) { + gday = "0" + date.getDate() + } + + if(date.getHours() + 1 <= 9) { + gHour = "0" + date.getHours() + } + + if(date.getMinutes() + 1 <= 9) { + gMinute = "0" + date.getMinutes() + } + + if(date.getSeconds() + 1 <= 9) { + gSecondes = "0" + date.getSeconds() + } + + var currentDate = date.getFullYear() + "-" + gmonth + "-" + gday + "-" + gHour + "h" + "-" + gMinute + "m" + "-" + gSecondes + "s" + + console.error("[Subsonics-Server] - [ERROR] - " + currentDate + " - " + message) +} + +module.exports.bot = (message) => { + + var date = new Date() + + // [Date Format] - Format de la date + + var gmonth = date.getMonth() + var gday = date.getDate() + var gHour = date.getHours() + var gMinute = date.getMinutes() + var gSecondes = date.getSeconds() + + + if(date.getMonth() + 1 <= 9) { + gmonth = "0" + (date.getMonth() + 1) + } + + if(date.getDate() + 1 <= 9) { + gday = "0" + date.getDate() + } + + if(date.getHours() + 1 <= 9) { + gHour = "0" + date.getHours() + } + + if(date.getMinutes() + 1 <= 9) { + gMinute = "0" + date.getMinutes() + } + + if(date.getSeconds() + 1 <= 9) { + gSecondes = "0" + date.getSeconds() + } + + var currentDate = date.getFullYear() + "-" + gmonth + "-" + gday + "-" + gHour + "h" + "-" + gMinute + "m" + "-" + gSecondes + "s" + + console.log("[Subsonics-Discord] - " + currentDate + " - " + message) +} + +module.exports.bot.error = (message) => { + + var date = new Date() + + // [Date Format] - Format de la date + + var gmonth = date.getMonth() + var gday = date.getDate() + var gHour = date.getHours() + var gMinute = date.getMinutes() + var gSecondes = date.getSeconds() + + + if(date.getMonth() + 1 <= 9) { + gmonth = "0" + (date.getMonth() + 1) + } + + if(date.getDate() + 1 <= 9) { + gday = "0" + date.getDate() + } + + if(date.getHours() + 1 <= 9) { + gHour = "0" + date.getHours() + } + + if(date.getMinutes() + 1 <= 9) { + gMinute = "0" + date.getMinutes() + } + + if(date.getSeconds() + 1 <= 9) { + gSecondes = "0" + date.getSeconds() + } + + var currentDate = date.getFullYear() + "-" + gmonth + "-" + gday + "-" + gHour + "h" + "-" + gMinute + "m" + "-" + gSecondes + "s" + + console.error("[Subsonics-Discord] - [ERROR] - " + currentDate + " - ") + console.error(message) +} \ No newline at end of file diff --git a/src/tokens.json b/src/tokens.json new file mode 100644 index 0000000..69bd542 --- /dev/null +++ b/src/tokens.json @@ -0,0 +1,308 @@ +{ + "7967c971-be8b-4906-a6dc-d4f5ffd2c1f5": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "b6e769dc-5775-45c7-809a-136e2f5b8fa7": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "6b349836-c482-4f0d-bdc1-97311ac7f252": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "737136a0-0415-48d7-ac4d-21276abcf241": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "9f987ae3-77b1-4218-b294-233b47fe1f87": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "de66945f-3da6-45dc-b427-e7999bad8ef5": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "6aa6df7d-21a2-46be-bb11-d9c9874f8a90": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "b8614915-1bf9-4fac-980a-8a1546a7e0ae": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "23d19191-73dd-43d5-ae64-32b4108f23ea": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "a23b262e-6d0d-4677-8791-4e68e5a3af11": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "d5cdcfb5-f975-4f6a-accd-8085abb6ec23": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "54172611-50d2-4b31-a108-dc73df49af2d": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "5a1f8903-bcac-4921-978d-2460c0a999ff": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "8eedcc5b-df61-4ed3-87b3-1c2152e352b0": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "e29035a5-7992-468b-a93f-e555506e54e2": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "0832a777-15e4-4aff-861b-1d77883e381d": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "013cf605-cad4-47c8-b857-028db1f39cdc": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + }, + "afef2df3-07ba-403f-91b3-5fbeede287b7": { + "id": "486943594893017119", + "username": "Raphix", + "global_name": null, + "display_name": null, + "avatar": "883ec1a7136b0aa3c22e4bdc33e278e5", + "discriminator": "8434", + "public_flags": 4194368, + "flags": 4194368, + "banner": null, + "banner_color": "#ff4d4d", + "accent_color": 16731469, + "locale": "fr", + "mfa_enabled": true, + "premium_type": 0, + "avatar_decoration": null + } +} \ No newline at end of file