codigoencasa / builderbot

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

[🐛] Bug un flujo no respeta delay si entró por medio de gotoFlow #877

Open KichanCrazy opened 1 year ago

KichanCrazy commented 1 year ago

¿Que versión estas usando?

v2

¿Sobre que afecta?

Flujo de palabras (Flow)

Describe tu problema

Cuando se entra a un flujo por medio de gotoFlow, se ignora la opción de delay que tiene un mensaje y se envía de inmediato.

Reproducir error

No response

Información Adicional

Ejemplo de codigo:

archivo20.js

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

const archivo21 = require("./archivo21");

module.exports = addKeyword("testarchivo20").addAnswer('entraste a archivo 20\n presiona 1 para ir archivo 21', 
{ capture: true }, async(ctx, { gotoFlow }) => {
    const answerMenu = ctx.body.trim().toString()
    switch (answerMenu.toString()) {
        case '1':
          return gotoFlow(archivo21)
          break
    }
})

archivo21.js

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

module.exports = addKeyword("testarchivo21")
.addAnswer("entraste a archivo 21, 5 segundos de delay",{ delay: 5000 })
.addAnswer("otros 5 segundos de delay", { delay: 5000 })

**Problema:

Si entras directamente al flujo del archivo21.js si se respeta el delay de cada addAnswer ( o en su caso si se usa la función delay() en el callback) pero cuando entras al flujo por medio del gotoflow que esta en el archivo20.js los mensajes no respetan el delay y se envían al instante uno tras otro.**

leifermendez commented 1 year ago

Solucionado next-release

Yenyil commented 1 year ago

Hola! he actualizado a la versión dev pero aun si presentando el problema

Yenyil commented 1 year ago

`const flowtest3 = addKeyword("test3") .addAction((_, { flowDynamic }) => { const msg = [ "Menu", "1️⃣ Test1", "2️⃣ Test2", "3️⃣ Test3", "", "Escribe el numero de la opcion", ]; return flowDynamic(msg.join("\n")); }) .addAnswer( "Seleccione una opción", { capture: true, delay: 1000 }, async (ctx, { fallBack, flowDynamic, endFlow }) => { if (!["1", "2", "3"].includes(ctx.body)) { console.log("Entro en la validación"); return fallBack("opcion no valida"); } console.log("Finaliza"); return endFlow; } );

const flowtest2 = addKeyword("test2") .addAction((, { flowDynamic }) => { return flowDynamic("2) Test2"); }) .addAction(async (, { gotoFlow }) => { / const { flowtest3 } = require("flowtest"); / await gotoFlow(flowtest3); });

const flowtest1 = addKeyword("test1") .addAction((, { flowDynamic }) => { return flowDynamic("1) Test1"); }) .addAction(async (, { gotoFlow }) => { await gotoFlow(flowtest3); }); Test1 Test2 `

leifermendez commented 1 year ago

`const flowtest3 = addKeyword("test3") .addAction((_, { flowDynamic }) => { const msg = [ "Menu", "1️⃣ Test1", "2️⃣ Test2", "3️⃣ Test3", "", "Escribe el numero de la opcion", ]; return flowDynamic(msg.join("\n")); }) .addAnswer( "Seleccione una opción", { capture: true, delay: 1000 }, async (ctx, { fallBack, flowDynamic, endFlow }) => { if (!["1", "2", "3"].includes(ctx.body)) { console.log("Entro en la validación"); return fallBack("opcion no valida"); } console.log("Finaliza"); return endFlow; } );

const flowtest2 = addKeyword("test2") .addAction((, { flowDynamic }) => { return flowDynamic("2) Test2"); }) .addAction(async (, { gotoFlow }) => { / const { flowtest3 } = require("flowtest"); / await gotoFlow(flowtest3); });

const flowtest1 = addKeyword("test1") .addAction((, { flowDynamic }) => { return flowDynamic("1) Test1"); }) .addAction(async (, { gotoFlow }) => { await gotoFlow(flowtest3); }); Test1 Test2 `

esto se encuentra en la version dev, debes de ejecutar este comando para poder tener la version adelantada

npm i @bot-whatsapp/bot@dev @bot-whatsapp/cli@dev @bot-whatsapp/database@dev @bot-whatsapp/provider@dev @bot-whatsapp/portal@dev
Yenyil commented 1 year ago

ya tengo "dev", aun asi sigue presente el problema

