diff --git a/README.md b/README.md index 2514699cb..5e05bbbea 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -

- - discord.js
-
-

REWRITE

+

+ + discord.js
+
+

REWRITE

\ No newline at end of file diff --git a/package.json b/package.json index b3e6705e3..36d8e745e 100644 --- a/package.json +++ b/package.json @@ -1,55 +1,55 @@ -{ - "name": "discord.js", - "version": "7.0.0", - "description": "A way to interface with the Discord API", - "main": "./src/index", - "scripts": { - "test": "jscs src && node test/random" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/hydrabolt/discord.js.git" - }, - "keywords": [ - "discord", - "api", - "bot", - "client", - "node", - "discordapp" - ], - "author": "Amish Shah ", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/hydrabolt/discord.js/issues" - }, - "homepage": "https://github.com/hydrabolt/discord.js#readme", - "dependencies": { - "babel-plugin-transform-runtime": "^6.6.0", - "object.values": "^1.0.3", - "superagent": "^1.5.0", - "unpipe": "^1.0.0", - "ws": "^0.8.1" - }, - "devDependencies": { - "babel-preset-es2015": "^6.6.0", - "babel-preset-stage-3": "^6.5.0", - "grunt": "^0.4.5", - "grunt-babel": "^6.0.0", - "grunt-browserify": "^4.0.1", - "grunt-contrib-uglify": "^0.11.0", - "grunt-jscs": "^2.8.0", - "jscs": "^2.11.0", - "load-grunt-tasks": "^3.3.0" - }, - "optionalDependencies": { - "node-opus": "^0.1.11" - }, - "engines": { - "node": ">=0.12.7" - }, - "browser": { - "./src/Util/TokenCacher.js": "./src/Util/TokenCacher-shim.js", - "./lib/Util/TokenCacher.js": "./lib/Util/TokenCacher-shim.js" - } -} +{ + "name": "discord.js", + "version": "7.0.0", + "description": "A way to interface with the Discord API", + "main": "./src/index", + "scripts": { + "test": "jscs src && node test/random" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/hydrabolt/discord.js.git" + }, + "keywords": [ + "discord", + "api", + "bot", + "client", + "node", + "discordapp" + ], + "author": "Amish Shah ", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/hydrabolt/discord.js/issues" + }, + "homepage": "https://github.com/hydrabolt/discord.js#readme", + "dependencies": { + "babel-plugin-transform-runtime": "^6.6.0", + "object.values": "^1.0.3", + "superagent": "^1.5.0", + "unpipe": "^1.0.0", + "ws": "^0.8.1" + }, + "devDependencies": { + "babel-preset-es2015": "^6.6.0", + "babel-preset-stage-3": "^6.5.0", + "grunt": "^0.4.5", + "grunt-babel": "^6.0.0", + "grunt-browserify": "^4.0.1", + "grunt-contrib-uglify": "^0.11.0", + "grunt-jscs": "^2.8.0", + "jscs": "^2.11.0", + "load-grunt-tasks": "^3.3.0" + }, + "optionalDependencies": { + "node-opus": "^0.1.11" + }, + "engines": { + "node": ">=0.12.7" + }, + "browser": { + "./src/Util/TokenCacher.js": "./src/Util/TokenCacher-shim.js", + "./lib/Util/TokenCacher.js": "./lib/Util/TokenCacher-shim.js" + } +} diff --git a/src/client/actions/ActionsManager.js b/src/client/actions/ActionsManager.js index 051cde9be..51d4fdebc 100644 --- a/src/client/actions/ActionsManager.js +++ b/src/client/actions/ActionsManager.js @@ -15,6 +15,7 @@ class ActionsManager { this.register('GuildDelete'); this.register('GuildUpdate'); this.register('GuildMemberRemove'); + this.register('GuildRoleCreate'); this.register('UserUpdate'); } diff --git a/src/client/actions/GuildRoleCreate.js b/src/client/actions/GuildRoleCreate.js new file mode 100644 index 000000000..0a929d351 --- /dev/null +++ b/src/client/actions/GuildRoleCreate.js @@ -0,0 +1,38 @@ +'use strict'; + +const Action = require('./Action'); +const Constants = require('../../util/Constants'); +const Role = require('../../structures/Role'); + +class GuildRoleCreate extends Action { + + constructor(client) { + super(client); + } + + handle(data) { + + let client = this.client; + let guild = client.store.get('guilds', data.guild_id); + + if (guild) { + let already = guild.store.get('roles', data.role.id); + let role = new Role(guild, data.role); + guild.store.add('roles', role); + + if (!already) { + client.emit(Constants.Events.GUILD_ROLE_CREATE, guild, role); + } + + return { + role, + }; + } + + return { + role: null, + }; + } +}; + +module.exports = GuildRoleCreate; diff --git a/src/client/rest/RESTMethods.js b/src/client/rest/RESTMethods.js index ea812ebd2..e8f05cde3 100644 --- a/src/client/rest/RESTMethods.js +++ b/src/client/rest/RESTMethods.js @@ -1,260 +1,273 @@ -'use strict'; - -const Constants = require('../../util/Constants'); -const Structure = name => require('../../structures/' + name); -const User = Structure('User'); -const GuildMember = Structure('GuildMember'); -const Message = Structure('Message'); - -class RESTMethods{ - constructor(restManager) { - this.rest = restManager; - } - - LoginEmailPassword(email, password) { - return new Promise((resolve, reject) => { - this.rest.client.store.email = email; - this.rest.client.store.password = password; - this.rest.makeRequest('post', Constants.Endpoints.LOGIN, false, { email, password }) - .then(data => { - this.rest.client.manager.connectToWebSocket(data.token, resolve, reject); - }) - .catch(reject); - - }); - } - - LoginToken(token) { - return new Promise((resolve, reject) => { - this.rest.client.manager.connectToWebSocket(token, resolve, reject); - }); - } - - GetGateway() { - return new Promise((resolve, reject) => { - this.rest.makeRequest('get', Constants.Endpoints.GATEWAY, true) - .then(res => resolve(res.url)) - .catch(reject); - }); - } - - SendMessage(channel, content, tts, nonce) { - return new Promise((resolve, reject) => { - - var _this = this; - - if (channel instanceof User || channel instanceof GuildMember) { - this.CreateDM(channel).then(chan => { - channel = chan; - req(); - }) - .catch(reject); - } else { - req(); - } - - function req() { - _this.rest.makeRequest('post', Constants.Endpoints.CHANNEL_MESSAGES(channel.id), true, { - content, tts, nonce, - }) - .then(data => resolve(_this.rest.client.actions.MessageCreate.handle(data).m)) - .catch(reject); - } - }); - } - - DeleteMessage(message) { - return new Promise((resolve, reject) => { - this.rest.makeRequest('del', Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id), true) - .then(data => { - resolve(this.rest.client.actions.MessageDelete.handle({ - id: message.id, - channel_id: message.channel.id, - }).m); - }) - .catch(reject); - }); - } - - UpdateMessage(message, content) { - return new Promise((resolve, reject) => { - this.rest.makeRequest('patch', Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id), true, { - content, - }) - .then(data => { - resolve(this.rest.client.actions.MessageUpdate.handle(data).updated); - }) - .catch(reject); - }); - } - - CreateChannel(guild, channelName, channelType) { - return new Promise((resolve, reject) => { - this.rest.makeRequest('post', Constants.Endpoints.GUILD_CHANNELS(guild.id), true, { - name: channelName, - type: channelType, - }) - .then(data => { - resolve(this.rest.client.actions.ChannelCreate.handle(data).channel); - }) - .catch(reject); - }); - } - - GetExistingDM(recipient) { - let dmChannel = this.rest.client.store.getAsArray('channels') - .filter(channel => channel.recipient) - .filter(channel => channel.recipient.id === recipient.id); - - return dmChannel[0]; - } - - CreateDM(recipient) { - return new Promise((resolve, reject) => { - - let dmChannel = this.GetExistingDM(recipient); - - if (dmChannel) { - return resolve(dmChannel); - } - - this.rest.makeRequest('post', Constants.Endpoints.USER_CHANNELS(this.rest.client.store.user.id), true, { - recipient_id: recipient.id, - }) - .then(data => resolve(this.rest.client.actions.ChannelCreate.handle(data).channel)) - .catch(reject); - }); - } - - DeleteChannel(channel) { - return new Promise((resolve, reject) => { - if (channel instanceof User || channel instanceof GuildMember) { - channel = this.GetExistingDM(channel); - } - - this.rest.makeRequest('del', Constants.Endpoints.CHANNEL(channel.id), true) - .then(data => { - data.id = channel.id; - resolve(this.rest.client.actions.ChannelDelete.handle(data).channel); - }) - .catch(reject); - }); - } - - UpdateChannel(channel, data) { - return new Promise((resolve, reject) => { - data.name = (data.name || channel.name).trim(); - data.topic = data.topic || channel.topic; - data.position = data.position || channel.position; - data.bitrate = data.bitrate || channel.bitrate; - - this.rest.makeRequest('patch', Constants.Endpoints.CHANNEL(channel.id), true, data) - .then(data => { - resolve(this.rest.client.actions.ChannelUpdate.handle(data).updated); - }) - .catch(reject); - }); - } - - LeaveGuild(guild) { - return new Promise((resolve, reject) => { - this.rest.makeRequest('del', Constants.Endpoints.ME_GUILD(guild.id), true) - .then(() => { - resolve(this.rest.client.actions.GuildDelete.handle({ id:guild.id }).guild); - }) - .catch(reject); - }); - } - - // untested but probably will work - DeleteGuild(guild) { - return new Promise((resolve, reject) => { - this.rest.makeRequest('del', Constants.Endpoints.GUILD(guild.id), true) - .then(() => { - resolve(this.rest.client.actions.GuildDelete.handle({ id:guild.id }).guild); - }) - .catch(reject); - }); - } - - UpdateCurrentUser(_data) { - return new Promise((resolve, reject) => { - let user = this.rest.client.store.user; - let data = {}; - - data.username = _data.username || user.username; - data.avatar = this.rest.client.resolver.ResolveBase64(_data.avatar) || user.avatar; - if (!user.bot) { - data.password = this.rest.client.store.password; - data.email = _data.email || this.rest.client.store.email; - data.new_password = _data.newPassword; - } - - this.rest.makeRequest('patch', Constants.Endpoints.ME, true, data) - .then(data => resolve(this.rest.client.actions.UserUpdate.handle(data).updated)) - .catch(reject); - }); - } - - UpdateGuild(guild, _data) { - return new Promise((resolve, reject) => { - /* - can contain: - name, region, verificationLevel, afkChannel, afkTimeout, icon, owner, splash - */ - - let data = {}; - - if (_data.name) { - data.name = _data.name; - } - - if (_data.region) { - data.region = _data.region; - } - - if (_data.verificationLevel) { - data.verification_level = Number(_data.verificationLevel); - } - - if (_data.afkChannel) { - data.afk_channel_id = this.rest.client.resolver.ResolveChannel(_data.afkChannel).id; - } - - if (_data.afkTimeout) { - data.afk_timeout = Number(_data.afkTimeout); - } - - if (_data.icon) { - data.icon = this.rest.client.resolver.ResolveBase64(_data.icon); - } - - if (_data.owner) { - data.owner_id = this.rest.client.resolver.ResolveUser(_data.owner).id; - } - - if (_data.splash) { - data.splash = this.rest.client.resolver.ResolveBase64(_data.splash); - } - - this.rest.makeRequest('patch', Constants.Endpoints.GUILD(guild.id), true, data) - .then(data => resolve(this.rest.client.actions.GuildUpdate.handle(data).updated)) - .catch(reject); - }); - } - - KickGuildMember(guild, member) { - return new Promise((resolve, reject) => { - 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, - }).m); - }) - .catch(reject); - }); - } -} - -module.exports = RESTMethods; +'use strict'; + +const Constants = require('../../util/Constants'); +const Structure = name => require('../../structures/' + name); +const User = Structure('User'); +const GuildMember = Structure('GuildMember'); +const Message = Structure('Message'); + +class RESTMethods{ + constructor(restManager) { + this.rest = restManager; + } + + LoginEmailPassword(email, password) { + return new Promise((resolve, reject) => { + this.rest.client.store.email = email; + this.rest.client.store.password = password; + this.rest.makeRequest('post', Constants.Endpoints.LOGIN, false, { email, password }) + .then(data => { + this.rest.client.manager.connectToWebSocket(data.token, resolve, reject); + }) + .catch(reject); + + }); + } + + LoginToken(token) { + return new Promise((resolve, reject) => { + this.rest.client.manager.connectToWebSocket(token, resolve, reject); + }); + } + + GetGateway() { + return new Promise((resolve, reject) => { + this.rest.makeRequest('get', Constants.Endpoints.GATEWAY, true) + .then(res => resolve(res.url)) + .catch(reject); + }); + } + + SendMessage(channel, content, tts, nonce) { + return new Promise((resolve, reject) => { + + var _this = this; + + if (channel instanceof User || channel instanceof GuildMember) { + this.CreateDM(channel).then(chan => { + channel = chan; + req(); + }) + .catch(reject); + } else { + req(); + } + + function req() { + _this.rest.makeRequest('post', Constants.Endpoints.CHANNEL_MESSAGES(channel.id), true, { + content, tts, nonce, + }) + .then(data => resolve(_this.rest.client.actions.MessageCreate.handle(data).m)) + .catch(reject); + } + }); + } + + DeleteMessage(message) { + return new Promise((resolve, reject) => { + this.rest.makeRequest('del', Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id), true) + .then(data => { + resolve(this.rest.client.actions.MessageDelete.handle({ + id: message.id, + channel_id: message.channel.id, + }).m); + }) + .catch(reject); + }); + } + + UpdateMessage(message, content) { + return new Promise((resolve, reject) => { + this.rest.makeRequest('patch', Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id), true, { + content, + }) + .then(data => { + resolve(this.rest.client.actions.MessageUpdate.handle(data).updated); + }) + .catch(reject); + }); + } + + CreateChannel(guild, channelName, channelType) { + return new Promise((resolve, reject) => { + this.rest.makeRequest('post', Constants.Endpoints.GUILD_CHANNELS(guild.id), true, { + name: channelName, + type: channelType, + }) + .then(data => { + resolve(this.rest.client.actions.ChannelCreate.handle(data).channel); + }) + .catch(reject); + }); + } + + GetExistingDM(recipient) { + let dmChannel = this.rest.client.store.getAsArray('channels') + .filter(channel => channel.recipient) + .filter(channel => channel.recipient.id === recipient.id); + + return dmChannel[0]; + } + + CreateDM(recipient) { + return new Promise((resolve, reject) => { + + let dmChannel = this.GetExistingDM(recipient); + + if (dmChannel) { + return resolve(dmChannel); + } + + this.rest.makeRequest('post', Constants.Endpoints.USER_CHANNELS(this.rest.client.store.user.id), true, { + recipient_id: recipient.id, + }) + .then(data => resolve(this.rest.client.actions.ChannelCreate.handle(data).channel)) + .catch(reject); + }); + } + + DeleteChannel(channel) { + return new Promise((resolve, reject) => { + if (channel instanceof User || channel instanceof GuildMember) { + channel = this.GetExistingDM(channel); + } + + this.rest.makeRequest('del', Constants.Endpoints.CHANNEL(channel.id), true) + .then(data => { + data.id = channel.id; + resolve(this.rest.client.actions.ChannelDelete.handle(data).channel); + }) + .catch(reject); + }); + } + + UpdateChannel(channel, data) { + return new Promise((resolve, reject) => { + data.name = (data.name || channel.name).trim(); + data.topic = data.topic || channel.topic; + data.position = data.position || channel.position; + data.bitrate = data.bitrate || channel.bitrate; + + this.rest.makeRequest('patch', Constants.Endpoints.CHANNEL(channel.id), true, data) + .then(data => { + resolve(this.rest.client.actions.ChannelUpdate.handle(data).updated); + }) + .catch(reject); + }); + } + + LeaveGuild(guild) { + return new Promise((resolve, reject) => { + this.rest.makeRequest('del', Constants.Endpoints.ME_GUILD(guild.id), true) + .then(() => { + resolve(this.rest.client.actions.GuildDelete.handle({ id:guild.id }).guild); + }) + .catch(reject); + }); + } + + // untested but probably will work + DeleteGuild(guild) { + return new Promise((resolve, reject) => { + this.rest.makeRequest('del', Constants.Endpoints.GUILD(guild.id), true) + .then(() => { + resolve(this.rest.client.actions.GuildDelete.handle({ id:guild.id }).guild); + }) + .catch(reject); + }); + } + + UpdateCurrentUser(_data) { + return new Promise((resolve, reject) => { + let user = this.rest.client.store.user; + let data = {}; + + data.username = _data.username || user.username; + data.avatar = this.rest.client.resolver.ResolveBase64(_data.avatar) || user.avatar; + if (!user.bot) { + data.password = this.rest.client.store.password; + data.email = _data.email || this.rest.client.store.email; + data.new_password = _data.newPassword; + } + + this.rest.makeRequest('patch', Constants.Endpoints.ME, true, data) + .then(data => resolve(this.rest.client.actions.UserUpdate.handle(data).updated)) + .catch(reject); + }); + } + + UpdateGuild(guild, _data) { + return new Promise((resolve, reject) => { + /* + can contain: + name, region, verificationLevel, afkChannel, afkTimeout, icon, owner, splash + */ + + let data = {}; + + if (_data.name) { + data.name = _data.name; + } + + if (_data.region) { + data.region = _data.region; + } + + if (_data.verificationLevel) { + data.verification_level = Number(_data.verificationLevel); + } + + if (_data.afkChannel) { + data.afk_channel_id = this.rest.client.resolver.ResolveChannel(_data.afkChannel).id; + } + + if (_data.afkTimeout) { + data.afk_timeout = Number(_data.afkTimeout); + } + + if (_data.icon) { + data.icon = this.rest.client.resolver.ResolveBase64(_data.icon); + } + + if (_data.owner) { + data.owner_id = this.rest.client.resolver.ResolveUser(_data.owner).id; + } + + if (_data.splash) { + data.splash = this.rest.client.resolver.ResolveBase64(_data.splash); + } + + this.rest.makeRequest('patch', Constants.Endpoints.GUILD(guild.id), true, data) + .then(data => resolve(this.rest.client.actions.GuildUpdate.handle(data).updated)) + .catch(reject); + }); + } + + KickGuildMember(guild, member) { + return new Promise((resolve, reject) => { + 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, + }).m); + }) + .catch(reject); + }); + } + + CreateGuildRole(guild) { + return new Promise((resolve, reject) => { + this.rest.makeRequest('post', Constants.Endpoints.GUILD_ROLES(guild.id), true) + .then(role => { + resolve(this.rest.client.actions.GuildRoleCreate.handle({ + guild_id : guild.id, + role, + }).role); + }) + .catch(reject); + }); + } +} + +module.exports = RESTMethods; diff --git a/src/client/websocket/packets/handlers/GuildRoleCreate.js b/src/client/websocket/packets/handlers/GuildRoleCreate.js index 8f8666089..c2ffdbb43 100644 --- a/src/client/websocket/packets/handlers/GuildRoleCreate.js +++ b/src/client/websocket/packets/handlers/GuildRoleCreate.js @@ -17,18 +17,7 @@ class GuildRoleCreateHandler extends AbstractHandler { let data = packet.d; let client = this.packetManager.client; - let guild = client.store.get('guilds', data.guild_id); - - if (guild) { - let already = guild.store.get('roles', data.role.id); - let role = new Role(guild, data.role); - guild.store.add('roles', role); - - if (!already) { - client.emit(Constants.Events.GUILD_ROLE_CREATE, guild, role); - } - } - + let response = client.actions.GuildRoleCreate.handle(data); } }; diff --git a/src/structures/Guild.js b/src/structures/Guild.js index a4607e03f..b5bd9f5b3 100644 --- a/src/structures/Guild.js +++ b/src/structures/Guild.js @@ -180,6 +180,10 @@ class Guild { return this.client.rest.methods.CreateChannel(this, name, type); } + createRole() { + return this.client.rest.methods.CreateGuildRole(this); + } + leave() { return this.client.rest.methods.LeaveGuild(this); } diff --git a/test/random.js b/test/random.js index dfe96f699..d61ea9653 100644 --- a/test/random.js +++ b/test/random.js @@ -135,6 +135,11 @@ client.on('message', message => { }).catch(console.log); } + if (message.content === 'makerole') { + message.guild.createRole().then(role => { + message.channel.sendMessage(`Made role ${role.name}`); + }).catch(console.log); + } } });