1 files changed, 32 insertions, 0 deletions
diff --git a/dist/util/Permissions.js b/dist/util/Permissions.js
index b594ff89..0686e273 100644
--- a/dist/util/Permissions.js
+++ b/dist/util/Permissions.js
@@ -14,6 +14,38 @@ class Permissions extends BitField_1.BitField {
has(permission, checkAdmin = true) {
return (checkAdmin && super.has(Permissions.FLAGS.ADMINISTRATOR)) || super.has(permission);
}
+ static channelPermission(overwrites, init) {
+ // channelOverwrites.filter((x) => x.type === 1 && x.id !== user.id);
+ return overwrites.reduce((permission, overwrite) => {
+ // apply disallowed permission
+ // * permission: current calculated permission (e.g. 010)
+ // * deny contains all denied permissions (e.g. 011)
+ // * allow contains all explicitly allowed permisions (e.g. 100)
+ return (permission & ~overwrite.deny) | overwrite.allow;
+ // ~ operator inverts deny (e.g. 011 -> 100)
+ // & operator only allows 1 for both ~deny and permission (e.g. 010 & 100 -> 000)
+ // | operators adds both together (e.g. 000 + 100 -> 100)
+ }, 0n ?? init);
+ }
+ static rolePermission(roles) {
+ // adds all permissions of all roles together (Bit OR)
+ return roles.reduce((permission, role) => permission | role.permissions, 0n);
+ }
+ static finalPermission({ user, guild, channel, }) {
+ let roles = guild.roles.filter((x) => user.roles.includes(x.id));
+ let permission = Permissions.rolePermission(roles);
+ if (channel?.overwrites) {
+ let overwrites = channel.overwrites.filter((x) => {
+ if (x.type === 0 && user.roles.includes(x.id))
+ return true;
+ if (x.type === 1 && x.id == user.id)
+ return true;
+ return false;
+ });
+ permission = Permissions.channelPermission(overwrites, permission);
+ }
+ return permission;
+ }
}
exports.Permissions = Permissions;
Permissions.FLAGS = {
|