Custom permission function

This commit is contained in:
mmacierzanka committed 2021-08-21 16:11:35 +02:00
1 parent f57c3b3f86
commit a1ffd7c9d9
4 files changed
+23 -7

No files matched your search

+12 -4
View File
@@ -1,5 +1,5 @@
//IMPORTS //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 { CommandBuilder, ParameterResolvable, PermissionCheckTypes } from "./types.js";
import { OperationSuccess, PermissionsError } from "./errors.js"; import { OperationSuccess, PermissionsError } from "./errors.js";
import { DefaultParameter, InputParameter, Parameter } from "./Parameter.js"; import { DefaultParameter, InputParameter, Parameter } from "./Parameter.js";
@@ -12,7 +12,7 @@ export class Command {
description: string; description: string;
usage?: string; usage?: string;
permissionCheck: PermissionCheckTypes; permissionCheck: PermissionCheckTypes;
permissions?: Permissions; permissions?: Permissions | ((m?: Message | CommandInteraction) => boolean);
guilds?: string[]; guilds?: string[];
visible: boolean; visible: boolean;
slash: boolean; slash: boolean;
@@ -50,7 +50,7 @@ export class Command {
this.description = options.description || "No description"; this.description = options.description || "No description";
this.usage = options.usage || this.generateUsageFromArguments(); this.usage = options.usage || this.generateUsageFromArguments();
this.permissionCheck = options.permissionCheck == "ALL" || options.permissionCheck == "ANY" ? options.permissionCheck : "ANY"; 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.guilds = options.guilds;
this.visible = options.visible !== undefined ? options.visible : true; this.visible = options.visible !== undefined ? options.visible : true;
this.slash = options.slash !== undefined ? options.slash : 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; return returnType === "object" ? cmdParams?.find((p) => p.name === query) || null : cmdParams?.find((p) => p.name === query)?.value || null;
}; };
const memberPermissions: Readonly<Permissions> = (interaction?.member?.permissions as Permissions) || new Permissions(); const memberPermissions: Readonly<Permissions> = (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) { if (interaction instanceof CommandInteraction) {
await interaction.deferReply(); await interaction.deferReply();
} }
+5 -1
View File
@@ -30,13 +30,17 @@ export class HelpMessage extends Command {
helpMsg.setTitle(`${cmd.name} ${cmd.visible ? "" : "[HIDDEN]"}`); helpMsg.setTitle(`${cmd.name} ${cmd.visible ? "" : "[HIDDEN]"}`);
helpMsg.setDescription(cmd.description); helpMsg.setDescription(cmd.description);
if (cmd.usage) helpMsg.addField("Usage:", `${cmdManager.prefix || "/"}${cmd.name} ${cmd.usage}`, false); if (cmd.usage) helpMsg.addField("Usage:", `${cmdManager.prefix || "/"}${cmd.name} ${cmd.usage}`, false);
if (cmd.permissions && cmd.permissions.toArray(false).length > 0) { if (cmd.permissions) {
if (cmd.permissions instanceof Function) {
helpMsg.addField("Permissions:", "Custom", false);
} else if (cmd.permissions.toArray(false).length > 0) {
let permList: string = ""; let permList: string = "";
cmd.permissions.toArray(false).map((p) => { cmd.permissions.toArray(false).map((p) => {
permList += p + "\n"; permList += p + "\n";
}); });
helpMsg.addField("Permissions:", permList, false); helpMsg.addField("Permissions:", permList, false);
} }
}
if (cmd.aliases && cmd.aliases.length > 0) { if (cmd.aliases && cmd.aliases.length > 0) {
let aList: string = ""; let aList: string = "";
cmd.aliases.map((a) => { cmd.aliases.map((a) => {
+5 -1
View File
@@ -107,7 +107,11 @@ export class SystemMessageManager {
embed.addField("Command name:", data.command.name, false); embed.addField("Command name:", data.command.name, false);
if (data.command.permissions) { if (data.command.permissions) {
let permList: string = ""; let permList: string = "";
data.command.permissions.toArray(false).map((p) => { data.command.permissions instanceof Function
? (() => {
permList = "Custom";
})()
: data.command.permissions.toArray(false).map((p) => {
permList += p + "\n"; permList += p + "\n";
}); });
embed.addField("Required permissions:", permList, false); embed.addField("Required permissions:", permList, false);
+1 -1
View File
@@ -20,7 +20,7 @@ export interface CommandBuilder {
description?: string; description?: string;
usage?: string; usage?: string;
permissionCheck?: PermissionCheckTypes; permissionCheck?: PermissionCheckTypes;
permissions?: PermissionResolvable; permissions?: PermissionResolvable | ((m?: Message | CommandInteraction) => boolean);
guilds?: string[]; guilds?: string[];
visible?: boolean; visible?: boolean;
slash?: boolean; slash?: boolean;