mirror of
https://github.com/cheveguerra/bot-whatsapp.git
synced 2026-04-20 20:49:15 +00:00
fix(bot): 🔥 fix rev
fix(bot): 🔥 fix rev
This commit is contained in:
@@ -8,10 +8,7 @@ class FlowClass {
|
|||||||
if (!Array.isArray(_flow)) throw new Error('Esto debe ser un ARRAY')
|
if (!Array.isArray(_flow)) throw new Error('Esto debe ser un ARRAY')
|
||||||
this.flowRaw = _flow
|
this.flowRaw = _flow
|
||||||
|
|
||||||
this.allCallbacks = _flow
|
this.getAllCb(this.flowRaw)
|
||||||
.map((cbIn) => cbIn.ctx.callbacks)
|
|
||||||
.flat(2)
|
|
||||||
.map((c, i) => ({ callback: c?.callback, index: i }))
|
|
||||||
|
|
||||||
const mergeToJsonSerialize = Object.keys(_flow)
|
const mergeToJsonSerialize = Object.keys(_flow)
|
||||||
.map((indexObjectFlow) => _flow[indexObjectFlow].toJson())
|
.map((indexObjectFlow) => _flow[indexObjectFlow].toJson())
|
||||||
@@ -20,6 +17,17 @@ class FlowClass {
|
|||||||
this.flowSerialize = toSerialize(mergeToJsonSerialize)
|
this.flowSerialize = toSerialize(mergeToJsonSerialize)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Buscar y aplanar todos los callbacks
|
||||||
|
* @param {*} inFlow
|
||||||
|
*/
|
||||||
|
getAllCb = (inFlow) => {
|
||||||
|
this.allCallbacks = inFlow
|
||||||
|
.map((cbIn) => cbIn.ctx.callbacks)
|
||||||
|
.flat(2)
|
||||||
|
.map((c, i) => ({ callback: c?.callback, index: i }))
|
||||||
|
}
|
||||||
|
|
||||||
find = (keyOrWord, symbol = false, overFlow = null) => {
|
find = (keyOrWord, symbol = false, overFlow = null) => {
|
||||||
keyOrWord = `${keyOrWord}`
|
keyOrWord = `${keyOrWord}`
|
||||||
let capture = false
|
let capture = false
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
const prompts = require('prompts')
|
const prompts = require('prompts')
|
||||||
const { yellow, red, cyan, bgMagenta } = require('kleur')
|
|
||||||
const { copyBaseApp } = require('../create-app')
|
|
||||||
const { join } = require('path')
|
const { join } = require('path')
|
||||||
|
const { yellow, red, cyan, bgMagenta } = require('kleur')
|
||||||
const { existsSync } = require('fs')
|
const { existsSync } = require('fs')
|
||||||
|
const { copyBaseApp } = require('../create-app')
|
||||||
const { checkNodeVersion, checkOs } = require('../check')
|
const { checkNodeVersion, checkOs } = require('../check')
|
||||||
|
|
||||||
const bannerDone = () => {
|
const bannerDone = () => {
|
||||||
@@ -48,9 +48,9 @@ const startInteractive = async () => {
|
|||||||
message: '¿Cuál base de datos quieres utilizar?',
|
message: '¿Cuál base de datos quieres utilizar?',
|
||||||
choices: [
|
choices: [
|
||||||
{ title: 'Memory', value: 'memory' },
|
{ title: 'Memory', value: 'memory' },
|
||||||
|
{ title: 'Json', value: 'json' },
|
||||||
{ title: 'Mongo', value: 'mongo' },
|
{ title: 'Mongo', value: 'mongo' },
|
||||||
{ title: 'MySQL', value: 'mysql' },
|
{ title: 'MySQL', value: 'mysql' },
|
||||||
{ title: 'Json', value: 'json', disabled: true },
|
|
||||||
],
|
],
|
||||||
max: 1,
|
max: 1,
|
||||||
hint: 'Espacio para seleccionar',
|
hint: 'Espacio para seleccionar',
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ const {
|
|||||||
baileyGenerateImage,
|
baileyGenerateImage,
|
||||||
baileyCleanNumber,
|
baileyCleanNumber,
|
||||||
baileyIsValidNumber,
|
baileyIsValidNumber,
|
||||||
|
baileyDownloadMedia,
|
||||||
} = require('./utils')
|
} = require('./utils')
|
||||||
|
|
||||||
const logger = new Console({
|
const logger = new Console({
|
||||||
@@ -39,12 +40,43 @@ class BaileysProvider extends ProviderClass {
|
|||||||
initBailey = async () => {
|
initBailey = async () => {
|
||||||
const { state, saveCreds } = await useMultiFileAuthState('sessions')
|
const { state, saveCreds } = await useMultiFileAuthState('sessions')
|
||||||
this.saveCredsGlobal = saveCreds
|
this.saveCredsGlobal = saveCreds
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this.vendor = makeWASocket({
|
const sock = makeWASocket({
|
||||||
printQRInTerminal: false,
|
printQRInTerminal: false,
|
||||||
auth: state,
|
auth: state,
|
||||||
logger: pino({ level: 'error' }),
|
logger: pino({ level: 'error' }),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
sock.ev.on('connection.update', async (update) => {
|
||||||
|
const { connection, lastDisconnect, qr } = update
|
||||||
|
|
||||||
|
if (connection === 'close') {
|
||||||
|
const shouldReconnect =
|
||||||
|
lastDisconnect?.error?.output?.statusCode !==
|
||||||
|
DisconnectReason.loggedOut
|
||||||
|
|
||||||
|
if (shouldReconnect) {
|
||||||
|
await saveCreds()
|
||||||
|
this.initBailey()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qr) {
|
||||||
|
this.emit('require_action', {
|
||||||
|
instructions: [
|
||||||
|
`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`,
|
||||||
|
],
|
||||||
|
})
|
||||||
|
await baileyGenerateImage(qr)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (connection === 'open') this.emit('ready', true)
|
||||||
|
})
|
||||||
|
|
||||||
|
this.vendor = sock
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger.log(e)
|
logger.log(e)
|
||||||
this.emit('auth_failure', [
|
this.emit('auth_failure', [
|
||||||
@@ -64,25 +96,9 @@ class BaileysProvider extends ProviderClass {
|
|||||||
*/
|
*/
|
||||||
busEvents = () => [
|
busEvents = () => [
|
||||||
{
|
{
|
||||||
event: 'connection.update',
|
event: 'creds.update',
|
||||||
func: async ({ qr, connection, lastDisconnect }) => {
|
func: async () => {
|
||||||
const statusCode = lastDisconnect?.error?.output?.statusCode
|
await this.saveCredsGlobal()
|
||||||
|
|
||||||
if (statusCode && statusCode !== DisconnectReason.loggedOut)
|
|
||||||
this.initBailey()
|
|
||||||
|
|
||||||
if (qr) {
|
|
||||||
this.emit('require_action', {
|
|
||||||
instructions: [
|
|
||||||
`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`,
|
|
||||||
],
|
|
||||||
})
|
|
||||||
await baileyGenerateImage(qr)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (connection === 'open') this.emit('ready', true)
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -95,13 +111,20 @@ class BaileysProvider extends ProviderClass {
|
|||||||
body: messageCtx?.message?.conversation,
|
body: messageCtx?.message?.conversation,
|
||||||
from: messageCtx?.key?.remoteJid,
|
from: messageCtx?.key?.remoteJid,
|
||||||
}
|
}
|
||||||
if (payload.from === 'status@broadcast') {
|
if (payload.from === 'status@broadcast') return
|
||||||
return
|
|
||||||
}
|
if (payload?.key?.fromMe) return
|
||||||
|
|
||||||
if (!baileyIsValidNumber(payload.from)) {
|
if (!baileyIsValidNumber(payload.from)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const btnCtx =
|
||||||
|
payload?.message?.templateButtonReplyMessage
|
||||||
|
?.selectedDisplayText
|
||||||
|
|
||||||
|
if (btnCtx) payload.body = btnCtx
|
||||||
|
|
||||||
payload.from = baileyCleanNumber(payload.from, true)
|
payload.from = baileyCleanNumber(payload.from, true)
|
||||||
this.emit('message', payload)
|
this.emit('message', payload)
|
||||||
},
|
},
|
||||||
@@ -124,8 +147,9 @@ class BaileysProvider extends ProviderClass {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
sendMedia = async (number, imageUrl, text) => {
|
sendMedia = async (number, imageUrl, text) => {
|
||||||
await this.vendor.sendMessage(number, {
|
const fileDownloaded = await baileyDownloadMedia(imageUrl)
|
||||||
image: { url: imageUrl },
|
return this.vendor.sendMessage(number, {
|
||||||
|
image: { url: fileDownloaded },
|
||||||
text,
|
text,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -186,17 +210,21 @@ class BaileysProvider extends ProviderClass {
|
|||||||
* @example await sendMessage("+XXXXXXXXXXX", "Your Text", "Your Footer", [{"buttonId": "id", "buttonText": {"displayText": "Button"}, "type": 1}])
|
* @example await sendMessage("+XXXXXXXXXXX", "Your Text", "Your Footer", [{"buttonId": "id", "buttonText": {"displayText": "Button"}, "type": 1}])
|
||||||
*/
|
*/
|
||||||
|
|
||||||
sendButtons = async (number, text, footer, buttons) => {
|
sendButtons = async (number, text, buttons) => {
|
||||||
const numberClean = number.replace('+', '')
|
const numberClean = number.replace('+', '')
|
||||||
|
const templateButtons = buttons.map((btn, i) => ({
|
||||||
|
index: `${i}`,
|
||||||
|
quickReplyButton: {
|
||||||
|
displayText: btn.body,
|
||||||
|
id: `id-btn-${i}`,
|
||||||
|
},
|
||||||
|
}))
|
||||||
|
|
||||||
const buttonMessage = {
|
return this.vendor.sendMessage(`${numberClean}@c.us`, {
|
||||||
text: text,
|
text,
|
||||||
footer: footer,
|
footer: '',
|
||||||
buttons: buttons,
|
templateButtons: templateButtons,
|
||||||
headerType: 1,
|
})
|
||||||
}
|
|
||||||
|
|
||||||
await this.vendor.sendMessage(`${numberClean}@c.us`, buttonMessage)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -209,8 +237,8 @@ class BaileysProvider extends ProviderClass {
|
|||||||
sendMessage = async (numberIn, message, { options }) => {
|
sendMessage = async (numberIn, message, { options }) => {
|
||||||
const number = baileyCleanNumber(numberIn)
|
const number = baileyCleanNumber(numberIn)
|
||||||
|
|
||||||
// if (options?.buttons?.length)
|
if (options?.buttons?.length)
|
||||||
// return this.sendButtons(number, message, options.buttons)
|
return this.sendButtons(number, message, options.buttons)
|
||||||
if (options?.media)
|
if (options?.media)
|
||||||
return this.sendMedia(number, options.media, message)
|
return this.sendMedia(number, options.media, message)
|
||||||
return this.sendText(number, message)
|
return this.sendText(number, message)
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
const { createWriteStream } = require('fs')
|
const { createWriteStream } = require('fs')
|
||||||
const combineImage = require('combine-image')
|
const combineImage = require('combine-image')
|
||||||
const qr = require('qr-image')
|
const qr = require('qr-image')
|
||||||
|
const { tmpdir } = require('os')
|
||||||
|
const http = require('http')
|
||||||
|
const https = require('https')
|
||||||
|
|
||||||
const baileyCleanNumber = (number, full = false) => {
|
const baileyCleanNumber = (number, full = false) => {
|
||||||
number = number.replace('@s.whatsapp.net', '')
|
number = number.replace('@s.whatsapp.net', '')
|
||||||
@@ -38,4 +41,38 @@ const baileyIsValidNumber = (rawNumber) => {
|
|||||||
return !exist
|
return !exist
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { baileyCleanNumber, baileyGenerateImage, baileyIsValidNumber }
|
/**
|
||||||
|
* 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,
|
||||||
|
}
|
||||||
|
|||||||
@@ -105,6 +105,29 @@ class VenomProvider extends ProviderClass {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enviar botones
|
||||||
|
* @private
|
||||||
|
* @param {*} number
|
||||||
|
* @param {*} message
|
||||||
|
* @param {*} buttons []
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
sendButtons = async (number, message, buttons = []) => {
|
||||||
|
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`)
|
||||||
|
return this.vendor.sendText(number, buttonToStr)
|
||||||
|
// return this.vendor.sendButtons(number, "Title", buttons1, "Description");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enviar imagen o multimedia
|
* Enviar imagen o multimedia
|
||||||
* @param {*} number
|
* @param {*} number
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"whatsapp-web.js": "^1.18.3",
|
"whatsapp-web.js": "^1.18.4",
|
||||||
"@bot-whatsapp/bot": "latest",
|
"@bot-whatsapp/bot": "latest",
|
||||||
"@bot-whatsapp/cli": "latest",
|
"@bot-whatsapp/cli": "latest",
|
||||||
"@bot-whatsapp/database": "latest",
|
"@bot-whatsapp/database": "latest",
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"whatsapp-web.js": "^1.18.3",
|
"whatsapp-web.js": "^1.18.4",
|
||||||
"@bot-whatsapp/bot": "latest",
|
"@bot-whatsapp/bot": "latest",
|
||||||
"@bot-whatsapp/cli": "latest",
|
"@bot-whatsapp/cli": "latest",
|
||||||
"@bot-whatsapp/database": "latest",
|
"@bot-whatsapp/database": "latest",
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"whatsapp-web.js": "^1.18.3",
|
"whatsapp-web.js": "^1.18.4",
|
||||||
"@bot-whatsapp/bot": "latest",
|
"@bot-whatsapp/bot": "latest",
|
||||||
"@bot-whatsapp/cli": "latest",
|
"@bot-whatsapp/cli": "latest",
|
||||||
"@bot-whatsapp/database": "latest",
|
"@bot-whatsapp/database": "latest",
|
||||||
|
|||||||
Reference in New Issue
Block a user