diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fcc11e4..0b0d8a7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,20 +34,45 @@ Se ejecuta el CLI (Command Line Interface) para ayudarte a crear un app-bot de e yarn run cli ``` -__Seguir instrucciones__ -En la consola encontraras los pasos a seguir +Selecionas (mediante las flechas arriba y abajo) el proveedor que quieras usar y cuando estes sobre el presiona la barra de espacio, igualmente selecciona la base de datos que quieras usar. -![](https://i.imgur.com/dC6lEwy.png) +Se creó un subdirecorio con el nombre del proveedor y base de datos que seleccionaste, ejemplo: `base-bailey-mysql` -__Observaciones__ -Se debe tener en cuenta que si queremos utilizar una base de datos de MySQL, como muestra el ejemplo, será necesario actualizar las credenciales o crear previamente un usuario y una BBDD para que la conexión se realice correctamente. -Las credenciales que usará la aplicación por defecto se encuentran en el fichero app.js y serán las siguientes: +Dentro de ese directorio necesitas editar el archivo package.json y borrar las siguientes lineas: ``` + "@bot-whatsapp/bot": "latest", + "@bot-whatsapp/cli": "latest", + "@bot-whatsapp/database": "latest", + "@bot-whatsapp/provider": "latest", +``` + +Cambiate al directorio creado ejemplo: `base-bailey-mysql` +``` +cd base-baileys-mysql +``` +Ejecuta los comandos: +``` +npm install +npm run pre-copy +npm start +``` +En el caso de MySql y Mongo es necesario especificar en app.js los datos de la conexión, ejemplo de MySql: +``` +const BaileysProvider = require('@bot-whatsapp/provider/baileys') +const MySQLAdapter = require('@bot-whatsapp/database/mysql') + +/** + * Declaramos las conexiones de MySQL + */ const MYSQL_DB_HOST = 'localhost' -const MYSQL_DB_USER = 'user' +const MYSQL_DB_USER = 'usr' const MYSQL_DB_PASSWORD = 'pass' const MYSQL_DB_NAME = 'bot' ``` + + +![](https://i.imgur.com/dC6lEwy.png) ### 🤔 Preguntas frecuentes - ¿Como puedo hacer aportaciones de código en el proyecto?: [Ver Video](https://youtu.be/Lxt8Acob6aU) diff --git a/GLOSSARY.md b/GLOSSARY.md index ec85e10..d054e6f 100644 --- a/GLOSSARY.md +++ b/GLOSSARY.md @@ -1,2 +1,2 @@ CTX: Es el objeto que representa un mensaje, con opciones, id, ref -messageInComming: Objeto entrante del provider {body, from,...} \ No newline at end of file +messageInComming: Objeto entrante del provider {body, from,to,...} \ No newline at end of file diff --git a/MIGRATION.md b/MIGRATION.md new file mode 100644 index 0000000..5b5086e --- /dev/null +++ b/MIGRATION.md @@ -0,0 +1,73 @@ +## MIGRANDO DE LA VERSIÓN 1 A LAS VERSIÓN 2 + +Pasar los flujos del bot de la versión 1 a la 2 es muy fácil, supongamos que en tu initial.json y response.json tienes un flujo como el siguiente: + +```js +//initial.json +[ + { + "keywords": [ + "hola", + "ola", + "alo" + ], + "key": "hola" + }, + { + "keywords": ["adios", "bye"], + "key": "adios" + } +] +``` +y + +```js +//response.json +{ + "hola":{ + "replyMessage":[ + "Gracias a ti! \n" + ], + "media":null, + "trigger":null + }, + "adios":{ + "replyMessage":[ + "Que te vaya bien!!" + ], + "media":null + } +} +``` +En la versión 2, no es necesario tener esos 2 archivos, los flujos se ponen directamente en app.js de la siguiente manera: + +```js +//app.js +/** + * Declarando flujos principales. + */ +const flowHola = addKeyword(['hola', 'ola', 'alo']) //Aqui van los "keywords" de initial.json + .addAnswer('Gracias a ti!') // Aquí va la respuesta del response.json, no es necesario especificar nuevamente los "keywords" + .addAnswer('Siempre un placer!!!') // Y se pueden agregar varias respuestas encadenadas ... TANTAS com sean necesarias. + +const flowAdios = addKeyword(['adios', 'bye']) //Aqui van los "keywords" de initial.json + .addAnswer('Que te vaya bien!!') // Aquí va la respuesta del response.json, no es necesario especificar nuevamente los "keywords" + .addAnswer('Hasta luego!', // Y se pueden agregar varias respuestas encadenadas ... TANTAS com sean necesarias. + null, null,[...addChild(flowHijo1)] // Y se pueden agregar flujos HIJOS (Sub Menus). Los flujos hijos se tienen que definir ANTES que los principales. + ) + + +##FALTAN EJEMPLOS DE ENVIOS DE IMAGENES! + + + const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowHola, flowAdios]) // Aqui se crean los flujos. + const adapterProvider = createProvider(BaileysProvider) + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} + ``` \ No newline at end of file diff --git a/package.json b/package.json index 8a8ebe0..92f2f3d 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "create-bot:rollup": "rollup --config ./packages/create-bot-whatsapp/rollup-create.config.js ", "bot:rollup": "rollup --config ./packages/bot/rollup-bot.config.js", "provider:rollup": "rollup --config ./packages/provider/rollup-provider.config.js ", + "contexts:rollup": "rollup --config ./packages/contexts/rollup-contexts.config.js", "database:rollup": "rollup --config ./packages/database/rollup-database.config.js", "create-bot-whatsapp:rollup": "rollup --config ./packages/create-bot-whatsapp/rollup-create.config.js", "format:check": "prettier --check ./packages", @@ -17,7 +18,7 @@ "fmt.staged": "pretty-quick --staged", "lint:check": "eslint ./packages", "lint:fix": "eslint --fix ./packages", - "build": "yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup && yarn run create-bot-whatsapp:rollup", + "build": "yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup && yarn run contexts:rollup && yarn run create-bot-whatsapp:rollup", "copy.lib": "node ./scripts/move.js", "test.unit": "node ./node_modules/uvu/bin.js packages test", "test.coverage": "node ./node_modules/c8/bin/c8.js npm run test.unit", @@ -37,6 +38,7 @@ "packages/cli", "packages/database", "packages/provider", + "packages/contexts", "packages/docs" ], "keywords": [ diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index e04bd13..e545a55 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -58,13 +58,13 @@ class CoreClass { ] /** - * - * @param {*} messageInComming + * GLOSSARY.md + * @param {*} messageCtxInComming * @returns */ - handleMsg = async (messageInComming) => { - logger.log(`[handleMsg]: `, messageInComming) - const { body, from } = messageInComming + handleMsg = async (messageCtxInComming) => { + logger.log(`[handleMsg]: `, messageCtxInComming) + const { body, from } = messageCtxInComming let msgToSend = [] let fallBackFlag = false @@ -92,12 +92,26 @@ class CoreClass { return refToContinue } + // 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo + const cbEveryCtx = (inRef) => { + const indexFlow = this.flowClass.findIndexByRef(inRef) + this.flowClass.allCallbacks[indexFlow].callback( + messageCtxInComming, + { + fallBack, + } + ) + } + // 📄 [options: callback]: Si se tiene un callback se ejecuta - if (!fallBackFlag && refToContinue && prevMsg?.options?.callback) { - const indexFlow = this.flowClass.findIndexByRef(refToContinue?.ref) - this.flowClass.allCallbacks[indexFlow].callback(messageInComming, { - fallBack, - }) + if (!fallBackFlag) { + if (refToContinue && prevMsg?.options?.callback) { + cbEveryCtx(refToContinue?.ref) + } else { + for (const ite of this.flowClass.find(body)) { + cbEveryCtx(ite?.ref) + } + } } // 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa diff --git a/packages/bot/io/methods/addAnswer.js b/packages/bot/io/methods/addAnswer.js index d5b53e6..a7db6d6 100644 --- a/packages/bot/io/methods/addAnswer.js +++ b/packages/bot/io/methods/addAnswer.js @@ -31,10 +31,7 @@ const addAnswer = nested: Array.isArray(nested) ? nested : [], }) - const callback = - typeof cb === 'function' - ? cb - : () => console.log('Callback no definida') + const callback = typeof cb === 'function' ? cb : () => null const lastCtx = inCtx.hasOwnProperty('ctx') ? inCtx.ctx : inCtx diff --git a/packages/bot/package.json b/packages/bot/package.json index 4079f55..b30e4b2 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.24-alpha.0", + "version": "0.0.25-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 6e76ff6..dbefef2 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.31-alpha.0", + "version": "0.0.32-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/contexts/package.json b/packages/contexts/package.json new file mode 100644 index 0000000..9d27195 --- /dev/null +++ b/packages/contexts/package.json @@ -0,0 +1,16 @@ +{ + "name": "@bot-whatsapp/contexts", + "version": "0.0.1", + "description": "", + "main": "./lib/bundle.contexts.cjs", + "files": [ + "./lib/" + ], + "exports": { + "./mock": "./lib/mock/index.cjs", + "./dialogflow": "./lib/dialogflow/index.cjs" + }, + "dependencies": { + "@bot-whatsapp/bot": "*" + } +} diff --git a/packages/contexts/rollup-contexts.config.js b/packages/contexts/rollup-contexts.config.js new file mode 100644 index 0000000..59a7624 --- /dev/null +++ b/packages/contexts/rollup-contexts.config.js @@ -0,0 +1,24 @@ +const banner = require('../../config/banner.rollup.json') +const commonjs = require('@rollup/plugin-commonjs') +const { join } = require('path') + +module.exports = [ + { + input: join(__dirname, 'src', 'mock', 'index.js'), + output: { + banner: banner['banner.output'].join(''), + file: join(__dirname, 'lib', 'mock', 'index.cjs'), + format: 'cjs', + }, + plugins: [commonjs()], + }, + { + input: join(__dirname, 'src', 'dialogflow', 'index.js'), + output: { + banner: banner['banner.output'].join(''), + file: join(__dirname, 'lib', 'dialogflow', 'index.cjs'), + format: 'cjs', + }, + plugins: [commonjs()], + }, +] diff --git a/packages/contexts/src/dialogflow/dialogflow.class.js b/packages/contexts/src/dialogflow/dialogflow.class.js new file mode 100644 index 0000000..db34e50 --- /dev/null +++ b/packages/contexts/src/dialogflow/dialogflow.class.js @@ -0,0 +1,113 @@ +const { CoreClass } = require('@bot-whatsapp/bot') +const dialogflow = require('@google-cloud/dialogflow') +const { existsSync, readFileSync } = require('fs') +const { join } = require('path') + +/** + * Necesita extender de core.class + * handleMsg(messageInComming) // const { body, from } = messageInComming + */ + +const GOOGLE_ACCOUNT_PATH = join(process.cwd(), 'google-key.json') + +class DialogFlowContext extends CoreClass { + projectId = null + configuration = null + sessionClient = null + optionsDX = { + language: 'es', + } + + constructor(_database, _provider, _optionsDX = {}) { + super(null, _database, _provider) + this.optionsDX = { ...this.optionsDX, ..._optionsDX } + this.init() + } + + /** + * Verificar conexión con servicio de DialogFlow + */ + init = () => { + if (!existsSync(GOOGLE_ACCOUNT_PATH)) { + console.log(`[ERROR]: No se encontro ${GOOGLE_ACCOUNT_PATH}`) + /** + * Emitir evento de error para que se mueste por consola dicinedo que no tiene el json + * */ + } + + const rawJson = readFileSync(GOOGLE_ACCOUNT_PATH, 'utf-8') + const { project_id, private_key, client_email } = JSON.parse(rawJson) + + this.projectId = project_id + this.configuration = { + credentials: { + private_key, + client_email, + }, + } + + this.sessionClient = new dialogflow.SessionsClient(this.configuration) + } + + /** + * GLOSSARY.md + * @param {*} messageCtxInComming + * @returns + */ + handleMsg = async (messageCtxInComming) => { + const languageCode = this.optionsDX.language + const { from, body } = messageCtxInComming + + let customPayload = {} + + /** + * 📄 Creamos session de contexto basado en el numero de la persona + * para evitar este problema. + * https://github.com/codigoencasa/bot-whatsapp/pull/140 + */ + const session = this.sessionClient.projectAgentSessionPath( + this.projectId, + from + ) + const reqDialog = { + session, + queryInput: { + text: { + text: body, + languageCode, + }, + }, + } + + const [single] = (await this.sessionClient.detectIntent(reqDialog)) || [ + null, + ] + + const { queryResult } = single + + const msgPayload = queryResult?.fulfillmentMessages?.find( + (a) => a.message === 'payload' + ) + + // Revisamos si el dialogFlow tiene multimedia + if (msgPayload && msgPayload?.payload) { + const { fields } = msgPayload.payload + const mapButtons = fields?.buttons?.listValue?.values.map((m) => { + return m?.structValue?.fields?.body?.stringValue + }) + customPayload = { + media: fields?.media?.stringValue, + buttons: mapButtons, + } + } + + const ctxFromDX = { + ...customPayload, + answer: queryResult?.fulfillmentText, + } + + this.sendFlow([ctxFromDX], from) + } +} + +module.exports = DialogFlowContext diff --git a/packages/contexts/src/dialogflow/index.js b/packages/contexts/src/dialogflow/index.js new file mode 100644 index 0000000..e988f50 --- /dev/null +++ b/packages/contexts/src/dialogflow/index.js @@ -0,0 +1,14 @@ +const DialogFlowClass = require('./dialogflow.class') + +/** + * Crear instancia de clase Bot + * @param {*} args + * @returns + */ +const createBotDialog = async ({ database, provider }) => + new DialogFlowClass(database, provider) + +module.exports = { + createBotDialog, + DialogFlowClass, +} diff --git a/packages/contexts/src/mock/index.js b/packages/contexts/src/mock/index.js new file mode 100644 index 0000000..b609be5 --- /dev/null +++ b/packages/contexts/src/mock/index.js @@ -0,0 +1,14 @@ +const MockClass = require('./mock.class') + +/** + * Crear instancia de clase Bot + * @param {*} args + * @returns + */ +const createBotMock = async ({ database, provider }) => + new MockClass(database, provider) + +module.exports = { + createBotMock, + MockClass, +} diff --git a/packages/contexts/src/mock/mock.class.js b/packages/contexts/src/mock/mock.class.js new file mode 100644 index 0000000..6e5c9d2 --- /dev/null +++ b/packages/contexts/src/mock/mock.class.js @@ -0,0 +1,24 @@ +const { CoreClass } = require('@bot-whatsapp/bot') +/** + * Necesita extender de core.class + * handleMsg(messageInComming) // const { body, from } = messageInComming + */ + +class MockContext extends CoreClass { + constructor(_database, _provider) { + super(null, _database, _provider) + } + + init = () => {} + + /** + * GLOSSARY.md + * @param {*} messageCtxInComming + * @returns + */ + handleMsg = async () => { + console.log('DEBUG:') + } +} + +module.exports = MockContext diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 7cfa3ea..3e1f16a 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.42-alpha.0", + "version": "0.0.43-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index cfe467d..f6a4660 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.23-alpha.0", + "version": "0.0.24-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index e59f80d..afad440 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.29-alpha.0", + "version": "0.0.30-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index 3855043..3e5c446 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -1,7 +1,9 @@ const { ProviderClass } = require('@bot-whatsapp/bot') const pino = require('pino') const mime = require('mime-types') -const fs = require('fs') +const { existsSync, createWriteStream } = require('fs') +const { Console } = require('console') + const { default: makeWASocket, useMultiFileAuthState, @@ -12,6 +14,10 @@ const { baileyIsValidNumber, } = require('./utils') +const logger = new Console({ + stdout: createWriteStream(`${process.cwd()}/baileys.log`), +}) + /** * ⚙️ BaileysProvider: Es una clase tipo adaptor * que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas) @@ -27,7 +33,7 @@ class BaileysProvider extends ProviderClass { /** * Iniciar todo Bailey */ - async initBailey() { + initBailey = async () => { const { state, saveCreds } = await useMultiFileAuthState('sessions') try { @@ -49,7 +55,14 @@ class BaileysProvider extends ProviderClass { } ) } catch (e) { - this.emit('error', e) + logger.log(e) + this.emit('auth_failure', [ + `Algo inesperado ha ocurrido NO entres en pánico`, + `Reinicia el BOT`, + `Tambien puedes mirar un log que se ha creado baileys.log`, + `Necesitas ayuda: https://link.codigoencasa.com/DISCORD`, + `(Puedes abrir un ISSUE) https://github.com/codigoencasa/bot-whatsapp/issues/new/choose`, + ]) } } @@ -87,7 +100,8 @@ class BaileysProvider extends ProviderClass { }, { event: 'messages.upsert', - func: ({ messages }) => { + func: ({ messages, type }) => { + if (type !== 'notify') return const [messageCtx] = messages let payload = { ...messageCtx, @@ -122,9 +136,10 @@ class BaileysProvider extends ProviderClass { * @example await sendMessage('+XXXXXXXXXXX', 'https://dominio.com/imagen.jpg' | 'img/imagen.jpg') */ - sendMedia = async (number, imageUrl) => { + sendMedia = async (number, imageUrl, text) => { await this.vendor.sendMessage(number, { image: { url: imageUrl }, + text, }) } @@ -153,21 +168,6 @@ class BaileysProvider extends ProviderClass { sendText = async (number, message) => { return this.vendor.sendMessage(number, { text: message }) } - /** - * TODO: Necesita terminar de implementar el sendMedia y sendButton guiarse: - * https://github.com/leifermendez/bot-whatsapp/blob/4e0fcbd8347f8a430adb43351b5415098a5d10df/packages/provider/src/web-whatsapp/index.js#L165 - * @param {string} number - * @param {string} message - * @example await sendMessage('+XXXXXXXXXXX', 'Hello World') - */ - sendMessage = async (numberIn, message, { options }) => { - const number = baileyCleanNumber(numberIn) - - // if (options?.buttons?.length) - // return this.sendButtons(number, message, options.buttons) - if (options?.media) return this.sendMedia(number, options.media) - return this.sendText(number, message) - } /** * @@ -177,7 +177,7 @@ class BaileysProvider extends ProviderClass { */ sendFile = async (number, filePath) => { - if (fs.existsSync(filePath)) { + if (existsSync(filePath)) { const mimeType = mime.lookup(filePath) const numberClean = number.replace('+', '') const fileName = filePath.split('/').pop() @@ -211,6 +211,23 @@ class BaileysProvider extends ProviderClass { await this.vendor.sendMessage(`${numberClean}@c.us`, buttonMessage) } + + /** + * TODO: Necesita terminar de implementar el sendMedia y sendButton guiarse: + * https://github.com/leifermendez/bot-whatsapp/blob/4e0fcbd8347f8a430adb43351b5415098a5d10df/packages/provider/src/web-whatsapp/index.js#L165 + * @param {string} number + * @param {string} message + * @example await sendMessage('+XXXXXXXXXXX', 'Hello World') + */ + sendMessage = async (numberIn, message, { options }) => { + const number = baileyCleanNumber(numberIn) + + // if (options?.buttons?.length) + // return this.sendButtons(number, message, options.buttons) + if (options?.media) + return this.sendMedia(number, options.media, message) + return this.sendText(number, message) + } } module.exports = BaileysProvider diff --git a/packages/provider/src/venom/index.js b/packages/provider/src/venom/index.js index 1aafd80..645e809 100644 --- a/packages/provider/src/venom/index.js +++ b/packages/provider/src/venom/index.js @@ -1,11 +1,19 @@ const { ProviderClass } = require('@bot-whatsapp/bot') const venom = require('venom-bot') +const { createWriteStream } = require('fs') +const { Console } = require('console') + const { venomCleanNumber, venomGenerateImage, venomisValidNumber, + venomDownloadMedia, } = require('./utils') +const logger = new Console({ + stdout: createWriteStream(`${process.cwd()}/venom.log`), +}) + /** * ⚙️ VenomProvider: Es una clase tipo adaptor * que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas) @@ -34,13 +42,13 @@ class VenomProvider extends ProviderClass { ) this.vendor = client } catch (e) { + logger.log(e) this.emit('auth_failure', { instructions: [ `Ocurrio un error con la inicializacion de venom`, - `Necesitas ayuda: https://link.codigoencasa.com/DISCORD`, - `(Puedes abrir un ISSUE) https://github.com/leifermendez/bot-whatsapp/issues/new/choose`, - ``, - `${e?.message}`, + `Reinicia el BOT`, + `Tambien puedes mirar un log que se ha creado venom.log`, + `(Puedes abrir un ISSUE) https://github.com/codigoencasa/bot-whatsapp/issues/new/choose`, ], }) } @@ -97,6 +105,19 @@ class VenomProvider extends ProviderClass { } } + /** + * Enviar imagen o multimedia + * @param {*} number + * @param {*} mediaInput + * @param {*} message + * @returns + */ + sendMedia = async (number, mediaInput, message) => { + if (!mediaInput) throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`) + const fileDownloaded = await venomDownloadMedia(mediaInput) + return this.vendor.sendImage(number, fileDownloaded, '.', message) + } + /** * Enviar mensaje al usuario * @param {*} userId @@ -108,7 +129,8 @@ class VenomProvider extends ProviderClass { const number = venomCleanNumber(userId) if (options?.buttons?.length) return this.sendButtons(number, message, options.buttons) - if (options?.media) return this.sendMedia(number, options.media) + if (options?.media) + return this.sendMedia(number, options.media, message) return this.vendor.sendText(number, message) } } diff --git a/packages/provider/src/venom/utils.js b/packages/provider/src/venom/utils.js index ff1d733..cf1dc5f 100644 --- a/packages/provider/src/venom/utils.js +++ b/packages/provider/src/venom/utils.js @@ -1,4 +1,7 @@ -const { writeFile } = require('fs') +const { writeFile, createWriteStream } = require('fs') +const { tmpdir } = require('os') +const http = require('http') +const https = require('https') const combineImage = require('combine-image') const venomCleanNumber = (number, full = false) => { @@ -35,9 +38,43 @@ const venomGenerateImage = async (base) => { cleanImage.write(PATH_QR) } +/** + * Incompleta + * Descargar archivo multimedia para enviar + * @param {*} url + * @returns + */ +const venomDownloadMedia = (url) => { + return new Promise((resolve, reject) => { + const ext = url.split('.').pop() + const checkProtocol = url.includes('https:') + const handleHttp = checkProtocol ? https : http + const name = `tmp-${Date.now()}.${ext}` + const fullPath = `${tmpdir()}/${name}` + const file = createWriteStream(fullPath) + handleHttp.get(url, function (response) { + response.pipe(file) + file.on('finish', function () { + file.close() + resolve(fullPath) + }) + file.on('error', function () { + console.log('errro') + file.close() + reject(null) + }) + }) + }) +} + const venomisValidNumber = (rawNumber) => { const regexGroup = /\@g.us\b/gm const exist = rawNumber.match(regexGroup) return !exist } -module.exports = { venomCleanNumber, venomGenerateImage, venomisValidNumber } +module.exports = { + venomCleanNumber, + venomGenerateImage, + venomisValidNumber, + venomDownloadMedia, +} diff --git a/scripts/move.js b/scripts/move.js index d92d233..078581a 100644 --- a/scripts/move.js +++ b/scripts/move.js @@ -15,4 +15,5 @@ Promise.all([ copyLibPkg('bot', appDir), copyLibPkg('database', appDir), copyLibPkg('provider', appDir), + copyLibPkg('contexts', appDir), ]).then(() => console.log('Todas las librerías copiadas')) diff --git a/starters/apps/base-bailey-memory/README.md b/starters/apps/base-bailey-memory/README.md index 4d1d6b2..d0e43d2 100644 --- a/starters/apps/base-bailey-memory/README.md +++ b/starters/apps/base-bailey-memory/README.md @@ -1,14 +1,24 @@ ### CHATBOT Whatsapp -Este bot es una aplicación que puedes vincular con tu whatsapp crear flujos para automatizar tareas en tu negocio o procesos repetitivos +Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. +Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: - Bienvenido a mi tienda -- Como puedo ayudarte? -- Tengo: Zapatos Bolsos etc.. +- ¿Como puedo ayudarte? +- Tengo: Zapatos, Bolsos etc.. __Iniciar__ +Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: + + Menu Principal + - SubMenu 1 + - Submenu 1.1 + - Submenu 2 + - Submenu 2.1 + +Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + ``` npm install npm start diff --git a/starters/apps/base-bailey-memory/app.js b/starters/apps/base-bailey-memory/app.js index 0a1863b..624f70f 100644 --- a/starters/apps/base-bailey-memory/app.js +++ b/starters/apps/base-bailey-memory/app.js @@ -10,7 +10,15 @@ const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MockAdapter = require('@bot-whatsapp/database/mock') /** - * Declarando flujo hijo + * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: + * + * Menu Principal + * - SubMenu 1 + * - Submenu 1.1 + * - Submenu 2 + * - Submenu 2.1 + * + * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ const flowBolsos2 = addKeyword(['bolsos2', '2']) @@ -21,11 +29,11 @@ const flowZapatos2 = addKeyword(['zapatos2', '2']) .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') -const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) +const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'], + ['Manda:', '*(2) Zapatos2*', 'para mas información'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -35,11 +43,11 @@ const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) [...addChild(flowZapatos2)] ) -const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) +const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'], + ['Manda:', '*(2) Bolsos2*', 'para mas información.'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -52,12 +60,12 @@ const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) /** * Declarando flujo principal */ + const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer('Hola, bienvenido a mi tienda') - .addAnswer('Como puedo ayudarte?') - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..']) + .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) + .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) .addAnswer( - ['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'], + ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') diff --git a/starters/apps/base-bailey-mongo/README.md b/starters/apps/base-bailey-mongo/README.md index d5a4d67..a22e43b 100644 --- a/starters/apps/base-bailey-mongo/README.md +++ b/starters/apps/base-bailey-mongo/README.md @@ -1,14 +1,15 @@ ### CHATBOT Whatsapp -Este bot es una aplicación que puedes vincular con tu whatsapp crear flujos para automatizar tareas en tu negocio o procesos repetitivos +Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. +Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: - Bienvenido a mi tienda -- Como puedo ayudarte? -- Tengo: Zapatos Bolsos etc.. +- ¿Como puedo ayudarte? +- Tengo: Zapatos, Bolsos etc.. __Iniciar__ -Recuerda configurar los parametros de conexion de la base de datos + +Recuerda configurar los parametros de conexión de la base de datos: ```js // app.js @@ -16,6 +17,16 @@ const MONGO_DB_URI = 'mongodb://0.0.0.0:27017' const MONGO_DB_NAME = 'db_bot' ``` + Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: + + Menu Principal + - SubMenu 1 + - Submenu 1.1 + - Submenu 2 + - Submenu 2.1 + + Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + ``` npm install npm start diff --git a/starters/apps/base-bailey-mongo/app.js b/starters/apps/base-bailey-mongo/app.js index cc469c2..f71a425 100644 --- a/starters/apps/base-bailey-mongo/app.js +++ b/starters/apps/base-bailey-mongo/app.js @@ -12,12 +12,22 @@ const MongoAdapter = require('@bot-whatsapp/database/mongo') /** * Declaramos las conexiones de Mongo */ + const MONGO_DB_URI = 'mongodb://0.0.0.0:27017' const MONGO_DB_NAME = 'db_bot' /** - * Declarando flujo hijo + * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: + * + * Menu Principal + * - SubMenu 1 + * - Submenu 1.1 + * - Submenu 2 + * - Submenu 2.1 + * + * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ + const flowBolsos2 = addKeyword(['bolsos2', '2']) .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') @@ -26,11 +36,11 @@ const flowZapatos2 = addKeyword(['zapatos2', '2']) .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') -const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) +const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'], + ['Manda:', '*(2) Zapatos2*', 'para mas información'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -40,11 +50,11 @@ const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) [...addChild(flowZapatos2)] ) -const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) +const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'], + ['Manda:', '*(2) Bolsos2*', 'para mas información.'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -57,12 +67,12 @@ const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) /** * Declarando flujo principal */ + const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer('Hola, bienvenido a mi tienda') - .addAnswer('Como puedo ayudarte?') - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..']) + .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) + .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) .addAnswer( - ['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'], + ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') diff --git a/starters/apps/base-bailey-mysql/README.md b/starters/apps/base-bailey-mysql/README.md index fbad3da..4a1cab2 100644 --- a/starters/apps/base-bailey-mysql/README.md +++ b/starters/apps/base-bailey-mysql/README.md @@ -1,14 +1,15 @@ ### CHATBOT Whatsapp -Este bot es una aplicación que puedes vincular con tu whatsapp crear flujos para automatizar tareas en tu negocio o procesos repetitivos +Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. +Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: - Bienvenido a mi tienda -- Como puedo ayudarte? -- Tengo: Zapatos Bolsos etc.. +- ¿Como puedo ayudarte? +- Tengo: Zapatos, Bolsos etc.. __Iniciar__ -Recuerda configurar los parametros de conexion de la base de datos + +Recuerda configurar los parametros de conexión de la base de datos ```js // app.js @@ -17,6 +18,16 @@ const MYSQL_DB_USER = 'user' const MYSQL_DB_PASSWORD = 'pass' const MYSQL_DB_NAME = 'bot' ``` +Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: + + Menu Principal + - SubMenu 1 + - Submenu 1.1 + - Submenu 2 + - Submenu 2.1 + +Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + ``` npm install diff --git a/starters/apps/base-bailey-mysql/app.js b/starters/apps/base-bailey-mysql/app.js index 1211654..88e1e11 100644 --- a/starters/apps/base-bailey-mysql/app.js +++ b/starters/apps/base-bailey-mysql/app.js @@ -13,12 +13,20 @@ const MySQLAdapter = require('@bot-whatsapp/database/mysql') * Declaramos las conexiones de MySQL */ const MYSQL_DB_HOST = 'localhost' -const MYSQL_DB_USER = 'user' +const MYSQL_DB_USER = 'usr' const MYSQL_DB_PASSWORD = 'pass' const MYSQL_DB_NAME = 'bot' /** - * Declarando flujo hijo + * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: + * + * Menu Principal + * - SubMenu 1 + * - Submenu 1.1 + * - Submenu 2 + * - Submenu 2.1 + * + * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ const flowBolsos2 = addKeyword(['bolsos2', '2']) @@ -29,11 +37,11 @@ const flowZapatos2 = addKeyword(['zapatos2', '2']) .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') -const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) +const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'], + ['Manda:', '*(2) Zapatos2*', 'para mas información'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -43,11 +51,11 @@ const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) [...addChild(flowZapatos2)] ) -const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) +const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'], + ['Manda:', '*(2) Bolsos2*', 'para mas información.'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -60,12 +68,12 @@ const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) /** * Declarando flujo principal */ + const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer('Hola, bienvenido a mi tienda') - .addAnswer('Como puedo ayudarte?') - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..']) + .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) + .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) .addAnswer( - ['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'], + ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') diff --git a/starters/apps/base-meta-memory/README.md b/starters/apps/base-meta-memory/README.md index 4d1d6b2..d0e43d2 100644 --- a/starters/apps/base-meta-memory/README.md +++ b/starters/apps/base-meta-memory/README.md @@ -1,14 +1,24 @@ ### CHATBOT Whatsapp -Este bot es una aplicación que puedes vincular con tu whatsapp crear flujos para automatizar tareas en tu negocio o procesos repetitivos +Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. +Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: - Bienvenido a mi tienda -- Como puedo ayudarte? -- Tengo: Zapatos Bolsos etc.. +- ¿Como puedo ayudarte? +- Tengo: Zapatos, Bolsos etc.. __Iniciar__ +Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: + + Menu Principal + - SubMenu 1 + - Submenu 1.1 + - Submenu 2 + - Submenu 2.1 + +Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + ``` npm install npm start diff --git a/starters/apps/base-meta-memory/app.js b/starters/apps/base-meta-memory/app.js index 6f932f0..ab26888 100644 --- a/starters/apps/base-meta-memory/app.js +++ b/starters/apps/base-meta-memory/app.js @@ -10,7 +10,15 @@ const TwilioProvider = require('@bot-whatsapp/provider/twilio') const MockAdapter = require('@bot-whatsapp/database/mock') /** - * Declarando flujo hijo + * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: + * + * Menu Principal + * - SubMenu 1 + * - Submenu 1.1 + * - Submenu 2 + * - Submenu 2.1 + * + * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ const flowBolsos2 = addKeyword(['bolsos2', '2']) @@ -21,11 +29,11 @@ const flowZapatos2 = addKeyword(['zapatos2', '2']) .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') -const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) +const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'], + ['Manda:', '*(2) Zapatos2*', 'para mas información'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -35,11 +43,11 @@ const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) [...addChild(flowZapatos2)] ) -const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) +const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'], + ['Manda:', '*(2) Bolsos2*', 'para mas información.'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -52,18 +60,17 @@ const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) /** * Declarando flujo principal */ + const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer('Hola, bienvenido a mi tienda') - .addAnswer('Como puedo ayudarte?') - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..']) + .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) + .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) .addAnswer( - ['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'], + ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') console.log('Puedes enviar un mail, hook, etc..') console.log(ctx) - console.log(ctx['_data']['notifyName']) }, [...addChild(flowBolsos), ...addChild(flowZapatos)] ) diff --git a/starters/apps/base-twilio-memory/README.md b/starters/apps/base-twilio-memory/README.md index 4d1d6b2..d0e43d2 100644 --- a/starters/apps/base-twilio-memory/README.md +++ b/starters/apps/base-twilio-memory/README.md @@ -1,14 +1,24 @@ ### CHATBOT Whatsapp -Este bot es una aplicación que puedes vincular con tu whatsapp crear flujos para automatizar tareas en tu negocio o procesos repetitivos +Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. +Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: - Bienvenido a mi tienda -- Como puedo ayudarte? -- Tengo: Zapatos Bolsos etc.. +- ¿Como puedo ayudarte? +- Tengo: Zapatos, Bolsos etc.. __Iniciar__ +Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: + + Menu Principal + - SubMenu 1 + - Submenu 1.1 + - Submenu 2 + - Submenu 2.1 + +Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + ``` npm install npm start diff --git a/starters/apps/base-twilio-memory/app.js b/starters/apps/base-twilio-memory/app.js index a0f1573..ab26888 100644 --- a/starters/apps/base-twilio-memory/app.js +++ b/starters/apps/base-twilio-memory/app.js @@ -10,7 +10,15 @@ const TwilioProvider = require('@bot-whatsapp/provider/twilio') const MockAdapter = require('@bot-whatsapp/database/mock') /** - * Declarando flujo hijo + * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: + * + * Menu Principal + * - SubMenu 1 + * - Submenu 1.1 + * - Submenu 2 + * - Submenu 2.1 + * + * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ const flowBolsos2 = addKeyword(['bolsos2', '2']) @@ -21,11 +29,11 @@ const flowZapatos2 = addKeyword(['zapatos2', '2']) .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') -const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) +const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'], + ['Manda:', '*(2) Zapatos2*', 'para mas información'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -35,11 +43,11 @@ const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) [...addChild(flowZapatos2)] ) -const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) +const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'], + ['Manda:', '*(2) Bolsos2*', 'para mas información.'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -52,12 +60,12 @@ const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) /** * Declarando flujo principal */ + const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer('Hola, bienvenido a mi tienda') - .addAnswer('Como puedo ayudarte?') - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..']) + .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) + .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) .addAnswer( - ['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'], + ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') diff --git a/starters/apps/base-twilio-mongo/README.md b/starters/apps/base-twilio-mongo/README.md index d5a4d67..0791742 100644 --- a/starters/apps/base-twilio-mongo/README.md +++ b/starters/apps/base-twilio-mongo/README.md @@ -1,13 +1,14 @@ ### CHATBOT Whatsapp -Este bot es una aplicación que puedes vincular con tu whatsapp crear flujos para automatizar tareas en tu negocio o procesos repetitivos +Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. +Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: - Bienvenido a mi tienda -- Como puedo ayudarte? -- Tengo: Zapatos Bolsos etc.. +- ¿Como puedo ayudarte? +- Tengo: Zapatos, Bolsos etc.. __Iniciar__ + Recuerda configurar los parametros de conexion de la base de datos ```js // app.js @@ -16,6 +17,16 @@ const MONGO_DB_URI = 'mongodb://0.0.0.0:27017' const MONGO_DB_NAME = 'db_bot' ``` + Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: + + Menu Principal + - SubMenu 1 + - Submenu 1.1 + - Submenu 2 + - Submenu 2.1 + + Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + ``` npm install npm start diff --git a/starters/apps/base-twilio-mongo/app.js b/starters/apps/base-twilio-mongo/app.js index 71024e1..f1e735c 100644 --- a/starters/apps/base-twilio-mongo/app.js +++ b/starters/apps/base-twilio-mongo/app.js @@ -12,11 +12,20 @@ const MongoAdapter = require('@bot-whatsapp/database/mongo') /** * Declaramos las conexiones de Mongo */ + const MONGO_DB_URI = 'mongodb://0.0.0.0:27017' const MONGO_DB_NAME = 'db_bot' /** - * Declarando flujo hijo + * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: + * + * Menu Principal + * - SubMenu 1 + * - Submenu 1.1 + * - Submenu 2 + * - Submenu 2.1 + * + * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ const flowBolsos2 = addKeyword(['bolsos2', '2']) @@ -27,11 +36,11 @@ const flowZapatos2 = addKeyword(['zapatos2', '2']) .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') -const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) +const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'], + ['Manda:', '*(2) Zapatos2*', 'para mas información'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -41,11 +50,11 @@ const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) [...addChild(flowZapatos2)] ) -const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) +const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'], + ['Manda:', '*(2) Bolsos2*', 'para mas información.'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -58,12 +67,12 @@ const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) /** * Declarando flujo principal */ + const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer('Hola, bienvenido a mi tienda') - .addAnswer('Como puedo ayudarte?') - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..']) + .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) + .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) .addAnswer( - ['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'], + ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') diff --git a/starters/apps/base-twilio-mysql/README.md b/starters/apps/base-twilio-mysql/README.md index fbad3da..ad304ee 100644 --- a/starters/apps/base-twilio-mysql/README.md +++ b/starters/apps/base-twilio-mysql/README.md @@ -1,14 +1,15 @@ ### CHATBOT Whatsapp -Este bot es una aplicación que puedes vincular con tu whatsapp crear flujos para automatizar tareas en tu negocio o procesos repetitivos +Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. +Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: - Bienvenido a mi tienda -- Como puedo ayudarte? -- Tengo: Zapatos Bolsos etc.. +- ¿Como puedo ayudarte? +- Tengo: Zapatos, Bolsos etc.. __Iniciar__ -Recuerda configurar los parametros de conexion de la base de datos + +Recuerda configurar los parametros de conexión de la base de datos ```js // app.js @@ -17,6 +18,15 @@ const MYSQL_DB_USER = 'user' const MYSQL_DB_PASSWORD = 'pass' const MYSQL_DB_NAME = 'bot' ``` +Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: + + Menu Principal + - SubMenu 1 + - Submenu 1.1 + - Submenu 2 + - Submenu 2.1 + +Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. ``` npm install diff --git a/starters/apps/base-twilio-mysql/app.js b/starters/apps/base-twilio-mysql/app.js index d901f8e..724b819 100644 --- a/starters/apps/base-twilio-mysql/app.js +++ b/starters/apps/base-twilio-mysql/app.js @@ -12,13 +12,22 @@ const MySQLAdapter = require('@bot-whatsapp/database/mysql') /** * Declaramos las conexiones de MySQL */ + const MYSQL_DB_HOST = 'localhost' const MYSQL_DB_USER = 'user' const MYSQL_DB_PASSWORD = 'pass' const MYSQL_DB_NAME = 'bot' /** - * Declarando flujo hijo + * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: + * + * Menu Principal + * - SubMenu 1 + * - Submenu 1.1 + * - Submenu 2 + * - Submenu 2.1 + * + * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ const flowBolsos2 = addKeyword(['bolsos2', '2']) @@ -29,11 +38,11 @@ const flowZapatos2 = addKeyword(['zapatos2', '2']) .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') -const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) +const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'], + ['Manda:', '*(2) Zapatos2*', 'para mas información'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -43,11 +52,11 @@ const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) [...addChild(flowZapatos2)] ) -const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) +const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'], + ['Manda:', '*(2) Bolsos2*', 'para mas información.'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -60,12 +69,12 @@ const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) /** * Declarando flujo principal */ + const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer('Hola, bienvenido a mi tienda') - .addAnswer('Como puedo ayudarte?') - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..']) + .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) + .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) .addAnswer( - ['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'], + ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') diff --git a/starters/apps/base-venom-memory/README.md b/starters/apps/base-venom-memory/README.md index 4d1d6b2..d0e43d2 100644 --- a/starters/apps/base-venom-memory/README.md +++ b/starters/apps/base-venom-memory/README.md @@ -1,14 +1,24 @@ ### CHATBOT Whatsapp -Este bot es una aplicación que puedes vincular con tu whatsapp crear flujos para automatizar tareas en tu negocio o procesos repetitivos +Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. +Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: - Bienvenido a mi tienda -- Como puedo ayudarte? -- Tengo: Zapatos Bolsos etc.. +- ¿Como puedo ayudarte? +- Tengo: Zapatos, Bolsos etc.. __Iniciar__ +Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: + + Menu Principal + - SubMenu 1 + - Submenu 1.1 + - Submenu 2 + - Submenu 2.1 + +Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + ``` npm install npm start diff --git a/starters/apps/base-venom-memory/app.js b/starters/apps/base-venom-memory/app.js index fff68c3..b785def 100644 --- a/starters/apps/base-venom-memory/app.js +++ b/starters/apps/base-venom-memory/app.js @@ -10,7 +10,15 @@ const VenomProvider = require('@bot-whatsapp/provider/venom') const MockAdapter = require('@bot-whatsapp/database/mock') /** - * Declarando flujo hijo + * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: + * + * Menu Principal + * - SubMenu 1 + * - Submenu 1.1 + * - Submenu 2 + * - Submenu 2.1 + * + * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ const flowBolsos2 = addKeyword(['bolsos2', '2']) @@ -21,11 +29,11 @@ const flowZapatos2 = addKeyword(['zapatos2', '2']) .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') -const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) +const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'], + ['Manda:', '*(2) Zapatos2*', 'para mas información'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -35,11 +43,11 @@ const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) [...addChild(flowZapatos2)] ) -const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) +const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'], + ['Manda:', '*(2) Bolsos2*', 'para mas información.'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -52,12 +60,12 @@ const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) /** * Declarando flujo principal */ + const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer('Hola, bienvenido a mi tienda') - .addAnswer('Como puedo ayudarte?') - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..']) + .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) + .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) .addAnswer( - ['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'], + ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') diff --git a/starters/apps/base-venom-mongo/README.md b/starters/apps/base-venom-mongo/README.md index d5a4d67..b2bf791 100644 --- a/starters/apps/base-venom-mongo/README.md +++ b/starters/apps/base-venom-mongo/README.md @@ -1,14 +1,15 @@ ### CHATBOT Whatsapp -Este bot es una aplicación que puedes vincular con tu whatsapp crear flujos para automatizar tareas en tu negocio o procesos repetitivos +Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. +Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: - Bienvenido a mi tienda -- Como puedo ayudarte? -- Tengo: Zapatos Bolsos etc.. +- ¿Como puedo ayudarte? +- Tengo: Zapatos, Bolsos etc.. __Iniciar__ -Recuerda configurar los parametros de conexion de la base de datos + +Recuerda configurar los parametros de conexión de la base de datos. ```js // app.js @@ -16,6 +17,16 @@ const MONGO_DB_URI = 'mongodb://0.0.0.0:27017' const MONGO_DB_NAME = 'db_bot' ``` + Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: + + Menu Principal + - SubMenu 1 + - Submenu 1.1 + - Submenu 2 + - Submenu 2.1 + + Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + ``` npm install npm start diff --git a/starters/apps/base-venom-mongo/app.js b/starters/apps/base-venom-mongo/app.js index 90a41a4..d1ec8fc 100644 --- a/starters/apps/base-venom-mongo/app.js +++ b/starters/apps/base-venom-mongo/app.js @@ -12,11 +12,20 @@ const MongoAdapter = require('@bot-whatsapp/database/mongo') /** * Declaramos las conexiones de Mongo */ + const MONGO_DB_URI = 'mongodb://0.0.0.0:27017' const MONGO_DB_NAME = 'db_bot' /** - * Declarando flujo hijo + * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: + * + * Menu Principal + * - SubMenu 1 + * - Submenu 1.1 + * - Submenu 2 + * - Submenu 2.1 + * + * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ const flowBolsos2 = addKeyword(['bolsos2', '2']) @@ -27,11 +36,11 @@ const flowZapatos2 = addKeyword(['zapatos2', '2']) .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') -const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) +const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'], + ['Manda:', '*(2) Zapatos2*', 'para mas información'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -41,11 +50,11 @@ const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) [...addChild(flowZapatos2)] ) -const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) +const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'], + ['Manda:', '*(2) Bolsos2*', 'para mas información.'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -58,12 +67,12 @@ const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) /** * Declarando flujo principal */ + const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer('Hola, bienvenido a mi tienda') - .addAnswer('Como puedo ayudarte?') - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..']) + .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) + .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) .addAnswer( - ['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'], + ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') diff --git a/starters/apps/base-venom-mysql/README.md b/starters/apps/base-venom-mysql/README.md index fbad3da..ad304ee 100644 --- a/starters/apps/base-venom-mysql/README.md +++ b/starters/apps/base-venom-mysql/README.md @@ -1,14 +1,15 @@ ### CHATBOT Whatsapp -Este bot es una aplicación que puedes vincular con tu whatsapp crear flujos para automatizar tareas en tu negocio o procesos repetitivos +Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. +Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: - Bienvenido a mi tienda -- Como puedo ayudarte? -- Tengo: Zapatos Bolsos etc.. +- ¿Como puedo ayudarte? +- Tengo: Zapatos, Bolsos etc.. __Iniciar__ -Recuerda configurar los parametros de conexion de la base de datos + +Recuerda configurar los parametros de conexión de la base de datos ```js // app.js @@ -17,6 +18,15 @@ const MYSQL_DB_USER = 'user' const MYSQL_DB_PASSWORD = 'pass' const MYSQL_DB_NAME = 'bot' ``` +Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: + + Menu Principal + - SubMenu 1 + - Submenu 1.1 + - Submenu 2 + - Submenu 2.1 + +Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. ``` npm install diff --git a/starters/apps/base-venom-mysql/app.js b/starters/apps/base-venom-mysql/app.js index da4ad99..304e6fa 100644 --- a/starters/apps/base-venom-mysql/app.js +++ b/starters/apps/base-venom-mysql/app.js @@ -12,13 +12,22 @@ const MySQLAdapter = require('@bot-whatsapp/database/mysql') /** * Declaramos las conexiones de MySQL */ + const MYSQL_DB_HOST = 'localhost' const MYSQL_DB_USER = 'user' const MYSQL_DB_PASSWORD = 'pass' const MYSQL_DB_NAME = 'bot' /** - * Declarando flujo hijo + * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: + * + * Menu Principal + * - SubMenu 1 + * - Submenu 1.1 + * - Submenu 2 + * - Submenu 2.1 + * + * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ const flowBolsos2 = addKeyword(['bolsos2', '2']) @@ -29,11 +38,11 @@ const flowZapatos2 = addKeyword(['zapatos2', '2']) .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') -const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) +const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'], + ['Manda:', '*(2) Zapatos2*', 'para mas información'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -43,11 +52,11 @@ const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) [...addChild(flowZapatos2)] ) -const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) +const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'], + ['Manda:', '*(2) Bolsos2*', 'para mas información.'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -60,12 +69,12 @@ const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) /** * Declarando flujo principal */ + const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer('Hola, bienvenido a mi tienda') - .addAnswer('Como puedo ayudarte?') - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..']) + .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) + .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) .addAnswer( - ['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'], + ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') diff --git a/starters/apps/base-wweb-memory/README.md b/starters/apps/base-wweb-memory/README.md index 4d1d6b2..d0e43d2 100644 --- a/starters/apps/base-wweb-memory/README.md +++ b/starters/apps/base-wweb-memory/README.md @@ -1,14 +1,24 @@ ### CHATBOT Whatsapp -Este bot es una aplicación que puedes vincular con tu whatsapp crear flujos para automatizar tareas en tu negocio o procesos repetitivos +Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. +Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: - Bienvenido a mi tienda -- Como puedo ayudarte? -- Tengo: Zapatos Bolsos etc.. +- ¿Como puedo ayudarte? +- Tengo: Zapatos, Bolsos etc.. __Iniciar__ +Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: + + Menu Principal + - SubMenu 1 + - Submenu 1.1 + - Submenu 2 + - Submenu 2.1 + +Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + ``` npm install npm start diff --git a/starters/apps/base-wweb-memory/app.js b/starters/apps/base-wweb-memory/app.js index c2828f2..f968ba9 100644 --- a/starters/apps/base-wweb-memory/app.js +++ b/starters/apps/base-wweb-memory/app.js @@ -10,7 +10,15 @@ const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MockAdapter = require('@bot-whatsapp/database/mock') /** - * Declarando flujo hijo + * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: + * + * Menu Principal + * - SubMenu 1 + * - Submenu 1.1 + * - Submenu 2 + * - Submenu 2.1 + * + * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ const flowBolsos2 = addKeyword(['bolsos2', '2']) @@ -21,11 +29,11 @@ const flowZapatos2 = addKeyword(['zapatos2', '2']) .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') -const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) +const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'], + ['Manda:', '*(2) Zapatos2*', 'para mas información'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -35,11 +43,11 @@ const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) [...addChild(flowZapatos2)] ) -const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) +const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'], + ['Manda:', '*(2) Bolsos2*', 'para mas información.'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -52,12 +60,12 @@ const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) /** * Declarando flujo principal */ + const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer('Hola, bienvenido a mi tienda') - .addAnswer('Como puedo ayudarte?') - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..']) + .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) + .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) .addAnswer( - ['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'], + ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') diff --git a/starters/apps/base-wweb-mongo/README.md b/starters/apps/base-wweb-mongo/README.md index d5a4d67..a22e43b 100644 --- a/starters/apps/base-wweb-mongo/README.md +++ b/starters/apps/base-wweb-mongo/README.md @@ -1,14 +1,15 @@ ### CHATBOT Whatsapp -Este bot es una aplicación que puedes vincular con tu whatsapp crear flujos para automatizar tareas en tu negocio o procesos repetitivos +Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. +Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: - Bienvenido a mi tienda -- Como puedo ayudarte? -- Tengo: Zapatos Bolsos etc.. +- ¿Como puedo ayudarte? +- Tengo: Zapatos, Bolsos etc.. __Iniciar__ -Recuerda configurar los parametros de conexion de la base de datos + +Recuerda configurar los parametros de conexión de la base de datos: ```js // app.js @@ -16,6 +17,16 @@ const MONGO_DB_URI = 'mongodb://0.0.0.0:27017' const MONGO_DB_NAME = 'db_bot' ``` + Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: + + Menu Principal + - SubMenu 1 + - Submenu 1.1 + - Submenu 2 + - Submenu 2.1 + + Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + ``` npm install npm start diff --git a/starters/apps/base-wweb-mongo/app.js b/starters/apps/base-wweb-mongo/app.js index bb77f07..60f20e7 100644 --- a/starters/apps/base-wweb-mongo/app.js +++ b/starters/apps/base-wweb-mongo/app.js @@ -12,11 +12,20 @@ const MongoAdapter = require('@bot-whatsapp/database/mongo') /** * Declaramos las conexiones de Mongo */ + const MONGO_DB_URI = 'mongodb://0.0.0.0:27017' const MONGO_DB_NAME = 'db_bot' /** - * Declarando flujo hijo + * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: + * + * Menu Principal + * - SubMenu 1 + * - Submenu 1.1 + * - Submenu 2 + * - Submenu 2.1 + * + * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ const flowBolsos2 = addKeyword(['bolsos2', '2']) @@ -27,11 +36,11 @@ const flowZapatos2 = addKeyword(['zapatos2', '2']) .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') -const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) +const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'], + ['Manda:', '*(2) Zapatos2*', 'para mas información'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -41,11 +50,11 @@ const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) [...addChild(flowZapatos2)] ) -const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) +const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'], + ['Manda:', '*(2) Bolsos2*', 'para mas información.'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -58,12 +67,12 @@ const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) /** * Declarando flujo principal */ + const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer('Hola, bienvenido a mi tienda') - .addAnswer('Como puedo ayudarte?') - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..']) + .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) + .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) .addAnswer( - ['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'], + ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') diff --git a/starters/apps/base-wweb-mysql/README.md b/starters/apps/base-wweb-mysql/README.md index fbad3da..ad304ee 100644 --- a/starters/apps/base-wweb-mysql/README.md +++ b/starters/apps/base-wweb-mysql/README.md @@ -1,14 +1,15 @@ ### CHATBOT Whatsapp -Este bot es una aplicación que puedes vincular con tu whatsapp crear flujos para automatizar tareas en tu negocio o procesos repetitivos +Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. +Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: - Bienvenido a mi tienda -- Como puedo ayudarte? -- Tengo: Zapatos Bolsos etc.. +- ¿Como puedo ayudarte? +- Tengo: Zapatos, Bolsos etc.. __Iniciar__ -Recuerda configurar los parametros de conexion de la base de datos + +Recuerda configurar los parametros de conexión de la base de datos ```js // app.js @@ -17,6 +18,15 @@ const MYSQL_DB_USER = 'user' const MYSQL_DB_PASSWORD = 'pass' const MYSQL_DB_NAME = 'bot' ``` +Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: + + Menu Principal + - SubMenu 1 + - Submenu 1.1 + - Submenu 2 + - Submenu 2.1 + +Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. ``` npm install diff --git a/starters/apps/base-wweb-mysql/app.js b/starters/apps/base-wweb-mysql/app.js index 519f142..d8d6f80 100644 --- a/starters/apps/base-wweb-mysql/app.js +++ b/starters/apps/base-wweb-mysql/app.js @@ -12,13 +12,22 @@ const MySQLAdapter = require('@bot-whatsapp/database/mysql') /** * Declaramos las conexiones de MySQL */ + const MYSQL_DB_HOST = 'localhost' const MYSQL_DB_USER = 'user' const MYSQL_DB_PASSWORD = 'pass' const MYSQL_DB_NAME = 'bot' /** - * Declarando flujo hijo + * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: + * + * Menu Principal + * - SubMenu 1 + * - Submenu 1.1 + * - Submenu 2 + * - Submenu 2.1 + * + * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ const flowBolsos2 = addKeyword(['bolsos2', '2']) @@ -29,11 +38,11 @@ const flowZapatos2 = addKeyword(['zapatos2', '2']) .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') -const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) +const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'], + ['Manda:', '*(2) Zapatos2*', 'para mas información'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -43,11 +52,11 @@ const flowZapatos = addKeyword(['zapatos', 'ZAPATOS']) [...addChild(flowZapatos2)] ) -const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) +const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( - ['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'], + ['Manda:', '*(2) Bolsos2*', 'para mas información.'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') @@ -60,12 +69,12 @@ const flowBolsos = addKeyword(['bolsos', 'BOLSOS']) /** * Declarando flujo principal */ + const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer('Hola, bienvenido a mi tienda') - .addAnswer('Como puedo ayudarte?') - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..']) + .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) + .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) .addAnswer( - ['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'], + ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], { capture: true }, (ctx) => { console.log('Aqui puedes ver más info del usuario...') diff --git a/yarn.lock b/yarn.lock index e5389fe..a39adac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -82,15 +82,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-cognito-identity@npm:3.229.0": - version: 3.229.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.229.0" +"@aws-sdk/client-cognito-identity@npm:3.231.0": + version: 3.231.0 + resolution: "@aws-sdk/client-cognito-identity@npm:3.231.0" dependencies: "@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/client-sts": 3.229.0 - "@aws-sdk/config-resolver": 3.226.0 - "@aws-sdk/credential-provider-node": 3.229.0 + "@aws-sdk/client-sts": 3.231.0 + "@aws-sdk/config-resolver": 3.231.0 + "@aws-sdk/credential-provider-node": 3.231.0 "@aws-sdk/fetch-http-handler": 3.226.0 "@aws-sdk/hash-node": 3.226.0 "@aws-sdk/invalid-dependency": 3.226.0 @@ -114,7 +114,7 @@ __metadata: "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 "@aws-sdk/util-defaults-mode-browser": 3.226.0 - "@aws-sdk/util-defaults-mode-node": 3.226.0 + "@aws-sdk/util-defaults-mode-node": 3.231.0 "@aws-sdk/util-endpoints": 3.226.0 "@aws-sdk/util-retry": 3.229.0 "@aws-sdk/util-user-agent-browser": 3.226.0 @@ -122,17 +122,17 @@ __metadata: "@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-node": 3.208.0 tslib: ^2.3.1 - checksum: 742e26278a61685b276e4dbaa15e3e3fc5702606ec2be72f59a210eedba99b8b66fabfd2d00927e76f7941dbe63701176f5e8c6cad82224f30dfeca2b125c186 + checksum: 309c433d0005c072db5298d75df4f37826350ffc2bdab940c1147f719f5285207e9761ee8f87884b23ea2cf5f8bf7157fcf992008f0a838491954cbe6925a47a languageName: node linkType: hard -"@aws-sdk/client-sso-oidc@npm:3.229.0": - version: 3.229.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.229.0" +"@aws-sdk/client-sso-oidc@npm:3.231.0": + version: 3.231.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.231.0" dependencies: "@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/config-resolver": 3.226.0 + "@aws-sdk/config-resolver": 3.231.0 "@aws-sdk/fetch-http-handler": 3.226.0 "@aws-sdk/hash-node": 3.226.0 "@aws-sdk/invalid-dependency": 3.226.0 @@ -155,7 +155,7 @@ __metadata: "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 "@aws-sdk/util-defaults-mode-browser": 3.226.0 - "@aws-sdk/util-defaults-mode-node": 3.226.0 + "@aws-sdk/util-defaults-mode-node": 3.231.0 "@aws-sdk/util-endpoints": 3.226.0 "@aws-sdk/util-retry": 3.229.0 "@aws-sdk/util-user-agent-browser": 3.226.0 @@ -163,17 +163,17 @@ __metadata: "@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-node": 3.208.0 tslib: ^2.3.1 - checksum: 031bedebd213f7f2522321abb55bb50a2271e4d63ad38e3596eab6daeddb39044a4d72f554fc3e716ea4108317b3169ffb681b6e75f45ec83f730619b588eac6 + checksum: 4ec5e5f0f25969df5d5341cd1f291a763ed2edaeb317228a7873f18f16471f2cbd83bd575f766a4f0f22c3ebfcf69ecd75891fd0518a205c69eb20ded8734c98 languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.229.0": - version: 3.229.0 - resolution: "@aws-sdk/client-sso@npm:3.229.0" +"@aws-sdk/client-sso@npm:3.231.0": + version: 3.231.0 + resolution: "@aws-sdk/client-sso@npm:3.231.0" dependencies: "@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/config-resolver": 3.226.0 + "@aws-sdk/config-resolver": 3.231.0 "@aws-sdk/fetch-http-handler": 3.226.0 "@aws-sdk/hash-node": 3.226.0 "@aws-sdk/invalid-dependency": 3.226.0 @@ -196,7 +196,7 @@ __metadata: "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 "@aws-sdk/util-defaults-mode-browser": 3.226.0 - "@aws-sdk/util-defaults-mode-node": 3.226.0 + "@aws-sdk/util-defaults-mode-node": 3.231.0 "@aws-sdk/util-endpoints": 3.226.0 "@aws-sdk/util-retry": 3.229.0 "@aws-sdk/util-user-agent-browser": 3.226.0 @@ -204,18 +204,18 @@ __metadata: "@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-node": 3.208.0 tslib: ^2.3.1 - checksum: 970e6ea9666a6e976f0b4e7f693e286ade8c090aca1ae780835050623f5d8bd3ecbc0336d1b3f4037e92d50c48b5d18d5ad6d595ddb62db7efe38b90ab928129 + checksum: 3551984b8c14f611daa93c7082f2a361caa0c8e985fbfc6d66674ec7f3624364aa7d3c8011aa334729022e3866e5323c6ac18a4ba3e840023128000994d99165 languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.229.0": - version: 3.229.0 - resolution: "@aws-sdk/client-sts@npm:3.229.0" +"@aws-sdk/client-sts@npm:3.231.0": + version: 3.231.0 + resolution: "@aws-sdk/client-sts@npm:3.231.0" dependencies: "@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/config-resolver": 3.226.0 - "@aws-sdk/credential-provider-node": 3.229.0 + "@aws-sdk/config-resolver": 3.231.0 + "@aws-sdk/credential-provider-node": 3.231.0 "@aws-sdk/fetch-http-handler": 3.226.0 "@aws-sdk/hash-node": 3.226.0 "@aws-sdk/invalid-dependency": 3.226.0 @@ -240,7 +240,7 @@ __metadata: "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 "@aws-sdk/util-defaults-mode-browser": 3.226.0 - "@aws-sdk/util-defaults-mode-node": 3.226.0 + "@aws-sdk/util-defaults-mode-node": 3.231.0 "@aws-sdk/util-endpoints": 3.226.0 "@aws-sdk/util-retry": 3.229.0 "@aws-sdk/util-user-agent-browser": 3.226.0 @@ -249,32 +249,32 @@ __metadata: "@aws-sdk/util-utf8-node": 3.208.0 fast-xml-parser: 4.0.11 tslib: ^2.3.1 - checksum: 18d357f2433ef832948f867c0e22ba34ac57c096e8b5209e0203d892acab9de60d9114a513f8ec9354ec83a89652a8285a49f89ee3203cededc514a25eea67f5 + checksum: 377eabf0ff0523b7847fe1677084293c322d5525443a859f522b83363eb647a87721245f7b48f7232e2f2f3b49dfdaefdf274e9578915c24617c5d7540624aca languageName: node linkType: hard -"@aws-sdk/config-resolver@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/config-resolver@npm:3.226.0" +"@aws-sdk/config-resolver@npm:3.231.0": + version: 3.231.0 + resolution: "@aws-sdk/config-resolver@npm:3.231.0" dependencies: "@aws-sdk/signature-v4": 3.226.0 "@aws-sdk/types": 3.226.0 "@aws-sdk/util-config-provider": 3.208.0 "@aws-sdk/util-middleware": 3.226.0 tslib: ^2.3.1 - checksum: 08bfbc0528da98cba2b46bda05cd9af46f6eced3dbe5e415b11465501fe672d99b869adc9f08cfd2f138c9b61ac119b43eb9a90a490395aec705e1b795022d4d + checksum: 67ec8d1f547cdde45f9c0daec21864225cfc04fba732e5e157b59d23f987d588fdc1738e1ce43012f885bdb6e65da8105511f5816e5844a5b839192b5feecc64 languageName: node linkType: hard -"@aws-sdk/credential-provider-cognito-identity@npm:3.229.0": - version: 3.229.0 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.229.0" +"@aws-sdk/credential-provider-cognito-identity@npm:3.231.0": + version: 3.231.0 + resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.231.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.229.0 + "@aws-sdk/client-cognito-identity": 3.231.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: 37cc46249390dc5bc6cb39b014a2c9710fcbe53d22b8cf90452473712f7464dffcf286c3c7cb72ae268988c136710a1dbcb52006d93d2de8973c40953ef79058 + checksum: f0c2059379f703e72538b00e52d2f5ce01c69a8adf3af370af2e72cc971ffe44963e6611917032326c0207b11fe34133780540e4ab0412e36e6c34b589f3dec3 languageName: node linkType: hard @@ -302,37 +302,37 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.229.0": - version: 3.229.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.229.0" +"@aws-sdk/credential-provider-ini@npm:3.231.0": + version: 3.231.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.231.0" dependencies: "@aws-sdk/credential-provider-env": 3.226.0 "@aws-sdk/credential-provider-imds": 3.226.0 - "@aws-sdk/credential-provider-sso": 3.229.0 + "@aws-sdk/credential-provider-sso": 3.231.0 "@aws-sdk/credential-provider-web-identity": 3.226.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/shared-ini-file-loader": 3.226.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: fb573675c0c34c7fa0e207c78190bce73e42fc1713d93a25868b50002352a70f3584e2ab0a0b249103bcf25c3a60c26261ad3dcfc1d6280b4f5dc8ad4e4b3f49 + checksum: f6b11d4876602e65464bc25804781b78a6e0c66b39c293178d7e97f2f11c151bd6e23e1e31158c0442dfbc3076f417aeecf44c315d4e509b48e7cfc3be2e7472 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.229.0": - version: 3.229.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.229.0" +"@aws-sdk/credential-provider-node@npm:3.231.0": + version: 3.231.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.231.0" dependencies: "@aws-sdk/credential-provider-env": 3.226.0 "@aws-sdk/credential-provider-imds": 3.226.0 - "@aws-sdk/credential-provider-ini": 3.229.0 + "@aws-sdk/credential-provider-ini": 3.231.0 "@aws-sdk/credential-provider-process": 3.226.0 - "@aws-sdk/credential-provider-sso": 3.229.0 + "@aws-sdk/credential-provider-sso": 3.231.0 "@aws-sdk/credential-provider-web-identity": 3.226.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/shared-ini-file-loader": 3.226.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: a8ad0f6aeb3c7ee03937e7389dbcabeb81f2a6e23c3bfeb84f518b063fb156a2d2f2e4a7267655c6bdfa178ba51e9e0ea74c98397dd6dd58b9a315d9e5a4a6de + checksum: e28266dce53130c6e28eb7e82028e29cb2db2f06e1f40c98ae7875bcf2e17553976899f02b93576070c7fd77c131046ec752f543f9aa7e32078e1f3a44c3acf5 languageName: node linkType: hard @@ -348,17 +348,17 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.229.0": - version: 3.229.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.229.0" +"@aws-sdk/credential-provider-sso@npm:3.231.0": + version: 3.231.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.231.0" dependencies: - "@aws-sdk/client-sso": 3.229.0 + "@aws-sdk/client-sso": 3.231.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/shared-ini-file-loader": 3.226.0 - "@aws-sdk/token-providers": 3.229.0 + "@aws-sdk/token-providers": 3.231.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: 9497a8c5dfddf70a4740e9e485cea757070a6e9c5c94469cc51599918f2689f6ca794fcaba98320b20aa7b81e7e56c3b91f11d3cf8111335e445638825d0ee58 + checksum: 0aa69ec7ea5b0115c53972c6ae0419687e0bebc7500fbefa77c1108ecb81e735227982b586180b2fe111427cba17fad75f6db61f69a8b5cf5ad079f7ee09107c languageName: node linkType: hard @@ -374,25 +374,25 @@ __metadata: linkType: hard "@aws-sdk/credential-providers@npm:^3.186.0": - version: 3.229.0 - resolution: "@aws-sdk/credential-providers@npm:3.229.0" + version: 3.231.0 + resolution: "@aws-sdk/credential-providers@npm:3.231.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.229.0 - "@aws-sdk/client-sso": 3.229.0 - "@aws-sdk/client-sts": 3.229.0 - "@aws-sdk/credential-provider-cognito-identity": 3.229.0 + "@aws-sdk/client-cognito-identity": 3.231.0 + "@aws-sdk/client-sso": 3.231.0 + "@aws-sdk/client-sts": 3.231.0 + "@aws-sdk/credential-provider-cognito-identity": 3.231.0 "@aws-sdk/credential-provider-env": 3.226.0 "@aws-sdk/credential-provider-imds": 3.226.0 - "@aws-sdk/credential-provider-ini": 3.229.0 - "@aws-sdk/credential-provider-node": 3.229.0 + "@aws-sdk/credential-provider-ini": 3.231.0 + "@aws-sdk/credential-provider-node": 3.231.0 "@aws-sdk/credential-provider-process": 3.226.0 - "@aws-sdk/credential-provider-sso": 3.229.0 + "@aws-sdk/credential-provider-sso": 3.231.0 "@aws-sdk/credential-provider-web-identity": 3.226.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/shared-ini-file-loader": 3.226.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: 9acd1bfb97d5c45a3b02ed74540317791eb00a058bbe4ab2852099f59dff62ab6a7f834dcfdb1f75e80956b86d80a3b44c0574361a12473f8a3e493437a1b36a + checksum: edbf6a2821c5bf38d40a83f8d7c8ab967fff85d2c10af79f6f5df40cd52ef185f988c6499552a0294ca98cb7db34cb77e046a78e779e5ff5d362d104c29acc83 languageName: node linkType: hard @@ -678,16 +678,16 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.229.0": - version: 3.229.0 - resolution: "@aws-sdk/token-providers@npm:3.229.0" +"@aws-sdk/token-providers@npm:3.231.0": + version: 3.231.0 + resolution: "@aws-sdk/token-providers@npm:3.231.0" dependencies: - "@aws-sdk/client-sso-oidc": 3.229.0 + "@aws-sdk/client-sso-oidc": 3.231.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/shared-ini-file-loader": 3.226.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: b099537ba47f3c2520f8081590ef97d22279aea39fcb1f3883f611273c8f15f4190d7b44f3f2debfdb36900f124e5f188193b039ce95c45c6e20d3b48ef9a3da + checksum: 3fe2b2776232f2aad499d74ec540431db013520a1c4e3cee6ed4ab4d5cb2a402b1b50dd60f64d1c95e9ebb2bcc44c2244462d62453b9f6226b73082930dcc119 languageName: node linkType: hard @@ -770,17 +770,17 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-node@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/util-defaults-mode-node@npm:3.226.0" +"@aws-sdk/util-defaults-mode-node@npm:3.231.0": + version: 3.231.0 + resolution: "@aws-sdk/util-defaults-mode-node@npm:3.231.0" dependencies: - "@aws-sdk/config-resolver": 3.226.0 + "@aws-sdk/config-resolver": 3.231.0 "@aws-sdk/credential-provider-imds": 3.226.0 "@aws-sdk/node-config-provider": 3.226.0 "@aws-sdk/property-provider": 3.226.0 "@aws-sdk/types": 3.226.0 tslib: ^2.3.1 - checksum: cb34426f745aa3965fe25d5c8e38eb4d1c3f85f6f071995b15ecad48afcd0ca01a01b7f572c26dacd917134d9c676625492df8f6fb01d702ad6becb65bd34105 + checksum: 6dca6704798145569f25002605c4918890ebd2b7bf56d20909192993eea5bcf8fdceff7f51484c9ab7e009a77c3d371e0935666d204c819e703128e857859e73 languageName: node linkType: hard @@ -963,6 +963,14 @@ __metadata: languageName: unknown linkType: soft +"@bot-whatsapp/contexts@workspace:packages/contexts": + version: 0.0.0-use.local + resolution: "@bot-whatsapp/contexts@workspace:packages/contexts" + dependencies: + "@bot-whatsapp/bot": "*" + languageName: unknown + linkType: soft + "@bot-whatsapp/database@npm:*": version: 0.1.2 resolution: "@bot-whatsapp/database@npm:0.1.2" @@ -1316,20 +1324,20 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^1.3.3": - version: 1.3.3 - resolution: "@eslint/eslintrc@npm:1.3.3" +"@eslint/eslintrc@npm:^1.3.3, @eslint/eslintrc@npm:^1.4.0": + version: 1.4.0 + resolution: "@eslint/eslintrc@npm:1.4.0" dependencies: ajv: ^6.12.4 debug: ^4.3.2 espree: ^9.4.0 - globals: ^13.15.0 + globals: ^13.19.0 ignore: ^5.2.0 import-fresh: ^3.2.1 js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: f03e9d6727efd3e0719da2051ea80c0c73d20e28c171121527dbb868cd34232ca9c1d0525a66e517a404afea26624b1e47895b6a92474678418c2f50c9566694 + checksum: 73e39c833deafde8d8706e6fa9b52b6d99927c094ead8e405ea4174e8197ec24aac9ba88ae38cc8ad32eaccf07b9c7fc5dc70761d1fba6da41a928691447305f languageName: node linkType: hard @@ -1340,14 +1348,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.6": - version: 0.11.7 - resolution: "@humanwhocodes/config-array@npm:0.11.7" +"@humanwhocodes/config-array@npm:^0.11.6, @humanwhocodes/config-array@npm:^0.11.8": + version: 0.11.8 + resolution: "@humanwhocodes/config-array@npm:0.11.8" dependencies: "@humanwhocodes/object-schema": ^1.2.1 debug: ^4.1.1 minimatch: ^3.0.5 - checksum: cf506dc45d9488af7fbf108ea6ac2151ba1a25e6d2b94b9b4fc36d2c1e4099b89ff560296dbfa13947e44604d4ca4a90d97a4fb167370bf8dd01a6ca2b6d83ac + checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 languageName: node linkType: hard @@ -1393,7 +1401,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": +"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13": version: 1.4.14 resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 @@ -1694,21 +1702,21 @@ __metadata: linkType: hard "@rollup/plugin-commonjs@npm:^23.0.2": - version: 23.0.4 - resolution: "@rollup/plugin-commonjs@npm:23.0.4" + version: 23.0.7 + resolution: "@rollup/plugin-commonjs@npm:23.0.7" dependencies: "@rollup/pluginutils": ^5.0.1 commondir: ^1.0.1 estree-walker: ^2.0.2 glob: ^8.0.3 is-reference: 1.2.1 - magic-string: ^0.26.4 + magic-string: ^0.27.0 peerDependencies: rollup: ^2.68.0||^3.0.0 peerDependenciesMeta: rollup: optional: true - checksum: 32d84de06140d4d050c0b402c6a6d858a6f970c3d6f50ea1fba40495b0cd0f977486513639875058287885cfbddc6f8b1ab5ebbe0d28f0364506b372fd4b0bd6 + checksum: 01d90947bd4aa664c568cec172399825921f29afc035a6d8aec153868ab151ce7901ad56a101c76655e31b21567ddc70313c4bca476685b872218f041757a8c9 languageName: node linkType: hard @@ -1746,17 +1754,17 @@ __metadata: linkType: hard "@rollup/plugin-replace@npm:^5.0.1": - version: 5.0.1 - resolution: "@rollup/plugin-replace@npm:5.0.1" + version: 5.0.2 + resolution: "@rollup/plugin-replace@npm:5.0.2" dependencies: "@rollup/pluginutils": ^5.0.1 - magic-string: ^0.26.4 + magic-string: ^0.27.0 peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0 peerDependenciesMeta: rollup: optional: true - checksum: d5f98a93dd24086ed1bf70e9299230d1fddae9b132280e2daaca855dba2307eccd5490553e2a03b701b7411593d2921d2d675e5d906b4754c57152f8c50adb07 + checksum: 3a91b5fa2ce5acfe67c1faf8d479585da30f398f29499cf8a2d2153c899af0b2ef0363012db0e6edc2ebbb3d9fad6dd7ad591c9d977c1ae2ca3256b52e86d950 languageName: node linkType: hard @@ -1951,16 +1959,16 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:latest": - version: 18.11.15 - resolution: "@types/node@npm:18.11.15" - checksum: cae8692a5cee0316f93ee0342237eb921f70c51afb37c661c711a925a4642654ae7e404c5a80899d481c0cfaff3a6891ef04bacd330a2e72734192bfc91dc2d8 + version: 18.11.17 + resolution: "@types/node@npm:18.11.17" + checksum: 1933afd068d5c75c068c6c4df6d10edb3b0b2bb6503d544e2f0496ac007c90596e6a5e284a8ef032451bc16f871b7e46719d7d2bea60e9b25d13a77d52161cac languageName: node linkType: hard "@types/node@npm:^14.0.0": - version: 14.18.34 - resolution: "@types/node@npm:14.18.34" - checksum: 25ac3b456a0b7b82c76b37276ec86845849e8276fc81d1470a87227c105c619e299aa7165b6148aa11a4ea156b1452f6d3327935f3e7dc0067ff54dde0e3d4e0 + version: 14.18.35 + resolution: "@types/node@npm:14.18.35" + checksum: edaeea2735aa62a12b9f67311ef6efdb960560e055dc127a658b3571e0bbd52e020bd570227362bf255cd156ddfae18c18205515f1fb3599e34c06a914f167a1 languageName: node linkType: hard @@ -4219,11 +4227,11 @@ __metadata: linkType: hard "eslint@npm:^8.26.0": - version: 8.29.0 - resolution: "eslint@npm:8.29.0" + version: 8.30.0 + resolution: "eslint@npm:8.30.0" dependencies: - "@eslint/eslintrc": ^1.3.3 - "@humanwhocodes/config-array": ^0.11.6 + "@eslint/eslintrc": ^1.4.0 + "@humanwhocodes/config-array": ^0.11.8 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 ajv: ^6.10.0 @@ -4242,7 +4250,7 @@ __metadata: file-entry-cache: ^6.0.1 find-up: ^5.0.0 glob-parent: ^6.0.2 - globals: ^13.15.0 + globals: ^13.19.0 grapheme-splitter: ^1.0.4 ignore: ^5.2.0 import-fresh: ^3.0.0 @@ -4263,7 +4271,7 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: e05204b05907b82d910983995cb946e0ba62ca514eb2b6791c43f623333b143564a2eee0139909d31c10935c21877d815b1f76dd674a59cb91c471064325c4ab + checksum: b7525bb465b342665c3b8bab7e114d514ef1bc4e79f211c919863f9c71767e7412ec82383a22614a92d159783f91101018817000f7c61ce69a5e7015280cafaf languageName: node linkType: hard @@ -4949,7 +4957,7 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.15.0": +"globals@npm:^13.15.0, globals@npm:^13.19.0": version: 13.19.0 resolution: "globals@npm:13.19.0" dependencies: @@ -5236,9 +5244,9 @@ __metadata: linkType: hard "ignore@npm:^5.1.1, ignore@npm:^5.1.4, ignore@npm:^5.2.0": - version: 5.2.1 - resolution: "ignore@npm:5.2.1" - checksum: 7251d00cba49fe88c4f3565fadeb4aa726ba38294a9a79ffed542edc47bafd989d4b2ccf65700c5b1b26a1e91dfc7218fb23017937c79216025d5caeec0ee9d5 + version: 5.2.2 + resolution: "ignore@npm:5.2.2" + checksum: 2086f12e8dca6978001b3861562272888fcf231f464696938049e0aa576d0562a8f31926630a973e302944c20c64639c14cfdd725bacd208dcda973021377420 languageName: node linkType: hard @@ -5703,11 +5711,11 @@ __metadata: linkType: hard "json5@npm:^2.2.1": - version: 2.2.1 - resolution: "json5@npm:2.2.1" + version: 2.2.2 + resolution: "json5@npm:2.2.2" bin: json5: lib/cli.js - checksum: 74b8a23b102a6f2bf2d224797ae553a75488b5adbaee9c9b6e5ab8b510a2fc6e38f876d4c77dea672d4014a44b2399e15f2051ac2b37b87f74c0c7602003543b + checksum: 9a878d66b72157b073cf0017f3e5d93ec209fa5943abcb38d37a54b208917c166bd473c26a24695e67a016ce65759aeb89946592991f8f9174fb96c8e2492683 languageName: node linkType: hard @@ -5999,12 +6007,12 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.26.4": - version: 0.26.7 - resolution: "magic-string@npm:0.26.7" +"magic-string@npm:^0.27.0": + version: 0.27.0 + resolution: "magic-string@npm:0.27.0" dependencies: - sourcemap-codec: ^1.4.8 - checksum: 89b0d60cbb32bbf3d1e23c46ea93db082d18a8230b972027aecb10a40bba51be519ecce0674f995571e3affe917b76b09f59d8dbc9a1b2c9c4102a2b6e8a2b01 + "@jridgewell/sourcemap-codec": ^1.4.13 + checksum: 273faaa50baadb7a2df6e442eac34ad611304fc08fe16e24fe2e472fd944bfcb73ffb50d2dc972dc04e92784222002af46868cb9698b1be181c81830fd95a13e languageName: node linkType: hard @@ -7012,9 +7020,9 @@ __metadata: linkType: hard "node-releases@npm:^2.0.6": - version: 2.0.7 - resolution: "node-releases@npm:2.0.7" - checksum: d1c5af091d788b7f9dfce5aa77cbf76c28e8e326b891fe64a05b96943a90cd6ba19eae94ef32777c23f5898a7b00d9cf8266adba33d61ebe6611cca74ccfc0b1 + version: 2.0.8 + resolution: "node-releases@npm:2.0.8" + checksum: b1ab02c0d5d8e081bf9537232777a7a787dc8fef07f70feabe70a344599b220fe16462f746ac30f3eed5a58549445ad69368964d12a1f8b3b764f6caab7ba34a languageName: node linkType: hard @@ -8091,8 +8099,8 @@ __metadata: linkType: hard "rollup@npm:^3.2.3": - version: 3.7.4 - resolution: "rollup@npm:3.7.4" + version: 3.7.5 + resolution: "rollup@npm:3.7.5" dependencies: fsevents: ~2.3.2 dependenciesMeta: @@ -8100,7 +8108,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 0f2478d740527cdc8f4d81a5676221b0ec9495147cae0e6643627f6ac3ac63bf92385e26936ed8ef9ed06678a2ff7d8398489a235581c590f149149a003870d8 + checksum: 772f85e9f12c83091cbe8ef31dc563198566cfe536dc8099dd6d4e372daa370f9d455cc42c7993d22b02521e25d53733df7e98d2a993e5a22bf11b2591de4e2d languageName: node linkType: hard