@getsolara/solara.js
Version:
A lightweight and modular Discord bot framework built on discord.js v14, with truly optional feature packages.
35 lines • 1.99 kB
JavaScript
const { PermissionsBitField } = require('discord.js');
module.exports = {
name: "$hasPermission",
description: "Checks if a member has permissions. Args: permission1;[permission2...];[memberID=@me]",
takesBrackets: true,
execute: async (context, args) => {
if (args.length === 0) return "[Error: $hasPermission requires at least one permission name]";
let memberId = null; let permissionsToCheck = [];
const lastArg = args[args.length - 1];
if (/^\d{17,19}$/.test(lastArg) || lastArg === '@me') {
memberId = lastArg === '@me' ? (context.member?.id || context.user?.id) : lastArg;
permissionsToCheck = args.slice(0, -1);
} else {
memberId = context.member?.id || context.user?.id;
permissionsToCheck = args;
}
if (!memberId) return "[Error: Cannot determine target member for permission check]";
if (!context.guild) return "[Error: $hasPermission requires a guild context]";
let targetMember = context.member;
if (memberId !== context.member?.id) {
try { targetMember = await context.guild.members.fetch(memberId); }
catch (e) { return `[Error: Could not find member with ID ${memberId} in this guild]`; }
}
if (!targetMember) return "[Error: Could not find member to check permissions]";
const perms = context.channel ? targetMember.permissionsIn(context.channel) : targetMember.permissions;
if (!perms) return "[Error: Could not evaluate permissions]";
try {
const permissionFlags = permissionsToCheck.map(p => {
if (PermissionsBitField.Flags[p]) return PermissionsBitField.Flags[p];
throw new Error(`Invalid permission name: ${p}`);
});
return perms.has(permissionFlags).toString();
} catch (e) { return `[Error: Permission Check Failed - ${e.message}]`; }
}
};