211 lines
6.8 KiB
TypeScript
211 lines
6.8 KiB
TypeScript
import BitField from "./BitField";
|
|
import * as util from "util";
|
|
|
|
/**
|
|
* Data structure that makes it easy to interact with a permission bitfield. All {@link GuildMember}s have a set of
|
|
* permissions in their guild, and each channel in the guild may also have {@link PermissionOverwrites} for the member
|
|
* that override their default permissions.
|
|
* @extends {BitField}
|
|
*/
|
|
export default class Permissions extends BitField {
|
|
/**
|
|
* @param {number|PermissionResolvable} permissions Permissions or bitfield to read from
|
|
*/
|
|
constructor(permissions: number | PermissionResolvable) {
|
|
super(permissions);
|
|
}
|
|
|
|
/**
|
|
* Bitfield of the packed permissions
|
|
* @type {number}
|
|
* @see {@link Permissions#bitfield}
|
|
* @deprecated
|
|
* @readonly
|
|
*/
|
|
get raw() {
|
|
return this.bitfield;
|
|
}
|
|
|
|
set raw(raw) {
|
|
this.bitfield = raw;
|
|
}
|
|
|
|
/**
|
|
* Checks whether the bitfield has a permission, or any of multiple permissions.
|
|
* @param {PermissionResolvable} permission Permission(s) to check for
|
|
* @param {boolean} [checkAdmin=true] Whether to allow the administrator permission to override
|
|
* @returns {boolean}
|
|
*/
|
|
any(permission: PermissionResolvable, checkAdmin: boolean = true): boolean {
|
|
return (
|
|
(checkAdmin && super.has((this.constructor as any).FLAGS.ADMINISTRATOR)) ||
|
|
super.any(permission)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Checks whether the bitfield has a permission, or multiple permissions.
|
|
* @param {PermissionResolvable} permission Permission(s) to check for
|
|
* @param {boolean} [checkAdmin=true] Whether to allow the administrator permission to override
|
|
* @returns {boolean}
|
|
*/
|
|
has(permission: PermissionResolvable, checkAdmin: boolean = true): boolean {
|
|
return (
|
|
(checkAdmin && super.has((this.constructor as any).FLAGS.ADMINISTRATOR)) ||
|
|
super.has(permission)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Numeric permission flags. All available properties:
|
|
* - `ADMINISTRATOR` (implicitly has *all* permissions, and bypasses all channel overwrites)
|
|
* - `CREATE_INSTANT_INVITE` (create invitations to the guild)
|
|
* - `KICK_MEMBERS`
|
|
* - `BAN_MEMBERS`
|
|
* - `MANAGE_CHANNELS` (edit and reorder channels)
|
|
* - `MANAGE_GUILD` (edit the guild information, region, etc.)
|
|
* - `ADD_REACTIONS` (add new reactions to messages)
|
|
* - `VIEW_AUDIT_LOG`
|
|
* - `PRIORITY_SPEAKER`
|
|
* - `STREAM`
|
|
* - `VIEW_CHANNEL`
|
|
* - `READ_MESSAGES` **(deprecated)**
|
|
* - `SEND_MESSAGES`
|
|
* - `SEND_TTS_MESSAGES`
|
|
* - `MANAGE_MESSAGES` (delete messages and reactions)
|
|
* - `EMBED_LINKS` (links posted will have a preview embedded)
|
|
* - `ATTACH_FILES`
|
|
* - `READ_MESSAGE_HISTORY` (view messages that were posted prior to opening Discord)
|
|
* - `MENTION_EVERYONE`
|
|
* - `USE_EXTERNAL_EMOJIS` (use emojis from different guilds)
|
|
* - `EXTERNAL_EMOJIS` **(deprecated)**
|
|
* - `CONNECT` (connect to a voice channel)
|
|
* - `SPEAK` (speak in a voice channel)
|
|
* - `MUTE_MEMBERS` (mute members across all voice channels)
|
|
* - `DEAFEN_MEMBERS` (deafen members across all voice channels)
|
|
* - `MOVE_MEMBERS` (move members between voice channels)
|
|
* - `USE_VAD` (use voice activity detection)
|
|
* - `CHANGE_NICKNAME`
|
|
* - `MANAGE_NICKNAMES` (change other members' nicknames)
|
|
* - `MANAGE_ROLES`
|
|
* - `MANAGE_ROLES_OR_PERMISSIONS` **(deprecated)**
|
|
* - `MANAGE_WEBHOOKS`
|
|
* - `MANAGE_EMOJIS`
|
|
* @type {Object}
|
|
* @see {@link https://discord.com/developers/docs/topics/permissions}
|
|
*/
|
|
static FLAGS:{
|
|
CREATE_INSTANT_INVITE: number,
|
|
KICK_MEMBERS: number,
|
|
BAN_MEMBERS: number,
|
|
ADMINISTRATOR: number,
|
|
MANAGE_CHANNELS: number,
|
|
MANAGE_GUILD: number,
|
|
ADD_REACTIONS: number,
|
|
VIEW_AUDIT_LOG: number,
|
|
PRIORITY_SPEAKER: number,
|
|
STREAM: number,
|
|
|
|
VIEW_CHANNEL: number,
|
|
READ_MESSAGES: number,
|
|
SEND_MESSAGES: number,
|
|
SEND_TTS_MESSAGES: number,
|
|
MANAGE_MESSAGES: number,
|
|
EMBED_LINKS: number,
|
|
ATTACH_FILES: number,
|
|
READ_MESSAGE_HISTORY: number,
|
|
MENTION_EVERYONE: number,
|
|
EXTERNAL_EMOJIS: number,
|
|
USE_EXTERNAL_EMOJIS: number,
|
|
|
|
CONNECT: number,
|
|
SPEAK: number,
|
|
MUTE_MEMBERS: number,
|
|
DEAFEN_MEMBERS: number,
|
|
MOVE_MEMBERS: number,
|
|
USE_VAD: number,
|
|
|
|
CHANGE_NICKNAME: number,
|
|
MANAGE_NICKNAMES: number,
|
|
MANAGE_ROLES: number,
|
|
MANAGE_ROLES_OR_PERMISSIONS: number,
|
|
MANAGE_WEBHOOKS: number,
|
|
MANAGE_EMOJIS: number,
|
|
} = {
|
|
CREATE_INSTANT_INVITE: 1 << 0,
|
|
KICK_MEMBERS: 1 << 1,
|
|
BAN_MEMBERS: 1 << 2,
|
|
ADMINISTRATOR: 1 << 3,
|
|
MANAGE_CHANNELS: 1 << 4,
|
|
MANAGE_GUILD: 1 << 5,
|
|
ADD_REACTIONS: 1 << 6,
|
|
VIEW_AUDIT_LOG: 1 << 7,
|
|
PRIORITY_SPEAKER: 1 << 8,
|
|
STREAM: 1 << 9,
|
|
|
|
VIEW_CHANNEL: 1 << 10,
|
|
READ_MESSAGES: 1 << 10,
|
|
SEND_MESSAGES: 1 << 11,
|
|
SEND_TTS_MESSAGES: 1 << 12,
|
|
MANAGE_MESSAGES: 1 << 13,
|
|
EMBED_LINKS: 1 << 14,
|
|
ATTACH_FILES: 1 << 15,
|
|
READ_MESSAGE_HISTORY: 1 << 16,
|
|
MENTION_EVERYONE: 1 << 17,
|
|
EXTERNAL_EMOJIS: 1 << 18,
|
|
USE_EXTERNAL_EMOJIS: 1 << 18,
|
|
|
|
CONNECT: 1 << 20,
|
|
SPEAK: 1 << 21,
|
|
MUTE_MEMBERS: 1 << 22,
|
|
DEAFEN_MEMBERS: 1 << 23,
|
|
MOVE_MEMBERS: 1 << 24,
|
|
USE_VAD: 1 << 25,
|
|
|
|
CHANGE_NICKNAME: 1 << 26,
|
|
MANAGE_NICKNAMES: 1 << 27,
|
|
MANAGE_ROLES: 1 << 28,
|
|
MANAGE_ROLES_OR_PERMISSIONS: 1 << 28,
|
|
MANAGE_WEBHOOKS: 1 << 29,
|
|
MANAGE_EMOJIS: 1 << 30,
|
|
};
|
|
|
|
/**
|
|
* Bitfield representing every permission combined
|
|
* @type {number}
|
|
*/
|
|
static ALL: number = Object.keys(Permissions.FLAGS).reduce(
|
|
(all, p) => all | Permissions.FLAGS[p],
|
|
0
|
|
);
|
|
|
|
/**
|
|
* Bitfield representing the default permissions for users
|
|
* @type {number}
|
|
*/
|
|
static DEFAULT: number = 104324673;
|
|
}
|
|
|
|
Object.defineProperty(Permissions.prototype, "raw", {
|
|
get: util.deprecate(
|
|
Object.getOwnPropertyDescriptor(Permissions.prototype, "raw").get,
|
|
"EvaluatedPermissions#raw is deprecated use Permissions#bitfield instead"
|
|
),
|
|
set: util.deprecate(
|
|
Object.getOwnPropertyDescriptor(Permissions.prototype, "raw").set,
|
|
"EvaluatedPermissions#raw is deprecated use Permissions#bitfield instead"
|
|
),
|
|
});
|
|
|
|
/**
|
|
* Data that can be resolved to give a permission number. This can be:
|
|
* * A string (see {@link Permissions.FLAGS})
|
|
* * A permission number
|
|
* @typedef {string|number|Permissions|PermissionResolvable[]} PermissionResolvable
|
|
*/
|
|
export type PermissionResolvable =
|
|
| keyof typeof Permissions.FLAGS
|
|
| number
|
|
| Permissions
|
|
| PermissionResolvable[];
|