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

[🐛] Concatenación flowDynamic #506

Closed devrlbusiness closed 1 year ago

devrlbusiness commented 1 year ago

¿Cual proveedor usaste?

bailey

¿Cual base de datos usaste?

memory

Conclusion de la prueba

muy buena

Describe tu caso

Error al concatenar

¿Logs Importantes?

No response

Información Adicional

const flowCotizarMarcaCHUBB = addKeyword(["CHUBB", "chubb", "chub", "cubb", "cub"])
  .addAnswer([
    "📄 Cotizando en CHUBB...",
    "",
    "🔎 Un momento, estamos obteniendo el listado de marcas en CHUBB...",
    ],
    null, 
    async (_,{flowDynamic}) => {      
    const marcas = await getAllMarcasCHUBB();

      marcasCHUBB = marcas.data.map((m, i) => { 
        return {
          id: m.ID[0],
          body : `${i + 1} ${m.DESC[0]}`,
        }
      });
      marcasCHUBB.forEach(mc => {
        flowDynamic([{body: mc.body}])
      }); 
    }
  )
  .addAnswer(
    "🚗 Seleccione marca del auto a cotizar, con el *número* correspondiente:",
    {
      capture: true,
      delay: 5000,
    }, 
    async (ctx, {flowDynamic}) => {  
      console.log('Marca seleccionada: ', marcasCHUBB[marcasCHUBB.findIndex((mc) => mc.body.split(' ')[0] === ctx.body)])
      if (ctx.body !== 'CHUBB') {
        const subMarcas = await getAllSubMarcasCHUBB(marcasCHUBB[marcasCHUBB.findIndex((mc) => mc.body.split(' ')[0] === ctx.body)].id);
        subMarcasCHUBB = subMarcas.data.map((m, i) => { 
          return {
            id: m.ID[0],
            body : `${i + 1} ${m.DESC[0]}`,
          }
        });
        flowDynamic([{body: `🔎 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...`}])
        subMarcasCHUBB.forEach(mc => {
          flowDynamic([{body: mc.body}])
        });
        console.log('subMarcasCHUBB', subMarcasCHUBB)        
      }
    }
  )
  .addAnswer(
    "🚗 Seleccione la sub marca del auto a cotizar, con el *número* correspondiente:",
    )//

¿Quieres que te mencionemos?

No response

leifermendez commented 1 year ago

Dejare esto para tenerlo como base de pruebas

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

const BaileysProvider = require('@bot-whatsapp/provider/baileys')
const MockAdapter = require('@bot-whatsapp/database/mock')
const delay = (ms) => new Promise((res) => setTimeout(res, ms))

/***
 * Simular peticion async http 0.5 segundos
 */
const fakeHTTP = async (fakeData = []) => {
    console.log('⚡ Server request!')
    await delay(1500)
    console.log('⚡ Server return!')
    const data = fakeData.map((u, i) => ({ body: `${i + 1} ${u}` }))
    console.log(data)
    return Promise.resolve(data)
}

const flujoPrincipal = addKeyword(['hola'])
    .addAnswer(
        '🤐 Bienvenido te envio muchas marcas (5510)',
        null,
        async (ctx, { flowDynamic }) => {
            console.log('execute...')
            const data = await fakeHTTP(['Ford', 'GM','BMW'])
            return flowDynamic(data)
        }
    )
    .addAnswer(
        '🙌 Seleccione marca del auto a cotizar, con el *número* correspondiente',
        null,
        async (ctx, { flowDynamic }) => {

            const data = await fakeHTTP(['Ranger', 'Explorer'])
            return flowDynamic(data)
        }
    )
    .addAnswer(
        '🚗 Seleccione la sub marca del auto a cotizar, con el *número* correspondiente:',
        null,
        async (ctx, { flowDynamic }) => {

            const data = await fakeHTTP(['Usado', 'Nuevos'])
            return flowDynamic(data)
        }
    )
    .addAnswer(
        '⚡ Los precios rondan:',
        null,
        async (ctx, { flowDynamic }) => {

            const data = await fakeHTTP(['1000', '2000','3000'])
            return flowDynamic(data)
        }
    )

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

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

main()
leifermendez commented 1 year ago

Image

leifermendez commented 1 year ago

Probar con esta version! npm install @bot-whatsapp/bot@0.0.73-alpha.0 @devrlbusiness

cheveguerra commented 1 year ago

Buenos días Leifer,

A mi me da el mismo error cuando uso flowDynamics, así que instale el bot:

npm create bot-whatsapp@latest (baileys-memory)

me cambié al directorio base, instalé y después corrí:

npm install @bot-whatsapp/bot@0.0.73-alpha.0 @devrlbusiness

Y funciona al parecer todo bien ... pero noté que si agrego un segundo addAnswer y trato de usar una variable del flowDynamic ahí, no la muestra, y en addAnswers's posteriores SI, te pongo aquí el ejemplo para que quede más claro:

let externa = ""

/***
 * Simular peticion async http 0.5 segundos
 */
const fakeHTTP = async (fakeData = []) => {
    console.log('⚡ Server request!')
    const data = "Este es un texto desde el servidor"
    return Promise.resolve(data)
}

const flowPrincipal = addKeyword(['hola', 'alo', 'ole'])
    .addAnswer('🙌 Ingresa un texto.',{capture:true},
        async (ctx, {flowDynamic})=> {
            console.log('Callback 1')
            const a = await fakeHTTP(ctx.body)
            flowDynamic([{body:a}])
            externa = ctx.body
            console.log("externa=",externa)
        }
    )
    .addAnswer("HOLA 1 : |" + externa + "|", {capture:true},  //Aqui trato de mostrar la variable "externa" y NO SE VE.
        (ctx, {flowDynamic}) => {
            console.log("callback 2")
            externa = ctx.body
            console.log("externa=" + externa)
            flowDynamic([{body:"HOLA 2 : |" + externa + "|"}]) //Aqui Si se ve
        }
    )
    .addAnswer("HOLA 3 : |" + externa + "|", {capture:true},  //Aqui Si se ve
    (ctx, {flowDynamic}) => {
        console.log("callback 3")
        externa = ctx.body
        console.log("externa=" + externa)
        flowDynamic([{body:"HOLA 4 : |" + externa + "|"}]) //Aqui Si se ve
    }
)

Saludos

devrlbusiness commented 1 year ago

Excelente trabajo @leifermendez quedo espectacular @cheveguerra dentro de los addAnswer no hagas asignaciones por que es inmutable lo que hagas dentro de esta función, lo que yo hice enviarme a una función fuera del addAnswer el texto guardarlo en una variable global y listo

leifermendez commented 1 year ago

@devrlbusiness por confirmar ya funcionó bien ?

leifermendez commented 1 year ago

FIX: #533