From 9f9d8339252d60ebd8852f516240b1d10a6c4266 Mon Sep 17 00:00:00 2001 From: Developer RL Business <66280283+devrlbusiness@users.noreply.github.com> Date: Tue, 17 Jan 2023 09:33:59 -0700 Subject: [PATCH 1/8] Update index.mdx --- packages/docs/src/routes/docs/flows/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 7a2171c..2e078d7 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -55,7 +55,7 @@ Esta funcion se utliza para responder un mensaje despues del `addKeyword()` - delay: 0 (milisegundos) - media: url de imagen - buttons: array `[{body:'Boton1'}, {body:'Boton2'}, {body:'Boton3'}]` -- capture: false (para esperar respuesta) +- capture: true (para esperar respuesta) - child: Objecto tipo flujo o arra de flujos hijos ```js From f6130cf0b91c552cf41254f1807640dcfa26dd32 Mon Sep 17 00:00:00 2001 From: Developer RL Business <66280283+devrlbusiness@users.noreply.github.com> Date: Tue, 17 Jan 2023 09:35:21 -0700 Subject: [PATCH 2/8] Update index.mdx --- packages/docs/src/routes/docs/flows/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 7a2171c..2e078d7 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -55,7 +55,7 @@ Esta funcion se utliza para responder un mensaje despues del `addKeyword()` - delay: 0 (milisegundos) - media: url de imagen - buttons: array `[{body:'Boton1'}, {body:'Boton2'}, {body:'Boton3'}]` -- capture: false (para esperar respuesta) +- capture: true (para esperar respuesta) - child: Objecto tipo flujo o arra de flujos hijos ```js From f5a7de3a003c012e2164e51fff26892cfc3144be Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 20 Jan 2023 11:58:50 +0100 Subject: [PATCH 3/8] fix(bot): :bug: flowDynamic stranger behaviour --- .gitignore | 1 + packages/bot/core/core.class.js | 25 ++++++------------------- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 1cc3038..9f6dbbc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /node_modules +/packages/repl /packages/*/starters /packages/*/node_modules /packages/*/dist diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index e3efc04..e1e16e4 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -89,14 +89,18 @@ class CoreClass { // 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx const sendFlow = async (messageToSend, numberOrId) => { + // [1 Paso] esto esta bien! + if (prevMsg?.options?.capture) await cbEveryCtx(prevMsg?.ref) + const queue = [] for (const ctxMessage of messageToSend) { const delayMs = ctxMessage?.options?.delay || 0 if (delayMs) await delay(delayMs) QueuePrincipal.enqueue(() => Promise.all([ - this.sendProviderAndSave(numberOrId, ctxMessage), - resolveCbEveryCtx(ctxMessage), + this.sendProviderAndSave(numberOrId, ctxMessage).then( + () => resolveCbEveryCtx(ctxMessage) + ), ]) ) } @@ -139,7 +143,6 @@ class CoreClass { // 📄 Se encarga de revisar si el contexto del mensaje tiene callback o fallback const resolveCbEveryCtx = async (ctxMessage) => { - if (prevMsg?.options?.capture) return cbEveryCtx(prevMsg?.ref) if (!ctxMessage?.options?.capture) return await cbEveryCtx(ctxMessage?.ref) } @@ -153,17 +156,6 @@ class CoreClass { }) } - if (prevMsg?.ref) resolveCbEveryCtx(prevMsg) - - // 📄 [options: callback]: Si se tiene un callback se ejecuta - //TODO AQUI - // if (!fallBackFlag) { - // if (prevMsg?.options?.capture) cbEveryCtx(prevMsg?.ref) - // for (const ite of this.flowClass.find(body)) { - // if (!ite?.options?.capture) cbEveryCtx(ite?.ref) - // } - // } - // 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa if (!fallBackFlag && prevMsg?.options?.nested?.length) { const nestedRef = prevMsg.options.nested @@ -173,11 +165,6 @@ class CoreClass { msgToSend = this.flowClass.find(body, false, flowStandalone) || [] - // //TODO AQUI - // for (const ite of msgToSend) { - // cbEveryCtx(ite?.ref) - // } - sendFlow(msgToSend, from) return } From 877252bd4a8a7bbbbf083c3ceaeaeb952b0a1828 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 20 Jan 2023 12:02:01 +0100 Subject: [PATCH 4/8] fix(bot): :bug: flowDynamic stranger behaviour --- packages/bot/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index d3f004e..fe542c1 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.66-alpha.0", + "version": "0.0.73-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { From 7067b4a80b7938ccfaf1ed141a37d645a1a3a062 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 09:09:16 +0100 Subject: [PATCH 5/8] fix(contexts): :bug: fixed #524 issue --- packages/bot/core/core.class.js | 19 +++++++++++++++++++ .../src/dialogflow-cx/dialogflow-cx.class.js | 2 +- .../src/dialogflow/dialogflow.class.js | 4 ++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index e1e16e4..ea5eff3 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -212,5 +212,24 @@ class CoreClass { this.continue(null, responde.ref) } } + + /** + * Funcion dedicada a enviar el mensaje sin pasar por el flow + * (dialogflow) + * @param {*} messageToSend + * @param {*} numberOrId + * @returns + */ + sendFlowSimple = async (messageToSend, numberOrId) => { + const queue = [] + for (const ctxMessage of messageToSend) { + const delayMs = ctxMessage?.options?.delay || 0 + if (delayMs) await delay(delayMs) + QueuePrincipal.enqueue(() => + this.sendProviderAndSave(numberOrId, ctxMessage) + ) + } + return Promise.all(queue) + } } module.exports = CoreClass diff --git a/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js b/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js index 25bd2a6..2d0ebd2 100644 --- a/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js +++ b/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js @@ -117,7 +117,7 @@ class DialogFlowCXContext extends CoreClass { } }) - this.sendFlow(listMessages, from) + this.sendFlowSimple(listMessages, from) } } diff --git a/packages/contexts/src/dialogflow/dialogflow.class.js b/packages/contexts/src/dialogflow/dialogflow.class.js index ebd92bc..6a7cda0 100644 --- a/packages/contexts/src/dialogflow/dialogflow.class.js +++ b/packages/contexts/src/dialogflow/dialogflow.class.js @@ -107,7 +107,7 @@ class DialogFlowContext extends CoreClass { ...customPayload, answer: fields?.answer?.stringValue, } - this.sendFlow([ctxFromDX], from) + this.sendFlowSimple([ctxFromDX], from) return } @@ -115,7 +115,7 @@ class DialogFlowContext extends CoreClass { answer: queryResult?.fulfillmentText, } - this.sendFlow([ctxFromDX], from) + this.sendFlowSimple([ctxFromDX], from) } } From 79cc31a96f6a9836447cc4e6bb1e1521c54183fe Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 09:14:36 +0100 Subject: [PATCH 6/8] fix(contexts): :bug: fixed #524 issue --- packages/bot/tests/flow.class.test.js | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 packages/bot/tests/flow.class.test.js diff --git a/packages/bot/tests/flow.class.test.js b/packages/bot/tests/flow.class.test.js new file mode 100644 index 0000000..b9c55e2 --- /dev/null +++ b/packages/bot/tests/flow.class.test.js @@ -0,0 +1,29 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const FlowClass = require('../io/flow.class') +const MockProvider = require('../../../__mocks__/mock.provider') +const { addKeyword } = require('../index') + +test(`[FlowClass] Probando instanciamiento de clase`, async () => { + const MOCK_FLOW = addKeyword('hola').addAnswer('Buenas!') + const flowClass = new FlowClass([MOCK_FLOW]) + assert.is(flowClass instanceof FlowClass, true) +}) + +test(`[FlowClass] Probando find`, async () => { + const MOCK_FLOW = addKeyword('hola').addAnswer('Buenas!') + const flowClass = new FlowClass([MOCK_FLOW]) + + flowClass.find('hola') + assert.is(flowClass instanceof FlowClass, true) +}) + +test(`[FlowClass] Probando findBySerialize`, async () => { + const MOCK_FLOW = addKeyword('hola').addAnswer('Buenas!') + const flowClass = new FlowClass([MOCK_FLOW]) + + flowClass.findBySerialize('') + assert.is(flowClass instanceof FlowClass, true) +}) + +test.run() From 3c4b1c0fc4b6d98d67c67806d918d3604bb2209b Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 11:52:49 +0100 Subject: [PATCH 7/8] feat(bot): :zap: flowDynamic buttons, media --- packages/bot/core/core.class.js | 13 ++++++++++--- packages/bot/io/methods/toCtx.js | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index ea5eff3..3f20b7b 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -117,6 +117,7 @@ class CoreClass { // 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes // para evitar bloque de whatsapp + const flowDynamic = async ( listMsg = [], optListMsg = { limit: 5, fallback: false } @@ -126,15 +127,21 @@ class CoreClass { fallBackFlag = optListMsg.fallback const parseListMsg = listMsg - .map(({ body }, index) => - toCtx({ + .map((opt, index) => { + const body = typeof opt === 'string' ? opt : opt.body + const media = opt?.media ?? null + const buttons = opt?.buttons ?? [] + + return toCtx({ body, from, keyword: null, index, + options: { media, buttons }, }) - ) + }) .slice(0, optListMsg.limit) + for (const msg of parseListMsg) { await this.sendProviderAndSave(from, msg) } diff --git a/packages/bot/io/methods/toCtx.js b/packages/bot/io/methods/toCtx.js index d29295e..980cbfb 100644 --- a/packages/bot/io/methods/toCtx.js +++ b/packages/bot/io/methods/toCtx.js @@ -5,12 +5,12 @@ const { generateRef, generateRefSerialize } = require('../../utils/hash') * @param options {media:string, buttons:[], capture:true default false} * @returns */ -const toCtx = ({ body, from, prevRef, index }) => { +const toCtx = ({ body, from, prevRef, options = {}, index }) => { return { ref: generateRef(), keyword: prevRef, answer: body, - options: {}, + options: options ?? {}, from, refSerialize: generateRefSerialize({ index, answer: body }), } From 7078dc4c93d01bf90ef08ecb34e89a1abbe16fd2 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 12:02:31 +0100 Subject: [PATCH 8/8] feat(bot): :zap: add blacklist --- packages/bot/core/core.class.js | 5 ++++- packages/bot/index.js | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 3f20b7b..30e6f4d 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -21,10 +21,12 @@ class CoreClass { flowClass databaseClass providerClass - constructor(_flow, _database, _provider) { + generalArgs = { blackList: [] } + constructor(_flow, _database, _provider, _args) { this.flowClass = _flow this.databaseClass = _database this.providerClass = _provider + this.generalArgs = { ...this.generalArgs, ..._args } for (const { event, func } of this.listenerBusEvents()) { this.providerClass.on(event, func) @@ -70,6 +72,7 @@ class CoreClass { const { body, from } = messageCtxInComming let msgToSend = [] let fallBackFlag = false + if (this.generalArgs.blackList.includes(from)) return if (!body) return if (!body.length) return diff --git a/packages/bot/index.js b/packages/bot/index.js index eb9df24..ac96063 100644 --- a/packages/bot/index.js +++ b/packages/bot/index.js @@ -8,8 +8,8 @@ const { addKeyword, addAnswer, addChild, toSerialize } = require('./io/methods') * @param {*} args * @returns */ -const createBot = async ({ flow, database, provider }) => - new CoreClass(flow, database, provider) +const createBot = async ({ flow, database, provider }, args = {}) => + new CoreClass(flow, database, provider, args) /** * Crear instancia de clase Io (Flow)