diff --git a/__test__/0.0.1-case.test.js b/__test__/0.0.1-case.test.js index 1f71435b1..2f5879257 100644 --- a/__test__/0.0.1-case.test.js +++ b/__test__/0.0.1-case.test.js @@ -1,6 +1,6 @@ const { suite } = require('uvu') const assert = require('uvu/assert') -const { addKeyword, createBot, createFlow } = require('../packages/bot/index') +const { addKeyword, createBot, createFlow, EVENTS } = require('../packages/bot/index') const { setup, clear, delay } = require('../__mocks__/env') const suiteCase = suite('Flujo: Provider envia un location') @@ -8,8 +8,8 @@ const suiteCase = suite('Flujo: Provider envia un location') suiteCase.before.each(setup) suiteCase.after.each(clear) -suiteCase(`Responder a "CURRENT_LOCATION"`, async ({ database, provider }) => { - const flow = addKeyword('#CURRENT_LOCATION#').addAnswer('Gracias por tu location') +suiteCase(`Responder a "EVENTS.LOCATION"`, async ({ database, provider }) => { + const flow = addKeyword(EVENTS.LOCATION).addAnswer('Gracias por tu location') createBot({ database, @@ -19,7 +19,7 @@ suiteCase(`Responder a "CURRENT_LOCATION"`, async ({ database, provider }) => { await provider.delaySendMessage(0, 'message', { from: '000', - body: '#CURRENT_LOCATION#', + body: '_event_location__f405d946-cf07-uutt-l7e0-b6d475bc7f81', }) await delay(200) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 09e926d83..88695bac4 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -4,6 +4,8 @@ const { delay } = require('../utils/delay') const Queue = require('../utils/queue') const { Console } = require('console') const { createWriteStream } = require('fs') +const { REGEX_EVENT_LOCATION } = require('../io/events/eventLocation') +const { REGEX_EVENT_MEDIA } = require('../io/events/eventMedia') const logger = new Console({ stdout: createWriteStream(`${process.cwd()}/core.class.log`), @@ -21,7 +23,7 @@ class CoreClass { flowClass databaseClass providerClass - generalArgs = { blackList: [] } + generalArgs = { blackList: [], listEvents: {} } constructor(_flow, _database, _provider, _args) { this.flowClass = _flow this.databaseClass = _database @@ -117,7 +119,6 @@ class CoreClass { endFlowFlag = true if (message) this.sendProviderAndSave(from, createCtxMessage(message)) clearQueue() - sendFlow([]) return } @@ -249,7 +250,20 @@ class CoreClass { } msgToSend = this.flowClass.find(body) || [] - sendFlow(msgToSend, from) + if (msgToSend.length) return sendFlow(msgToSend, from) + + if (!prevMsg?.options?.capture) { + msgToSend = this.flowClass.find(this.generalArgs.listEvents.WELCOME) || [] + + if (REGEX_EVENT_LOCATION.test(body)) { + msgToSend = this.flowClass.find(this.generalArgs.listEvents.LOCATION) || [] + } + + if (REGEX_EVENT_MEDIA.test(body)) { + msgToSend = this.flowClass.find(this.generalArgs.listEvents.MEDIA) || [] + } + } + return sendFlow(msgToSend, from) } /** diff --git a/packages/bot/index.js b/packages/bot/index.js index fe03d60c0..93a16ee38 100644 --- a/packages/bot/index.js +++ b/packages/bot/index.js @@ -2,13 +2,15 @@ const CoreClass = require('./core/core.class') const ProviderClass = require('./provider/provider.class') const FlowClass = require('./io/flow.class') const { addKeyword, addAnswer, addChild, toSerialize } = require('./io/methods') +const EVENTS = require('./io/events') /** * Crear instancia de clase Bot * @param {*} args * @returns */ -const createBot = async ({ flow, database, provider }, args = {}) => new CoreClass(flow, database, provider, args) +const createBot = async ({ flow, database, provider }, args = {}) => + new CoreClass(flow, database, provider, { ...args, listEvents: EVENTS }) /** * Crear instancia de clase Io (Flow) @@ -42,4 +44,5 @@ module.exports = { toSerialize, ProviderClass, CoreClass, + EVENTS, } diff --git a/packages/bot/io/events/eventDocument.js b/packages/bot/io/events/eventDocument.js new file mode 100644 index 000000000..afa87cda4 --- /dev/null +++ b/packages/bot/io/events/eventDocument.js @@ -0,0 +1,7 @@ +const { generateRef } = require('../../utils/hash') + +const eventDocument = () => { + return generateRef('_event_document_') +} + +module.exports = { eventDocument } diff --git a/packages/bot/io/events/eventLocation.js b/packages/bot/io/events/eventLocation.js new file mode 100644 index 000000000..12ff2d6a0 --- /dev/null +++ b/packages/bot/io/events/eventLocation.js @@ -0,0 +1,9 @@ +const { generateRef } = require('../../utils/hash') + +const eventLocation = () => { + return generateRef('_event_location_') +} + +const REGEX_EVENT_LOCATION = /^_event_location__[\w\d]{8}-(?:[\w\d]{4}-){3}[\w\d]{12}$/ + +module.exports = { eventLocation, REGEX_EVENT_LOCATION } diff --git a/packages/bot/io/events/eventMedia.js b/packages/bot/io/events/eventMedia.js new file mode 100644 index 000000000..e23f242c9 --- /dev/null +++ b/packages/bot/io/events/eventMedia.js @@ -0,0 +1,9 @@ +const { generateRef } = require('../../utils/hash') + +const eventMedia = () => { + return generateRef('_event_media_') +} + +const REGEX_EVENT_MEDIA = /^_event_media__[\w\d]{8}-(?:[\w\d]{4}-){3}[\w\d]{12}$/ + +module.exports = { eventMedia, REGEX_EVENT_MEDIA } diff --git a/packages/bot/io/events/eventVoiceNote.js b/packages/bot/io/events/eventVoiceNote.js new file mode 100644 index 000000000..3ce83737c --- /dev/null +++ b/packages/bot/io/events/eventVoiceNote.js @@ -0,0 +1,7 @@ +const { generateRef } = require('../../utils/hash') + +const eventVoiceNote = () => { + return generateRef('_event_voice_note_') +} + +module.exports = { eventVoiceNote } diff --git a/packages/bot/io/events/eventWelcome.js b/packages/bot/io/events/eventWelcome.js new file mode 100644 index 000000000..215ba5b77 --- /dev/null +++ b/packages/bot/io/events/eventWelcome.js @@ -0,0 +1,7 @@ +const { generateRef } = require('../../utils/hash') + +const eventWelcome = () => { + return generateRef('_event_welcome_') +} + +module.exports = { eventWelcome } diff --git a/packages/bot/io/events/index.js b/packages/bot/io/events/index.js new file mode 100644 index 000000000..9f8b390fe --- /dev/null +++ b/packages/bot/io/events/index.js @@ -0,0 +1,15 @@ +const { eventDocument } = require('./eventDocument') +const { eventLocation } = require('./eventLocation') +const { eventMedia } = require('./eventMedia') +const { eventVoiceNote } = require('./eventVoiceNote') +const { eventWelcome } = require('./eventWelcome') + +const LIST_ALL = { + WELCOME: eventWelcome(), + MEDIA: eventMedia(), + LOCATION: eventLocation(), + DOCUMENT: eventDocument(), + VOICE_NOTE: eventVoiceNote(), +} + +module.exports = LIST_ALL diff --git a/packages/bot/package.json b/packages/bot/package.json index 053a85d9d..844f8e829 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.100-alpha.0", + "version": "0.0.105-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/provider/common/hash.js b/packages/provider/common/hash.js new file mode 100644 index 000000000..e9c74b8e1 --- /dev/null +++ b/packages/provider/common/hash.js @@ -0,0 +1,13 @@ +const crypto = require('crypto') + +/** + * Generamos un UUID unico con posibilidad de tener un prefijo + * @param {*} prefix + * @returns + */ +const generateRefprovider = (prefix = false) => { + const id = crypto.randomUUID() + return prefix ? `${prefix}_${id}` : id +} + +module.exports = { generateRefprovider } diff --git a/packages/provider/package.json b/packages/provider/package.json index 5c3ef0a2a..987ed73bf 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.70-alpha.0", + "version": "0.0.92-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index eaa6adbb9..b344d0328 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -12,6 +12,7 @@ const { default: makeWASocket, useMultiFileAuthState, Browsers, DisconnectReason const { baileyGenerateImage, baileyCleanNumber, baileyIsValidNumber } = require('./utils') const { generalDownload } = require('../../common/download') +const { generateRefprovider } = require('../../common/hash') const logger = new Console({ stdout: createWriteStream(`${process.cwd()}/baileys.log`), @@ -122,13 +123,19 @@ class BaileysProvider extends ProviderClass { from: messageCtx?.key?.remoteJid, } + //Detectar location if (messageCtx.message.locationMessage) { const { degreesLatitude, degreesLongitude } = messageCtx.message.locationMessage if (typeof degreesLatitude === 'number' && typeof degreesLongitude === 'number') { - payload = { ...payload, body: `#CURRENT_LOCATION#` } + payload = { ...payload, body: generateRefprovider('_event_location_') } } } + //Detectar media + if (messageCtx.message?.imageMessage) { + payload = { ...payload, body: generateRefprovider('_event_media_') } + } + if (payload.from === 'status@broadcast') return if (payload?.key?.fromMe) return diff --git a/packages/provider/src/venom/index.js b/packages/provider/src/venom/index.js index 2ab185e24..d8bcf7163 100644 --- a/packages/provider/src/venom/index.js +++ b/packages/provider/src/venom/index.js @@ -11,6 +11,7 @@ const logger = new Console({ }) const { generalDownload } = require('../../common/download') +const { generateRefprovider } = require('../../common/hash') /** * ⚙️ VenomProvider: Es una clase tipo adaptor @@ -89,11 +90,16 @@ class VenomProvider extends ProviderClass { return } payload.from = venomCleanNumber(payload.from, true) + + if (payload.hasOwnProperty('type') && ['image', 'video'].includes(payload.type)) { + payload = { ...payload, body: generateRefprovider('_event_media_') } + } + if (payload.hasOwnProperty('lat') && payload.hasOwnProperty('lng')) { const lat = payload.lat const lng = payload.lng if (lat !== '' && lng !== '') { - payload = { ...payload, body: `#CURRENT_LOCATION#` } + payload = { ...payload, body: generateRefprovider('_event_location_') } } } this.emit('message', payload) diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index 71c1bc482..598d44d06 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -10,6 +10,7 @@ const logger = new Console({ const { generalDownload } = require('../../common/download') const mime = require('mime-types') +const { generateRefprovider } = require('../../common/hash') /** * ⚙️ WebWhatsappProvider: Es una clase tipo adaptor @@ -91,8 +92,13 @@ class WebWhatsappProvider extends ProviderClass { } payload.from = wwebCleanNumber(payload.from, true) if (payload._data.lat && payload._data.lng) { - payload = { ...payload, body: `#CURRENT_LOCATION#` } + payload = { ...payload, body: generateRefprovider('_event_location_') } } + + if (payload._data.hasOwnProperty('type') && ['image', 'video'].includes(payload._data.type)) { + payload = { ...payload, body: generateRefprovider('_event_media_') } + } + this.emit('message', payload) }, }, diff --git a/starters/apps/base-venom-json/package.json b/starters/apps/base-venom-json/package.json index 87b993b19..535e49398 100644 --- a/starters/apps/base-venom-json/package.json +++ b/starters/apps/base-venom-json/package.json @@ -10,12 +10,12 @@ "keywords": [], "dependencies": { "venom-bot": "4.3.7", + "mime-types": "2.1.35", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "@bot-whatsapp/portal": "latest", - "mime-types": "2.1.35" + "@bot-whatsapp/portal": "latest" }, "author": "", "license": "ISC"