Merge pull request #326 from codigoencasa/feat/ci-providers-check

ci(provider):  automatic updated versions
This commit is contained in:
Leifer Mendez
2023-01-01 15:15:19 +01:00
committed by GitHub
31 changed files with 268 additions and 43 deletions

48
.github/workflows/check-providers.yml vendored Normal file
View File

@@ -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'

View File

@@ -1,4 +1,4 @@
name: 🤪 Build and Test name: Build and Test
on: on:
push: push:

View File

@@ -1,4 +1,4 @@
name: 🙌 Revisando Colaboradores name: Revisando Colaboradores
on: on:
pull_request: pull_request:
branches: branches:

View File

@@ -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) [![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)
<p align="center">
<div style="width:100%;text-align:center"><img src="https://i.imgur.com/Oauef6t.png" width="300" /></div> <img width="300" src="https://i.imgur.com/Oauef6t.png">
</p>
**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 ## Comenzar
@@ -25,12 +26,13 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
## Recursos ## Recursos
- [📄 Documentación](https://bot-whatsapp.netlify.app/) - [📄 Documentación](https://bot-whatsapp.netlify.app/)
- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) - [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1)
- [💻 Discord](https://link.codigoencasa.com/DISCORD) - [💻 Discord](https://link.codigoencasa.com/DISCORD)
- [👌 Twitter](https://twitter.com/leifermendez) - [👌 Twitter](https://twitter.com/leifermendez)
- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) - [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR)
## Comunidad ## Comunidad
<!-- readme: collaborators,contributors -start --> <!-- readme: collaborators,contributors -start -->
<!-- readme: collaborators,contributors -end --> <!-- readme: collaborators,contributors -end -->

View File

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

View File

@@ -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/)** - Node v16 o superior **[descargar node](https://nodejs.org/es/download/)**
## ¿Como instalar Node en Windows? ## ¿Como instalar Node en Windows?
https://youtu.be/xRXHQlqA3Ak?t=376 https://youtu.be/xRXHQlqA3Ak?t=376
## ¿Como instalar Node en Ubuntu? ## ¿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. 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? ## ¿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 Solo debes ejecutar el siguiente comando y esperar que la versión que te arroja sea superior a v16

View File

@@ -1,13 +1,16 @@
const { ProviderClass } = require('@bot-whatsapp/bot') const { ProviderClass } = require('@bot-whatsapp/bot')
const { Sticker } = require('wa-sticker-formatter') const { Sticker } = require('wa-sticker-formatter')
const pino = require('pino') const pino = require('pino')
const rimraf = require('rimraf')
const mime = require('mime-types') const mime = require('mime-types')
const { join } = require('path')
const { existsSync, createWriteStream } = require('fs') const { existsSync, createWriteStream } = require('fs')
const { Console } = require('console') const { Console } = require('console')
const { const {
default: makeWASocket, default: makeWASocket,
useMultiFileAuthState, useMultiFileAuthState,
Browsers,
DisconnectReason, DisconnectReason,
} = require('@adiwajshing/baileys') } = require('@adiwajshing/baileys')
const { const {
@@ -21,6 +24,9 @@ const logger = new Console({
stdout: createWriteStream(`${process.cwd()}/baileys.log`), 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 * ⚙️ BaileysProvider: Es una clase tipo adaptor
* que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas) * 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 * Iniciar todo Bailey
*/ */
initBailey = async () => { initBailey = async () => {
const { state, saveCreds } = await useMultiFileAuthState('sessions') const { state, saveCreds } = await useMultiFileAuthState(
NAME_DIR_SESSION
)
this.saveCredsGlobal = saveCreds this.saveCredsGlobal = saveCreds
try { try {
const sock = makeWASocket({ const sock = makeWASocket({
printQRInTerminal: false, printQRInTerminal: false,
auth: state, auth: state,
browser: Browsers.macOS('Desktop'),
syncFullHistory: false,
logger: pino({ level: 'error' }), logger: pino({ level: 'error' }),
}) })
sock.ev.on('connection.update', async (update) => { sock.ev.on('connection.update', async (update) => {
const { connection, lastDisconnect, qr } = update const { connection, lastDisconnect, qr } = update
if (connection === 'close') { const statusCode = lastDisconnect?.error?.output?.statusCode
const shouldReconnect =
lastDisconnect?.error?.output?.statusCode !==
DisconnectReason.loggedOut
if (shouldReconnect) { if (statusCode === DisconnectReason.loggedOut) {
await saveCreds() rimraf(PATH_BASE, (err) => {
this.initBailey() if (err) return
} })
this.initBailey()
}
if (statusCode && statusCode !== DisconnectReason.loggedOut) {
this.initBailey()
} }
if (qr) { if (qr) {

View File

@@ -0,0 +1,7 @@
{
"dependencies": {
"@adiwajshing/baileys": "5.0.0",
"mime-types": "2.1.35",
"wa-sticker-formatter": "4.3.2"
}
}

View File

@@ -0,0 +1,3 @@
{
"dependencies": {}
}

View File

@@ -0,0 +1,5 @@
{
"dependencies": {
"twilio": "3.84.0"
}
}

View File

@@ -0,0 +1,6 @@
{
"dependencies": {
"venom-bot": "4.3.7",
"mime-types": "2.1.35"
}
}

View File

@@ -0,0 +1,5 @@
{
"dependencies": {
"whatsapp-web.js": "1.18.4"
}
}

131
scripts/checker.js Normal file
View File

@@ -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()

View File

@@ -4,7 +4,7 @@
"description": "", "description": "",
"main": "app.js", "main": "app.js",
"scripts": { "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" "start": "node app.js"
}, },
"keywords": [], "keywords": [],
@@ -13,9 +13,9 @@
"@bot-whatsapp/cli": "latest", "@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest", "@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest", "@bot-whatsapp/provider": "latest",
"@adiwajshing/baileys": "^4.4.0", "@adiwajshing/baileys": "5.0.0",
"mime-types": "^2.1.35", "mime-types": "2.1.35",
"wa-sticker-formatter": "^4.3.2" "wa-sticker-formatter": "4.3.2"
}, },
"author": "", "author": "",
"license": "ISC" "license": "ISC"

View File

@@ -4,7 +4,7 @@
"description": "", "description": "",
"main": "app.js", "main": "app.js",
"scripts": { "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" "start": "node app.js"
}, },
"keywords": [], "keywords": [],
@@ -13,10 +13,10 @@
"@bot-whatsapp/cli": "latest", "@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest", "@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest", "@bot-whatsapp/provider": "latest",
"@adiwajshing/baileys": "^4.4.0", "@adiwajshing/baileys": "5.0.0",
"mime-types": "^2.1.35", "mime-types": "2.1.35",
"mongodb": "^4.12.1", "mongodb": "^4.12.1",
"wa-sticker-formatter": "^4.3.2" "wa-sticker-formatter": "4.3.2"
}, },
"author": "", "author": "",
"license": "ISC" "license": "ISC"

View File

@@ -4,7 +4,7 @@
"description": "", "description": "",
"main": "app.js", "main": "app.js",
"scripts": { "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" "start": "node app.js"
}, },
"keywords": [], "keywords": [],
@@ -13,10 +13,10 @@
"@bot-whatsapp/cli": "latest", "@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest", "@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest", "@bot-whatsapp/provider": "latest",
"@adiwajshing/baileys": "^4.4.0", "@adiwajshing/baileys": "5.0.0",
"mime-types": "^2.1.35", "mime-types": "2.1.35",
"mysql2": "^2.3.3", "mysql2": "^2.3.3",
"wa-sticker-formatter": "^4.3.2" "wa-sticker-formatter": "4.3.2"
}, },
"author": "", "author": "",
"license": "ISC" "license": "ISC"

View File

@@ -11,7 +11,7 @@
"dependencies": { "dependencies": {
"body-parser": "^1.20.1", "body-parser": "^1.20.1",
"polka": "^0.5.2", "polka": "^0.5.2",
"twilio": "^3.83.4", "twilio": "3.84.0",
"@bot-whatsapp/bot": "latest", "@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest", "@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest", "@bot-whatsapp/database": "latest",

View File

@@ -11,7 +11,7 @@
"dependencies": { "dependencies": {
"body-parser": "^1.20.1", "body-parser": "^1.20.1",
"polka": "^0.5.2", "polka": "^0.5.2",
"twilio": "^3.83.4", "twilio": "3.84.0",
"@bot-whatsapp/bot": "latest", "@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest", "@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest", "@bot-whatsapp/database": "latest",

View File

@@ -11,7 +11,7 @@
"dependencies": { "dependencies": {
"body-parser": "^1.20.1", "body-parser": "^1.20.1",
"polka": "^0.5.2", "polka": "^0.5.2",
"twilio": "^3.83.4", "twilio": "3.84.0",
"@bot-whatsapp/bot": "latest", "@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest", "@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest", "@bot-whatsapp/database": "latest",

View File

@@ -9,11 +9,12 @@
}, },
"keywords": [], "keywords": [],
"dependencies": { "dependencies": {
"venom-bot": "^4.3.7", "venom-bot": "4.3.7",
"@bot-whatsapp/bot": "latest", "@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest", "@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest", "@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest" "@bot-whatsapp/provider": "latest",
"mime-types": "2.1.35"
}, },
"author": "", "author": "",
"license": "ISC" "license": "ISC"

View File

@@ -9,12 +9,12 @@
}, },
"keywords": [], "keywords": [],
"dependencies": { "dependencies": {
"venom-bot": "^4.3.7", "venom-bot": "4.3.7",
"@bot-whatsapp/bot": "latest", "@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest", "@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest", "@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest", "@bot-whatsapp/provider": "latest",
"mime-types": "^2.1.35", "mime-types": "2.1.35",
"mongodb": "^4.12.1" "mongodb": "^4.12.1"
}, },
"author": "", "author": "",

View File

@@ -9,12 +9,13 @@
}, },
"keywords": [], "keywords": [],
"dependencies": { "dependencies": {
"venom-bot": "^4.3.7", "venom-bot": "4.3.7",
"@bot-whatsapp/bot": "latest", "@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest", "@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest", "@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest", "@bot-whatsapp/provider": "latest",
"mysql2": "^2.3.3" "mysql2": "^2.3.3",
"mime-types": "2.1.35"
}, },
"author": "", "author": "",
"license": "ISC" "license": "ISC"

View File

@@ -9,11 +9,11 @@
}, },
"keywords": [], "keywords": [],
"dependencies": { "dependencies": {
"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",
"@bot-whatsapp/provider": "latest" "@bot-whatsapp/provider": "latest",
"whatsapp-web.js": "1.18.4"
}, },
"author": "", "author": "",
"license": "ISC" "license": "ISC"

View File

@@ -9,7 +9,7 @@
}, },
"keywords": [], "keywords": [],
"dependencies": { "dependencies": {
"whatsapp-web.js": "^1.18.4", "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",

View File

@@ -9,7 +9,7 @@
}, },
"keywords": [], "keywords": [],
"dependencies": { "dependencies": {
"whatsapp-web.js": "^1.18.4", "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",