fix(adapter): 🚀 venom update - cli - qr iamge

fix(adapter): 🚀 venom update - cli - qr iamge
This commit is contained in:
Leifer Mendez
2022-12-14 13:39:00 +01:00
committed by GitHub
8 changed files with 860 additions and 54 deletions

View File

@@ -34,6 +34,7 @@ const startInteractive = async () => {
choices: [
{ title: 'whatsapp-web.js (gratis)', value: 'wweb' },
{ title: 'Twilio', value: 'twilio' },
{ title: 'Venom (gratis)', value: 'venom' },
{ title: 'Baileys (gratis)', value: 'bailey', disabled: true },
{ title: 'API Oficial (Meta)', value: 'meta', disabled: true },
],

View File

@@ -1,49 +1,112 @@
const { ProviderClass } = require('@bot-whatsapp/bot')
const venom = require('venom-bot')
const { cleanNumber } = require('./utils/utils')
const {
venomCleanNumber,
venomGenerateImage,
venomisValidNumber,
} = require('./utils/utils')
/**
* ⚙️ VenomProvider: Es una clase tipo adaptor
* que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas)
* https://github.com/orkestral/venom
*/
class VenomProvider extends ProviderClass {
vendor
constructor() {
super()
this.vendor
venom
.create(
{
session: 'session-1', //nombre de la sesion o id
multidevice: true,
},
(base64Qrimg) => this.generateQr(base64Qrimg)
)
.then((client) => {
this.vendor = client
this.start()
})
.catch((erro) => {
console.log(erro)
})
this.init().then(() => this.initBusEvents())
}
generateQr = () => {
/**
* Iniciamos el Proveedor Venom
*/
init = async () => {
try {
const client = await venom.create(
{
session: 'session-base',
multidevice: true,
},
(base) => this.generateQr(base),
undefined,
{ logQR: false }
)
this.vendor = client
} catch (e) {
this.emit('auth_failure', {
instructions: [
`Ocurrio un error con la inicializacion de venom`,
`Necesitas ayuda: https://link.codigoencasa.com/DISCORD`,
`(Puedes abrir un ISSUE) https://github.com/leifermendez/bot-whatsapp/issues/new/choose`,
``,
`${e?.message}`,
],
})
}
}
/**
* Generamos QR Code pra escanear con el Whatsapp
*/
generateQr = (qr) => {
console.clear()
this.emit('require_action', {
instructions: [
`Debes escanear el QR Code para iniciar session reivsa qr.svg`,
`Debes escanear el QR Code para iniciar session reivsa qr.png`,
`Recuerda que el QR se actualiza cada minuto `,
`Necesitas ayuda: https://link.codigoencasa.com/DISCORD`,
],
})
//generateImage(qr)
venomGenerateImage(qr)
}
start = () => {
this.vendor.onMessage((payload) => {
payload.from = cleanNumber(payload.from, true)
this.emit('message', payload)
})
/**
* Mapeamos los eventos nativos de https://docs.orkestral.io/venom/#/?id=events
* para tener un standar de eventos
* @returns
*/
busEvents = () => [
{
event: 'onMessage',
func: (payload) => {
if (payload.from === 'status@broadcast') {
return
}
if (!venomisValidNumber(payload.from)) {
return
}
payload.from = venomCleanNumber(payload.from, true)
this.emit('message', payload)
},
},
]
/**
* Iniciamos y mapeamos el BusEvent
* Ejemplo:
* this.vendor.onMessage() 👉 this.vendor["onMessage"]()
*/
initBusEvents = () => {
const listEvents = this.busEvents()
for (const { event, func } of listEvents) {
if (this.vendor[event])
this.vendor[event]((payload) => func(payload))
}
}
/**
* Enviar mensaje al usuario
* @param {*} userId
* @param {*} message
* @param {*} param2
* @returns
*/
sendMessage = async (userId, message, { options }) => {
console.log('entramos')
const number = cleanNumber(userId)
const number = venomCleanNumber(userId)
if (options?.buttons?.length)
return this.sendButtons(number, message, options.buttons)
if (options?.media) return this.sendMedia(number, options.media)

View File

@@ -1,15 +1,36 @@
const qr = require('qr-image')
const { createWriteStream } = require('fs')
const { writeFile } = require('fs')
const cleanNumber = (number, full = false) => {
const venomCleanNumber = (number, full = false) => {
number = number.replace('@c.us', '')
number = !full ? `${number}@c.us` : `${number}`
return number
}
const generateImage = (base64) => {
let qr_svg = qr.image(base64, { type: 'svg', margin: 4 })
qr_svg.pipe(createWriteStream(`${process.cwd()}/qr.svg`))
const venomGenerateImage = (base) => {
const matches = base.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/)
if (matches.length !== 3) {
return new Error('Invalid input string')
}
let response = {}
response.type = matches[1]
response.data = new Buffer.from(matches[2], 'base64')
var imageBuffer = response
writeFile(
`${process.cwd()}/qr.png`,
imageBuffer['data'],
'binary',
(err) => {
if (err != null) throw new Error('ERROR_QR_GENERATE')
return
}
)
}
module.exports = { cleanNumber, generateImage }
const venomisValidNumber = (rawNumber) => {
const regexGroup = /\@g.us\b/gm
const exist = rawNumber.match(regexGroup)
return !exist
}
module.exports = { venomCleanNumber, venomGenerateImage, venomisValidNumber }

View File

@@ -60,7 +60,7 @@ class WebWhatsappProvider extends ProviderClass {
func: (qr) => {
this.emit('require_action', {
instructions: [
`Debes escanear el QR Code para iniciar session reivsa qr.svg`,
`Debes escanear el QR Code para iniciar session reivsa qr.png`,
`Recuerda que el QR se actualiza cada minuto `,
`Necesitas ayuda: https://link.codigoencasa.com/DISCORD`,
],

View File

@@ -11,7 +11,7 @@ const cleanNumber = (number, full = false) => {
}
const generateImage = (base64) => {
let qr_svg = qr.image(base64, { type: 'svg', margin: 4 })
let qr_svg = qr.image(base64, { type: 'png', margin: 4 })
qr_svg.pipe(createWriteStream(`${process.cwd()}/qr.svg`))
}

View File

@@ -4,7 +4,7 @@
"description": "",
"main": "app.js",
"scripts": {
"pre-copy": "cd .. && yarn run copy.lib base-venom-mysql",
"pre-copy": "cd .. && yarn run copy.lib base-venom-memory",
"start": "node app.js"
},
"keywords": [],

View File

@@ -4,7 +4,7 @@
"description": "",
"main": "app.js",
"scripts": {
"pre-copy": "cd .. && yarn run copy.lib base-venom-mysql",
"pre-copy": "cd .. && yarn run copy.lib base-venom-mongo",
"start": "node app.js"
},
"keywords": [],

753
yarn.lock

File diff suppressed because it is too large Load Diff