From 9b6ce926126f9a4483932f6e1be0ef32ed81e474 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 31 Oct 2022 09:51:18 +0100 Subject: [PATCH 01/54] Update diaglogflow.js --- adapter/diaglogflow.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapter/diaglogflow.js b/adapter/diaglogflow.js index c80b034..88a24c1 100644 --- a/adapter/diaglogflow.js +++ b/adapter/diaglogflow.js @@ -56,7 +56,7 @@ const detectIntent = async (queryText) => { const { fields } = parsePayload.payload media = fields.media.stringValue || null } - const customPayload = parsePayload['payload'] + const customPayload = parsePayload ? parsePayload['payload'] : null const parseData = { replyMessage: queryResult.fulfillmentText, From 8a4f134327ccb608f2b03a5cd937beab79a96f27 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 19 Nov 2022 11:08:51 +0100 Subject: [PATCH 02/54] Update latest --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index df28d5d..42d881d 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "qrcode-terminal": "^0.12.0", "socket.io": "^4.5.1", "stormdb": "^0.6.0", - "whatsapp-web.js": "^1.18.0", + "whatsapp-web.js": "latest", "xlsx": "^0.18.5" }, "devDependencies": { From f21a58b6ffefc631cb7fbc413e66ed2b1eb753bb Mon Sep 17 00:00:00 2001 From: jzvi12 Date: Fri, 2 Dec 2022 10:16:16 -0500 Subject: [PATCH 03/54] Update README.md --- README.md | 47 ++++------------------------------------------- 1 file changed, 4 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 455d71e..8be6f57 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,4 @@ ## Chatbot Whatsapp (OpenSource) -#### Actualizado Abril 2022 - -El siguiente proyecto se realizó con fines educativos para el canal de [Youtube (Leifer Mendez)](https://www.youtube.com/channel/UCgrIGp5QAnC0J8LfNJxDRDw?sub_confirmation=1) donde aprendemos a crear y implementar un chatbot increíble usando [node.js](https://codigoencasa.com/tag/nodejs/) además le agregamos inteligencia artificial gracias al servicio de __dialogflow__. - -[![Video](https://i.giphy.com/media/OBDi3CXC83WkNeLEZP/giphy.webp)](https://youtu.be/5lEMCeWEJ8o) - -### ATENCION 🔴 -> 💥💥 Si te aparece el Error Multi-device es porque tienes la cuenta de whatsapp afiliada al modo "BETA de Multi dispositivo" por el momento no se tiene soporte para esas personas si tu quieres hacer uso de este __BOT__ debes de salir del modo BETA y intentarlo de la manera tradicional - -> El core de whatsapp esta en constante actualizaciones por lo cual siempre revisa la ultima fecha de la actualizacion -> [VER](https://github.com/leifermendez/bot-whatsapp/commits/main) - -### Busco colaboradores ⭐ -Hola amigos me gusta mucho este proyecto pero por cuestiones de tiempo se me dificulta mantener las actualizaciones si alguno quieres participar en el proyecto escribeme a leifer.contacto@gmail.com - -#### Acceso rápido -> Si tienes una cuenta en __heroku__ puedes desplegar este proyecto con (1 click) - -[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/leifermendez/bot-whatsapp) - -> Comprarme un cafe! - -[![Comprar](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/leifermendez) #### Actualización @@ -81,7 +58,6 @@ await sendMediaVoiceNote(client, from, 'PTT-20220223-WA0000.opus') ## Instruciones __Descargar o Clonar repositorio__ -![](https://i.imgur.com/dSpUbFz.png) __Usas ¿Ubuntu / Linux?__ > Asegurate de instalar los siguientes paquetes @@ -93,9 +69,9 @@ sudo apt install -y gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups __Instalar dependencias (npm install)__ > Ubicate en le directorio que descargaste y via consola o terminal ejecuta el siguiente comando -`npm install` - -![](https://i.imgur.com/BJuMjGR.png) +``` +npm i +``` __Configurar .env__ > Con el editor de texto crea un archivo `.env` el cual debes de guiarte del archivo `.env.example` @@ -114,21 +90,14 @@ SQL_PASS= SQL_DATABASE= ``` -![](https://i.imgur.com/9poNnW0.png) - __Ejecutar el script__ > Ubicate en le directorio que descargaste y via consola o terminal ejecuta el siguiente comando `npm run start` -![](https://i.imgur.com/eMkBkuJ.png) - __Whatsapp en tu celular__ > Ahora abre la aplicación de Whatsapp en tu dispositivo y escanea el código QR -Visitar la pagina -`http://localhost:3000/qr` - -![](https://i.imgur.com/Q3JEDlP.png) +Tambien puedes visitar la pagina http://127.0.0.1:3000/qr __Listo 😎__ > Cuando sale este mensaje tu BOT está __listo__ para trabajar! @@ -145,11 +114,3 @@ __Listo 😎__ > Ahora deberías obtener un arespuesta por parte del BOT como la siguiente, ademas de esto tambien se crea un archivo excel con el historial de conversación con el número de tu cliente - -![](https://i.imgur.com/lrMLgR8.png) -![](https://i.imgur.com/UYcoUSV.png) - -## Preguntar al BOT -> Puedes interactuar con el bot ejemplo escribele __hola__ y el bot debe responderte! - -![](https://i.imgur.com/cNAS51I.png) From 1884832192e00ea4b6a70bd6660cb57a24ad3e50 Mon Sep 17 00:00:00 2001 From: jzvi12 Date: Mon, 5 Dec 2022 19:10:41 -0500 Subject: [PATCH 04/54] fixed dialogflow session id --- adapter/diaglogflow.js | 12 +++++------ adapter/index.js | 4 ++-- app.js | 47 +++++++++++++++++++++--------------------- controllers/flows.js | 4 ++-- package-lock.json | 42 +++++++------------------------------ package.json | 2 +- 6 files changed, 42 insertions(+), 69 deletions(-) diff --git a/adapter/diaglogflow.js b/adapter/diaglogflow.js index 88a24c1..1d0d9a8 100644 --- a/adapter/diaglogflow.js +++ b/adapter/diaglogflow.js @@ -1,6 +1,6 @@ const dialogflow = require('@google-cloud/dialogflow'); const fs = require('fs') -const crypto = require('crypto'); + /** * Debes de tener tu archivo con el nombre "chatbot-account.json" en la raíz del proyecto */ @@ -30,9 +30,9 @@ const checkFileCredentials = () => { // Detect intent method -const detectIntent = async (queryText) => { +const detectIntent = async (queryText, waPhoneNumber) => { let media = null; - const sessionId = KEEP_DIALOG_FLOW ? 1 : crypto.randomUUID(); + const sessionId = KEEP_DIALOG_FLOW ? 1 : waPhoneNumber; const sessionPath = sessionClient.projectAgentSessionPath(PROJECID, sessionId); const languageCode = process.env.LANGUAGE const request = { @@ -66,12 +66,12 @@ const detectIntent = async (queryText) => { return parseData } -const getDataIa = (message = '', cb = () => { }) => { - detectIntent(message).then((res) => { +const getDataIa = (message = '', sessionId = '', cb = () => { }) => { + detectIntent(message, sessionId).then((res) => { cb(res) }) } checkFileCredentials(); -module.exports = { getDataIa } +module.exports = { getDataIa } \ No newline at end of file diff --git a/adapter/index.js b/adapter/index.js index 6f06561..e6e5d74 100644 --- a/adapter/index.js +++ b/adapter/index.js @@ -52,13 +52,13 @@ const reply = (step) => new Promise((resolve, reject) => { } }) -const getIA = (message) => new Promise((resolve, reject) => { +const getIA = (message, sessionId) => new Promise((resolve, reject) => { /** * Si usas dialogflow */ if (process.env.DATABASE === 'dialogflow') { let resData = { replyMessage: '', media: null, trigger: null } - getDataIa(message,(dt) => { + getDataIa(message, sessionId, (dt) => { resData = { ...resData, ...dt } resolve(resData) }) diff --git a/app.js b/app.js index 755b924..36580c1 100644 --- a/app.js +++ b/app.js @@ -6,7 +6,7 @@ const fs = require('fs'); const express = require('express'); const cors = require('cors') const qrcode = require('qrcode-terminal'); -const { Client,LocalAuth } = require('whatsapp-web.js'); +const { Client, LocalAuth } = require('whatsapp-web.js'); const mysqlConnection = require('./config/mysql') const { middlewareClient } = require('./middleware/client') const { generateImage, cleanNumber, checkEnvFile, createClient, isValidNumber } = require('./controllers/handle') @@ -30,7 +30,7 @@ app.use('/', require('./routes/web')) const listenMessage = () => client.on('message', async msg => { const { from, body, hasMedia } = msg; - if(!isValidNumber(from)){ + if (!isValidNumber(from)) { return } @@ -39,7 +39,7 @@ const listenMessage = () => client.on('message', async msg => { return } message = body.toLowerCase(); - console.log('BODY',message) + console.log('BODY', message) const number = cleanNumber(from) await readChat(number, message) @@ -56,8 +56,8 @@ const listenMessage = () => client.on('message', async msg => { */ if (process.env.DATABASE === 'dialogflow') { - if(!message.length) return; - const response = await bothResponse(message); + if (!message.length) return; + const response = await bothResponse(message, number); await sendMessage(client, from, response.replyMessage); if (response.media) { sendMedia(client, from, response.media); @@ -91,7 +91,7 @@ const listenMessage = () => client.on('message', async msg => { await sendMessage(client, from, response.replyMessage, response.trigger); - if(response.hasOwnProperty('actions')){ + if (response.hasOwnProperty('actions')) { const { actions } = response; await sendMessageButton(client, from, null, actions); return @@ -116,7 +116,7 @@ const listenMessage = () => client.on('message', async msg => { /** * Si quieres enviar botones */ - if(response.hasOwnProperty('actions')){ + if (response.hasOwnProperty('actions')) { const { actions } = response; await sendMessageButton(client, from, null, actions); } @@ -127,33 +127,33 @@ const listenMessage = () => client.on('message', async msg => { client = new Client({ - authStrategy: new LocalAuth(), - puppeteer: { headless: true } - }); - + authStrategy: new LocalAuth(), + puppeteer: { headless: true } +}); + client.on('qr', qr => generateImage(qr, () => { - qrcode.generate(qr, { small: true }); - - console.log(`Ver QR http://localhost:${port}/qr`) - socketEvents.sendQR(qr) + qrcode.generate(qr, { small: true }); + + console.log(`Ver QR http://localhost:${port}/qr`) + socketEvents.sendQR(qr) })) client.on('ready', (a) => { - connectionReady() - listenMessage() - // socketEvents.sendStatus(client) + connectionReady() + listenMessage() + // socketEvents.sendStatus(client) }); client.on('auth_failure', (e) => { - // console.log(e) - // connectionLost() + // console.log(e) + // connectionLost() }); client.on('authenticated', () => { - console.log('AUTHENTICATED'); + console.log('AUTHENTICATED'); }); - client.initialize(); +client.initialize(); @@ -168,5 +168,4 @@ if (process.env.DATABASE === 'mysql') { server.listen(port, () => { console.log(`El server esta listo por el puerto ${port}`); }) -checkEnvFile(); - +checkEnvFile(); \ No newline at end of file diff --git a/controllers/flows.js b/controllers/flows.js index 0e769cd..b0fc9d3 100644 --- a/controllers/flows.js +++ b/controllers/flows.js @@ -15,8 +15,8 @@ const responseMessages = async (step) => { return data } -const bothResponse = async (message) => { - const data = await getIA(message) +const bothResponse = async (message, sessionId) => { + const data = await getIA(message, sessionId) if(data && data.media){ const file = await saveExternalFile(data.media) return {...data,...{media:file}} diff --git a/package-lock.json b/package-lock.json index 5e7dbf1..589ad0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,13 +22,12 @@ "qrcode-terminal": "^0.12.0", "socket.io": "^4.5.1", "stormdb": "^0.6.0", - "whatsapp-web.js": "^1.18.0", + "whatsapp-web.js": "^1.18.4", "xlsx": "^0.18.5" }, "devDependencies": { "pm2": "^5.2.0", - "prettier": "2.7.1", - "rollup": "^3.2.3" + "prettier": "2.7.1" }, "engines": { "node": "16.x" @@ -4242,22 +4241,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rollup": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.2.3.tgz", - "integrity": "sha512-qfadtkY5kl0F5e4dXVdj2D+GtOdifasXHFMiL1SMf9ADQDv5Eti6xReef9FKj+iQPR2pvtqWna57s/PjARY4fg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/run-series": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", @@ -5039,9 +5022,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatsapp-web.js": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/whatsapp-web.js/-/whatsapp-web.js-1.18.0.tgz", - "integrity": "sha512-3cCW28/w7llZmTgiO9osumaopOuBBduvyuW02yfy3q9Rz4Wq9Oe1dRedE/kkq764zB8AZcuTs0tE8OKTq2Zobw==", + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/whatsapp-web.js/-/whatsapp-web.js-1.18.4.tgz", + "integrity": "sha512-Dqu6Q37tDDAcVJ44aMdRE76sI/9rBCUG+NTz1Kxh2w4obX2WtpoRetilxqgx1r4+pFUl58Lf21wGOEwPZ1pT/A==", "dependencies": { "@pedroslopez/moduleraid": "^5.0.2", "fluent-ffmpeg": "^2.1.2", @@ -8598,15 +8581,6 @@ "glob": "^7.1.3" } }, - "rollup": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.2.3.tgz", - "integrity": "sha512-qfadtkY5kl0F5e4dXVdj2D+GtOdifasXHFMiL1SMf9ADQDv5Eti6xReef9FKj+iQPR2pvtqWna57s/PjARY4fg==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, "run-series": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", @@ -9193,9 +9167,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "whatsapp-web.js": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/whatsapp-web.js/-/whatsapp-web.js-1.18.0.tgz", - "integrity": "sha512-3cCW28/w7llZmTgiO9osumaopOuBBduvyuW02yfy3q9Rz4Wq9Oe1dRedE/kkq764zB8AZcuTs0tE8OKTq2Zobw==", + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/whatsapp-web.js/-/whatsapp-web.js-1.18.4.tgz", + "integrity": "sha512-Dqu6Q37tDDAcVJ44aMdRE76sI/9rBCUG+NTz1Kxh2w4obX2WtpoRetilxqgx1r4+pFUl58Lf21wGOEwPZ1pT/A==", "requires": { "@pedroslopez/moduleraid": "^5.0.2", "archiver": "^5.3.1", diff --git a/package.json b/package.json index 42d881d..20a8d94 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "qrcode-terminal": "^0.12.0", "socket.io": "^4.5.1", "stormdb": "^0.6.0", - "whatsapp-web.js": "latest", + "whatsapp-web.js": "^1.18.4", "xlsx": "^0.18.5" }, "devDependencies": { From b3c13d5f983a8ca4168b9a9e7adef5e431c6bf30 Mon Sep 17 00:00:00 2001 From: HKong31 <113340082+HKong31@users.noreply.github.com> Date: Wed, 7 Dec 2022 07:52:13 -0400 Subject: [PATCH 05/54] DialogFlow botones por payload --- adapter/diaglogflow.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/adapter/diaglogflow.js b/adapter/diaglogflow.js index 1d0d9a8..9a4586c 100644 --- a/adapter/diaglogflow.js +++ b/adapter/diaglogflow.js @@ -1,5 +1,6 @@ const dialogflow = require('@google-cloud/dialogflow'); const fs = require('fs') +const {struct} = require('pb-util'); /** * Debes de tener tu archivo con el nombre "chatbot-account.json" en la raíz del proyecto @@ -32,6 +33,7 @@ const checkFileCredentials = () => { // Detect intent method const detectIntent = async (queryText, waPhoneNumber) => { let media = null; + let actions = null; const sessionId = KEEP_DIALOG_FLOW ? 1 : waPhoneNumber; const sessionPath = sessionClient.projectAgentSessionPath(PROJECID, sessionId); const languageCode = process.env.LANGUAGE @@ -54,6 +56,7 @@ const detectIntent = async (queryText, waPhoneNumber) => { // console.log(singleResponse) if (parsePayload && parsePayload.payload) { const { fields } = parsePayload.payload + actions = struct.decode(fields.actions.structValue) || null; media = fields.media.stringValue || null } const customPayload = parsePayload ? parsePayload['payload'] : null @@ -61,6 +64,7 @@ const detectIntent = async (queryText, waPhoneNumber) => { const parseData = { replyMessage: queryResult.fulfillmentText, media, + actions, trigger: null } return parseData @@ -74,4 +78,4 @@ const getDataIa = (message = '', sessionId = '', cb = () => { }) => { checkFileCredentials(); -module.exports = { getDataIa } \ No newline at end of file +module.exports = { getDataIa } From f88607c2c2945553ce46a6a3ec688219d597ffd6 Mon Sep 17 00:00:00 2001 From: HKong31 <113340082+HKong31@users.noreply.github.com> Date: Wed, 7 Dec 2022 08:02:00 -0400 Subject: [PATCH 06/54] DialogFlow botones por payload Evita crash si el mensaje excede los 256 caracteres + botones por el payload de DialogFlow --- app.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index 36580c1..77d773a 100644 --- a/app.js +++ b/app.js @@ -57,8 +57,12 @@ const listenMessage = () => client.on('message', async msg => { if (process.env.DATABASE === 'dialogflow') { if (!message.length) return; - const response = await bothResponse(message, number); + const response = await bothResponse(message.substring(256,-1), number); await sendMessage(client, from, response.replyMessage); + if(response.actions){ + await sendMessageButton(client, from, null, response.actions); + return + } if (response.media) { sendMedia(client, from, response.media); } @@ -168,4 +172,4 @@ if (process.env.DATABASE === 'mysql') { server.listen(port, () => { console.log(`El server esta listo por el puerto ${port}`); }) -checkEnvFile(); \ No newline at end of file +checkEnvFile(); From 2d6c1879cedcc47a936e21b44c255756fff32849 Mon Sep 17 00:00:00 2001 From: HKong31 <113340082+HKong31@users.noreply.github.com> Date: Wed, 7 Dec 2022 08:18:32 -0400 Subject: [PATCH 07/54] DialogFlow botones por payload --- package-lock.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/package-lock.json b/package-lock.json index 589ad0f..af9632e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "mime-db": "^1.52.0", "moment": "^2.29.4", "mysql": "^2.18.1", + "pb-util": "^1.0.3", "qr-image": "^3.2.0", "qrcode-terminal": "^0.12.0", "socket.io": "^4.5.1", @@ -3415,6 +3416,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/pb-util": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pb-util/-/pb-util-1.0.3.tgz", + "integrity": "sha512-8+weUH2YEYnPf5sTpZ3q7Drq41tSEL8vDSU96/CzSvu2qrbspbjbbuKLjHocAQpmyMbICTcvovVl3cETwxwIkQ==" + }, "node_modules/peek-readable": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", @@ -7965,6 +7971,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "pb-util": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pb-util/-/pb-util-1.0.3.tgz", + "integrity": "sha512-8+weUH2YEYnPf5sTpZ3q7Drq41tSEL8vDSU96/CzSvu2qrbspbjbbuKLjHocAQpmyMbICTcvovVl3cETwxwIkQ==" + }, "peek-readable": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", From b24c005e3e2d406ee43508ed4a9ae95810ba1b00 Mon Sep 17 00:00:00 2001 From: HKong31 <113340082+HKong31@users.noreply.github.com> Date: Wed, 7 Dec 2022 08:20:30 -0400 Subject: [PATCH 08/54] DialogFlow botones por payload --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 20a8d94..fcb275f 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "mime-db": "^1.52.0", "moment": "^2.29.4", "mysql": "^2.18.1", + "pb-util": "^1.0.3", "qr-image": "^3.2.0", "qrcode-terminal": "^0.12.0", "socket.io": "^4.5.1", From babff11c70df7b05e104ca0e08d13f8938fa5064 Mon Sep 17 00:00:00 2001 From: HKong31 <113340082+HKong31@users.noreply.github.com> Date: Wed, 7 Dec 2022 08:33:14 -0400 Subject: [PATCH 09/54] Fix crash when voice message recieved Fix crash si recibe nota de voz --- controllers/save.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/controllers/save.js b/controllers/save.js index 92555e0..3adfda0 100644 --- a/controllers/save.js +++ b/controllers/save.js @@ -8,11 +8,17 @@ const fs = require('fs') const saveMedia = (media) => { - const extensionProcess = mimeDb[media.mimetype] - const ext = extensionProcess.extensions[0] + const extensionProcess = mimeDb[media.mimetype]; + let ext; + if (!extensionProcess) { + const fileType = media.mimetype.split('/'); + ext = fileType[1].split(';')[0]; + } else { + ext = extensionProcess.extensions[0]; + } fs.writeFile(`./media/${Date.now()}.${ext}`, media.data, { encoding: 'base64' }, function (err) { console.log('** Archivo Media Guardado **'); }); } -module.exports = {saveMedia} \ No newline at end of file +module.exports = {saveMedia} From e8aed880d8c9b89e67df52c99a88309be5f68a13 Mon Sep 17 00:00:00 2001 From: HKong31 <113340082+HKong31@users.noreply.github.com> Date: Wed, 7 Dec 2022 12:19:06 -0400 Subject: [PATCH 10/54] =?UTF-8?q?Retraso=20en=20el=20env=C3=ADo=20de=20bot?= =?UTF-8?q?ones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modificado para que los botones sean enviados después del mensaje --- controllers/send.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/controllers/send.js b/controllers/send.js index d081381..5cda9ac 100644 --- a/controllers/send.js +++ b/controllers/send.js @@ -69,12 +69,14 @@ const sendMessage = async (client, number = null, text = null, trigger = null) = * @param {*} number */ const sendMessageButton = async (client, number = null, text = null, actionButtons) => { + setTimeout(async () => { number = cleanNumber(number) const { title = null, message = null, footer = null, buttons = [] } = actionButtons; let button = new Buttons(message,[...buttons], title, footer); client.sendMessage(number, button); - + await readChat(number, message, actionButtons) console.log(`⚡⚡⚡ Enviando mensajes....`); + }, DELAY_TIME) } From 33490dc737e80b52ea163bd19c61555e9a9ea438 Mon Sep 17 00:00:00 2001 From: jzvi12 Date: Thu, 8 Dec 2022 16:57:18 -0500 Subject: [PATCH 11/54] fixed typo in controllers/send.js --- controllers/send.js | 4 ++-- package-lock.json | 13 ++++++------- package.json | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/controllers/send.js b/controllers/send.js index 5cda9ac..8ec66a4 100644 --- a/controllers/send.js +++ b/controllers/send.js @@ -16,7 +16,7 @@ const { saveMessage } = require('../adapter') */ const sendMedia = (client, number = null, fileName = null) => { - if(!client) return cosnole.error("El objeto cliente no está definido."); + if(!client) return console.error("El objeto cliente no está definido."); try { number = cleanNumber(number || 0) const file = `${DIR_MEDIA}/${fileName}`; @@ -36,7 +36,7 @@ const sendMedia = (client, number = null, fileName = null) => { */ const sendMediaVoiceNote = (client, number = null, fileName = null) => { - if(!client) return cosnole.error("El objeto cliente no está definido."); + if(!client) return console.error("El objeto cliente no está definido."); try { number = cleanNumber(number || 0) const file = `${DIR_MEDIA}/${fileName}`; diff --git a/package-lock.json b/package-lock.json index af9632e..cf333c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "qrcode-terminal": "^0.12.0", "socket.io": "^4.5.1", "stormdb": "^0.6.0", - "whatsapp-web.js": "^1.18.4", + "whatsapp-web.js": "github:pedroslopez/whatsapp-web.js#fix-buttons-list", "xlsx": "^0.18.5" }, "devDependencies": { @@ -5028,9 +5028,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatsapp-web.js": { - "version": "1.18.4", - "resolved": "https://registry.npmjs.org/whatsapp-web.js/-/whatsapp-web.js-1.18.4.tgz", - "integrity": "sha512-Dqu6Q37tDDAcVJ44aMdRE76sI/9rBCUG+NTz1Kxh2w4obX2WtpoRetilxqgx1r4+pFUl58Lf21wGOEwPZ1pT/A==", + "version": "1.18.3-alpha.0", + "resolved": "git+ssh://git@github.com/pedroslopez/whatsapp-web.js.git#c8fe80635afc6fba9913577a3097e8bf1f557a0b", + "license": "Apache-2.0", "dependencies": { "@pedroslopez/moduleraid": "^5.0.2", "fluent-ffmpeg": "^2.1.2", @@ -9178,9 +9178,8 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "whatsapp-web.js": { - "version": "1.18.4", - "resolved": "https://registry.npmjs.org/whatsapp-web.js/-/whatsapp-web.js-1.18.4.tgz", - "integrity": "sha512-Dqu6Q37tDDAcVJ44aMdRE76sI/9rBCUG+NTz1Kxh2w4obX2WtpoRetilxqgx1r4+pFUl58Lf21wGOEwPZ1pT/A==", + "version": "git+ssh://git@github.com/pedroslopez/whatsapp-web.js.git#c8fe80635afc6fba9913577a3097e8bf1f557a0b", + "from": "whatsapp-web.js@github:pedroslopez/whatsapp-web.js#fix-buttons-list", "requires": { "@pedroslopez/moduleraid": "^5.0.2", "archiver": "^5.3.1", diff --git a/package.json b/package.json index fcb275f..147e1c8 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "qrcode-terminal": "^0.12.0", "socket.io": "^4.5.1", "stormdb": "^0.6.0", - "whatsapp-web.js": "^1.18.4", + "whatsapp-web.js": "github:pedroslopez/whatsapp-web.js#fix-buttons-list", "xlsx": "^0.18.5" }, "devDependencies": { From 2858e910dcbc0a92a2d886b8e85256d919ee1872 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sun, 11 Dec 2022 22:20:49 +0100 Subject: [PATCH 12/54] Create LICENSE.md --- LICENSE.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..959d8ec --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Leifer Mendez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 5303dd7d257da8b8062df732edfac0960b83caa6 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 12 Dec 2022 00:44:58 +0100 Subject: [PATCH 13/54] Create FUNDING.yml --- .github/FUNDING.yml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..1fde58c --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +patreon: leifermendez +custom: "https://www.buymeacoffee.com/leifermendez" From ec32dc429f005940becd3e4c279691188ed7a157 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 12 Dec 2022 16:42:12 +0100 Subject: [PATCH 14/54] Create CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 128 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..05743b3 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +leifer.contacto@gmail.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. From c2a6c6872d8657df467fe3c1abb601e1aaf05278 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 07:59:13 +0100 Subject: [PATCH 15/54] Create PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..b0feb3a --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,23 @@ +# Cual version del BOT es? + +- [ ] v2 +- [ ] v1 + + +# Que tipo de ISSUE es? + +- [ ] Mejoras +- [ ] Bug +- [ ] Docs / tests + +# Description + +Por favor agrega una descripción de tu problema para tener más contexto y poder ayudar más rápido. Si es de ayuda puedes usar plataformar como [https://www.loom.com/](https://www.loom.com/) para grabar un video. + + +> Forma parte de este proyecto. + +- [Discord](https://link.codigoencasa.com/DISCORD) +- [Twitter](https://twitter.com/leifermendez) +- [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) +- [Telegram](https://t.me/leifermendez) From a43444bb3e92956132caadf69ddba3edec6a5596 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 08:02:08 +0100 Subject: [PATCH 16/54] Create bug.yml --- .github/ISSUE_TEMPLATE/bug.yml | 66 ++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug.yml diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 0000000..a48f175 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,66 @@ +name: 🐞 Bug Report +description: Something does not work or is flaky! let us know! +labels: [bug, triage] +title: '[🐞]' +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + + - type: dropdown + id: component + attributes: + label: Which component is affected? + options: + - Qwik Runtime + - Qwik Rollup / Vite plugin + - Qwik Optimizer (rust) + - Qwik React + - Qwik City (routing) + - Starters / CLI + validations: + required: true + + - type: textarea + id: description + attributes: + description: 'A clear and concise description of what you expected to happen instead. If you intend to submit a PR for this issue, tell us in the description. Thanks!' + label: Describe the bug + placeholder: I am doing ... What I expect is ... What actually happening is ... + + validations: + required: true + + - type: input + id: reproduction + attributes: + label: Reproduction + description: Please provide a link via [qwik.new](https://qwik.new/) or a link to a repo that can reproduce the problem you ran into. `npm create qwik@latest` can be used as a starter template. A [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) is required ([Why?](https://antfu.me/posts/why-reproductions-are-required)). If a report is vague (e.g. just a generic error message) and has no reproduction, it will receive a "need reproduction" label. If no reproduction is provided after 3 days, it will be auto-closed. + placeholder: Reproduction URL + validations: + required: true + + - type: textarea + id: reproduction-steps + attributes: + label: Steps to reproduce + description: Please provide any reproduction steps that may need to be described. E.g. if it happens only when running the dev or build script make sure it's clear which one to use. + placeholder: Run `npm install` followed by `npm run dev` + + - type: textarea + id: system-info + attributes: + label: System Info + description: Output of `npx envinfo --system --npmPackages '{vite,@builder.io/*}' --binaries --browsers` + render: shell + placeholder: System, Binaries, Browsers + validations: + required: true + + - type: textarea + id: additional_information + attributes: + label: Additional Information + validations: + required: false From 851052b3d2f20742c449baa14418d02d84145696 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 10:12:21 +0100 Subject: [PATCH 17/54] Update bug.yml --- .github/ISSUE_TEMPLATE/bug.yml | 51 +++++++++++----------------------- 1 file changed, 16 insertions(+), 35 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index a48f175..098e9da 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -1,33 +1,31 @@ -name: 🐞 Bug Report -description: Something does not work or is flaky! let us know! +name: 🐛 Reporte Bug +description: Algo no va bien?. Hazlo saber labels: [bug, triage] -title: '[🐞]' +title: '[🐛]' body: - type: markdown attributes: value: | - Thanks for taking the time to fill out this bug report! + Gracias por tomarte el tiempo de reportar este problema - type: dropdown id: component attributes: - label: Which component is affected? + label: ¿Sobre que afecta? options: - - Qwik Runtime - - Qwik Rollup / Vite plugin - - Qwik Optimizer (rust) - - Qwik React - - Qwik City (routing) - - Starters / CLI + - Flujo de palabras (Flow) + - DialogFlow + - Base de datos + - Otro validations: required: true - type: textarea id: description attributes: - description: 'A clear and concise description of what you expected to happen instead. If you intend to submit a PR for this issue, tell us in the description. Thanks!' - label: Describe the bug - placeholder: I am doing ... What I expect is ... What actually happening is ... + description: 'Trata de ser lo más claro posible, de esa manera podemos entender el contexto de tu problema y darte una mejor solución' + label: Describe tu problema + placeholder: Yo tengo un problema.... validations: required: true @@ -35,32 +33,15 @@ body: - type: input id: reproduction attributes: - label: Reproduction - description: Please provide a link via [qwik.new](https://qwik.new/) or a link to a repo that can reproduce the problem you ran into. `npm create qwik@latest` can be used as a starter template. A [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) is required ([Why?](https://antfu.me/posts/why-reproductions-are-required)). If a report is vague (e.g. just a generic error message) and has no reproduction, it will receive a "need reproduction" label. If no reproduction is provided after 3 days, it will be auto-closed. + label: Reproducir error + description: __(Recomendación)__ trata de grabar un video puedes usar algunas de las siguientes herramientas [https://www.vidyard.com/](https://www.vidyard.com/) [https://www.loom.com/](https://www.loom.com/) y en lo posbile apoyate en [https://stackblitz.com/](https://stackblitz.com/) para compartir el código de ser necesario placeholder: Reproduction URL validations: - required: true - - - type: textarea - id: reproduction-steps - attributes: - label: Steps to reproduce - description: Please provide any reproduction steps that may need to be described. E.g. if it happens only when running the dev or build script make sure it's clear which one to use. - placeholder: Run `npm install` followed by `npm run dev` - - - type: textarea - id: system-info - attributes: - label: System Info - description: Output of `npx envinfo --system --npmPackages '{vite,@builder.io/*}' --binaries --browsers` - render: shell - placeholder: System, Binaries, Browsers - validations: - required: true + required: false - type: textarea id: additional_information attributes: - label: Additional Information + label: Información Adicional validations: required: false From 29fd94a0e1b9d0767b95fc9cbf9bdba76d81744a Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 10:18:07 +0100 Subject: [PATCH 18/54] Update bug.yml --- .github/ISSUE_TEMPLATE/bug.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 098e9da..2d2f5a6 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -7,6 +7,17 @@ body: attributes: value: | Gracias por tomarte el tiempo de reportar este problema + + - type: dropdown + id: version + attributes: + label: ¿Que versión estas usando? + description: '__INFO:__ Recuerda que puedes consultar dudas directamente en [discord](https://link.codigoencasa.com/DISCORD)' + options: + - v2 + - v1 + validations: + required: true - type: dropdown id: component @@ -35,7 +46,7 @@ body: attributes: label: Reproducir error description: __(Recomendación)__ trata de grabar un video puedes usar algunas de las siguientes herramientas [https://www.vidyard.com/](https://www.vidyard.com/) [https://www.loom.com/](https://www.loom.com/) y en lo posbile apoyate en [https://stackblitz.com/](https://stackblitz.com/) para compartir el código de ser necesario - placeholder: Reproduction URL + placeholder: URL video o stackblitz validations: required: false From 4819dfebda20d2021b5769472320c92d120a18f7 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 10:23:24 +0100 Subject: [PATCH 19/54] Create config.yml --- .github/ISSUE_TEMPLATE/config.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..7590616 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,4 @@ +contact_links: + - name: 🤔 Core Team + url: https://link.codigoencasa.com/DISCORD + about: Si quieres formar parte del CoreTeam, patrocinar el proyecto o propuesta profesionales From 3e0781fde6e9eae2e81523dbff38f3ee7fe64c7e Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 10:26:27 +0100 Subject: [PATCH 20/54] Update PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index b0feb3a..8278042 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,18 +1,12 @@ -# Cual version del BOT es? - -- [ ] v2 -- [ ] v1 - - -# Que tipo de ISSUE es? +# Que tipo de Pull Request es? - [ ] Mejoras - [ ] Bug - [ ] Docs / tests -# Description +# Descripción -Por favor agrega una descripción de tu problema para tener más contexto y poder ayudar más rápido. Si es de ayuda puedes usar plataformar como [https://www.loom.com/](https://www.loom.com/) para grabar un video. +Por favor agrega una descripción de tu aporte para tener más contexto y poder avanzar más rápido. Si es de ayuda puedes usar plataformar como [https://www.loom.com/](https://www.loom.com/) para grabar un video. > Forma parte de este proyecto. From b8ea8283ebcc1652dfd03f5aaf08bbf933f29626 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 10:39:17 +0100 Subject: [PATCH 21/54] Create auto-pr-issue.yml --- .github/auto-pr-issue.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/auto-pr-issue.yml diff --git a/.github/auto-pr-issue.yml b/.github/auto-pr-issue.yml new file mode 100644 index 0000000..e36a213 --- /dev/null +++ b/.github/auto-pr-issue.yml @@ -0,0 +1,13 @@ +name: 'Close stale issues and PRs' +on: + schedule: + - cron: '30 1 * * *' + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v6 + with: + stale-issue-message: 'Message to comment on stale issues. If none provided, will not mark issues stale' + stale-pr-message: 'Message to comment on stale PRs. If none provided, will not mark PRs stale' From fbaef0f60c89d3b4273ddf17ccf3b41acc2953c8 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 22:43:45 +0100 Subject: [PATCH 22/54] Update auto-pr-issue.yml --- .github/auto-pr-issue.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/auto-pr-issue.yml b/.github/auto-pr-issue.yml index e36a213..de858a9 100644 --- a/.github/auto-pr-issue.yml +++ b/.github/auto-pr-issue.yml @@ -1,7 +1,7 @@ name: 'Close stale issues and PRs' on: schedule: - - cron: '30 1 * * *' + - cron: '55 22 * * *' jobs: stale: From 407e9065e7022610e7209a04534ffc18589c7bdb Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 23:07:26 +0100 Subject: [PATCH 23/54] Update and rename auto-pr-issue.yml to stale-issues.yml --- .github/auto-pr-issue.yml | 13 ------------- .github/stale-issues.yml | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 13 deletions(-) delete mode 100644 .github/auto-pr-issue.yml create mode 100644 .github/stale-issues.yml diff --git a/.github/auto-pr-issue.yml b/.github/auto-pr-issue.yml deleted file mode 100644 index de858a9..0000000 --- a/.github/auto-pr-issue.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: 'Close stale issues and PRs' -on: - schedule: - - cron: '55 22 * * *' - -jobs: - stale: - runs-on: ubuntu-latest - steps: - - uses: actions/stale@v6 - with: - stale-issue-message: 'Message to comment on stale issues. If none provided, will not mark issues stale' - stale-pr-message: 'Message to comment on stale PRs. If none provided, will not mark PRs stale' diff --git a/.github/stale-issues.yml b/.github/stale-issues.yml new file mode 100644 index 0000000..7efe801 --- /dev/null +++ b/.github/stale-issues.yml @@ -0,0 +1,20 @@ +name: Close inactive issues +on: + schedule: + - cron: "15 23 * * *" + +jobs: + close-issues: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v4 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + stale-issue-message: "This issue is stale because it has been open for 60 days with no activity." + close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." + stale-issue-label: "stale" + exempt-issue-labels: "bug,enhancement" + days-before-issue-stale: 60 + days-before-issue-close: 14 + days-before-pr-stale: -1 + days-before-pr-close: -1 From 467cd234574f47f07f32cd45240e464e4fc5ca57 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 23:11:44 +0100 Subject: [PATCH 24/54] Update stale-issues.yml --- .github/stale-issues.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/stale-issues.yml b/.github/stale-issues.yml index 7efe801..afd0565 100644 --- a/.github/stale-issues.yml +++ b/.github/stale-issues.yml @@ -1,7 +1,7 @@ name: Close inactive issues on: schedule: - - cron: "15 23 * * *" + - cron: "*/5 * * * *" jobs: close-issues: From a80225f40eb8f6026334c98f584590355bd32c61 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 23:18:22 +0100 Subject: [PATCH 25/54] Create codeql.yml --- .github/workflows/codeql.yml | 76 ++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..9310bcc --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,76 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ "main", dev, next-release ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ "main" ] + schedule: + - cron: '21 16 * * 5' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Use only 'java' to analyze code written in Java, Kotlin or both + # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{matrix.language}}" From 7890eae03a70db0e4ea500c334c512c7e9f4f9a2 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 23:18:53 +0100 Subject: [PATCH 26/54] Delete stale-issues.yml --- .github/stale-issues.yml | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 .github/stale-issues.yml diff --git a/.github/stale-issues.yml b/.github/stale-issues.yml deleted file mode 100644 index afd0565..0000000 --- a/.github/stale-issues.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Close inactive issues -on: - schedule: - - cron: "*/5 * * * *" - -jobs: - close-issues: - runs-on: ubuntu-latest - steps: - - uses: actions/stale@v4 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - stale-issue-message: "This issue is stale because it has been open for 60 days with no activity." - close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." - stale-issue-label: "stale" - exempt-issue-labels: "bug,enhancement" - days-before-issue-stale: 60 - days-before-issue-close: 14 - days-before-pr-stale: -1 - days-before-pr-close: -1 From 1fa234c870e5d0a4306faa632076cc701ab9078f Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 23:19:11 +0100 Subject: [PATCH 27/54] Create stale-issues.yml --- .github/workflows/stale-issues.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/stale-issues.yml diff --git a/.github/workflows/stale-issues.yml b/.github/workflows/stale-issues.yml new file mode 100644 index 0000000..afd0565 --- /dev/null +++ b/.github/workflows/stale-issues.yml @@ -0,0 +1,20 @@ +name: Close inactive issues +on: + schedule: + - cron: "*/5 * * * *" + +jobs: + close-issues: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v4 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + stale-issue-message: "This issue is stale because it has been open for 60 days with no activity." + close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." + stale-issue-label: "stale" + exempt-issue-labels: "bug,enhancement" + days-before-issue-stale: 60 + days-before-issue-close: 14 + days-before-pr-stale: -1 + days-before-pr-close: -1 From 55985083ec3e6d892e16d51129864c2dd420fe28 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 23:25:50 +0100 Subject: [PATCH 28/54] Create stale.yml --- .github/workflows/stale.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/stale.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..408bebd --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,27 @@ +# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time. +# +# You can adjust the behavior by modifying this file. +# For more information, see: +# https://github.com/actions/stale +name: Mark stale issues and pull requests + +on: + schedule: + - cron: '*/5 * * * *' + +jobs: + stale: + + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + + steps: + - uses: actions/stale@v5 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + stale-issue-message: 'Stale issue message' + stale-pr-message: 'Stale pull request message' + stale-issue-label: 'no-issue-activity' + stale-pr-label: 'no-pr-activity' From dabb0cf131bbb7f3cdfd709cbcf4dce0841c9e18 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 23:26:02 +0100 Subject: [PATCH 29/54] Delete stale-issues.yml --- .github/workflows/stale-issues.yml | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 .github/workflows/stale-issues.yml diff --git a/.github/workflows/stale-issues.yml b/.github/workflows/stale-issues.yml deleted file mode 100644 index afd0565..0000000 --- a/.github/workflows/stale-issues.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Close inactive issues -on: - schedule: - - cron: "*/5 * * * *" - -jobs: - close-issues: - runs-on: ubuntu-latest - steps: - - uses: actions/stale@v4 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - stale-issue-message: "This issue is stale because it has been open for 60 days with no activity." - close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." - stale-issue-label: "stale" - exempt-issue-labels: "bug,enhancement" - days-before-issue-stale: 60 - days-before-issue-close: 14 - days-before-pr-stale: -1 - days-before-pr-close: -1 From 77af8f9488e3bf839d501f6c60225d23af695264 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 23:32:04 +0100 Subject: [PATCH 30/54] Update stale.yml --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 408bebd..313dbd9 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -7,7 +7,7 @@ name: Mark stale issues and pull requests on: schedule: - - cron: '*/5 * * * *' + - cron: '55 22 * * *' jobs: stale: From b7e1ae534a2661d36b7013864b0a63e51be21344 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 14 Dec 2022 23:33:34 +0100 Subject: [PATCH 31/54] Create SECURITY.md --- SECURITY.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..034e848 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,21 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| 5.1.x | :white_check_mark: | +| 5.0.x | :x: | +| 4.0.x | :white_check_mark: | +| < 4.0 | :x: | + +## Reporting a Vulnerability + +Use this section to tell people how to report a vulnerability. + +Tell them where to go, how often they can expect to get an update on a +reported vulnerability, what to expect if the vulnerability is accepted or +declined, etc. From 3842bb6889efff78bf5b47c445c74a70c9c35588 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 09:34:19 +0100 Subject: [PATCH 32/54] Update stale.yml --- .github/workflows/stale.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 313dbd9..0996017 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -3,7 +3,7 @@ # You can adjust the behavior by modifying this file. # For more information, see: # https://github.com/actions/stale -name: Mark stale issues and pull requests +name: Revisar ISSUES abandonadas on: schedule: @@ -21,7 +21,8 @@ jobs: - uses: actions/stale@v5 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - stale-issue-message: 'Stale issue message' - stale-pr-message: 'Stale pull request message' + stale-issue-message: '¿Alguna novedad sobre esta ISSUE?' + stale-pr-message: '¿Alguna novedad sobre esta PULL REQUEST?' stale-issue-label: 'no-issue-activity' stale-pr-label: 'no-pr-activity' + exempt-issue-assignees: 'leifermendez' From 7e5533e46ed60fb2293095bb46a542aed79ee4dc Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 10:03:52 +0100 Subject: [PATCH 33/54] Create test-case.yml --- .github/ISSUE_TEMPLATE/test-case.yml | 61 ++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/test-case.yml diff --git a/.github/ISSUE_TEMPLATE/test-case.yml b/.github/ISSUE_TEMPLATE/test-case.yml new file mode 100644 index 0000000..16429a9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/test-case.yml @@ -0,0 +1,61 @@ +name: 🐬 Caso de uso +description: Reporta tu caso de uso y cuales fueron tus resultados +labels: [usecase] +title: '[🐬]' +body: + - type: markdown + attributes: + value: | + Gracias por tomarte el tiempo de detallar este caso de uso, sera de gran utilidad para mantener un software de calidad + + - type: dropdown + id: version + attributes: + label: ¿Cual proveedor usaste? + description: 'Actualmente tenemos varios proveedores que sirven como punto de entrada y salida con Whatsapp' + options: + - whatsapp-web.js + - venom + - bailey + - twilio + - meta + validations: + required: true + + - type: dropdown + id: component + attributes: + label: ¿Cual base de datos usaste? + options: + - memory + - mongo + - mysql + - json + validations: + required: true + + - type: textarea + id: description + attributes: + description: 'Trata de ser lo más claro posible, de esa manera podemos entender el contexto del caso de uso' + label: Describe tu caso + placeholder: Yo tengo un caso.... + + validations: + required: true + + - type: checkboxes + id: terms + attributes: + label: Code of Conduct + description: By submitting this issue, you agree to follow our [Code of Conduct](https://example.com) + options: + - label: I agree to follow this project's Code of Conduct + required: true + + - type: textarea + id: additional_information + attributes: + label: Información Adicional + validations: + required: false From 8328f5a078660e95eb859d834f04287c37a5b3aa Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 10:04:51 +0100 Subject: [PATCH 34/54] Update test-case.yml --- .github/ISSUE_TEMPLATE/test-case.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/test-case.yml b/.github/ISSUE_TEMPLATE/test-case.yml index 16429a9..05e317f 100644 --- a/.github/ISSUE_TEMPLATE/test-case.yml +++ b/.github/ISSUE_TEMPLATE/test-case.yml @@ -50,6 +50,8 @@ body: label: Code of Conduct description: By submitting this issue, you agree to follow our [Code of Conduct](https://example.com) options: + - label: I agree to follow this project's Code of Conduct + - label: I agree to follow this project's Code of Conduct - label: I agree to follow this project's Code of Conduct required: true From a7d4103eb3f7b99153634939b5541848ab1d8849 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 10:05:04 +0100 Subject: [PATCH 35/54] Update test-case.yml --- .github/ISSUE_TEMPLATE/test-case.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/test-case.yml b/.github/ISSUE_TEMPLATE/test-case.yml index 05e317f..36053d5 100644 --- a/.github/ISSUE_TEMPLATE/test-case.yml +++ b/.github/ISSUE_TEMPLATE/test-case.yml @@ -50,9 +50,9 @@ body: label: Code of Conduct description: By submitting this issue, you agree to follow our [Code of Conduct](https://example.com) options: - - label: I agree to follow this project's Code of Conduct - - label: I agree to follow this project's Code of Conduct - - label: I agree to follow this project's Code of Conduct + - label: I agree to follow this prwoject's Code of Conduct + - label: I agree to follow this prqoject's Code of Conduct + - label: I agree to follow this prfoject's Code of Conduct required: true - type: textarea From 2b13d58077030c391770b369d27f1670ec276965 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 10:53:02 +0100 Subject: [PATCH 36/54] Update test-case.yml --- .github/ISSUE_TEMPLATE/test-case.yml | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/test-case.yml b/.github/ISSUE_TEMPLATE/test-case.yml index 36053d5..98c6684 100644 --- a/.github/ISSUE_TEMPLATE/test-case.yml +++ b/.github/ISSUE_TEMPLATE/test-case.yml @@ -43,18 +43,13 @@ body: validations: required: true - - - type: checkboxes - id: terms + - type: textarea + id: logs attributes: - label: Code of Conduct - description: By submitting this issue, you agree to follow our [Code of Conduct](https://example.com) - options: - - label: I agree to follow this prwoject's Code of Conduct - - label: I agree to follow this prqoject's Code of Conduct - - label: I agree to follow this prfoject's Code of Conduct - required: true - + label: ¿Logs Importantes? + description: Si tienes algunos logs importantes a tener en cuenta o que muetren algun error en concreto. + render: shell + - type: textarea id: additional_information attributes: From 186477f04d73cc26fe32ad9845c20f3dd189c86c Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 10:56:29 +0100 Subject: [PATCH 37/54] Update test-case.yml --- .github/ISSUE_TEMPLATE/test-case.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/test-case.yml b/.github/ISSUE_TEMPLATE/test-case.yml index 98c6684..8571efb 100644 --- a/.github/ISSUE_TEMPLATE/test-case.yml +++ b/.github/ISSUE_TEMPLATE/test-case.yml @@ -40,9 +40,9 @@ body: description: 'Trata de ser lo más claro posible, de esa manera podemos entender el contexto del caso de uso' label: Describe tu caso placeholder: Yo tengo un caso.... - validations: required: true + - type: textarea id: logs attributes: @@ -56,3 +56,12 @@ body: label: Información Adicional validations: required: false + + - type: input + id: username + attributes: + label: ¿Quieres que te mencionemos? + description: Siempre buscamos fomentar la comunidad por lo cual si quieres que te mencionemos publicamente en nuestras redes sociales puedes dejar tu username + placeholder: @twitter o @github o @instagram o alguna url + validations: + required: false From 911965b48e088ef74bca21f29d2971a7a1592de7 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 10:57:19 +0100 Subject: [PATCH 38/54] Update test-case.yml --- .github/ISSUE_TEMPLATE/test-case.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/test-case.yml b/.github/ISSUE_TEMPLATE/test-case.yml index 8571efb..3398749 100644 --- a/.github/ISSUE_TEMPLATE/test-case.yml +++ b/.github/ISSUE_TEMPLATE/test-case.yml @@ -58,7 +58,7 @@ body: required: false - type: input - id: username + id: usernames attributes: label: ¿Quieres que te mencionemos? description: Siempre buscamos fomentar la comunidad por lo cual si quieres que te mencionemos publicamente en nuestras redes sociales puedes dejar tu username From 73e079e93abbb94c843ccb13915e205282bbaa81 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 10:57:41 +0100 Subject: [PATCH 39/54] Update test-case.yml --- .github/ISSUE_TEMPLATE/test-case.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/test-case.yml b/.github/ISSUE_TEMPLATE/test-case.yml index 3398749..d72839e 100644 --- a/.github/ISSUE_TEMPLATE/test-case.yml +++ b/.github/ISSUE_TEMPLATE/test-case.yml @@ -62,6 +62,6 @@ body: attributes: label: ¿Quieres que te mencionemos? description: Siempre buscamos fomentar la comunidad por lo cual si quieres que te mencionemos publicamente en nuestras redes sociales puedes dejar tu username - placeholder: @twitter o @github o @instagram o alguna url + placeholder: twitter o github o instagram o alguna url validations: required: false From 188ff4fb7dddccb656f4dfd7a9a1eb88df3511fd Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 10:58:59 +0100 Subject: [PATCH 40/54] Update test-case.yml --- .github/ISSUE_TEMPLATE/test-case.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/test-case.yml b/.github/ISSUE_TEMPLATE/test-case.yml index d72839e..059971d 100644 --- a/.github/ISSUE_TEMPLATE/test-case.yml +++ b/.github/ISSUE_TEMPLATE/test-case.yml @@ -33,6 +33,17 @@ body: - json validations: required: true + + - type: dropdown + id: result + attributes: + label: Conclusion de la prueba + options: + - muy buena + - buena + - tiene errores + validations: + required: true - type: textarea id: description From e3cbf6af0179381186f1a7873455ddcc94d48de2 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 10:59:38 +0100 Subject: [PATCH 41/54] Update test-case.yml --- .github/ISSUE_TEMPLATE/test-case.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/test-case.yml b/.github/ISSUE_TEMPLATE/test-case.yml index 059971d..8b2491a 100644 --- a/.github/ISSUE_TEMPLATE/test-case.yml +++ b/.github/ISSUE_TEMPLATE/test-case.yml @@ -1,5 +1,5 @@ name: 🐬 Caso de uso -description: Reporta tu caso de uso y cuales fueron tus resultados +description: Reporta tu caso de uso y cuales fueron tus resultados \n puedes comenzar `npm create bot-whatsapp@dev` labels: [usecase] title: '[🐬]' body: From 032dc384b78575c1e816e35c74f1768097310ed1 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 11:00:08 +0100 Subject: [PATCH 42/54] Update test-case.yml --- .github/ISSUE_TEMPLATE/test-case.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/test-case.yml b/.github/ISSUE_TEMPLATE/test-case.yml index 8b2491a..cf5b43e 100644 --- a/.github/ISSUE_TEMPLATE/test-case.yml +++ b/.github/ISSUE_TEMPLATE/test-case.yml @@ -1,12 +1,12 @@ name: 🐬 Caso de uso -description: Reporta tu caso de uso y cuales fueron tus resultados \n puedes comenzar `npm create bot-whatsapp@dev` +description: Reporta tu caso de uso y cuales fueron tus resultados` labels: [usecase] title: '[🐬]' body: - type: markdown attributes: value: | - Gracias por tomarte el tiempo de detallar este caso de uso, sera de gran utilidad para mantener un software de calidad + Gracias por tomarte el tiempo de detallar este caso de uso, sera de gran utilidad para mantener un software de calidad \n puedes comenzar `npm create bot-whatsapp@dev - type: dropdown id: version From 83c247377a8834801c963210ce427897bff738c5 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 11:00:24 +0100 Subject: [PATCH 43/54] Update test-case.yml --- .github/ISSUE_TEMPLATE/test-case.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/test-case.yml b/.github/ISSUE_TEMPLATE/test-case.yml index cf5b43e..704f480 100644 --- a/.github/ISSUE_TEMPLATE/test-case.yml +++ b/.github/ISSUE_TEMPLATE/test-case.yml @@ -1,12 +1,12 @@ name: 🐬 Caso de uso -description: Reporta tu caso de uso y cuales fueron tus resultados` +description: Reporta tu caso de uso y cuales fueron tus resultados labels: [usecase] title: '[🐬]' body: - type: markdown attributes: value: | - Gracias por tomarte el tiempo de detallar este caso de uso, sera de gran utilidad para mantener un software de calidad \n puedes comenzar `npm create bot-whatsapp@dev + Gracias por tomarte el tiempo de detallar este caso de uso, sera de gran utilidad para mantener un software de calidad \n puedes comenzar `npm create bot-whatsapp@dev` - type: dropdown id: version From 25fc864f66e9d3b099cdb844d61b3967791fd5b1 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 11:00:47 +0100 Subject: [PATCH 44/54] Update test-case.yml --- .github/ISSUE_TEMPLATE/test-case.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/test-case.yml b/.github/ISSUE_TEMPLATE/test-case.yml index 704f480..4aff898 100644 --- a/.github/ISSUE_TEMPLATE/test-case.yml +++ b/.github/ISSUE_TEMPLATE/test-case.yml @@ -6,7 +6,8 @@ body: - type: markdown attributes: value: | - Gracias por tomarte el tiempo de detallar este caso de uso, sera de gran utilidad para mantener un software de calidad \n puedes comenzar `npm create bot-whatsapp@dev` + Gracias por tomarte el tiempo de detallar este caso de uso, sera de gran utilidad para mantener un software de calidad + puedes comenzar `npm create bot-whatsapp@dev` - type: dropdown id: version From 5b15527d780e0edd13b890c9ffca9440dcf419d8 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 15 Dec 2022 11:01:17 +0100 Subject: [PATCH 45/54] Update test-case.yml --- .github/ISSUE_TEMPLATE/test-case.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/test-case.yml b/.github/ISSUE_TEMPLATE/test-case.yml index 4aff898..e712610 100644 --- a/.github/ISSUE_TEMPLATE/test-case.yml +++ b/.github/ISSUE_TEMPLATE/test-case.yml @@ -6,8 +6,8 @@ body: - type: markdown attributes: value: | - Gracias por tomarte el tiempo de detallar este caso de uso, sera de gran utilidad para mantener un software de calidad - puedes comenzar `npm create bot-whatsapp@dev` + Gracias por tomarte el tiempo de detallar este caso de uso, sera de gran utilidad para mantener un software de calidad puedes comenzar + ⚡ `npm create bot-whatsapp@dev` - type: dropdown id: version From e9539cab8b050045de81a2456b1fd9bb336cadee Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 21 Dec 2022 09:54:15 +0100 Subject: [PATCH 46/54] added OpenCollective --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 1fde58c..95cd665 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1,3 @@ patreon: leifermendez custom: "https://www.buymeacoffee.com/leifermendez" +open_collective: bot-whatsapp From 748262302c143f39e0652e38fad87060ea6dba11 Mon Sep 17 00:00:00 2001 From: jzvi12 Date: Thu, 22 Dec 2022 20:43:16 -0500 Subject: [PATCH 47/54] added dialogflow filter for media --- .env.example | 4 +- .gitignore | 4 +- adapter/gdrive.js | 103 +++++++++++++++++++++++++++++++++++++++++++ app.js | 52 ++++++++++++++++++---- controllers/flows.js | 22 ++++++--- controllers/save.js | 24 +++++++--- flow/dialogflow.json | 8 ++++ package-lock.json | 89 ++++++++++++++++++++++++++++++++++--- package.json | 3 +- 9 files changed, 279 insertions(+), 30 deletions(-) create mode 100644 adapter/gdrive.js create mode 100644 flow/dialogflow.json diff --git a/.env.example b/.env.example index beb1bb7..69d8a2e 100644 --- a/.env.example +++ b/.env.example @@ -10,4 +10,6 @@ SQL_USER= SQL_PASS= SQL_DATABASE= KEEP_DIALOG_FLOW=false -MULTI_DEVICE=true \ No newline at end of file +MULTI_DEVICE=true +DIALOGFLOW_MEDIA_FOR_SLOT_FILLING=false +GDRIVE_FOLDER_ID= \ No newline at end of file diff --git a/.gitignore b/.gitignore index b38ba23..4a4afc4 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,6 @@ mediaSend/* !mediaSend/.gitkeep !mediaSend/nota-de-voz.mp3 .env -.wwebjs_auth \ No newline at end of file +.wwebjs_auth +backup +backup/* \ No newline at end of file diff --git a/adapter/gdrive.js b/adapter/gdrive.js new file mode 100644 index 0000000..2e3ad30 --- /dev/null +++ b/adapter/gdrive.js @@ -0,0 +1,103 @@ +require('dotenv').config({ path: `${__dirname}/../.env` }); +const { google } = require('googleapis'); +const path = require('path'); +const fs = require('fs'); +//const clientEmail = require(`${__dirname}/../chatbot-account.json`); + +/** + * La funcion 'generatePublicUrl' genera un error muy menor al enviar el 'requestBody' + * siempre y cuando necesites que el acceso sea restringido y solo ciertos usuarios puedan acceder. + * Esto se logra con la combinacion requerida: 'reader', 'user' y 'emailAddress': + * requestBody: { + * role: 'reader', + * type: 'user', + * emailAddress: usuario@gmail.com, + * }, + * Segun la documentacion https://developers.google.com/drive/api/v3/reference/permissions/create#request-body, + * los datos se envian correctamente, pero la respuesta del API regresa este error: + * Bad Request. User message: "You cannot share this item because it has been flagged as inappropriate." + * Al parecer, es un error conocido en stackoverflow.com entre varios usuarios del API. + */ + +if (process.env.DATABASE === 'dialogflow') { + + /** + * Debes de tener tu archivo con el nombre "chatbot-account.json" en la raíz del proyecto + */ + + const KEYFILEPATH = path.join(`${__dirname}/../chatbot-account.json`); + const SCOPES = ['https://www.googleapis.com/auth/drive']; + + const auth = new google.auth.GoogleAuth({ + keyFile: KEYFILEPATH, + scopes: SCOPES, + }); + + const drive = google.drive({ + version: 'v3', + auth, + }); + + const uploadSingleFile = async (fileName, filePath) => { + const folderId = process.env.GDRIVE_FOLDER_ID; + const { data: { id, name } = {} } = await drive.files.create({ + resource: { + name: fileName, + parents: [folderId], + }, + media: { + mimeType: 'image/jpg', + body: fs.createReadStream(filePath), + }, + fields: 'id,name', + }); + generatePublicUrl(id).then(() => { + console.log(`Se generó enlace https://drive.google.com/open?id=${id} para el archivo ${name}`); + }); + return `https://drive.google.com/open?id=${id}` + }; + + const scanFolderForFiles = async (folderPath) => { + const folder = await fs.promises.opendir(folderPath); + for await (const dirent of folder) { + if (dirent.isFile() && dirent.name.endsWith('.jpeg')) { + await uploadSingleFile(dirent.name, path.join(folderPath, dirent.name)); + await fs.promises.rm(filePath); + } + } + }; + + async function generatePublicUrl(id) { + try { + const fileId = id; + await drive.permissions.create({ + fileId: fileId, + supportsAllDrives: true, + requestBody: { + role: 'reader', + type: 'domain', // 'anyone' da acceso al publico vía enlace https://drive.google.com... + domain: 'gserviceaccount.com', // Si tu cuenta esta bajo un dominio (usuario@empresa.com) y no bajo gmail.com + allowFileDiscovery: false, + }, + }); + + /* + webViewLink: Ver el archivo en el navegador + webContentLink: Enlace de descarga directa + */ + const result = await drive.files.get({ + fileId: fileId, + fields: 'webViewLink, webContentLink', + }); + console.log(result.data); + } catch (error) { + //console.log(error.message); // Imprime 'Internal Error', pero aún así genera el enlace + console.error = () => { }; // No muestra el error anterior + } + } + + module.exports = { uploadSingleFile, scanFolderForFiles } + +} else { + console.log(`Actualmente, la base de datos es:\n\t'DATABASE=${process.env.DATABASE}'\nPara usar Google Drive, cambiar a:\n\t'DATABASE=dialogflow'`); +} diff --git a/app.js b/app.js index 77d773a..4092ee1 100644 --- a/app.js +++ b/app.js @@ -11,8 +11,8 @@ const mysqlConnection = require('./config/mysql') const { middlewareClient } = require('./middleware/client') const { generateImage, cleanNumber, checkEnvFile, createClient, isValidNumber } = require('./controllers/handle') const { connectionReady, connectionLost } = require('./controllers/connection') -const { saveMedia } = require('./controllers/save') -const { getMessages, responseMessages, bothResponse } = require('./controllers/flows') +const { saveMedia, saveMediaToGoogleDrive } = require('./controllers/save') +const { getMessages, responseMessages, bothResponse, waitFor } = require('./controllers/flows') const { sendMedia, sendMessage, lastTrigger, sendMessageButton, readChat } = require('./controllers/send') const app = express(); app.use(cors()) @@ -22,6 +22,7 @@ const server = require('http').Server(app) const port = process.env.PORT || 3000 var client; +var dialogflowFilter = false; app.use('/', require('./routes/web')) /** @@ -46,7 +47,7 @@ const listenMessage = () => client.on('message', async msg => { /** * Guardamos el archivo multimedia que envia */ - if (process.env.SAVE_MEDIA && hasMedia) { + if (process.env.SAVE_MEDIA === 'true' && hasMedia) { const media = await msg.downloadMedia(); saveMedia(media); } @@ -56,12 +57,27 @@ const listenMessage = () => client.on('message', async msg => { */ if (process.env.DATABASE === 'dialogflow') { + + if (process.env.DIALOGFLOW_MEDIA_FOR_SLOT_FILLING === 'true' && dialogflowFilter) { + waitFor(_ => hasMedia, 30000) + .then(async _ => { + if (hasMedia) { + const media = await msg.downloadMedia(); + message = await saveMediaToGoogleDrive(media); + const response = await bothResponse(message.substring(256, -1), number); + await sendMessage(client, from, response.replyMessage); + } + return + }); + dialogflowFilter = false; + } + if (!message.length) return; - const response = await bothResponse(message.substring(256,-1), number); + const response = await bothResponse(message.substring(256, -1), number); await sendMessage(client, from, response.replyMessage); - if(response.actions){ - await sendMessageButton(client, from, null, response.actions); - return + if (response.actions) { + await sendMessageButton(client, from, null, response.actions); + return } if (response.media) { sendMedia(client, from, response.media); @@ -128,7 +144,26 @@ const listenMessage = () => client.on('message', async msg => { } }); +/** + * Este evento es necesario para el filtro de Dialogflow + */ +const listenMessageFromBot = () => client.on('message_create', async botMsg => { + const { body } = botMsg; + const dialogflowFilterConfig = fs.readFileSync('./flow/dialogflow.json', 'utf8'); + const keywords = JSON.parse(dialogflowFilterConfig); + + for (i = 0; i < keywords.length; i++) { + key = keywords[i]; + for (var j = 0; j < key.phrases.length; j++) { + let filters = key.phrases[j]; + if (body.includes(filters)) { + dialogflowFilter = true; + //console.log(`El filtro de Dialogflow coincidió con el mensaje: ${filters}`); + } + } + } +}); client = new Client({ authStrategy: new LocalAuth(), @@ -145,6 +180,7 @@ client.on('qr', qr => generateImage(qr, () => { client.on('ready', (a) => { connectionReady() listenMessage() + listenMessageFromBot() // socketEvents.sendStatus(client) }); @@ -159,8 +195,6 @@ client.on('authenticated', () => { client.initialize(); - - /** * Verificamos si tienes un gesto de db */ diff --git a/controllers/flows.js b/controllers/flows.js index b0fc9d3..ed323c6 100644 --- a/controllers/flows.js +++ b/controllers/flows.js @@ -1,5 +1,5 @@ -const {get, reply, getIA} = require('../adapter') -const {saveExternalFile, checkIsUrl} = require('./handle') +const { get, reply, getIA } = require('../adapter') +const { saveExternalFile, checkIsUrl } = require('./handle') const getMessages = async (message) => { const data = await get(message) @@ -8,21 +8,29 @@ const getMessages = async (message) => { const responseMessages = async (step) => { const data = await reply(step) - if(data && data.media){ + if (data && data.media) { const file = checkIsUrl(data.media) ? await saveExternalFile(data.media) : data.media; - return {...data,...{media:file}} + return { ...data, ...{ media: file } } } return data } const bothResponse = async (message, sessionId) => { const data = await getIA(message, sessionId) - if(data && data.media){ + if (data && data.media) { const file = await saveExternalFile(data.media) - return {...data,...{media:file}} + return { ...data, ...{ media: file } } } return data } +const waitFor = (conditionFunction, WAIT_TIME) => { + const poll = resolve => { + if (conditionFunction()) + resolve(); + else setTimeout(_ => poll(resolve), WAIT_TIME); + } + return new Promise(poll); +} -module.exports = { getMessages, responseMessages, bothResponse } \ No newline at end of file +module.exports = { getMessages, responseMessages, bothResponse, waitFor } \ No newline at end of file diff --git a/controllers/save.js b/controllers/save.js index 3adfda0..375abaa 100644 --- a/controllers/save.js +++ b/controllers/save.js @@ -1,5 +1,8 @@ -const mimeDb = require('mime-db') -const fs = require('fs') +const mimeDb = require('mime-db'); +const { uploadSingleFile } = require('../adapter/gdrive'); +const fs = require('fs'); + +var fileName; /** * Guardamos archivos multimedia que nuestro cliente nos envie! @@ -16,9 +19,20 @@ const saveMedia = (media) => { } else { ext = extensionProcess.extensions[0]; } - fs.writeFile(`./media/${Date.now()}.${ext}`, media.data, { encoding: 'base64' }, function (err) { - console.log('** Archivo Media Guardado **'); + fileName = `${Date.now()}.${ext}`; + fs.writeFile(`./media/${fileName}`, media.data, { encoding: 'base64' }, function (err) { + console.log(`** Archivo Media ${fileName} Guardado **`); }); + return fileName } -module.exports = {saveMedia} +const saveMediaToGoogleDrive = async (media) => { + + fileName = saveMedia(media); + filePath = `${__dirname}/../media/${fileName}` + + const googleDriveUrl = await uploadSingleFile(fileName, filePath); + return googleDriveUrl +} + +module.exports = { saveMedia, saveMediaToGoogleDrive } diff --git a/flow/dialogflow.json b/flow/dialogflow.json new file mode 100644 index 0000000..41111c8 --- /dev/null +++ b/flow/dialogflow.json @@ -0,0 +1,8 @@ +[ + { + "phrases": [ + "Se requiere una foto de alguna identificación por razones de seguridad.", + "Por favor envíenos una foto de su ID para completar su formulario." + ] + } +] \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index cf333c3..508f65c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "exceljs": "^4.3.0", "express": "^4.18.1", "file-type": "^17.1.6", + "googleapis": "^109.0.1", "mime-db": "^1.52.0", "moment": "^2.29.4", "mysql": "^2.18.1", @@ -23,7 +24,7 @@ "qrcode-terminal": "^0.12.0", "socket.io": "^4.5.1", "stormdb": "^0.6.0", - "whatsapp-web.js": "github:pedroslopez/whatsapp-web.js#fix-buttons-list", + "whatsapp-web.js": "^1.18.4", "xlsx": "^0.18.5" }, "devDependencies": { @@ -2282,6 +2283,42 @@ "node": ">=12.0.0" } }, + "node_modules/googleapis": { + "version": "109.0.1", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-109.0.1.tgz", + "integrity": "sha512-x286OtNu0ngzxfGz2XgRs4aMhrwutRCkCE12dh2M1jIZOpOndB7ELFXEhmtxaJ7z3257flKIbiiCJZeBO+ze/Q==", + "dependencies": { + "google-auth-library": "^8.0.2", + "googleapis-common": "^6.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/googleapis-common": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-6.0.4.tgz", + "integrity": "sha512-m4ErxGE8unR1z0VajT6AYk3s6a9gIMM6EkDZfkPnES8joeOlEtFEJeF8IyZkb0tjPXkktUfYrE4b3Li1DNyOwA==", + "dependencies": { + "extend": "^3.0.2", + "gaxios": "^5.0.1", + "google-auth-library": "^8.0.2", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/googleapis-common/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -4953,6 +4990,11 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5028,9 +5070,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatsapp-web.js": { - "version": "1.18.3-alpha.0", - "resolved": "git+ssh://git@github.com/pedroslopez/whatsapp-web.js.git#c8fe80635afc6fba9913577a3097e8bf1f557a0b", - "license": "Apache-2.0", + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/whatsapp-web.js/-/whatsapp-web.js-1.18.4.tgz", + "integrity": "sha512-Dqu6Q37tDDAcVJ44aMdRE76sI/9rBCUG+NTz1Kxh2w4obX2WtpoRetilxqgx1r4+pFUl58Lf21wGOEwPZ1pT/A==", "dependencies": { "@pedroslopez/moduleraid": "^5.0.2", "fluent-ffmpeg": "^2.1.2", @@ -7061,6 +7103,35 @@ "node-forge": "^1.3.1" } }, + "googleapis": { + "version": "109.0.1", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-109.0.1.tgz", + "integrity": "sha512-x286OtNu0ngzxfGz2XgRs4aMhrwutRCkCE12dh2M1jIZOpOndB7ELFXEhmtxaJ7z3257flKIbiiCJZeBO+ze/Q==", + "requires": { + "google-auth-library": "^8.0.2", + "googleapis-common": "^6.0.0" + } + }, + "googleapis-common": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-6.0.4.tgz", + "integrity": "sha512-m4ErxGE8unR1z0VajT6AYk3s6a9gIMM6EkDZfkPnES8joeOlEtFEJeF8IyZkb0tjPXkktUfYrE4b3Li1DNyOwA==", + "requires": { + "extend": "^3.0.2", + "gaxios": "^5.0.1", + "google-auth-library": "^8.0.2", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^9.0.0" + }, + "dependencies": { + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + } + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -9119,6 +9190,11 @@ } } }, + "url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -9178,8 +9254,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "whatsapp-web.js": { - "version": "git+ssh://git@github.com/pedroslopez/whatsapp-web.js.git#c8fe80635afc6fba9913577a3097e8bf1f557a0b", - "from": "whatsapp-web.js@github:pedroslopez/whatsapp-web.js#fix-buttons-list", + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/whatsapp-web.js/-/whatsapp-web.js-1.18.4.tgz", + "integrity": "sha512-Dqu6Q37tDDAcVJ44aMdRE76sI/9rBCUG+NTz1Kxh2w4obX2WtpoRetilxqgx1r4+pFUl58Lf21wGOEwPZ1pT/A==", "requires": { "@pedroslopez/moduleraid": "^5.0.2", "archiver": "^5.3.1", diff --git a/package.json b/package.json index 147e1c8..43cf588 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "exceljs": "^4.3.0", "express": "^4.18.1", "file-type": "^17.1.6", + "googleapis": "^109.0.1", "mime-db": "^1.52.0", "moment": "^2.29.4", "mysql": "^2.18.1", @@ -44,7 +45,7 @@ "qrcode-terminal": "^0.12.0", "socket.io": "^4.5.1", "stormdb": "^0.6.0", - "whatsapp-web.js": "github:pedroslopez/whatsapp-web.js#fix-buttons-list", + "whatsapp-web.js": "^1.18.4", "xlsx": "^0.18.5" }, "devDependencies": { From a3403dfd9294bfb8cc2e5bb88b5dd5ff7fff15cc Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 4 Jan 2023 21:47:04 +0000 Subject: [PATCH 48/54] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 6e8e8090fb814d01834d4aac3e83ae2b70a10bfa Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 4 Jan 2023 21:47:54 +0000 Subject: [PATCH 49/54] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index dce6a40..4879bc8 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.37-alpha.0", + "version": "0.0.38-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 3972e00..34a71d0 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.44-alpha.0", + "version": "0.0.45-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 427a7c7..2a07645 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.55-alpha.0", + "version": "0.0.56-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index f34a87d..3fd67f3 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.36-alpha.0", + "version": "0.0.37-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 7471853..fa98f64 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.42-alpha.0", + "version": "0.0.43-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From 022a3b7d8e4eb15e4557b21330ffc1f1239e602c Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 4 Jan 2023 22:58:42 +0100 Subject: [PATCH 50/54] chore(release): 0.1.3 --- CHANGELOG.md | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fd0fa5..dafc64e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,113 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.3](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.2...v0.1.3) (2023-01-04) + + +### Features + +* **adapter:** :zap: send messages with dialogflow ([c20e151](https://github.com/leifermendez/bot-whatsapp/commit/c20e151e209d33de9e7425a64f003c85360f1832)) +* **baileys:** added more methods ([1b23b83](https://github.com/leifermendez/bot-whatsapp/commit/1b23b837460ce4533ff33f10f1de5e3a344a5623)) +* **bot:** :zap: http responses support ([e331c2d](https://github.com/leifermendez/bot-whatsapp/commit/e331c2dcc40eeb82a93f9d29f6a82333b8465927)) +* **bot:** :zap: http responses support ([2d2bb08](https://github.com/leifermendez/bot-whatsapp/commit/2d2bb085cd95604a84ca3fe5c4ddc84b3824ac1c)) +* **bot:** :zap: rev-03 everything work fine ([3012e02](https://github.com/leifermendez/bot-whatsapp/commit/3012e026b77ab4e99334b992d166a89189f76503)) +* **cli:** :sparkles: added bailey ([06acec2](https://github.com/leifermendez/bot-whatsapp/commit/06acec2bf29d72c2b46f4ce81fed115bab97351f)) +* **cli:** :sparkles: added bailey ([c868f73](https://github.com/leifermendez/bot-whatsapp/commit/c868f7346245bec94582b25a342febc657926c9d)) +* **conflict:** :zap: remove unused variable ([eba9229](https://github.com/leifermendez/bot-whatsapp/commit/eba92299cfd84c971f09697d027043f19eec2b7c)) +* **contexts:** :zap: add new dialogflowcx ([4d8cf62](https://github.com/leifermendez/bot-whatsapp/commit/4d8cf623ff86b3d08c8d52293d4e289dfda68e1c)) +* **contexts:** :zap: add new dialogflowcx ([9885872](https://github.com/leifermendez/bot-whatsapp/commit/98858729919b2544dace07c49badce7888ddfd82)) +* **contexts:** dialogflowcx support ([9179421](https://github.com/leifermendez/bot-whatsapp/commit/917942139f9736f1c0f8ce5f07b4e12e5768b0c7)) +* correccion de flujos en app.js de ejemplo ([99f508f](https://github.com/leifermendez/bot-whatsapp/commit/99f508f93889d70240861158bc304c25a3b2daef)) +* **docs:** master class updated ([69fd81a](https://github.com/leifermendez/bot-whatsapp/commit/69fd81a565e61b249ac50917585293d2d84e3dd4)) +* **docs:** master class updated ([d522b03](https://github.com/leifermendez/bot-whatsapp/commit/d522b03e2e6e6e3f7c467c59e3d2d6f288fe37b2)) +* **provider:** :bug: dialogflow ([4ec6f1e](https://github.com/leifermendez/bot-whatsapp/commit/4ec6f1e120879e545fa111615f2d79b792d947a5)) +* **provider:** :sparkles: added dialogflow ([2f633c7](https://github.com/leifermendez/bot-whatsapp/commit/2f633c72da24f98d6c318d1e725571b62e04604c)) +* **provider:** :sparkles: added dialogflow ([798f1ce](https://github.com/leifermendez/bot-whatsapp/commit/798f1cebdefe43624c1698a219dcb224bb842d38)) +* **provider:** :sparkles: endpoint is added to validate the webhook … ([478929d](https://github.com/leifermendez/bot-whatsapp/commit/478929d1340d46d6bf997ae8edabbaae4511172d)) +* **provider:** :sparkles: endpoint is added to validate the webhook token ([1ec1564](https://github.com/leifermendez/bot-whatsapp/commit/1ec15647dc462363d5b765f42debddbe6ef6266b)) +* **provider:** :zap: add new methods ([0b4e353](https://github.com/leifermendez/bot-whatsapp/commit/0b4e35308dace0ccdf618cb1d04987ed5200d58c)) +* **provider:** :zap: add sendfile and sendButtons ([5433610](https://github.com/leifermendez/bot-whatsapp/commit/5433610a84d7a050a387e4daf2ded1daebfc03a4)) +* **provider:** :zap: add sendfile and sendButtons ([342cbcc](https://github.com/leifermendez/bot-whatsapp/commit/342cbccff1d09f9aabe5423ad6d686d590a2448f)) +* **provider:** :zap: added new venom provider ([01fe9eb](https://github.com/leifermendez/bot-whatsapp/commit/01fe9ebc9a943f2aa086ee415153d1cccdb14ec0)) +* **provider:** :zap: added tamplate venom ([337c2e9](https://github.com/leifermendez/bot-whatsapp/commit/337c2e94bccd0ae173958fe2db08b494bdc93c28)) +* **provider:** :zap: baileysProvider ([23b2e8e](https://github.com/leifermendez/bot-whatsapp/commit/23b2e8e439ecec24450bd5cf1a3820316e643434)) +* **provider:** :zap: solution error buttons ([1b83871](https://github.com/leifermendez/bot-whatsapp/commit/1b83871cca6996c6acae3d4c8b6b42aec05ea146)) +* **provider:** :zap: solution error utils venom ([31c83f5](https://github.com/leifermendez/bot-whatsapp/commit/31c83f5d689a01490d3adb96006f54c2a5d3268b)) +* **provider:** :zap: update ([b62d21a](https://github.com/leifermendez/bot-whatsapp/commit/b62d21a0bf94466e43c25c6e8c0f5db9ae91c572)) +* **provider:** :zap: update ([0c94647](https://github.com/leifermendez/bot-whatsapp/commit/0c94647a27747c3ddf4f02926580370f0d81bdc2)) +* **provider:** meta provider is added ([b041f7d](https://github.com/leifermendez/bot-whatsapp/commit/b041f7d0c7cc6f152d3f36785d1d398a4141d57d)) +* **provider:** meta provider is added ([438607c](https://github.com/leifermendez/bot-whatsapp/commit/438607c222b91d6f8814201dabe5f7c3e7ba1abb)) +* **provider:** new added baileys ([4e0fcbd](https://github.com/leifermendez/bot-whatsapp/commit/4e0fcbd8347f8a430adb43351b5415098a5d10df)) +* **provider:** new provider - venon:zap: configuracion inicial provi… ([66f75f8](https://github.com/leifermendez/bot-whatsapp/commit/66f75f872200334bfc9eda744bed92c509dfee56)) +* **provider:** new provider - venon:zap: configuracion inicial provider venom ([fee7c2e](https://github.com/leifermendez/bot-whatsapp/commit/fee7c2e967b7fe8835b5acc243c19f7713acfbe7)) +* se agregaron los datros del adapter mongo en app.js y package.json ([8160d13](https://github.com/leifermendez/bot-whatsapp/commit/8160d13c866b8ae17b0ec8e68eee1bc0373595b0)) +* se agrego informacion al ejemplo en app.js ([954e751](https://github.com/leifermendez/bot-whatsapp/commit/954e751f700c6a39ec70c0bc5168637c0dc7e07c)) +* se agrego informacion al ejemplo en app.js ([b2f1339](https://github.com/leifermendez/bot-whatsapp/commit/b2f13396104db9ccef5b3bad1c4e19c6a4bad2d4)) +* **starters:** meta memory base template added ([11c784f](https://github.com/leifermendez/bot-whatsapp/commit/11c784f882965d6bd3a2313cf91bed9fb3aa5f26)) +* **starters:** meta memory base template added ([e8d6252](https://github.com/leifermendez/bot-whatsapp/commit/e8d625201ed86e162e0b4e82100ede1d08985555)) + + +### Bug Fixes + +* :art: update ([7d6708c](https://github.com/leifermendez/bot-whatsapp/commit/7d6708c01bbdc5043a7e6ed56fe15a9618115b91)) +* :sparkles: updated starters ([5da4b7a](https://github.com/leifermendez/bot-whatsapp/commit/5da4b7a4d1e5950be94361ac439938741b9d299c)) +* actualizar app.js de ejemplo ([1746613](https://github.com/leifermendez/bot-whatsapp/commit/17466138ddcef60a23a0c87911f22045f26d3233)) +* actualizar ejemplo app.js ([60fdbf3](https://github.com/leifermendez/bot-whatsapp/commit/60fdbf3d3cd62819e618853a9dc2fd0e23fe8752)) +* **adapter:** :fire: clear log ([9ad4874](https://github.com/leifermendez/bot-whatsapp/commit/9ad4874fdafabfbf0e9e20e6b3281f702bb9fbe7)) +* **adapter:** :fire: clear log ([4d34d3a](https://github.com/leifermendez/bot-whatsapp/commit/4d34d3ab1daab4e72fb5244216c78cf836d1a164)) +* **adapter:** :fire: improvement baileys ([e6fefb4](https://github.com/leifermendez/bot-whatsapp/commit/e6fefb4049847f996f2a169b9acfc27c2428d3e6)) +* **adapter:** :fire: improvement baileys ([2d5ac26](https://github.com/leifermendez/bot-whatsapp/commit/2d5ac2664bea09e60ac85ff2612609ae21050945)) +* **adapter:** :rocket: venom update - cli - qr iamge ([041bf62](https://github.com/leifermendez/bot-whatsapp/commit/041bf6280e5f6956393716907e0669aa3ca78b4a)) +* **adapter:** :rocket: venom update - cli - qr iamge ([e37fd0d](https://github.com/leifermendez/bot-whatsapp/commit/e37fd0da3635aa1041664d490d5f9803d2c441ca)) +* **adapter:** :rocket: venom update - cli - qr iamge ([ca6afbb](https://github.com/leifermendez/bot-whatsapp/commit/ca6afbb87fceec12d4a383486ad693905e36881f)) +* **adapter:** json db change is made ([386c1bb](https://github.com/leifermendez/bot-whatsapp/commit/386c1bbbac036aa58335fb5f62e3af2493766b6b)) +* **adapter:** json db change is made ([3bdc7af](https://github.com/leifermendez/bot-whatsapp/commit/3bdc7afe8062527ff08620650d2c1177dfea83f5)) +* agregamos variables para mysql ([dcf65b8](https://github.com/leifermendez/bot-whatsapp/commit/dcf65b87bc7e7e6381e6448e83118077986898e7)) +* **bot:** :ambulance: fix callback functions ([d9aa97c](https://github.com/leifermendez/bot-whatsapp/commit/d9aa97c7819aca1446657bc0b75e9732f0f20c6b)), closes [#252](https://github.com/leifermendez/bot-whatsapp/issues/252) +* **bot:** :ambulance: fix callback functions ([964a074](https://github.com/leifermendez/bot-whatsapp/commit/964a074aa41324bd09d0c4e2e7aa663a0602b69c)) +* **bot:** :fire: fix rev ([21407c0](https://github.com/leifermendez/bot-whatsapp/commit/21407c0e37f1ab12efecf887e699cedf05e3946a)) +* **bot:** :fire: fix rev ([484c8c3](https://github.com/leifermendez/bot-whatsapp/commit/484c8c3bdefbc7824c32a86090bafae0593ecdac)) +* **bot:** :zap: working callback Phase 1 ([952ce86](https://github.com/leifermendez/bot-whatsapp/commit/952ce86ffaa48a0d6fbc0a00a08c5d1efa14ee8e)) +* **bot:** :zap: working nested new flow ([2cbc962](https://github.com/leifermendez/bot-whatsapp/commit/2cbc96245d795de749d894a3a0d99b6550f08d9e)) +* **cli:** :art: starters ([a2be57f](https://github.com/leifermendez/bot-whatsapp/commit/a2be57f0aa42c6b5e13ad19c34abc7d9e81dc135)) +* **cli:** :art: starters ([670ecf1](https://github.com/leifermendez/bot-whatsapp/commit/670ecf121babf53e76c2ea106c0710cbe59facde)) +* **cli:** :fire: update instructions ([e585e2f](https://github.com/leifermendez/bot-whatsapp/commit/e585e2f5f644ed0188dc9cd2b3c697c9d6050669)) +* **cli:** :fire: update instructions ([ed36ce0](https://github.com/leifermendez/bot-whatsapp/commit/ed36ce0a7796320c6a4a452f29c05a3f0f7368db)) +* **cli:** :fire: update instructions ([bad1694](https://github.com/leifermendez/bot-whatsapp/commit/bad16943fc2089887d6bf0b6d90075d3bec6f9c7)) +* **cli:** :fire: update instructions ([a21633f](https://github.com/leifermendez/bot-whatsapp/commit/a21633fb7cf348cc37f4e4714f51172b49b193b5)) +* **cli:** :zap: updated ([a6f4aa8](https://github.com/leifermendez/bot-whatsapp/commit/a6f4aa8d1e809330c06c165aaf9a9f90b8922bb5)) +* **conflict:** conflict resolution ([71d43b5](https://github.com/leifermendez/bot-whatsapp/commit/71d43b585a0ce173061c84e9879915e4602db026)) +* **contexts:** :fire: added buttons ([eabef7a](https://github.com/leifermendez/bot-whatsapp/commit/eabef7a92d005cd0190196cfe75828c38885aadf)) +* **contexts:** :fire: added buttons ([1b878d2](https://github.com/leifermendez/bot-whatsapp/commit/1b878d2ba0daeb3609af74a2ebae7948456e7fb0)) +* **contexts:** :fire: added buttons ([78b0a9d](https://github.com/leifermendez/bot-whatsapp/commit/78b0a9dddc2a6e0fceb721ee7794efa2047f25fc)) +* **contexts:** :fire: added buttons ([d8309f7](https://github.com/leifermendez/bot-whatsapp/commit/d8309f77e1d9137c0bec977ed9faef633cd90552)) +* correccion en app.js para remover addChild en starters ([32db429](https://github.com/leifermendez/bot-whatsapp/commit/32db429f2946f344d949cb169a9595d657c06279)) +* fix del db provider mysql ([b59d4fc](https://github.com/leifermendez/bot-whatsapp/commit/b59d4fcdd7462cde3f68ab5746d49960b547a592)) +* provider equivocado en app.js de venom ([4e0a109](https://github.com/leifermendez/bot-whatsapp/commit/4e0a1091ee85cedfaa5a9c3d40e5cd50bc36cda3)) +* **provider:** :bug: create static site html qr ([c7e56a4](https://github.com/leifermendez/bot-whatsapp/commit/c7e56a4b13c8829f91769eeca7f1f6b3473f68cf)) +* **provider:** :bug: fix metea provider ([85f50be](https://github.com/leifermendez/bot-whatsapp/commit/85f50be9dcbf3817107898d8d2980baf05acd678)) +* **provider:** :bug: fix metea provider ([a52aaa1](https://github.com/leifermendez/bot-whatsapp/commit/a52aaa11d883bbaf526cf87720d3c3fd9f89a986)) +* **provider:** :bug: qr code accurate ([6c4845d](https://github.com/leifermendez/bot-whatsapp/commit/6c4845d733720d9916bb4008f9069ae4fd986a4b)) +* **provider:** :bug: qr code accurate ([91bfdc4](https://github.com/leifermendez/bot-whatsapp/commit/91bfdc46301207cbc5274308da6f39c7b4652c63)) +* **provider:** :fire: baileys fix ([928365d](https://github.com/leifermendez/bot-whatsapp/commit/928365dcafb3631acf6b1d0c239a906f8e1c4b0d)) +* **provider:** :fire: send message togther with media ([78aa23f](https://github.com/leifermendez/bot-whatsapp/commit/78aa23fab094059145f82e6781f9366d5d582b4f)) +* **provider:** :fire: send message togther with media ([b6bf43d](https://github.com/leifermendez/bot-whatsapp/commit/b6bf43d70fc28c6a229522b9b0de76cec43ac864)) +* **provider:** :zap: baileys fix restart ([ae83774](https://github.com/leifermendez/bot-whatsapp/commit/ae83774365027e2e86127ab7713ae9ee2df31f33)) +* **provider:** :zap: edit starter ([ff65832](https://github.com/leifermendez/bot-whatsapp/commit/ff65832012003423cc86d25cf0923452b1f8acb7)) +* **provider:** :zap: edit starter ([68dd182](https://github.com/leifermendez/bot-whatsapp/commit/68dd1820f05d04780824b318072d053eaf7db654)) +* **provider:** :zap: json space ([3cef741](https://github.com/leifermendez/bot-whatsapp/commit/3cef741c9ee30024eb42770a5f32931fcd372160)) +* **provider:** :zap: json space ([9b087e0](https://github.com/leifermendez/bot-whatsapp/commit/9b087e071019a7b6c79195a24dc7ddec498c5716)) +* **provider:** :zap: json space ([208fb4e](https://github.com/leifermendez/bot-whatsapp/commit/208fb4e9131dd5d4fd7230ba1aa11181337d9181)) +* **provider:** :zap: json space ([54a59c7](https://github.com/leifermendez/bot-whatsapp/commit/54a59c7f0d4dbaab006ce7e3c74412d8d3613ecd)) +* **provider:** qr-fix margin ([663641a](https://github.com/leifermendez/bot-whatsapp/commit/663641a1b8bf9234a88b0f3c38381ebc4bfa4bf9)) +* se quito addChild de las constantes porque no se usa ([ba2291a](https://github.com/leifermendez/bot-whatsapp/commit/ba2291a3ddac0d4101021e11d03cb222c5a4bb3b)) +* **starters:** :fire: updated staters ([4d4f15c](https://github.com/leifermendez/bot-whatsapp/commit/4d4f15ce73486d9335ad474d9e37c3b155670134)) +* **starters:** :fire: updated staters ([a30eaac](https://github.com/leifermendez/bot-whatsapp/commit/a30eaac77534d17eb980f6ec126140e9d30aa06e)) +* **starters:** :memo: update MIGRATION ([37fe323](https://github.com/leifermendez/bot-whatsapp/commit/37fe32322eb1bd41eecd151e52f17ec0588fb85e)) +* **starters:** :memo: update MIGRATION ([9b30e7d](https://github.com/leifermendez/bot-whatsapp/commit/9b30e7dcfc30bc160b56427cc6cdc2dc982bde2a)) +* **starters:** base templates are added for meta ([229e017](https://github.com/leifermendez/bot-whatsapp/commit/229e017ae20b84c9d12c7282f97b7034f5f33e6d)) +* **starters:** base templates are added for meta ([20f6651](https://github.com/leifermendez/bot-whatsapp/commit/20f665175c9b47226df41ce43e05574bd6ab1930)) + ### [0.1.2](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.1...v0.1.2) (2022-12-12) diff --git a/package.json b/package.json index 92f2f3d..cd6eb54 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.2", + "version": "0.1.3", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From 77c6baf46bab35dfbc212b6a4eeffa818587a2e3 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 5 Jan 2023 11:35:48 +0100 Subject: [PATCH 51/54] docs: :zap: fix icon svg --- packages/docs/src/components/icons/IconArrowDownRight.tsx | 6 +++++- packages/docs/src/components/widgets/CallToAction.tsx | 2 +- packages/docs/src/components/widgets/Collaborators.tsx | 5 ++++- packages/docs/src/components/widgets/FAQs.tsx | 8 ++++---- packages/docs/src/components/widgets/Features.tsx | 4 ++-- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/docs/src/components/icons/IconArrowDownRight.tsx b/packages/docs/src/components/icons/IconArrowDownRight.tsx index 36fe4f0..8adfab2 100644 --- a/packages/docs/src/components/icons/IconArrowDownRight.tsx +++ b/packages/docs/src/components/icons/IconArrowDownRight.tsx @@ -18,6 +18,10 @@ export const IconArrowDownRight = (props: ItemProps) => { fill="none" stroke-linecap="round" stroke-linejoin="round" - > + > + + + + ) } diff --git a/packages/docs/src/components/widgets/CallToAction.tsx b/packages/docs/src/components/widgets/CallToAction.tsx index f1eb46e..1ca9b40 100644 --- a/packages/docs/src/components/widgets/CallToAction.tsx +++ b/packages/docs/src/components/widgets/CallToAction.tsx @@ -7,7 +7,7 @@ export const handleVideo = $((ev: QwikMouseEvent) => { export default component$(() => { return ( -
+
diff --git a/packages/docs/src/components/widgets/FAQs.tsx b/packages/docs/src/components/widgets/FAQs.tsx index 829d032..28aa2c1 100644 --- a/packages/docs/src/components/widgets/FAQs.tsx +++ b/packages/docs/src/components/widgets/FAQs.tsx @@ -34,7 +34,7 @@ export default component$(() => { ] return ( -
+
@@ -52,10 +52,10 @@ export default component$(() => {
{subitems.map(({ question, answer }) => (
-

- +

+ {question} -

+
{answer .split('\n\n') .map((paragraph) => ( diff --git a/packages/docs/src/components/widgets/Features.tsx b/packages/docs/src/components/widgets/Features.tsx index 451211c..4888086 100644 --- a/packages/docs/src/components/widgets/Features.tsx +++ b/packages/docs/src/components/widgets/Features.tsx @@ -15,14 +15,14 @@ export default component$(() => { 'Se pueden automatizar tareas repetitivas y ahorrar tiempo y esfuerzo en tareas administrativas, como enviar recordatorios a tus clientes sobre pagos pendientes o para confirmar citas o reservas.', }, { - title: 'Experiencia personalizada para tus clientes', + title: 'Experiencia personalizada', description: 'Podrás enviar mensajes automatizados con ofertas especiales o recomendaciones de productos basadas en el historial de compras de tus clientes, lo que significa que tus clientes pueden recibir una experiencia más personalizada.', }, ], [ { - title: 'Análisis de datos y toma de decisiones informadas', + title: 'Análisis de datos', description: 'Te permite recopilar y analizar datos sobre tus clientes para ayudarte a entender mejor sus necesidades y preferencias, y ofrecerles un servicio aún más destacado.', icon: 'tabler:rocket', From 8d6c34d8b96a99760feae75f3c78f0baeab8d988 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 5 Jan 2023 13:17:49 +0100 Subject: [PATCH 52/54] docs: :art: lot stuff --- .../src/assets/images/full-logo-light.png | Bin 0 -> 177462 bytes packages/docs/src/assets/styles/global.css | 4 + .../docs/src/components/atoms/Netlify.tsx | 17 ++++ packages/docs/src/components/atoms/Qwik.tsx | 27 +++++++ .../docs/src/components/widgets/Footer.tsx | 73 ++++-------------- .../src/components/widgets/SponsorBar.tsx | 15 ++++ packages/docs/src/root.tsx | 1 + .../docs/src/routes/docs/database/index.mdx | 10 +++ .../docs/src/routes/docs/essential/index.mdx | 10 +++ .../docs/src/routes/docs/example/index.mdx | 11 +++ packages/docs/src/routes/docs/flows/index.mdx | 11 +++ packages/docs/src/routes/docs/index.mdx | 22 ++++-- .../docs/src/routes/docs/install/index.mdx | 71 +++++++++++------ packages/docs/src/routes/docs/join/index.mdx | 4 +- packages/docs/src/routes/docs/layout!.tsx | 2 +- .../docs/src/routes/docs/migration/index.mdx | 14 ++-- .../docs/src/routes/docs/providers/index.mdx | 10 +++ .../src/routes/docs/requirements/index.mdx | 34 ++++++++ 18 files changed, 237 insertions(+), 99 deletions(-) create mode 100644 packages/docs/src/assets/images/full-logo-light.png create mode 100644 packages/docs/src/components/atoms/Netlify.tsx create mode 100644 packages/docs/src/components/atoms/Qwik.tsx create mode 100644 packages/docs/src/routes/docs/requirements/index.mdx diff --git a/packages/docs/src/assets/images/full-logo-light.png b/packages/docs/src/assets/images/full-logo-light.png new file mode 100644 index 0000000000000000000000000000000000000000..0f14f38547cefc9d75ef13736108e9be2fef9c4d GIT binary patch literal 177462 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�Hu?W{DKM&){M!aQwBfzMd> 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%0AhlHyA5AROvVXu))1Q>>_1p4@&%6Q?o}z7~{g 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%0Ak^!|yNOXP~@M>-%EM z(%z3xU%3W7drW0QN3Luz{}ZI&BKwXh3f^3##X+>fxaRYWnBC}#ia}=qQ)`0P z$&&4L7CtY3yt*nkeA(ps&Y@yhk#TanxnazN9xKw~3I^SB^=X|6ccM;E7Cp3;ujwQJN_ zb}k4E43Amc57kI(VC~mCD}5CDRd=5*#Z&K4nRObDgR`JI9ic}EZ~WmiA%EBMT-=FL z3G*(=jE~5i!#IuAbN!r~aaS

W>cTDiJVRj$$!mU7|}J9vQ_#RNC8S(QJN+@MaaO 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

7LHxNEjy{8Ss#eL%wg? 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 literal 0 HcmV?d00001 diff --git a/packages/docs/src/assets/styles/global.css b/packages/docs/src/assets/styles/global.css index 9acba13..86f3be1 100644 --- a/packages/docs/src/assets/styles/global.css +++ b/packages/docs/src/assets/styles/global.css @@ -39,6 +39,10 @@ @apply text-xs font-mono bg-stone-100 dark:bg-slate-600 dark:text-white text-red-500 p-1 rounded; } + .slote video { + @apply rounded drop-shadow-xl w-full md:w-full max-w-screen-md; + } + .slot pre { @apply w-full flex my-2; } diff --git a/packages/docs/src/components/atoms/Netlify.tsx b/packages/docs/src/components/atoms/Netlify.tsx new file mode 100644 index 0000000..9047eab --- /dev/null +++ b/packages/docs/src/components/atoms/Netlify.tsx @@ -0,0 +1,17 @@ +export const Netlify = () => ( + + + + + + +) diff --git a/packages/docs/src/components/atoms/Qwik.tsx b/packages/docs/src/components/atoms/Qwik.tsx new file mode 100644 index 0000000..26b7cef --- /dev/null +++ b/packages/docs/src/components/atoms/Qwik.tsx @@ -0,0 +1,27 @@ +export const Qwik = () => ( + + + + + + +) diff --git a/packages/docs/src/components/widgets/Footer.tsx b/packages/docs/src/components/widgets/Footer.tsx index 98c9ea0..7c954fe 100644 --- a/packages/docs/src/components/widgets/Footer.tsx +++ b/packages/docs/src/components/widgets/Footer.tsx @@ -3,41 +3,15 @@ import { Link } from '@builder.io/qwik-city' import { IconTwitter } from '~/components/icons/IconTwitter' import { IconGithub } from '~/components/icons/IconGithub' +import { Netlify } from '../atoms/Netlify' export default component$(() => { - const links = [ - { - title: 'Product', - items: [ - { title: 'Features', href: '#' }, - { title: 'Security', href: '#' }, - ], - }, - { - title: 'Platform', - items: [ - { title: 'Developer API', href: '#' }, - { title: 'Partners', href: '#' }, - ], - }, - { - title: 'Support', - items: [ - { title: 'Docs', href: '#' }, - { title: 'Community Forum', href: '#' }, - ], - }, - { - title: 'Company', - items: [ - { title: 'About', href: '#' }, - { title: 'Blog', href: '#' }, - ], - }, - ] - const social = [ - { label: 'Twitter', icon: IconTwitter, href: '#' }, + { + label: 'Twitter', + icon: IconTwitter, + href: 'https://twitter.com/leifermendez', + }, { label: 'Github', icon: IconGithub, @@ -50,36 +24,15 @@ export default component$(() => {

-
- Nos sentimos muy afortunados de poder contribuir a - este proyecto y esperamos poder seguir trabajando - juntos para ayudar a los pequeños comercios a - impulsar sus ventas y fortalecer la economía local. +
+
+
+
- {links.map(({ title, items }) => ( -
-
- {title} -
- {items && - Array.isArray(items) && - items.length > 0 && ( -
    - {items.map(({ title, href }) => ( -
  • - - {title} - -
  • - ))} -
- )} -
- ))}
**¿Algún error?** -Recuerda que debes de cumplir con los [requisitos minimos](/docs/install) del sistema +Recuerda que debes de cumplir con los [requisitos minimos](/docs/requirements) del sistema + +--- + + diff --git a/packages/docs/src/routes/docs/install/index.mdx b/packages/docs/src/routes/docs/install/index.mdx index c83e867..342043a 100644 --- a/packages/docs/src/routes/docs/install/index.mdx +++ b/packages/docs/src/routes/docs/install/index.mdx @@ -1,40 +1,27 @@ +import Alert from '../../../components/widgets/Alert' +import Navigation from '../../../components/widgets/Navigation' + # Instalación -A continuación se describen los puntos técnicos que debes de tener en cuenta antes de trabajar con esta herramienta +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes. Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. -## Requerimientos +--- -- Node v16 o superior **[descargar node](https://nodejs.org/es/download/)** +### Comenzamos -## ¿Como instalar Node en Windows? - -https://youtu.be/xRXHQlqA3Ak?t=376 - -## ¿Como instalar Node en Ubuntu? - -Te comparto un recurso de **[Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04-es)** donde explica como instalar node en Ubuntu. - -## ¿Como saber que tengo el Node? - -Solo debes ejecutar el siguiente comando y esperar que la versión que te arroja sea superior a v16 +Crear un bot es tan sencillo como ejecutar el siguiente comando y seguir las instrucciones ```shell -$ node -v -v18.12.1 +npm create bot-whatsapp@latest ``` -## Opcionales +_Para seleccionar usa la tecla de **espacio** y para confirmar la tecla **enter**_ -Dependiendo de las opciones de configuraciones que has marcado al momento de crear el bot **Command Line Interface (CLI)** puede que necesites instalar más cosas. +El **CLI** te hace una revisión previa, de versión de Node y sistema operativo, con la finalidad de informarte si cumples los requisitos o mostrarte información de interés. -**Ejemplo**: Si elegiste _(MySQL)_ como proveedor de base de datos, lógicamente necesitaras tener un entorno de MySQL. - -📄 Pronto se agregará más información y videos explicando esto a fondo. - -
+
+ +### Plantilla + +Luego de seleccionar las opciones de tu preferencia se creara una carpeta con una plantilla de un flujo de un bot listo para ejecutar y que puedes modificar a tu gusto. +**[Ver más plantillas](https://github.com/codigoencasa/bot-whatsapp/tree/dev/starters/apps)** + +Cada plantilla tiene sus dependencias necesarias basadas en tu previa selección. **Ejemplo**, si seleccionas el proveedor de MySQL, la plantilla incorpora lo necesario para que tu conexión con la base de datos sea exitosa. + +```json + "dependencies": { + "@bot-whatsapp/bot": "latest", + "@bot-whatsapp/cli": "latest", + "@bot-whatsapp/database": "latest", + "@bot-whatsapp/provider": "latest", + "@adiwajshing/baileys": "4.4.0", + "mysql2": "^2.3.3", 👈 + }, +``` + + + 📄 Si deseas cambiar tu **proveedor o tu motor** de base de datos no es + necesario volver ejecutar el CLI (lo puedes hacer sin problema) aunque + tambien basta con solo modificar un par de lineas. [Ver + explicación](/docs/essential) + + +--- + + diff --git a/packages/docs/src/routes/docs/join/index.mdx b/packages/docs/src/routes/docs/join/index.mdx index 90ca067..8469878 100644 --- a/packages/docs/src/routes/docs/join/index.mdx +++ b/packages/docs/src/routes/docs/join/index.mdx @@ -6,6 +6,8 @@ Deseamos que te sientas cómodo y que puedas aportar tu valioso conocimiento y h Recuerda que si tienes alguna inquietud, o simplemente deseas interactuar con los otros colaboradores puedes unirte a la comunidad. +--- + ## Ventajas al unirme Participar en un proyecto de código abierto te permite aprender de manera práctica sobre tecnologías y metodologías de desarrollo de software. También puedes aprender de otros desarrolladores y contribuir a la comunidad de código abierto. @@ -21,5 +23,3 @@ Contribución al bien común Participar en un proyecto de código abierto te per Es una excelente manera de incrementar tus habilidades tecnológicas y **estar al tanto de las últimas tendencias y desarrollos en el mundo del software**. Al trabajar con otros desarrolladores y contribuir a proyectos de código abierto, tendrás la oportunidad de \*\*aprender y practicar nuevas tecnologías y metodologías, lo que te ayudará a mejorar tus habilidades y a mantenerte actualizado en el mundo en constante cambio de la tecnología. Esperamos que estés listo para **unirte a nosotros en esta emocionante aventura** - -... diff --git a/packages/docs/src/routes/docs/layout!.tsx b/packages/docs/src/routes/docs/layout!.tsx index d7d2fc6..ae261d3 100644 --- a/packages/docs/src/routes/docs/layout!.tsx +++ b/packages/docs/src/routes/docs/layout!.tsx @@ -4,6 +4,7 @@ import ExtraBar from '~/components/widgets/ExtraBar' import Footer from '~/components/widgets/Footer' import Header from '~/components/widgets/Header' import NavBar from '~/components/widgets/NavBar' +import Navigation from '~/components/widgets/Navigation' import SponsorBar from '~/components/widgets/SponsorBar' import { GlobalStore } from '~/contexts' // import Navigation from '~/components/widgets/Navigation' @@ -44,7 +45,6 @@ export default component$(() => {
-