fenixenbot.js
Version:
Libreria Creacion De Bots De Discord
171 lines (160 loc) • 5.91 kB
JavaScript
const Color = require('./Color');
const Discord = require('discord.js'); // Asegúrate de tener esto aquí arriba si no lo tienes
function commands(commandsOptions) {
const { name, description, execute, options, permissions } = commandsOptions;
if (!name) {
throw new Error(
Color.red,
'- El nombre del comando es obligatorio.',
Color.reset
);
}
if (typeof execute !== 'function') {
throw new Error(
Color.red,
`- La función 'execute' es obligatoria para el comando ${Color.blue}'${name}'.`,
Color.reset
);
}
const { SlashCommandBuilder, PermissionFlagsBits } = Discord; // Extraemos solo lo necesario de Discord
if (description) {
if (!description) {
throw new Error(
Color.red,
`- La descripción es obligatoria para comandos SLASH ${Color.blue}${name}'.`,
Color.reset
);
}
const slashCommandData = new SlashCommandBuilder()
.setName(name)
.setDescription(description)
.setDefaultMemberPermissions(permissions);
if (options && Array.isArray(options)) {
options.forEach((optionDef) => {
if (
!optionDef.name ||
!optionDef.description ||
!optionDef.type ||
typeof optionDef.required === 'undefined' // Permitir que 'required' sea opcional en la definición
) {
console.warn(
Color.red,
`- Opción inválida en comando SLASH${Color.blue} '${name}'${Color.reset}. Se requiere name, description y type. 'required' es opcional.`,
Color.reset
);
return;
}
switch (optionDef.type.toUpperCase()) {
case 'STRING':
slashCommandData.addStringOption(option =>
option.setName(optionDef.name)
.setDescription(optionDef.description)
.setRequired(optionDef.required)
.setAutocomplete(optionDef.autocomplete === true)
.addChoices(...(optionDef.choices || []))
);
break;
case 'INTEGER':
slashCommandData.addIntegerOption(option =>
option.setName(optionDef.name)
.setDescription(optionDef.description)
.setRequired(optionDef.required)
.setAutocomplete(optionDef.autocomplete === true)
.addChoices(...(optionDef.choices || []))
);
break;
case 'NUMBER':
slashCommandData.addNumberOption(option =>
option.setName(optionDef.name)
.setDescription(optionDef.description)
.setRequired(optionDef.required)
.setAutocomplete(optionDef.autocomplete === true)
.addChoices(...(optionDef.choices || []))
);
break;
case 'BOOLEAN':
slashCommandData.addBooleanOption(option =>
option.setName(optionDef.name)
.setDescription(optionDef.description)
.setRequired(optionDef.required)
);
break;
case 'USER':
slashCommandData.addUserOption(option =>
option.setName(optionDef.name)
.setDescription(optionDef.description)
.setRequired(optionDef.required)
);
break;
case 'CHANNEL':
slashCommandData.addChannelOption(option =>
option.setName(optionDef.name)
.setDescription(optionDef.description)
.setRequired(optionDef.required)
);
break;
case 'ROLE':
slashCommandData.addRoleOption(option =>
option.setName(optionDef.name)
.setDescription(optionDef.description)
.setRequired(optionDef.required)
);
break;
case 'MENTIONABLE':
slashCommandData.addMentionableOption(option =>
option.setName(optionDef.name)
.setDescription(optionDef.description)
.setRequired(optionDef.required)
);
break;
case 'ATTACHMENT':
slashCommandData.addAttachmentOption(option =>
option.setName(optionDef.name)
.setDescription(optionDef.description)
.setRequired(optionDef.required)
);
break;
default:
console.warn(
Color.yellow,
`- Tipo de opción desconocido '${optionDef.type}' en comando SLASH ${Color.blue}'${name}'${Color.reset}. Opciones válidas: STRING, INTEGER, NUMBER, BOOLEAN, USER, CHANNEL, ROLE, MENTIONABLE, ATTACHMENT.`,
Color.reset
);
}
});
}
return {
data: slashCommandData,
execute,
name: name,
};
} else {
return {
name: name,
execute,
};
}
}
function prefixCommands(prefixCommandOptions) {
const { name, execute, aliases } = prefixCommandOptions;
if (!name) {
throw new Error(
Color.red,
'- El nombre del comando de prefijo es obligatorio.',
Color.reset
);
}
if (typeof execute !== 'function') {
throw new Error(
Color.red,
`- La función 'execute' es obligatoria para el comando de prefijo ${Color.magenta}'${name}'.`,
Color.reset
);
}
return {
name: name,
aliases: aliases,
execute: (message, args) => execute(message, args),
};
}
module.exports = { commands, prefixCommands };