Files
discordeno/examples/nodejs/Managers/CommandManager.js
2023-04-01 02:46:46 +02:00

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