Skip to content

Commit

Permalink
feat(GuildChannel): make createOverwrite and updateOverwrite not depe…
Browse files Browse the repository at this point in the history
…ndent on cache (#5489)

Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
  • Loading branch information
3 people committed May 11, 2021
1 parent 74e97ef commit 58763b0
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 17 deletions.
41 changes: 26 additions & 15 deletions src/structures/GuildChannel.js
Expand Up @@ -214,11 +214,19 @@ class GuildChannel extends Channel {
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 {string} [reason] Reason for creating/editing this overwrite
* @param {GuildChannelOverwriteOptions} [overwriteOptions] The extra information for the update
* @returns {Promise<GuildChannel>}
* @example
* // Update or Create permission overwrites for a message author
Expand All @@ -228,15 +236,14 @@ class GuildChannel extends Channel {
* .then(channel => console.log(channel.permissionOverwrites.get(message.author.id)))
* .catch(console.error);
*/
async updateOverwrite(userOrRole, options, reason) {
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'));

const existing = this.permissionOverwrites.get(userOrRole.id);
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, reason);
await this.createOverwrite(userOrRole, options, overwriteOptions);
}
return this;
}
Expand All @@ -245,7 +252,7 @@ class GuildChannel extends Channel {
* 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 {string} [reason] Reason for creating/editing this overwrite
* @param {GuildChannelOverwriteOptions} [overwriteOptions] The extra information for the update
* @returns {Promise<GuildChannel>}
* @example
* // Create or Replace permission overwrites for a message author
Expand All @@ -255,19 +262,23 @@ class GuildChannel extends Channel {
* .then(channel => console.log(channel.permissionOverwrites.get(message.author.id)))
* .catch(console.error);
*/
createOverwrite(userOrRole, options, reason) {
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'));

const type = userOrRole instanceof Role ? OverwriteTypes.role : OverwriteTypes.member;
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(userOrRole.id)
.permissions(userOrRoleID)
.put({
data: {
id: userOrRole.id,
id: userOrRoleID,
type,
allow,
deny,
Expand Down
9 changes: 7 additions & 2 deletions typings/index.d.ts
Expand Up @@ -876,7 +876,7 @@ declare module 'discord.js' {
public createOverwrite(
userOrRole: RoleResolvable | UserResolvable,
options: PermissionOverwriteOption,
reason?: string,
overwriteOptions?: GuildChannelOverwriteOptions,
): Promise<this>;
public edit(data: ChannelData, reason?: string): Promise<this>;
public equals(channel: GuildChannel): boolean;
Expand All @@ -898,7 +898,7 @@ declare module 'discord.js' {
public updateOverwrite(
userOrRole: RoleResolvable | UserResolvable,
options: PermissionOverwriteOption,
reason?: string,
overwriteOptions?: GuildChannelOverwriteOptions,
): Promise<this>;
public isText(): this is TextChannel | NewsChannel;
}
Expand Down Expand Up @@ -2797,6 +2797,11 @@ declare module 'discord.js' {
cache: boolean;
}

interface GuildChannelOverwriteOptions {
reason?: string;
type?: number;
}

interface FetchMemberOptions {
user: UserResolvable;
cache?: boolean;
Expand Down

0 comments on commit 58763b0

Please sign in to comment.