From d618e31c703996272e3c41e583108835219016df Mon Sep 17 00:00:00 2001 From: Kevin Novak Date: Sat, 14 Aug 2021 12:21:36 -0400 Subject: [PATCH] Update to discord.js v13 (#12) * Update packages * Replace discord.js-light with discord.js * Fixes for discord.js v13 * Fix broadcastEval's * Update README * Disable commonly unused caches --- README.md | 5 +- config/config.example.json | 22 +- lang/lang.en-Pirate.json | 2 +- lang/lang.en-US.json | 2 +- package-lock.json | 524 +++++++++++++++++---------- package.json | 10 +- src/app.ts | 2 +- src/bot.ts | 2 +- src/commands/command.ts | 2 +- src/commands/dev-command.ts | 4 +- src/commands/docs-command.ts | 2 +- src/commands/help-command.ts | 2 +- src/commands/info-command.ts | 2 +- src/commands/invite-command.ts | 2 +- src/commands/support-command.ts | 2 +- src/commands/test-command.ts | 2 +- src/commands/translate-command.ts | 2 +- src/commands/vote-command.ts | 2 +- src/controllers/guilds-controller.ts | 6 +- src/controllers/shards-controller.ts | 20 +- src/events/command-handler.ts | 17 +- src/events/event-handler.ts | 2 +- src/events/guild-join-handler.ts | 7 +- src/events/guild-leave-handler.ts | 2 +- src/events/message-handler.ts | 5 +- src/events/reaction-handler.ts | 12 +- src/events/trigger-handler.ts | 2 +- src/extensions/custom-client.ts | 14 +- src/jobs/update-server-count-job.ts | 15 +- src/manager.ts | 16 +- src/models/cluster-api/shards.ts | 4 +- src/reactions/reaction.ts | 2 +- src/services/lang.ts | 2 +- src/services/logger.ts | 2 +- src/start.ts | 23 +- src/triggers/trigger.ts | 2 +- src/utils/client-utils.ts | 2 +- src/utils/format-utils.ts | 2 +- src/utils/message-utils.ts | 40 +- src/utils/partial-utils.ts | 8 +- src/utils/permission-utils.ts | 49 ++- src/utils/shard-utils.ts | 10 +- 42 files changed, 514 insertions(+), 341 deletions(-) diff --git a/README.md b/README.md index 4a1c200d..56ddd295 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Discord Bot TypeScript Template -[![discord.js-light](https://img.shields.io/github/package-json/dependency-version/KevinNovak/Discord-Bot-TypeScript-Template/discord.js-light)](https://github.com/timotejroiko/discord.js-light) +[![discord.js](https://img.shields.io/github/package-json/dependency-version/KevinNovak/Discord-Bot-TypeScript-Template/discord.js)](https://discord.js.org/) [![License](https://img.shields.io/badge/license-MIT-blue)](https://opensource.org/licenses/MIT) **Discord bot** - A discord.js bot template written with TypeScript. @@ -25,8 +25,7 @@ For help using this template, feel free to [join our support server](https://dis ### Developer Friendly: - Written with TypeScript. -- Uses the [discord.js-light](https://github.com/timotejroiko/discord.js-light) framework. - - Based on [discord.js](https://discord.js.org/), but more memory efficient. +- Uses the [discord.js](https://discord.js.org/) framework. - Built-in debugging setup for VSCode. - Support for running with the [PM2](https://pm2.keymetrics.io/) process manger. - Support for running with [Docker](https://www.docker.com/). diff --git a/config/config.example.json b/config/config.example.json index 4a2b36dc..09368272 100644 --- a/config/config.example.json +++ b/config/config.example.json @@ -9,20 +9,18 @@ "DIRECT_MESSAGES", "DIRECT_MESSAGE_REACTIONS" ], - "disabledEvents": [], "partials": ["MESSAGE", "CHANNEL", "REACTION"], "caches": { - "guilds": true, - "roles": true, - "emojis": false, - "channels": true, - "overwrites": true, - "presences": false, - "messages": { - "size": 0, - "lifetime": 0, - "sweepInterval": 0 - } + "BaseGuildEmojiManager": 0, + "GuildBanManager": 0, + "GuildInviteManager": 0, + "GuildStickerManager": 0, + "MessageManager": 0, + "PresenceManager": 0, + "StageInstanceManager": 0, + "ThreadManager": 0, + "ThreadMemberManager": 0, + "VoiceStateManager": 0 } }, "api": { diff --git a/lang/lang.en-Pirate.json b/lang/lang.en-Pirate.json index 0accbfb4..c505ab90 100644 --- a/lang/lang.en-Pirate.json +++ b/lang/lang.en-Pirate.json @@ -78,7 +78,7 @@ "**Node.js**: {{NODE_VERSION}}", "**TypeScript**: {{TS_VERSION}}", "**ECMAScript**: {{ES_VERSION}}", - "**discord.js-light**: {{DJS_VERSION}}" + "**discord.js**: {{DJS_VERSION}}" ] }, { diff --git a/lang/lang.en-US.json b/lang/lang.en-US.json index 803f6c17..e17e9ed5 100644 --- a/lang/lang.en-US.json +++ b/lang/lang.en-US.json @@ -78,7 +78,7 @@ "**Node.js**: {{NODE_VERSION}}", "**TypeScript**: {{TS_VERSION}}", "**ECMAScript**: {{ES_VERSION}}", - "**discord.js-light**: {{DJS_VERSION}}" + "**discord.js**: {{DJS_VERSION}}" ] }, { diff --git a/package-lock.json b/package-lock.json index dc608489..d9f7341e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,9 +11,9 @@ "dependencies": { "class-transformer": "0.4.0", "class-validator": "0.13.1", - "discord.js-light": "3.5.11", - "discord.js-multilingual-utils": "1.6.5", - "discord.js-rate-limiter": "1.1.0", + "discord.js": "13.1.0", + "discord.js-multilingual-utils": "1.7.0", + "discord.js-rate-limiter": "1.2.0", "express": "4.17.1", "express-promise-router": "4.1.0", "filesize": "7.0.0", @@ -25,7 +25,7 @@ }, "devDependencies": { "@types/express": "4.17.13", - "@types/node": "16.4.10", + "@types/node": "16.6.1", "@types/node-fetch": "2.5.12", "@types/node-schedule": "1.3.2", "@types/remove-markdown": "0.3.1", @@ -35,7 +35,7 @@ "typescript": "^4.3.5" }, "engines": { - "node": ">=15.0.0" + "node": ">=16.6.0" } }, "node_modules/@babel/code-frame": { @@ -144,10 +144,29 @@ "node": ">=4" } }, + "node_modules/@discordjs/builders": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.5.0.tgz", + "integrity": "sha512-HP5y4Rqw68o61Qv4qM5tVmDbWi4mdTFftqIOGRo33SNPpLJ1Ga3KEIR2ibKofkmsoQhEpLmopD1AZDs3cKpHuw==", + "dependencies": { + "@sindresorhus/is": "^4.0.1", + "discord-api-types": "^0.22.0", + "ow": "^0.27.0", + "ts-mixer": "^6.0.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=7.0.0" + } + }, "node_modules/@discordjs/collection": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", - "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.2.1.tgz", + "integrity": "sha512-vhxqzzM8gkomw0TYRF3tgx7SwElzUlXT/Aa41O7mOcyN6wIJfj5JmDWaO5XGKsGSsNx7F3i5oIlrucCCWV1Nog==", + "engines": { + "node": ">=14.0.0" + } }, "node_modules/@discordjs/form-data": { "version": "3.0.1", @@ -354,6 +373,11 @@ "semver": "bin/semver.js" } }, + "node_modules/@pm2/io/node_modules/tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, "node_modules/@pm2/js-api": { "version": "0.6.7", "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.6.7.tgz", @@ -432,6 +456,26 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/@sapphire/async-queue": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.4.tgz", + "integrity": "sha512-fFrlF/uWpGOX5djw5Mu2Hnnrunao75WGey0sP0J3jnhmrJ5TAPzHYOmytD5iN/+pMxS+f+u/gezqHa9tPhRHEA==", + "engines": { + "node": ">=14", + "npm": ">=6" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.1.tgz", + "integrity": "sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -489,10 +533,9 @@ "devOptional": true }, "node_modules/@types/node": { - "version": "16.4.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.10.tgz", - "integrity": "sha512-TmVHsm43br64js9BqHWqiDZA+xMtbUpI1MBIA0EyiBmoV9pcEYFOSdj5fr6enZNfh4fChh+AGOLIzGwJnkshyQ==", - "devOptional": true + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.6.1.tgz", + "integrity": "sha512-Sr7BhXEAer9xyGuCN3Ek9eg9xPviCF2gfu9kTfuU2HkTVAMYSDeX40fvpmo72n5nansg3nsBjuQBrsS28r+NUw==" }, "node_modules/@types/node-fetch": { "version": "2.5.12", @@ -558,15 +601,12 @@ "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.6.3.tgz", "integrity": "sha512-fWG42pMJOL4jKsDDZZREnXLjc3UE0R8LOJfARWYg6U966rxDT7TYejYzLnUF5cvSObGg34nd0+H2wHHU5Omdfw==" }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" + "@types/node": "*" } }, "node_modules/accepts": { @@ -690,15 +730,10 @@ "node": ">=4" } }, - "node_modules/ast-types/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - }, "node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.1.tgz", + "integrity": "sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg==" }, "node_modules/async-listener": { "version": "0.6.10", @@ -841,6 +876,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -1098,59 +1141,67 @@ "node": ">=0.3.1" } }, + "node_modules/discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==", + "engines": { + "node": ">=12" + } + }, "node_modules/discord.js": { - "version": "12.5.3", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", - "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.1.0.tgz", + "integrity": "sha512-gxO4CXKdHpqA+WKG+f5RNnd3srTDj5uFJHgOathksDE90YNq/Qijkd2WlMgTTMS6AJoEnHxI7G9eDQHCuZ+xDA==", "dependencies": { - "@discordjs/collection": "^0.1.6", + "@discordjs/builders": "^0.5.0", + "@discordjs/collection": "^0.2.1", "@discordjs/form-data": "^3.0.1", - "abort-controller": "^3.0.0", + "@sapphire/async-queue": "^1.1.4", + "@types/ws": "^7.4.7", + "discord-api-types": "^0.22.0", "node-fetch": "^2.6.1", - "prism-media": "^1.2.9", - "setimmediate": "^1.0.5", - "tweetnacl": "^1.0.3", - "ws": "^7.4.4" + "ws": "^7.5.1" }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/discord.js-light": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/discord.js-light/-/discord.js-light-3.5.11.tgz", - "integrity": "sha512-FaOdReT+8CJsHXnjxlG7oK08uqVtIVaEXsbpS7V1O5DK6WSar29KsewkUcDHnCkU89MRhXsgNXhk7cVg0qYkGA==", - "dependencies": { - "discord.js": "12.5.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "patreon", - "url": "https://patreon.com/timotejroiko" + "node": ">=16.6.0", + "npm": ">=7.0.0" } }, "node_modules/discord.js-multilingual-utils": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/discord.js-multilingual-utils/-/discord.js-multilingual-utils-1.6.5.tgz", - "integrity": "sha512-6lpTSm8jnCqS4PmpwST2K0Ox7Zp+7VvCWUsEdtNJqTZh4evuQD/ikBfQMHy+OfmLkjW0CTBgvNjtMNyM698Wxw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/discord.js-multilingual-utils/-/discord.js-multilingual-utils-1.7.0.tgz", + "integrity": "sha512-HGsU8UGmgTieTI62rCxBZOvyM/c02JTsrvAb4bM7B4FQiLHCz9Zy6WnhME+R1rQoLF6bMXzj7s7jDcuEOkCF9w==", "engines": { "node": ">=12.0.0" }, "peerDependencies": { - "discord.js": ">=12.0.0" + "discord.js": ">=13.0.0" } }, "node_modules/discord.js-rate-limiter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/discord.js-rate-limiter/-/discord.js-rate-limiter-1.1.0.tgz", - "integrity": "sha512-Mo+wj6Y+PHlCUCtcOIt2Aoph0xcPFND9XxzJyFbDKTLfJOoxDZVckrWEu9Y7bRkHmAUElgz2oq3vDDUbWbIUWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/discord.js-rate-limiter/-/discord.js-rate-limiter-1.2.0.tgz", + "integrity": "sha512-1tvx70QVSboo2cwpIQtL0bBPJyBnuB0gLI9kZDbmDN0YdHD3M0LNM8R9SH2Et95BSZTX4TSp206ojw4N4ecyPw==", "dependencies": { "limiter": "1.1.5" }, "peerDependencies": { - "discord.js": ">=12.0.0" + "discord.js": ">=13.0.0" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/dynamic-dedupe": { @@ -1267,14 +1318,6 @@ "node": ">= 0.6" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/eventemitter2": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", @@ -1343,9 +1386,9 @@ } }, "node_modules/fast-json-patch": { - "version": "3.0.0-1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.0.0-1.tgz", - "integrity": "sha512-6pdFb07cknxvPzCeLsFHStEy+MysPJPgZQ9LbQ/2O67unQF93SNqfdSqnPPl71YMHX+AD8gbl7iuoGFzHEdDuw==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.0.tgz", + "integrity": "sha512-IhpytlsVTRndz0hU5t0/MGzS/etxLlfrpG5V5M9mVbuj9TrJLWaMfsox9REM5rkuGX0T+5qjpe8XA1o0gZ42nA==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -1600,9 +1643,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "node_modules/has": { "version": "1.0.3", @@ -1823,6 +1866,14 @@ "node": ">=0.12.0" } }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -1917,6 +1968,11 @@ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, "node_modules/log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", @@ -2199,6 +2255,25 @@ "node": ">= 0.8.0" } }, + "node_modules/ow": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.27.0.tgz", + "integrity": "sha512-SGnrGUbhn4VaUGdU0EJLMwZWSupPmF46hnTRII7aCLCrqixTAC5eKo8kI4/XXf1eaaI8YEVT+3FeGNJI9himAQ==", + "dependencies": { + "@sindresorhus/is": "^4.0.1", + "callsites": "^3.1.0", + "dot-prop": "^6.0.1", + "lodash.isequal": "^4.5.0", + "type-fest": "^1.2.1", + "vali-date": "^1.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pac-proxy-agent": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz", @@ -2536,31 +2611,6 @@ "node": ">=10.13.0" } }, - "node_modules/prism-media": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.1.tgz", - "integrity": "sha512-nyYAa3KB4qteJIqdguKmwxTJgy55xxUtkJ3uRnOvO5jO+frci+9zpRXw6QZVcfDeva3S654fU9+26P2OSTzjHw==", - "peerDependencies": { - "@discordjs/opus": "^0.5.0", - "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", - "node-opus": "^0.3.3", - "opusscript": "^0.0.8" - }, - "peerDependenciesMeta": { - "@discordjs/opus": { - "optional": true - }, - "ffmpeg-static": { - "optional": true - }, - "node-opus": { - "optional": true - }, - "opusscript": { - "optional": true - } - } - }, "node_modules/promptly": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", @@ -2859,11 +2909,6 @@ "node": ">= 0.8.0" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, "node_modules/setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -2880,9 +2925,9 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "node_modules/smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -3005,9 +3050,9 @@ } }, "node_modules/systeminformation": { - "version": "5.7.14", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.7.14.tgz", - "integrity": "sha512-T928Nvxy5uA/NQR00gGCm4wnNGPcXYyPXDnZsMR1wG5rk25CwaVcshsSGvl91s0DPUyC87tUfQOWVg4EvNwsOA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.8.0.tgz", + "integrity": "sha512-l4drbK2PtNynGKblaShY9hDLW/gg1zxUq2+Yk4gTyd6a2JUvFyTGP8PhHV9iOh+MzS25PQa8W1t0kvcIvr9n7Q==", "optional": true, "os": [ "darwin", @@ -3057,6 +3102,11 @@ "tree-kill": "cli.js" } }, + "node_modules/ts-mixer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz", + "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ==" + }, "node_modules/ts-node": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", @@ -3130,9 +3180,9 @@ } }, "node_modules/tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "node_modules/tslint": { "version": "6.1.3", @@ -3275,6 +3325,12 @@ "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/tv4": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", @@ -3283,11 +3339,6 @@ "node": ">= 0.8.0" } }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, "node_modules/tx2": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.4.tgz", @@ -3308,6 +3359,17 @@ "node": ">= 0.8.0" } }, + "node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -3366,6 +3428,14 @@ "uuid": "bin/uuid" } }, + "node_modules/vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/validator": { "version": "13.6.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", @@ -3567,10 +3637,22 @@ } } }, + "@discordjs/builders": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.5.0.tgz", + "integrity": "sha512-HP5y4Rqw68o61Qv4qM5tVmDbWi4mdTFftqIOGRo33SNPpLJ1Ga3KEIR2ibKofkmsoQhEpLmopD1AZDs3cKpHuw==", + "requires": { + "@sindresorhus/is": "^4.0.1", + "discord-api-types": "^0.22.0", + "ow": "^0.27.0", + "ts-mixer": "^6.0.0", + "tslib": "^2.3.0" + } + }, "@discordjs/collection": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", - "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.2.1.tgz", + "integrity": "sha512-vhxqzzM8gkomw0TYRF3tgx7SwElzUlXT/Aa41O7mOcyN6wIJfj5JmDWaO5XGKsGSsNx7F3i5oIlrucCCWV1Nog==" }, "@discordjs/form-data": { "version": "3.0.1", @@ -3722,6 +3804,11 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" } } }, @@ -3788,6 +3875,16 @@ } } }, + "@sapphire/async-queue": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.4.tgz", + "integrity": "sha512-fFrlF/uWpGOX5djw5Mu2Hnnrunao75WGey0sP0J3jnhmrJ5TAPzHYOmytD5iN/+pMxS+f+u/gezqHa9tPhRHEA==" + }, + "@sindresorhus/is": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.1.tgz", + "integrity": "sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==" + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -3842,10 +3939,9 @@ "devOptional": true }, "@types/node": { - "version": "16.4.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.10.tgz", - "integrity": "sha512-TmVHsm43br64js9BqHWqiDZA+xMtbUpI1MBIA0EyiBmoV9pcEYFOSdj5fr6enZNfh4fChh+AGOLIzGwJnkshyQ==", - "devOptional": true + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.6.1.tgz", + "integrity": "sha512-Sr7BhXEAer9xyGuCN3Ek9eg9xPviCF2gfu9kTfuU2HkTVAMYSDeX40fvpmo72n5nansg3nsBjuQBrsS28r+NUw==" }, "@types/node-fetch": { "version": "2.5.12", @@ -3911,12 +4007,12 @@ "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.6.3.tgz", "integrity": "sha512-fWG42pMJOL4jKsDDZZREnXLjc3UE0R8LOJfARWYg6U966rxDT7TYejYzLnUF5cvSObGg34nd0+H2wHHU5Omdfw==" }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", "requires": { - "event-target-shim": "^5.0.0" + "@types/node": "*" } }, "accepts": { @@ -4011,19 +4107,12 @@ "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "requires": { "tslib": "^2.0.1" - }, - "dependencies": { - "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - } } }, "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.1.tgz", + "integrity": "sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg==" }, "async-listener": { "version": "0.6.10", @@ -4138,6 +4227,11 @@ "get-intrinsic": "^1.0.2" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, "chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -4348,43 +4442,48 @@ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, + "discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==" + }, "discord.js": { - "version": "12.5.3", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", - "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.1.0.tgz", + "integrity": "sha512-gxO4CXKdHpqA+WKG+f5RNnd3srTDj5uFJHgOathksDE90YNq/Qijkd2WlMgTTMS6AJoEnHxI7G9eDQHCuZ+xDA==", "requires": { - "@discordjs/collection": "^0.1.6", + "@discordjs/builders": "^0.5.0", + "@discordjs/collection": "^0.2.1", "@discordjs/form-data": "^3.0.1", - "abort-controller": "^3.0.0", + "@sapphire/async-queue": "^1.1.4", + "@types/ws": "^7.4.7", + "discord-api-types": "^0.22.0", "node-fetch": "^2.6.1", - "prism-media": "^1.2.9", - "setimmediate": "^1.0.5", - "tweetnacl": "^1.0.3", - "ws": "^7.4.4" - } - }, - "discord.js-light": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/discord.js-light/-/discord.js-light-3.5.11.tgz", - "integrity": "sha512-FaOdReT+8CJsHXnjxlG7oK08uqVtIVaEXsbpS7V1O5DK6WSar29KsewkUcDHnCkU89MRhXsgNXhk7cVg0qYkGA==", - "requires": { - "discord.js": "12.5.3" + "ws": "^7.5.1" } }, "discord.js-multilingual-utils": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/discord.js-multilingual-utils/-/discord.js-multilingual-utils-1.6.5.tgz", - "integrity": "sha512-6lpTSm8jnCqS4PmpwST2K0Ox7Zp+7VvCWUsEdtNJqTZh4evuQD/ikBfQMHy+OfmLkjW0CTBgvNjtMNyM698Wxw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/discord.js-multilingual-utils/-/discord.js-multilingual-utils-1.7.0.tgz", + "integrity": "sha512-HGsU8UGmgTieTI62rCxBZOvyM/c02JTsrvAb4bM7B4FQiLHCz9Zy6WnhME+R1rQoLF6bMXzj7s7jDcuEOkCF9w==", "requires": {} }, "discord.js-rate-limiter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/discord.js-rate-limiter/-/discord.js-rate-limiter-1.1.0.tgz", - "integrity": "sha512-Mo+wj6Y+PHlCUCtcOIt2Aoph0xcPFND9XxzJyFbDKTLfJOoxDZVckrWEu9Y7bRkHmAUElgz2oq3vDDUbWbIUWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/discord.js-rate-limiter/-/discord.js-rate-limiter-1.2.0.tgz", + "integrity": "sha512-1tvx70QVSboo2cwpIQtL0bBPJyBnuB0gLI9kZDbmDN0YdHD3M0LNM8R9SH2Et95BSZTX4TSp206ojw4N4ecyPw==", "requires": { "limiter": "1.1.5" } }, + "dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "requires": { + "is-obj": "^2.0.0" + } + }, "dynamic-dedupe": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", @@ -4462,11 +4561,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, "eventemitter2": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", @@ -4520,9 +4614,9 @@ } }, "fast-json-patch": { - "version": "3.0.0-1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.0.0-1.tgz", - "integrity": "sha512-6pdFb07cknxvPzCeLsFHStEy+MysPJPgZQ9LbQ/2O67unQF93SNqfdSqnPPl71YMHX+AD8gbl7iuoGFzHEdDuw==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.0.tgz", + "integrity": "sha512-IhpytlsVTRndz0hU5t0/MGzS/etxLlfrpG5V5M9mVbuj9TrJLWaMfsox9REM5rkuGX0T+5qjpe8XA1o0gZ42nA==" }, "fast-levenshtein": { "version": "2.0.6", @@ -4705,9 +4799,9 @@ } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "has": { "version": "1.0.3", @@ -4868,6 +4962,11 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, "is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -4953,6 +5052,11 @@ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", @@ -5167,6 +5271,19 @@ "word-wrap": "~1.2.3" } }, + "ow": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.27.0.tgz", + "integrity": "sha512-SGnrGUbhn4VaUGdU0EJLMwZWSupPmF46hnTRII7aCLCrqixTAC5eKo8kI4/XXf1eaaI8YEVT+3FeGNJI9himAQ==", + "requires": { + "@sindresorhus/is": "^4.0.1", + "callsites": "^3.1.0", + "dot-prop": "^6.0.1", + "lodash.isequal": "^4.5.0", + "type-fest": "^1.2.1", + "vali-date": "^1.0.0" + } + }, "pac-proxy-agent": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz", @@ -5412,12 +5529,6 @@ "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", "dev": true }, - "prism-media": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.1.tgz", - "integrity": "sha512-nyYAa3KB4qteJIqdguKmwxTJgy55xxUtkJ3uRnOvO5jO+frci+9zpRXw6QZVcfDeva3S654fU9+26P2OSTzjHw==", - "requires": {} - }, "promptly": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", @@ -5652,11 +5763,6 @@ "send": "0.17.1" } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -5673,9 +5779,9 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "socks": { "version": "2.6.1", @@ -5766,9 +5872,9 @@ } }, "systeminformation": { - "version": "5.7.14", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.7.14.tgz", - "integrity": "sha512-T928Nvxy5uA/NQR00gGCm4wnNGPcXYyPXDnZsMR1wG5rk25CwaVcshsSGvl91s0DPUyC87tUfQOWVg4EvNwsOA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.8.0.tgz", + "integrity": "sha512-l4drbK2PtNynGKblaShY9hDLW/gg1zxUq2+Yk4gTyd6a2JUvFyTGP8PhHV9iOh+MzS25PQa8W1t0kvcIvr9n7Q==", "optional": true }, "to-regex-range": { @@ -5790,6 +5896,11 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "ts-mixer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz", + "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ==" + }, "ts-node": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", @@ -5835,9 +5946,9 @@ } }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "tslint": { "version": "6.1.3", @@ -5946,6 +6057,14 @@ "dev": true, "requires": { "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "tv4": { @@ -5953,11 +6072,6 @@ "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=" }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, "tx2": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.4.tgz", @@ -5975,6 +6089,11 @@ "prelude-ls": "~1.1.2" } }, + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -6010,6 +6129,11 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=" + }, "validator": { "version": "13.6.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", diff --git a/package.json b/package.json index 87ce01e1..fb95fb00 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "license": "MIT", "private": true, "engines": { - "node": ">=15.0.0" + "node": ">=16.6.0" }, "main": "dist/start.js", "scripts": { @@ -26,9 +26,9 @@ "dependencies": { "class-transformer": "0.4.0", "class-validator": "0.13.1", - "discord.js-light": "3.5.11", - "discord.js-multilingual-utils": "1.6.5", - "discord.js-rate-limiter": "1.1.0", + "discord.js": "13.1.0", + "discord.js-multilingual-utils": "1.7.0", + "discord.js-rate-limiter": "1.2.0", "express": "4.17.1", "express-promise-router": "4.1.0", "filesize": "7.0.0", @@ -40,7 +40,7 @@ }, "devDependencies": { "@types/express": "4.17.13", - "@types/node": "16.4.10", + "@types/node": "16.6.1", "@types/node-fetch": "2.5.12", "@types/node-schedule": "1.3.2", "@types/remove-markdown": "0.3.1", diff --git a/src/app.ts b/src/app.ts index bd1a5f13..89e18caf 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,4 +1,4 @@ -import { ShardingManager } from 'discord.js-light'; +import { ShardingManager } from 'discord.js'; import 'reflect-metadata'; import { Api } from './api'; diff --git a/src/bot.ts b/src/bot.ts index 09ce19f8..0fd50920 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -6,7 +6,7 @@ import { MessageReaction, RateLimitData, User, -} from 'discord.js-light'; +} from 'discord.js'; import { GuildJoinHandler, GuildLeaveHandler, MessageHandler, ReactionHandler } from './events'; import { JobService, Logger } from './services'; diff --git a/src/commands/command.ts b/src/commands/command.ts index aaabfea2..e66e5071 100644 --- a/src/commands/command.ts +++ b/src/commands/command.ts @@ -1,4 +1,4 @@ -import { Message, PermissionResolvable } from 'discord.js-light'; +import { Message, PermissionResolvable } from 'discord.js'; import { Keyword } from '../models/common'; import { EventData } from '../models/internal-models'; diff --git a/src/commands/dev-command.ts b/src/commands/dev-command.ts index eef85804..523ae8a8 100644 --- a/src/commands/dev-command.ts +++ b/src/commands/dev-command.ts @@ -1,4 +1,4 @@ -import djs, { Message } from 'discord.js-light'; +import djs, { Message } from 'discord.js'; import fileSize from 'filesize'; import typescript from 'typescript'; @@ -70,7 +70,7 @@ export class DevCommand implements Command { serverCount > 0 ? fileSize(memory.heapUsed / serverCount) : Lang.getRef('other.na', data.lang()), - SHARD_ID: (msg.guild?.shardID ?? 0).toString(), + SHARD_ID: (msg.guild?.shardId ?? 0).toString(), SERVER_ID: msg.guild?.id ?? Lang.getRef('other.na', data.lang()), BOT_ID: msg.client.user.id, USER_ID: msg.author.id, diff --git a/src/commands/docs-command.ts b/src/commands/docs-command.ts index 5c523e2a..502d36e9 100644 --- a/src/commands/docs-command.ts +++ b/src/commands/docs-command.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js-light'; +import { Message } from 'discord.js'; import { LangCode } from '../models/enums'; import { EventData } from '../models/internal-models'; diff --git a/src/commands/help-command.ts b/src/commands/help-command.ts index 9b4dc668..502cce64 100644 --- a/src/commands/help-command.ts +++ b/src/commands/help-command.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js-light'; +import { Message } from 'discord.js'; import { LangCode } from '../models/enums'; import { EventData } from '../models/internal-models'; diff --git a/src/commands/info-command.ts b/src/commands/info-command.ts index a1e74caf..005eda71 100644 --- a/src/commands/info-command.ts +++ b/src/commands/info-command.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js-light'; +import { Message } from 'discord.js'; import { LangCode } from '../models/enums'; import { EventData } from '../models/internal-models'; diff --git a/src/commands/invite-command.ts b/src/commands/invite-command.ts index 8e1d86eb..a1136895 100644 --- a/src/commands/invite-command.ts +++ b/src/commands/invite-command.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js-light'; +import { Message } from 'discord.js'; import { LangCode } from '../models/enums'; import { EventData } from '../models/internal-models'; diff --git a/src/commands/support-command.ts b/src/commands/support-command.ts index d14a38f4..b18e2b04 100644 --- a/src/commands/support-command.ts +++ b/src/commands/support-command.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js-light'; +import { Message } from 'discord.js'; import { LangCode } from '../models/enums'; import { EventData } from '../models/internal-models'; diff --git a/src/commands/test-command.ts b/src/commands/test-command.ts index cfc7ee58..971a91a1 100644 --- a/src/commands/test-command.ts +++ b/src/commands/test-command.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js-light'; +import { Message } from 'discord.js'; import { LangCode } from '../models/enums'; import { EventData } from '../models/internal-models'; diff --git a/src/commands/translate-command.ts b/src/commands/translate-command.ts index 431b2b6b..c2030f5e 100644 --- a/src/commands/translate-command.ts +++ b/src/commands/translate-command.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js-light'; +import { Message } from 'discord.js'; import { LangCode, Language } from '../models/enums'; import { EventData } from '../models/internal-models'; diff --git a/src/commands/vote-command.ts b/src/commands/vote-command.ts index d2a33d8d..13f7ab45 100644 --- a/src/commands/vote-command.ts +++ b/src/commands/vote-command.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js-light'; +import { Message } from 'discord.js'; import { LangCode } from '../models/enums'; import { EventData } from '../models/internal-models'; diff --git a/src/controllers/guilds-controller.ts b/src/controllers/guilds-controller.ts index bd2813e5..8bbadc51 100644 --- a/src/controllers/guilds-controller.ts +++ b/src/controllers/guilds-controller.ts @@ -1,4 +1,4 @@ -import { ShardingManager } from 'discord.js-light'; +import { ShardingManager } from 'discord.js'; import { Request, Response, Router } from 'express'; import router from 'express-promise-router'; @@ -21,7 +21,9 @@ export class GuildsController implements Controller { private async getGuilds(req: Request, res: Response): Promise { let guilds: string[] = [ ...new Set( - (await this.shardManager.broadcastEval('this.guilds.cache.keyArray()')).flat() + ( + await this.shardManager.broadcastEval(client => [...client.guilds.cache.keys()]) + ).flat() ), ]; diff --git a/src/controllers/shards-controller.ts b/src/controllers/shards-controller.ts index b82de4fb..11e0853b 100644 --- a/src/controllers/shards-controller.ts +++ b/src/controllers/shards-controller.ts @@ -1,7 +1,8 @@ -import { ShardingManager } from 'discord.js-light'; +import { ShardingManager } from 'discord.js'; import { Request, Response, Router } from 'express'; import router from 'express-promise-router'; +import { CustomClient } from '../extensions'; import { mapClass } from '../middleware'; import { GetShardsResponse, @@ -39,9 +40,8 @@ export class ShardsController implements Controller { }; try { - shardInfo.uptimeSecs = Math.floor( - (await shard.fetchClientValue('uptime')) / 1000 - ); + let uptime = (await shard.fetchClientValue('uptime')) as number; + shardInfo.uptimeSecs = Math.floor(uptime / 1000); } catch (error) { Logger.error(Logs.error.managerShardInfo, error); shardInfo.error = true; @@ -66,11 +66,13 @@ export class ShardsController implements Controller { private async setShardPresences(req: Request, res: Response): Promise { let reqBody: SetShardPresencesRequest = res.locals.input; - await this.shardManager.broadcastEval(` - (async () => { - return await this.setPresence('${reqBody.type}', '${reqBody.name}', '${reqBody.url}'); - })(); - `); + await this.shardManager.broadcastEval( + async (client, context) => { + let customClient = client as CustomClient; + return await customClient.setPresence(context.type, context.name, context.url); + }, + { context: { type: reqBody.type, name: reqBody.name, url: reqBody.url } } + ); res.sendStatus(200); } diff --git a/src/events/command-handler.ts b/src/events/command-handler.ts index 4e7d6d61..b4c1a279 100644 --- a/src/events/command-handler.ts +++ b/src/events/command-handler.ts @@ -1,4 +1,11 @@ -import { GuildMember, Message, NewsChannel, Permissions, TextChannel } from 'discord.js-light'; +import { + GuildMember, + Message, + NewsChannel, + Permissions, + TextChannel, + ThreadChannel, +} from 'discord.js'; import { RateLimiter } from 'discord.js-rate-limiter'; import { Command } from '../commands'; @@ -100,7 +107,9 @@ export class CommandHandler { // Log command error Logger.error( - msg.channel instanceof TextChannel || msg.channel instanceof NewsChannel + msg.channel instanceof TextChannel || + msg.channel instanceof NewsChannel || + msg.channel instanceof ThreadChannel ? Logs.error.commandGuild .replace('{MESSAGE_ID}', msg.id) .replace('{COMMAND_KEYWORD}', command.keyword(Lang.Default)) @@ -131,12 +140,12 @@ export class CommandHandler { } // Members with "Manage Server" have permission for all commands - if (member.hasPermission(Permissions.FLAGS.MANAGE_GUILD)) { + if (member.permissions.has(Permissions.FLAGS.MANAGE_GUILD)) { return true; } // Check if member has required permissions for command - if (!member.hasPermission(command.requirePerms)) { + if (!member.permissions.has(command.requirePerms)) { return false; } diff --git a/src/events/event-handler.ts b/src/events/event-handler.ts index 245fa223..ed90dbee 100644 --- a/src/events/event-handler.ts +++ b/src/events/event-handler.ts @@ -1,4 +1,4 @@ -import { User } from 'discord.js-light'; +import { User } from 'discord.js'; export interface EventHandler { process(event: any, user?: User): Promise; diff --git a/src/events/guild-join-handler.ts b/src/events/guild-join-handler.ts index dfa50083..70d6245b 100644 --- a/src/events/guild-join-handler.ts +++ b/src/events/guild-join-handler.ts @@ -1,4 +1,4 @@ -import { Guild } from 'discord.js-light'; +import { Guild } from 'discord.js'; import { Lang, Logger } from '../services'; import { ClientUtils, MessageUtils } from '../utils'; @@ -31,9 +31,10 @@ export class GuildJoinHandler implements EventHandler { // Send welcome message to owner // TODO: Replace "Lang.Default" here with the owner's language let ownerLang = Lang.Default; - if (guild.owner) { + let owner = await guild.fetchOwner(); + if (owner) { await MessageUtils.send( - guild.owner.user, + owner.user, Lang.getEmbed('displays.welcome', ownerLang).setAuthor(guild.name, guild.iconURL()) ); } diff --git a/src/events/guild-leave-handler.ts b/src/events/guild-leave-handler.ts index 30ea897d..0eeccdb8 100644 --- a/src/events/guild-leave-handler.ts +++ b/src/events/guild-leave-handler.ts @@ -1,4 +1,4 @@ -import { Guild } from 'discord.js-light'; +import { Guild } from 'discord.js'; import { Logger } from '../services'; import { EventHandler } from './event-handler'; diff --git a/src/events/message-handler.ts b/src/events/message-handler.ts index 8eaf5ded..e0e30d28 100644 --- a/src/events/message-handler.ts +++ b/src/events/message-handler.ts @@ -1,4 +1,4 @@ -import { DMChannel, Message, NewsChannel, TextChannel } from 'discord.js-light'; +import { DMChannel, Message, NewsChannel, TextChannel, ThreadChannel } from 'discord.js'; import { CommandHandler, EventHandler, TriggerHandler } from '.'; @@ -16,7 +16,8 @@ export class MessageHandler implements EventHandler { !( msg.channel instanceof DMChannel || msg.channel instanceof TextChannel || - msg.channel instanceof NewsChannel + msg.channel instanceof NewsChannel || + msg.channel instanceof ThreadChannel ) ) { return; diff --git a/src/events/reaction-handler.ts b/src/events/reaction-handler.ts index d8340047..4d2abdbe 100644 --- a/src/events/reaction-handler.ts +++ b/src/events/reaction-handler.ts @@ -1,4 +1,11 @@ -import { DMChannel, MessageReaction, NewsChannel, TextChannel, User } from 'discord.js-light'; +import { + DMChannel, + MessageReaction, + NewsChannel, + TextChannel, + ThreadChannel, + User, +} from 'discord.js'; import { RateLimiter } from 'discord.js-rate-limiter'; import { EventHandler } from '.'; @@ -28,7 +35,8 @@ export class ReactionHandler implements EventHandler { !( msg.channel instanceof DMChannel || msg.channel instanceof TextChannel || - msg.channel instanceof NewsChannel + msg.channel instanceof NewsChannel || + msg.channel instanceof ThreadChannel ) ) { return; diff --git a/src/events/trigger-handler.ts b/src/events/trigger-handler.ts index 17f1672b..868c2606 100644 --- a/src/events/trigger-handler.ts +++ b/src/events/trigger-handler.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js-light'; +import { Message } from 'discord.js'; import { RateLimiter } from 'discord.js-rate-limiter'; import { EventData } from '../models/internal-models'; diff --git a/src/extensions/custom-client.ts b/src/extensions/custom-client.ts index 733f166f..5e7b76da 100644 --- a/src/extensions/custom-client.ts +++ b/src/extensions/custom-client.ts @@ -1,4 +1,4 @@ -import { ActivityType, Client, ClientOptions, Presence } from 'discord.js-light'; +import { ActivityType, Client, ClientOptions, Presence } from 'discord.js'; export class CustomClient extends Client { constructor(clientOptions: ClientOptions) { @@ -7,11 +7,13 @@ export class CustomClient extends Client { public async setPresence(type: ActivityType, name: string, url: string): Promise { return await this.user?.setPresence({ - activity: { - type, - name, - url, - }, + activities: [ + { + type, + name, + url, + }, + ], }); } } diff --git a/src/jobs/update-server-count-job.ts b/src/jobs/update-server-count-job.ts index 9290d270..7a2cb4f3 100644 --- a/src/jobs/update-server-count-job.ts +++ b/src/jobs/update-server-count-job.ts @@ -1,5 +1,6 @@ -import { ActivityType, ShardingManager } from 'discord.js-light'; +import { ActivityType, ShardingManager } from 'discord.js'; +import { CustomClient } from '../extensions'; import { BotSite } from '../models/config-models'; import { HttpService, Lang, Logger } from '../services'; import { ShardUtils } from '../utils'; @@ -27,11 +28,13 @@ export class UpdateServerCountJob implements Job { let name = `to ${serverCount.toLocaleString()} servers`; let url = Lang.getRef('links.stream', Lang.Default); - await this.shardManager.broadcastEval(` - (async () => { - return await this.setPresence('${type}', '${name}', '${url}'); - })(); - `); + await this.shardManager.broadcastEval( + async (client, context) => { + let customClient = client as CustomClient; + return await customClient.setPresence(context.type, context.name, context.url); + }, + { context: { type, name, url } } + ); Logger.info( Logs.info.updatedServerCount.replace('{SERVER_COUNT}', serverCount.toLocaleString()) diff --git a/src/manager.ts b/src/manager.ts index 09af8fa5..203e07fd 100644 --- a/src/manager.ts +++ b/src/manager.ts @@ -1,4 +1,4 @@ -import { Shard, ShardingManager } from 'discord.js-light'; +import { Shard, ShardingManager } from 'discord.js'; import { JobService, Logger } from './services'; @@ -12,9 +12,7 @@ export class Manager { public async start(): Promise { this.registerListeners(); - // TODO: Refactor this once DJS fixes their typings - // tslint:disable-next-line:no-string-literal - let shardList: number[] = this.shardManager['shardList']; + let shardList = this.shardManager.shardList as number[]; try { Logger.info( @@ -22,11 +20,11 @@ export class Manager { .replace('{SHARD_COUNT}', shardList.length.toLocaleString()) .replace('{SHARD_LIST}', shardList.join(', ')) ); - await this.shardManager.spawn( - this.shardManager.totalShards, - Config.sharding.spawnDelay * 1000, - Config.sharding.spawnTimeout * 1000 - ); + await this.shardManager.spawn({ + amount: this.shardManager.totalShards, + delay: Config.sharding.spawnDelay * 1000, + timeout: Config.sharding.spawnTimeout * 1000, + }); Logger.info(Logs.info.managerAllShardsSpawned); } catch (error) { Logger.error(Logs.error.managerSpawningShards, error); diff --git a/src/models/cluster-api/shards.ts b/src/models/cluster-api/shards.ts index fdacae84..bca51f1f 100644 --- a/src/models/cluster-api/shards.ts +++ b/src/models/cluster-api/shards.ts @@ -1,5 +1,5 @@ import { IsDefined, IsEnum, IsString, IsUrl, Length } from 'class-validator'; -import { Constants } from 'discord.js'; +import { ActivityType, Constants } from 'discord.js'; export interface GetShardsResponse { shards: ShardInfo[]; @@ -21,7 +21,7 @@ export interface ShardInfo { export class SetShardPresencesRequest { @IsDefined() @IsEnum(Constants.ActivityTypes) - type: string; + type: ActivityType; @IsDefined() @IsString() diff --git a/src/reactions/reaction.ts b/src/reactions/reaction.ts index d6d80f27..499a2f22 100644 --- a/src/reactions/reaction.ts +++ b/src/reactions/reaction.ts @@ -1,4 +1,4 @@ -import { MessageReaction, User } from 'discord.js-light'; +import { MessageReaction, User } from 'discord.js'; import { EventData } from '../models/internal-models'; diff --git a/src/services/lang.ts b/src/services/lang.ts index fd3841b1..e836a01d 100644 --- a/src/services/lang.ts +++ b/src/services/lang.ts @@ -1,4 +1,4 @@ -import { MessageEmbed } from 'discord.js-light'; +import { MessageEmbed } from 'discord.js'; import { MultilingualService } from 'discord.js-multilingual-utils'; import path from 'path'; diff --git a/src/services/logger.ts b/src/services/logger.ts index 2f1ca65a..c736fde2 100644 --- a/src/services/logger.ts +++ b/src/services/logger.ts @@ -1,4 +1,4 @@ -import { DiscordAPIError } from 'discord.js-light'; +import { DiscordAPIError } from 'discord.js'; import { Response } from 'node-fetch'; export class Logger { diff --git a/src/start.ts b/src/start.ts index 88a87fdd..207fe639 100644 --- a/src/start.ts +++ b/src/start.ts @@ -1,3 +1,5 @@ +import { Options } from 'discord.js'; + import { Bot } from './bot'; import { DevCommand, @@ -26,21 +28,14 @@ let Logs = require('../lang/logs.json'); async function start(): Promise { let client = new CustomClient({ - // discord.js Options - ws: { intents: Config.client.intents }, + intents: Config.client.intents, partials: Config.client.partials, - messageCacheMaxSize: Config.client.caches.messages.size, - messageCacheLifetime: Config.client.caches.messages.lifetime, - messageSweepInterval: Config.client.caches.messages.sweepInterval, - - // discord.js-light Options - cacheGuilds: Config.client.caches.guilds, - cacheRoles: Config.client.caches.roles, - cacheEmojis: Config.client.caches.emojis, - cacheChannels: Config.client.caches.channels, - cacheOverwrites: Config.client.caches.overwrites, - cachePresences: Config.client.caches.presences, - disabledEvents: Config.client.disabledEvents, + makeCache: Options.cacheWithLimits({ + // Keep default caching behavior + ...Options.defaultMakeCacheSettings, + // Override specific options from config + ...Config.caches, + }), }); // Commands diff --git a/src/triggers/trigger.ts b/src/triggers/trigger.ts index 75cb271c..c6f6378f 100644 --- a/src/triggers/trigger.ts +++ b/src/triggers/trigger.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js-light'; +import { Message } from 'discord.js'; import { EventData } from '../models/internal-models'; export interface Trigger { diff --git a/src/utils/client-utils.ts b/src/utils/client-utils.ts index 18e6e413..a9aa3862 100644 --- a/src/utils/client-utils.ts +++ b/src/utils/client-utils.ts @@ -1,5 +1,5 @@ import { Client } from 'discord.js'; -import { DiscordAPIError, Guild, GuildMember, TextChannel, User } from 'discord.js-light'; +import { DiscordAPIError, Guild, GuildMember, TextChannel, User } from 'discord.js'; import { PermissionUtils, RegexUtils } from '.'; import { LangCode } from '../models/enums'; diff --git a/src/utils/format-utils.ts b/src/utils/format-utils.ts index fe930d05..7973db81 100644 --- a/src/utils/format-utils.ts +++ b/src/utils/format-utils.ts @@ -1,4 +1,4 @@ -import { Guild } from 'discord.js-light'; +import { Guild } from 'discord.js'; export class FormatUtils { public static roleMention(guild: Guild, discordId: string): string { diff --git a/src/utils/message-utils.ts b/src/utils/message-utils.ts index e8372ba8..12e5863b 100644 --- a/src/utils/message-utils.ts +++ b/src/utils/message-utils.ts @@ -1,27 +1,23 @@ import { - Channel, DiscordAPIError, - DMChannel, EmojiResolvable, Message, + MessageEmbed, MessageReaction, - NewsChannel, - StringResolvable, - TextChannel, + TextBasedChannels, User, -} from 'discord.js-light'; +} from 'discord.js'; export class MessageUtils { - public static async send(target: User | Channel, content: StringResolvable): Promise { + public static async send( + target: User | TextBasedChannels, + content: string | MessageEmbed + ): Promise { try { - if ( - target instanceof User || - target instanceof DMChannel || - target instanceof TextChannel || - target instanceof NewsChannel - ) { - return await target.send(content); - } + return await target.send({ + embeds: content instanceof MessageEmbed ? [content] : undefined, + content: typeof content === 'string' ? content : undefined, + }); } catch (error) { // 10003: "Unknown channel" // 10004: "Unknown guild" @@ -38,9 +34,12 @@ export class MessageUtils { } } - public static async reply(msg: Message, content: StringResolvable): Promise { + public static async reply(msg: Message, content: string | MessageEmbed): Promise { try { - return await msg.reply(content); + return await msg.reply({ + embeds: content instanceof MessageEmbed ? [content] : undefined, + content: typeof content === 'string' ? content : undefined, + }); } catch (error) { // 10008: "Unknown Message" (Message was deleted) // 50007: "Cannot send messages to this user" (User blocked bot or DM disabled) @@ -52,9 +51,12 @@ export class MessageUtils { } } - public static async edit(msg: Message, content: StringResolvable): Promise { + public static async edit(msg: Message, content: string | MessageEmbed): Promise { try { - return await msg.edit(content); + return await msg.edit({ + embeds: content instanceof MessageEmbed ? [content] : undefined, + content: typeof content === 'string' ? content : undefined, + }); } catch (error) { // 10008: "Unknown Message" (Message was deleted) // 50007: "Cannot send messages to this user" (User blocked bot or DM disabled) diff --git a/src/utils/partial-utils.ts b/src/utils/partial-utils.ts index d3e9d454..164254a6 100644 --- a/src/utils/partial-utils.ts +++ b/src/utils/partial-utils.ts @@ -1,4 +1,4 @@ -import { DiscordAPIError, Message, MessageReaction } from 'discord.js-light'; +import { DiscordAPIError, Message, MessageReaction, PartialMessage } from 'discord.js'; // 10003: "Unknown Channel" (Channel was deleted) // 10008: "Unknown Message" (Message was deleted) @@ -6,10 +6,10 @@ import { DiscordAPIError, Message, MessageReaction } from 'discord.js-light'; const IGNORED_ERROR_CODES = [10003, 10008, 50001]; export class PartialUtils { - public static async fillMessage(msg: Message): Promise { + public static async fillMessage(msg: Message | PartialMessage): Promise { if (msg.partial) { try { - msg = await msg.fetch(); + return await msg.fetch(); } catch (error) { if (error instanceof DiscordAPIError && IGNORED_ERROR_CODES.includes(error.code)) { return; @@ -19,7 +19,7 @@ export class PartialUtils { } } - return msg; + return msg as Message; } public static async fillReaction(msgReaction: MessageReaction): Promise { diff --git a/src/utils/permission-utils.ts b/src/utils/permission-utils.ts index d5c0d944..f8226780 100644 --- a/src/utils/permission-utils.ts +++ b/src/utils/permission-utils.ts @@ -1,10 +1,21 @@ -import { Channel, DMChannel, NewsChannel, Permissions, TextChannel } from 'discord.js-light'; +import { + DMChannel, + NewsChannel, + Permissions, + TextBasedChannels, + TextChannel, + ThreadChannel, +} from 'discord.js'; export class PermissionUtils { - public static canSend(channel: Channel): boolean { + public static canSend(channel: TextBasedChannels): boolean { if (channel instanceof DMChannel) { return true; - } else if (channel instanceof TextChannel || channel instanceof NewsChannel) { + } else if ( + channel instanceof TextChannel || + channel instanceof NewsChannel || + channel instanceof ThreadChannel + ) { let channelPerms = channel.permissionsFor(channel.client.user); if (!channelPerms) { // This can happen if the guild disconnected while a collector is running @@ -22,10 +33,14 @@ export class PermissionUtils { } } - public static canSendEmbed(channel: Channel): boolean { + public static canSendEmbed(channel: TextBasedChannels): boolean { if (channel instanceof DMChannel) { return true; - } else if (channel instanceof TextChannel || channel instanceof NewsChannel) { + } else if ( + channel instanceof TextChannel || + channel instanceof NewsChannel || + channel instanceof ThreadChannel + ) { let channelPerms = channel.permissionsFor(channel.client.user); if (!channelPerms) { // This can happen if the guild disconnected while a collector is running @@ -45,10 +60,14 @@ export class PermissionUtils { } } - public static canMention(channel: Channel): boolean { + public static canMention(channel: TextBasedChannels): boolean { if (channel instanceof DMChannel) { return true; - } else if (channel instanceof TextChannel || channel instanceof NewsChannel) { + } else if ( + channel instanceof TextChannel || + channel instanceof NewsChannel || + channel instanceof ThreadChannel + ) { let channelPerms = channel.permissionsFor(channel.client.user); if (!channelPerms) { // This can happen if the guild disconnected while a collector is running @@ -66,10 +85,14 @@ export class PermissionUtils { } } - public static canReact(channel: Channel, removeOthers: boolean = false): boolean { + public static canReact(channel: TextBasedChannels, removeOthers: boolean = false): boolean { if (channel instanceof DMChannel) { return true; - } else if (channel instanceof TextChannel || channel instanceof NewsChannel) { + } else if ( + channel instanceof TextChannel || + channel instanceof NewsChannel || + channel instanceof ThreadChannel + ) { let channelPerms = channel.permissionsFor(channel.client.user); if (!channelPerms) { // This can happen if the guild disconnected while a collector is running @@ -92,10 +115,14 @@ export class PermissionUtils { } } - public static canPin(channel: Channel, unpinOld: boolean = false): boolean { + public static canPin(channel: TextBasedChannels, unpinOld: boolean = false): boolean { if (channel instanceof DMChannel) { return true; - } else if (channel instanceof TextChannel || channel instanceof NewsChannel) { + } else if ( + channel instanceof TextChannel || + channel instanceof NewsChannel || + channel instanceof ThreadChannel + ) { let channelPerms = channel.permissionsFor(channel.client.user); if (!channelPerms) { // This can happen if the guild disconnected while a collector is running diff --git a/src/utils/shard-utils.ts b/src/utils/shard-utils.ts index 6a182876..c90376b2 100644 --- a/src/utils/shard-utils.ts +++ b/src/utils/shard-utils.ts @@ -1,4 +1,4 @@ -import { ShardClientUtil, ShardingManager, Util } from 'discord.js-light'; +import { ShardClientUtil, ShardingManager, Util } from 'discord.js'; import { MathUtils } from '.'; const MAX_SERVERS_PER_SHARD = 2500; @@ -12,7 +12,9 @@ export class ShardUtils { token: string, serversPerShard: number ): Promise { - return Math.ceil(await Util.fetchRecommendedShards(token, serversPerShard)); + return Math.ceil( + await Util.fetchRecommendedShards(token, { guildsPerShard: serversPerShard }) + ); } public static shardIds(shardInterface: ShardingManager | ShardClientUtil): number[] { @@ -33,9 +35,9 @@ export class ShardUtils { public static async serverCount( shardInterface: ShardingManager | ShardClientUtil ): Promise { - let shardGuildCounts: number[] = await shardInterface.fetchClientValues( + let shardGuildCounts = (await shardInterface.fetchClientValues( 'guilds.cache.size' - ); + )) as number[]; return MathUtils.sum(shardGuildCounts); } }