Added permissions

This commit is contained in:
hydrabolt
2015-11-01 17:46:24 +00:00
parent 0d6e913454
commit b2a74be0f9
10 changed files with 293 additions and 10 deletions

View File

@@ -0,0 +1,75 @@
"use strict";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Permissions = require("../Constants.js").Permissions;
var ChannelPermissions = (function () {
function ChannelPermissions(permissions) {
_classCallCheck(this, ChannelPermissions);
this.permissions = permissions;
}
ChannelPermissions.prototype.serialise = function serialise(explicit) {
var _this = this;
var hp = function hp(perm) {
return _this.hasPermission(perm, explicit);
};
return {
// general
createInstantInvite: hp(Permissions.createInstantInvite),
kickMembers: hp(Permissions.kickMembers),
banMembers: hp(Permissions.banMembers),
managePermissions: hp(Permissions.managePermissions),
manageChannel: hp(Permissions.manageChannel),
manageServer: hp(Permissions.manageServer),
// text
readMessages: hp(Permissions.readMessages),
sendMessages: hp(Permissions.sendMessages),
sendTTSMessages: hp(Permissions.sendTTSMessages),
manageMessages: hp(Permissions.manageMessages),
embedLinks: hp(Permissions.embedLinks),
attachFiles: hp(Permissions.attachFiles),
readMessageHistory: hp(Permissions.readMessageHistory),
mentionEveryone: hp(Permissions.mentionEveryone),
// voice
voiceConnect: hp(Permissions.voiceConnect),
voiceSpeak: hp(Permissions.voiceSpeak),
voiceMuteMembers: hp(Permissions.voiceMuteMembers),
voiceDeafenMembers: hp(Permissions.voiceDeafenMembers),
voiceMoveMembers: hp(Permissions.voiceMoveMembers),
voiceUseVAD: hp(Permissions.voiceUseVAD)
};
};
ChannelPermissions.prototype.serialize = function serialize() {
// ;n;
return this.serialise();
};
ChannelPermissions.prototype.hasPermission = function hasPermission(perm) {
var explicit = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];
if (perm instanceof String || typeof perm === "string") {
perm = Permissions[perm];
}
if (!perm) {
return false;
}
if (!explicit) {
// implicit permissions allowed
if (!!(this.permissions & Permissions.manageRoles)) {
// manageRoles allowed, they have all permissions
return true;
}
}
return !!(this.permissions & perm);
};
return ChannelPermissions;
})();
module.exports = ChannelPermissions;

View File

