diff --git a/examples/adminbot.js b/examples/adminbot.js new file mode 100644 index 000000000..740070b7e --- /dev/null +++ b/examples/adminbot.js @@ -0,0 +1,101 @@ +/* + this bot is a permissions bot and is currently working + with the experimental additions. Some functions may + change in the future. +*/ + +var Discord = require("../"); + +// Get the email and password +var AuthDetails = require("./auth.json"); + +var bot = new Discord.Client(); + +bot.on("ready", function () { + console.log("Ready to begin! Serving in " + bot.channels.length + " channels"); +}); + +bot.on("disconnected", function () { + + console.log("Disconnected!"); + process.exit(1); //exit node.js with an error + +}); + +bot.on("message", function (msg) { + if (msg.content === "skype") { + + //stop the user from speaking in the channel: + bot.overwritePermissions(msg.channel, msg.sender, { + sendMessages : false + }); + + // send a barely funny message ;) + bot.reply(msg, "how dare you mention that!"); + + } + + if (msg.content === "discord") { + + // see if there is a permission called 'good people' in the server already + var found = false; + + for(var role of msg.channel.server.roles){ + if(role.name === "good people"){ + found = role; + break; + } + } + + // if the role doesn't exist, make it + if(!found){ + bot.createRole(msg.channel.server, { + name : "good people", + color : Discord.Colors.BLUE, // colour of blue + hoist : true // make a seperate category in the users list + }).then(addUserToList); + }else{ + addUserToList(role); + } + + function addUserToList(role){ + + bot.addMemberToRole(msg.sender, role); + bot.reply(msg, "welcome to the good people!"); + + } + + } + + if( msg.content === "remove me" ){ + // remove the user from the good people list, if it exists + var found = false; + + for(var role of msg.channel.server.roles){ + if(role.name === "good people"){ + found = role; + break; + } + } + + if(found){ + // if the role exists + + if( msg.sender.hasRole(role) ){ + // remove the member from the role + bot.removeMemberFromRole(msg.sender, role); + bot.reply(msg, "removed!") + }else{ + bot.reply(msg, "you're not in the role!"); + } + + }else{ + // role doesn't exist + bot.reply(msg, "the role doesn't even exist!"); + } + + } + +}); + +bot.login("riftes@outlook.com", "bananaman"); \ No newline at end of file diff --git a/lib/Client.js b/lib/Client.js index 9f2a26913..cf86c3b2f 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -814,6 +814,11 @@ var Client = (function () { var acServer = self.getServer("id", serverId); var acMember = acServer.getMember("id", memberId); + if (acMember.rawRoles.indexOf(role.id) !== -1) { + // user already has role + return; + } + request.patch("https://discordapp.com/api/guilds/" + serverId + "/members/" + memberId).set("authorization", self.token).send({ roles: acMember.rawRoles.concat(role.id) }).end(function (err) { @@ -845,12 +850,12 @@ var Client = (function () { var acServer = self.getServer("id", serverId); var acMember = acServer.getMember("id", memberId); - for (var safeRole in acMember.rawRoles) { - if (acMember.rawRoles[safeRole] == role.id) { - acMember.rawRoles.splice(safeRole, 1); - } + if (~acMember.rawRoles.indexOf(role.id)) { + acMember.removeRole(role); } + console.log("remainder: ", acMember.rawRoles, "wanting", role.id); + request.patch("https://discordapp.com/api/guilds/" + serverId + "/members/" + memberId).set("authorization", self.token).send({ roles: acMember.rawRoles }).end(function (err) { diff --git a/lib/Member.js b/lib/Member.js index 7227e08e7..80a19370e 100644 --- a/lib/Member.js +++ b/lib/Member.js @@ -21,22 +21,19 @@ var Member = (function (_User) { this.rawRoles = roles; } + Member.prototype.removeRole = function removeRole(role) { + this.rawRoles.splice(this.rawRoles.indexOf(role.id), 1); + }; + Member.prototype.addRole = function addRole(role) { - if (! ~this.rawRoles.indexOf(role)) { - this.rawRoles.push(role); + if (this.rawRoles.indexOf(role.id) == -1) { + console.log("wanted to add", role.id, this.rawRoles.indexOf(role.id)); + this.rawRoles.push(role.id); } }; - Member.prototype.permissionsIn = function permissionsIn(channel) { - - if (channel.server.ownerID === this.id) { - return new EvaluatedPermissions(4294967295); //all perms - } - - var affectingOverwrites = []; - var affectingMemberOverwrites = []; - - for (var _iterator = channel.roles, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + Member.prototype.hasRole = function hasRole(role) { + for (var _iterator = this.roles, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { @@ -48,7 +45,35 @@ var Member = (function (_User) { _ref = _i.value; } - var overwrite = _ref; + var _role = _ref; + + if (role.id === _role.id) return true; + } + return false; + }; + + Member.prototype.permissionsIn = function permissionsIn(channel) { + + if (channel.server.ownerID === this.id) { + return new EvaluatedPermissions(4294967295); //all perms + } + + var affectingOverwrites = []; + var affectingMemberOverwrites = []; + + for (var _iterator2 = channel.roles, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var overwrite = _ref2; if (overwrite.id === this.id && overwrite.type === "member") { affectingMemberOverwrites.push(overwrite); @@ -63,25 +88,7 @@ var Member = (function (_User) { var finalPacked = affectingOverwrites.length !== 0 ? affectingOverwrites[0].packed : affectingMemberOverwrites[0].packed; - for (var _iterator2 = affectingOverwrites, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { - var _ref2; - - if (_isArray2) { - if (_i2 >= _iterator2.length) break; - _ref2 = _iterator2[_i2++]; - } else { - _i2 = _iterator2.next(); - if (_i2.done) break; - _ref2 = _i2.value; - } - - var overwrite = _ref2; - - finalPacked = finalPacked & ~overwrite.deny; - finalPacked = finalPacked | overwrite.allow; - } - - for (var _iterator3 = affectingMemberOverwrites, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + for (var _iterator3 = affectingOverwrites, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { @@ -99,6 +106,24 @@ var Member = (function (_User) { finalPacked = finalPacked | overwrite.allow; } + for (var _iterator4 = affectingMemberOverwrites, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + var _ref4; + + if (_isArray4) { + if (_i4 >= _iterator4.length) break; + _ref4 = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) break; + _ref4 = _i4.value; + } + + var overwrite = _ref4; + + finalPacked = finalPacked & ~overwrite.deny; + finalPacked = finalPacked | overwrite.allow; + } + return new EvaluatedPermissions(finalPacked); }; @@ -108,19 +133,19 @@ var Member = (function (_User) { var ufRoles = [this.server.getRole(this.server.id)]; - for (var _iterator4 = this.rawRoles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { - var _ref4; + for (var _iterator5 = this.rawRoles, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref5; - if (_isArray4) { - if (_i4 >= _iterator4.length) break; - _ref4 = _iterator4[_i4++]; + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref5 = _iterator5[_i5++]; } else { - _i4 = _iterator4.next(); - if (_i4.done) break; - _ref4 = _i4.value; + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref5 = _i5.value; } - var rawRole = _ref4; + var rawRole = _ref5; ufRoles.push(this.server.getRole(rawRole)); } @@ -135,19 +160,19 @@ var Member = (function (_User) { basePerm = basePerms[0].packed; basePerms = basePerms || []; - for (var _iterator5 = basePerms, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { - var _ref5; + for (var _iterator6 = basePerms, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref6; - if (_isArray5) { - if (_i5 >= _iterator5.length) break; - _ref5 = _iterator5[_i5++]; + if (_isArray6) { + if (_i6 >= _iterator6.length) break; + _ref6 = _iterator6[_i6++]; } else { - _i5 = _iterator5.next(); - if (_i5.done) break; - _ref5 = _i5.value; + _i6 = _iterator6.next(); + if (_i6.done) break; + _ref6 = _i6.value; } - var perm = _ref5; + var perm = _ref6; basePerm = basePerm | perm.packed; } diff --git a/src/Client.js b/src/Client.js index 4134e30d5..ba20b7f46 100644 --- a/src/Client.js +++ b/src/Client.js @@ -881,6 +881,11 @@ class Client { var acServer = self.getServer("id", serverId); var acMember = acServer.getMember("id", memberId); + + if(acMember.rawRoles.indexOf(role.id) !== -1){ + // user already has role + return; + } request .patch(`https://discordapp.com/api/guilds/${serverId}/members/${memberId}`) @@ -916,12 +921,12 @@ class Client { var acServer = self.getServer("id", serverId); var acMember = acServer.getMember("id", memberId); - for(var safeRole in acMember.rawRoles){ - if(acMember.rawRoles[safeRole] == role.id){ - acMember.rawRoles.splice(safeRole, 1); - } + if(~acMember.rawRoles.indexOf(role.id)){ + acMember.removeRole(role); } + console.log("remainder: ",acMember.rawRoles, "wanting", role.id); + request .patch(`https://discordapp.com/api/guilds/${serverId}/members/${memberId}`) .set("authorization", self.token) diff --git a/src/Member.js b/src/Member.js index 4ab8ad56e..48023f3db 100644 --- a/src/Member.js +++ b/src/Member.js @@ -36,12 +36,25 @@ class Member extends User{ }); } + removeRole(role){ + this.rawRoles.splice(this.rawRoles.indexOf(role.id), 1); + } + addRole(role){ - if(!~this.rawRoles.indexOf(role)){ - this.rawRoles.push(role); + if(this.rawRoles.indexOf(role.id) == -1){ + console.log("wanted to add", role.id, this.rawRoles.indexOf(role.id)); + this.rawRoles.push(role.id); } } + hasRole(role){ + for(var _role of this.roles){ + if(role.id === _role.id) + return true; + } + return false; + } + permissionsIn(channel){ if(channel.server.ownerID === this.id){