codigoencasa / bot-whatsapp

🤖 Crear Chatbot WhatsApp en minutos. Únete a este proyecto OpenSource (Typescript Version Pronto)
https://bot-whatsapp.netlify.app
MIT License
2.29k stars 797 forks source link

[🐛] Cuando se activa fallBack dentro de un addAnswer con capture true, no espera el capture true y se salta al siguiente addAnswer #545

Closed nelsonromerog closed 1 year ago

nelsonromerog commented 1 year ago

¿Que versión estas usando?

v2

¿Sobre que afecta?

Flujo de palabras (Flow)

Describe tu problema

El problema es cuando tengo un fallBack dentro de un addAnswer con capture true, si me está mostrando nuevamente el mensaje del addAnswer pero ya no me espera el capture true y se salta al siguiente addAnswer. Ejemplo: En el addAnswer hasta arriba tengo un fallBack el cual se activa cuando tengo un error en la consulta de la funcion en la línea 120. Cuando se activa este fallBack me muestra el mensaje de la línea 113 como debe de ser, pero lo raro es que de ahí me salta al siguiente addAnswer de la línea 150 sin esperar nuevamente del capture del addAnswer línea 112 image

Código de ejemplo:

.addAnswer(
    "🙌 Seleccione *marca del auto* a cotizar, con el *número* correspondiente",
    {
      capture: true,
    },
    async (ctx, { flowDynamic, fallBack }) => {
        const subMarcas = await getAllSubMarcasCHUBB(
          marcasCHUBB[
            marcasCHUBB.findIndex((mc) => mc.body.split(" ")[0] === ctx.body)
          ].id
        let messageSubMarcasCHUBB = "";
        subMarcasCHUBB = subMarcas.data.map((m, i) => {
          messageSubMarcasCHUBB += `${i + 1} ${m.DESC[0]}\n`;
          return {
            id: m.ID[0],
            body: `${i + 1} ${m.DESC[0]}`,
          };
        });
        return flowDynamic([
          {
            body: `📄 Cotizando en CHUBB...\n\n🔎 Un momento, estamos obteniendo el listado de sub marcas para el ${
              marcasCHUBB[
                marcasCHUBB.findIndex((mc) => mc.body.split(" ")[0] === ctx.body)
              ].body.split(" ")[1]
            } en CHUBB...`,
          },
          { body: messageSubMarcasCHUBB },
        ]);           
      } else {
        return fallBack();        
      }
    }
  )
  .addAnswer(
    "🚗 Seleccione la *sub marca del auto* a cotizar, con el *número* correspondiente:",
  )

Reproducir error

No response

Información Adicional

No response

leifermendez commented 1 year ago

Probar esta version npm install @bot-whatsapp/bot@dev

NOTA Esta nueva implementacion incluira un cambio que requiere si tienes un capture necesitaras colocar un flowDynamic obligatoriamente para continuar el flujo.

VIDEO https://share.vidyard.com/watch/TKbt4RRSme7e6ePuegpKuu?

const {
    createBot,
    createProvider,
    createFlow,
    addKeyword,
} = require('@bot-whatsapp/bot')

const QRPortalWeb = require('@bot-whatsapp/portal')
const BaileysProvider = require('@bot-whatsapp/provider/baileys')
const MockAdapter = require('@bot-whatsapp/database/mock')

const delay = (ms) => new Promise((resolve) => setTimeout(resolve,ms))

const fakeHTTP = async () => {
    await delay(1000)
    return ['Gracias por tu email se ha validado de manera correcta']
}

const flowGracias = addKeyword('gracias').addAnswer('De nada!')

const flowPrincipal = addKeyword('hola')
.addAnswer(
    "🙌 ¿CUal es tu email?",
    {
      capture: true,
    },
    async (ctx, { flowDynamic, fallBack }) => {

        const validation = ctx.body.includes('@')

        if(validation) {
            const getDataFromApi = await fakeHTTP()
            return flowDynamic(getDataFromApi)
        }
        return fallBack(validation)

    }
  )
  .addAnswer(
    "Continuamos....",
  )
  .addAnswer(
    "¿Cual es tu edad?",
    {capture:true},
    async (ctx,{flowDynamic, fallBack}) => {
        if(ctx.body !== '18'){
            await delay(50)
            return fallBack(false, 'Ups creo que no eres mayor de edad')
        }
        return flowDynamic('Bien tu edad es correcta!')
    }
  ).addAnswer('Puedes pasar', null, null, flowGracias)

const main = async () => {
    const adapterDB = new MockAdapter()
    const adapterFlow = createFlow([flowPrincipal])
    const adapterProvider = createProvider(BaileysProvider)

    createBot({
        flow: adapterFlow,
        provider: adapterProvider,
        database: adapterDB,
    })

}

main()
leifermendez commented 1 year ago

@nelsonromerog fijate que ahora el fallBack(false, 'Ups creo que no eres mayor de edad') puede recibir dos parametros el primero argumento es obligatorio, es un boolean y el segundo opcional para si se quiere proporcionar uh mensaje mas personalizado

leifermendez commented 1 year ago

@cheveguerra

JoelVeloz commented 1 year ago

npm install @bot-whatsapp/bot@0.0.84-alpha.0 Con esta version si funciona el fallBack de flows secundarios!!

leifermendez commented 1 year ago

npm install @bot-whatsapp/bot@0.0.84-alpha.0 Con esta version si funciona el fallBack de flows secundarios!!

Gracias por tu feedback pronto estaremos liberando esta version como latest

leifermendez commented 1 year ago

https://codefile.io/f/URItugjAzDBvJKWhv9Fp

nelsonromerog commented 1 year ago

@leifermendez me causa un poco de duda el fallBack con 2 parámetros, entiendo el segundo , pero el primer parámetro cuando está en true que sucede al igual cuando está en false?

leifermendez commented 1 year ago

Finalmente creo que consiguió un estabilidad para la siguiente version (0.1.22) pueden usar esto https://codefile.io/f/0vyuaUfaAE6pXmLWYZvg o el que quiera lo puede usar instalando dev

leifermendez commented 1 year ago

Fase 1 Cerrada y arreglada en #645 0.1.23