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:
push:

View File

@@ -1,4 +1,4 @@
name: 🙌 Revisando Colaboradores
name: Revisando Colaboradores
on:
pull_request:
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)
<div style="width:100%;text-align:center"><img src="https://i.imgur.com/Oauef6t.png" width="300" /></div>
<p align="center">
<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
@@ -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
<!-- readme: collaborators,contributors -start -->
<!-- readme: collaborators,contributors -end -->

View File

@@ -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' },
],

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/)**
## ¿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

View File

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

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": "",
"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"

View File

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

View File

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

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

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

View File

@@ -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": "",

View File

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

View File

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

View File

@@ -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",

View File

@@ -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",