diff --git a/package.json b/package.json index cb12775..dc4793d 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ }, "homepage": "https://github.com/GRZ4NA/CommandBot#readme", "dependencies": { - "discord.js": "^12.5.3" + "axios": "^0.21.1", + "discord.js": "^13.0.0" }, "devDependencies": { "@types/node": "^15.12.4", diff --git a/src/Bot.ts b/src/Bot.ts index 8358b1d..cad8c67 100644 --- a/src/Bot.ts +++ b/src/Bot.ts @@ -1,4 +1,4 @@ -import { Client, Message } from "discord.js"; +import { Client, Intents, Message, TextChannel } from "discord.js"; import { Command } from "./Command.js"; import { CommandManager } from "./CommandManager.js"; import { @@ -27,6 +27,7 @@ export class Bot extends EventEmitter { client: Client; commands: CommandManager; token: string; + applicationId: string; messages: { help: HelpMessageParams; system: SystemMessageManager; @@ -45,12 +46,15 @@ export class Bot extends EventEmitter { constructor(options: InitOptions) { super(); this.name = options.name; - this.client = new Client(options.clientOptions); + this.client = new Client( + options.clientOptions || { intents: Intents.FLAGS.GUILDS } + ); this.commands = new CommandManager( options.prefix, options.argumentSeparator ); - this.token = options.token || ""; + this.token = options.token; + this.applicationId = options.applicationId; this.messages = { help: { enabled: true, @@ -70,11 +74,10 @@ export class Bot extends EventEmitter { * @param {string} [token] - app token from Discord Developer Portal * @returns *Promise* */ - async start(port?: number, token?: string): Promise { + async start(port?: number): Promise { try { console.log(`\nBot name: ${this.name}`); console.log(`Prefix: ${this.commands.prefix} \n`); - this.token = token || this.token; if (this.token === "") { throw new ReferenceError( 'No token specified. Please pass your Discord application token as an argument to the "start" method or in the constructor' @@ -96,8 +99,11 @@ export class Bot extends EventEmitter { this.commands.add(helpMsg); } process.stdout.write("Connecting to Discord... "); - await this.client.login(this.token); - this.client.on("ready", () => { + this.client.login(this.token); + this.client.on("ready", async () => { + console.log("✔"); + process.stdout.write("Registering commands... "); + console.log("✔\n"); this.emit("READY"); }); @@ -115,7 +121,7 @@ export class Bot extends EventEmitter { user: m.member || undefined, command: cmdMsg.command, }, - m.channel + m.channel as TextChannel ); } else { this.messages.system.send( @@ -125,7 +131,7 @@ export class Bot extends EventEmitter { user: m.member || undefined, error: e, }, - m.channel + m.channel as TextChannel ); console.error(e); } @@ -137,7 +143,7 @@ export class Bot extends EventEmitter { this.messages.system.send( "NOT_FOUND", { phrase: m.content, user: m.member || undefined }, - m.channel + m.channel as TextChannel ); } else { this.emit("MESSAGE", m); diff --git a/src/Command.ts b/src/Command.ts index 44989d2..8cf9d85 100644 --- a/src/Command.ts +++ b/src/Command.ts @@ -1,5 +1,5 @@ //IMPORTS -import { Permissions, Message, MessageEmbed } from "discord.js"; +import { Permissions, Message, MessageEmbed, Guild } from "discord.js"; import { CommandBuilder, PermissionCheckTypes, @@ -18,6 +18,7 @@ export class Command { usage: string; permissionCheck: PermissionCheckTypes; permissions: Permissions; + guilds: Guild[]; visible: boolean; private function: ( message?: Message, @@ -49,7 +50,8 @@ export class Command { options.permissionCheck == "ALL" || options.permissionCheck == "ANY" ? options.permissionCheck : "ANY"; - this.permissions = new Permissions(options.permissions || 0); + this.permissions = new Permissions(options.permissions || undefined); + this.guilds = options.guilds || []; this.visible = options.visible != undefined ? options.visible : true; this.function = options.function; } @@ -62,7 +64,7 @@ export class Command { */ async start(message?: Message, cmdParams?: string[]): Promise { const memberPermissions: Readonly = - message?.member?.permissions || new Permissions(0); + message?.member?.permissions || new Permissions(); if ( this.permissionCheck == "ALL" ? memberPermissions.has(this.permissions, true) @@ -85,7 +87,7 @@ export class Command { if (typeof fnResult == "string") { await message?.reply(fnResult); } else if (fnResult instanceof MessageEmbed) { - await message?.channel.send(fnResult); + await message?.channel.send({ embeds: [fnResult] }); } } else { throw new PermissionsError(this, message?.member); diff --git a/src/Help.ts b/src/Help.ts index 4974631..57dae6a 100644 --- a/src/Help.ts +++ b/src/Help.ts @@ -12,13 +12,13 @@ export class HelpMessage extends Command { super({ name: "help", usage: params.usage, - permissions: 0, + permissions: undefined, description: params.description, parameters: [ { name: "Command name", optional: true, - type: "TEXT", + type: "string", }, ], function: (_, a) => { diff --git a/src/Parameter.ts b/src/Parameter.ts index cdeba1a..d8a2646 100644 --- a/src/Parameter.ts +++ b/src/Parameter.ts @@ -10,7 +10,7 @@ export const ProcessArgument = ( type: ParameterType ): ParameterResolvable => { switch (type) { - case "TEXT": + /* case "TEXT": return a; case "NUMBER": const numF = parseFloat(a); @@ -26,8 +26,9 @@ export const ProcessArgument = ( return false; } else { throw new ParameterTypeError(a, type); - } + }*/ default: - throw new TypeError("Invalied type specified"); + return a; + //throw new TypeError("Invalied type specified"); } }; diff --git a/src/SystemMessage.ts b/src/SystemMessage.ts index 4cbe45f..1be25a3 100644 --- a/src/SystemMessage.ts +++ b/src/SystemMessage.ts @@ -79,10 +79,10 @@ export class SystemMessageManager { const embed = new MessageEmbed(); embed.setTitle(this[type].title); if (this[type].bottomText) - embed.setDescription(this[type].bottomText); + embed.setDescription(this[type].bottomText || ""); embed.setColor(this[type].accentColor || "#000"); if (this[type].showTimestamp) embed.setTimestamp(); - if (this[type].footer) embed.setFooter(this[type].footer); + if (this[type].footer) embed.setFooter(this[type].footer || ""); if (data) { switch (type) { case "ERROR": @@ -153,9 +153,11 @@ export class SystemMessageManager { } } if (channel) { - const message = await channel.send(embed); + const message = await channel.send({ embeds: [embed] }); if (this.deleteTimeout != Infinity && message.deletable) { - await message.delete({ timeout: this.deleteTimeout }); + setTimeout(async () => { + await message.delete(); + }, this.deleteTimeout || 0); } return message; } else { diff --git a/src/types.ts b/src/types.ts index a02bd99..2d59399 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,4 +1,13 @@ -import { ClientOptions, ColorResolvable } from "discord.js"; +import { + ClientOptions, + ColorResolvable, + Guild, + GuildMember, + NewsChannel, + Role, + TextChannel, + VoiceChannel, +} from "discord.js"; import { Parameter } from "./Parameter.js"; import { PermissionResolvable, Message, MessageEmbed } from "discord.js"; import type { Command } from "./Command.js"; @@ -8,7 +17,8 @@ export interface InitOptions { prefix: string; argumentSeparator?: string; clientOptions?: ClientOptions; - token?: string; + token: string; + applicationId: string; } export type GetMode = "ALL" | "PREFIX" | "NO_PREFIX"; export type PermissionCheckTypes = "ALL" | "ANY"; @@ -21,6 +31,7 @@ export interface CommandBuilder { usage?: string; permissionCheck?: PermissionCheckTypes; permissions?: PermissionResolvable; + guilds?: Guild[]; visible?: boolean; function: ( message?: Message, @@ -43,5 +54,20 @@ export interface HelpMessageParams { description: string; usage: string; } -export type ParameterType = "TEXT" | "TRUE/FALSE" | "NUMBER"; -export type ParameterResolvable = string | boolean | number; +export type ParameterType = + | "string" + | "boolean" + | "number" + | "user" + | "role" + | "channel" + | "mentionable"; +export type ParameterResolvable = + | string + | boolean + | number + | GuildMember + | Role + | TextChannel + | VoiceChannel + | NewsChannel; diff --git a/yarn.lock b/yarn.lock index d3946da..c1df744 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,21 @@ # yarn lockfile v1 -"@discordjs/collection@^0.1.6": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.1.6.tgz#9e9a7637f4e4e0688fd8b2b5c63133c91607682c" - integrity sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ== +"@discordjs/builders@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.4.0.tgz#bb41573ce4824aa9194a53b52c29c5219b610010" + integrity sha512-EiwLltKph6TSaPJIzJYdzNc1PnA2ZNaaE0t0ODg3ghnpVHqfgd0YX9/srsleYHW2cw1sfIq+kbM+h0etf7GWLA== + 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" + +"@discordjs/collection@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.2.1.tgz#ea4bc7b41b7b7b6daa82e439141222ec95c469b2" + integrity sha512-vhxqzzM8gkomw0TYRF3tgx7SwElzUlXT/Aa41O7mOcyN6wIJfj5JmDWaO5XGKsGSsNx7F3i5oIlrucCCWV1Nog== "@discordjs/form-data@^3.0.1": version "3.0.1" @@ -16,6 +27,16 @@ combined-stream "^1.0.8" mime-types "^2.1.12" +"@sapphire/async-queue@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.1.4.tgz#ae431310917a8880961cebe8e59df6ffa40f2957" + integrity sha512-fFrlF/uWpGOX5djw5Mu2Hnnrunao75WGey0sP0J3jnhmrJ5TAPzHYOmytD5iN/+pMxS+f+u/gezqHa9tPhRHEA== + +"@sindresorhus/is@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.1.tgz#d26729db850fa327b7cacc5522252194404226f5" + integrity sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g== + "@types/node@*": version "16.4.10" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.10.tgz#e57e2a54fc6da58da94b3571b1cb456d39f88597" @@ -26,25 +47,30 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.5.tgz#7b5b3532053fd14c771ad6598a4ee2c7a85aceca" integrity sha512-6ewfMNmkumZieB/EeJ4cdP1bbJyOlOt5MTwbKMr7WKxyCt2j09H8YWRK6zOd/Jh35Vu/gls39ZUmeu4vHu1WKQ== -"@types/ws@^7.4.5": +"@types/ws@^7.4.5", "@types/ws@^7.4.7": version "7.4.7" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== dependencies: "@types/node" "*" -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + +callsites@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -57,24 +83,46 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -discord.js@^12.5.3: - version "12.5.3" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-12.5.3.tgz#56820d473c24320871df9ea0bbc6b462f21cf85c" - integrity sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw== - dependencies: - "@discordjs/collection" "^0.1.6" - "@discordjs/form-data" "^3.0.1" - abort-controller "^3.0.0" - node-fetch "^2.6.1" - prism-media "^1.2.9" - setimmediate "^1.0.5" - tweetnacl "^1.0.3" - ws "^7.4.4" +discord-api-types@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.22.0.tgz#34dc57fe8e016e5eaac5e393646cd42a7e1ccc2a" + integrity sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg== -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== +discord.js@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0.tgz#fd1dde0e73f5dbcd0bf8edad68d3ef83fb2e36b7" + integrity sha512-QbGcxBFUuB6tIJ/xn6R86QeSolS0KGa9nsWcKegtaNWAggajVILA+eneZIZba38jqYes+FB4RHhg/kX3dm4v+Q== + dependencies: + "@discordjs/builders" "^0.4.0" + "@discordjs/collection" "^0.2.1" + "@discordjs/form-data" "^3.0.1" + "@sapphire/async-queue" "^1.1.4" + "@types/ws" "^7.4.7" + discord-api-types "^0.22.0" + node-fetch "^2.6.1" + ws "^7.5.1" + +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +follow-redirects@^1.10.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" + integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= mime-db@1.49.0: version "1.49.0" @@ -93,22 +141,39 @@ node-fetch@^2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -prism-media@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.3.1.tgz#418acd2b122bedea2e834056d678f9a5ad2943ae" - integrity sha512-nyYAa3KB4qteJIqdguKmwxTJgy55xxUtkJ3uRnOvO5jO+frci+9zpRXw6QZVcfDeva3S654fU9+26P2OSTzjHw== +ow@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/ow/-/ow-0.27.0.tgz#d44da088e8184fa11de64b5813206f9f86ab68d0" + 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" -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= +ts-mixer@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.0.tgz#4e631d3a36e3fa9521b973b132e8353bc7267f9f" + integrity sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ== -tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== +tslib@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== -ws@^7.4.4: +type-fest@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +vali-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + integrity sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY= + +ws@^7.5.1: version "7.5.3" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==