Files
bot-whatsapp/app.js
2022-01-15 13:23:56 +01:00

153 lines
3.9 KiB
JavaScript

/**
* ⚡⚡⚡ DECLARAMOS LAS LIBRERIAS y CONSTANTES A USAR! ⚡⚡⚡
*/
require('dotenv').config()
const fs = require('fs');
const express = require('express');
const qrcode = require('qrcode-terminal');
const { Client } = require('whatsapp-web.js');
const mysqlConnection = require('./config/mysql')
const { middlewareClient } = require('./middleware/client')
const { connectionReady, connectionLost } = require('./controllers/connection')
const { saveMedia } = require('./controllers/save')
const { getMessages, responseMessages } = require('./controllers/flows')
const { sendMedia, sendMessage, lastTrigger } = require('./controllers/send')
const app = express();
app.use(express.json())
const port = process.env.PORT || 3000
const SESSION_FILE_PATH = './session.json';
var client;
var sessionData;
/**
* Escuchamos cuando entre un mensaje
*/
const listenMessage = () => client.on('message', async msg => {
const { from, body, hasMedia } = msg;
// Este bug lo reporto Lucas Aldeco Brescia para evitar que se publiquen estados
if(from === 'status@broadcast'){
return
}
message = body.toLowerCase();
/**
* Guardamos el archivo multimedia que envia
*/
if (process.env.SAVE_MEDIA && hasMedia) {
const media = await msg.downloadMedia();
saveMedia(media);
}
/**
* Ver si viene de un paso anterior
* Aqui podemos ir agregando más pasos
* a tu gusto!
*/
const lastStep = await lastTrigger(from) || null;
if (lastStep === 'STEP_2') {
const response = responseMessages(lastStep)
sendMessage(client, from, response);
return
}
if (lastStep === 'STEP_3') {
const response = responseMessages(lastStep)
sendMessage(client, from, response);
return
}
/**
* Respondemos al primero paso si encuentra palabras clave
*/
if (await getMessages('STEP_1', message)) {
const response = responseMessages('STEP_1')
sendMessage(client, from, response, 'STEP_2');
return
}
// if (getMessages('STEP_2').includes(message)) {
// const response = responseMessages('STEP_2')
// sendMessage(client, from, response);
// return
// }
});
/**
* Revisamos si tenemos credenciales guardadas para inciar sessio
* este paso evita volver a escanear el QRCODE
*/
const withSession = () => {
// Si exsite cargamos el archivo con las credenciales
console.log(`Validando session con Whatsapp...`)
sessionData = require(SESSION_FILE_PATH);
client = new Client({
session: sessionData
});
client.on('ready', () => {
connectionReady();
listenMessage()
loadRoutes(client);
});
client.on('auth_failure', () => connectionLost())
client.initialize();
}
/**
* Generamos un QRCODE para iniciar sesion
*/
const withOutSession = () => {
console.log('No tenemos session guardada');
client = new Client();
client.on('qr', qr => {
qrcode.generate(qr, { small: true });
});
client.on('ready', () => {
connectionReady()
});
client.on('auth_failure', () => connectionLost());
client.on('authenticated', (session) => {
sessionData = session;
fs.writeFile(SESSION_FILE_PATH, JSON.stringify(session), function (err) {
if (err) {
console.log(`Ocurrio un error con el archivo: `, err);
}
});
});
client.initialize();
}
/**
* Cargamos rutas de express
*/
const loadRoutes = (client) => {
app.use('/api/', middlewareClient(client), require('./routes/api'))
}
/**
* Revisamos si existe archivo con credenciales!
*/
(fs.existsSync(SESSION_FILE_PATH)) ? withSession() : withOutSession();
/**
* Verificamos si tienes un gesto de db
*/
if(process.env.DATABASE === 'mysql'){
mysqlConnection.connect()
}
app.listen(port, () => {
console.log(`El server esta listo por el puerto ${port}`);
})