diff --git a/.env b/.env index 81114ea..90bc32a 100644 --- a/.env +++ b/.env @@ -13,4 +13,4 @@ KEEP_DIALOG_FLOW=false MULTI_DEVICE=true DIALOGFLOW_MEDIA_FOR_SLOT_FILLING=false GDRIVE_FOLDER_ID= -PROVIDER=baileys \ No newline at end of file +PROVIDER=wwebjs \ No newline at end of file diff --git a/README.md b/README.md index 57984b6..e7dc4df 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ ## Chatbot Whatsapp (OpenSource) -#### Actualizado Diciembre 2022 +#### Actualizado Febrero 2023 Este proyecto es un clon de la **version 1** (legacy) de [Leifer Mendez](https://github.com/leifermendez/bot-whatsapp) y tiene las siguientes modificaciones: @@ -33,7 +33,7 @@ Este proyecto es un clon de la **version 1** (legacy) de [Leifer Mendez](https:/ "pasoRequerido":"menu" } ``` - - Permite **expresiones regulares** en las palabras predefinidas en el initial.json. + - Permite **expresiones regulares** en las palabras predefinidas en el **initial.json**. - Si queremos usar RegExp, en los "keywords" de **inital.json**, en lugar de un arreglo, debemos usar un string ( quitamos los [] ) y en él usamos "*" para significar cualquier texto y "|" para significar "OR", esto nos permite ser mas flexibles con los "keywords", por ejemplo, si queremos que el mensaje pueda decir: @@ -62,23 +62,30 @@ Este proyecto es un clon de la **version 1** (legacy) de [Leifer Mendez](https:/ - Ponemos __%dia_semana%__ para que aparezca "lunes, martes, miercoles, etc" dependiendo del día de la semana. - Ponemos __%msjant_XX%__ para que aparezca el mensaje xx anterior, es decir, si quieres mostrar el texto de 2 mensajes anteriores se pone %msjant_2%. - etc, etc, se pueden agregar mas remplazos en la funcion "remplazos" en el archivo "adapter\index.js". - - Permite el envío de **multiples mensajes** definidos en la **misma respuesta** del **response.json**. (Esta modificación se la robe por completo a [KJoaquin](https://github.com/KJoaquin), el lo solucionó [aquí](https://github.com/codigoencasa/bot-whatsapp/issues/111#issuecomment-1353504575) 🙌🏽 y yo solo lo adapté a mi repo!) + + + - Permite el envío de **multiples mensajes** (burbujas o globos) definidos en la **misma respuesta** del **response.json**. (Esta modificación se la robe por completo a [KJoaquin](https://github.com/KJoaquin), el lo solucionó [aquí](https://github.com/codigoencasa/bot-whatsapp/issues/111#issuecomment-1353504575) 🙌🏽 y yo solo lo adapté a mi repositorio!.) Antes: ```json { - "ejemploViejo":{ - "replyMessage":["¿Hola como estas?"], + "ejemploViejo": + { + "replyMessage": + [ + "¿Hola como estas?" + ], "media":null, "trigger":null } } ``` - Ahora **replyMessage** debe de contener un arreglo con los mensajes que se van a enviar: + Ahora "```replyMessage```" debe de contener un arreglo con los mensajes que se van a enviar: ```json { "ejemploNuevo":{ - "replyMessage":[ + "replyMessage": + [ { "mensaje":["¿Hola como estas?"]}, { "mensaje":["Este es el *segundo* mensaje.","Contiene dos lineas 🤪"]}, { "mensaje":["Este es el *tercer* mensaje"]} @@ -88,9 +95,58 @@ Este proyecto es un clon de la **version 1** (legacy) de [Leifer Mendez](https:/ } } ``` + - Permite conectarse a **APIs**, por ejemplo: Google Sheets, Excel y cualquier otra API que se pueda llamar desde una función, esto se hace agregando el parámetro "```funcion```" al **response.json**, la funcion especificada recibe automaticamente una variable con toda la información del *mensaje recibido*. + ```response.json``` + ``` + "Desbloqueo":{ + "keywords": "desbloqueo", + "replyMessage":[ + "Mensaje de desbloqueo de usuarios." + ], + "funcion":"getFakeHTTP", //esta linea ejecuta la funcion. + "media":null, + "trigger":null, + "pasoRequerido":"soporte" + } + + ``` + ```app.js``` + ``` + function fakeHTTP(data){ + let body = data.theMsg.body + let from= data.theMsg.from + } + ``` + - Los archivos **initial.json** y **response.json** se unificaron, y ya solo se usa el **response.json**, para esto solo se agrega el parametro "```keywords```" del **initial.json** al **response.json**. + + ```response.json``` + ``` + "Desbloqueo":{ + "keywords": "desbloqueo", //Esta linea se trae desde initial.json + "replyMessage":[ + "Mensaje de desbloqueo de usuarios." + ], + "media":null, + "trigger":null, + "pasoRequerido":"soporte" + } + + ``` + + + - Se puede especificar que al terminar un paso, el flujo se **vaya automaticamente** a otro, por ejemplo, si tenemos un flujo de tres pasos, y queremos que al terminar el tercer paso se regrese automaticamente al primero, agregamos el parametro "```goto```" al **response.json** del tercer paso y ponemos el nombre del paso 1. + ``` + "paso3":{ + "keywords": ["zapatos"], + "replyMessage":["Gracias por tu compra"], + "media":null, + "trigger":null, + "goto":"paso1" + }, + ``` - Las modificaciones están enfocadas al uso de los archivos __initial.json__ y __response.json__, yo no uso MySQL o DialogFlow, así que no sé si las modificaciones funcionen con esos modulos, en particular el __remplazo %msjant_XX%__ depende de los archivos __JSON__ que se crean en el directorio "chats". - - Tiene agregado el parche de **botones y listas**, así que funcionan sin problema (las listas no funcionan si el bot esta ligado a un número que use **Whatsapp Business**). + - Tiene agregado el parche de **botones y listas**, así que funcionan sin problema (las listas no funcionan si el bot esta **ligado** a un número que use **Whatsapp Business**). - Tiene los ultimos parches de **DialogFlow** (27-dic-2022) (When Dialogflow asks for an Image, then **Upload it to Google Drive** and then generate Shared Link) ## INICIA DOCUMENTACION DEL PROYECTO ORIGINAL @@ -106,7 +162,7 @@ El siguiente proyecto se realizó con fines educativos para el canal de [Youtube > [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 +Hola amigos me gusta mucho este proyecto pero por cuestiones de tiempo se me dificulta mantener las actualizaciones si alguno quiere participar en el proyecto escribanme a leifer.contacto@gmail.com #### Acceso rápido > Si tienes una cuenta en __heroku__ puedes desplegar este proyecto con (1 click) @@ -237,7 +293,7 @@ __Listo 😎__ ![](https://i.imgur.com/OSUgljQ.png) -> Ahora deberías obtener un arespuesta por parte del BOT como la siguiente, ademas de esto tambien se crea un archivo excel +> Ahora deberías obtener una respuesta 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) diff --git a/adapter/gdrive,.js b/adapter/gdrive,.js index 15be1b7..1a2f544 100644 --- a/adapter/gdrive,.js +++ b/adapter/gdrive,.js @@ -5,7 +5,7 @@ const fs = require('fs'); //const clientEmail = require(`${__dirname}/../chatbot-account.json`); /** - * La funcion 'generatePublicUrl' genera un error muy menor al enviar el 'requestBody' + * La funcion 'generatePublicUrl' genera un error muy pequeño 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: { @@ -51,6 +51,7 @@ if (process.env.DATABASE === 'dialogflow') { }, fields: 'id,name', }); + generatePublicUrl(id).then(() => { console.log(`Se generó enlace https://drive.google.com/open?id=${id} para el archivo ${name}`); }); diff --git a/adapter/index.js b/adapter/index.js index 51fb65d..6074516 100644 --- a/adapter/index.js +++ b/adapter/index.js @@ -218,19 +218,18 @@ const getIA = (message) => new Promise((resolve, reject) => { /** * * @param {*} message - * @param {*} date - * @param {*} trigger + * @param {*} date * @param {*} number * @returns */ -const saveMessage = ( message, trigger, number, regla ) => new Promise( async (resolve, reject) => { //MOD by CHV - Agregamos el partametro "regla" para poder guardarlo en "chats/numero.json" +const saveMessage = ( message, number, regla ) => new Promise( async (resolve, reject) => { //MOD by CHV - Agregamos el partametro "regla" para poder guardarlo en "chats/numero.json" switch ( process.env.DATABASE ) { case 'mysql': - resolve( await saveMessageMysql( message, trigger, number ) ) + resolve( await saveMessageMysql( message, number ) ) break; case 'none': - resolve( await saveMessageJson( message, trigger, number, regla) ) //MOD by CHV - Agregamos el parametro "regla" - console.log("Guardamos mensaje JSON=", message) + resolve( await saveMessageJson( message, number, regla) ) //MOD by CHV - Agregamos el parametro "regla" + // console.log("Guardamos mensaje JSON =", message) break; default: resolve(true) diff --git a/adapter/jsonDb.js b/adapter/jsonDb.js index 4ca72ba..4b70982 100644 --- a/adapter/jsonDb.js +++ b/adapter/jsonDb.js @@ -1,14 +1,14 @@ const Path = require('path') const StormDB = require("stormdb"); const date = new Date().toISOString(); -const saveMessageJson = (message, trigger, number, regla) => new Promise( async(resolve,reject) =>{ +const saveMessageJson = (message, number, regla) => new Promise( async(resolve,reject) =>{ try { const engine = new StormDB.localFileEngine( Path.join(__dirname, `/../chats/${number}.json`) ); const db = new StormDB(engine); // set default db value if db is empty db.default({ messages: [] }); // add new users entry - db.get("messages").push({ message, date, trigger, regla}); + db.get("messages").push({ message, date, regla}); db.save(); resolve('Saved') } catch (error) { diff --git a/adapter/mysql.js b/adapter/mysql.js index e92cf97..28cd329 100644 --- a/adapter/mysql.js +++ b/adapter/mysql.js @@ -47,10 +47,10 @@ getMessages = ( number ) => new Promise((resolve,reejct) => { } }) -saveMessageMysql = ( message, date, trigger, number ) => new Promise((resolve,reejct) => { +saveMessageMysql = ( message, date, number ) => new Promise((resolve,reejct) => { try { connection.query( - `INSERT INTO ${DATABASE_NAME}.messages `+"( `message`, `date`, `trigger`, `number`)"+` VALUES ('${message}','${date}','${trigger}', '${number}')` , (error, results) => { + `INSERT INTO ${DATABASE_NAME}.messages `+"( `message`, `date`, `number`)"+` VALUES ('${message}','${date}', '${number}')` , (error, results) => { if(error) { //TODO esta parte es mejor incluirla directamente en el archivo .sql template console.log('DEBES DE CREAR LA TABLA DE MESSAGE') diff --git a/app.js b/app.js index 3b283bf..6e9a83f 100644 --- a/app.js +++ b/app.js @@ -6,16 +6,18 @@ global.provider = process.env.PROVIDER || 'wwebjs'; const fs = require('fs'); global.siguientePaso = [{"numero":"1", "va":"XXX"}]; //MOD by CHV - Agregamos para pasar el VAMOSA a "index.js" global.pasoAnterior = []; -const axios = require('axios').default; -const { List } = require('whatsapp-web.js'); +global.vars = [] // const mysqlConnection = require('./config/mysql') -const { initBot, traeVariables } = require(`./provider/${provider}`) +if( provider == 'baileys' ){ const { initBot } = require(`./provider/baileys`) } +else { const { initBot } = require(`./provider/wwebjs`) } const { isValidNumber } = require('./controllers/handle') const { saveMedia, saveMediaToGoogleDrive } = require('./controllers/save') const { getMessages, responseMessages, bothResponse, waitFor } = require('./controllers/flows') -const { sendMedia, sendMessage, sendMessageButton, sendMessageList, readChat } = require(`./controllers/send_${provider}`); +const { sendMedia, sendMessage, sendMessageButton, sendMessageList, readChat } = require(`./controllers/send`); const { stepsInitial, vamosA, traeUltimaVisita } = require('./adapter/index');//MOD by CHV - Agregamos para utilizar remplazos y stepsInitial -const { removeDiacritics, getRandomInt, remplazos, soloNumero, agregaVars } = require('./implementaciones/extraFuncs') +const { removeDiacritics, getRandomInt, remplazos, soloNumero, agregaVars, traeVariablesFromMsg, traeVariablesFromClient } = require('./implementaciones/extraFuncs') +const appFuncs = require('./implementaciones/appFuncs') +// import * as appFuncs from './implementaciones/appFuncs' // const { guardaXLSDatos, leeXLSDatos} = require('./Excel'); // const { ingresarDatos, leerDatos } = require('./implementaciones/sheets') const MULTI_DEVICE = process.env.MULTI_DEVICE || 'true'; @@ -25,18 +27,32 @@ let client0 var dialogflowFilter = false; var newBody; //MOD by CHV - var nuevaRespuesta; //MOD by CHV - Se agrego para los remplazos -var vars = [] let blackList = ['34692936038', '34678310819', '34660962689', '34649145761','34630283553','34648827637','34630255646','14178973313'] +// ############################################################################################################ +// ########################## AQUI SE DECLARAN LAS FUNCIONES PERSONALIZADAS DESDE ######################### +// ######################## EL ARCHIVO APPFUNCS.JS EN EL DIRECTORIO IMPLEMENTACIONES ###################### +// ############################################################################################################ + +const arrayOfAppFuncs = Object.entries(appFuncs); +// console.log(arrayOfAppFuncs) +// console.log(arrayOfAppFuncs[0][0], arrayOfAppFuncs[0][1]) +for(thisF = 0; thisF < arrayOfAppFuncs.length; thisF++){ + // console.log(arrayOfAppFuncs[thisF][0], "|", arrayOfAppFuncs[thisF][1]) + // console.log(eval(arrayOfAppFuncs[thisF][0]), "|", arrayOfAppFuncs[thisF][1]) + global[arrayOfAppFuncs[thisF][0]] = arrayOfAppFuncs[thisF][1] + // eval(arrayOfAppFuncs[thisF][0]) = eval(arrayOfAppFuncs[thisF][1]) +} + /** - * Escuchamos cuando entre un mensaje + * Escuchamos cuando entra un mensaje */ function listenMessage(client){ if(provider == 'wwebjs'){ client0 = client; messageEV = 'message' } // Usamos WWebJS. else { client0 = client.ev; messageEV = 'messages.upsert' } // Usamos Baileys. client0.on(messageEV, async msg => { - const { from, body, name, hasMedia } = traeVariables(msg); if(provider == 'wwebjs'){ msg.type = 'notify' } + const { from, body, name, hasMedia } = traeVariablesFromMsg(msg); if (vars[from] === undefined) vars[from] = [] // Este bug lo reporto Lucas Aldeco Brescia para evitar que se publiquen estados if (from === 'status@broadcast' || msg.type !== 'notify') { console.log("++++++ status@broadcast o tipo mensaje = ", msg.type); return } @@ -50,8 +66,8 @@ function listenMessage(client){ // * Blacklist, los telefonos incluidos en este arreglo son ignorados por el bot. if (blackList.includes(number)){ console.log('BlackListed'); return } var { key } = stepsInitial.find(k => k.keywords.includes(message)) || { key: null }//MOD by CHV - Se agrega para obtener KEY - await readChat(number, message, null , key) //MOD by CHV - Agregamos key/regla para guardarla en "chats/numero.json" - client = agregaVars(client, msg, traeVariables(msg)) + await readChat(number, message, key) //MOD by CHV - Agregamos key/regla para guardarla en "chats/numero.json" + client = agregaVars(client, msg, traeVariablesFromMsg(msg)) client.theMsg['key'] = key /** @@ -105,276 +121,6 @@ function listenMessage(client){ nuevaRespuesta = remplazos(resps[step].replyMessage.join(''), client); client.theMsg['replyMessage'] = nuevaRespuesta - // ############################################################################################################ - // ############################## INICIAN FUNCIONES PERSONALIZADAS ##################################### - // ############################################################################################################ - - /** - * Llama el API para traer categorias de Guna. - * @param {*} ctx El objeto del mensaje. - */ - async function getGunaCats(ctx) { - let theUrl = `http://localhost:8888/dbrquery?j={"query":"selectTipoFerreroMty","exec":"ExecuteQuery","params":{"par1":"xxx"}}` - const RES = await axios.get(theUrl).then(function (response) { - let lasOpciones = [] - for(reg=0;reg -1){ // Producto con formato correcto. - vars[from]['ultimoProd'] = elProd - elProd = elProd.substring(0, elProd.indexOf(' $')).trim().toLowerCase() - var precio = ctx.theMsg.body.substring(ctx.theMsg.body.indexOf(' $')+2) - // console.log("precio",precio) - precio = precio.substring(0, precio.indexOf(',')) - // console.log("precio",precio) - vars[from]['prods'][elProd] = {"cant":0, "precio":precio} - // console.log("EL_PROD=", elProd) - // console.log(vars[from]['prods']) - elMensaje = ctx.theMsg.replyMessage - let re = ctx.theMsg.body.trim().toLowerCase() - elMensaje = elMensaje.replace(re, elProd.toLowerCase()) - } - else{ // Producto SIN precio. - elMensaje = "El producto que seleccionaste es *incorrecto*, por favor intenta de nuevo." - sendMessage(client, from, elMensaje, ctx.theMsg.trigger, ctx.theMsg.step); - await delay(500) - vars[from]['recompra'] = true - getGunaProds() - vamosA(from, "gunaProds") - return - } - sendMessage(client, from, elMensaje, ctx.theMsg.trigger, ctx.theMsg.step); - return - } - /** - * Tomamos la cantidad del producto seleccionado. - * @param {*} ctx El objeto del mensaje. - */ - async function prodCantidad(ctx) { - // console.log("Entramos a prodCantidad") - let laCant = ctx.theMsg.body.trim() - const reg = new RegExp(/^\d+$/) - let elProd = vars[from]['ultimoProd'].toLowerCase() - elProd = elProd.substring(0, elProd.indexOf(' $')).trim() - console.log("SOLO NUMS |" + laCant + "|", reg.test(laCant)) - if(reg.test(laCant)){ - // console.log(vars) - // console.log("Recibimos cant = " + laCant) - // console.log("EL_PROD=", vars[from]['prods'][elProd]) - // console.log("precio=", vars[from]['prods'][elProd].precio) - vars[from]['prods'][elProd] = {"cant":laCant, "precio":vars[from]['prods'][elProd]['precio']} - var elMensaje = "" - const prods = Object.keys(vars[from]['prods']); - var total = 0 - prods.forEach((prod, index) => { - if( vars[from]['prods'][prod] !== undefined && prod[0] !== undefined ){ - elMensaje = elMensaje + `${vars[from]['prods'][prod].cant} - ${prod[0].toUpperCase() + prod.substring(1)}\n` - console.log("cant y precio=", vars[from]['prods'][prod].cant, vars[from]['prods'][prod].precio) - if(reg.test(vars[from]['prods'][prod].cant) && vars[from]['prods'][prod].precio != ""){ - total = total + (vars[from]['prods'][prod].cant * vars[from]['prods'][prod].precio) - } - } - console.log(prod, vars[from]['prods'][prod]); - }); - let pesos = Intl.NumberFormat('en-US') - elMensaje = elMensaje + "\n*Total*: $" + pesos.format(total) - elMensaje = elMensaje + "\n¿Quieres agregar mas productos a tu orden?" - var bts = { - "title":"Tu orden", - "message":elMensaje, - "buttons":[ - {"body":"➕ Agregar productos"}, - {"body":"⬅️ Cambiar categoría"}, - {"body":"✖️ Terminar"} - ] - } - sendMessageButton(client, from, "xxx", bts) - } - else{ - console.log("NO SOLO NUMS") - vamosA(from, "gunaProdsAgrega") - sendMessage(client, from, "Por favor escribe 👉🏽 *solo* 👈🏽 el número.", response.trigger, step); - } - return "1" - } - /** - * Mandamos nuevamente la lista de productos. - * @param {*} ctx El objeto del mensaje. - */ - async function comprarMas(ctx) { - console.log("Entramos a comprarMas") - vars[from]['recompra'] = true - vamosA(from, "gunaProds") - await getGunaProds(ctx) - vars[from]['recompra'] = undefined - return "1" - } - /** - * Mandamos nuevamente la lista de categorías. - * @param {*} ctx El objeto del mensaje. - */ - async function terminaCompra(ctx) { - console.log("Entramos a terminaCompra") - vars[from] = [] - sendMessage(client, from, "!Gracias por tu compra, regresa pronto!", response.trigger, step); - return - } - /** - * Llama el API para desbloquear un usuario. - * @param {*} ctx El objeto del mensaje. - */ - async function desbloqueaUsuario(ctx) { - let par1 = ctx.theMsg.body - let theUrl = `http://localhost:8888/dbrquery?j={"query":"update_usuario_guna_nobajas","exec":"ExecuteCommand","params":{"par1":"${par1}", "par2":"XXPARAM2XX", "par3":"XXPARAM3XX"}}` - 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 - }); - } - /** - * Llama el API para desbloquear el usuario. - * - * @param {*} theURL El URL para llamar al API - * @param {*} step - */ - async function desbloqueaUsuario2(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 - // }); - } - // #################################################################################################################### // ############################## INICIAN FUNCIONES PARA MANEJO DE PARAMETROS ##################################### // ############################## EN EL RESPONSE.JSON ##################################### @@ -392,7 +138,7 @@ function listenMessage(client){ */ if (!response.delay && response.media) { // console.log("++++++++++++++++++++++++++++ SEND MEDIA NO DELAY +++++++++++++++++++++++++++++++++++"); - await sendMedia(client, from, response.media, response.trigger); + await sendMedia(client, from, response.media); console.log("Enviamos imagen") await delay(500) } @@ -402,7 +148,7 @@ function listenMessage(client){ if (response.delay && response.media) { setTimeout(() => { // console.log("++++++++++++++++++++++++++++ SEND MEDIA AND DELAY +++++++++++++++++++++++++++++++++++"); - sendMedia(client, from, response.media, response.trigger); + sendMedia(client, from, response.media); }, response.delay) } /** @@ -414,7 +160,7 @@ function listenMessage(client){ 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); + await sendMessage(client, from, remplazos(thisMsg, client), step); }) }, response.delay) await delay(500) @@ -428,7 +174,7 @@ function listenMessage(client){ var thisMsg = messages.mensaje if(Array.isArray(messages.mensaje)){thisMsg = messages.mensaje.join('\n')} // console.log("Mensaje=", thisMsg) - if(thisMsg !== undefined) await sendMessage(client, from, remplazos(thisMsg, client), response.trigger); + if(thisMsg !== undefined) await sendMessage(client, from, remplazos(thisMsg, client), step); }) await delay(500) } @@ -458,7 +204,7 @@ function listenMessage(client){ 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); + await sendMessage(client, from, remplazos(thisMsg, client), step); }) /** @@ -511,6 +257,6 @@ function listenMessageFromBot(client0){ async function inicializaBot(){ const ib = await initBot() listenMessage(ib) - listenMessageFromBot(ib) + // listenMessageFromBot(ib) } inicializaBot() diff --git a/controllers/save.js b/controllers/save.js index adde994..4ada401 100644 --- a/controllers/save.js +++ b/controllers/save.js @@ -1,5 +1,5 @@ const mimeDb = require('mime-db'); -const { uploadSingleFile } = require('../adapter/gdrive'); +// const { uploadSingleFile } = require('../adapter/gdrive') // Para Goole Drive y DialogFlow const fs = require('fs'); var fileName; diff --git a/controllers/send.js b/controllers/send.js index bede0e4..81299ba 100644 --- a/controllers/send.js +++ b/controllers/send.js @@ -2,7 +2,9 @@ const ExcelJS = require('exceljs'); const moment = require('moment'); const fs = require('fs'); -const { MessageMedia, Buttons, List } = require('whatsapp-web.js'); +const { MessageMedia, Buttons, List } = require('whatsapp-web.js') +const baileys = require('./send_baileys') +const wwebjs = require('./send_wwebjs') const { cleanNumber } = require('./handle') const { remplazos } = require('../adapter/index'); //MOD by CHV - Agregamos remplazos const DELAY_TIME = 170; //ms @@ -12,22 +14,26 @@ const DIR_MEDIA = `${__dirname}/../mediaSend`; const { saveMessage } = require('../adapter') /** * Enviamos archivos multimedia a nuestro cliente - * @param {*} number + * @param {*} client + * @param {*} number * @param {*} fileName + * @param {*} caption */ -const sendMedia = (client, number = null, fileName = null, trigger = null) => { +const sendMedia = (client, number = null, fileName = null, caption = null) => { if(!client) return console.error("El objeto cliente no está definido."); - console.log("MEDIA:"+fileName); + // console.log("MEDIA:"+fileName); try { - number = cleanNumber(number || 0) - const file = `${DIR_MEDIA}/${fileName}`; - console.log("FILE="+file); - if (fs.existsSync(file)) { - console.log("ARCHIVO EXISTE"); - const media = MessageMedia.fromFilePath(file); - client.sendMessage(number, media, { sendAudioAsVoice: true }); - } + // number = cleanNumber(number || 0) + // const file = `${DIR_MEDIA}/${fileName}`; + // console.log("FILE="+file); + // if (fs.existsSync(file)) { + // console.log("ARCHIVO EXISTE"); + // const media = MessageMedia.fromFilePath(file); + if(provider === 'baileys'){baileys.sendMedia(client, number, fileName, caption)} + else{wwebjs.sendMedia(client, number, fileName, caption)} + // client.sendMessage(number, media, { sendAudioAsVoice: true }); + // } } catch(e) { throw e; } @@ -42,13 +48,14 @@ const sendMedia = (client, number = null, fileName = null, trigger = null) => { const sendMediaVoiceNote = (client, number = null, fileName = null) => { if(!client) return console.error("El objeto cliente no está definido."); try { - number = cleanNumber(number || 0) - const file = `${DIR_MEDIA}/${fileName}`; - if (fs.existsSync(file)) { - const media = MessageMedia.fromFilePath(file); - client.sendMessage(number, media ,{ sendAudioAsVoice: true }); - - } + // number = cleanNumber(number || 0) + // const file = `${DIR_MEDIA}/${fileName}`; + // if (fs.existsSync(file)) { + // const media = MessageMedia.fromFilePath(file) + if(provider === 'baileys'){baileys.sendMediaVoiceNote(client, number, fileName)} + else{wwebjs.sendMediaVoiceNote(client, number, fileName)} + // client.sendMessage(number, media ,{ sendAudioAsVoice: true }); + // } }catch(e) { throw e; } @@ -58,13 +65,15 @@ const sendMedia = (client, number = null, fileName = null, trigger = null) => { * Enviamos un mensaje simple (texto) a nuestro cliente * @param {*} number */ -const sendMessage = async (client, number = null, text = null, trigger = null, regla) => { //MOD by CHV - Agregamos el parametro "regla" para guardarlo en "chats/numero.json" +const sendMessage = async (client, number = null, text = null, regla) => { //MOD by CHV - Agregamos el parametro "regla" para guardarlo en "chats/numero.json" setTimeout(async () => { - number = cleanNumber(number) - const message = text - client.sendMessage(number, message); + // number = cleanNumber(number) + // const message = text + if(provider === 'baileys'){baileys.sendMessage(client, number, text, regla)} + else{wwebjs.sendMessage(client, number, text, regla)} + // client.sendMessage(number, message); // console.log(number, message, regla) - await readChat(number, message, trigger, regla) //MOD by CHV - Agregamos el parametro "regla" + await readChat(number, message, regla) //MOD by CHV - Agregamos el parametro "regla" console.log(`⚡⚡⚡ Enviando mensajes....`); // console.log("********************* SEND MESSAGE **************************************"); },DELAY_TIME) @@ -76,13 +85,14 @@ const sendMessage = async (client, number = null, text = null, trigger = null, r */ 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(remplazos(message, client),[...buttons], remplazos(title, client), remplazos(footer, client)); - await readChat(number, message, actionButtons) - client.sendMessage(number, button); + if(provider === 'baileys'){baileys.sendMessageButton(client, number, text, actionButtons)} + else{wwebjs.sendMessageButton(client, number, text, actionButtons)} + // number = cleanNumber(number) + // const { title = null, message = null, footer = null, buttons = [] } = actionButtons; + // let button = new Buttons(remplazos(message, client),[...buttons], remplazos(title, client), remplazos(footer, client)); + await readChat(number, message) + // client.sendMessage(number, button); console.log(`⚡⚡⚡ Enviando mensajes (botones)....`); - // console.log("sendMessageButton."); }, DELAY_TIME) // console.log("************************ SEND MESSAGE BUTTON ***********************************"); } @@ -95,12 +105,14 @@ const sendMessageList = async (client, number = null, text = null, actionList) = setTimeout(async () => { // console.log("********************** client **************************") // console.log(client) - number = cleanNumber(number) - const { body = null, buttonText = null, sections = [], title = null, footer = null } = actionList; - let aList = new List( remplazos(body, client),remplazos(buttonText, client),[...sections],remplazos(title, client),remplazos(footer, client)); - client.sendMessage(number, aList); - await readChat(number, message, actionList) - console.log('⚡⚡⚡ Enviando lista a '+number+' ....'); + // number = cleanNumber(number) + // const { body = null, buttonText = null, sections = [], title = null, footer = null } = actionList; + // let aList = new List( remplazos(body, client),remplazos(buttonText, client),[...sections],remplazos(title, client),remplazos(footer, client)); + if(provider === 'baileys'){baileys.sendMessageList(client, number, text, actionList)} + else{wwebjs.sendMessageList(client, number, text, actionList)} + // client.sendMessage(number, aList); + await readChat(number, message) + // console.log('⚡⚡⚡ Enviando lista a '+number+' ....'); }, DELAY_TIME) } @@ -130,9 +142,9 @@ const lastTrigger = (number) => new Promise((resolve, reject) => { * @param {*} number * @param {*} message */ -const readChat = async (number, message, trigger = null, regla) => { //MOD by CHV - Agregamos el parametro "regla" para guardarlo en "chats/numero.json" +const readChat = async (number, message, regla) => { //MOD by CHV - Agregamos el parametro "regla" para guardarlo en "chats/numero.json" number = cleanNumber(number) - await saveMessage( message, trigger, number, regla ) //MOD by CHV - Agregamos "regla" + await saveMessage( message, number, regla ) //MOD by CHV - Agregamos "regla" // console.log('Saved') } diff --git a/controllers/send_baileys.js b/controllers/send_baileys.js index 413f10b..91171f2 100644 --- a/controllers/send_baileys.js +++ b/controllers/send_baileys.js @@ -17,10 +17,11 @@ const mime = require('mime-types') * @param {*} number * @param {*} mediaInput * @param {*} message - * @example await sendMessage('+XXXXXXXXXXX', 'https://dominio.com/imagen.jpg' | 'img/imagen.jpg') + * @param {*} caption + * @example await sendMessage(client, '+XXXXXXXXXXX', 'https://dominio.com/imagen.jpg' | 'img/imagen.jpg', 'caption') */ -const sendMedia = async (client, number, fileName, text) => { - console.log("SendMedia = ", number, fileName, text) +const sendMedia = async (client, number, fileName, caption = null) => { + console.log("SendMedia Baileys = ", number, fileName, caption) // const fileDownloaded = await generalDownload(imageUrl) const file = `${DIR_MEDIA}/${fileName}`; @@ -28,9 +29,9 @@ const sendMedia = async (client, number, fileName, text) => { if (fs.existsSync(file)) { console.log("ARCHIVO EXISTE"); const mimeType = mime.lookup(file) - if (mimeType.includes('image')) return sendImage(client, number, file, text) - if (mimeType.includes('video')) return sendVideo(client, number, file, text) - if (mimeType.includes('audio')) return sendAudio(client, number, file, text) + if (mimeType.includes('image')) return sendImage(client, number, file, caption) + if (mimeType.includes('video')) return sendVideo(client, number, file, caption) + if (mimeType.includes('audio')) return sendAudio(client, number, file, caption) return sendFile(client, number, file) } } @@ -63,7 +64,6 @@ const sendImage = async (client, number, filePath, text) => { if (fs.existsSync(file)) { const media = MessageMedia.fromFilePath(file); client.sendMessage(number, media ,{ sendAudioAsVoice: true }); - } }catch(e) { throw e; @@ -74,13 +74,13 @@ const sendImage = async (client, number, filePath, text) => { * Enviamos un mensaje simple (texto) a nuestro cliente * @param {*} number */ -const sendMessage = async (client, number = null, text = null, trigger = null, regla) => { //MOD by CHV - Agregamos el parametro "regla" para guardarlo en "chats/numero.json" +const sendMessage = async (client, number = null, text = null, regla = null) => { //MOD by CHV - Agregamos el parametro "regla" para guardarlo en "chats/numero.json" if(text !== undefined && text != null){ setTimeout(async () => { number = cleanNumber(number) - await client.sendMessage(number, { text: text }) + client.sendMessage(number, { text: text }) // console.log(number, message, regla) - await readChat(number, text, trigger, regla) //MOD by CHV - Agregamos el parametro "regla" + await readChat(number, text, regla) //MOD by CHV - Agregamos el parametro "regla" console.log(`⚡⚡⚡ Enviando mensajes....`); // ingresarDatos(number, text, 'Salida', 'Bot Pruebas') // console.log("********************* SEND MESSAGE **************************************"); @@ -97,7 +97,7 @@ const sendMessageButton2 = async (client, number = null, text = null, actionButt number = cleanNumber(number) const { title = null, message = null, footer = null, buttons = [] } = actionButtons; let button = new Buttons(remplazos(message, client),[...buttons], remplazos(title, client), remplazos(footer, client)); - await readChat(number, message, actionButtons) + await readChat(number, message) client.sendMessage(number, button); console.log(`⚡⚡⚡ Enviando mensajes (botones)....`); // console.log("sendMessageButton."); @@ -122,10 +122,11 @@ const sendMessageButton = async (client, number, text = null, actionButtons) => type: 1, })) text = remplazos(`*${title}*\n${message}`, client) - await readChat(number, message, actionButtons) - // console.log("sendMessageButton:", text, templateButtons) const buttonMessage = { text, footer, buttons: templateButtons, headerType: 1 } + console.log("sendMessageButton:", buttonMessage) + console.log(templateButtons) return client.sendMessage(number, buttonMessage) + await readChat(number, message) } /** @@ -133,7 +134,7 @@ const sendMessageButton = async (client, number, text = null, actionButtons) => * @param {*} number */ const sendMessageList = async (client, number = null, text = null, actionList) => { - console.log("**************** baileys send") + // console.log("**************** baileys send ", number, text, actionList) setTimeout(async () => { // console.log("********************** client **************************") number = cleanNumber(number) @@ -145,10 +146,10 @@ const sendMessageList = async (client, number = null, text = null, actionList) = buttonText: remplazos(buttonText, client), sections } - console.log(theList) + // console.log(theList) // console.log(sections[0]) client.sendMessage(number, theList); - await readChat(number, body, actionList) + await readChat(number, body) console.log('⚡⚡⚡ Enviando lista a '+number+' ....'); }, DELAY_TIME) } @@ -179,9 +180,9 @@ const lastTrigger = (number) => new Promise((resolve, reject) => { * @param {*} number * @param {*} message */ -const readChat = async (number, message, trigger = null, regla) => { //MOD by CHV - Agregamos el parametro "regla" para guardarlo en "chats/numero.json" +const readChat = async (number, message, regla = null) => { //MOD by CHV - Agregamos el parametro "regla" para guardarlo en "chats/numero.json" number = cleanNumber(number) - await saveMessage( message, trigger, number, regla ) //MOD by CHV - Agregamos "regla" + await saveMessage( message, number, regla ) //MOD by CHV - Agregamos "regla" // console.log('Saved') } diff --git a/controllers/send_wwebjs.js b/controllers/send_wwebjs.js index ff58506..59b226a 100644 --- a/controllers/send_wwebjs.js +++ b/controllers/send_wwebjs.js @@ -17,19 +17,20 @@ const mime = require('mime-types') * @param {*} number * @param {*} mediaInput * @param {*} message + * @param {*} caption * @returns */ -const sendMedia = async (client, number, fileName, text) => { - console.log("SendMedia = ", number, fileName, text) +const sendMedia = async (client, number, fileName, caption = null) => { + console.log("SendMedia WWebJS = ", number, fileName, caption) // const fileDownloaded = await generalDownload(imageUrl) const file = `${DIR_MEDIA}/${fileName}`; console.log("FILE="+file); if (fs.existsSync(file)) { console.log("ARCHIVO EXISTE"); const mimeType = mime.lookup(file) - if (mimeType.includes('image')) return sendImage(client, number, file, text) - if (mimeType.includes('video')) return sendVideo(client, number, file, text) - if (mimeType.includes('audio')) return sendAudio(client, number, file, text) + if (mimeType.includes('image')) return sendImage(client, number, file, caption) + if (mimeType.includes('video')) return sendVideo(client, number, file, caption) + if (mimeType.includes('audio')) return sendAudio(client, number, file, caption) return sendFile(client, number, file) } } @@ -68,7 +69,6 @@ const sendImage = async (client, number, fileName, caption) => { if (fs.existsSync(file)) { const media = MessageMedia.fromFilePath(file); client.sendMessage(number, media ,{ sendAudioAsVoice: true }); - } }catch(e) { throw e; @@ -79,13 +79,13 @@ const sendImage = async (client, number, fileName, caption) => { * Enviamos un mensaje simple (texto) a nuestro cliente * @param {*} number */ -const sendMessage = async (client, number = null, text = null, trigger = null, regla) => { //MOD by CHV - Agregamos el parametro "regla" para guardarlo en "chats/numero.json" +const sendMessage = async (client, number = null, text = null, regla = null) => { //MOD by CHV - Agregamos el parametro "regla" para guardarlo en "chats/numero.json" setTimeout(async () => { number = cleanNumber(number) const message = text client.sendMessage(number, message); // console.log(number, message, regla) - await readChat(number, message, trigger, regla) //MOD by CHV - Agregamos el parametro "regla" + await readChat(number, message, regla) //MOD by CHV - Agregamos el parametro "regla" console.log(`⚡⚡⚡ Enviando mensajes....`); // ingresarDatos(number, message, 'Salida', 'Bot Pruebas') // console.log("********************* SEND MESSAGE **************************************"); @@ -96,15 +96,19 @@ const sendMessage = async (client, number = null, text = null, trigger = null, r * Enviamos un mensaje con buttons a nuestro cliente * @param {*} number */ -const sendMessageButton = async (client, number = null, text = null, actionButtons) => { +const sendMessageButton = async (client, number, text = null, actionButtons) => { setTimeout(async () => { number = cleanNumber(number) const { title = null, message = null, footer = null, buttons = [] } = actionButtons; - let button = new Buttons(remplazos(message, client),[...buttons], remplazos(title, client), remplazos(footer, client)); - await readChat(number, message, actionButtons) + let button = new Buttons( + remplazos(message, client), + [...buttons], + remplazos(title, client), + remplazos(footer, client)); + console.log("sendMessageButton:", button) + console.log(buttons) client.sendMessage(number, button); - console.log(`⚡⚡⚡ Enviando mensajes (botones)....`); - // console.log("sendMessageButton."); + await readChat(number, message) }, DELAY_TIME) // console.log("************************ SEND MESSAGE BUTTON ***********************************"); } @@ -117,12 +121,12 @@ const sendMessageList = async (client, number = null, text = null, actionList) = // console.log("*************** wwebjs send") setTimeout(async () => { // console.log("********************** client **************************") - // console.log(client) + console.log(actionList) number = cleanNumber(number) const { body = null, buttonText = null, sections = [], title = null, footer = null } = actionList; let aList = new List( remplazos(body, client),remplazos(buttonText, client),[...sections],remplazos(title, client),remplazos(footer, client)); client.sendMessage(number, aList); - await readChat(number, message, actionList) + await readChat(number, message) console.log('⚡⚡⚡ Enviando lista a '+number+' ....'); }, DELAY_TIME) } @@ -153,9 +157,9 @@ const lastTrigger = (number) => new Promise((resolve, reject) => { * @param {*} number * @param {*} message */ -const readChat = async (number, message, trigger = null, regla) => { //MOD by CHV - Agregamos el parametro "regla" para guardarlo en "chats/numero.json" +const readChat = async (number, message, regla = null) => { //MOD by CHV - Agregamos el parametro "regla" para guardarlo en "chats/numero.json" number = cleanNumber(number) - await saveMessage( message, trigger, number, regla ) //MOD by CHV - Agregamos "regla" + await saveMessage( message, number, regla ) //MOD by CHV - Agregamos "regla" // console.log('Saved') } diff --git a/implementaciones/appFuncs.js b/implementaciones/appFuncs.js new file mode 100644 index 0000000..5ba9e39 --- /dev/null +++ b/implementaciones/appFuncs.js @@ -0,0 +1,331 @@ +const axios = require('axios').default; +const { removeDiacritics, getRandomInt, remplazos, soloNumero, traeVariablesFromClient } = require('./extraFuncs') +const { sendMedia, sendMessage, sendMessageButton, sendMessageList, readChat } = require(`../controllers/send`) +const { vamosA, traeUltimaVisita } = require('../adapter/index') + +/** + * LAS FUNCIONES SE DECLARAN COMO UN OBJETO DENTRO DE MODULE.EXPORTS, DE LA SIGUIENTE MANERA: + * + * nombreFuncion1 : function nombreFuncion1(ctx) { // Aqui va el código de la funcion }, + * nombreFuncion2 : function nombreFuncion2(ctx) { // Aqui va el código de la funcion } + * + * SE PUEDE USAR LA FUNCION traeVariablesFromClient(ctx) PARA OBTENER LAS VARIABLES from, body, name, hasMedia y step: + * + * const { from, body, name, hasMedia, step } = traeVariablesFromClient(ctx) + * + * O SE PUEDEN OBTENER DIRECTAMENTE DEL OBJETO ctx QUE RECIBE LA FUNCION: + * + * const from = ctx.theMsg.from + */ + +module.exports = { + /** + * Llama el API para traer categorias de Guna. + * @param {*} ctx El objeto del mensaje. + */ + getGunaCats : async function getGunaCats(ctx) { + const { from, body, name, hasMedia, step } = traeVariablesFromClient(ctx) + let lasOpciones = [] + let lasOpciones2 = [] + let theUrl = `http://localhost:8888/dbrquery?j={"query":"selectTipoFerreroMty","exec":"ExecuteQuery","params":{"par1":"xxx"}}` + const RES = await axios.get(theUrl).then(function (response) { + for(reg=0;reg -1){ // Producto con formato correcto. + vars[from]['ultimoProd'] = elProd + elProd = elProd.substring(0, elProd.indexOf(' $')).trim().toLowerCase() + var precio = ctx.theMsg.body.substring(ctx.theMsg.body.indexOf(' $')+2) + // console.log("precio",precio) + precio = precio.substring(0, precio.indexOf(',')) + // console.log("precio",precio) + vars[from]['prods'][elProd] = {"cant":0, "precio":precio} + // console.log("EL_PROD=", elProd) + // console.log(vars[from]['prods']) + elMensaje = ctx.theMsg.replyMessage + let re = ctx.theMsg.body.trim().toLowerCase() + elMensaje = elMensaje.replace(re, elProd.toLowerCase()) + } + else{ // Producto SIN precio. + elMensaje = "El producto que seleccionaste es *incorrecto*, por favor intenta de nuevo." + sendMessage(ctx, from, elMensaje, null, step); + await delay(500) + vars[from]['recompra'] = true + getGunaProds(ctx) + vamosA(from, "gunaProds") + return + } + sendMessage(ctx, from, elMensaje, null, step); + return + }, + /** + * Tomamos la cantidad del producto seleccionado. + * @param {*} ctx El objeto del mensaje. + */ + prodCantidad : async function prodCantidad(ctx) { + const { from, body, name, hasMedia, step } = traeVariablesFromClient(ctx); + // console.log("Entramos a prodCantidad") + let laCant = ctx.theMsg.body.trim() + const reg = new RegExp(/^\d+$/) + let elProd = vars[from]['ultimoProd'].toLowerCase() + elProd = elProd.substring(0, elProd.indexOf(' $')).trim() + console.log("SOLO NUMS |" + laCant + "|", reg.test(laCant)) + if(reg.test(laCant)){ + // console.log(vars) + // console.log("Recibimos cant = " + laCant) + // console.log("EL_PROD=", vars[from]['prods'][elProd]) + // console.log("precio=", vars[from]['prods'][elProd].precio) + vars[from]['prods'][elProd] = {"cant":laCant, "precio":vars[from]['prods'][elProd]['precio']} + var elMensaje = "" + const prods = Object.keys(vars[from]['prods']); + var total = 0 + prods.forEach((prod, index) => { + if( vars[from]['prods'][prod] !== undefined && prod[0] !== undefined ){ + elMensaje = elMensaje + `${vars[from]['prods'][prod].cant} - ${prod[0].toUpperCase() + prod.substring(1)}\n` + console.log("cant y precio=", vars[from]['prods'][prod].cant, vars[from]['prods'][prod].precio) + if(reg.test(vars[from]['prods'][prod].cant) && vars[from]['prods'][prod].precio != ""){ + total = total + (vars[from]['prods'][prod].cant * vars[from]['prods'][prod].precio) + } + } + console.log(prod, vars[from]['prods'][prod]); + }); + let pesos = Intl.NumberFormat('en-US') + elMensaje = elMensaje + "\n*Total*: $" + pesos.format(total) + elMensaje = elMensaje + "\n¿Quieres agregar mas productos a tu orden?" + var bts = { + "title":"Tu orden", + "message":elMensaje, + "buttons":[ + {"body":"➕ Agregar productos"}, + {"body":"⬅️ Cambiar categoría"}, + {"body":"✖️ Terminar"} + ] + } + sendMessageButton(ctx, from, null, bts) + } + else{ + console.log("NO SOLO NUMS") + vamosA(from, "gunaProdsAgrega") + sendMessage(ctx, from, "Por favor escribe 👉🏽 *solo* 👈🏽 el número.", null, step); + } + return "1" + }, + /** + * Mandamos nuevamente la lista de productos. + * @param {*} ctx El objeto del mensaje. + */ + comprarMas : async function comprarMas(ctx) { + const { from, body, name, hasMedia, step } = traeVariablesFromClient(ctx); + console.log("Entramos a comprarMas") + vars[from]['recompra'] = true + vamosA(from, "gunaProds") + await getGunaProds(ctx) + vars[from]['recompra'] = undefined + return "1" + }, + /** + * Mandamos nuevamente la lista de categorías. + * @param {*} ctx El objeto del mensaje. + */ + terminaCompra : async function terminaCompra(ctx) { + const { from, body, name, hasMedia, step } = traeVariablesFromClient(ctx); + console.log("Entramos a terminaCompra") + vars[from] = [] + sendMessage(ctx, from, "!Gracias por tu compra, regresa pronto!", null, step); + return + }, + /** + * Llama el API para desbloquear un usuario. + * @param {*} ctx El objeto del mensaje. + */ + desbloqueaUsuario : async function desbloqueaUsuario(ctx) { + const { from, body, name, hasMedia, step } = traeVariablesFromClient(ctx); + let par1 = ctx.theMsg.body + let theUrl = `http://localhost:8888/dbrquery?j={"query":"update_usuario_guna_nobajas","exec":"ExecuteCommand","params":{"par1":"${par1}", "par2":"XXPARAM2XX", "par3":"XXPARAM3XX"}}` + 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(ctx, from, "Listo, usuario *"+response.data['params']['par1']+"* desbloqueado, por favor *cerrar navegadores* y reingresar.", null, step); + } + else{ + sendMessage(ctx, from, "El usuario *"+response.data['params']['par1']+"* no *existe* o esta dado de *baja*, por favor revisarlo y volver a intentar.", null, step); + } + return response + }).catch(function (error) { + console.log(error); + return error + }); + }, + /** + * Llama el API para desbloquear el usuario. + * + * @param {*} theURL El URL para llamar al API + * @param {*} step + */ + desbloqueaUsuario2 : async function desbloqueaUsuario2(theUrl, step) { + // const { from, body, name, hasMedia, step } = traeVariablesFromClient(ctx); + // 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(ctx, from, "Listo, usuario *"+response.data['params']['par1']+"* desbloqueado, por favor *cerrar navegadores* y reingresar.", null, step); + // } + // else{ + // sendMessage(ctx, from, "El usuario *"+response.data['params']['par1']+"* no *existe* o esta dado de *baja*, por favor revisarlo y volver a intentar.", null, step); + // } + // return response + // }).catch(function (error) { + // console.log(error); + // return error + // }); + } +} +// module.exports = new funcsClass() \ No newline at end of file diff --git a/implementaciones/extraFuncs.js b/implementaciones/extraFuncs.js index 600b2cf..603fed4 100644 --- a/implementaciones/extraFuncs.js +++ b/implementaciones/extraFuncs.js @@ -1,4 +1,10 @@ const fs = require('fs') + +function alertas(ctx){ + console.log("LISTO - ALERTAS") + console.log(ctx) +} + /** * Regresa un número random entre los parametros min y max dados. * @param {*} min @@ -191,6 +197,47 @@ function traeMensajes(from){ //MOD by CHV - Agregamos para traer el historial de return histlMsjs; } +/** + * Regresa las variables from, body, name y hasMedia del objeto del mensaje. + * @param {*} msg + * @returns from, body, name, hasMedia + */ +function traeVariablesFromMsg(msg){ + if(provider == 'baileys'){return traeVariablesFromMsgBaileys(msg)} + else{return traeVariablesFromMsgWWebJS(msg)} +} + +function traeVariablesFromMsgBaileys(msg){ + const { remoteJid } = msg.messages[0].key + const { pushName } = msg.messages[0] + let theBody = msg.messages[0].message?.conversation || msg.messages[0].message?.buttonsResponseMessage?.selectedDisplayText || msg.messages[0].message?.listResponseMessage?.title + let from = remoteJid + let body = theBody + let name = pushName + let hasMedia = false + // console.log("fromBody=", from, body, name) + return {"from":from, "body":body, "name":name, "hasMedia":hasMedia} +} + +function traeVariablesFromMsgWWebJS(msg){ + const { from, body, hasMedia } = msg; + let name = msg?._data?.notifyName + // console.log("fromBody=", msg?._data) + return {"from":from, "body":body, "name":name, "hasMedia":hasMedia} +} + +/** + * Regresa las variables from, body, name, hasMedia y steps del objeto del cliente. + * @param {*} client + * @returns from, body, name, hasMedia y step + */ +function traeVariablesFromClient(client){ + // console.log(client) + const { body, from, name, hasMedia, step } = client.theMsg + const { pushName } = client.theMsg + return {"from":from, "body":body, "name":name, "hasMedia":hasMedia, "step":step} +} + /** * Regresa el número limpio, sin @x.xxx * @param {*} from @@ -203,6 +250,13 @@ function soloNumero(from){ return soloNum } +/** + * Agrega las variables msg, body, from, hasMedia, name y numero al objeto del cliente. + * @param {*} client + * @param {*} msg + * @param {*} vars + * @returns + */ function agregaVars(client, msg, vars){ const { from, body, name, hasMedia } = vars client.theMsg = msg; @@ -265,7 +319,7 @@ async function variousFuncs(){ else if(rnd==3){caritas = "🧔🏽👧🏽";} else if(rnd==4){caritas = "👧🏽🧔🏽";} else if(rnd==5){caritas = "👩🏻‍🦰🧔🏽";} - else if(rnd==6){caritas = "🧔🏽👩🏻‍🦰";} + else if(rnd==6){caritas = "🧔🏽👩🏻‍🦰";}s if(sp % 15 === 0){console.log("******** VAN 15, HACEMOS PAUSA DE 10 SEGUNDOS ********"); await sleep(10000);} // console.log(`============= Mandamos el mensaje ${sp} ==============`); var elTextoDelMensaje = caritas + " *" + saludo + "amigo tendero* ❗❗👋🏻\n🕊️ *GUNA* trae para ti dinámicas digitales, con las que podrás participar para ganar increíbles premios. 🏆💸💰\nSigue los siguientes pasos: 😃\n*1.* 📲Sigue la página de Yo Soy Guna en Facebook en la siguiente liga ➡️ https://www.facebook.com/yosoyguna\n*2.* 👉🏻Es importante des click en el botón Me Gusta 👍\n*3.* 🧐Sigue la dinámica que publicaremos , subiendo tu foto 📸 con los siguientes #yosoyguna #gunatenderos #gunachampions\n*4.* 🥳🎉En esta misma página , podrás ver publicados los ganadores🏅 y el tiempo en que serán elegidos. 💲 Además de tener acceso a increíbles promociones 🤑"; @@ -281,7 +335,6 @@ async function variousFuncs(){ retardo(); } - if(body == "/botones"){ // Asi se mandan botones **directamente** con el cliente de whatsapp-web.js "client.sendMessage(from, productList)" const buttonMessage = [ @@ -455,4 +508,4 @@ function removeDiacritics (str) { // var paragraph = "L'avantage d'utiliser le lorem ipsum est bien évidemment de pouvoir créer des maquettes ou de remplir un site internet de contenus qui présentent un rendu s'approchant un maximum du rendu final. \n Par défaut lorem ipsum ne contient pas d'accent ni de caractères spéciaux contrairement à la langue française qui en contient beaucoup. C'est sur ce critère que nous proposons une solution avec cet outil qui générant du faux-texte lorem ipsum mais avec en plus, des caractères spéciaux tel que les accents ou certains symboles utiles pour la langue française. \n L'utilisation du lorem standard est facile d’utilisation mais lorsque le futur client utilisera votre logiciel il se peut que certains caractères spéciaux ou qu'un accent ne soient pas codés correctement. \n Cette page a pour but donc de pouvoir perdre le moins de temps possible et donc de tester directement si tous les encodages de base de donnée ou des sites sont les bons de plus il permet de récuperer un code css avec le texte formaté !"; // alert(removeDiacritics(paragraph)); -module.exports = { removeDiacritics, traeMensajes, chkFile, getRandomInt, remplazos, soloNumero, agregaVars } \ No newline at end of file +module.exports = { removeDiacritics, traeMensajes, chkFile, getRandomInt, remplazos, soloNumero, agregaVars, traeVariablesFromClient, traeVariablesFromMsg } \ No newline at end of file diff --git a/middleware/client.js b/middleware/client.js index 67c0d30..d0b8f36 100644 --- a/middleware/client.js +++ b/middleware/client.js @@ -3,7 +3,7 @@ const middlewareClient = (client = null) => async (req, res, next) => { if(!client){ res.status(409) - console.log(client) + // console.log(client) res.send({ error: 'Error de client.' }) }else{ req.clientWs = client; diff --git a/package-lock.json b/package-lock.json index f091798..d6c9b73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -88,55 +88,10 @@ "follow-redirects": "^1.14.4" } }, - "node_modules/@adiwajshing/baileys/node_modules/protobufjs": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/@adiwajshing/baileys/node_modules/ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@babel/parser": { - "version": "7.20.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", - "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.1.tgz", + "integrity": "sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -144,19 +99,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "optional": true, - "peer": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@fast-csv/format": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", @@ -185,9 +127,9 @@ } }, "node_modules/@google-cloud/dialogflow": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@google-cloud/dialogflow/-/dialogflow-5.5.0.tgz", - "integrity": "sha512-Ku+QmtzTF6hMyONWWipxZvSCSRWkFlOflw681sLCZqgZA3ce7QTesp/pPbKlMDZ3uRf1csCEhJssSbW4ycR18g==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@google-cloud/dialogflow/-/dialogflow-5.5.1.tgz", + "integrity": "sha512-JVGohHEviAR7NM5X2Wt9SL5n6f1FJEkNllDInM9QO9FKX0d5aUp7Xi/Lk9U6OuflfoxWAj3hrap9MxUIjyrwVA==", "dependencies": { "google-gax": "^3.5.2" }, @@ -196,9 +138,9 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.8.tgz", - "integrity": "sha512-4gfDqMLXTrorvYTKA1jL22zLvVwiHJ73t6Re1OHwdCFRjdGTDOVtSJuaWhtHaivyeDGg0LeCkmU77MTKoV3wPA==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.9.tgz", + "integrity": "sha512-xzsl2HamhovnZddS/2pMF4Q+FgwINaBvxoFGQ+G54Lo7Xsge36VvfDO/TDkL7FofmrRK/X5weRvwlJh7rKwN4w==", "dependencies": { "@grpc/proto-loader": "^0.7.0", "@types/node": ">=12.12.47" @@ -208,9 +150,9 @@ } }, "node_modules/@grpc/proto-loader": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.4.tgz", - "integrity": "sha512-MnWjkGwqQ3W8fx94/c1CwqLsNmHHv2t0CFn+9++6+cDphC1lolpg9M2OU0iebIjK//pBNX9e94ho+gjx6vz39w==", + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.5.tgz", + "integrity": "sha512-mfcTuMbFowq1wh/Rn5KQl6qb95M21Prej3bewD9dUQMurYGVckGO/Pbe2Ocwto6sD05b/mxZLspvqwx60xO2Rg==", "dependencies": { "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", @@ -225,6 +167,34 @@ "node": ">=6" } }, + "node_modules/@grpc/proto-loader/node_modules/protobufjs": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.2.tgz", + "integrity": "sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@grpc/proto-loader/node_modules/protobufjs/node_modules/long": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" + }, "node_modules/@hapi/boom": { "version": "9.1.4", "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", @@ -238,570 +208,6 @@ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, - "node_modules/@jimp/bmp": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.13.tgz", - "integrity": "sha512-9edAxu7N2FX7vzkdl5Jo1BbACfycUtBQX+XBMcHA2bk62P8R0otgkHg798frgAk/WxQIzwxqOH6wMiCwrlAzdQ==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "bmp-js": "^0.1.0" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/core": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.13.tgz", - "integrity": "sha512-qXpA1tzTnlkTku9yqtuRtS/wVntvE6f3m3GNxdTdtmc+O+Wcg9Xo2ABPMh7Nc0AHbMKzwvwgB2JnjZmlmJEObg==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "any-base": "^1.1.0", - "buffer": "^5.2.0", - "exif-parser": "^0.1.12", - "file-type": "^16.5.4", - "load-bmfont": "^1.3.1", - "mkdirp": "^0.5.1", - "phin": "^2.9.1", - "pixelmatch": "^4.0.2", - "tinycolor2": "^1.4.1" - } - }, - "node_modules/@jimp/core/node_modules/file-type": { - "version": "16.5.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", - "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", - "optional": true, - "peer": true, - "dependencies": { - "readable-web-to-node-stream": "^3.0.0", - "strtok3": "^6.2.4", - "token-types": "^4.1.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "node_modules/@jimp/core/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "optional": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/@jimp/core/node_modules/peek-readable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", - "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@jimp/core/node_modules/strtok3": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", - "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", - "optional": true, - "peer": true, - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^4.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@jimp/core/node_modules/token-types": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", - "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", - "optional": true, - "peer": true, - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@jimp/custom": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.13.tgz", - "integrity": "sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/core": "^0.16.13" - } - }, - "node_modules/@jimp/gif": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.13.tgz", - "integrity": "sha512-yFAMZGv3o+YcjXilMWWwS/bv1iSqykFahFMSO169uVMtfQVfa90kt4/kDwrXNR6Q9i6VHpFiGZMlF2UnHClBvg==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "gifwrap": "^0.9.2", - "omggif": "^1.0.9" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/jpeg": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.13.tgz", - "integrity": "sha512-BJHlDxzTlCqP2ThqP8J0eDrbBfod7npWCbJAcfkKqdQuFk0zBPaZ6KKaQKyKxmWJ87Z6ohANZoMKEbtvrwz1AA==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "jpeg-js": "^0.4.2" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-blit": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.13.tgz", - "integrity": "sha512-8Z1k96ZFxlhK2bgrY1JNWNwvaBeI/bciLM0yDOni2+aZwfIIiC7Y6PeWHTAvjHNjphz+XCt01WQmOYWCn0ML6g==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-blur": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.13.tgz", - "integrity": "sha512-PvLrfa8vkej3qinlebyhLpksJgCF5aiysDMSVhOZqwH5nQLLtDE9WYbnsofGw4r0VVpyw3H/ANCIzYTyCtP9Cg==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-circle": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.13.tgz", - "integrity": "sha512-RNave7EFgZrb5V5EpdvJGAEHMnDAJuwv05hKscNfIYxf0kR3KhViBTDy+MoTnMlIvaKFULfwIgaZWzyhuINMzA==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-color": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.13.tgz", - "integrity": "sha512-xW+9BtEvoIkkH/Wde9ql4nAFbYLkVINhpgAE7VcBUsuuB34WUbcBl/taOuUYQrPEFQJ4jfXiAJZ2H/rvKjCVnQ==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "tinycolor2": "^1.4.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-contain": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.13.tgz", - "integrity": "sha512-QayTXw4tXMwU6q6acNTQrTTFTXpNRBe+MgTGMDU0lk+23PjlFCO/9sacflelG8lsp7vNHhAxFeHptDMAksEYzg==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5", - "@jimp/plugin-scale": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-cover": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.13.tgz", - "integrity": "sha512-BSsP71GTNaqWRcvkbWuIVH+zK7b3TSNebbhDkFK0fVaUTzHuKMS/mgY4hDZIEVt7Rf5FjadAYtsujHN9w0iSYA==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-crop": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5", - "@jimp/plugin-scale": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-crop": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.13.tgz", - "integrity": "sha512-WEl2tPVYwzYL8OKme6Go2xqiWgKsgxlMwyHabdAU4tXaRwOCnOI7v4021gCcBb9zn/oWwguHuKHmK30Fw2Z/PA==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-displace": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.13.tgz", - "integrity": "sha512-qt9WKq8vWrcjySa9DyQ0x/RBMHQeiVjdVSY1SJsMjssPUf0pS74qorcuAkGi89biN3YoGUgPkpqECnAWnYwgGA==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-dither": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.13.tgz", - "integrity": "sha512-5/N3yJggbWQTlGZHQYJPmQXEwR52qaXjEzkp1yRBbtdaekXE3BG/suo0fqeoV/csf8ooI78sJzYmIrxNoWVtgQ==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-fisheye": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.13.tgz", - "integrity": "sha512-2rZmTdFbT/cF9lEZIkXCYO0TsT114Q27AX5IAo0Sju6jVQbvIk1dFUTnwLDadTo8wkJlFzGqMQ24Cs8cHWOliA==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-flip": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.13.tgz", - "integrity": "sha512-EmcgAA74FTc5u7Z+hUO/sRjWwfPPLuOQP5O64x5g4j0T12Bd29IgsYZxoutZo/rb3579+JNa/3wsSEmyVv1EpA==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-rotate": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-gaussian": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.13.tgz", - "integrity": "sha512-A1XKfGQD0iDdIiKqFYi8nZMv4dDVYdxbrmgR7y/CzUHhSYdcmoljLIIsZZM3Iks/Wa353W3vtvkWLuDbQbch1w==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-invert": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.13.tgz", - "integrity": "sha512-xFMrIn7czEZbdbMzZWuaZFnlLGJDVJ82y5vlsKsXRTG2kcxRsMPXvZRWHV57nSs1YFsNqXSbrC8B98n0E32njQ==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-mask": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.13.tgz", - "integrity": "sha512-wLRYKVBXql2GAYgt6FkTnCfE+q5NomM7Dlh0oIPGAoMBWDyTx0eYutRK6PlUrRK2yMHuroAJCglICTbxqGzowQ==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-normalize": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.13.tgz", - "integrity": "sha512-3tfad0n9soRna4IfW9NzQdQ2Z3ijkmo21DREHbE6CGcMIxOSvfRdSvf1qQPApxjTSo8LTU4MCi/fidx/NZ0GqQ==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-print": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.13.tgz", - "integrity": "sha512-0m6i3p01PGRkGAK9r53hDYrkyMq+tlhLOIbsSTmZyh6HLshUKlTB7eXskF5OpVd5ZUHoltlNc6R+ggvKIzxRFw==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "load-bmfont": "^1.4.0" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-resize": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.13.tgz", - "integrity": "sha512-qoqtN8LDknm3fJm9nuPygJv30O3vGhSBD2TxrsCnhtOsxKAqVPJtFVdGd/qVuZ8nqQANQmTlfqTiK9mVWQ7MiQ==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-rotate": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.13.tgz", - "integrity": "sha512-Ev+Jjmj1nHYw897z9C3R9dYsPv7S2/nxdgfFb/h8hOwK0Ovd1k/+yYS46A0uj/JCKK0pQk8wOslYBkPwdnLorw==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5", - "@jimp/plugin-crop": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-scale": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.13.tgz", - "integrity": "sha512-05POQaEJVucjTiSGMoH68ZiELc7QqpIpuQlZ2JBbhCV+WCbPFUBcGSmE7w4Jd0E2GvCho/NoMODLwgcVGQA97A==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-shadow": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.13.tgz", - "integrity": "sha512-nmu5VSZ9hsB1JchTKhnnCY+paRBnwzSyK5fhkhtQHHoFD5ArBQ/5wU8y6tCr7k/GQhhGq1OrixsECeMjPoc8Zw==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blur": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-threshold": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.13.tgz", - "integrity": "sha512-+3zArBH0OE3Rhjm4HyAokMsZlIq5gpQec33CncyoSwxtRBM2WAhUVmCUKuBo+Lr/2/4ISoY4BWpHKhMLDix6cA==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-color": ">=0.8.0", - "@jimp/plugin-resize": ">=0.8.0" - } - }, - "node_modules/@jimp/plugins": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.13.tgz", - "integrity": "sha512-CJLdqODEhEVs4MgWCxpWL5l95sCBlkuSLz65cxEm56X5akIsn4LOlwnKoSEZioYcZUBvHhCheH67AyPTudfnQQ==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/plugin-blit": "^0.16.13", - "@jimp/plugin-blur": "^0.16.13", - "@jimp/plugin-circle": "^0.16.13", - "@jimp/plugin-color": "^0.16.13", - "@jimp/plugin-contain": "^0.16.13", - "@jimp/plugin-cover": "^0.16.13", - "@jimp/plugin-crop": "^0.16.13", - "@jimp/plugin-displace": "^0.16.13", - "@jimp/plugin-dither": "^0.16.13", - "@jimp/plugin-fisheye": "^0.16.13", - "@jimp/plugin-flip": "^0.16.13", - "@jimp/plugin-gaussian": "^0.16.13", - "@jimp/plugin-invert": "^0.16.13", - "@jimp/plugin-mask": "^0.16.13", - "@jimp/plugin-normalize": "^0.16.13", - "@jimp/plugin-print": "^0.16.13", - "@jimp/plugin-resize": "^0.16.13", - "@jimp/plugin-rotate": "^0.16.13", - "@jimp/plugin-scale": "^0.16.13", - "@jimp/plugin-shadow": "^0.16.13", - "@jimp/plugin-threshold": "^0.16.13", - "timm": "^1.6.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/png": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.13.tgz", - "integrity": "sha512-8cGqINvbWJf1G0Her9zbq9I80roEX0A+U45xFby3tDWfzn+Zz8XKDF1Nv9VUwVx0N3zpcG1RPs9hfheG4Cq2kg==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "pngjs": "^3.3.3" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/tiff": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.13.tgz", - "integrity": "sha512-oJY8d9u95SwW00VPHuCNxPap6Q1+E/xM5QThb9Hu+P6EGuu6lIeLaNBMmFZyblwFbwrH+WBOZlvIzDhi4Dm/6Q==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "utif": "^2.0.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/types": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.13.tgz", - "integrity": "sha512-mC0yVNUobFDjoYLg4hoUwzMKgNlxynzwt3cDXzumGvRJ7Kb8qQGOWJQjQFo5OxmGExqzPphkirdbBF88RVLBCg==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/bmp": "^0.16.13", - "@jimp/gif": "^0.16.13", - "@jimp/jpeg": "^0.16.13", - "@jimp/png": "^0.16.13", - "@jimp/tiff": "^0.16.13", - "timm": "^1.6.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/utils": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.13.tgz", - "integrity": "sha512-VyCpkZzFTHXtKgVO35iKN0sYR10psGpV6SkcSeV4oF7eSYlR8Bl6aQLCzVeFjvESF7mxTmIiI3/XrMobVrtxDA==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "regenerator-runtime": "^0.13.3" - } - }, "node_modules/@jsdoc/salty": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.3.tgz", @@ -963,6 +369,27 @@ "node": ">=10" } }, + "node_modules/@pm2/agent/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@pm2/io": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@pm2/io/-/io-5.0.0.tgz", @@ -1094,6 +521,27 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/@pm2/js-api/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@pm2/pm2-version-check": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz", @@ -1425,13 +873,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", - "optional": true, - "peer": true - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -1510,9 +951,19 @@ } }, "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/argparse/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true }, "node_modules/array-flatten": { "version": "1.1.1", @@ -1672,9 +1123,9 @@ } }, "node_modules/bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", + "integrity": "sha512-uw4ra6Cv483Op/ebM0GBKKfxZlSmn6NgFRby5L3yGTlunLj53KQgndDlqy2WVFOwgvurocApYkSud0aO+mvrpQ==", "engines": { "node": "*" } @@ -1723,16 +1174,14 @@ } }, "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" }, "node_modules/bmp-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", - "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==", - "optional": true, - "peer": true + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.1.tgz", + "integrity": "sha512-OS74Rlt0Aynu2mTPmY9RZOUOXlqWecFIILFXr70vv16/xCZnFxvri9IKkF1IGxQ8r9dOE62qGNpKxXx8Lko8bg==" }, "node_modules/bodec": { "version": "0.1.0", @@ -2026,54 +1475,6 @@ "node": ">= 6" } }, - "node_modules/combine-image/node_modules/bignumber.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", - "integrity": "sha512-uw4ra6Cv483Op/ebM0GBKKfxZlSmn6NgFRby5L3yGTlunLj53KQgndDlqy2WVFOwgvurocApYkSud0aO+mvrpQ==", - "engines": { - "node": "*" - } - }, - "node_modules/combine-image/node_modules/bmp-js": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.1.tgz", - "integrity": "sha512-OS74Rlt0Aynu2mTPmY9RZOUOXlqWecFIILFXr70vv16/xCZnFxvri9IKkF1IGxQ8r9dOE62qGNpKxXx8Lko8bg==" - }, - "node_modules/combine-image/node_modules/file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/combine-image/node_modules/jimp": { - "version": "0.2.27", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.27.tgz", - "integrity": "sha512-KP08kEe5pDY+AFg00vuqKP0zgUmeQXJXpzQ+w9+0pQA27GCF9RoWzOpf3AONHgf5h8raMrXaF18y4ug9Rw2xEw==", - "dependencies": { - "bignumber.js": "^2.1.0", - "bmp-js": "0.0.1", - "es6-promise": "^3.0.2", - "exif-parser": "^0.1.9", - "file-type": "^3.1.0", - "jpeg-js": "^0.2.0", - "load-bmfont": "^1.2.3", - "mime": "^1.3.4", - "pixelmatch": "^4.0.0", - "pngjs": "^3.0.0", - "read-chunk": "^1.0.1", - "request": "^2.65.0", - "stream-to-buffer": "^0.1.0", - "tinycolor2": "^1.1.2", - "url-regex": "^3.0.0" - } - }, - "node_modules/combine-image/node_modules/jpeg-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", - "integrity": "sha512-Ni9PffhJtYtdD7VwxH6V2MnievekGfUefosGCHadog0/jAevRu6HPjYeMHbUemn0IPE8d4wGa8UsOGsX+iKy2g==" - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2153,9 +1554,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/cors": { "version": "2.8.5", @@ -2431,9 +1832,9 @@ } }, "node_modules/engine.io": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.0.tgz", - "integrity": "sha512-OgxY1c/RuCSeO/rTr8DIFXx76IzUUft86R7/P7MMbbkuzeqJoTNw2lmeD91IyGz41QYleIIjWeMJGgug043sfQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz", + "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==", "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -2578,14 +1979,6 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", @@ -2623,9 +2016,9 @@ } }, "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "engines": { "node": ">=4.0" } @@ -3213,17 +2606,6 @@ "assert-plus": "^1.0.0" } }, - "node_modules/gifwrap": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.4.tgz", - "integrity": "sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==", - "optional": true, - "peer": true, - "dependencies": { - "image-q": "^4.0.0", - "omggif": "^1.0.10" - } - }, "node_modules/git-node-fs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", @@ -3324,6 +2706,121 @@ "node": ">=12" } }, + "node_modules/google-gax/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/google-gax/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/google-gax/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/google-gax/node_modules/glob": { + "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", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/google-gax/node_modules/long": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" + }, + "node_modules/google-gax/node_modules/minimatch": { + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-gax/node_modules/protobufjs": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.2.tgz", + "integrity": "sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/google-gax/node_modules/protobufjs-cli": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.1.tgz", + "integrity": "sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==", + "dependencies": { + "chalk": "^4.0.0", + "escodegen": "^1.13.0", + "espree": "^9.0.0", + "estraverse": "^5.1.0", + "glob": "^8.0.0", + "jsdoc": "^4.0.0", + "minimist": "^1.2.0", + "semver": "^7.1.2", + "tmp": "^0.2.1", + "uglify-js": "^3.7.7" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "protobufjs": "^7.0.0" + } + }, "node_modules/google-p12-pem": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", @@ -3666,23 +3163,6 @@ } ] }, - "node_modules/image-q": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", - "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "16.9.1" - } - }, - "node_modules/image-q/node_modules/@types/node": { - "version": "16.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", - "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", - "optional": true, - "peer": true - }, "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -3842,25 +3322,39 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/jimp": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.13.tgz", - "integrity": "sha512-Bxz8q7V4rnCky9A0ktTNGA9SkNFVWRHodddI/DaAWZJzF7sVUlFYKQ60y9JGqrKpi48ECA/TnfMzzc5C70VByA==", - "optional": true, - "peer": true, + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.27.tgz", + "integrity": "sha512-KP08kEe5pDY+AFg00vuqKP0zgUmeQXJXpzQ+w9+0pQA27GCF9RoWzOpf3AONHgf5h8raMrXaF18y4ug9Rw2xEw==", "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/custom": "^0.16.13", - "@jimp/plugins": "^0.16.13", - "@jimp/types": "^0.16.13", - "regenerator-runtime": "^0.13.3" + "bignumber.js": "^2.1.0", + "bmp-js": "0.0.1", + "es6-promise": "^3.0.2", + "exif-parser": "^0.1.9", + "file-type": "^3.1.0", + "jpeg-js": "^0.2.0", + "load-bmfont": "^1.2.3", + "mime": "^1.3.4", + "pixelmatch": "^4.0.0", + "pngjs": "^3.0.0", + "read-chunk": "^1.0.1", + "request": "^2.65.0", + "stream-to-buffer": "^0.1.0", + "tinycolor2": "^1.1.2", + "url-regex": "^3.0.0" + } + }, + "node_modules/jimp/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/jpeg-js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", - "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", - "optional": true, - "peer": true + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", + "integrity": "sha512-Ni9PffhJtYtdD7VwxH6V2MnievekGfUefosGCHadog0/jAevRu6HPjYeMHbUemn0IPE8d4wGa8UsOGsX+iKy2g==" }, "node_modules/js-git": { "version": "0.7.8", @@ -3894,11 +3388,11 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "node_modules/jsdoc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.0.tgz", - "integrity": "sha512-tzTgkklbWKrlaQL2+e3NNgLcZu3NaK2vsHRx7tyHQ+H5jcB9Gx0txSd2eJWlMC/xU1+7LQu4s58Ry0RkuaEQVg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", + "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", "dependencies": { - "@babel/parser": "^7.9.4", + "@babel/parser": "^7.20.15", "@jsdoc/salty": "^0.2.1", "@types/markdown-it": "^12.2.3", "bluebird": "^3.7.2", @@ -3921,6 +3415,11 @@ "node": ">=12.0.0" } }, + "node_modules/jsdoc/node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, "node_modules/jsdoc/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", @@ -3937,6 +3436,14 @@ "bignumber.js": "^9.0.0" } }, + "node_modules/json-bigint/node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -4306,14 +3813,19 @@ } }, "node_modules/markdown-it-anchor": { - "version": "8.6.6", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.6.tgz", - "integrity": "sha512-jRW30YGywD2ESXDc+l17AiritL0uVaSnWsb26f+68qaW9zgbIIr1f4v2Nsvc0+s0Z2N3uX6t/yAw7BwCQ1wMsA==", + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", "peerDependencies": { "@types/markdown-it": "*", "markdown-it": "*" } }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "node_modules/marked": { "version": "4.2.12", "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", @@ -4331,11 +3843,11 @@ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/merge-descriptors": { @@ -4496,14 +4008,6 @@ "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, - "node_modules/music-metadata/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/music-metadata/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4696,9 +4200,9 @@ } }, "node_modules/node-webpmux": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/node-webpmux/-/node-webpmux-3.1.3.tgz", - "integrity": "sha512-337vJ7dtoGUhE1zoN4s0mWqDO+RLVseShoWAy0FjGx0hsyDEKfVMAkHu4zfNf0RnPyGqGxnRrPZam36ld9KsxA==" + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/node-webpmux/-/node-webpmux-3.1.4.tgz", + "integrity": "sha512-EgKZEB+T5AG7rbs2i39W+HBqU6OmOTz1EvioPRq2LYW+fZen/l3EKTC5ekkU7cl4/OflTCFRPXy0kIhi+4FunQ==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -4759,13 +4263,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/omggif": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", - "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", - "optional": true, - "peer": true - }, "node_modules/on-exit-leak-free": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", @@ -5369,7 +4866,12 @@ "node": ">=12.0.0" } }, - "node_modules/protobufjs": { + "node_modules/proto3-json-serializer/node_modules/long": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" + }, + "node_modules/proto3-json-serializer/node_modules/protobufjs": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.2.tgz", "integrity": "sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==", @@ -5392,90 +4894,31 @@ "node": ">=12.0.0" } }, - "node_modules/protobufjs-cli": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.1.tgz", - "integrity": "sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==", + "node_modules/protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "hasInstallScript": true, "dependencies": { - "chalk": "^4.0.0", - "escodegen": "^1.13.0", - "espree": "^9.0.0", - "estraverse": "^5.1.0", - "glob": "^8.0.0", - "jsdoc": "^4.0.0", - "minimist": "^1.2.0", - "semver": "^7.1.2", - "tmp": "^0.2.1", - "uglify-js": "^3.7.7" + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" }, "bin": { "pbjs": "bin/pbjs", "pbts": "bin/pbts" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "protobufjs": "^7.0.0" } }, - "node_modules/protobufjs-cli/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/protobufjs-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/protobufjs-cli/node_modules/glob": { - "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", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/protobufjs-cli/node_modules/minimatch": { - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/protobufjs/node_modules/long": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", - "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -5576,7 +5019,7 @@ "version": "13.7.0", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-13.7.0.tgz", "integrity": "sha512-U1uufzBjz3+PkpCxFrWzh4OrMIdIb2ztzCu0YEPfRHjHswcSwHZswnK+WdsOQJsRV8WeTg3jLhJR4D867+fjsA==", - "deprecated": "< 18.1.0 is no longer supported", + "deprecated": "< 19.2.0 is no longer supported", "hasInstallScript": true, "dependencies": { "cross-fetch": "3.1.5", @@ -5786,13 +5229,6 @@ "node": ">= 12.13.0" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "optional": true, - "peer": true - }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -6141,14 +5577,14 @@ } }, "node_modules/socket.io": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.0.tgz", - "integrity": "sha512-b65bp6INPk/BMMrIgVvX12x3Q+NqlGqSlTuvKQWt0BUJ3Hyy3JangBl7fEoWZTXbOKlCqNPbQ6MbWgok/km28w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.4.0", + "engine.io": "~6.4.1", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.1" }, @@ -6500,9 +5936,9 @@ } }, "node_modules/systeminformation": { - "version": "5.17.8", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.17.8.tgz", - "integrity": "sha512-kMQsCOFQXqEjoDWKpYkC+ezJImrOnyTL3FZnYDZdWLTZcMW7Gomdp8zH9ztGlSo2L1iCAQXZ8HlV1bI8/Ts64g==", + "version": "5.17.9", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.17.9.tgz", + "integrity": "sha512-inxwRLI/4qpx4o85R54/zdhNagdBGBgs0la7Vl3qBorRVKRDk0nNsDTCGzG4lOITsw1gl7LRWeG4Zsp1pC8nfg==", "dev": true, "optional": true, "os": [ @@ -6565,13 +6001,6 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, - "node_modules/timm": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", - "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==", - "optional": true, - "peer": true - }, "node_modules/tinycolor2": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", @@ -6713,6 +6142,14 @@ "node": ">= 0.6" } }, + "node_modules/type-is/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -6777,11 +6214,6 @@ "setimmediate": "~1.0.4" } }, - "node_modules/unzipper/node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" - }, "node_modules/unzipper/node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -6833,16 +6265,6 @@ "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" }, - "node_modules/utif": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", - "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", - "optional": true, - "peer": true, - "dependencies": { - "pako": "^1.0.5" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -6890,11 +6312,6 @@ "extsprintf": "^1.2.0" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, "node_modules/vizion": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", @@ -6941,8 +6358,8 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatsapp-web.js": { - "version": "1.19.3", - "resolved": "git+ssh://git@github.com/cheveguerra/whatsapp-web.js.git#29b61b396b7728c019cdebaf77916c705fbf8970", + "version": "1.19.4", + "resolved": "git+ssh://git@github.com/cheveguerra/whatsapp-web.js.git#83560a2b5647d3accd039ce1f663f908edcfc960", "license": "Apache-2.0", "dependencies": { "@pedroslopez/moduleraid": "^5.0.2", @@ -7074,16 +6491,15 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", + "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -7204,21 +6620,6 @@ "yaml2json": "bin/yaml2json" } }, - "node_modules/yamljs/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/yamljs/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/provider/baileys.js b/provider/baileys.js index 96b0146..0c58528 100644 --- a/provider/baileys.js +++ b/provider/baileys.js @@ -1,4 +1,5 @@ const { default: makeWASocket, useMultiFileAuthState, Browsers, DisconnectReason } = require ('@adiwajshing/baileys') +// const { traeVariablesFromMsg, traeVariablesFromClient } = require('../implementaciones/extraFuncs') var pino = require('pino'); const { createWriteStream } = require('fs') var combineImage = require('combine-image'); @@ -39,8 +40,9 @@ const baileyGenerateImage = async (base64, name = 'qr.png') => { }); cleanImage.write(PATH_QR); }; + /** - * Iniciar todo Bailey + * Inicializa el Bot con Baileys */ initBot = async () => { console.log("Baileys Init") @@ -104,30 +106,11 @@ initBot = async () => { } // listenMessage(sock.ev) return sock - } - // run in main file - // initBot() +} +// run in main file +// initBot() + - /** - * Regresa las variables from, body, name y hasMedia de el objeto del mensaje. - * @param {*} msg - * @returns from, body, name, hasMedia - */ - function traeVariables(msg){ - const { remoteJid } = msg.messages[0].key - const { pushName } = msg.messages[0] - // console.log("THE_MSG = ", client.theMsg.messages[0]) - // console.log("*** CONVERSATION=", client.theMsg.messages[0].message?.conversation) - // console.log("*** SELECTEDDISPLAYTEXT=", client.theMsg.messages[0].message?.buttonsResponseMessage?.selectedDisplayText) - // console.log("*** TITLE=", client.theMsg.messages[0].message?.listResponseMessage?.title) - let theBody = msg.messages[0].message?.conversation || msg.messages[0].message?.buttonsResponseMessage?.selectedDisplayText || msg.messages[0].message?.listResponseMessage?.title - let from = remoteJid - let body = theBody - let name = pushName - let hasMedia = false - // console.log("fromBody=", from, body) - return {"from":from, "body":body, "name":name, "hasMedia":hasMedia} - } -module.exports = { initBot, baileyGenerateImage, makeWASocket, traeVariables } \ No newline at end of file +module.exports = { initBot, baileyGenerateImage, makeWASocket } \ No newline at end of file diff --git a/provider/wwebjs.js b/provider/wwebjs.js index 8e7e412..b92027d 100644 --- a/provider/wwebjs.js +++ b/provider/wwebjs.js @@ -14,7 +14,7 @@ app.use('/', require('../routes/web')) initBot = async () => { console.log("WaWebJS Init") - client = new Client({ + const client = new Client({ authStrategy: new LocalAuth(), puppeteer: { headless: true, args: ['--no-sandbox','--disable-setuid-sandbox'] } }); @@ -59,16 +59,4 @@ initBot = async () => { return client } -/** - * Regresa las variables from, body, name y hasMedia de el objeto del mensaje. - * @param {*} msg - * @returns from, body, name, hasMedia - */ -function traeVariables(msg){ - const { from, body, hasMedia } = msg; - let name = msg?._data?.notifyName - // console.log("fromBody=", msg?._data) - return {"from":from, "body":body, "name":name, "hasMedia":hasMedia} -} - -module.exports = { initBot, traeVariables } \ No newline at end of file +module.exports = { initBot } \ No newline at end of file