HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux ip-172-31-4-197 6.8.0-1036-aws #38~22.04.1-Ubuntu SMP Fri Aug 22 15:44:33 UTC 2025 x86_64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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();