Skip to content
This repository has been archived by the owner on Mar 25, 2020. It is now read-only.

Commit

Permalink
Channel permission editing introduced
Browse files Browse the repository at this point in the history
Role `permissions` changed to `_permissions`
  • Loading branch information
izy521 committed Aug 16, 2016
1 parent 997678b commit f3d82da
Showing 1 changed file with 49 additions and 38 deletions.
87 changes: 49 additions & 38 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -831,15 +831,15 @@
* @arg {Array} default - An array of permissions that cancels out allowed and denied permissions.
*/
DCP.editChannelPermissions = function(input, callback) { //Will shrink this up later
var payload, type, ID, channel, permissions, allowed_values;
var payload, pType, ID, channel, permissions, allowed_values;
if (!input.userID && !input.roleID) return handleErrCB("[editChannelPermissions] No userID or roleID provided", callback);
if (!this.channels[input.channelID]) return handleErrCB("[editChannelPermissions] No channel found for ID: " + input.channelID, callback);
if (!input.allow && !input.deny && !input.default) return handleErrCB("[editChannelPermissions] No allow, deny or default array provided.");
if (!input.allow && !input.deny && !input.default) return handleErrCB("[editChannelPermissions] No allow, deny or default array provided.", callback);

type = input.userID ? 'user' : 'role';
ID = input[type + "ID"];
channel = this.servers[ input.channelID ];
permissions = channel.permissions[type][ID] || { allow: 0, deny: 0 };
pType = input.userID ? 'user' : 'role';
ID = input[pType + "ID"];
channel = this.channels[ input.channelID ];
permissions = channel.permissions[pType][ID] || { allow: 0, deny: 0 };
allowed_values = [0, 4, 28].concat((channel.type === 'text' ?
[10, 11, 12, 13, 14, 15, 16, 17, 18] :
[20, 21, 22, 23, 24, 25] ));
Expand All @@ -858,34 +858,30 @@
if (type(input.deny) === 'array') {
input.deny.forEach(function(perm) {
if (allowed_values.indexOf(perm) < 0) return;
if (hasPermission(perm, permission.allow)) {
permission.allow = removePermission(perm, permission.allow);
if (hasPermission(perm, permissions.allow)) {
permissions.allow = removePermission(perm, permissions.allow);
}
permission.deny = givePermission(perm, permission.deny);
permissions.deny = givePermission(perm, permissions.deny);
});
}
//Take care of defaulting last
if (type(input.default) === 'array') {
input.defualt.forEach(function(perm) {
input.default.forEach(function(perm) {
if (allowed_values.indexOf(perm) < 0) return;
if (hasPermission(perm, permission.allow)) {
permission.allow = removePermission(perm, permission.allow);
}
if (hasPermission(perm, permission.deny)) {
permission.deny = removePermission(perm, permission.deny);
}
permissions.allow = removePermission(perm, permissions.allow);
permissions.deny = removePermission(perm, permissions.deny);
});
}

payload = {
type: (type === 'user' ? 'member' : 'role'),
type: (pType === 'user' ? 'member' : 'role'),
id: ID,
deny: permission.allow,
allow: permission.deny
deny: permissions.deny,
allow: permissions.allow
};

this._req('put', Endpoints.CHANNEL(input.channelID) + "/" + ID, payload, function(err, res) {
handleResCB('Unable to edit permission', callback);
this._req('put', Endpoints.CHANNEL(input.channelID) + "/permissions/" + ID, payload, function(err, res) {
handleResCB('Unable to edit permission', err, res, callback);
});
}

Expand Down Expand Up @@ -922,16 +918,19 @@
name: role.name,
color: role.color,
hoist: role.hoist,
permissions: role.permissions,
permissions: role._permissions,
mentionable: role.mentionable
};

console.log(payload.permissions);

for (var key in input) {
if (Object.keys(payload).indexOf(key) === -1) continue;
if (key === 'permissions') {
for (var perm in input[key]) {
role[perm] = input[key][perm];
payload.permissions = role.permissions;
payload.permissions = role._permissions;
console.log(payload.permissions);
}
continue;
}
Expand Down Expand Up @@ -1346,6 +1345,28 @@
}
}

function givePermission(bit, permissions) {
return permissions | (1 << bit);
}
function removePermission(bit, permissions) {
return permissions & ~(1 << bit);
}
function hasPermission(bit, permissions) {
return ((permissions >> bit) & 1) == 1;
}
//For the Getters and Setters
function getPerm(bit) {
return function() {
return ((this._permissions >> bit) & 1) == 1;
};
}
function setPerm(bit) {
return function(v) {
if (v === true) return this._permissions |= (1 << (bit));
if (v === false) return this._permissions &= ~(1 << bit);
};
}

function getServerInfo(client, servArr) {
for (var server=0; server<servArr.length; server++) {
client.servers[servArr[server].id] = new Server(client, servArr[server]);
Expand Down Expand Up @@ -2147,11 +2168,13 @@
enumerable: true,
});
});
//Object.seal(this);
Object.seal(this);
}
function Role(data) {
copyKeys(data, this);
//Object.seal(this);
copyKeys(data, this, ['permissions']);
//Use `permissions` from Discord, or `_permissions` if we're making it out of a cache.
this._permissions = data.permissions || data._permissions;
Object.seal(this);
}

function Multipart() {
Expand Down Expand Up @@ -2213,17 +2236,6 @@
set: function(v) {},
enumerable: true
});
function getPerm(bit) {
return function() {
return ((this.permissions >> bit) & 1) == 1;
};
}
function setPerm(bit) {
return function(v) {
if (v === true) return this.permissions |= (1 << (bit));
if (v === false) return this.permissions &= ~(1 << bit);
};
}

//Discord.OAuth;
Discord.Emitter = Emitter;
Expand Down Expand Up @@ -2293,7 +2305,6 @@
VOICE_USE_VAD: 25
};


Object.keys(Discord.Permissions).forEach(function(pn) {
Object.defineProperty(Role.prototype, pn, {
get: getPerm( Discord.Permissions[pn] ),
Expand Down

0 comments on commit f3d82da

Please sign in to comment.