codigoencasa / builderbot

🤖 Crear Chatbot WhatsApp en minutos. Únete a este proyecto OpenSource
https://www.builderbot.app
MIT License
2.41k stars 827 forks source link

ERROR GOTOFLOWS ANIDADOS [🐛] #910

Closed Gregoriotecnico closed 11 months ago

Gregoriotecnico commented 1 year ago

¿Que versión estas usando?

v2

¿Sobre que afecta?

Flujo de palabras (Flow)

Describe tu problema

Pasar de un flujo mediante gotoFlow con más de un gotoFlow no funciona (creo que desde que se añadió el tema de la dependencia circular) El error se vé: Flujo 1 -> (gotoflow: flujo 2) PERFECTO Flujo 2 -> (gotoflow: flujo 3) NO LO HACE

Este sistema ya lo tenia yo realizado en bots ateriores funcionando perfectamente. He cambiado la funcion del gotoFlow(interna) de uno de mis bots antiguos hacia este ejemplo y funciona perfectamente.

image

Reproducir error

No response

Información Adicional

No response

leifermendez commented 1 year ago

Puedes compartir el ejemplo de los gotoFlows anidados a que te refieres?

Gregoriotecnico commented 1 year ago

IMG-20231109-WA0002_1699604368695 Estoy fuera de casa, te mando una captura que tenía de ayer. Falta el primer flujo que deriva a "flowReserva" (este lo hace bien) El que hace mal es el que ves en el ejemplo que te adjunto: Hago gotoFlow hacia "flowReservaNuevoCliente" pero nunca lo hace.

Cuando llegue a casa te envío el otro flujo, pero simpleme te es como si hicieras un gotoFlow desde un events.welcome

Gregoriotecnico commented 1 year ago

main.js (Primer gotoFlow que lo hace correctamnte)

const { addKeyword, addAnswer, EVENTS } = require("@bot-whatsapp/bot");
const cron = require("node-cron");
const { activarDiariamente } = require("./utils/activarDiariamente");
const consultarBlacklist = require("./utils/consultarBlacklist.js");
const conexionSheets = require("./services/conexionSheets.js");
const flowBienvenida = require("./flows/flow.bienvenida.js");
const { flowMenu } = require("./flows/flow.menu.js");
const flowHorario = require("./flows/flow.horario.js");
const flowZona = require("./flows/flow.zona.js");
const flowCarta = require("./flows/flow.carta.js");
const  {flowReserva}  = require("./flows/flow.reserva.js");
let ultimaEjecucionSheet = 0;
let ultimaEjecucionVacaciones = 0;

const flowMain = addKeyword(EVENTS.WELCOME).addAction(async (ctx, ctxFn) => {
  try {
    //TODO - LEEMOS SHEETS PARA LOS MENSAJES
    const tiempoActual = Date.now();
    if (tiempoActual - ultimaEjecucionSheet >= 30000) {
      // Leemos sheets cada 30 segundos
      await conexionSheets(ctxFn);
      ultimaEjecucionSheet = tiempoActual;
    }
    //TODO - LEEMOS MYSQL PARA TRAER ESTADO DEL CHATBOT
    const estadoChatbot = await ctxFn.extensions.mesas.estadoChatbot();
    const consultaConfiguracion =
      await ctxFn.extensions.mesas.consultaConfiguracion();
    ctxFn.extensions.json.escribirEnJson({
      carta: consultaConfiguracion[0].CartaURL,
      mesasExterior: consultaConfiguracion[0].Mesas_exterior,
      mesasInterior: consultaConfiguracion[0].Mesas_Interior,
      personasXmesa: consultaConfiguracion[0].PersonasXmesas
    });

    //TODO - INICIAMOS LA DERIVACION A FLUJOS
    const resUsuario = ctx.body.toLowerCase().trim();

    switch (resUsuario) {

      case "reserva":
      case "reservar":
      case "reservar mesa":
      case "reserva mesa":
      case "🗓️ *reservar mesa*":
        return ctxFn.gotoFlow(flowReserva);

      default:
        return ctxFn.gotoFlow(flowBienvenida);
    }
  } catch (e) {
    console.log("Error en el flowMain: ", e);
  }
});

module.exports = { flowMain };

flow.reserva.js (Estan dos flujos, flowReserva y flowReservaNuevoCliente)

const { addKeyword, EVENTS, addAction } = require("@bot-whatsapp/bot");
const flowReservaNuevoCliente = require("./subflowreserva");

