130 lines
No EOL
3.4 KiB
JavaScript
130 lines
No EOL
3.4 KiB
JavaScript
const fs = require("fs");
|
|
|
|
class CommandHandler {
|
|
constructor (client) {
|
|
this.client = client;
|
|
}
|
|
|
|
load (name, category) {
|
|
try {
|
|
const path = this.client.path + "/commands/" + category + "/" + name + ".js";
|
|
const props = new (require(path))(this.client);
|
|
|
|
this.client.logger.debug(`Loading command ${category}/${name}`);
|
|
|
|
props.help.name = name;
|
|
props.help.category = category;
|
|
|
|
if (props.init) {
|
|
props.init(this.client);
|
|
}
|
|
|
|
this.client.commands.set(props.help.name, props);
|
|
|
|
props.conf.aliases.forEach(alias => {
|
|
this.client.aliases.set(alias, props.help.name);
|
|
});
|
|
|
|
return;
|
|
} catch (err) {
|
|
return `Failed to load command ${name}: ${err}`;
|
|
}
|
|
}
|
|
|
|
loadAll () {
|
|
const commandDirectories = fs.readdirSync("./commands/");
|
|
this.client.logger.debug(`Found ${commandDirectories.length} command directories.`);
|
|
commandDirectories.forEach((dir) => {
|
|
const commandFiles = fs.readdirSync("./commands/" + dir + "/");
|
|
commandFiles.filter((cmd) => cmd.split(".").pop() === "js").forEach((cmd) => {
|
|
cmd = cmd.substring(0, cmd.length - 3);
|
|
const resp = this.load(cmd, dir);
|
|
if (resp) {
|
|
this.client.logger.error(resp);
|
|
}
|
|
});
|
|
});
|
|
this.client.logger.info(`Loaded a total of ${this.client.commands.size} commands.`)
|
|
}
|
|
|
|
async unload (name, category) {
|
|
const path = this.client.path + "/commands/" + category + "/" + name + ".js";
|
|
|
|
let command;
|
|
|
|
if (this.client.commands.has(name)) {
|
|
command = this.client.commands.get(name);
|
|
} else if (this.client.aliases.has(name)) {
|
|
command = this.client.commands.get(this.client.aliases.get(name));
|
|
};
|
|
|
|
if (!command) {
|
|
return `\`${name}\` does not exist as a command or an alias.`
|
|
}
|
|
|
|
this.client.logger.debug(`Unloading command ${category}/${name}`);
|
|
|
|
if (command.shutdown) {
|
|
await command.shutdown(this.client)
|
|
}
|
|
delete require.cache[require.resolve(path)];
|
|
return false;
|
|
}
|
|
|
|
unloadAll () {
|
|
const commandDirectories = fs.readdirSync("./commands/");
|
|
this.client.logger.debug(`Found ${commandDirectories.length} command directories.`);
|
|
commandDirectories.forEach((dir) => {
|
|
const commandFiles = fs.readdirSync("./commands/" + dir + "/");
|
|
commandFiles.filter((cmd) => cmd.split(".").pop() === "js").forEach((cmd) => {
|
|
cmd = cmd.substring(0, cmd.length - 3);
|
|
const resp = this.unload(cmd, dir);
|
|
if (resp) {
|
|
this.client.logger.error(resp);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
class EventHandler {
|
|
constructor (client) {
|
|
this.client = client;
|
|
}
|
|
|
|
load (name) {
|
|
try {
|
|
this.client.logger.debug(`Loading event ${name}`);
|
|
|
|
const path = this.client.path + "/events/" + name + ".js";
|
|
const event = new (require(path))(this.client);
|
|
this.client.on(name, (...args) => event.run(...args));
|
|
delete require.cache[require.resolve(path)];
|
|
|
|
return;
|
|
} catch (err) {
|
|
return `Failed to load event ${name}: ${err}`;
|
|
}
|
|
}
|
|
|
|
unload (name) {
|
|
|
|
}
|
|
|
|
loadAll () {
|
|
const eventFiles = fs.readdirSync(this.client.path + "/events");
|
|
eventFiles.forEach(file => {
|
|
const name = file.split(".")[0];
|
|
const resp = this.load(name);
|
|
|
|
if (resp) {
|
|
this.client.logger.error(resp);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
CommandHandler: CommandHandler,
|
|
EventHandler: EventHandler
|
|
}; |