This commit is contained in:
Leifer Mendez
2022-11-10 21:16:22 +01:00
parent 4216cdd1e5
commit 228530a454
14 changed files with 1891 additions and 3136 deletions

3028
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,9 @@
{
"name": "@bot-whatsapp/root",
"version": "1.0.0",
"version": "0.0.1",
"description": "Bot de wahtsapp open source para MVP o pequeños negocios",
"main": "app.js",
"private": true,
"scripts": {
"cli:rollup": "rollup ./packages/cli/index.js --config ./packages/cli/rollup-cli.config.js",
"io:rollup": "rollup ./packages/io/index.js --config ./packages/io/rollup-cli.config.js",
@@ -19,7 +20,8 @@
"test.e2e": "node ./node_modules/uvu/bin.js __tests__ test",
"test.coverage": "node ./node_modules/c8/bin/c8.js --check-coverage --lines=90 npm run test.unit",
"test": "npm run test.unit && npm run test.e2e",
"cli": "node ./packages/cli/bin/cli.js"
"cli": "node ./packages/cli/bin/cli.js",
"dev": "node ./example-app/app.js"
},
"workspaces": [
"packages/*",
@@ -42,25 +44,25 @@
"url": "https://github.com/aurik3"
}
],
"repository": {
"type": "git",
"url": "https://github.com/leifermendez/bot-whatsapp"
},
"repository": "https://github.com/leifermendez/bot-whatsapp",
"license": "ISC",
"dependencies": {},
"dependencies": {
"whatsapp-web.js": "^1.18.2"
},
"devDependencies": {
"@rollup/plugin-commonjs": "^23.0.2",
"c8": "^7.12.0",
"prettier": "^2.7.1",
"eslint": "^8.26.0",
"eslint-config-prettier": "^8.5.0",
"prettier": "^2.7.1",
"prompts": "^2.4.2",
"rimraf": "^3.0.2",
"rollup": "^3.2.3",
"uvu": "^0.5.6"
},
"packageManager": "yarn@3.2.0",
"engines": {
"node": "16.x",
"npm": ">=6.0.0"
}
"node": ">=16"
},
"author": "Leifer Mendez <leifer33@gmail.com>"
}

15
packages/cli/node_modules/.bin/cross-env generated vendored Normal file
View File

@@ -0,0 +1,15 @@
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../../../../node_modules/cross-env/src/bin/cross-env.js" "$@"
ret=$?
else
node "$basedir/../../../../node_modules/cross-env/src/bin/cross-env.js" "$@"
ret=$?
fi
exit $ret

15
packages/cli/node_modules/.bin/cross-env-shell generated vendored Normal file
View File

@@ -0,0 +1,15 @@
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../../../../node_modules/cross-env/src/bin/cross-env-shell.js" "$@"
ret=$?
else
node "$basedir/../../../../node_modules/cross-env/src/bin/cross-env-shell.js" "$@"
ret=$?
fi
exit $ret

7
packages/cli/node_modules/.bin/cross-env-shell.cmd generated vendored Normal file
View File

@@ -0,0 +1,7 @@
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\..\..\..\node_modules\cross-env\src\bin\cross-env-shell.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\..\..\..\..\node_modules\cross-env\src\bin\cross-env-shell.js" %*
)

7
packages/cli/node_modules/.bin/cross-env.cmd generated vendored Normal file
View File

@@ -0,0 +1,7 @@
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\..\..\..\node_modules\cross-env\src\bin\cross-env.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\..\..\..\..\node_modules\cross-env\src\bin\cross-env.js" %*
)

View File

@@ -1,24 +0,0 @@
const ProviderClass = require('../../core/classes/provider.class')
class MockSetting {
enviar = async (number, msg) => {
return Promise.resolve('1')
}
}
const mock = new MockSetting()
class MockProvider extends ProviderClass {
vendor
constructor() {
super()
this.vendor = mock
}
sendMessage = async (userId, message) => {
const status = await this.vendor.enviar(userId, message)
return { userId, message, status }
}
}
module.exports = MockProvider

View File

@@ -0,0 +1,29 @@
const { ProviderClass } = require('@bot-whatsapp/core')
class MockProvider extends ProviderClass {
constructor() {
super()
this.init()
}
delaySendMessage = (miliseconds, eventName) =>
new Promise((res) =>
setTimeout(() => {
const payload = { data: eventName }
this.emit(eventName, payload)
res
}, miliseconds)
)
sendMessage = async (userId, message) => {
return Promise.resolve({ userId, message })
}
init = () =>
Promise.all([
this.delaySendMessage(500, 'ready'),
this.delaySendMessage(1500, 'message'),
])
}
module.exports = new MockProvider()

