@bot-whatsapp/bot
Advanced tools
Comparing version 0.0.220-alpha.0 to 0.0.221-alpha.0
@@ -176,39 +176,42 @@ const { EventEmitter } = require('node:events') | ||
const endFlow = | ||
(flag) => | ||
async (message = null) => { | ||
flag.endFlow = true | ||
endFlowFlag = true | ||
if (message) this.sendProviderAndSave(from, createCtxMessage(message)) | ||
clearQueue() | ||
return | ||
} | ||
// 📄 Finalizar flujo | ||
const endFlowv2 = | ||
(flag) => | ||
async (messages = null, options = { fromGotoFlow: false, end: false }) => { | ||
flag.endFlow = true | ||
endFlowFlag = true | ||
async (messages = null, options = { fromGotoFlow: false, end: false }) => { | ||
flag.endFlow = true | ||
endFlowFlag = true | ||
await state.update({'__end_flow__':true}) | ||
if (typeof messages === 'string' || messages === null) { | ||
await this.sendProviderAndSave(from, createCtxMessage(messages)) | ||
clearQueue() | ||
return | ||
} | ||
if (typeof messages === 'string' || messages === null) { | ||
// await this.sendProviderAndSave(from, createCtxMessage(messages)) | ||
await this.sendProviderAndSave(from, createCtxMessage({ | ||
keyword: state.get('__finger__time__'), | ||
body: '__end_flow__' | ||
})) | ||
clearQueue() | ||
return | ||
} | ||
// Procesos de callback que se deben execute como exepciones | ||
if (Array.isArray(messages)) { | ||
for (const iteratorCtxMessage of messages) { | ||
const scopeCtx = await resolveCbEveryCtx(iteratorCtxMessage, { | ||
omitEndFlow: options.fromGotoFlow, | ||
idleCtx: !!iteratorCtxMessage?.options?.idle, | ||
triggerKey: iteratorCtxMessage.keyword.startsWith('key_'), | ||
}) | ||
// Procesos de callback que se deben execute como exepciones | ||
if (Array.isArray(messages)) { | ||
// console.log('options.fromGotoFlow', messages) | ||
if (scopeCtx?.endFlow) break | ||
// const indexLimit = messages.findIndex((m) => m.ref === inRef) | ||
for (const iteratorCtxMessage of messages) { | ||
// console.log(`Counter ${indexLimit}`) | ||
// if(indexLimit !== -1 && counterFor === indexLimit) break | ||
const scopeCtx = await resolveCbEveryCtx(iteratorCtxMessage, { | ||
omitEndFlow: options.fromGotoFlow, | ||
idleCtx: !!iteratorCtxMessage?.options?.idle, | ||
triggerKey: iteratorCtxMessage.keyword.startsWith('key_'), | ||
}) | ||
if (scopeCtx?.endFlow) break | ||
// options.fromGotoFlow = false | ||
} | ||
// options.fromGotoFlow = false | ||
} | ||
clearQueue() | ||
return | ||
} | ||
clearQueue() | ||
return | ||
} | ||
@@ -219,8 +222,4 @@ // 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx | ||
const currentPrev = await this.databaseClass.getPrevByNumber(from) | ||
const refIdByEndFlow = currentPrev?.answer === '__end_flow__' ? currentPrev?.ref : options.prev?.ref; | ||
if (options.prev?.options?.capture) { | ||
await cbEveryCtx(refIdByEndFlow) | ||
await cbEveryCtx(options.prev?.ref) | ||
} | ||
@@ -298,51 +297,51 @@ | ||
(flag) => | ||
async (message = null) => { | ||
this.queuePrincipal.clearQueue(from) | ||
flag.fallBack = true | ||
await this.sendProviderAndSave(from, { | ||
...prevMsg, | ||
answer: typeof message === 'string' ? message : message?.body ?? prevMsg.answer, | ||
options: { | ||
...prevMsg.options, | ||
buttons: prevMsg.options?.buttons, | ||
}, | ||
}) | ||
return | ||
} | ||
async (message = null) => { | ||
this.queuePrincipal.clearQueue(from) | ||
flag.fallBack = true | ||
await this.sendProviderAndSave(from, { | ||
...prevMsg, | ||
answer: typeof message === 'string' ? message : message?.body ?? prevMsg.answer, | ||
options: { | ||
...prevMsg.options, | ||
buttons: prevMsg.options?.buttons, | ||
}, | ||
}) | ||
return | ||
} | ||
const gotoFlow = | ||
(flag) => | ||
async (flowInstance, step = 0) => { | ||
const promises = [] | ||
flag.gotoFlow = true | ||
async (flowInstance, step = 0) => { | ||
const promises = [] | ||
flag.gotoFlow = true | ||
if (!flowInstance?.toJson) { | ||
printer([ | ||
`[POSSIBLE_CIRCULAR_DEPENDENCY]: Se ha detectado una dependencia circular.`, | ||
`Para evitar problemas, te recomendamos utilizar 'require'('./ruta_del_flow')`, | ||
`Ejemplo: gotoFlow(helloFlow) --> gotoFlow(require('./flows/helloFlow.js'))`, | ||
`[INFO]: https://bot-whatsapp.netlify.app/docs/goto-flow/`, | ||
]) | ||
return | ||
} | ||
if (!flowInstance?.toJson) { | ||
printer([ | ||
`[POSSIBLE_CIRCULAR_DEPENDENCY]: Se ha detectado una dependencia circular.`, | ||
`Para evitar problemas, te recomendamos utilizar 'require'('./ruta_del_flow')`, | ||
`Ejemplo: gotoFlow(helloFlow) --> gotoFlow(require('./flows/helloFlow.js'))`, | ||
`[INFO]: https://bot-whatsapp.netlify.app/docs/goto-flow/`, | ||
]) | ||
return | ||
} | ||
await delay(flowInstance?.ctx?.options?.delay ?? 0) | ||
await delay(flowInstance?.ctx?.options?.delay ?? 0) | ||
const flowTree = flowInstance.toJson() | ||
const flowTree = flowInstance.toJson() | ||
const flowParentId = flowTree[step] | ||
const flowParentId = flowTree[step] | ||
const parseListMsg = await this.flowClass.find(flowParentId?.ref, true, flowTree) | ||
const parseListMsg = await this.flowClass.find(flowParentId?.ref, true, flowTree) | ||
for (const msg of parseListMsg) { | ||
const msgParse = this.flowClass.findSerializeByRef(msg?.ref) | ||
for (const msg of parseListMsg) { | ||
const msgParse = this.flowClass.findSerializeByRef(msg?.ref) | ||
const ctxMessage = { ...msgParse, ...msg } | ||
await this.sendProviderAndSave(from, ctxMessage).then(() => promises.push(ctxMessage)) | ||
} | ||
await endFlow(flag)(promises, { fromGotoFlow: true, ...{ end: endFlowFlag } }) | ||
return | ||
const ctxMessage = { ...msgParse, ...msg } | ||
await this.sendProviderAndSave(from, ctxMessage).then(() => promises.push(ctxMessage)) | ||
} | ||
await endFlowv2(flag)(promises, { fromGotoFlow: true, ...{ end: endFlowFlag } }) | ||
return | ||
} | ||
// 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes | ||
@@ -353,38 +352,38 @@ // para evitar bloque de whatsapp | ||
(flag, inRef, privateOptions) => | ||
async (listMsg = [], options = { continue: true }) => { | ||
if (!options.hasOwnProperty('continue')) { | ||
options = { ...options, continue: true } | ||
} | ||
async (listMsg = [], options = { continue: true }) => { | ||
if (!options.hasOwnProperty('continue')) { | ||
options = { ...options, continue: true } | ||
} | ||
flag.flowDynamic = true | ||
flag.flowDynamic = true | ||
if (!Array.isArray(listMsg)) { | ||
listMsg = [{ body: listMsg, ...options }] | ||
} | ||
if (!Array.isArray(listMsg)) { | ||
listMsg = [{ body: listMsg, ...options }] | ||
} | ||
const parseListMsg = listMsg.map((opt, index) => createCtxMessage(opt, index)) | ||
const parseListMsg = listMsg.map((opt, index) => createCtxMessage(opt, index)) | ||
// Si endFlowFlag existe y no se omite la finalización del flujo, no hacer nada. | ||
if (endFlowFlag && !privateOptions?.omitEndFlow) { | ||
return | ||
} | ||
// Si endFlowFlag existe y no se omite la finalización del flujo, no hacer nada. | ||
if (endFlowFlag && !privateOptions?.omitEndFlow) { | ||
return | ||
} | ||
this.queuePrincipal.setFingerTime(from, inRef) // Debe decirle al sistema que finalizó el flujo aquí. | ||
this.queuePrincipal.setFingerTime(from, inRef) // Debe decirle al sistema que finalizó el flujo aquí. | ||
for (const msg of parseListMsg) { | ||
if (privateOptions?.idleCtx) { | ||
continue // Saltar al siguiente mensaje si se está en modo idleCtx. | ||
} | ||
const delayMs = msg?.options?.delay ?? this.generalArgs.delay ?? 0 | ||
await delay(delayMs) | ||
await this.sendProviderAndSave(from, msg) | ||
for (const msg of parseListMsg) { | ||
if (privateOptions?.idleCtx) { | ||
continue // Saltar al siguiente mensaje si se está en modo idleCtx. | ||
} | ||
if (options?.continue) { | ||
await continueFlow() | ||
return | ||
} | ||
const delayMs = msg?.options?.delay ?? this.generalArgs.delay ?? 0 | ||
await delay(delayMs) | ||
await this.sendProviderAndSave(from, msg) | ||
} | ||
if (options?.continue) { | ||
await continueFlow() | ||
return | ||
} | ||
return | ||
} | ||
@@ -401,5 +400,6 @@ // 📄 Se encarga de revisar si el contexto del mensaje tiene callback o idle | ||
} | ||
// const currentPrev = await this.databaseClass.getPrevByNumber(from) | ||
// if (currentPrev?.answer === '__end_flow__') return undefined | ||
// const endFlowState = state.getMyState() && state.get('__end_flow__') | ||
// if(endFlowState) return | ||
if (ctxMessage?.options?.idle) { | ||
@@ -499,4 +499,2 @@ const run = await cbEveryCtx(ctxMessage?.ref, { ...options, startIdleMs: ctxMessage?.options?.idle }) | ||
await state.update({ '__finger__time__': refToContinue?.ref }) | ||
// 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa | ||
@@ -569,3 +567,3 @@ if (!endFlowFlag && prevMsg?.options?.nested?.length) { | ||
const { answer } = ctxMessage | ||
if (answer && answer.length && answer !== '__call_action__' && answer !== '__goto_flow__' && answer !== '__end_flow__') { | ||
if (answer && answer.length && answer !== '__call_action__' && answer !== '__goto_flow__') { | ||
if (answer !== '__capture_only_intended__') { | ||
@@ -572,0 +570,0 @@ await this.providerClass.sendMessage(numberOrId, answer, ctxMessage) |
{ | ||
"name": "@bot-whatsapp/bot", | ||
"version": "0.0.220-alpha.0", | ||
"version": "0.0.221-alpha.0", | ||
"description": "", | ||
@@ -5,0 +5,0 @@ "main": "./lib/bundle.bot.cjs", |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
99612