diff --git a/README.md b/README.md
index 2514699cb..5e05bbbea 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-
-
- 
-
-
REWRITE
+
+
+ 
+
+
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);
+ }
}
});