integramos Baileys y varios cambios,

This commit is contained in:
2023-02-21 18:49:07 -06:00
parent 3518f516e0
commit fe8d0f7648
17 changed files with 935 additions and 1360 deletions

View File

@@ -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<response.data.respuesta.length;reg++) {
let tempItem = {}
tempItem['id']=response.data.respuesta[reg].CAT_PT_DESC
tempItem['title']=response.data.respuesta[reg].CAT_PT_DESC
lasOpciones.push(tempItem)
console.log(lasOpciones.length, lasOpciones)
}
console.log(lasOpciones2)
const productList = {
body: remplazos("%saludo%, selecciona una categoría 👇🏽", ctx),
title: "Ver las categorías",
sections:[
{ title: "Categorías",
rows: lasOpciones,
}
],
footer:"Categorías",
buttonText:"Selecciona"
}
sendMessageList(ctx, from, null, productList)
console.log(ctx)
sendMessagList(ctx, from, null, productList);
return
}).catch(function (error) {
console.log(error);
return error
});
// for(o=0;o<lasOpciones.length;o++){
// let theUrlSubsT = `http://localhost:8888/dbrquery?j={"query":"selectSubtipoFerreroMty","exec":"ExecuteQuery","params":{"par1":"${lasOpciones[o].id}"}}`
// const RES2 = await axios.get(theUrlSubsT).then(function (response2) {
// console.log("LO= ", lasOpciones.length, o)
// console.log("R2= ", response2.data.respuesta.length)
// lasOpciones2 = {}
// lasOpciones[o].rows = []
// delete lasOpciones[o].id
// for(st=0;st<response2.data.respuesta.length;st++) {
// let tempItem = {}
// tempItem['rowId']=response2.data.respuesta[st].CAT_PS_DESC
// tempItem['title']=response2.data.respuesta[st].CAT_PS_DESC
// lasOpciones[o].rows.push(tempItem)
// console.log("LO2= ", lasOpciones2.length, st, tempItem)
// // lasOpciones[st].rows = lasOpciones2
// }
// }).catch(function (error) {
// console.log(error);
// return error
// })
// }
// console.log(lasOpciones)
// console.log(lasOpciones[0].rows)
// const productList = {
// body: remplazos("Selecciona una categoria 👇🏽", ctx),
// title: "Ver las categorías",
// sections:lasOpciones,
// footer:"",
// buttonText:`CATEGORÍAS`
// }
// sendMessageList(ctx, from, null, productList)
},
/**
* Llama el API para traer subcategorias de Guna.
* @param {*} ctx El objeto del mensaje.
*/
getGunaSubtipo : async function getGunaSubtipo(ctx) {
const { from, body, name, hasMedia, step } = traeVariablesFromClient(ctx);
let par1 = ctx.theMsg.body
vars[from]['tipo'] = ctx.theMsg.body
// console.log("V_TIPO=", from, vars[from]['tipo'])
let theUrl = `http://localhost:8888/dbrquery?j={"query":"selectSubtipoFerreroMty","exec":"ExecuteQuery","params":{"par1":"${vars[from]['tipo']}"}}`
const RES = await axios.get(theUrl).then(function (response) {
if( response.data.respuesta.length == 0 ) {
console.log("No hay resultados",from)
vamosA(from, "gunaCats")
sendMessage(ctx, from, "Esa categoría *no existe*, por favor revisa y vuelve a intentar.", null, step)
}
let elMensaje = "Gracias,\nAhora una subcategoría:\n\n"
let lasOpciones = []
for(reg=0;reg<response.data.respuesta.length;reg++) {
let tempItem = {}
tempItem['id']=response.data.respuesta[reg].CAT_PS_DESC
tempItem['title']=response.data.respuesta[reg].CAT_PS_DESC
lasOpciones.push(tempItem)
// console.log(lasOpciones.length, tempItem)
}
const productList = {
body: remplazos("Selecciona una subcategoría 👇🏽", ctx),
title: "Ver las subcategorías",
sections:[
{ title: "Subcategorías",
rows: lasOpciones,
}
],
footer:"",
buttonText:`CATEGORÍA ${body}`
}
sendMessageList(ctx, from, null, productList)
return "1"
}).catch(function (error) {
console.log(error);
return error
});
},
/**
* Llama el API para traer productos de Guna.
* @param {*} ctx El objeto del mensaje.
*/
getGunaProds : async function getGunaProds(ctx) {
const { from, body, name, hasMedia, step } = traeVariablesFromClient(ctx);
if(vars[from]['recompra'] === undefined) vars[from]['subtipo'] = ctx.theMsg.body
console.log(vars[from]['tipo'], vars[from]['subtipo'], "RECOMPRA=", vars[from]['recompra'])
let theUrl = `http://localhost:8888/dbrquery?j={"query":"selectProdsFerreroMty","exec":"ExecuteQuery","params":{"par1":"${vars[from]['tipo']}", "par2":"${vars[from]['subtipo']}"}}`
const RES = await axios.get(theUrl).then(function (response) {
let elMensaje = "Gracias,\nAhora un producto:\n\n"
let lasOpciones = []
console.log("resultados selectProds",response.data.respuesta.length)
for(reg=0;reg<response.data.respuesta.length;reg++) {
let tempItem = {}
tempItem['id']=response.data.respuesta[reg].CAT_GP_ID
tempItem['title']=`${response.data.respuesta[reg].CAT_GP_NOMBRE} $${response.data.respuesta[reg].CAT_GP_PRECIO}, INV:${response.data.respuesta[reg].CAT_GP_ALMACEN} `
lasOpciones.push(tempItem)
}
const productList = {
body: remplazos("Selecciona un producto 👇🏽", ctx),
title: "Ver los productos",
sections:[
{ title: "Productos",
rows: lasOpciones,
}
],
buttonText:`SUBCATEGORÍA ${vars[from]['subtipo']}`
}
sendMessageList(ctx, from, null, productList)
return "1"
}).catch(function (error) {
console.log(error);
return error
});
},
/**
* Llama el API para traer productos de Guna.
* @param {*} ctx El objeto del mensaje.
*/
agregaProds : async function agregaProds(ctx) {
const { from, body, name, hasMedia, step } = traeVariablesFromClient(ctx);
// vars[from]['subtipo'] = ctx.theMsg.body
if(vars[from]['prods'] === undefined) { vars[from]['prods'] = [] }
let elProd = ctx.theMsg.body
let elMensaje = ""
if(elProd.indexOf(' $') > -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()

View File

@@ -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 dutilisation 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 }
module.exports = { removeDiacritics, traeMensajes, chkFile, getRandomInt, remplazos, soloNumero, agregaVars, traeVariablesFromClient, traeVariablesFromMsg }