mirror of
https://github.com/cheveguerra/botLeiferAurik-Mod_2.0.git
synced 2026-04-18 19:59:24 +00:00
integramos Baileys y varios cambios,
This commit is contained in:
318
app.js
318
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<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, tempItem)
|
||||
}
|
||||
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(client, from, null, productList)
|
||||
// console.log(ctx)
|
||||
// sendMessagList(client, from, null, productList);
|
||||
return
|
||||
}).catch(function (error) {
|
||||
console.log(error);
|
||||
return error
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Llama el API para traer subcategorias de Guna.
|
||||
* @param {*} ctx El objeto del mensaje.
|
||||
*/
|
||||
async function getGunaSubtipo(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")
|
||||
client.sendMessage(from, "Esa categoría *no existe*, por favor revisa y vuelve a intentar.")
|
||||
}
|
||||
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("Sselecciona una subcategoría 👇🏽", ctx),
|
||||
title: "Ver las subcategorías",
|
||||
sections:[
|
||||
{ title: "Subcategorías",
|
||||
rows: lasOpciones,
|
||||
}
|
||||
],
|
||||
footer:"",
|
||||
buttonText:`CATEGORÍA ${body}`
|
||||
}
|
||||
sendMessageList(client, 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.
|
||||
*/
|
||||
async function getGunaProds(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(client, 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.
|
||||
*/
|
||||
async function agregaProds(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(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()
|
||||
|
||||
Reference in New Issue
Block a user