From 0d53afe3cec95bd4f4df51d186b860468d349cd6 Mon Sep 17 00:00:00 2001 From: Amish Shah Date: Sun, 3 Jul 2016 16:27:04 +0100 Subject: [PATCH] Added ability to edit a role --- src/client/actions/ActionsManager.js | 1 + src/client/actions/GuildRoleUpdate.js | 44 +++++++++++++++++++ src/client/rest/RESTMethods.js | 43 ++++++++++++++++++ .../packets/handlers/GuildRoleUpdate.js | 12 +---- src/structures/Role.js | 36 +++++++++++++++ test/random.js | 7 ++- 6 files changed, 131 insertions(+), 12 deletions(-) create mode 100644 src/client/actions/GuildRoleUpdate.js diff --git a/src/client/actions/ActionsManager.js b/src/client/actions/ActionsManager.js index e275963b9..850c052d1 100644 --- a/src/client/actions/ActionsManager.js +++ b/src/client/actions/ActionsManager.js @@ -17,6 +17,7 @@ class ActionsManager { this.register('GuildMemberRemove'); this.register('GuildRoleCreate'); this.register('GuildRoleDelete'); + this.register('GuildRoleUpdate'); this.register('UserUpdate'); } diff --git a/src/client/actions/GuildRoleUpdate.js b/src/client/actions/GuildRoleUpdate.js new file mode 100644 index 000000000..61b269240 --- /dev/null +++ b/src/client/actions/GuildRoleUpdate.js @@ -0,0 +1,44 @@ +'use strict'; + +const Action = require('./Action'); +const Constants = require('../../util/Constants'); +const CloneObject = require('../../util/CloneObject'); +const Message = require('../../structures/Message'); + +class GuildRoleUpdateAction extends Action { + + constructor(client) { + super(client); + } + + handle(data) { + + let client = this.client; + let guild = client.store.get('guilds', data.guild_id); + + let roleData = data.role; + + if (guild) { + let oldRole; + let existingRole = guild.store.get('roles', roleData.id); + // exists and not the same + if (existingRole && !existingRole.equals(roleData)) { + oldRole = CloneObject(existingRole); + existingRole.setup(data.role); + client.emit(Constants.Events.GUILD_ROLE_UPDATE, guild, oldRole, existingRole); + } + + return { + old: oldRole, + updated: existingRole, + }; + } + + return { + old: null, + updated: null, + }; + } +}; + +module.exports = GuildRoleUpdateAction; diff --git a/src/client/rest/RESTMethods.js b/src/client/rest/RESTMethods.js index 43eaeb9d6..5ddf95198 100644 --- a/src/client/rest/RESTMethods.js +++ b/src/client/rest/RESTMethods.js @@ -281,6 +281,49 @@ class RESTMethods{ .catch(reject); }); } + + UpdateGuildRole(role, _data) { + return new Promise((resolve, reject) => { + /* + can contain: + name, position, permissions, color, hoist + */ + + let data = {}; + + data.name = _data.name || role.name; + data.position = _data.position || role.position; + data.color = _data.color || role.color; + + if (typeof _data.hoist !== 'undefined') { + data.hoist = _data.hoist; + } else { + data.hoist = role.hoist; + } + + if (_data.permissions) { + let perms = 0; + for (let perm of _data.permissions) { + if (perm instanceof String || typeof perm === 'string') { + perm = Constants.PermissionFlags[perm]; + } + perms |= perm; + } + data.permissions = perms; + } else { + data.permissions = role.permissions; + } + console.log(data); + this.rest.makeRequest('patch', Constants.Endpoints.GUILD_ROLE(role.guild.id, role.id), true, data) + .then(_role => { + resolve(this.rest.client.actions.GuildRoleUpdate.handle({ + role: _role, + guild_id: role.guild.id, + }).updated); + }) + .catch(reject); + }); + } } module.exports = RESTMethods; diff --git a/src/client/websocket/packets/handlers/GuildRoleUpdate.js b/src/client/websocket/packets/handlers/GuildRoleUpdate.js index 72799a0ea..98005bc02 100644 --- a/src/client/websocket/packets/handlers/GuildRoleUpdate.js +++ b/src/client/websocket/packets/handlers/GuildRoleUpdate.js @@ -18,17 +18,7 @@ class GuildRoleUpdateHandler extends AbstractHandler { let data = packet.d; let client = this.packetManager.client; - let guild = client.store.get('guilds', data.guild_id); - - if (guild) { - let existingRole = guild.store.get('roles', data.role.id); - if (existingRole) { - let oldRole = CloneObject(existingRole); - existingRole.setup(data.role); - client.emit(Constants.Events.GUILD_ROLE_UPDATE, guild, oldRole, existingRole); - } - } - + let response = client.actions.GuildRoleUpdate.handle(data); } }; diff --git a/src/structures/Role.js b/src/structures/Role.js index 864f4ccf6..f163ff98e 100644 --- a/src/structures/Role.js +++ b/src/structures/Role.js @@ -11,6 +11,18 @@ class Role { } } + equals(role) { + return ( + this.id === role.id && + this.name === role.name && + this.color === role.color && + this.hoist === role.hoist && + this.position === role.position && + this.permissions === role.permissions && + this.managed === role.managed + ); + } + setup(data) { this.id = data.id; this.name = data.name; @@ -25,6 +37,30 @@ class Role { return this.client.rest.methods.DeleteGuildRole(this); } + edit(data) { + return this.client.rest.methods.UpdateGuildRole(this, data); + } + + setName(name) { + return this.client.rest.methods.UpdateGuildRole(this, {name,}); + } + + setColor(color) { + return this.client.rest.methods.UpdateGuildRole(this, {color,}); + } + + setHoist(hoist) { + return this.client.rest.methods.UpdateGuildRole(this, {hoist,}); + } + + setPosition(position) { + return this.client.rest.methods.UpdateGuildRole(this, {position,}); + } + + setPermissions(permissions) { + return this.client.rest.methods.UpdateGuildRole(this, {permissions,}); + } + serialize() { let serializedPermissions = {}; for (let permissionName in Constants.PermissionFlags) { diff --git a/test/random.js b/test/random.js index f84b2865e..a1de4025f 100644 --- a/test/random.js +++ b/test/random.js @@ -41,7 +41,12 @@ client.on('guildMemberRemove', (guild, user) => { client.on('guildRoleCreate', (guild, role) => { console.log('new role', role.name, 'in', guild.name); - role.delete().then(role => console.log("deleted " + role.name)).catch(console.log); + role.edit({ + permissions: ['DEAFEN_MEMBERS'], + name: 'deafen' + }).then(role2 => { + console.log('role replace from ' + role.name + ' to ' + role2.name); + }).catch(console.log) }); client.on('guildRoleDelete', (guild, role) => {