diff --git a/TODO.md b/TODO.md index 7178637fb..026d50239 100644 --- a/TODO.md +++ b/TODO.md @@ -11,9 +11,10 @@ - [X] sensitivy viene activado por defecto - [X] fallback respuesta en hijo: Se puede colocar en option el ref de la answer fallback - [X] Cuando Envian Sticket devuelve mensaje raro +- [ ] addAnswer agregar delay - [ ] colocar mensaje esperando conectando whatsapp (provider) - [ ] createDatabase validar implementacion de funciones -- [ ] limitar caracteres de mensajes +- [ ] limitar caracteres de mensajes 4000 - [X] cuando envias numeros (5 o 1) se dispara el flujo ### @bot-whatsapp/database diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index c5062bb01..f7726c8e1 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -1,5 +1,7 @@ const { toCtx } = require('../io/methods') const { printer } = require('../utils/interactive') +const { delay } = require('../utils/delay') +const Queue = require('../utils/queue') const { Console } = require('console') const { createWriteStream } = require('fs') @@ -140,10 +142,14 @@ class CoreClass { ]) } - sendFlow = (messageToSend, numberOrId) => { + sendFlow = async (messageToSend, numberOrId) => { const queue = [] for (const ctxMessage of messageToSend) { - queue.push(this.sendProviderAndSave(numberOrId, ctxMessage)) + const delayMs = ctxMessage?.options?.delay || 0 + if (delayMs) await delay(delayMs) + Queue.enqueue(() => + this.sendProviderAndSave(numberOrId, ctxMessage) + ) } return Promise.all(queue) } diff --git a/packages/bot/io/methods/addAnswer.js b/packages/bot/io/methods/addAnswer.js index 891a6a83a..d5b53e60a 100644 --- a/packages/bot/io/methods/addAnswer.js +++ b/packages/bot/io/methods/addAnswer.js @@ -3,7 +3,7 @@ const { toJson } = require('./toJson') /** * * @param answer string - * @param options {media:string, buttons:[{"body":"😎 Cursos"}], capture:true default false} + * @param options {media:string, buttons:[{"body":"😎 Cursos"}], delay:ms, capture:true default false} * @returns */ const addAnswer = @@ -24,6 +24,7 @@ const addAnswer = : false, child: typeof options?.child === 'string' ? `${options?.child}` : null, + delay: typeof options?.delay === 'number' ? options?.delay : 0, }) const getNested = () => ({ diff --git a/packages/bot/utils/delay.js b/packages/bot/utils/delay.js new file mode 100644 index 000000000..021fafe2f --- /dev/null +++ b/packages/bot/utils/delay.js @@ -0,0 +1,4 @@ +const delay = (miliseconds) => + new Promise((res) => setTimeout(res, miliseconds)) + +module.exports = { delay } diff --git a/packages/bot/utils/queue.js b/packages/bot/utils/queue.js new file mode 100644 index 000000000..1f610e9db --- /dev/null +++ b/packages/bot/utils/queue.js @@ -0,0 +1,46 @@ +class Queue { + static queue = [] + static pendingPromise = false + + static enqueue(promise) { + return new Promise((resolve, reject) => { + this.queue.push({ + promise, + resolve, + reject, + }) + this.dequeue() + }) + } + + static dequeue() { + if (this.workingOnPromise) { + return false + } + const item = this.queue.shift() + if (!item) { + return false + } + try { + this.workingOnPromise = true + item.promise() + .then((value) => { + this.workingOnPromise = false + item.resolve(value) + this.dequeue() + }) + .catch((err) => { + this.workingOnPromise = false + item.reject(err) + this.dequeue() + }) + } catch (err) { + this.workingOnPromise = false + item.reject(err) + this.dequeue() + } + return true + } +} + +module.exports = Queue