dexare
Version:
Modular and extendable Discord bot framework
143 lines (142 loc) • 5.5 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CorePermissions = exports.DirectMessagePermissions = void 0;
const collection_1 = __importDefault(require("@discordjs/collection"));
const eris_1 = __importDefault(require("eris"));
const logger_1 = __importDefault(require("../util/logger"));
exports.DirectMessagePermissions = [
'addReactions',
'readMessages',
'sendMessages',
'embedLinks',
'attachFiles',
'readMessageHistory',
'externalEmojis'
];
exports.CorePermissions = [
...Object.keys(eris_1.default.Constants.Permissions).map((permission) => 'discord.' + permission.toLowerCase()),
'dexare.elevated',
'dexare.inguild',
'dexare.nsfwchannel'
];
/** The registry for permissions in Dexare. */
class PermissionRegistry {
constructor(client) {
this.permissions = new collection_1.default();
this.client = client;
this.logger = new logger_1.default(this.client, 'dexare/permissions');
for (const permission in eris_1.default.Constants.Permissions) {
this.permissions.set('discord.' + permission.toLowerCase(), (object) => {
if (object.message)
if ('guild' in object.message.channel && object.member)
return object.message.channel
.permissionsOf(object.member)
.has(permission);
else
return exports.DirectMessagePermissions.includes(permission);
else if (object.member)
return object.member.guild
.permissionsOf(object.member)
.has(permission);
return exports.DirectMessagePermissions.includes(permission);
});
}
this.permissions.set('dexare.elevated', (object, client) => {
if (!client.config.elevated)
return false;
if (Array.isArray(client.config.elevated))
return client.config.elevated.includes(object.user.id);
return client.config.elevated === object.user.id;
});
this.permissions.set('dexare.inguild', (object) => {
if (object.member)
return true;
if (object.message)
return 'guild' in object.message.channel;
return false;
});
this.permissions.set('dexare.nsfwchannel', (object) => {
// False for users, why would anyone use a channel perm on users
if (!object.message)
return false;
return 'nsfw' in object.message.channel ? object.message.channel.nsfw : true;
});
}
/**
* Registers a new permission.
* @param key The permission key to register
* @param permission The permission function to use
*/
register(key, permission) {
key = key.toLowerCase();
if (exports.CorePermissions.includes(key))
throw new Error(`Cannot register to core permissions. (${key})`);
this.logger.log(`Registering permission '${key}'`);
this.permissions.set(key, permission);
}
/**
* Unregisters a permission.
* @param key The permission to unregister
*/
unregister(key) {
key = key.toLowerCase();
if (exports.CorePermissions.includes(key))
throw new Error(`Cannot unregister core permissions. (${key})`);
this.logger.log(`Unregistering permission '${key}'`);
return this.permissions.delete(key);
}
/**
* Check a permission.
* @param object The object to check with
* @param permission The permission to check
* @param event The client event to associate the function
*/
has(object, permission, event) {
permission = permission.toLowerCase();
if (!permission || !this.permissions.has(permission))
return false;
return this.permissions.get(permission)(object, this.client, event);
}
/**
* Maps permissions into an object with true/false values and permission keys.
* @param object The object to check with
* @param permissions The permissions to map
* @param prevMap The previous map, if any
* @param event The client event to associate
*/
map(object, permissions, prevMap = {}, event) {
for (const permission of permissions) {
if (permission in prevMap)
continue;
prevMap[permission] = this.has(object, permission, event);
}
return prevMap;
}
/**
* Convert something into a permission object.
* @param object The object to convert
*/
toObject(object) {
const result = {};
let user;
if (object instanceof eris_1.default.Message)
user = object.author;
else if (object instanceof eris_1.default.Member)
user = object.user;
else
user = object;
result.user = user;
if (object instanceof eris_1.default.Member)
result.member = object;
if (object instanceof eris_1.default.Message) {
result.message = object;
if (object.member)
result.member = object.member;
}
return result;
}
}
exports.default = PermissionRegistry;