diff --git a/.github/workflows/check-providers.yml b/.github/workflows/check-providers.yml new file mode 100644 index 0000000..412fdfc --- /dev/null +++ b/.github/workflows/check-providers.yml @@ -0,0 +1,48 @@ +name: Rev Providers + +on: + push: + branches: + - dev + pull_request: + branches: + - dev + +jobs: + check-npm: + name: Install Dependencies + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: 16.x + cache: 'yarn' + registry-url: https://registry.npmjs.org/ + + - run: corepack enable + + - name: Install NPM Dependencies + run: yarn install --immutable --network-timeout 300000 + + - name: Check Baileys + run: yarn node ./scripts/checker.js baileys + + - name: Check Venom + run: yarn node ./scripts/checker.js venom + + - name: Check web-whatsapp + run: yarn node ./scripts/checker.js web-whatsapp + + - name: Check Meta + run: yarn node ./scripts/checker.js meta + + - name: Check Twilio + run: yarn node ./scripts/checker.js twilio + + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: 'ci(providers): updated versions providers' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f3c2553..82f5ff0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: 馃お Build and Test +name: Build and Test on: push: diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml index a302035..5a6d3ef 100644 --- a/.github/workflows/contributors.yml +++ b/.github/workflows/contributors.yml @@ -1,4 +1,4 @@ -name: 馃檶 Revisando Colaboradores +name: Revisando Colaboradores on: pull_request: branches: diff --git a/README.md b/README.md index e0f6488..100c869 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,12 @@ [![BotWhatsapp Releases(Prod)](https://github.com/codigoencasa/bot-whatsapp/actions/workflows/releases.yml/badge.svg)](https://github.com/codigoencasa/bot-whatsapp/actions/workflows/releases.yml) - -
+

+ +