"@adiwajshing/baileys": "4.4.0", "@bot-whatsapp/bot": "^0.0.214-alpha.0", "@bot-whatsapp/cli": "^0.0.151-alpha.0", "@bot-whatsapp/database": "^0.0.128-alpha.0", "@bot-whatsapp/portal": "^0.0.86-alpha.0", "@bot-whatsapp/provider": "^0.0.153-alpha.0", "@whiskeysockets/baileys": "^6.5.0", "dotenv": "^16.0.3", "wa-sticker-formatter": "4.3.2"

leifermendez commented 1 year ago

Veo que tu problema radica es en el hecho de que no tienes declarado los flujos como procesos asincronos:

const flowtest3 = addKeyword("test3")
    .addAction(async (_, { flowDynamic }) => {
        const msg = [
            "Menu",
            "1️⃣ Test1",
            "2️⃣ Test2",
            "3️⃣ Test3",
            "",
            "Escribe el numero de la opcion",
        ];
        await flowDynamic(msg.join("\n"));
    })
    .addAnswer(
        "Seleccione una opción",
        { capture: true, delay: 1000 },
        async (ctx, { fallBack, flowDynamic, endFlow }) => {
            if (!["1", "2", "3"].includes(ctx.body)) {
                console.log("Entro en la validación");
                return fallBack("opcion no valida");
            }
            console.log("Finaliza");
            return endFlow;
        }
    );

const flowtest2 = addKeyword("test2")
    .addAction(async (_, { flowDynamic }) => {
        await flowDynamic("2) Test2");
    }).addAction(async (_, { gotoFlow }) => {
        /* const { flowtest3 } = require("flowtest"); */
        return gotoFlow(flowtest3);
    });

const flowtest1 = addKeyword("test1")
    .addAction(async (_, { flowDynamic }) => {
        await flowDynamic("1) Test1");
    })
    .addAction(async (_, { gotoFlow }) => {
        return gotoFlow(flowtest3);
    });

Estoy probando con ese codigo y funciona correcto! Te recomiendo usar eslint con el plugin diseñador para el bot y evitar que estas cosas te ocurran te comaparto mi package

{
    "name": "base-bailey-json",
    "version": "1.0.0",
    "description": "",
    "main": "app.js",
    "scripts": {
        "start": "npx eslint . --no-ignore && node app.js"
    },
    "keywords": [],
    "dependencies": {
        "@bot-whatsapp/bot": "latest",
        "@bot-whatsapp/cli": "latest",
        "@bot-whatsapp/database": "latest",
        "@bot-whatsapp/provider": "latest",
        "@bot-whatsapp/portal": "latest",
        "mime-types": "2.1.35",
        "@whiskeysockets/baileys": "6.5.0",
        "wa-sticker-formatter": "4.4.4",
        "cache-manager": "5.2.4"
    },
    "devDependencies": {
        "eslint-plugin-bot-whatsapp": "latest",
        "eslint": "^8.52.0"
    },
    "author": "",
    "license": "ISC"
}
Yenyil commented 1 year ago

He creado otro proyecto, instale la version dev, copie y peque el codigo que me has proporcionado realize pruebas y sigo recibiendo el mismo comportamiento. adjunto foto y mi codigo: TestBot1_new

App.json package.json

leifermendez commented 1 year ago

He creado otro proyecto, instale la version dev, copie y peque el codigo que me has proporcionado realize pruebas y sigo recibiendo el mismo comportamiento. adjunto foto y mi codigo: TestBot1_new

App.json package.json

Ya entiendo cual era tu detalle no lo entendí desde el inicio de esa manera, este issue no esta relacionado con eso. Lo revisaré, de igualmanera es facil de corregir si haces esto:

const flowtest3 = addKeyword("test3")
    .addAction(async (_, { flowDynamic }) => {
        const msg = [
            "Menu",
            "1️⃣ Test1",
            "2️⃣ Test2",
            "3️⃣ Test3",
            "",
            "Escribe el numero de la opcion",
        ];
        await flowDynamic(msg.join("\n"));
        await flowDynamic("Seleccione una opción")
    })
    .addAction(
        { capture: true },
        async (ctx, { fallBack, flowDynamic, endFlow }) => {

            if (!["1", "2", "3"].includes(ctx.body)) {
                console.log("Entro en la validación");
                return fallBack("opcion no valida");
            }
            console.log("Finaliza");
            return endFlow;
        }
    );
NRotili commented 2 months ago

Buen día, existe alguna novedad respecto a esta issue?

El problema aun persiste, al acceder a un flow desde un gotoFlow los delay no funcionan enviándose de inmediato uno detrás del otro sin esperar el tiempo correspondiente.