diff --git a/packages/provider/common/download.js b/packages/provider/common/download.js
new file mode 100644
index 0000000..76e23a0
--- /dev/null
+++ b/packages/provider/common/download.js
@@ -0,0 +1,65 @@
+const mimeDep = require('mime-types')
+const { tmpdir } = require('os')
+const http = require('http')
+const https = require('https')
+const { rename, createWriteStream } = require('fs')
+
+/**
+ * Extrar el mimetype from buffer
+ * @param {string} response
+ * @returns
+ */
+const fileTypeFromFile = async (response) => {
+ const type = response.headers['content-type'] ?? null
+ const ext = mimeDep.extension(type)
+ return {
+ type,
+ ext,
+ }
+}
+
+/**
+ * Descargar archivo binay en tmp
+ * @param {*} url
+ * @returns
+ */
+const generalDownload = async (url) => {
+ const handleDownload = () => {
+ const checkProtocol = url.includes('https:')
+ const handleHttp = checkProtocol ? https : http
+ const name = `tmp-${Date.now()}-dat`
+ const fullPath = `${tmpdir()}/${name}`
+ const file = createWriteStream(fullPath)
+
+ return new Promise((res, rej) => {
+ handleHttp.get(url, function (response) {
+ response.pipe(file)
+ file.on('finish', async function () {
+ file.close()
+ res({ response, fullPath })
+ })
+ file.on('error', function () {
+ file.close()
+ rej(null)
+ })
+ })
+ })
+ }
+
+ const handleFile = (pathInput, ext) =>
+ new Promise((resolve, reject) => {
+ const fullPath = `${pathInput}.${ext}`
+ rename(pathInput, fullPath, (err) => {
+ if (err) reject(null)
+ resolve(fullPath)
+ })
+ })
+
+ const httpResponse = await handleDownload()
+ const { ext } = await fileTypeFromFile(httpResponse.response)
+ const getPath = await handleFile(httpResponse.fullPath, ext)
+
+ return getPath
+}
+
+module.exports = { generalDownload }
diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js
index de6c66d..9361731 100644
--- a/packages/provider/src/baileys/index.js
+++ b/packages/provider/src/baileys/index.js
@@ -4,7 +4,7 @@ const pino = require('pino')
const rimraf = require('rimraf')
const mime = require('mime-types')
const { join } = require('path')
-const { existsSync, createWriteStream, readFileSync } = require('fs')
+const { createWriteStream, readFileSync } = require('fs')
const { Console } = require('console')
const {
@@ -13,13 +13,15 @@ const {
Browsers,
DisconnectReason,
} = require('@adiwajshing/baileys')
+
const {
baileyGenerateImage,
baileyCleanNumber,
baileyIsValidNumber,
- baileyDownloadMedia,
} = require('./utils')
+const { generalDownload } = require('../../common/download')
+
const logger = new Console({
stdout: createWriteStream(`${process.cwd()}/baileys.log`),
})
@@ -169,14 +171,50 @@ class BaileysProvider extends ProviderClass {
*/
sendMedia = async (number, imageUrl, text) => {
- const fileDownloaded = await baileyDownloadMedia(imageUrl)
+ const fileDownloaded = await generalDownload(imageUrl)
+ const mimeType = mime.lookup(fileDownloaded)
+
+ if (mimeType.includes('image'))
+ return this.sendImage(number, fileDownloaded, text)
+ if (mimeType.includes('video'))
+ return this.sendVideo(number, fileDownloaded, text)
+ if (mimeType.includes('audio'))
+ return this.sendAudio(number, fileDownloaded, text)
+
+ return this.sendFile(number, fileDownloaded)
+ }
+
+ /**
+ * Enviar imagen
+ * @param {*} number
+ * @param {*} imageUrl
+ * @param {*} text
+ * @returns
+ */
+ sendImage = async (number, filePath, text) => {
return this.vendor.sendMessage(number, {
- image: readFileSync(fileDownloaded),
+ image: readFileSync(filePath),
caption: text,
})
}
/**
+ * Enviar video
+ * @param {*} number
+ * @param {*} imageUrl
+ * @param {*} text
+ * @returns
+ */
+ sendVideo = async (number, filePath, text) => {
+ return this.vendor.sendMessage(number, {
+ video: readFileSync(filePath),
+ caption: text,
+ gifPlayback: true,
+ })
+ }
+
+ /**
+ * Enviar audio
* @alpha
* @param {string} number
* @param {string} message
@@ -185,8 +223,7 @@ class BaileysProvider extends ProviderClass {
*/
sendAudio = async (number, audioUrl, voiceNote = false) => {
- const numberClean = number.replace('+', '')
- await this.vendor.sendMessage(`${numberClean}@c.us`, {
+ return this.vendor.sendMessage(number, {
audio: { url: audioUrl },
ptt: voiceNote,
})
@@ -210,17 +247,13 @@ class BaileysProvider extends ProviderClass {
*/
sendFile = async (number, filePath) => {
- if (existsSync(filePath)) {
- const mimeType = mime.lookup(filePath)
- const numberClean = number.replace('+', '')
- const fileName = filePath.split('/').pop()
-
- await this.vendor.sendMessage(`${numberClean}@c.us`, {
- document: { url: filePath },
- mimetype: mimeType,
- fileName: fileName,
- })
- }
+ const mimeType = mime.lookup(filePath)
+ const fileName = filePath.split('/').pop()
+ return this.vendor.sendMessage(number, {
+ document: { url: filePath },
+ mimetype: mimeType,
+ fileName: fileName,
+ })
}
/**
diff --git a/packages/provider/src/baileys/package.json b/packages/provider/src/baileys/package.json
index da529d3..918a8e9 100644
--- a/packages/provider/src/baileys/package.json
+++ b/packages/provider/src/baileys/package.json
@@ -1,7 +1,6 @@
{
"dependencies": {
"@adiwajshing/baileys": "4.4.0",
- "mime-types": "2.1.35",
"wa-sticker-formatter": "4.3.2"
}
}
diff --git a/packages/provider/src/baileys/utils.js b/packages/provider/src/baileys/utils.js
index 433ddee..0b2a886 100644
--- a/packages/provider/src/baileys/utils.js
+++ b/packages/provider/src/baileys/utils.js
@@ -1,9 +1,6 @@
const { createWriteStream } = require('fs')
const combineImage = require('combine-image')
const qr = require('qr-image')
-const { tmpdir } = require('os')
-const http = require('http')
-const https = require('https')
const baileyCleanNumber = (number, full = false) => {
number = number.replace('@s.whatsapp.net', '')
@@ -41,38 +38,8 @@ const baileyIsValidNumber = (rawNumber) => {
return !exist
}
-/**
- * Incompleta
- * Descargar archivo multimedia para enviar
- * @param {*} url
- * @returns
- */
-const baileyDownloadMedia = (url) => {
- return new Promise((resolve, reject) => {
- const ext = url.split('.').pop()
- const checkProtocol = url.includes('https:')
- const handleHttp = checkProtocol ? https : http
- const name = `tmp-${Date.now()}.${ext}`
- const fullPath = `${tmpdir()}/${name}`
- const file = createWriteStream(fullPath)
- handleHttp.get(url, function (response) {
- response.pipe(file)
- file.on('finish', function () {
- file.close()
- resolve(fullPath)
- })
- file.on('error', function () {
- console.log('errro')
- file.close()
- reject(null)
- })
- })
- })
-}
-
module.exports = {
baileyCleanNumber,
baileyGenerateImage,
baileyIsValidNumber,
- baileyDownloadMedia,
}
diff --git a/packages/provider/src/venom/index.js b/packages/provider/src/venom/index.js
index 4b7c231..3e1b630 100644
--- a/packages/provider/src/venom/index.js
+++ b/packages/provider/src/venom/index.js
@@ -2,18 +2,20 @@ const { ProviderClass } = require('@bot-whatsapp/bot')
const venom = require('venom-bot')
const { createWriteStream } = require('fs')
const { Console } = require('console')
+const mime = require('mime-types')
const {
venomCleanNumber,
venomGenerateImage,
venomisValidNumber,
- venomDownloadMedia,
} = require('./utils')
const logger = new Console({
stdout: createWriteStream(`${process.cwd()}/venom.log`),
})
+const { generalDownload } = require('../../common/download')
+
/**
* ⚙️ VenomProvider: Es una clase tipo adaptor
* que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas)
@@ -134,6 +136,53 @@ class VenomProvider extends ProviderClass {
// return this.vendor.sendButtons(number, "Title", buttons1, "Description");
}
+ /**
+ * Enviar audio
+ * @alpha
+ * @param {string} number
+ * @param {string} message
+ * @param {boolean} voiceNote optional
+ * @example await sendMessage('+XXXXXXXXXXX', 'audio.mp3')
+ */
+
+ sendAudio = async (number, audioPath) => {
+ return this.vendor.sendVoice(number, audioPath)
+ }
+
+ /**
+ * Enviar imagen
+ * @param {*} number
+ * @param {*} imageUrl
+ * @param {*} text
+ * @returns
+ */
+ sendImage = async (number, filePath, text) => {
+ return this.vendor.sendImage(number, filePath, 'image-name', text)
+ }
+
+ /**
+ *
+ * @param {string} number
+ * @param {string} filePath
+ * @example await sendMessage('+XXXXXXXXXXX', './document/file.pdf')
+ */
+
+ sendFile = async (number, filePath, text) => {
+ const fileName = filePath.split('/').pop()
+ return this.vendor.sendFile(number, filePath, fileName, text)
+ }
+
+ /**
+ * Enviar video
+ * @param {*} number
+ * @param {*} imageUrl
+ * @param {*} text
+ * @returns
+ */
+ sendVideo = async (number, filePath, text) => {
+ return this.vendor.sendVideoAsGif(number, filePath, 'video.gif', text)
+ }
+
/**
* Enviar imagen o multimedia
* @param {*} number
@@ -141,10 +190,18 @@ class VenomProvider extends ProviderClass {
* @param {*} message
* @returns
*/
- sendMedia = async (number, mediaInput, message) => {
- if (!mediaInput) throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`)
- const fileDownloaded = await venomDownloadMedia(mediaInput)
- return this.vendor.sendImage(number, fileDownloaded, '.', message)
+ sendMedia = async (number, mediaUrl, text) => {
+ const fileDownloaded = await generalDownload(mediaUrl)
+ const mimeType = mime.lookup(fileDownloaded)
+
+ if (mimeType.includes('image'))
+ return this.sendImage(number, fileDownloaded, text)
+ if (mimeType.includes('video'))
+ return this.sendVideo(number, fileDownloaded, text)
+ if (mimeType.includes('audio'))
+ return this.sendAudio(number, fileDownloaded)
+
+ return this.sendFile(number, fileDownloaded, text)
}
/**
diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js
index f7f8bd0..693d1b9 100644
--- a/packages/provider/src/web-whatsapp/index.js
+++ b/packages/provider/src/web-whatsapp/index.js
@@ -1,10 +1,9 @@
const { Client, LocalAuth, MessageMedia, Buttons } = require('whatsapp-web.js')
const { ProviderClass } = require('@bot-whatsapp/bot')
const { Console } = require('console')
-const { createWriteStream } = require('fs')
+const { createWriteStream, readFileSync } = require('fs')
const {
wwebCleanNumber,
- wwebDownloadMedia,
wwebGenerateImage,
wwebIsValidNumber,
} = require('./utils')
@@ -13,6 +12,9 @@ const logger = new Console({
stdout: createWriteStream('./log'),
})
+const { generalDownload } = require('../../common/download')
+const mime = require('mime-types')
+
/**
* ⚙️ WebWhatsappProvider: Es una clase tipo adaptor
* que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas)
@@ -35,6 +37,7 @@ class WebWhatsappProvider extends ProviderClass {
'--disable-setuid-sandbox',
'--unhandled-rejections=strict',
],
+ //executablePath: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
},
})
@@ -103,23 +106,6 @@ 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 (!mediaInput) throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`)
- const fileDownloaded = await wwebDownloadMedia(mediaInput)
- const media = MessageMedia.fromFilePath(fileDownloaded)
- return this.vendor.sendMessage(number, media, {
- sendAudioAsVoice: true,
- })
- }
-
/**
* Enviar botones
* https://docs.wwebjs.dev/Buttons.html
@@ -170,6 +156,90 @@ class WebWhatsappProvider extends ProviderClass {
return this.vendor.sendMessage(number, message)
}
+ /**
+ * Enviar imagen
+ * @param {*} number
+ * @param {*} imageUrl
+ * @param {*} text
+ * @returns
+ */
+ sendImage = async (number, filePath) => {
+ const base64 = readFileSync(filePath, { encoding: 'base64' })
+ const mimeType = mime.lookup(filePath)
+ const media = new MessageMedia(mimeType, base64)
+ return this.vendor.sendMessage(number, media, {
+ caption: 'soy una imagen',
+ })
+ }
+
+ /**
+ * Enviar audio
+ * @param {*} number
+ * @param {*} imageUrl
+ * @param {*} text
+ * @returns
+ */
+
+ sendAudio = async (number, filePath) => {
+ const base64 = readFileSync(filePath, { encoding: 'base64' })
+ const mimeType = mime.lookup(filePath)
+ const media = new MessageMedia(mimeType, base64)
+ return this.vendor.sendMessage(number, media, {
+ caption: 'soy un audio',
+ })
+ }
+
+ /**
+ * Enviar video
+ * @param {*} number
+ * @param {*} imageUrl
+ * @param {*} text
+ * @returns
+ */
+ sendVideo = async (number, filePath) => {
+ const base64 = readFileSync(filePath, { encoding: 'base64' })
+ const mimeType = mime.lookup(filePath)
+ const media = new MessageMedia(mimeType, base64)
+ return this.vendor.sendMessage(number, media, {
+ sendMediaAsDocument: true,
+ })
+ }
+
+ /**
+ * Enviar Arhivos/pdf
+ * @param {*} number
+ * @param {*} imageUrl
+ * @param {*} text
+ * @returns
+ */
+ sendFile = async (number, filePath) => {
+ const base64 = readFileSync(filePath, { encoding: 'base64' })
+ const mimeType = mime.lookup(filePath)
+ const media = new MessageMedia(mimeType, base64)
+ return this.vendor.sendMessage(number, media)
+ }
+
+ /**
+ * Enviar imagen o multimedia
+ * @param {*} number
+ * @param {*} mediaInput
+ * @param {*} message
+ * @returns
+ */
+ sendMedia = async (number, mediaUrl, text) => {
+ const fileDownloaded = await generalDownload(mediaUrl)
+ const mimeType = mime.lookup(fileDownloaded)
+
+ if (mimeType.includes('image'))
+ return this.sendImage(number, fileDownloaded, text)
+ if (mimeType.includes('video'))
+ return this.sendVideo(number, fileDownloaded)
+ if (mimeType.includes('audio'))
+ return this.sendAudio(number, fileDownloaded)
+
+ return this.sendFile(number, fileDownloaded)
+ }
+
/**
*
* @param {*} userId
diff --git a/packages/provider/src/web-whatsapp/package.json b/packages/provider/src/web-whatsapp/package.json
index d15dbe0..2fc0278 100644
--- a/packages/provider/src/web-whatsapp/package.json
+++ b/packages/provider/src/web-whatsapp/package.json
@@ -1,5 +1,5 @@
{
"dependencies": {
- "whatsapp-web.js": "1.19.2"
+ "whatsapp-web.js": "1.19.3"
}
}
diff --git a/yarn.lock b/yarn.lock
index cf802d5..9ab59a0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1113,6 +1113,7 @@ __metadata:
fs-extra: ^11.1.0
git-cz: ^4.9.0
husky: ^8.0.2
+ mime-types: ^2.1.35
only-allow: ^1.1.1
prettier: ^2.8.0
pretty-quick: ^3.1.3
@@ -13443,7 +13444,7 @@ __metadata:
languageName: node
linkType: hard
-"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34":
+"mime-types@npm:^2.1.12, mime-types@npm:^2.1.35, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34":
version: 2.1.35
resolution: "mime-types@npm:2.1.35"
dependencies: