mirror of
https://github.com/tiramisulabs/seyfert.git
synced 2025-07-04 05:56:09 +00:00
51 lines
1.2 KiB
TypeScript
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 };
|
|
}
|
|
}
|