diff --git a/TODO.md b/TODO.md index 99f7a9c..ec0c109 100644 --- a/TODO.md +++ b/TODO.md @@ -9,10 +9,8 @@ - [X] .addKeyword('1') no funciona con 1 caracter - [X] sensitivy viene activado por defecto - [X] fallback respuesta en hijo: Se puede colocar en option el ref de la answer fallback -- [X] envia imagen -- [ ] envia nota de voz +- [X] Cuando Envian Sticket devuelve mensaje raro - [ ] colocar mensaje esperando conectando whatsapp (provider) -- [ ] Cuando Envian Sticket devuelve mensaje raro - [ ] createDatabase validar implementacion de funciones - [ ] limitar caracteres de mensajes @@ -26,8 +24,9 @@ ### @bot-whatsapp/provider - [X] agregar export package - [ ] __(doc):__ Video para explicar como implementar nuevos providers -- [ ] WhatsappWeb provider enviar imagenes -- [ ] WhatsappWeb provider enviar audio +- [X] WhatsappWeb provider enviar imagenes +- [X] WhatsappWeb provider enviar audio +- [X] WhatsappWeb botones (Tiene truco) github:leifermendez/whatsapp-web.js - [ ] Twilio adapter - [ ] Meta adapter @@ -36,4 +35,7 @@ ### @bot-whatsapp/create-bot -- [ ] \ No newline at end of file +- [ ] + +### Extra +- [X] Crear CI mantener fork update https://stackoverflow.com/questions/23793062/can-forks-be-synced-automatically-in-github \ No newline at end of file diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 72533df..b1e2fbc 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -55,6 +55,9 @@ class CoreClass { const { body, from } = messageInComming let msgToSend = [] let fallBackFlag = false + + if (!body.length) return + const prevMsg = await this.databaseClass.getPrevByNumber(from) const refToContinue = this.flowClass.findBySerialize( prevMsg?.refSerialize diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index 8595312..a010da6 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -1,4 +1,10 @@ -const { Client, LocalAuth, MessageMedia } = require('whatsapp-web.js') +const { + Client, + LocalAuth, + MessageMedia, + Buttons, + List, +} = require('whatsapp-web.js') const { ProviderClass } = require('@bot-whatsapp/bot') const { Console } = require('console') const { createWriteStream, existsSync } = require('fs') @@ -8,6 +14,11 @@ const logger = new Console({ stdout: createWriteStream('./log'), }) +/** + * WebWhatsappProvider: Es una clase tipo adaptor + * que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas) + * https://github.com/pedroslopez/whatsapp-web.js + */ class WebWhatsappProvider extends ProviderClass { vendor constructor() { @@ -26,8 +37,9 @@ class WebWhatsappProvider extends ProviderClass { logger.log(e) this.emit('require_action', { instructions: [ - `Debes eliminar la carpeta .wwebjs_auth`, - `y reiniciar nuevamente el bot `, + `(Opcion 1): Debes eliminar la carpeta .wwebjs_auth y reiniciar nuevamente el bot. `, + `(Opcion 2): Intenta actualizar el paquete [npm install whatsapp-web.js] `, + `(Opcion 3): Ir FORO de discord https://link.codigoencasa.com/DISCORD `, ], }) }) @@ -80,20 +92,85 @@ class WebWhatsappProvider extends ProviderClass { }, ] + /** + * Enviar un archivo multimedia + * https://docs.wwebjs.dev/MessageMedia.html + * @private + * @param {*} number + * @param {*} mediaInput + * @returns + */ sendMedia = async (number, mediaInput = null) => { if (!existsSync(mediaInput)) throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`) const media = MessageMedia.fromFilePath(mediaInput) - return this.vendor.sendMessage(number, media) + return this.vendor.sendMessage(number, media, { + sendAudioAsVoice: true, + }) } + /** + * Enviar botones + * https://docs.wwebjs.dev/Buttons.html + * @private + * @param {*} number + * @param {*} message + * @param {*} buttons [] + * @returns + */ + sendButtons = async (number, message, buttons = []) => { + const buttonMessage = new Buttons(message, buttons, '', '') + return this.vendor.sendMessage(number, buttonMessage) + } + + /** + * Enviar lista + * https://docs.wwebjs.dev/List.html + * @private + * @alpha No funciona en whatsapp bussines + * @param {*} number + * @param {*} message + * @param {*} buttons [] + * @returns + */ + sendList = async (number, message, listInput = []) => { + let sections = [ + { + title: 'sectionTitle', + rows: [ + { title: 'ListItem1', description: 'desc' }, + { title: 'ListItem2' }, + ], + }, + ] + let list = new List('List body', 'btnText', sections, 'Title', 'footer') + return this.vendor.sendMessage(number, list) + } + + /** + * Enviar un mensaje solo texto + * https://docs.wwebjs.dev/Message.html + * @private + * @param {*} number + * @param {*} message + * @returns + */ sendText = async (number, message) => { return this.vendor.sendMessage(number, message) } + /** + * + * @param {*} userId + * @param {*} message + * @param {*} param2 + * @returns + */ sendMessage = async (userId, message, { options }) => { const number = cleanNumber(userId) if (options?.media) return this.sendMedia(number, options.media) + if (options?.buttons?.length) + return this.sendButtons(number, message, options.buttons) return this.sendText(number, message) } }