fenixenbot.js
Version:
Libreria Creacion De Bots De Discord
302 lines (260 loc) • 8.02 kB
JavaScript
const Discord = require("discord.js");
const handleEvent = require("./Handlers/EventsHandler");
const handleCommands = require("./Handlers/CommandHandler");
const handlePrefixCommands = require("./Handlers/PrrefixCommandsHandler");
const handleButtons = require("./Handlers/ButtonHandler");
const { Yaml } = require("../src/Utils/LoadYmlFile");
const path = require("path");
const Color = require("../src/Utils/Color");
const reload = require("../src/Utils/Reload");
const registerSlashCommands = require("./Registers/registerSlashCommands");
const { commands, prefixCommands } = require("./Utils/commands");
const Canvas = require("./Utils/Canvas");
const {MongoConnect} = require("./libs/MongoConnect");
const MSchema = require("./Schema/MongoSchema");
const RMSchemas = require("./Registers/RegisterMSchemas");
const SequelizeConnect = require("./libs/SequelizeConnect");
const SSchema = require("./Schema/SequelizeSchema");
const RegisterSSchemas = require("./Registers/RegisterSSchemas");
Object.entries(Discord).forEach(([key, value]) => {
global[key] = value;
});
global.Discord = require("discord.js");
let yml = () => ({});
function FenixenBot(options) {
if (!options || !options.token) {
throw new Error(
Color.red,
"El token es obligatorio para inicializar FenixenBot.",
Color.reset
);
}
const {
token,
intents,
partials,
setupClient,
eventHandler,
commandsHandler,
buttonsHandler,
clientId,
prefixCommandsHandler,
prefix,
nameBot,
mongoConnect,
mongoSchemas,
sequelizeConnect,
sequelizeSchemas,
} = options;
const defaultIntents = [
Discord.GatewayIntentBits.Guilds,
Discord.GatewayIntentBits.GuildMessages,
Discord.GatewayIntentBits.MessageContent,
Discord.GatewayIntentBits.GuildMembers,
Discord.GatewayIntentBits.GuildVoiceStates,
Discord.GatewayIntentBits.GuildPresences,
];
const defaultPartials = [
Discord.Partials.Message,
Discord.Partials.Channel,
Discord.Partials.Reaction,
];
const client = new Discord.Client({
intents: intents || defaultIntents,
partials: partials || defaultPartials,
});
client.token = token;
if(sequelizeConnect) {
SequelizeConnect(sequelizeConnect);
client.sequelize = SequelizeConnect(sequelizeConnect);
}
if(mongoConnect) {
MongoConnect(mongoConnect);
client.mongo = mongoConnect;
}
if(sequelizeConnect) {
client.sequelize = SequelizeConnect(sequelizeConnect);
}
if (commandsHandler) {
const commandsPath = path.resolve(commandsHandler);
handleCommands(client, commandsPath);
}
if (eventHandler) {
const eventsPath = path.resolve(eventHandler);
handleEvent(client, eventsPath);
}
if (buttonsHandler) {
const buttonsPath = path.resolve(buttonsHandler);
handleButtons(client, buttonsPath);
}
if (prefixCommandsHandler) {
const prefixCommandsPath = path.resolve(prefixCommandsHandler);
handlePrefixCommands(client, prefixCommandsPath);
}
if (typeof setupClient === "function") {
setupClient(client);
}
reload(
client,
clientId,
Discord,
commandsHandler,
eventHandler,
buttonsHandler,
prefixCommandsHandler,
token,
nameBot
);
client.on("interactionCreate", async (interaction) => {
if (!interaction.isButton()) {
return;
}
const button = client.buttons.get(interaction.customId);
if (!button) {
console.warn(`Botón no encontrado: ${interaction.customId}`);
return interaction.reply({
content: 'Botón no reconocido.',
flags: 64,
});
}
try {
await button.execute(interaction, client);
} catch (error) {
console.error('Error al ejecutar botón:', error);
await interaction.reply({
content: '¡Hubo un error al ejecutar este botón!',
flags: 64,
});
}
})
client.on("interactionCreate", async (interaction) => {
if (!interaction.isCommand()) return;
const command = client.commands.get(interaction.commandName);
if (!command) return;
try {
await command.execute(interaction);
} catch (error) {
console.error(
Color.red,
"Error al ejecutar comando:",
Color.reset,
error
);
await interaction.reply({
content: "¡Hubo un error al ejecutar este comando!",
ephemeral: true,
});
}
});
client.once("ready", async () => {
if (sequelizeConnect) {
client.sequelize = await SequelizeConnect(sequelizeConnect);
const resolvedSequelizeSchemasPath = sequelizeSchemas ? path.resolve(sequelizeSchemas) : path.join(process.cwd(), "ModelsDB_Sequelize");
client.models = await RegisterSSchemas(resolvedSequelizeSchemasPath, client.sequelize);
}
if (mongoConnect) {
const resolvedSchemasPath = mongoSchemas
? path.resolve(mongoSchemas)
: path.join(process.cwd(), "ModelsDB");
client.models = RMSchemas(resolvedSchemasPath);
}
try {
setTimeout(async () => {
const allCommands = Array.from(client.commands.values());
if (allCommands.length > 0) {
await registerSlashCommands(token, clientId, allCommands);
} else {
console.warn(`${Color.yellow}No se encontraron comandos para registrar${Color.reset}`);
}
}, 1000);
} catch (error) {
console.error(
Color.red,
"Error al registrar comandos slash:",
Color.reset,
error
);
}
});
client.on("messageCreate", async (message) => {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
const args = message.content.slice(prefix.length).trim().split(/ +/);
const commandName = args.shift().toLowerCase();
const command =
client.prefixCommands.get(commandName) ||
client.prefixCommands.find(
(cmd) => cmd.aliases && cmd.aliases.includes(commandName)
);
if (!command) return;
try {
command.execute(message, args);
} catch (error) {
console.error(
`${Color.red}Error al ejecutar comando de prefijo:${Color.reset}`,
error
);
message.reply("¡Hubo un error al ejecutar este comando de prefijo!");
}
});
client.login(token);
return client;
}
function registerEvents(client, eventDefinitions) {
for (const eventDef of eventDefinitions) {
client.on(eventDef.event, eventDef.execute.bind(null, client));
console.log(
Color.green,
`Evento registrado: ${eventDef.event}`,
Color.reset
);
}
}
function event(eventOptions) {
const { name, event, execute, once } = eventOptions;
if (!name) {
throw new Error(
Color.red,
"El nombre del evento es obligatorio.",
Color.reset
);
}
if (!event) {
throw new Error(
Color.red,
"El nombre del evento de Discord es obligatorio.",
Color.reset
);
}
if (typeof execute !== "function") {
throw new Error(
Color.red,
`La función 'execute' es obligatoria para el evento ${Color.yellow}'${name}'.`,
Color.reset
);
}
return { name, event, execute, once };
}
function Button({ customId, execute }) {
if (!customId || typeof execute !== "function") {
throw new Error("Debes proporcionar 'customId' y una función 'execute'");
}
return {
data: { customId },
execute,
};
}
module.exports = {
FenixenBot,
commands,
prefixCommands,
registerEvents,
Yaml,
event,
Color,
registerSlashCommands,
Canvas,
MSchema,
Button,
SSchema,
};