From a1ffd7c9d95f1e2a944345dcc9a7d2c4df0ffefe Mon Sep 17 00:00:00 2001 From: GRZ4NA Date: Sat, 21 Aug 2021 16:11:35 +0200 Subject: [PATCH] Custom permission function --- src/Command.ts | 16 ++++++++++++---- src/Help.ts | 16 ++++++++++------ src/SystemMessage.ts | 10 +++++++--- src/types.ts | 2 +- 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/Command.ts b/src/Command.ts index b6dd3eb..e8ece4a 100644 --- a/src/Command.ts +++ b/src/Command.ts @@ -1,5 +1,5 @@ //IMPORTS -import { Permissions, Message, MessageEmbed, CommandInteraction, GuildMember, ReplyMessageOptions } from "discord.js"; +import { Permissions, Message, MessageEmbed, CommandInteraction, GuildMember, ReplyMessageOptions, PermissionResolvable } from "discord.js"; import { CommandBuilder, ParameterResolvable, PermissionCheckTypes } from "./types.js"; import { OperationSuccess, PermissionsError } from "./errors.js"; import { DefaultParameter, InputParameter, Parameter } from "./Parameter.js"; @@ -12,7 +12,7 @@ export class Command { description: string; usage?: string; permissionCheck: PermissionCheckTypes; - permissions?: Permissions; + permissions?: Permissions | ((m?: Message | CommandInteraction) => boolean); guilds?: string[]; visible: boolean; slash: boolean; @@ -50,7 +50,7 @@ export class Command { this.description = options.description || "No description"; this.usage = options.usage || this.generateUsageFromArguments(); this.permissionCheck = options.permissionCheck == "ALL" || options.permissionCheck == "ANY" ? options.permissionCheck : "ANY"; - this.permissions = options.permissions ? new Permissions(options.permissions) : undefined; + this.permissions = options.permissions ? (options.permissions instanceof Function ? options.permissions : new Permissions(options.permissions)) : undefined; this.guilds = options.guilds; this.visible = options.visible !== undefined ? options.visible : true; this.slash = options.slash !== undefined ? options.slash : true; @@ -75,7 +75,15 @@ export class Command { return returnType === "object" ? cmdParams?.find((p) => p.name === query) || null : cmdParams?.find((p) => p.name === query)?.value || null; }; const memberPermissions: Readonly = (interaction?.member?.permissions as Permissions) || new Permissions(); - if (!this.permissions || (this.permissionCheck == "ALL" ? memberPermissions.has(this.permissions, true) : memberPermissions.any(this.permissions, true))) { + if ( + !this.permissions || + (this.permissions instanceof Function && this.permissions(interaction)) || + (!(this.permissions instanceof Function) + ? this.permissionCheck == "ALL" + ? memberPermissions.has(this.permissions as PermissionResolvable, true) + : memberPermissions.any(this.permissions as PermissionResolvable, true) + : false) + ) { if (interaction instanceof CommandInteraction) { await interaction.deferReply(); } diff --git a/src/Help.ts b/src/Help.ts index b0d3c1e..59615e8 100644 --- a/src/Help.ts +++ b/src/Help.ts @@ -30,12 +30,16 @@ export class HelpMessage extends Command { helpMsg.setTitle(`${cmd.name} ${cmd.visible ? "" : "[HIDDEN]"}`); helpMsg.setDescription(cmd.description); if (cmd.usage) helpMsg.addField("Usage:", `${cmdManager.prefix || "/"}${cmd.name} ${cmd.usage}`, false); - if (cmd.permissions && cmd.permissions.toArray(false).length > 0) { - let permList: string = ""; - cmd.permissions.toArray(false).map((p) => { - permList += p + "\n"; - }); - helpMsg.addField("Permissions:", permList, false); + if (cmd.permissions) { + if (cmd.permissions instanceof Function) { + helpMsg.addField("Permissions:", "Custom", false); + } else if (cmd.permissions.toArray(false).length > 0) { + let permList: string = ""; + cmd.permissions.toArray(false).map((p) => { + permList += p + "\n"; + }); + helpMsg.addField("Permissions:", permList, false); + } } if (cmd.aliases && cmd.aliases.length > 0) { let aList: string = ""; diff --git a/src/SystemMessage.ts b/src/SystemMessage.ts index f992483..ec2d6de 100644 --- a/src/SystemMessage.ts +++ b/src/SystemMessage.ts @@ -107,9 +107,13 @@ export class SystemMessageManager { embed.addField("Command name:", data.command.name, false); if (data.command.permissions) { let permList: string = ""; - data.command.permissions.toArray(false).map((p) => { - permList += p + "\n"; - }); + data.command.permissions instanceof Function + ? (() => { + permList = "Custom"; + })() + : data.command.permissions.toArray(false).map((p) => { + permList += p + "\n"; + }); embed.addField("Required permissions:", permList, false); } } diff --git a/src/types.ts b/src/types.ts index 8d37317..d2fc29e 100644 --- a/src/types.ts +++ b/src/types.ts @@ -20,7 +20,7 @@ export interface CommandBuilder { description?: string; usage?: string; permissionCheck?: PermissionCheckTypes; - permissions?: PermissionResolvable; + permissions?: PermissionResolvable | ((m?: Message | CommandInteraction) => boolean); guilds?: string[]; visible?: boolean; slash?: boolean;