-**Con esta librer铆a, puedes construir flujos automatizados de conversaci贸n de manera agn贸stica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada,聽y hacer un seguimiento de las interacciones con los clientes.聽 Adem谩s, puedes configurar f谩cilmente disparadores que te ayudaran a expandir las funcionalidades sin l铆mites. +**Con esta librer铆a, puedes construir flujos automatizados de conversaci贸n de manera agn贸stica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada,聽y hacer un seguimiento de las interacciones con los clientes.聽 Adem谩s, puedes configurar f谩cilmente disparadores que te ayudaran a expandir las funcionalidades sin l铆mites. **[Ver m谩s informacion](https://bot-whatsapp.netlify.app/)** ## Comenzar @@ -25,12 +26,13 @@ Entiende m谩s a fondo sus funcionalidades explicadas en nuestra documentaci贸n. ## Recursos - [馃搫 Documentaci贸n](https://bot-whatsapp.netlify.app/) - [馃殌 Roadmap](https://github.com/orgs/codigoencasa/projects/1) -- [馃捇 Discord](https://link.codigoencasa.com/DISCORD) -- [馃憣 Twitter](https://twitter.com/leifermendez) -- [馃帴 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) +- [馃捇 Discord](https://link.codigoencasa.com/DISCORD) +- [馃憣 Twitter](https://twitter.com/leifermendez) +- [馃帴 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) ## Comunidad + diff --git a/packages/cli/interactive/index.js b/packages/cli/interactive/index.js index 89ee601..a0a4034 100644 --- a/packages/cli/interactive/index.js +++ b/packages/cli/interactive/index.js @@ -34,7 +34,7 @@ const startInteractive = async () => { choices: [ { title: 'whatsapp-web.js (gratis)', value: 'wweb' }, { title: 'Venom (gratis)', value: 'venom' }, - { title: 'Baileys (gratis)', value: 'bailey' }, + { title: 'Baileys (gratis)', value: 'baileys' }, { title: 'Twilio', value: 'twilio' }, { title: 'API Oficial (Meta)', value: 'meta' }, ], diff --git a/packages/docs/src/routes/docs/install/index.mdx b/packages/docs/src/routes/docs/install/index.mdx index cf23f33..c83e867 100644 --- a/packages/docs/src/routes/docs/install/index.mdx +++ b/packages/docs/src/routes/docs/install/index.mdx @@ -7,10 +7,13 @@ A continuaci贸n se describen los puntos t茅cnicos que debes de tener en cuenta a - Node v16 o superior **[descargar node](https://nodejs.org/es/download/)** ## 驴Como instalar Node en Windows? + https://youtu.be/xRXHQlqA3Ak?t=376 ## 驴Como instalar Node en Ubuntu? + Te comparto un recurso de **[Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04-es)** donde explica como instalar node en Ubuntu. + ## 驴Como saber que tengo el Node? Solo debes ejecutar el siguiente comando y esperar que la versi贸n que te arroja sea superior a v16 diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index 0ecd18c..90d63a7 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -1,13 +1,16 @@ const { ProviderClass } = require('@bot-whatsapp/bot') const { Sticker } = require('wa-sticker-formatter') const pino = require('pino') +const rimraf = require('rimraf') const mime = require('mime-types') +const { join } = require('path') const { existsSync, createWriteStream } = require('fs') const { Console } = require('console') const { default: makeWASocket, useMultiFileAuthState, + Browsers, DisconnectReason, } = require('@adiwajshing/baileys') const { @@ -21,6 +24,9 @@ const logger = new Console({ stdout: createWriteStream(`${process.cwd()}/baileys.log`), }) +const NAME_DIR_SESSION = `sessions` +const PATH_BASE = join(process.cwd(), NAME_DIR_SESSION) + /** * 鈿欙笍 BaileysProvider: Es una clase tipo adaptor * que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas) @@ -38,28 +44,35 @@ class BaileysProvider extends ProviderClass { * Iniciar todo Bailey */ initBailey = async () => { - const { state, saveCreds } = await useMultiFileAuthState('sessions') + const { state, saveCreds } = await useMultiFileAuthState( + NAME_DIR_SESSION + ) this.saveCredsGlobal = saveCreds try { const sock = makeWASocket({ printQRInTerminal: false, auth: state, + browser: Browsers.macOS('Desktop'), + syncFullHistory: false, 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 + const statusCode = lastDisconnect?.error?.output?.statusCode - if (shouldReconnect) { - await saveCreds() - this.initBailey() - } + if (statusCode === DisconnectReason.loggedOut) { + rimraf(PATH_BASE, (err) => { + if (err) return + }) + + this.initBailey() + } + + if (statusCode && statusCode !== DisconnectReason.loggedOut) { + this.initBailey() } if (qr) { diff --git a/packages/provider/src/baileys/package.json b/packages/provider/src/baileys/package.json new file mode 100644 index 0000000..4326d59 --- /dev/null +++ b/packages/provider/src/baileys/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "@adiwajshing/baileys": "5.0.0", + "mime-types": "2.1.35", + "wa-sticker-formatter": "4.3.2" + } +} diff --git a/packages/provider/src/meta/package.json b/packages/provider/src/meta/package.json new file mode 100644 index 0000000..92a4250 --- /dev/null +++ b/packages/provider/src/meta/package.json @@ -0,0 +1,3 @@ +{ + "dependencies": {} +} diff --git a/packages/provider/src/twilio/package.json b/packages/provider/src/twilio/package.json new file mode 100644 index 0000000..dd0a9bf --- /dev/null +++ b/packages/provider/src/twilio/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "twilio": "3.84.0" + } +} diff --git a/packages/provider/src/venom/package.json b/packages/provider/src/venom/package.json new file mode 100644 index 0000000..6735c52 --- /dev/null +++ b/packages/provider/src/venom/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "venom-bot": "4.3.7", + "mime-types": "2.1.35" + } +} diff --git a/packages/provider/src/web-whatsapp/package.json b/packages/provider/src/web-whatsapp/package.json new file mode 100644 index 0000000..7514818 --- /dev/null +++ b/packages/provider/src/web-whatsapp/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "whatsapp-web.js": "1.18.4" + } +} diff --git a/scripts/checker.js b/scripts/checker.js new file mode 100644 index 0000000..26f3e41 --- /dev/null +++ b/scripts/checker.js @@ -0,0 +1,131 @@ +const { execFile } = require('node:child_process') +const { readFileSync, writeFileSync, readdirSync } = require('node:fs') +const { join } = require('path') +const process = require('node:process') +const util = require('node:util') +const semver = require('semver') + +const cmd = util.promisify(execFile) +const OS_ENVIROMENT_WIN = process.platform.includes('win32') + +const PATH_PACKAGES = join(__dirname, '..', `packages`) +const PATH_STARTERS = join(__dirname, '..', `starters`, `apps`) +const NPM_COMMAND = OS_ENVIROMENT_WIN ? 'npm.cmd' : 'npm' +const [PKG_NAME] = process.argv.slice(2) || [null] + +/** + * Revisar ultima version de una paquetes + * @param {*} pkgName + */ +const checkPkg = async (pkgName = '') => { + const { stdout } = await cmd( + NPM_COMMAND, + ['show', `${pkgName}`, 'version'], + { + stdio: 'inherit', + } + ) + + return stdout.trim().replace('\n', '') +} + +/** + * Revisar todas las dependencias del provider + * @param {*} provider + * @returns + */ +const checkEveryProvider = async (provider = '') => { + const pkgDependencies = readFileSync( + join(PATH_PACKAGES, 'provider', 'src', provider, 'package.json') + ) + try { + const { dependencies } = JSON.parse(pkgDependencies) + const devParse = Object.entries(dependencies) + const newDevParse = {} + for (const [pkgName] of devParse) { + const lastVersion = await checkPkg(pkgName) + newDevParse[pkgName] = lastVersion + } + return newDevParse + } catch (e) { + console.log(e) + return {} + } +} + +/** + * Actualizar depedencias con nuevas versiones + * @param {*} provider + * @param {*} list + * @returns + */ +const updateDependencies = async (provider = '', list = {}) => { + const pathProvider = join( + PATH_PACKAGES, + 'provider', + 'src', + provider, + 'package.json' + ) + + try { + const pkgDependencies = readFileSync(pathProvider) + const { dependencies } = JSON.parse(pkgDependencies) + writeFileSync( + pathProvider, + JSON.stringify( + { dependencies: { ...dependencies, ...list } }, + null, + 2 + ) + ) + } catch (e) { + console.log(e) + return {} + } +} + +/** + * Actualizar starters + * @param {*} provider + * @returns + */ +const updateStarters = async (provider = '', updateDev = {}) => { + provider = provider === 'web-whatsapp' ? 'wweb' : provider + const allStarters = readdirSync(PATH_STARTERS).filter((n) => + n.includes(provider) + ) + + try { + for (const base of allStarters) { + const pkgDependenciesBase = readFileSync( + join(PATH_STARTERS, base, 'package.json') + ) + const pkgBase = JSON.parse(pkgDependenciesBase) + writeFileSync( + join(PATH_STARTERS, base, 'package.json'), + JSON.stringify( + { + ...pkgBase, + dependencies: { ...pkgBase.dependencies, ...updateDev }, + }, + null, + 2 + ) + ) + } + } catch (e) { + console.log(e) + return + } +} + +const main = async () => { + if (PKG_NAME) { + const list = await checkEveryProvider(PKG_NAME) + await updateDependencies(PKG_NAME, list) + await updateStarters(PKG_NAME, list) + } +} + +main() diff --git a/starters/apps/base-bailey-memory/README.md b/starters/apps/base-baileys-memory/README.md similarity index 100% rename from starters/apps/base-bailey-memory/README.md rename to starters/apps/base-baileys-memory/README.md diff --git a/starters/apps/base-bailey-memory/app.js b/starters/apps/base-baileys-memory/app.js similarity index 100% rename from starters/apps/base-bailey-memory/app.js rename to starters/apps/base-baileys-memory/app.js diff --git a/starters/apps/base-bailey-memory/package.json b/starters/apps/base-baileys-memory/package.json similarity index 69% rename from starters/apps/base-bailey-memory/package.json rename to starters/apps/base-baileys-memory/package.json index 9d9bb38..e27fef1 100644 --- a/starters/apps/base-bailey-memory/package.json +++ b/starters/apps/base-baileys-memory/package.json @@ -4,7 +4,7 @@ "description": "", "main": "app.js", "scripts": { - "pre-copy": "cd .. && yarn run copy.lib base-bailey-memory", + "pre-copy": "cd .. && yarn run copy.lib base-baileys-memory", "start": "node app.js" }, "keywords": [], @@ -13,9 +13,9 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "@adiwajshing/baileys": "^4.4.0", - "mime-types": "^2.1.35", - "wa-sticker-formatter": "^4.3.2" + "@adiwajshing/baileys": "5.0.0", + "mime-types": "2.1.35", + "wa-sticker-formatter": "4.3.2" }, "author": "", "license": "ISC" diff --git a/starters/apps/base-bailey-mongo/README.md b/starters/apps/base-baileys-mongo/README.md similarity index 100% rename from starters/apps/base-bailey-mongo/README.md rename to starters/apps/base-baileys-mongo/README.md diff --git a/starters/apps/base-bailey-mongo/app.js b/starters/apps/base-baileys-mongo/app.js similarity index 100% rename from starters/apps/base-bailey-mongo/app.js rename to starters/apps/base-baileys-mongo/app.js diff --git a/starters/apps/base-bailey-mongo/package.json b/starters/apps/base-baileys-mongo/package.json similarity index 71% rename from starters/apps/base-bailey-mongo/package.json rename to starters/apps/base-baileys-mongo/package.json index d154742..2b4e0f7 100644 --- a/starters/apps/base-bailey-mongo/package.json +++ b/starters/apps/base-baileys-mongo/package.json @@ -4,7 +4,7 @@ "description": "", "main": "app.js", "scripts": { - "pre-copy": "cd .. && yarn run copy.lib base-bailey-mongo", + "pre-copy": "cd .. && yarn run copy.lib base-baileys-mongo", "start": "node app.js" }, "keywords": [], @@ -13,10 +13,10 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "@adiwajshing/baileys": "^4.4.0", - "mime-types": "^2.1.35", + "@adiwajshing/baileys": "5.0.0", + "mime-types": "2.1.35", "mongodb": "^4.12.1", - "wa-sticker-formatter": "^4.3.2" + "wa-sticker-formatter": "4.3.2" }, "author": "", "license": "ISC" diff --git a/starters/apps/base-bailey-mysql/README.md b/starters/apps/base-baileys-mysql/README.md similarity index 100% rename from starters/apps/base-bailey-mysql/README.md rename to starters/apps/base-baileys-mysql/README.md diff --git a/starters/apps/base-bailey-mysql/app.js b/starters/apps/base-baileys-mysql/app.js similarity index 100% rename from starters/apps/base-bailey-mysql/app.js rename to starters/apps/base-baileys-mysql/app.js diff --git a/starters/apps/base-bailey-mysql/package.json b/starters/apps/base-baileys-mysql/package.json similarity index 71% rename from starters/apps/base-bailey-mysql/package.json rename to starters/apps/base-baileys-mysql/package.json index 337ea1a..2d1684f 100644 --- a/starters/apps/base-bailey-mysql/package.json +++ b/starters/apps/base-baileys-mysql/package.json @@ -4,7 +4,7 @@ "description": "", "main": "app.js", "scripts": { - "pre-copy": "cd .. && yarn run copy.lib base-bailey-mysql", + "pre-copy": "cd .. && yarn run copy.lib base-baileys-mysql", "start": "node app.js" }, "keywords": [], @@ -13,10 +13,10 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "@adiwajshing/baileys": "^4.4.0", - "mime-types": "^2.1.35", + "@adiwajshing/baileys": "5.0.0", + "mime-types": "2.1.35", "mysql2": "^2.3.3", - "wa-sticker-formatter": "^4.3.2" + "wa-sticker-formatter": "4.3.2" }, "author": "", "license": "ISC" diff --git a/starters/apps/base-twilio-memory/package.json b/starters/apps/base-twilio-memory/package.json index 572ca88..e71ca5a 100644 --- a/starters/apps/base-twilio-memory/package.json +++ b/starters/apps/base-twilio-memory/package.json @@ -11,7 +11,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "^3.83.4", + "twilio": "3.84.0", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-twilio-mongo/package.json b/starters/apps/base-twilio-mongo/package.json index c8ead10..4a8c063 100644 --- a/starters/apps/base-twilio-mongo/package.json +++ b/starters/apps/base-twilio-mongo/package.json @@ -11,7 +11,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "^3.83.4", + "twilio": "3.84.0", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-twilio-mysql/package.json b/starters/apps/base-twilio-mysql/package.json index 1f5e5d0..d4c4d37 100644 --- a/starters/apps/base-twilio-mysql/package.json +++ b/starters/apps/base-twilio-mysql/package.json @@ -11,7 +11,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "^3.83.4", + "twilio": "3.84.0", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-venom-memory/package.json b/starters/apps/base-venom-memory/package.json index c72298a..dfe5408 100644 --- a/starters/apps/base-venom-memory/package.json +++ b/starters/apps/base-venom-memory/package.json @@ -9,11 +9,12 @@ }, "keywords": [], "dependencies": { - "venom-bot": "^4.3.7", + "venom-bot": "4.3.7", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", - "@bot-whatsapp/provider": "latest" + "@bot-whatsapp/provider": "latest", + "mime-types": "2.1.35" }, "author": "", "license": "ISC" diff --git a/starters/apps/base-venom-mongo/package.json b/starters/apps/base-venom-mongo/package.json index 6586c9f..3b46613 100644 --- a/starters/apps/base-venom-mongo/package.json +++ b/starters/apps/base-venom-mongo/package.json @@ -9,12 +9,12 @@ }, "keywords": [], "dependencies": { - "venom-bot": "^4.3.7", + "venom-bot": "4.3.7", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "mime-types": "^2.1.35", + "mime-types": "2.1.35", "mongodb": "^4.12.1" }, "author": "", diff --git a/starters/apps/base-venom-mysql/package.json b/starters/apps/base-venom-mysql/package.json index c549d12..670fd00 100644 --- a/starters/apps/base-venom-mysql/package.json +++ b/starters/apps/base-venom-mysql/package.json @@ -9,12 +9,13 @@ }, "keywords": [], "dependencies": { - "venom-bot": "^4.3.7", + "venom-bot": "4.3.7", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "mysql2": "^2.3.3" + "mysql2": "^2.3.3", + "mime-types": "2.1.35" }, "author": "", "license": "ISC" diff --git a/starters/apps/base-wweb-memory/package.json b/starters/apps/base-wweb-memory/package.json index 0168dff..fbf9400 100644 --- a/starters/apps/base-wweb-memory/package.json +++ b/starters/apps/base-wweb-memory/package.json @@ -9,11 +9,11 @@ }, "keywords": [], "dependencies": { - "whatsapp-web.js": "^1.18.4", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", - "@bot-whatsapp/provider": "latest" + "@bot-whatsapp/provider": "latest", + "whatsapp-web.js": "1.18.4" }, "author": "", "license": "ISC" diff --git a/starters/apps/base-wweb-mongo/package.json b/starters/apps/base-wweb-mongo/package.json index ea6aae1..c58767a 100644 --- a/starters/apps/base-wweb-mongo/package.json +++ b/starters/apps/base-wweb-mongo/package.json @@ -9,7 +9,7 @@ }, "keywords": [], "dependencies": { - "whatsapp-web.js": "^1.18.4", + "whatsapp-web.js": "1.18.4", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-wweb-mysql/package.json b/starters/apps/base-wweb-mysql/package.json index b09f470..b1c44ff 100644 --- a/starters/apps/base-wweb-mysql/package.json +++ b/starters/apps/base-wweb-mysql/package.json @@ -9,7 +9,7 @@ }, "keywords": [], "dependencies": { - "whatsapp-web.js": "^1.18.4", + "whatsapp-web.js": "1.18.4", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest",