File: /var/www/bots/enerbot/src/app.js
import { createBot, createProvider, createFlow } from "@builderbot/bot";
import { MongoAdapter as Database } from "@builderbot/database-mongo";
import { MetaProvider as Provider } from "@builderbot/provider-meta";
import flowMain from "./flows/flow-main.js";
import flowValidarCodigo from "./flows/flow-validar-codigo.js";
import flowValidarEstadoSuspencion from "./flows/flow.validar-estado-suspencion.js";
import flowValidarEstadoPago from "./flows/flow-validar-estado-pago.js";
import flowContinuarReporte from "./flows/flow-continuar-reporte.js";
import flowRegistrarReporte from "./flows/flow-registrar-reporte.js"
import flowComentario from "./flows/flow-comentario.js"
import dotenv from "dotenv";
import { idleFlow } from "./config/idle-custom.js";
dotenv.config();
// Manejo de errores no capturados (debe ir al inicio del archivo)
process.on('unhandledRejection', (reason, promise) => {
console.error('⚠️ Unhandled Rejection at:', promise, 'reason:', reason);
// Puedes agregar lógica para reiniciar componentes específicos aquí
// Ejemplo: reconectar a la base de datos o reiniciar el provider
});
process.on('uncaughtException', (error) => {
console.error('⚠️ Uncaught Exception:', error);
// Considera si necesitas terminar el proceso en errores graves
// process.exit(1); // Descomentar solo si es crítico
});
const PORT = process.env.PORT ?? 3008;
const main = async () => {
const adapterFlow = createFlow([
flowMain,
flowValidarCodigo,
flowValidarEstadoSuspencion,
flowValidarEstadoPago,
flowContinuarReporte,
flowComentario,
flowRegistrarReporte,
idleFlow,
]);
const adapterProvider = createProvider(Provider, {
jwtToken: process.env.JWT_TOKE,
numberId: process.env.NUMBER_ID,
verifyToken: process.env.VERIFY_TOKEN,
version: process.env.VERSION,
});
const adapterDB = new Database({
dbUri: process.env.MONGO_DB_URI,
dbName: process.env.MONGO_DB_NAME,
});
const { handleCtx, httpServer } = await createBot({
flow: adapterFlow,
provider: adapterProvider,
database: adapterDB,
});
adapterProvider.server.post(
"/v1/messages",
handleCtx(async (bot, req, res) => {
const { number, message, urlMedia } = req.body;
await bot.sendMessage(number, message, { media: urlMedia ?? null });
return res.end("sended");
})
);
adapterProvider.server.post(
"/v1/register",
handleCtx(async (bot, req, res) => {
const { number, name } = req.body;
await bot.dispatch("REGISTER_FLOW", { from: number, name });
return res.end("trigger");
})
);
adapterProvider.server.post(
"/v1/samples",
handleCtx(async (bot, req, res) => {
const { number, name } = req.body;
await bot.dispatch("SAMPLES", { from: number, name });
return res.end("trigger");
})
);
adapterProvider.server.post(
"/v1/blacklist",
handleCtx(async (bot, req, res) => {
const { number, intent } = req.body;
if (intent === "remove") bot.blacklist.remove(number);
if (intent === "add") bot.blacklist.add(number);
res.writeHead(200, { "Content-Type": "application/json" });
return res.end(JSON.stringify({ status: "ok", number, intent }));
})
);
adapterProvider.getDB = () => adapterDB.db;
httpServer(+PORT);
};
main();