Fixed PermissionOverwrites

This commit is contained in:
hydrabolt
2015-10-31 20:31:05 +00:00
parent 6064888f21
commit c5e5ab54db
15 changed files with 584 additions and 12 deletions

View File

@@ -0,0 +1,70 @@
"use strict";
var Permissions = require("../Constants.js").Permissions;
class PermissionOverwrite {
constructor(data) {
this.id = data.id;
this.type = data.type; // member or role
this.deny = data.deny;
this.allow = data.allow;
}
// returns an array of allowed permissions
get allowed(){
var allowed = [];
for( var permName in Permissions ){
if(permName === "manageRoles" || permName === "manageChannels"){
// these permissions do not exist in overwrites.
continue;
}
if(!!(this.allow & Permissions[permName])){
allowed.push(permName);
}
}
return allowed;
}
// returns an array of denied permissions
get denied(){
var denied = [];
for( var permName in Permissions ){
if(permName === "manageRoles" || permName === "manageChannels"){
// these permissions do not exist in overwrites.
continue;
}
if(!!(this.deny & Permissions[permName])){
denied.push(permName);
}
}
return denied;
}
setAllowed(allowedArray){
allowedArray.forEach( (permission) => {
if(permission instanceof String || typeof permission === "string"){
permission = Permissions[permission];
}
if(permission){
this.allow |= (1 << permission);
}
} );
}
setDenied(deniedArray){
deniedArray.forEach( (permission) => {
if(permission instanceof String || typeof permission === "string"){
permission = Permissions[permission];
}
if(permission){
this.deny |= (1 << permission);
}
} );
}
}
module.exports = PermissionOverwrite;

139
src/Structures/Role.js Normal file
View File

@@ -0,0 +1,139 @@
"use strict";
var Permissions = require("../Constants.js").Permissions;
/*
example data
{ position: -1,
permissions: 36953089,
name: '@everyone',
managed: false,
id: '110007368451915776',
hoist: false,
color: 0 }
*/
const DefaultRole = [
Permissions.createInstantInvite,
Permissions.readMessages,
Permissions.readMessageHistory,
Permissions.sendMessages,
Permissions.sendTTSMessages,
Permissions.embedLinks,
Permissions.attachFiles,
Permissions.readMessageHistory,
Permissions.mentionEveryone,
Permissions.voiceConnect,
Permissions.voiceSpeak,
Permissions.voiceUseVAD
].reduce( (previous, current) => previous | current, 0 );
class Role{
constructor(data, serverID, client){
this.position = data.position || -1;
this.permissions = data.permissions || DefaultRole;
this.name = data.name || "@everyone";
this.managed = data.managed || false;
this.id = data.id;
this.hoist = data.hoist || false;
this.color = data.color || 0;
this.serverID = serverID;
this.client = client;
}
get server(){
return this.client.internal.servers.get("id", this.serverID);
}
serialise(explicit){
var hp = (perm) => this.hasPermission(perm, explicit);
return {
// general
createInstantInvite : hp( Permissions.createInstantInvite ),
kickMembers : hp( Permissions.kickMembers ),
banMembers : hp( Permissions.banMembers ),
manageRoles : hp ( Permissions.manageRoles ),
manageChannels : hp( Permissions.manageChannels ),
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;
}
}
// e.g.
// !!(36953089 & Permissions.manageRoles) = not allowed to manage roles
// !!(36953089 & (1 << 21)) = voice speak allowed
return !!(this.permissions & perm);
}
setPermission(permission, value){
if( permission instanceof String || typeof permission === "string" ){
permission = Permissions[permission];
}
if(permission){
// valid permission
if(value){
this.permissions |= permission;
}else{
this.permissions &= ~permission;
}
}
}
setPermissions(obj){
obj.forEach((value, permission) => {
if( permission instanceof String || typeof permission === "string" ){
permission = Permissions[permission];
}
if(permission){
// valid permission
this.setPermission(permission, value);
}
});
}
colorAsHex(){
var val = this.color.toString();
while(val.length < 6){
val = "0" + val;
}
return "#"+val;
}
}
module.exports = Role;

View File

@@ -7,6 +7,7 @@ var User = require("./User.js");
var Member = require("./Member.js");
var TextChannel = require("./TextChannel.js");
var VoiceChannel = require("./VoiceChannel.js");
var Role = require("./Role.js");
class Server extends Equality {
constructor(data, client) {
@@ -33,7 +34,6 @@ class Server extends Equality {
} );
data.channels.forEach( (dataChannel) => {
if(dataChannel.type === "text"){
var channel = client.internal.channels.add(new TextChannel(dataChannel, client));
this.channels.add(channel);
@@ -41,7 +41,10 @@ class Server extends Equality {
var channel = client.internal.channels.add(new VoiceChannel(dataChannel, client));
this.channels.add(channel);
}
} );
data.roles.forEach( (dataRole) => {
this.roles.add( new Role(dataRole, this) );
} );
}

View File

@@ -2,13 +2,27 @@
var Channel = require("./Channel.js");
var Cache = require("../Util/Cache.js");
var PermissionOverwrite = require("./PermissionOverwrite.js");
class TextChannel extends Channel{
constructor(data, client){
super(data, client);
this.name = data.name;
this.topic = data.topic;
this.position = data.position;
this.lastMessageID = data.last_message_id;
this.messages = new Cache("id", client.options.maximumMessages);
this.permissionOverwrites = new Cache();
data.permission_overwrites.forEach((permission) => {
this.permissionOverwrites.add( new PermissionOverwrite(permission) );
});
}
/* warning! may return null */
get lastMessage(){
return this.messages.get("id", this.lastMessageID);
}
}