View File

@@ -1,71 +0,0 @@
const { createWriteStream } = require('fs')
const qr = require('qr-image')
const { Client, LocalAuth } = require('whatsapp-web.js')
//TODO: Acoplamiento OJO
const { ProviderClass } = require('../../index').botcore
const WebWhatsappVendor = new Client({
authStrategy: new LocalAuth(),
})
/**
* TODO esto se debe mover a un utils.js
* @param {*} number
* @returns
*/
const cleanNumber = (number) => {
number = number.replace('@c.us', '')
number = `${number}@c.us`
return number
}
const generateImage = (base64) => {
let qr_svg = qr.image(base64, { type: 'svg', margin: 4 })
qr_svg.pipe(createWriteStream(`${process.cwd()}/qr.svg`))
console.log(`⚡ Recuerda que el QR se actualiza cada minuto ⚡'`)
console.log(`⚡ Actualiza F5 el navegador para mantener el mejor QR⚡`)
}
//////////////////////////////////////////////////////
class WebWhatsappProvider extends ProviderClass {
vendor
constructor(_vendor) {
super()
this.vendor = _vendor
this.vendor.on('qr', (qr) => {
this.emit('require_action', {
eventName: 'require_action',
instructions: `Debes escanear el QR Code para iniciar session reivsa qr.svg`,
})
generateImage(qr)
})
this.vendor.on('ready', (ready) =>
this.emit('ready', { eventName: 'ready', ...ready })
)
this.vendor.on('auth_failure', (error) =>
this.emit('error', { eventName: 'error', ...error })
)
this.vendor.on('authenticated', (authenticated) =>
this.emit('ready', { eventName: 'authenticated', ...authenticated })
)
this.vendor.on('message', (message) =>
this.emit('message', { eventName: 'message', ...message })
)
this.vendor.initialize()
}
sendMessage = async (userId, message) => {
const number = cleanNumber(userId)
return this.vendor.sendMessage(number, message)
}
}
/**
* Injectamos!
*/
module.exports = new WebWhatsappProvider(WebWhatsappVendor)

View File

@@ -0,0 +1,62 @@
const { Client, LocalAuth } = require('whatsapp-web.js')
const { ProviderClass } = require('@bot-whatsapp/core')
const { cleanNumber, generateImage } = require('./utils')
const WebWhatsappVendor = new Client({
authStrategy: new LocalAuth(),
})
class WebWhatsappProvider extends ProviderClass {
vendor
constructor(_vendor) {
super()
this.vendor = _vendor
for (const { event, func } of this.busEvents()) {
this.vendor.on(event, func)
}
this.vendor.initialize()
}
/**
* Mapeamos los eventos nativos de whatsapp-web.js a los que la clase Provider espera
* para tener un standar de eventos
* @returns
*/
busEvents = () => [
{
event: 'qr',
func: (qr) => {
this.emit('require_action', {
instructions: `Debes escanear el QR Code para iniciar session reivsa qr.svg`,
})
generateImage(qr)
},
},
{
event: 'ready',
func: () => this.emit('ready', true),
},
{
event: 'auth_failure',
func: (payload) => this.emit('error', payload),
},
{
event: 'authenticated',
func: () => this.emit('ready', true),
},
{
event: 'message',
func: (payload) => this.emit('message', payload),
},
]
sendMessage = async (userId, message) => {
const number = cleanNumber(userId)
return this.vendor.sendMessage(number, message)
}
}
module.exports = new WebWhatsappProvider(WebWhatsappVendor)

View File

@@ -0,0 +1,17 @@
const { createWriteStream } = require('fs')
const qr = require('qr-image')
const cleanNumber = (number) => {
number = number.replace('@c.us', '')
number = `${number}@c.us`
return number
}
const generateImage = (base64) => {
let qr_svg = qr.image(base64, { type: 'svg', margin: 4 })
qr_svg.pipe(createWriteStream(`${process.cwd()}/qr.svg`))
console.log(`⚡ Recuerda que el QR se actualiza cada minuto ⚡'`)
console.log(`⚡ Actualiza F5 el navegador para mantener el mejor QR⚡`)
}
module.exports = { cleanNumber, generateImage }

View File

@@ -9,7 +9,7 @@
"license": "ISC",
"devDependencies": {},
"dependencies": {
"qr-image": "^3.2.0",
"whatsapp-web.js": "^1.18.2"
"@bot-whatsapp/core": "*",
"qr-image": "^3.2.0"
}
}

1724
yarn.lock Normal file

File diff suppressed because it is too large Load Diff