@@ -0,0 +1,85 @@
const fs = require('fs');
const cp = require('child_process');
const logger = require(`${__dirname}/Logger`);

function exists(module) {
try {
require.resolve(module);
return true;
} catch(err) {
return false;
}
}

module.exports = bot => {
let allDeps = [];
let dontLoad = [];
let cmdDirs = fs.readdirSync(bot.commandsDir).map(d => ({[d]: fs.readdirSync(`${bot.commandsDir}/${d}`)}));
let allCmds = {};
let unloaded;

// Go from an array of objects to an object of arrays.
cmdDirs.forEach(d => Object.assign(allCmds, d));
cmdDirs = cmdDirs.map(e => Object.keys(e)[0]);

// Turn folder names into proper paths for future ease (also make sure we only get folders).
allCmds = Object.entries(allCmds).map(x => x[1].filter(y => fs.statSync(`${bot.commandsDir}/${x[0]}/${y}`).isDirectory()));
allCmds = allCmds.map((v, i) => v.map(x => `./${bot.commandsDir}/${cmdDirs[i]}/${x}`));
allCmds = [].concat.apply([], allCmds);

logger.custom('loader', 'Preloading commands...');

for (let cmd of allCmds) {
let name = cmd.split('/')[-1];
let files = fs.readdirSync(cmd);
let pkg;

if (!files.includes('package.json')) {
logger.customError('loader', `Will not load "${name}" due to missing package.json.`);
dontLoad.push(cmd);
continue;
}

try {
pkg = JSON.parse(fs.readFileSync(`${cmd}/package.json`));
} catch(err) {
logger.customError('loader', `Malformed package file for "${name}".`);
continue;
}

if (!pkg.dependencies || !Object.keys(pkg.dependencies)[0]) continue;

for (let dep in pkg.dependencies) if (!exists(dep) && !allDeps.includes(dep)) allDeps.push(dep);
}

if (allDeps.length !== 0) {
logger.custom('loader', `Installing following dependencies for commands: [36m"${allDeps.join(', ')}"`);
cp.execSync(`npm i ${allDeps.join(' ')}`);
}

try {
unloaded = JSON.parse(fs.readFileSync(bot.unloadedPath));
} catch(err) {
unloaded = [];
fs.writeFileSync(bot.unloadedPath, '[]');
}

logger.custom('loader', 'Loading commands...');

for (let cmd of allCmds) {
if (dontLoad.includes(cmd) || unloaded.includes(cmd)) continue;

let pkg = JSON.parse(fs.readFileSync(`${cmd}/package.json`));
let path = `${cmd}/${pkg.main}`;
let name = cmd.split('/')[-1];

try {
bot.commands.loadModule(path);
} catch(err) {
logger.customError('loader', `Error while loading "${name}"\n${err}`);
unloaded.push(cmd);
}
}

fs.writeFileSync(bot.unloadedPath, JSON.stringify(unloaded));
};
@@ -68,6 +68,7 @@ class Utils {
0xFF5722, // Deep Orange
0x607D8B // Blue Grey
];

return colours[Math.floor(Math.random() * colours.length)];
}
}