feat(provider): 🚀 feat Instance provider

This commit is contained in:
aurik3
2023-02-08 14:38:04 -05:00
135 changed files with 1998 additions and 2097 deletions

View File

@@ -7,18 +7,9 @@ const { join } = require('path')
const { createWriteStream, readFileSync } = require('fs')
const { Console } = require('console')
const {
default: makeWASocket,
useMultiFileAuthState,
Browsers,
DisconnectReason,
} = require('@adiwajshing/baileys')
const { default: makeWASocket, useMultiFileAuthState, Browsers, DisconnectReason } = require('@adiwajshing/baileys')
const {
baileyGenerateImage,
baileyCleanNumber,
baileyIsValidNumber,
} = require('./utils')
const { baileyGenerateImage, baileyCleanNumber, baileyIsValidNumber } = require('./utils')
const { generalDownload } = require('../../common/download')
@@ -46,9 +37,7 @@ class BaileysProvider extends ProviderClass {
*/
initBailey = async () => {
const NAME_DIR_SESSION = `${this.globalVendorArgs.name}_sessions`
const { state, saveCreds } = await useMultiFileAuthState(
NAME_DIR_SESSION
)
const { state, saveCreds } = await useMultiFileAuthState(NAME_DIR_SESSION)
this.saveCredsGlobal = saveCreds
try {
@@ -57,7 +46,7 @@ class BaileysProvider extends ProviderClass {
auth: state,
browser: Browsers.macOS('Desktop'),
syncFullHistory: false,
logger: pino({ level: 'error' }),
logger: pino({ level: 'fatal' }),
})
sock.ev.on('connection.update', async (update) => {
@@ -96,10 +85,7 @@ class BaileysProvider extends ProviderClass {
`Necesitas ayuda: https://link.codigoencasa.com/DISCORD`,
],
})
await baileyGenerateImage(
qr,
`${this.globalVendorArgs.name}.qr.png`
)
await baileyGenerateImage(qr, `${this.globalVendorArgs.name}.qr.png`)
}
})
@@ -131,9 +117,10 @@ class BaileysProvider extends ProviderClass {
const [messageCtx] = messages
let payload = {
...messageCtx,
body: messageCtx?.message?.conversation,
body: messageCtx?.message?.extendedTextMessage?.text ?? messageCtx?.message?.conversation,
from: messageCtx?.key?.remoteJid,
}
if (payload.from === 'status@broadcast') return
if (payload?.key?.fromMe) return
@@ -142,9 +129,7 @@ class BaileysProvider extends ProviderClass {
return
}
const btnCtx =
payload?.message?.buttonsResponseMessage
?.selectedDisplayText
const btnCtx = payload?.message?.buttonsResponseMessage?.selectedDisplayText
if (btnCtx) payload.body = btnCtx
@@ -168,8 +153,6 @@ class BaileysProvider extends ProviderClass {
* @example await sendMessage('+XXXXXXXXXXX', 'Hello World')
*/
sendRaw = () => this.vendor.sendMessage
/**
* @alpha
* @param {string} number
@@ -181,12 +164,9 @@ class BaileysProvider extends ProviderClass {
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)
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)
}
@@ -302,10 +282,8 @@ class BaileysProvider extends ProviderClass {
sendMessage = async (numberIn, message, { options }) => {
const number = baileyCleanNumber(numberIn)
if (options?.buttons?.length)
return this.sendButtons(number, message, options.buttons)
if (options?.media)
return this.sendMedia(number, options.media, message)
if (options?.buttons?.length) return this.sendButtons(number, message, options.buttons)
if (options?.media) return this.sendMedia(number, options.media, message)
return this.sendText(number, message)
}
@@ -340,12 +318,7 @@ class BaileysProvider extends ProviderClass {
* @example await sendContact("xxxxxxxxxxx@c.us" || "xxxxxxxxxxxxxxxxxx@g.us", "+xxxxxxxxxxx", "Robin Smith", messages)
*/
sendContact = async (
remoteJid,
contactNumber,
displayName,
messages = null
) => {
sendContact = async (remoteJid, contactNumber, displayName, messages = null) => {
const cleanContactNumber = contactNumber.replaceAll(' ', '')
const waid = cleanContactNumber.replace('+', '')

View File

@@ -56,15 +56,11 @@ class MetaProvider extends ProviderClass {
sendMessageMeta = async (body) => {
try {
const response = await axios.post(
`${URL}/${this.numberId}/messages`,
body,
{
headers: {
Authorization: `Bearer ${this.jwtToken}`,
},
}
)
const response = await axios.post(`${URL}/${this.numberId}/messages`, body, {
headers: {
Authorization: `Bearer ${this.jwtToken}`,
},
})
return response.data
} catch (error) {
return Promise.resolve(error)
@@ -106,8 +102,7 @@ class MetaProvider extends ProviderClass {
*/
sendMessage = async (number, message, { options }) => {
if (options?.buttons?.length) return console.log('Envio de botones')
if (options?.media)
return this.sendMedia(number, message, options.media)
if (options?.media) return this.sendMedia(number, message, options.media)
this.sendtext(number, message)
}

View File

@@ -81,9 +81,7 @@ class MetaWebHookServer extends EventEmitter {
* @returns
*/
buildHTTPServer = () => {
this.metaServer
.use(urlencoded({ extended: true }))
.get('/webhook', this.verifyToken)
this.metaServer.use(urlencoded({ extended: true })).get('/webhook', this.verifyToken)
this.metaServer
.use(urlencoded({ extended: true }))
@@ -99,9 +97,7 @@ class MetaWebHookServer extends EventEmitter {
this.metaServer.listen(this.metaPort, () => {
console.log(``)
console.log(`[meta]: Agregar esta url "WHEN A MESSAGE COMES IN"`)
console.log(
`[meta]: POST http://localhost:${this.metaPort}/webhook`
)
console.log(`[meta]: POST http://localhost:${this.metaPort}/webhook`)
console.log(`[meta]: Más información en la documentacion`)
console.log(``)
})

View File

@@ -86,12 +86,8 @@ class TwilioProvider extends ProviderClass {
*/
sendButtons = async () => {
console.log(``)
console.log(
`[NOTA]: Actualmente enviar botons con Twilio esta en desarrollo`
)
console.log(
`[NOTA]: https://www.twilio.com/es-mx/docs/whatsapp/buttons`
)
console.log(`[NOTA]: Actualmente enviar botons con Twilio esta en desarrollo`)
console.log(`[NOTA]: https://www.twilio.com/es-mx/docs/whatsapp/buttons`)
console.log(``)
}
@@ -104,10 +100,8 @@ class TwilioProvider extends ProviderClass {
*/
sendMessage = async (number, message, { options }) => {
number = parseNumber(number)
if (options?.buttons?.length)
this.sendButtons(number, message, options.buttons)
if (options?.media)
return this.sendMedia(number, message, options.media)
if (options?.buttons?.length) this.sendButtons(number, message, options.buttons)
if (options?.media) return this.sendMedia(number, message, options.media)
return this.vendor.messages.create({
body: message,
from: `whatsapp:+${this.vendorNumber}`,

View File

@@ -51,9 +51,7 @@ class TwilioWebHookServer extends EventEmitter {
this.twilioServer.listen(this.twilioPort, () => {
console.log(``)
console.log(`[Twilio]: Agregar esta url "WHEN A MESSAGE COMES IN"`)
console.log(
`[Twilio]: POST http://localhost:${this.twilioPort}/twilio-hook`
)
console.log(`[Twilio]: POST http://localhost:${this.twilioPort}/twilio-hook`)
console.log(`[Twilio]: Más información en la documentacion`)
console.log(``)
})

View File

@@ -4,11 +4,7 @@ const { createWriteStream } = require('fs')
const { Console } = require('console')
const mime = require('mime-types')
const {
venomCleanNumber,
venomGenerateImage,
venomisValidNumber,
} = require('./utils')
const { venomCleanNumber, venomGenerateImage, venomisValidNumber } = require('./utils')
const logger = new Console({
stdout: createWriteStream(`${process.cwd()}/venom.log`),
@@ -108,8 +104,7 @@ class VenomProvider extends ProviderClass {
const listEvents = this.busEvents()
for (const { event, func } of listEvents) {
if (this.vendor[event])
this.vendor[event]((payload) => func(payload))
if (this.vendor[event]) this.vendor[event]((payload) => func(payload))
}
}
@@ -122,16 +117,13 @@ class VenomProvider extends ProviderClass {
* @returns
*/
sendButtons = async (number, message, buttons = []) => {
const NOTE_VENOM_BUTTON = [
`Actualmente VENOM tiene problemas con la API`,
`para el envio de Botones`,
].join('\n')
const NOTE_VENOM_BUTTON = [`Actualmente VENOM tiene problemas con la API`, `para el envio de Botones`].join(
'\n'
)
console.log(`[NOTA]: ${NOTE_VENOM_BUTTON}`)
const buttonToStr = [message]
.concat(buttons.map((btn) => `${btn.body}`))
.join(`\n`)
const buttonToStr = [message].concat(buttons.map((btn) => `${btn.body}`)).join(`\n`)
return this.vendor.sendText(number, buttonToStr)
// return this.vendor.sendButtons(number, "Title", buttons1, "Description");
}
@@ -194,25 +186,13 @@ class VenomProvider extends ProviderClass {
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)
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)
}
/**
* Funcion SendRaw envia opciones directamente del proveedor
* @param {string} number
* @param {string} message
* @example await sendMessage('+XXXXXXXXXXX', 'Hello World')
*/
sendRaw = () => this.vendor.sendMessage
/**
* Enviar mensaje al usuario
* @param {*} userId
@@ -222,10 +202,8 @@ class VenomProvider extends ProviderClass {
*/
sendMessage = async (userId, message, { options }) => {
const number = venomCleanNumber(userId)
if (options?.buttons?.length)
return this.sendButtons(number, message, options.buttons)
if (options?.media)
return this.sendMedia(number, options.media, message)
if (options?.buttons?.length) return this.sendButtons(number, message, options.buttons)
if (options?.media) return this.sendMedia(number, options.media, message)
return this.vendor.sendText(number, message)
}
}

View File

@@ -2,11 +2,7 @@ const { Client, LocalAuth, MessageMedia, Buttons } = require('whatsapp-web.js')
const { ProviderClass } = require('@bot-whatsapp/bot')
const { Console } = require('console')
const { createWriteStream, readFileSync } = require('fs')
const {
wwebCleanNumber,
wwebGenerateImage,
wwebIsValidNumber,
} = require('./utils')
const { wwebCleanNumber, wwebGenerateImage, wwebIsValidNumber } = require('./utils')
const logger = new Console({
stdout: createWriteStream('./log'),
@@ -32,11 +28,7 @@ class WebWhatsappProvider extends ProviderClass {
}),
puppeteer: {
headless: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--unhandled-rejections=strict',
],
args: ['--no-sandbox', '--disable-setuid-sandbox', '--unhandled-rejections=strict'],
//executablePath: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
},
})
@@ -80,10 +72,7 @@ class WebWhatsappProvider extends ProviderClass {
`Necesitas ayuda: https://link.codigoencasa.com/DISCORD`,
],
})
await wwebGenerateImage(
qr,
`${this.globalVendorArgs.name}.qr.png`
)
await wwebGenerateImage(qr, `${this.globalVendorArgs.name}.qr.png`)
},
},
{
@@ -116,6 +105,9 @@ class WebWhatsappProvider extends ProviderClass {
* @returns
*/
sendButtons = async (number, message, buttons = []) => {
console.log(`🚩 ¿No te funciona los botones? Intenta instalar`)
console.log(`npm i github:pedroslopez/whatsapp-web.js#fix-buttons-list`)
const buttonMessage = new Buttons(message, buttons, '', '')
return this.vendor.sendMessage(number, buttonMessage)
}
@@ -163,13 +155,11 @@ class WebWhatsappProvider extends ProviderClass {
* @param {*} text
* @returns
*/
sendImage = async (number, filePath) => {
sendImage = async (number, filePath, caption) => {
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',
})
return this.vendor.sendMessage(number, media, { caption })
}
/**
@@ -180,13 +170,11 @@ class WebWhatsappProvider extends ProviderClass {
* @returns
*/
sendAudio = async (number, filePath) => {
sendAudio = async (number, filePath, caption) => {
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',
})
return this.vendor.sendMessage(number, media, { caption })
}
/**
@@ -230,12 +218,9 @@ class WebWhatsappProvider extends ProviderClass {
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)
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)
}
@@ -257,8 +242,7 @@ class WebWhatsappProvider extends ProviderClass {
*/
sendMessage = async (userId, message, { options }) => {
const number = wwebCleanNumber(userId)
if (options?.buttons?.length)
return this.sendButtons(number, message, options.buttons)
if (options?.buttons?.length) return this.sendButtons(number, message, options.buttons)
if (options?.media) return this.sendMedia(number, options.media)
return this.sendText(number, message)
}

View File

@@ -1,5 +1,5 @@
{
"dependencies": {
"whatsapp-web.js": "1.19.2"
"whatsapp-web.js": "1.19.3"
}
}