mirror of
https://github.com/discordeno/discordeno.git
synced 2026-05-28 14:30:11 +00:00
* feat: all emoji rest methods * Fix code style issues with ESLint Co-authored-by: Lint Action <lint-action@samuelmeuli.com>
138 lines
4.4 KiB
JavaScript
138 lines
4.4 KiB
JavaScript
const resolveFolder = (folderName) => path.resolve(__dirname, ".", folderName);
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
class CommandManager {
|
|
constructor(client) {
|
|
this.client = client;
|
|
this.cache = new Map();
|
|
this.aliases = new Map();
|
|
}
|
|
|
|
load(options = {}) {
|
|
const commandFolderPath = options.path || "../Plugins";
|
|
const commandFolder = resolveFolder(commandFolderPath);
|
|
if (options.category === undefined) options.category = true;
|
|
if (options.plugins === undefined) options.plugins = true;
|
|
// PluginMode will iterate through all SubFolders
|
|
fs.readdirSync(commandFolder).map(async (dir) => {
|
|
if (dir.endsWith(".txt")) return;
|
|
if (!options.category && dir.endsWith(".js")) {
|
|
const commandPath = path.join(commandFolder, dir);
|
|
this.loadCommand(commandPath);
|
|
} else {
|
|
fs.readdirSync(path.join(commandFolder, dir)).map((cmd) => {
|
|
if (cmd.endsWith(".js") && !options.plugins) {
|
|
const commandPath = path.join(commandFolder, dir, cmd);
|
|
this.loadCommand(commandPath);
|
|
} else if (commandFolderPath === "../Plugins") {
|
|
if (cmd !== "commands") return;
|
|
fs.readdirSync(path.join(commandFolder, dir, cmd)).map((cmdfile) => {
|
|
if (!cmdfile.endsWith(".js")) return;
|
|
const commandPath = path.join(commandFolder, dir, cmd, cmdfile);
|
|
this.loadCommand(commandPath);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
loadCommand(commandPath) {
|
|
const pull = require(path.join(commandPath));
|
|
if (pull.name) {
|
|
pull.path = commandPath;
|
|
this.cache.set(pull.name, pull);
|
|
}
|
|
if (pull.aliases) {
|
|
pull.aliases.map((p) => this.aliases.set(p, pull));
|
|
}
|
|
return pull;
|
|
}
|
|
|
|
reloadCommand(commandName) {
|
|
const command = this.cache.get(commandName);
|
|
if (!command) return;
|
|
const commandPath = path.join(command.path);
|
|
delete require.cache[require.resolve(commandPath)];
|
|
return this.loadCommand(commandPath);
|
|
}
|
|
|
|
isCommand(message) {
|
|
if (message.isFromBot) return false;
|
|
const prefix = "!";
|
|
const escapeRegex = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
const prefixRegex = new RegExp(`^(<@!?${this.client.id}>|${escapeRegex(prefix)})\\s*`);
|
|
if (!prefixRegex.test(message.content)) return false;
|
|
|
|
const [, matchedPrefix] = message.content.match(prefixRegex);
|
|
const args = message.content.slice(matchedPrefix.length).trim().split(/ +/);
|
|
|
|
this.onMessage(message, prefix, args);
|
|
return true;
|
|
}
|
|
|
|
isInteraction(interaction) {
|
|
if (interaction.type !== 2) return;
|
|
this.onInteraction(interaction);
|
|
}
|
|
|
|
async onMessage(message, guild, args) {
|
|
const commandName = args.shift().toLowerCase();
|
|
const command = this.cache.get(commandName); // || this.cache.find(cmd => cmd.aliases && cmd.aliases.includes(commandName));
|
|
if (!command && message.content.includes(this.client.id)) {
|
|
// Handle, when Command has not been found
|
|
const options = { content: "I did not found the Command!" };
|
|
this.client.helpers.sendMessage(message.channelId, options);
|
|
}
|
|
if (!command) return;
|
|
|
|
const messagecommand = new command({
|
|
manager: this,
|
|
message,
|
|
client: this.client,
|
|
args,
|
|
settings: {},
|
|
commandName: command.name,
|
|
});
|
|
messagecommand.execute()?.catch?.((error) => {
|
|
console.log(error);
|
|
// Call Function on CommandResponse.js, handle the error
|
|
return messagecommand.onError(error ?? "custom");
|
|
});
|
|
}
|
|
|
|
async onInteraction(interaction) {
|
|
const command = this.cache.get(interaction.data.name);
|
|
if (!command) return;
|
|
|
|
const args = [];
|
|
// Map all Values and Args
|
|
interaction.data.options?.map((o) => {
|
|
if (o.name) args.push(o.name);
|
|
if (o.options) {
|
|
o.options.map((o2) => {
|
|
if (o2.value) return args.push(o2.value);
|
|
if (o2.name) args.push(o2.name);
|
|
if (o2.options) o2.options.map((v) => args.push(v.value));
|
|
});
|
|
}
|
|
});
|
|
|
|
const messagecommand = new command({
|
|
manager: this,
|
|
interaction,
|
|
client: this.client,
|
|
args,
|
|
settings: {},
|
|
commandName: command.name,
|
|
});
|
|
messagecommand.execute()?.catch?.((error) => {
|
|
console.log(error);
|
|
// Call Function on CommandResponse.js, handle the error
|
|
return messagecommand.onError(error ?? "custom");
|
|
});
|
|
}
|
|
}
|
|
module.exports = CommandManager;
|