diff --git a/src/util/Permissions.ts b/src/util/Permissions.ts
index ae21e138..c7a41594 100644
--- a/src/util/Permissions.ts
+++ b/src/util/Permissions.ts
@@ -97,6 +97,16 @@ export class Permissions extends BitField {
return (checkAdmin && super.has(Permissions.FLAGS.ADMINISTRATOR)) || super.has(permission);
}
+ /**
+ * Checks whether the bitfield has a permission, or multiple permissions, but throws an Error if user fails to match auth criteria.
+ */
+ hasThrow(permission: PermissionResolvable, checkAdmin = true) {
+ if ((checkAdmin && super.has(Permissions.FLAGS.ADMINISTRATOR)) || super.has(permission)) {
+ return true;
+ }
+ throw new Error(`User doesn't fulfill the following permission criteria: ${permission}`);
+ }
+
static channelPermission(overwrites: ChannelPermissionOverwrite[], init?: bigint) {
// TODO: do not deny any permissions if admin
return overwrites.reduce((permission, overwrite) => {
@@ -121,7 +131,7 @@ export class Permissions extends BitField {
guild,
channel,
}: {
- user: { id: bigint; roles: bigint[] };
+ user: { id: string; roles: string[] };
guild: { roles: Role[] };
channel?: {
overwrites?: ChannelPermissionOverwrite[];
@@ -144,22 +154,24 @@ export class Permissions extends BitField {
}
export async function getPermission(
- user_id: bigint,
- guild_id: bigint,
- channel_id?: bigint,
- cache?: { channel?: ChannelDocument | null; member?: MemberDocument | null }
+ user_id: string,
+ guild_id: string,
+ channel_id?: string,
+ cache?: { channel?: ChannelDocument | null; member?: MemberDocument | null; guild?: GuildDocument | null }
) {
- var { channel, member } = cache || {};
+ var { channel, member, guild } = cache || {};
- const guild = await GuildModel.findOne({ id: guild_id }, { owner_id: true }).exec();
+ if (!guild) guild = await GuildModel.findOne({ id: guild_id }, { owner_id: true }).exec();
if (!guild) throw new Error("Guild not found");
if (guild.owner_id === user_id) return new Permissions(Permissions.FLAGS.ADMINISTRATOR);
- member = await MemberModel.findOne({ guild_id, id: user_id }, "roles").exec();
+ if (!member) member = await MemberModel.findOne({ guild_id, id: user_id }, "roles").exec();
if (!member) throw new Error("Member not found");
- var roles = await RoleModel.find({ guild_id, id: { $in: member.roles } }).exec();
- if (channel_id) {
+ var roles = await RoleModel.find({ guild_id, id: { $in: member.roles } })
+ .lean()
+ .exec();
+ if (channel_id && !channel) {
channel = await ChannelModel.findOne({ id: channel_id }, "permission_overwrites").exec();
}
|