mirror of
https://github.com/cheveguerra/bot-whatsapp.git
synced 2026-04-17 19:26:23 +00:00
continue
This commit is contained in:
3028
package-lock.json
generated
3028
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
24
package.json
24
package.json
@@ -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
15
packages/cli/node_modules/.bin/cross-env
generated
vendored
Normal 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
15
packages/cli/node_modules/.bin/cross-env-shell
generated
vendored
Normal 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
7
packages/cli/node_modules/.bin/cross-env-shell.cmd
generated
vendored
Normal 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
7
packages/cli/node_modules/.bin/cross-env.cmd
generated
vendored
Normal 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" %*
|
||||
)
|
||||
@@ -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
|
||||
29
packages/provider/adapters/mock/index.js
Normal file
29
packages/provider/adapters/mock/index.js
Normal 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()
|
||||
@@ -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)
|
||||
62
packages/provider/adapters/web-whatsapp/index.js
Normal file
62
packages/provider/adapters/web-whatsapp/index.js
Normal 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)
|
||||
17
packages/provider/adapters/web-whatsapp/utils.js
Normal file
17
packages/provider/adapters/web-whatsapp/utils.js
Normal 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 }
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user