mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-11 00:53:31 +01:00
feat: PermissionOverwriteManager (#5318)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
This commit is contained in:
@@ -3,11 +3,10 @@
|
||||
const Channel = require('./Channel');
|
||||
const Invite = require('./Invite');
|
||||
const PermissionOverwrites = require('./PermissionOverwrites');
|
||||
const Role = require('./Role');
|
||||
const { Error, TypeError } = require('../errors');
|
||||
const { Error } = require('../errors');
|
||||
const PermissionOverwriteManager = require('../managers/PermissionOverwriteManager');
|
||||
const Collection = require('../util/Collection');
|
||||
const { ChannelTypes } = require('../util/Constants');
|
||||
const { OverwriteTypes } = require('../util/Constants');
|
||||
const Permissions = require('../util/Permissions');
|
||||
const Util = require('../util/Util');
|
||||
|
||||
@@ -28,7 +27,7 @@ class GuildChannel extends Channel {
|
||||
* @param {APIChannel} data The data for the guild channel
|
||||
*/
|
||||
constructor(guild, data) {
|
||||
super(guild.client, data);
|
||||
super(guild.client, data, false);
|
||||
|
||||
/**
|
||||
* The guild the channel is in
|
||||
@@ -37,7 +36,13 @@ class GuildChannel extends Channel {
|
||||
this.guild = guild;
|
||||
|
||||
this.parentID = this.parentID ?? null;
|
||||
this.permissionOverwrites = this.permissionOverwrites ?? new Collection();
|
||||
/**
|
||||
* A manager of permission overwrites that belong to this channel
|
||||
* @type {PermissionOverwriteManager}
|
||||
*/
|
||||
this.permissionOverwrites = new PermissionOverwriteManager(this);
|
||||
|
||||
this._patch(data);
|
||||
}
|
||||
|
||||
_patch(data) {
|
||||
@@ -68,13 +73,9 @@ class GuildChannel extends Channel {
|
||||
}
|
||||
|
||||
if ('permission_overwrites' in data) {
|
||||
/**
|
||||
* A map of permission overwrites in this channel for roles and users
|
||||
* @type {Collection<Snowflake, PermissionOverwrites>}
|
||||
*/
|
||||
this.permissionOverwrites = new Collection();
|
||||
this.permissionOverwrites.cache.clear();
|
||||
for (const overwrite of data.permission_overwrites) {
|
||||
this.permissionOverwrites.set(overwrite.id, new PermissionOverwrites(this, overwrite));
|
||||
this.permissionOverwrites.add(overwrite);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -220,102 +221,6 @@ class GuildChannel extends Channel {
|
||||
.freeze();
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces the permission overwrites in this channel.
|
||||
* @param {OverwriteResolvable[]|Collection<Snowflake, OverwriteResolvable>} overwrites
|
||||
* Permission overwrites the channel gets updated with
|
||||
* @param {string} [reason] Reason for updating the channel overwrites
|
||||
* @returns {Promise<GuildChannel>}
|
||||
* @example
|
||||
* channel.overwritePermissions([
|
||||
* {
|
||||
* id: message.author.id,
|
||||
* deny: [Permissions.FLAGS.VIEW_CHANNEL],
|
||||
* },
|
||||
* ], 'Needed to change permissions');
|
||||
*/
|
||||
async overwritePermissions(overwrites, reason) {
|
||||
if (!Array.isArray(overwrites) && !(overwrites instanceof Collection)) {
|
||||
throw new TypeError('INVALID_TYPE', 'overwrites', 'Array or Collection of Permission Overwrites', true);
|
||||
}
|
||||
await this.edit({ permissionOverwrites: overwrites }, reason);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extra information about the overwrite
|
||||
* @typedef {Object} GuildChannelOverwriteOptions
|
||||
* @property {string} [reason] Reason for creating/editing this overwrite
|
||||
* @property {number} [type] The type of overwrite, either `0` for a role or `1` for a member. Use this to bypass
|
||||
* automatic resolution of type that results in an error for uncached structure
|
||||
*/
|
||||
|
||||
/**
|
||||
* Updates permission overwrites for a user or role in this channel, or creates an entry if not already present.
|
||||
* @param {RoleResolvable|UserResolvable} userOrRole The user or role to update
|
||||
* @param {PermissionOverwriteOptions} options The options for the update
|
||||
* @param {GuildChannelOverwriteOptions} [overwriteOptions] The extra information for the update
|
||||
* @returns {Promise<GuildChannel>}
|
||||
* @example
|
||||
* // Update or Create permission overwrites for a message author
|
||||
* message.channel.updateOverwrite(message.author, {
|
||||
* SEND_MESSAGES: false
|
||||
* })
|
||||
* .then(channel => console.log(channel.permissionOverwrites.get(message.author.id)))
|
||||
* .catch(console.error);
|
||||
*/
|
||||
async updateOverwrite(userOrRole, options, overwriteOptions = {}) {
|
||||
const userOrRoleID = this.guild.roles.resolveID(userOrRole) ?? this.client.users.resolveID(userOrRole);
|
||||
const { reason } = overwriteOptions;
|
||||
const existing = this.permissionOverwrites.get(userOrRoleID);
|
||||
if (existing) {
|
||||
await existing.update(options, reason);
|
||||
} else {
|
||||
await this.createOverwrite(userOrRole, options, overwriteOptions);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates permission overwrites for a user or role in this channel, or replaces them if already present.
|
||||
* @param {RoleResolvable|UserResolvable} userOrRole The user or role to update
|
||||
* @param {PermissionOverwriteOptions} options The options for the update
|
||||
* @param {GuildChannelOverwriteOptions} [overwriteOptions] The extra information for the update
|
||||
* @returns {Promise<GuildChannel>}
|
||||
* @example
|
||||
* // Create or Replace permission overwrites for a message author
|
||||
* message.channel.createOverwrite(message.author, {
|
||||
* SEND_MESSAGES: false
|
||||
* })
|
||||
* .then(channel => console.log(channel.permissionOverwrites.get(message.author.id)))
|
||||
* .catch(console.error);
|
||||
*/
|
||||
createOverwrite(userOrRole, options, overwriteOptions = {}) {
|
||||
let userOrRoleID = this.guild.roles.resolveID(userOrRole) ?? this.client.users.resolveID(userOrRole);
|
||||
let { type, reason } = overwriteOptions;
|
||||
if (typeof type !== 'number') {
|
||||
userOrRole = this.guild.roles.resolve(userOrRole) ?? this.client.users.resolve(userOrRole);
|
||||
if (!userOrRole) return Promise.reject(new TypeError('INVALID_TYPE', 'parameter', 'User nor a Role'));
|
||||
userOrRoleID = userOrRole.id;
|
||||
type = userOrRole instanceof Role ? OverwriteTypes.role : OverwriteTypes.member;
|
||||
}
|
||||
const { allow, deny } = PermissionOverwrites.resolveOverwriteOptions(options);
|
||||
|
||||
return this.client.api
|
||||
.channels(this.id)
|
||||
.permissions(userOrRoleID)
|
||||
.put({
|
||||
data: {
|
||||
id: userOrRoleID,
|
||||
type,
|
||||
allow,
|
||||
deny,
|
||||
},
|
||||
reason,
|
||||
})
|
||||
.then(() => this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Locks in the permission overwrites from the parent channel.
|
||||
* @returns {Promise<GuildChannel>}
|
||||
|
||||
Reference in New Issue
Block a user