From 3cd91a19aae83082e9b3db0572ef16ce7ed8c067 Mon Sep 17 00:00:00 2001 From: Amish Shah Date: Sun, 3 Jul 2016 13:04:39 +0100 Subject: [PATCH] Added role.delete() --- src/client/Client.js | 84 +++++++++---------- src/client/actions/ActionsManager.js | 1 + src/client/actions/GuildMemberRemove.js | 1 + src/client/actions/GuildRoleDelete.js | 50 +++++++++++ src/client/rest/RESTMethods.js | 19 ++++- .../packets/handlers/GuildMemberRemove.js | 4 - .../packets/handlers/GuildRoleDelete.js | 59 ++++++------- src/structures/Role.js | 4 + src/util/Constants.js | 1 + test/random.js | 1 + 10 files changed, 141 insertions(+), 83 deletions(-) create mode 100644 src/client/actions/GuildRoleDelete.js diff --git a/src/client/Client.js b/src/client/Client.js index b51ac03e6..bd3ba133f 100644 --- a/src/client/Client.js +++ b/src/client/Client.js @@ -1,42 +1,42 @@ -'use strict'; - -const EventEmitter = require('events').EventEmitter; -const MergeDefault = require('../util/MergeDefault'); -const Constants = require('../util/Constants'); -const RESTManager = require('./rest/RestManager'); -const ClientDataStore = require('../structures/DataStore/ClientDataStore'); -const ClientManager = require('./ClientManager'); -const ClientDataResolver = require('./ClientDataResolver'); -const WebSocketManager = require('./websocket/WebSocketManager'); -const ActionsManager = require('./actions/ActionsManager'); - -class Client extends EventEmitter{ - - constructor(options) { - super(); - this.options = MergeDefault(Constants.DefaultOptions, options); - this.rest = new RESTManager(this); - this.store = new ClientDataStore(this); - this.manager = new ClientManager(this); - this.ws = new WebSocketManager(this); - this.resolver = new ClientDataResolver(this); - this.actions = new ActionsManager(this); - } - - login(email, password) { - if (password) { - // login with email and password - return this.rest.methods.LoginEmailPassword(email, password); - } else { - // login with token - return this.rest.methods.LoginToken(email); - } - } - - get user() { - return this.store.user; - } - -} - -module.exports = Client; +'use strict'; + +const EventEmitter = require('events').EventEmitter; +const MergeDefault = require('../util/MergeDefault'); +const Constants = require('../util/Constants'); +const RESTManager = require('./rest/RestManager'); +const ClientDataStore = require('../structures/DataStore/ClientDataStore'); +const ClientManager = require('./ClientManager'); +const ClientDataResolver = require('./ClientDataResolver'); +const WebSocketManager = require('./websocket/WebSocketManager'); +const ActionsManager = require('./actions/ActionsManager'); + +class Client extends EventEmitter{ + + constructor(options) { + super(); + this.options = MergeDefault(Constants.DefaultOptions, options); + this.rest = new RESTManager(this); + this.store = new ClientDataStore(this); + this.manager = new ClientManager(this); + this.ws = new WebSocketManager(this); + this.resolver = new ClientDataResolver(this); + this.actions = new ActionsManager(this); + } + + login(email, password) { + if (password) { + // login with email and password + return this.rest.methods.LoginEmailPassword(email, password); + } else { + // login with token + return this.rest.methods.LoginToken(email); + } + } + + get user() { + return this.store.user; + } + +} + +module.exports = Client; diff --git a/src/client/actions/ActionsManager.js b/src/client/actions/ActionsManager.js index 51d4fdebc..e275963b9 100644 --- a/src/client/actions/ActionsManager.js +++ b/src/client/actions/ActionsManager.js @@ -16,6 +16,7 @@ class ActionsManager { this.register('GuildUpdate'); this.register('GuildMemberRemove'); this.register('GuildRoleCreate'); + this.register('GuildRoleDelete'); this.register('UserUpdate'); } diff --git a/src/client/actions/GuildMemberRemove.js b/src/client/actions/GuildMemberRemove.js index d9ddf62c7..7ef912467 100644 --- a/src/client/actions/GuildMemberRemove.js +++ b/src/client/actions/GuildMemberRemove.js @@ -20,6 +20,7 @@ class GuildMemberRemoveAction extends Action { if (member) { guild._removeMember(member); this.deleted[guild.id + data.user.id] = member; + client.emit(Constants.Events.GUILD_MEMBER_REMOVE, guild, member); this.scheduleForDeletion(guild.id, data.user.id); } diff --git a/src/client/actions/GuildRoleDelete.js b/src/client/actions/GuildRoleDelete.js new file mode 100644 index 000000000..687305b30 --- /dev/null +++ b/src/client/actions/GuildRoleDelete.js @@ -0,0 +1,50 @@ +'use strict'; + +const Action = require('./Action'); +const Constants = require('../../util/Constants'); +const Message = require('../../structures/Message'); + +class GuildRoleDeleteAction extends Action { + + constructor(client) { + super(client); + this.timeouts = []; + this.deleted = {}; + } + + handle(data) { + let client = this.client; + let guild = client.store.get('guilds', data.guild_id); + + if (guild) { + let exists = guild.store.get('roles', data.role_id); + if (exists) { + guild.store.remove('roles', data.role_id); + this.deleted[guild.id + data.role_id] = exists; + this.scheduleForDeletion(guild.id, data.role_id); + client.emit(Constants.Events.GUILD_ROLE_DELETE, guild, exists); + } + + if (!exists) { + exists = this.deleted[guild.id + data.role_id]; + } + + return { + role: exists, + }; + } + + return { + role: null, + }; + } + + scheduleForDeletion(guildID, roleID) { + this.timeouts.push( + setTimeout(() => delete this.deleted[guildID + roleID], + this.client.options.rest_ws_bridge_timeout) + ); + } +}; + +module.exports = GuildRoleDeleteAction; diff --git a/src/client/rest/RESTMethods.js b/src/client/rest/RESTMethods.js index e8f05cde3..43eaeb9d6 100644 --- a/src/client/rest/RESTMethods.js +++ b/src/client/rest/RESTMethods.js @@ -248,8 +248,8 @@ class RESTMethods{ this.rest.makeRequest('del', Constants.Endpoints.GUILD_MEMBER(guild.id, member.id), true) .then(() => { resolve(this.rest.client.actions.GuildMemberRemove.handle({ - guild_id : guild.id, - user : member.user, + guild_id: guild.id, + user: member.user, }).m); }) .catch(reject); @@ -261,13 +261,26 @@ class RESTMethods{ this.rest.makeRequest('post', Constants.Endpoints.GUILD_ROLES(guild.id), true) .then(role => { resolve(this.rest.client.actions.GuildRoleCreate.handle({ - guild_id : guild.id, + guild_id: guild.id, role, }).role); }) .catch(reject); }); } + + DeleteGuildRole(role) { + return new Promise((resolve, reject) => { + this.rest.makeRequest('del', Constants.Endpoints.GUILD_ROLE(role.guild.id, role.id), true) + .then(() => { + resolve(this.rest.client.actions.GuildRoleDelete.handle({ + guild_id: role.guild.id, + role_id: role.id, + }).role); + }) + .catch(reject); + }); + } } module.exports = RESTMethods; diff --git a/src/client/websocket/packets/handlers/GuildMemberRemove.js b/src/client/websocket/packets/handlers/GuildMemberRemove.js index 185cb768c..cf61c816b 100644 --- a/src/client/websocket/packets/handlers/GuildMemberRemove.js +++ b/src/client/websocket/packets/handlers/GuildMemberRemove.js @@ -21,10 +21,6 @@ class GuildMemberRemoveHandler extends AbstractHandler { let client = this.packetManager.client; let response = client.actions.GuildMemberRemove.handle(data); - - if (response.m) { - client.emit(Constants.Events.GUILD_MEMBER_REMOVE, response.g, response.m); - } } }; diff --git a/src/client/websocket/packets/handlers/GuildRoleDelete.js b/src/client/websocket/packets/handlers/GuildRoleDelete.js index 002d2321e..2214a7982 100644 --- a/src/client/websocket/packets/handlers/GuildRoleDelete.js +++ b/src/client/websocket/packets/handlers/GuildRoleDelete.js @@ -1,34 +1,25 @@ -'use strict'; - -const AbstractHandler = require('./AbstractHandler'); -const Structure = name => require(`../../../../structures/${name}`); -const Constants = require('../../../../util/Constants'); - -const Role = Structure('Role'); -const Guild = Structure('Guild'); - -class GuildRoleDeleteHandler extends AbstractHandler { - - constructor(packetManager) { - super(packetManager); - } - - handle(packet) { - let data = packet.d; - let client = this.packetManager.client; - - let guild = client.store.get('guilds', data.guild_id); - - if (guild) { - let exists = guild.store.get('roles', data.role_id); - if (exists) { - guild.store.remove('roles', data.role_id); - client.emit(Constants.Events.GUILD_ROLE_DELETE, guild, exists); - } - } - - } - -}; - -module.exports = GuildRoleDeleteHandler; +'use strict'; + +const AbstractHandler = require('./AbstractHandler'); +const Structure = name => require(`../../../../structures/${name}`); +const Constants = require('../../../../util/Constants'); + +const Role = Structure('Role'); +const Guild = Structure('Guild'); + +class GuildRoleDeleteHandler extends AbstractHandler { + + constructor(packetManager) { + super(packetManager); + } + + handle(packet) { + let data = packet.d; + let client = this.packetManager.client; + + let response = client.actions.GuildRoleDelete.handle(data); + } + +}; + +module.exports = GuildRoleDeleteHandler; diff --git a/src/structures/Role.js b/src/structures/Role.js index 5d8a7dfa8..864f4ccf6 100644 --- a/src/structures/Role.js +++ b/src/structures/Role.js @@ -21,6 +21,10 @@ class Role { this.managed = data.managed; } + delete() { + return this.client.rest.methods.DeleteGuildRole(this); + } + serialize() { let serializedPermissions = {}; for (let permissionName in Constants.PermissionFlags) { diff --git a/src/util/Constants.js b/src/util/Constants.js index e03fdf105..daf082231 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -55,6 +55,7 @@ const Endpoints = exports.Endpoints = { GUILD_EMBED: (guildID) => `${Endpoints.GUILD(guildID)}/embed`, GUILD_INVITES: (guildID) => `${Endpoints.GUILD(guildID)}/invites`, GUILD_ROLES: (guildID) => `${Endpoints.GUILD(guildID)}/roles`, + GUILD_ROLE: (guildID, roleID) => `${Endpoints.GUILD_ROLES(guildID)}/${roleID}`, GUILD_BANS: (guildID) => `${Endpoints.GUILD(guildID)}/bans`, GUILD_INTEGRATIONS: (guildID) => `${Endpoints.GUILD(guildID)}/integrations`, GUILD_MEMBERS: (guildID) => `${Endpoints.GUILD(guildID)}/members`, diff --git a/test/random.js b/test/random.js index d61ea9653..f84b2865e 100644 --- a/test/random.js +++ b/test/random.js @@ -41,6 +41,7 @@ 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); }); client.on('guildRoleDelete', (guild, role) => {