From ab474b57287c6ef82fc5f88e7d2c57eb20d04e6e Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Sun, 29 Jan 2023 15:59:30 -0600 Subject: [PATCH] Init --- adapter/index.js | 35 ++++- app.js | 172 ++++++++++++++++++------ flow/{initial.json => initial.json.bak} | 11 ++ flow/response.json | 55 ++++++++ package-lock.json | 105 +++++++++------ 5 files changed, 292 insertions(+), 86 deletions(-) rename flow/{initial.json => initial.json.bak} (89%) diff --git a/adapter/index.js b/adapter/index.js index 12bb7ff..086c9f2 100644 --- a/adapter/index.js +++ b/adapter/index.js @@ -1,7 +1,7 @@ const { getData, getReply, saveMessageMysql } = require('./mysql') const { saveMessageJson } = require('./jsonDb') const { getDataIa } = require('./diaglogflow') -const stepsInitial = require('../flow/initial.json') +// const stepsInitial = require('../flow/initial.json') const stepsReponse = require('../flow/response.json') const { isUndefined } = require('util'); var msjsRecibidos = []; @@ -14,6 +14,23 @@ var elNum; //MOD by CHV - var cumplePasoPrevio; //MOD by CHV - const resps = require('../flow/response.json'); //MOD by CHV - Agregamos para traer las respuestas. const { appendFile } = require('fs') +/** + * Regresa un arreglo de objetos como el stepsInitial original, que se generaba desde "initial.json". + * Contiene el nombre del paso (key) y las palabras clave correspondientes (keywords). + */ +const getStepsInitial = () => { + let contSI = 0 + let stepsInitial0 = [] + for (const resp in stepsReponse) { + // console.log(`${resp}: ${stepsReponse[resp]['keywords']}`); + if(stepsReponse[resp]['keywords'] !== undefined){ + stepsInitial0[contSI]= {"keywords":stepsReponse[resp]['keywords'], "key":resp} + contSI++ + } + } + return stepsInitial0 +} +const stepsInitial = getStepsInitial() const get = (message, num) => new Promise((resolve, reject) => { //MOD by CHV - Agregamos parametro "num" para recibir el número de "app.js" // console.log(num) @@ -32,6 +49,7 @@ const get = (message, num) => new Promise((resolve, reject) => { //MOD by CHV - */ if (process.env.DATABASE === 'none') { + var { key } = stepsInitial.find(k => k.keywords.includes(message)) || { key: null } /* ############################################### * REGEXP * #################################################### @@ -290,6 +308,21 @@ function remplazos(elTexto, extraInfo){ } // return histlMsjs; } + if (laLista[i].search('%body%')>-1){//Remplaza con el body del ctx. + const {theMsg} = extraInfo; + const { body } = theMsg + elTexto = elTexto.toString().replace('%body%', body); + } + if (laLista[i].search('%from%')>-1){//Remplaza con el from del ctx. + const {theMsg} = extraInfo; + const { from } = theMsg + elTexto = elTexto.toString().replace('%from%', from); + } + if (laLista[i].search('%solonumero%')>-1){//Remplaza con el from del ctx. + const {theMsg} = extraInfo; + const { from } = theMsg + elTexto = elTexto.toString().replace('%solonumero%', from.replace('@c.us', '')); + } if (laLista[i].search('%nombre%')>-1){//Remplaza con el nombre del remitente. if(typeof extraInfo !== undefined){ const {theMsg} = extraInfo; diff --git a/app.js b/app.js index d11d2d8..f3540d8 100644 --- a/app.js +++ b/app.js @@ -175,17 +175,73 @@ const listenMessage = () => client.on('message', async msg => { const step = await getMessages(message, from); if (step) { const response = await responseMessages(step); - // console.log("URL:"+nuevaRespuesta); - // console.log("HAY URL?? : "+nuevaRespuesta.search("/URL")); - + var resps = require('./flow/response.json'); nuevaRespuesta = remplazos(resps[step].replyMessage.join(''), client); var pasoRequerido = resps[step].pasoRequerido; // var hayRequest = false; // if(hayRequest==false && nuevaRespuesta.search("/URL")>-1){console.log("Paramos flujo para que no mande el mensaje '/URL'."); return;}//Si el trigger es desbloqueo ya no hace nada mas. + // nuevaRespuesta = remplazos(resps[step].replyMessage.join(''), client); + console.log('NUEVA RESPUESTA=', nuevaRespuesta) + + if(nuevaRespuesta.search("/URL")>-1){ + + // Necesita instalado axios version 0.27.2 (npm i axios@0.27.2), si se instala una version mas nueva manda error de "GET no definido" o algo asi. + // console.log(theUrl); + console.log("========== GET URL ============"); + /* + ============================================================================ + ======================== DESBLOQUEO DE USUARIOS ========================== + ============================================================================ + */ + console.log('PASOREQUERIDO=', pasoRequerido) + if(pasoRequerido=="soporte"){ + // var theUrl=nuevaRespuesta.substring(5).replace("XXPARAM1XX",newBody); + + // const RES = await axios.get(theUrl).then(function (response) { + // const { AffectedRows } = response.data['respuesta'][0] + // console.log('AFFECTED_ROWS = ', AffectedRows) + // if(response.data['respuesta'][0]['AffectedRows']=="1"){ + // sendMessage(client, from, "Listo, usuario *"+response.data['params']['par1']+"* desbloqueado, por favor *cerrar navegadores* y reingresar.", response.trigger, step); + // } + // else{ + // sendMessage(client, from, "El usuario *"+response.data['params']['par1']+"* no *existe* o esta dado de *baja*, por favor revisarlo y volver a intentar.", response.trigger, step); + // } + // return response + // // console.log('AXIOS RES=', response) + // }).catch(function (error) { + // console.log(error); + // return error + // }); + // console.log('RES=', RES) + } + } + + if(response.hasOwnProperty('url') && response.hasOwnProperty('values')){ + let theURL = response.url; + let url0 = theURL + // console.log('EL_URL=', theURL) + let vals = response.values // Traemos los valores desde el response.json + let j = theURL.split('j=')[1] // Traemos el JSON del URL. + let j2 = JSON.parse(j) + let cont = 0 + const { params } = j2 // Traemos los parametros del JSON. + console.log('PARAMS=', params, params['par1'], Object.keys(params).length) + let url2 + for (const par in params) { // Remplazamos los valores en lo parametros. + console.log(`${par}: ${params[par]}, ${cont}: ${remplazos(vals[cont], client)}`); + if(cont==0){url2=url0.replace(params[par], remplazos(vals[cont], client));} + else {url2=url2.replace(params[par], remplazos(vals[cont], client));} + cont++ + } + // console.log('THE_URL=', url2) + desbloqueaUsuario(url2, step) //Llamamos al API para desbloquear el usuario. + return + } + /** - * Si quieres enviar botones + * Si quieres enviar imagen */ if (!response.delay && response.media) { // console.log("++++++++++++++++++++++++++++ SEND MEDIA NO DELAY +++++++++++++++++++++++++++++++++++"); @@ -199,20 +255,26 @@ const listenMessage = () => client.on('message', async msg => { } if (response.delay){ // await sendMessage(client, from, nuevaRespuesta, response.trigger, step); // Mod by CHV - Para mandar varios mensajes en el mismo response, se cambio esta linea por el forEach de abajo. - response.replyMessage.forEach( async messages => { - var thisMsg = messages.mensaje - if(Array.isArray(messages.mensaje)){thisMsg = messages.mensaje.join('\n')} - await sendMessage(client, from, remplazos(thisMsg, client), response.trigger); + setTimeout(() => { + response.replyMessage.forEach( async messages => { + var thisMsg = messages.mensaje + if(Array.isArray(messages.mensaje)){thisMsg = messages.mensaje.join('\n')} + await sendMessage(client, from, remplazos(thisMsg, client), response.trigger); + }) }, response.delay) - } - else{ + } + else + { // await sendMessage(client, from, nuevaRespuesta, response.trigger, step); // Mod by CHV - Para mandar varios mensajes en el mismo response, se cambio esta linea por el forEach de abajo. response.replyMessage.forEach( async messages => { var thisMsg = messages.mensaje if(Array.isArray(messages.mensaje)){thisMsg = messages.mensaje.join('\n')} await sendMessage(client, from, remplazos(thisMsg, client), response.trigger); }) - } + } + /** + * Si quieres enviar botones o listas + */ if(response.hasOwnProperty('actions')){ const { actions } = response; // console.log("++++++++++++++++++++++++++++ SEND MESG BUTTON/LIST +++++++++++++++++++++++++++++++++++"); @@ -228,15 +290,6 @@ const listenMessage = () => client.on('message', async msg => { } return } - /** - * Regresa el mensaje enviado, con los remplazos procesados. - */ - if(message.search('/rpt') > -1){ - newBody = remplazos(newBody, client); - newBody = newBody.replace("/rpt ", ""); - client.sendMessage(from, newBody); - return - } /* ============================================================================ @@ -297,17 +350,17 @@ const listenMessage = () => client.on('message', async msg => { /** * Si quieres enviar botones */ - if(response.hasOwnProperty('actions')){ - const { actions } = response; - if(actions['sections'] === undefined){ //Botones - console.log("Botones") - await sendMessageButton(client, from, null, actions); - } - else{ //Listas - console.log("Listas") - await sendMessageList(client, from, null, actions); - } - } + // if(response.hasOwnProperty('actions')){ + // const { actions } = response; + // if(actions['sections'] === undefined){ //Botones + // console.log("Botones") + // await sendMessageButton(client, from, null, actions); + // } + // else{ //Listas + // console.log("Listas") + // await sendMessageList(client, from, null, actions); + // } + // } return } }); @@ -334,34 +387,34 @@ const listenMessageFromBot = () => client.on('message_create', async botMsg => { } }); - client = new Client({ +client = new Client({ authStrategy: new LocalAuth(), puppeteer: { headless: true, args: ['--no-sandbox','--disable-setuid-sandbox'] } - }); +}); - client.on('qr', qr => generateImage(qr, () => { +client.on('qr', qr => generateImage(qr, () => { qrcode.generate(qr, { small: true }); console.log(`Ver QR http://localhost:${port}/qr`) socketEvents.sendQR(qr) - })) +})) - client.on('ready', (a) => { +client.on('ready', (a) => { connectionReady() listenMessage() listenMessageFromBot() // socketEvents.sendStatus(client) - }); +}); - client.on('auth_failure', (e) => { +client.on('auth_failure', (e) => { // console.log(e) // connectionLost() - }); +}); - client.on('authenticated', () => { +client.on('authenticated', () => { console.log('AUTHENTICATED'); - }); +}); - client.initialize(); +client.initialize(); /** * Verificamos si tienes un gesto de db @@ -375,6 +428,41 @@ const listenMessageFromBot = () => client.on('message_create', async botMsg => { console.log(`El server esta listo en el puerto ${port}`); }) checkEnvFile(); + + /** + * Llama el API para desbloquear el usuario. + * + * @param {*} theURL El URL para llamar al API + * @param {*} step + */ + async function desbloqueaUsuario (theUrl, step) { + const {from} = client.theMsg + const RES = await axios.get(theUrl).then(function (response) { + const { AffectedRows } = response.data['respuesta'][0] + console.log('AFFECTED_ROWS = ', AffectedRows) + if(response.data['respuesta'][0]['AffectedRows']=="1"){ + sendMessage(client, from, "Listo, usuario *"+response.data['params']['par1']+"* desbloqueado, por favor *cerrar navegadores* y reingresar.", response.trigger, step); + } + else{ + sendMessage(client, from, "El usuario *"+response.data['params']['par1']+"* no *existe* o esta dado de *baja*, por favor revisarlo y volver a intentar.", response.trigger, step); + } + return response + }).catch(function (error) { + console.log(error); + return error + }); + + + + + // const r = await axios.get(theUrl).then(function (response) { + // console.log('AXIOS RES=', response) + // }).catch(function (error) { + // console.log(error); + // return error + // }) + // return Promise.resolve(r) +} function chkFile(theFile){ //MOD by CHV - Agregamos para revisar que exista el archivo "chats/numero.json" if (fs.existsSync(theFile)) { diff --git a/flow/initial.json b/flow/initial.json.bak similarity index 89% rename from flow/initial.json rename to flow/initial.json.bak index a4dfb3e..99158c3 100644 --- a/flow/initial.json +++ b/flow/initial.json.bak @@ -86,5 +86,16 @@ { "keywords": "*pak*3*|*pak*angular*|*paquete*3*|*paquete*angular*", "key": "paq3" + }, + { + "keywords": [ + "/soporte", + "/ayuda" + ], + "key": "soporte" + }, + { + "keywords": "*", + "key": "Desbloqueo" } ] \ No newline at end of file diff --git a/flow/response.json b/flow/response.json index 8663c30..723a7e9 100644 --- a/flow/response.json +++ b/flow/response.json @@ -15,6 +15,7 @@ "trigger":null }, "doblemensaje":{ + "keywords": "7|*doble*mensaje*", "replyMessage":[ {"mensaje":["Este es un ejemplo del envío de *varios* mensajes con la *misma regla* en el *response.json*"]}, { @@ -27,6 +28,7 @@ "goto":"menu" }, "menu":{ + "keywords": ["/menu"], "replyMessage":[ { "mensaje":[ @@ -45,6 +47,7 @@ "trigger":null }, "opcion1":{ + "keywords": ["1"], "replyMessage":[ { "mensaje":[ @@ -64,6 +67,7 @@ "goto":"menu" }, "opcion2":{ + "keywords": ["2"], "replyMessage":[ { "mensaje":[ @@ -81,6 +85,7 @@ "goto":"menu" }, "opcion3":{ + "keywords": ["3"], "replyMessage":[ { "mensaje":[ @@ -95,6 +100,7 @@ "pasoRequerido":"menu" }, "recibenombre":{ + "keywords": "*", "replyMessage":[ { "mensaje":[ @@ -109,6 +115,7 @@ "goto":"menu" }, "gRevisaCliente":{ + "keywords": "*", "replyMessage":[ { "mensaje":[ @@ -121,6 +128,7 @@ "pasoRequerido":"gallina" }, "gGuardainfo":{ + "keywords": "*", "replyMessage":[ { "mensaje":[ @@ -133,6 +141,7 @@ "pasoRequerido":"gRevisaCliente" }, "rnd":{ + "keywords": ["rnd"], "replyMessage":[ { "mensaje":[ @@ -150,6 +159,7 @@ "trigger":null }, "rnd2":{ + "keywords": ["rnd2"], "replyMessage":[ { "mensaje":[""] @@ -169,6 +179,7 @@ } }, "lista":{ + "keywords": ["4"], "replyMessage":[ { "mensaje":["*%saludo%*, este es un ejemplo de listas"] @@ -195,6 +206,7 @@ "goto":"menu" }, "botones":{ + "keywords": ["5"], "replyMessage":[ { "mensaje":["*%saludo%*, este es un ejemplo de botones"] @@ -216,6 +228,7 @@ "goto":"menu" }, "cursos":{ + "keywords": ["cursos"], "replyMessage":[ { "mensaje":["*%saludo% %primer_nombre%*, seleccionaste *Cursos*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."] @@ -226,6 +239,7 @@ "goto":"menu" }, "youtube":{ + "keywords": ["youtube"], "replyMessage":[ { "mensaje":["*%saludo% %primer_nombre%*, seleccionaste *YouTube*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."] @@ -236,6 +250,7 @@ "goto":"menu" }, "telegram":{ + "keywords": ["telegram"], "replyMessage":[ { "mensaje":["*%saludo% %primer_nombre%*, seleccionaste *Telegram*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."] @@ -246,6 +261,7 @@ "goto":"menu" }, "manzana":{ + "keywords": ["manzana"], "replyMessage":[ { "mensaje":["*%saludo% %primer_nombre%*, seleccionaste *manzana*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."] @@ -256,6 +272,7 @@ "goto":"menu" }, "mango":{ + "keywords": ["mango"], "replyMessage":[ { "mensaje":["*%saludo% %primer_nombre%*, seleccionaste *mango*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."] @@ -266,6 +283,7 @@ "goto":"menu" }, "platano":{ + "keywords": ["platano"], "replyMessage":[ { "mensaje":["*%saludo% %primer_nombre%*, seleccionaste *platano*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."] @@ -276,6 +294,7 @@ "goto":"menu" }, "paq3":{ + "keywords": "*pak*3*|*pak*angular*|*paquete*3*|*paquete*angular*", "replyMessage":[ { "mensaje":["*%saludo% %primer_nombre%*, seleccionaste el *paquete 3 de Angular*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."] @@ -286,6 +305,7 @@ "goto":"menu" }, "botonespaq3":{ + "keywords": ["6"], "replyMessage":[ { "mensaje":["*%saludo%*, este es un ejemplo de botones y regExp"] @@ -305,5 +325,40 @@ }, "pasoRequerido":"menu", "goto":"menu" + }, + "soporte":{ + "keywords":["/soporte", "/ayuda"], + "replyMessage":[ + { + "mensaje":[ + "Bienvenido al soporte de Keymon, soy *Bow*.\n\n", + "Dame por favor el usuario que quieres desbloquear respetando *mayúsculas* y *minúsculas*." + ] + } + ], + "media":null, + "trigger":null + }, + "Desbloqueo":{ + "keywords": "*", + "replyMessage":[ + "/URL=http://localhost:8888/dbrquery?j={\"query\":\"update_usuario_guna_nobajas\",\"exec\":\"ExecuteCommand\",\"params\":{\"par1\":\"XXPARAM1XX\"}}" + ], + "url":"http://localhost:8888/dbrquery?j={\"query\":\"update_usuario_guna_nobajas\",\"exec\":\"ExecuteCommand\",\"params\":{\"par1\":\"XXPARAM1XX\", \"par2\":\"XXPARAM2XX\", \"par3\":\"XXPARAM3XX\"}}", + "values":["%body%","CDIAZ","%solonumero%"], + "media":null, + "trigger":null, + "pasoRequerido":"soporte" + }, + "gunaCats":{ + "keywords": "*", + "replyMessage":[ + "/URL=http://localhost:8888/dbrquery?j={\"query\":\"update_usuario_guna_nobajas\",\"exec\":\"ExecuteCommand\",\"params\":{\"par1\":\"XXPARAM1XX\"}}" + ], + "url":"http://localhost:8888/dbrquery?j={\"query\":\"update_usuario_guna_nobajas\",\"exec\":\"ExecuteCommand\",\"params\":{\"par1\":\"XXPARAM1XX\", \"par2\":\"XXPARAM2XX\", \"par3\":\"XXPARAM3XX\"}}", + "values":["%body%","CDIAZ","%solonumero%"], + "media":null, + "trigger":null, + "pasoRequerido":"soporte" } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c341a09..945db22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { - "name": "test-ws-bot", - "version": "1.0.0", + "name": "chv-wweb-bot", + "version": "1.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "test-ws-bot", - "version": "1.0.0", + "name": "chv-wweb-bot", + "version": "1.0.1", "license": "ISC", "dependencies": { "@google-cloud/dialogflow": "^5.2.0", @@ -25,7 +25,7 @@ "qrcode-terminal": "^0.12.0", "socket.io": "^4.5.1", "stormdb": "^0.6.0", - "whatsapp-web.js": "github:cheveguerra/whatsapp-web.js#WaWJS", + "whatsapp-web.js": "github:cheveguerra/whatsapp-web.js#WaWJS2", "xlsx": "^0.18.5" }, "devDependencies": { @@ -37,9 +37,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -576,9 +576,9 @@ } }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "bin": { "acorn": "bin/acorn" }, @@ -1330,6 +1330,25 @@ "node-fetch": "2.6.7" } }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/culvert": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", @@ -1526,9 +1545,9 @@ } }, "node_modules/engine.io-parser": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.5.tgz", - "integrity": "sha512-mjEyaa4zhuuRhaSLOdjEb57X0XPP9JEsnXI4E+ivhwT0GgzUogARx4MqoY1jQyB+4Bkz3BUOmzL7t9RMKmlG3g==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", "engines": { "node": ">=10.0.0" } @@ -2162,9 +2181,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -3030,9 +3049,9 @@ } }, "node_modules/marked": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.5.tgz", - "integrity": "sha512-jPueVhumq7idETHkb203WDD4fMA3yV9emQ5vLwop58lu8bTclMghBWcYAavlDqIEMaisADinV1TooIFCfqOsYQ==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", + "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==", "bin": { "marked": "bin/marked.js" }, @@ -3255,9 +3274,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz", + "integrity": "sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -3330,9 +3349,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3908,9 +3927,9 @@ } }, "node_modules/protobufjs-cli/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3926,9 +3945,9 @@ } }, "node_modules/protobufjs-cli/node_modules/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4195,9 +4214,9 @@ } }, "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4518,9 +4537,9 @@ "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" }, "node_modules/socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -4774,9 +4793,9 @@ } }, "node_modules/systeminformation": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.17.1.tgz", - "integrity": "sha512-NX/EjbKznOTgt2pfCzZb5bPj5YJOO9mCUrRXquGMtmlfs+BowVaMsJSUUCvqOm9wexx4/F+ng4JQp6I4sG+SyA==", + "version": "5.17.4", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.17.4.tgz", + "integrity": "sha512-mEiIYrw7X5ABX8tJUgzbumQAuFQxNyHdZDz6+UtwNKUbKgIoZqLtug2z1spFB/LiXZne5tdPBJOlvVckbvfhiQ==", "dev": true, "optional": true, "os": [ @@ -5120,8 +5139,8 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatsapp-web.js": { - "version": "1.18.4", - "resolved": "git+ssh://git@github.com/cheveguerra/whatsapp-web.js.git#b3e5d99f521c6d594fd2e204f12d3fd8ae4eba3b", + "version": "1.19.2", + "resolved": "git+ssh://git@github.com/cheveguerra/whatsapp-web.js.git#025f9914c3ee090c760fe6f2218e68b8bc9225af", "license": "Apache-2.0", "dependencies": { "@pedroslopez/moduleraid": "^5.0.2",