zyno-bot-addons
Version:
Create easily addons for Zyno Bot
150 lines (146 loc) • 6.16 kB
JavaScript
const EventEmitter = require('events');
const { Client } = require('discord.js');
const { commandListeners, addons } = require('../../utils/saves.js');
const Command = require('../command.js');
const { handleEvents, createStructures } = require('./eventHandler.js');
const { validatePermission, passClientParser } = require('../../utils/functions.js');
const bitfields = require('../../bitfields/scopes.js');
const structureHandler = require('./structureHandler.js');
var client = null;
let receivedAddons = [];
class ClientParser extends EventEmitter{
constructor(){
super();
this.setMaxListeners(0);
passClientParser(this);
this.once('ready', async () => {
this.client_ready = true;
if(this.interactionHandler !== null){
this.ready = true;
await handleEvents(client, this.event);
}
});
}
parse(_client){
if(!(_client instanceof Client)) throw new Error(`Invalid client: Client parameter is not instance of Client class`);
if(client instanceof Client) throw new Error(`Invalid client: Another client has already been passed, possible malicious code`);
client = _client;
}
getClient(){
return client;
}
parseInteractionHandler(interactionHandler){
return new Promise(async resolve => {
this.interactionHandler = interactionHandler;
if(client instanceof Client){
if(this.client_ready === true){
this.ready = true;
await handleEvents(client, this.event);
}
}
resolve();
});
}
parseAddonRegistar(addonRegistar){
this.addonRegistar = addonRegistar;
this.emit('addonRegistarReady', this.addonRegistar);
}
commandAvailability(data, interaction){
return new Promise(async (resolve, reject) => {
let commandName;
if(interaction === true){
commandName = data.commandName;
} else {
commandName = (data.content || '').split(' ')[0].slice(client.config.prefix.length);
}
for(var i = 0; i < commandListeners.length; i++){
var commandListener = commandListeners[i];
try{
await new Promise((accept, stop) => {
const addonData = addons.get(commandListener.addonName);
if(!addonData) return accept();
if(!validatePermission(addonData.permissions, bitfields.bitfield.COMMANDS)) return accept();
if(commandListener.listener.listenerCount(commandName) > 0){
const command = new Command(data, interaction, {name: commandName, description: null}, addonData, structureHandler);
commandListener.listener.emit(commandName, command, accept, stop);
} else {
accept();
}
});
} catch {
reject();
break;
}
}
resolve();
});
}
updateStructures(){
return new Promise(async resolve => {
let _addons = client.addons.toReadableArray();
await createStructures(client, _addons);
resolve();
});
}
parseAddons(addons, force = false){
return new Promise(async (resolve, reject) => {
if(!Array.isArray(addons)) return reject(`Invalid addon array`);
const addonsArr = this.addons.toReadableArray();
for(let i = 0; i < addons.length; i++){
await new Promise(_resolve => {
let addonName = addons[i];
let resolveableName = require.resolve(addonName);
if(addonsArr.filter(a => a.value.resolveablePath === resolveableName).length > 0){
_resolve(true);
} else {
this.once('addonEmit',async (addon, callback) => {
clearTimeout(this.waitableTimeout[resolveableName]);
Object.defineProperty(addon, 'resolveablePath', {
value: resolveableName,
writable: false,
configurable: false
});
this.removeAllListeners('addonEmit');
receivedAddons.push(resolveableName);
callback(addon.name, true, function(){
if(force) _resolve(true);
});
if(!force) _resolve(true);
});
try{
require(resolveableName);
} catch (err){
console.log(`Error while starting addon:`, err);
}
setTimeout(() => {
if(receivedAddons.indexOf(resolveableName) >= 0) return;
delete require.cache[resolveableName];
this.removeAllListeners('addonEmit');
_resolve(false);
}, 3e3);
}
});
}
resolve();
});
}
emitAddon(addon){
return new Promise((resolve, reject) => {
this.emit('addonEmit', addon, function(name, bool, callback){
if(name === addon.name && bool) resolve(callback);
else{
callback();
reject(`Due to security reasons, this addon was blocked`);
}
});
});
}
client_ready = false;
ready = false;
InteractionHandler = null;
event = new EventEmitter();
waitableTimeout = {}
addons = addons;
addonRegistar = undefined;
}
module.exports = ClientParser;