const flowReserva = addKeyword("__FLOWRESERVA__")
  .addAction(async (ctx, ctxFn) => {
    ctxFn.flowDynamic(ctxFn.extensions.json.leerCampoJson("menuReserva"));
  })
  .addAction(async (ctx, { extensions, gotoFlow }) => {
    const buscarCliente = await extensions.mesas.buscarCliente(
      ctx.from.slice(2)
    );
    if (!buscarCliente) {
      console.log("entra al if");

      return gotoFlow(flowReservaNuevoCliente);
    }
  });

const flowReservaNuevoCliente = addKeyword("12345").addAnswer(
  "Digame su *Nombre y apellidos* para reservar su mesa...",
  { capture: true },
  async (ctx, { state }) => {
    console.log("entro al answer");

    state.update({ Nombre: ctx.body, Telefono: ctx.from.slice(2) });
  }
);

module.exports = { flowReserva, flowReservaNuevoCliente };

Evidentemente en el app.js estan implementados los 3 flujos con sus respectivas rutas

leifermendez commented 12 months ago

Siguiente release ya esta fixed.

https://github.com/codigoencasa/bot-whatsapp/blob/6edf3730e143c58b3bb36e1d748a6730e6392168/__test__/0.0.2-goto-flow.test.js#L177

Elimeleth commented 12 months ago

Siguiente release ya esta fixed.

https://github.com/codigoencasa/bot-whatsapp/blob/6edf3730e143c58b3bb36e1d748a6730e6392168/__test__/0.0.2-goto-flow.test.js#L177

Gracias !! casualmente me tope con el mismo issue

un gotoFlow no funciona cuando ya vienes de otro

leifermendez commented 12 months ago

Siguiente release ya esta fixed. https://github.com/codigoencasa/bot-whatsapp/blob/6edf3730e143c58b3bb36e1d748a6730e6392168/__test__/0.0.2-goto-flow.test.js#L177

Gracias !! casualmente me tope con el mismo issue

un gotoFlow no funciona cuando ya vienes de otro

Peudes ir probando con este comando instalas la version que se viene Dejo un video relacionado:

https://www.youtube.com/watch?v=veybTEYGir0

npm i @bot-whatsapp/bot@dev @bot-whatsapp/cli@dev @bot-whatsapp/database@dev @bot-whatsapp/provider@dev @bot-whatsapp/portal@dev
Ariel-Marcelo commented 10 months ago

Disculpen al día de hoy tengo entendido que ese cambio ya esta añadido a la última liberación sin embargo, pruebo el ejemplo que mencionas en bot-whatsapp/test/0.0.2-goto-flow.test.js y no entra al addAction del flowReserva, no imprime Flow de la reserva 1 y mucho menos el 2, para verificarlo borre los node_modules e incluso instale las dependencias de desarrollo que mencionas pero sigue pasando lo mismo, por favor pueden indicarme si hay algo que esté haciendo mal. img

jhonnymosquera commented 8 months ago

Creo que no se ha solucionado todavia dado que un ejemplo tan siemple como este no funciona

Captura Captura2

leifermendez commented 8 months ago

Creo que no se ha solucionado todavia dado que un ejemplo tan siemple como este no funciona

Captura Captura2

Debes colocar todos los flows en el array de


createFlow([test_gotoFlow, test_gotoFlow_2, test_gotoFlow_3])
leifermendez commented 8 months ago

Disculpen al día de hoy tengo entendido que ese cambio ya esta añadido a la última liberación sin embargo, pruebo el ejemplo que mencionas en bot-whatsapp/test/0.0.2-goto-flow.test.js y no entra al addAction del flowReserva, no imprime Flow de la reserva 1 y mucho menos el 2, para verificarlo borre los node_modules e incluso instale las dependencias de desarrollo que mencionas pero sigue pasando lo mismo, por favor pueden indicarme si hay algo que esté haciendo mal. img

Revisa el mensaje del compañero @jhonnymosquera

jhonnymosquera commented 8 months ago

@leifermendez Muchas gracias, me gustaria ayudar con la documentasion en el sitio web pero no se como, mientras dejo la solucion mas clara aqui a quien pueda servirle

solucion1 solucion2

leifermendez commented 8 months ago

@jhonnymosquera para evitar el uso de ese uuid usa EVENT.ACTION que tecnicamente hace algo similar con el mismo proposito. ya estamos trabajando en una nueva doc esta en construccion pero puedes ir aportando. https://builderbot.vercel.app/methods#goto-flow

leifermendez commented 8 months ago

@jhonnymosquera para aporta a la doc debes ir a https://github.com/codigoencasa/documentation