feat: se agregaron ejemplos de listas y botones

Se agregaron ejemplos de listas y botones
This commit is contained in:
2022-12-24 22:07:01 -06:00
parent bbc6b689ac
commit c54111a636
8 changed files with 304 additions and 4231 deletions

View File

@@ -190,6 +190,7 @@ module.exports = { get, reply, getIA, saveMessage, remplazos, stepsInitial } //M
* Reemplaza texto en la respuesta con variables predefinidas.
*/
function remplazos(elTexto, extraInfo){
if(elTexto == null){elTexto = '';}
laLista = elTexto.toString().split(' ');
// console.log(laLista);
// console.log('============= remplazos ============');
@@ -289,24 +290,18 @@ function remplazos(elTexto, extraInfo){
// return histlMsjs;
}
if (laLista[i].search('%nombre%')>-1){//Remplaza con el nombre del remitente.
console.log(extraInfo);
if(typeof extraInfo !== undefined){
console.log(1)
if(extraInfo['_data']['notifyName'] !== undefined){
console.log(2)
elTexto = elTexto.toString().replace('%nombre%', extraInfo['_data']['notifyName']);
console.log("notifyName");
const {theMsg} = extraInfo;
if(theMsg['_data']['notifyName'] !== undefined){
elTexto = elTexto.toString().replace('%nombre%', theMsg['_data']['notifyName']);
}
}
}
if (laLista[i].search('%primer_nombre%')>-1){//Remplaza con el nombre del remitente.
// console.log(extraInfo);
if(typeof extraInfo !== undefined){
if(extraInfo['_data']['notifyName'] !== undefined){
var elNombre = extraInfo['_data']['notifyName']
elTexto = elTexto.toString().replace('%primer_nombre%', elNombre.split(' ')[0]);
// console.log("notifyName");
const {theMsg} = extraInfo;
if(theMsg['_data']['notifyName'] !== undefined){
elTexto = elTexto.toString().replace('%primer_nombre%', theMsg['_data']['notifyName'].split(' ')[0]);
}
}
}

109
app.js
View File

@@ -15,11 +15,12 @@ const { generateImage, cleanNumber, checkEnvFile, createClient, isValidNumber }
const { connectionReady, connectionLost } = require('./controllers/connection')
const { saveMedia } = require('./controllers/save')
const { getMessages, responseMessages, bothResponse } = require('./controllers/flows')
const { sendMedia, sendMessage, lastTrigger, sendMessageButton, readChat } = require('./controllers/send');
const { sendMedia, sendMessage, lastTrigger, sendMessageButton, sendMessageList, readChat } = require('./controllers/send');
const { remplazos, stepsInitial} = require('./adapter/index');//MOD by CHV - Agregamos para utilizar remplazos y stepsInitial
const { isUndefined } = require('util');
const { isSet } = require('util/types');
const { Console } = require('console');
const { ClientRequest } = require('http');
const app = express();
app.use(cors())
app.use(express.json())
@@ -42,6 +43,11 @@ const listenMessage = () => client.on('message', async msg => {
// console.log("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
console.log("+++++++++++++++++++++++++++++++++++++ INICIO +++++++++++++++++++++++++++++++++++++++");
// console.log("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
client.theMsg = msg;
console.log("HORA:"+new Date().toLocaleTimeString()+" FROM:"+from+", BODY:"+body+", HASMEDIA:"+hasMedia);
newBody = removeDiacritics(body) //MOD by CHV - Agregamos para quitar acentos
// newBody = remplazos(newBody);
@@ -81,8 +87,36 @@ const listenMessage = () => client.on('message', async msg => {
return
}
var tempBody = body.toString().toLowerCase();
if(body=='/listas'){
const productList = new List(
"Here's our list of products at 50% off",
"View all products",
[
{
title: "Products list",
rows: [
{ id: "apple", title: "Apple" },
{ id: "mango", title: "Mango" },
{ id: "banana", title: "Banana" },
],
},
],
"Please select a product"
);
console.log('##################################################################################################')
// console.log(from, lista)
// let sections = [{title:'sectionTitle',rows:[{id:'ListItem1', title: 'title1'},{id:'ListItem2', title:'title2'}]}];
// let lista = new List('List body','btnText',sections,'Title','footer');
console.log("****************** productList ******************")
console.log(productList)
client.sendMessage(from, productList); //cliente.sendMessage recibe el arreglo SIN nombres (solo las secciones los necesitan)
// client.sendMessage('5215527049036@c.us', productList);
// client.sendMessage('5215554192439@c.us', productList);
// await sendMessageList(client, '5215545815654@c.us', null, lista); //sendMessageList recibe el arreglo CON nombres, como viene del response.json
// await sendMessageList(client, '5215527049036@c.us', null, lista);
// await sendMessageList(client, '5215554192439@c.us', null, lista);
// client.sendMessage(from, lista);
}
/**
* PRUEBA BOTONES NUEVOS
@@ -122,25 +156,14 @@ const listenMessage = () => client.on('message', async msg => {
// console.log("HAY URL?? : "+nuevaRespuesta.search("/URL"));
var resps = require('./flow/response.json');
nuevaRespuesta = remplazos(resps[step].replyMessage.join(''), msg);
nuevaRespuesta = remplazos(resps[step].replyMessage.join(''), client);
var pasoRequerido = resps[step].pasoRequerido;
// var hayRequest = false;
// if(hayRequest==false && nuevaRespuesta.search("/URL")>-1){console.log("Paramos flujo para que no mande el mensaje '/URL'."); return;}//Si el trigger es desbloqueo ya no hace nada mas.
/**
* Si quieres enviar botones
*/
if (response.delay){
// console.log("+++++++++++++++++++ SENDING MSG WITH DELAY ("+response.delay+") +++++++++++++++++");
setTimeout(() => {
sendMessage(client, from, nuevaRespuesta, response.trigger, step);
// console.log(" ************* Msg with delay SENT ****************")
}, response.delay)
}
else{
await sendMessage(client, from, nuevaRespuesta, response.trigger, step);
}
if (!response.delay && response.media) {
// console.log("++++++++++++++++++++++++++++ SEND MEDIA NO DELAY +++++++++++++++++++++++++++++++++++");
sendMedia(client, from, response.media, response.trigger);
@@ -151,11 +174,28 @@ const listenMessage = () => client.on('message', async msg => {
sendMedia(client, from, response.media, response.trigger);
}, response.delay)
}
if (response.delay){
// console.log("+++++++++++++++++++ SENDING MSG WITH DELAY ("+response.delay+") +++++++++++++++++");
setTimeout(() => {
sendMessage(client, from, nuevaRespuesta, response.trigger, step);
// console.log(" ************* Msg with delay SENT ****************")
}, response.delay)
}
else{
await sendMessage(client, from, nuevaRespuesta, response.trigger, step);
}
if(response.hasOwnProperty('actions')){
const { actions } = response;
// console.log("++++++++++++++++++++++++++++ SEND MESG BUTTON +++++++++++++++++++++++++++++++++++");
await sendMessageButton(client, from, null, actions);
// return
// console.log("++++++++++++++++++++++++++++ SEND MESG BUTTON/LIST +++++++++++++++++++++++++++++++++++");
if(actions['sections'] === undefined){ //Botones
console.log("Botones")
await sendMessageButton(client, from, null, actions);
}
else{ //Listas
console.log("Listas")
// console.log(actions)
await sendMessageList(client, from, null, actions);
}
}
return
}
@@ -163,7 +203,7 @@ const listenMessage = () => client.on('message', async msg => {
* Regresa el mensaje enviado, con los remplazos procesados.
*/
if(message.search('/rpt') > -1){
newBody = remplazos(newBody);
newBody = remplazos(newBody, client);
newBody = newBody.replace("/rpt ", "");
client.sendMessage(from, newBody);
return
@@ -176,14 +216,31 @@ const listenMessage = () => client.on('message', async msg => {
*/
if(message=='/spam'){
const masivo = require('./spam.json')
var saludo;
var caritas;
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function retardo() {
for (i=0;i<masivo.length;i++) {
console.log(masivo[i].numero+"@c.us");
client.sendMessage(masivo[i].numero+"@c.us", "Este es un mensaje de prueba para *"+masivo[i].numero+"*, HORA:*"+new Date().toLocaleTimeString()+"*");
var rnd = getRandomInt(1,4); // Random entre 1 y 3 segundos.
var rnd = getRandomInt(1,7); // Random entre 1 y 6 segundos.
if(rnd==1||rnd==4){saludo = "Hola ";}
else if(rnd==2||rnd==5){saludo = "Saludos ";}
else {saludo = "%saludo% ";}
if(rnd==1){caritas = "👨🏻‍🦰👩🏻‍🦰";}
else if(rnd==2){caritas = "👩🏻‍🦰👨🏻‍🦰";}
else if(rnd==3){caritas = "🧔🏽👧🏽";}
else if(rnd==4){caritas = "👧🏽🧔🏽";}
else if(rnd==5){caritas = "👩🏻‍🦰🧔🏽";}
else if(rnd==6){caritas = "🧔🏽👩🏻‍🦰";}
if(i % 15 === 0){console.log("******** VAN 15, HACEMOS PAUSA DE 10 SEGUNDOS ********"); await sleep(10000);} //
console.log(`============= Mandamos el mensaje ${i} ==============`);
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 🤑";
sendMedia(client, masivo[i].numero+"@c.us", "envioMasivoGuna.jpg");
await sleep(500);
client.sendMessage(masivo[i].numero+"@c.us", remplazos(elTextoDelMensaje, client));
// client.sendMessage(masivo[i].numero+"@c.us", "Este es un mensaje de prueba para *"+masivo[i].numero+"*, HORA:*"+new Date().toLocaleTimeString()+"*");
console.log(`Esperamos ${rnd} segundos...`);
await sleep(rnd*1000);
}
@@ -198,7 +255,6 @@ const listenMessage = () => client.on('message', async msg => {
return Math.floor(Math.random() * (max - min) + min); // The maximum is exclusive and the minimum is inclusive
}
//Si quieres tener un mensaje por defecto
if (process.env.DEFAULT_MESSAGE === 'true') {
const response = await responseMessages('DEFAULT')
@@ -208,7 +264,14 @@ const listenMessage = () => client.on('message', async msg => {
*/
if(response.hasOwnProperty('actions')){
const { actions } = response;
await sendMessageButton(client, from, null, actions);
if(actions['sections'] === undefined){ //Botones
console.log("Botones")
await sendMessageButton(client, from, null, actions);
}
else{ //Listas
console.log("Listas")
await sendMessageList(client, from, null, actions);
}
}
return
}

View File

@@ -47,7 +47,7 @@ const generateImage = (base64, cb = () => {}) => {
let qr_svg = qr.image(base64, { type: 'svg', margin: 4 });
qr_svg.pipe(require('fs').createWriteStream('./mediaSend/qr-code.svg'));
console.log(`⚡ Recuerda que el QR se actualiza cada minuto ⚡'`);
console.log(`⚡ Actualiza F5 el navegador para mantener el mejor QR`);
console.log(`⚡ Actualiza F5 el navegador para ver el QR mas reciente`);
cb()
}

View File

@@ -2,7 +2,7 @@
const ExcelJS = require('exceljs');
const moment = require('moment');
const fs = require('fs');
const { MessageMedia, Buttons } = require('whatsapp-web.js');
const { MessageMedia, Buttons, List } = require('whatsapp-web.js');
const { cleanNumber } = require('./handle')
const { remplazos } = require('../adapter/index'); //MOD by CHV - Agregamos remplazos
const DELAY_TIME = 170; //ms
@@ -58,12 +58,10 @@ 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/nuero.json"
// console.log("SENDMESSAGE (send.js) & regla = " + regla)
const sendMessage = async (client, number = null, text = null, trigger = null, regla) => { //MOD by CHV - Agregamos el parametro "regla" para guardarlo en "chats/numero.json"
setTimeout(async () => {
number = cleanNumber(number)
const message = text
// console.log("number="+number);
client.sendMessage(number, message);
await readChat(number, message, trigger, regla) //MOD by CHV - Agregamos el parametro "regla"
console.log(`⚡⚡⚡ Enviando mensajes....`);
@@ -76,18 +74,33 @@ const sendMessage = async (client, number = null, text = null, trigger = null, r
* @param {*} number
*/
const sendMessageButton = async (client, number = null, text = null, actionButtons) => {
number = cleanNumber(number)
const { title = null, message = null, footer = null, buttons = [] } = actionButtons;
let button = new Buttons(remplazos(message),[...buttons], title, footer);
// console.log("number="+number);
client.sendMessage(number, button);
console.log(`⚡⚡⚡ Enviando mensajes....`);
console.log("sendMessageButton.");
// console.log("Trigger="+trigger);
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));
client.sendMessage(number, button);
console.log(`⚡⚡⚡ Enviando mensajes (botones)....`);
// console.log("sendMessageButton.");
}, DELAY_TIME)
// console.log("************************ SEND MESSAGE BUTTON ***********************************");
}
/**
* Enviamos listas (con el formato de response.json)
* @param {*} number
*/
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+' ....');
}, DELAY_TIME)
}
/**
* Opte
@@ -121,4 +134,4 @@ const readChat = async (number, message, trigger = null, regla) => { //MOD by CH
// console.log('Saved')
}
module.exports = { sendMessage, sendMedia, lastTrigger, sendMessageButton, readChat, sendMediaVoiceNote }
module.exports = { sendMessage, sendMedia, lastTrigger, sendMessageButton, sendMessageList, readChat, sendMediaVoiceNote }

View File

@@ -42,5 +42,37 @@
{
"keywords": ["rnd2"],
"key": "rnd2"
},
{
"keywords": ["4"],
"key": "lista"
},
{
"keywords": ["5"],
"key": "botones"
},
{
"keywords": ["cursos"],
"key": "cursos"
},
{
"keywords": ["youtube"],
"key": "youtube"
},
{
"keywords": ["telegram"],
"key": "telegram"
},
{
"keywords": ["manzana"],
"key": "manzana"
},
{
"keywords": ["mango"],
"key": "mango"
},
{
"keywords": ["platano"],
"key": "platano"
}
]

View File

@@ -16,7 +16,9 @@
"%saludo% %primer_nombre%, este es el menú, selecciona una opción: \n",
"Pon *1* para mensajes anteriores.\n",
"Pon *2* para ver remplazos.\n",
"Pon *3* para pedir nombre (RegExp).\n"
"Pon *3* para pedir nombre (RegExp).\n",
"Pon *4* para un ejemplo de listas.\n",
"Pon *5* para un ejemplo de botones.\n"
],
"media":null,
"trigger":null
@@ -108,5 +110,83 @@
{"body":"Telegram"}
]
}
},
"lista":{
"replyMessage":[
"*%saludo%*, este es un ejemplo de listas"
],
"media":null,
"trigger":null,
"actions":{
"body":"Hola *%primer_nombre%*, aqui está nuestra lista de productos al 50% de descuento,\n\nAutomáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*.",
"buttonText":"Ver todos los productos",
"sections": [
{"title":"Lista de productos",
"rows":[
{"id": "manzana", "title": "manzana"},
{"id": "mango", "title": "mango"},
{"id": "platano", "title": "platano"}
]
}
],
"title":"Por favor selecciona un producto"
},
"pasoRequerido":"menu",
"goto":"menu"
},
"botones":{
"replyMessage":[
"*%saludo%*, este es un ejemplo de botones"
],
"media":"https://media2.giphy.com/media/VQJu0IeULuAmCwf5SL/giphy.gif",
"trigger":null,
"actions":{
"title":"¿Que te interesa ver %primer_nombre%?",
"message":"Recuerda todo este contenido es gratis y estaria genial que me sigas!",
"footer":"Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*.",
"buttons":[
{"body":"Cursos"},
{"body":"Youtube"},
{"body":"Telegram"}
]
},
"pasoRequerido":"menu",
"goto":"menu"
},
"cursos":{
"replyMessage":["*%saludo% %primer_nombre%*, seleccionaste *Cursos*\n\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*."],
"trigger":null,
"pasoRequerido":"menu",
"goto":"menu"
},
"youtube":{
"replyMessage":["*%saludo% %primer_nombre%*, seleccionaste *YouTube*\n\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*."],
"trigger":null,
"pasoRequerido":"menu",
"goto":"menu"
},
"telegram":{
"replyMessage":["*%saludo% %primer_nombre%*, seleccionaste *Telegram*\n\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*."],
"trigger":null,
"pasoRequerido":"menu",
"goto":"menu"
},
"manzana":{
"replyMessage":["*%saludo% %primer_nombre%*, seleccionaste *manzana*\n\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*."],
"trigger":null,
"pasoRequerido":"menu",
"goto":"menu"
},
"mango":{
"replyMessage":["*%saludo% %primer_nombre%*, seleccionaste *mango*\n\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*."],
"trigger":null,
"pasoRequerido":"menu",
"goto":"menu"
},
"platano":{
"replyMessage":["*%saludo% %primer_nombre%*, seleccionaste *platano*\n\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*."],
"trigger":null,
"pasoRequerido":"menu",
"goto":"menu"
}
}

4248
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -26,7 +26,7 @@
"qrcode-terminal": "^0.12.0",
"socket.io": "^4.5.1",
"stormdb": "^0.6.0",
"whatsapp-web.js": "^1.18.4",
"whatsapp-web.js": "github:pedroslopez/whatsapp-web.js#fix-buttons-list",
"xlsx": "^0.18.5"
},
"devDependencies": {