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,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;
}