From d766e727a1e346a14ca2b12aba0adfa24c6ea134 Mon Sep 17 00:00:00 2001 From: Gus Caplan Date: Sun, 11 Dec 2016 03:07:52 -0600 Subject: [PATCH] add GuildChannel#clone (#973) * add GuildChannel#clone * e --- src/client/rest/RESTMethods.js | 4 +++- src/structures/Guild.js | 6 ++++-- src/structures/GuildChannel.js | 18 ++++++++++++++---- src/structures/PermissionOverwrites.js | 9 ++++++--- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/client/rest/RESTMethods.js b/src/client/rest/RESTMethods.js index 088cd406b..9acf62fc2 100644 --- a/src/client/rest/RESTMethods.js +++ b/src/client/rest/RESTMethods.js @@ -128,10 +128,12 @@ class RESTMethods { }).then(data => this.rest.client.actions.MessageUpdate.handle(data).updated); } - createChannel(guild, channelName, channelType) { + createChannel(guild, channelName, channelType, overwrites) { + if (overwrites instanceof Collection) overwrites = overwrites.array(); return this.rest.makeRequest('post', Constants.Endpoints.guildChannels(guild.id), true, { name: channelName, type: channelType, + permission_overwrites: overwrites, }).then(data => this.rest.client.actions.ChannelCreate.handle(data).channel); } diff --git a/src/structures/Guild.js b/src/structures/Guild.js index 81dddeeec..576097e53 100644 --- a/src/structures/Guild.js +++ b/src/structures/Guild.js @@ -561,6 +561,8 @@ class Guild { * Creates a new channel in the guild. * @param {string} name The name of the new channel * @param {string} type The type of the new channel, either `text` or `voice` + * @param {Array.} overwrites + * Permissions overwrites to apply to the new channel * @returns {Promise} * @example * // create a new text channel @@ -568,8 +570,8 @@ class Guild { * .then(channel => console.log(`Created new channel ${channel}`)) * .catch(console.error); */ - createChannel(name, type) { - return this.client.rest.methods.createChannel(this, name, type); + createChannel(name, type, overwrites) { + return this.client.rest.methods.createChannel(this, name, type, overwrites); } /** diff --git a/src/structures/GuildChannel.js b/src/structures/GuildChannel.js index 4a30d033c..db59f7447 100644 --- a/src/structures/GuildChannel.js +++ b/src/structures/GuildChannel.js @@ -66,8 +66,8 @@ class GuildChannel extends Channel { const overwrites = this.overwritesFor(member, true, roles); for (const overwrite of overwrites.role.concat(overwrites.member)) { - permissions &= ~overwrite.denyData; - permissions |= overwrite.allowData; + permissions &= ~overwrite.deny; + permissions |= overwrite.allow; } const admin = Boolean(permissions & Constants.PermissionFlags.ADMINISTRATOR); @@ -144,8 +144,8 @@ class GuildChannel extends Channel { const prevOverwrite = this.permissionOverwrites.get(userOrRole.id); if (prevOverwrite) { - payload.allow = prevOverwrite.allowData; - payload.deny = prevOverwrite.denyData; + payload.allow = prevOverwrite.allow; + payload.deny = prevOverwrite.deny; } for (const perm in options) { @@ -247,6 +247,16 @@ class GuildChannel extends Channel { return this.client.rest.methods.createChannelInvite(this, options); } + /** + * Clone this channel + * @param {string} [name=this.name] Optional name for the new channel, otherwise it has the name of this channel + * @param {boolean} [withPermissions=true] Whether to clone the channel with this channel's permission overwrites + * @returns {Promise} + */ + clone(name = this.name, withPermissions = true) { + return this.guild.createChannel(name, this.type, withPermissions ? this.permissionOverwrites : []); + } + /** * Checks if this channel has the same type, topic, position, name, overwrites and ID as another channel. * In most cases, a simple `channel.id === channel2.id` will do, and is much faster too. diff --git a/src/structures/PermissionOverwrites.js b/src/structures/PermissionOverwrites.js index 0ecc3cd83..3e9ca073a 100644 --- a/src/structures/PermissionOverwrites.js +++ b/src/structures/PermissionOverwrites.js @@ -7,7 +7,10 @@ class PermissionOverwrites { * The GuildChannel this overwrite is for * @type {GuildChannel} */ - this.channel = guildChannel; + Object.defineProperty(this, 'channel', { + value: guildChannel, + enumerable: false, + }); if (data) this.setup(data); } @@ -25,8 +28,8 @@ class PermissionOverwrites { */ this.type = data.type; - this.denyData = data.deny; - this.allowData = data.allow; + this.deny = data.deny; + this.allow = data.allow; } /**