@@ -25,7 +25,7 @@ var Role = (function () {
_classCallCheck(this, Role);
this.position = data.position || -1;
this.permissions = data.permissions || DefaultRole;
this.permissions = data.permissions || (data.name === "@everyone" ? DefaultRole : 0);
this.name = data.name || "@everyone";
this.managed = data.managed || false;
this.id = data.id;

View File

@@ -71,6 +71,19 @@ var Server = (function (_Equality) {
});
}
Server.prototype.rolesOfUser = function rolesOfUser(user) {
user = this.client.internal.resolver.resolveUser(user);
if (user) {
return this.memberMap[user.id] ? this.memberMap[user.id].roles : [];
} else {
return null;
}
};
Server.prototype.rolesOf = function rolesOf(user) {
return this.rolesOfUser(user);
};
Server.prototype.toString = function toString() {
return this.name;
};

View File

@@ -7,6 +7,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
var Channel = require("./Channel.js");
var Cache = require("../Util/Cache.js");
var PermissionOverwrite = require("./PermissionOverwrite.js");
var ChannelPermissions = require("./ChannelPermissions.js");
var ServerChannel = (function (_Channel) {
_inherits(ServerChannel, _Channel);
@@ -26,6 +27,76 @@ var ServerChannel = (function (_Channel) {
});
}
ServerChannel.prototype.permissionsOf = function permissionsOf(user) {
user = this.client.internal.resolver.resolveUser(user);
if (user) {
if (this.server.owner.equals(user)) {
return new ChannelPermissions(4294967295);
}
var everyoneRole = this.server.roles.get("name", "@everyone");
var userRoles = [everyoneRole].concat(this.server.rolesOf(user) || []);
var userRolesID = userRoles.map(function (v) {
return v.id;
});
var roleOverwrites = [],
memberOverwrites = [];
this.permissionOverwrites.forEach(function (overwrite) {
if (overwrite.type === "member" && overwrite.id === user.id) {
memberOverwrites.push(overwrite);
} else if (overwrite.type === "role" && overwrite.id in userRolesID) {
roleOverwrites.push(overwrite);
}
});
var permissions = 0;
for (var _iterator = userRoles, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var serverRole = _ref;
permissions |= serverRole.permissions;
}
for (var _iterator2 = roleOverwrites.concat(memberOverwrites), _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;
permissions = permissions & ~overwrite.deny;
permissions = permissions | overwrite.allow;
}
return new ChannelPermissions(permissions);
} else {
return null;
}
};
ServerChannel.prototype.permsOf = function permsOf(user) {
return this.permissionsOf(user);
};
ServerChannel.prototype.toString = function toString() {
return this.name;
};

View File

@@ -13,10 +13,10 @@ a.on("warn", function (m) {
});
a.on("message", function (m) {
if (m.content === "$$$") a.internal.createServer("H a h").then(function (srv) {
console.log(srv);
a.reply(m, srv);
});
if (m.content === "$$$") a.reply(m, "you have the roles:\n" + m.channel.server.rolesOfUser(m.author).map(function (v) {
return "**" + v.name + "** " + v.id + "\n";
}));
if (m.content === "$$") a.reply(m, JSON.stringify(m.channel.permissionsOf(m.author).serialise(), null, 4).replace(/true/g, "**true**"));
});
a.on("serverMemberRemoved", function (r, s) {
console.log(r, s);

View File

@@ -0,0 +1,63 @@
"use strict";
var Permissions = require("../Constants.js").Permissions;
class ChannelPermissions{
constructor(permissions){
this.permissions = permissions;
}
serialise(explicit){
var hp = (perm) => this.hasPermission(perm, explicit);
return {
// general
createInstantInvite : hp( Permissions.createInstantInvite ),
kickMembers : hp( Permissions.kickMembers ),
banMembers : hp( Permissions.banMembers ),
managePermissions : hp ( Permissions.managePermissions ),
manageChannel : hp( Permissions.manageChannel ),
manageServer : hp( Permissions.manageServer ),
// text
readMessages : hp( Permissions.readMessages ),
sendMessages : hp( Permissions.sendMessages ),
sendTTSMessages : hp( Permissions.sendTTSMessages ),
manageMessages : hp( Permissions.manageMessages ),
embedLinks : hp( Permissions.embedLinks ),
attachFiles : hp( Permissions.attachFiles ),
readMessageHistory : hp( Permissions.readMessageHistory ),
mentionEveryone : hp( Permissions.mentionEveryone ),
// voice
voiceConnect : hp( Permissions.voiceConnect ),
voiceSpeak : hp( Permissions.voiceSpeak ),
voiceMuteMembers : hp( Permissions.voiceMuteMembers ),
voiceDeafenMembers : hp( Permissions.voiceDeafenMembers ),
voiceMoveMembers : hp( Permissions.voiceMoveMembers ),
voiceUseVAD : hp( Permissions.voiceUseVAD )
};
}
serialize(){
// ;n;
return this.serialise();
}
hasPermission(perm, explicit=false){
if( perm instanceof String || typeof perm === "string" ){
perm = Permissions[perm];
}
if(!perm){
return false;
}
if(!explicit){ // implicit permissions allowed
if( !!(this.permissions & Permissions.manageRoles) ){
// manageRoles allowed, they have all permissions
return true;
}
}
return !!(this.permissions & perm);
}
}
module.exports = ChannelPermissions;

View File

@@ -31,7 +31,7 @@ const DefaultRole = [
class Role{
constructor(data, server, client){
this.position = data.position || -1;
this.permissions = data.permissions || DefaultRole;
this.permissions = data.permissions || (data.name === "@everyone" ? DefaultRole : 0 );
this.name = data.name || "@everyone";
this.managed = data.managed || false;
this.id = data.id;

View File

@@ -59,6 +59,19 @@ class Server extends Equality {
}
} );
}
rolesOfUser(user){
user = this.client.internal.resolver.resolveUser(user);
if(user){
return (this.memberMap[user.id] ? this.memberMap[user.id].roles : []);
}else{
return null;
}
}
rolesOf(user){
return this.rolesOfUser(user);
}
get iconURL() {
if (!this.icon) {

View File

@@ -3,6 +3,7 @@
var Channel = require("./Channel.js");
var Cache = require("../Util/Cache.js");
var PermissionOverwrite = require("./PermissionOverwrite.js");
var ChannelPermissions = require("./ChannelPermissions.js");
class ServerChannel extends Channel{
constructor(data, client, server){
@@ -16,6 +17,48 @@ class ServerChannel extends Channel{
});
}
permissionsOf(user){
user = this.client.internal.resolver.resolveUser(user);
if(user){
if(this.server.owner.equals(user)){
return new ChannelPermissions(4294967295);
}
var everyoneRole = this.server.roles.get("name", "@everyone");
var userRoles = [everyoneRole].concat(this.server.rolesOf(user) || []);
var userRolesID = userRoles.map((v) => v.id);
var roleOverwrites = [], memberOverwrites = [];
this.permissionOverwrites.forEach((overwrite) => {
if(overwrite.type === "member" && overwrite.id === user.id){
memberOverwrites.push(overwrite);
}else if(overwrite.type === "role" && overwrite.id in userRolesID){
roleOverwrites.push(overwrite);
}
});
var permissions = 0;
for(var serverRole of userRoles){
permissions |= serverRole.permissions;
}
for(var overwrite of roleOverwrites.concat(memberOverwrites)){
permissions = permissions & ~overwrite.deny;
permissions = permissions | overwrite.allow;
}
return new ChannelPermissions(permissions);
}else{
return null;
}
}
permsOf(user){
return this.permissionsOf(user);
}
toString(){
return this.name;
}

View File

@@ -8,10 +8,15 @@ a.on("warn", (m) => console.log("[warn]", m));
a.on("message", m => {
if(m.content === "$$$")
a.internal.createServer("H a h").then(srv => {
console.log(srv);
a.reply(m, srv);
});
a.reply(m,
"you have the roles:\n" + m.channel.server.rolesOfUser(m.author)
.map(v => "**"+v.name+"** "+v.id+"\n")
);
if(m.content === "$$")
a.reply(m, JSON.stringify(
m.channel.permissionsOf(m.author).serialise()
, null, 4
).replace(/true/g, "**true**"))
});
a.on("serverMemberRemoved", (r, s) => {
console.log(r, s);