diff --git a/lib/Client.js b/lib/Client.js index 493af7e8d..83f7f2f4b 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -765,6 +765,35 @@ var Client = (function () { }); }; + Client.prototype.addMemberToRole = function addMemberToRole(server, role, member) { + var callback = arguments.length <= 3 || arguments[3] === undefined ? function (err) {} : arguments[3]; + + var self = this; + + return new Promise(function (resolve, reject) { + + var serverId = self.resolveServerID(server); + var memberId = self.resolveUserID(member); + + var acServer = self.getServer("id", serverId); + var acMember = acServer.getMember("id", memberId); + + request.patch("https://discordapp.com/api/guilds/" + serverId + "/members/" + memberId).set("authorization", self.token).send({ + roles: acMember.rawRoles.concat(role.id) + }).end(function (err) { + + if (err) { + reject(err); + callback(err); + } else { + acMember.addRole(role); + resolve(); + callback(); + } + }); + }); + }; + //def createws Client.prototype.createws = function createws(url) { @@ -1428,6 +1457,15 @@ var Client = (function () { } }; + Client.prototype.resolveUserID = function resolveUserID(resource) { + if (resource instanceof User) { + // also accounts for Member + return resource.id; + } else if (!isNaN(resource) && resource.length && resource.length === 17) { + return resource; + } + }; + Client.prototype.resolveDestination = function resolveDestination(destination) { var channId = false; var self = this; diff --git a/lib/Member.js b/lib/Member.js index 813acda1b..f19b68e4d 100644 --- a/lib/Member.js +++ b/lib/Member.js @@ -21,6 +21,12 @@ var Member = (function (_User) { this.rawRoles = roles; } + Member.prototype.addRole = function addRole(role) { + if (! ~this.rawRoles.indexOf(role)) { + this.rawRoles.push(role); + } + }; + Member.prototype.permissionsIn = function permissionsIn(channel) { if (channel.server.ownerID === this.id) { diff --git a/src/Client.js b/src/Client.js index 67b8bc83f..31ea536f2 100644 --- a/src/Client.js +++ b/src/Client.js @@ -822,6 +822,39 @@ class Client { } + addMemberToRole(server, role, member, callback=function(err){}){ + var self = this; + + return new Promise(function(resolve, reject){ + + var serverId = self.resolveServerID(server); + var memberId = self.resolveUserID(member); + + var acServer = self.getServer("id", serverId); + var acMember = acServer.getMember("id", memberId); + + request + .patch(`https://discordapp.com/api/guilds/${serverId}/members/${memberId}`) + .set("authorization", self.token) + .send({ + roles : acMember.rawRoles.concat(role.id) + }) + .end(function(err){ + + if(err){ + reject(err); + callback(err); + }else{ + acMember.addRole(role); + resolve(); + callback(); + } + + }); + + }); + } + //def createws createws(url) { if (this.websocket) @@ -1361,6 +1394,14 @@ class Client { } } + + resolveUserID(resource) { + if (resource instanceof User) { // also accounts for Member + return resource.id; + } else if (!isNaN(resource) && resource.length && resource.length === 17) { + return resource; + } + } resolveDestination(destination) { var channId = false; diff --git a/src/Member.js b/src/Member.js index aa48d0327..63429b973 100644 --- a/src/Member.js +++ b/src/Member.js @@ -35,6 +35,12 @@ class Member extends User{ }); } + addRole(role){ + if(!~this.rawRoles.indexOf(role)){ + this.rawRoles.push(role); + } + } + permissionsIn(channel){ if(channel.server.ownerID === this.id){ diff --git a/test/bot.1.js b/test/bot.1.js index e019949ca..f24829dfa 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -36,11 +36,12 @@ mybot.on("message", function (message) { setTimeout(() => { permission.manageRoles = true; permission.name="asdfasdf"; - permission.color = Discord.Colors.GREEN; + permission.color = Discord.Colors.PURPLE; mybot.updateRole(message.channel.server, permission).then((perm) => { - mybot.reply(message, JSON.stringify(perm.serialise(), null, 4)); - }); + console.log(message.sender.rawRoles); + mybot.addMemberToRole(message.channel.server, perm, message.sender).catch(error); + }).catch(error); }, 3000);