51 lines
1.2 KiB
TypeScript

import { BitwisePermissionFlags } from '@biscuitland/api-types';
export type PermissionString = keyof typeof BitwisePermissionFlags;
export type PermissionResolvable =
| bigint
| PermissionString
| PermissionString[]
| BitwisePermissionFlags;
export class Permissions {
static Flags = BitwisePermissionFlags;
bitfield: bigint;
constructor(bitfield: PermissionResolvable) {
this.bitfield = Permissions.resolve(bitfield);
}
has(bit: PermissionResolvable): boolean {
if (this.bitfield & BigInt(Permissions.Flags.ADMINISTRATOR)) {
return true;
}
return !!(this.bitfield & Permissions.resolve(bit));
}
static resolve(bit: PermissionResolvable): bigint {
switch (typeof bit) {
case 'bigint':
return bit;
case 'number':
return BigInt(bit);
case 'string':
return BigInt(Permissions.Flags[bit]);
case 'object':
return Permissions.resolve(
bit
.map(p => BigInt(Permissions.Flags[p]))
.reduce((acc, cur) => acc | cur, 0n)
);
default:
throw new TypeError(`Cannot resolve permission: ${bit}`);
}
}
toJSON(): { fields: string[] } {
const fields = Object.keys(Permissions.Flags).filter((bit) => typeof bit !== 'string' && this.has(bit));
return { fields };
}
}