mirror of
https://github.com/cheveguerra/bot-whatsapp.git
synced 2026-04-20 20:49:15 +00:00
Compare commits
2 Commits
feature/tw
...
fix/delay-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eda8a67718 | ||
|
|
73caf090ba |
3
TODO.md
3
TODO.md
@@ -11,9 +11,10 @@
|
|||||||
- [X] sensitivy viene activado por defecto
|
- [X] sensitivy viene activado por defecto
|
||||||
- [X] fallback respuesta en hijo: Se puede colocar en option el ref de la answer fallback
|
- [X] fallback respuesta en hijo: Se puede colocar en option el ref de la answer fallback
|
||||||
- [X] Cuando Envian Sticket devuelve mensaje raro
|
- [X] Cuando Envian Sticket devuelve mensaje raro
|
||||||
|
- [x] addAnswer agregar delay
|
||||||
- [ ] colocar mensaje esperando conectando whatsapp (provider)
|
- [ ] colocar mensaje esperando conectando whatsapp (provider)
|
||||||
- [ ] createDatabase validar implementacion de funciones
|
- [ ] createDatabase validar implementacion de funciones
|
||||||
- [ ] limitar caracteres de mensajes
|
- [ ] limitar caracteres de mensajes 4000
|
||||||
- [X] cuando envias numeros (5 o 1) se dispara el flujo
|
- [X] cuando envias numeros (5 o 1) se dispara el flujo
|
||||||
|
|
||||||
### @bot-whatsapp/database
|
### @bot-whatsapp/database
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
const { toCtx } = require('../io/methods')
|
const { toCtx } = require('../io/methods')
|
||||||
const { printer } = require('../utils/interactive')
|
const { printer } = require('../utils/interactive')
|
||||||
|
const { delay } = require('../utils/delay')
|
||||||
|
const Queue = require('../utils/queue')
|
||||||
const { Console } = require('console')
|
const { Console } = require('console')
|
||||||
const { createWriteStream } = require('fs')
|
const { createWriteStream } = require('fs')
|
||||||
|
|
||||||
@@ -140,10 +142,14 @@ class CoreClass {
|
|||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
sendFlow = (messageToSend, numberOrId) => {
|
sendFlow = async (messageToSend, numberOrId) => {
|
||||||
const queue = []
|
const queue = []
|
||||||
for (const ctxMessage of messageToSend) {
|
for (const ctxMessage of messageToSend) {
|
||||||
queue.push(this.sendProviderAndSave(numberOrId, ctxMessage))
|
const delayMs = ctxMessage?.options?.delay || 0
|
||||||
|
if (delayMs) await delay(delayMs)
|
||||||
|
Queue.enqueue(() =>
|
||||||
|
this.sendProviderAndSave(numberOrId, ctxMessage)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
return Promise.all(queue)
|
return Promise.all(queue)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ const createFlow = (args) => {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Crear instancia de clase Provider
|
* Crear instancia de clase Provider
|
||||||
|
* Depdendiendo del Provider puedes pasar argumentos
|
||||||
|
* Ver Documentacion
|
||||||
* @param {*} args
|
* @param {*} args
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ const { toJson } = require('./toJson')
|
|||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param answer string
|
* @param answer string
|
||||||
* @param options {media:string, buttons:[{"body":"😎 Cursos"}], capture:true default false}
|
* @param options {media:string, buttons:[{"body":"😎 Cursos"}], delay:ms, capture:true default false}
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
const addAnswer =
|
const addAnswer =
|
||||||
@@ -24,6 +24,7 @@ const addAnswer =
|
|||||||
: false,
|
: false,
|
||||||
child:
|
child:
|
||||||
typeof options?.child === 'string' ? `${options?.child}` : null,
|
typeof options?.child === 'string' ? `${options?.child}` : null,
|
||||||
|
delay: typeof options?.delay === 'number' ? options?.delay : 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
const getNested = () => ({
|
const getNested = () => ({
|
||||||
|
|||||||
4
packages/bot/utils/delay.js
Normal file
4
packages/bot/utils/delay.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
const delay = (miliseconds) =>
|
||||||
|
new Promise((res) => setTimeout(res, miliseconds))
|
||||||
|
|
||||||
|
module.exports = { delay }
|
||||||
46
packages/bot/utils/queue.js
Normal file
46
packages/bot/utils/queue.js
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
class Queue {
|
||||||
|
static queue = []
|
||||||
|
static pendingPromise = false
|
||||||
|
|
||||||
|
static enqueue(promise) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.queue.push({
|
||||||
|
promise,
|
||||||
|
resolve,
|
||||||
|
reject,
|
||||||
|
})
|
||||||
|
this.dequeue()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
static dequeue() {
|
||||||
|
if (this.workingOnPromise) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
const item = this.queue.shift()
|
||||||
|
if (!item) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
this.workingOnPromise = true
|
||||||
|
item.promise()
|
||||||
|
.then((value) => {
|
||||||
|
this.workingOnPromise = false
|
||||||
|
item.resolve(value)
|
||||||
|
this.dequeue()
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
this.workingOnPromise = false
|
||||||
|
item.reject(err)
|
||||||
|
this.dequeue()
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
this.workingOnPromise = false
|
||||||
|
item.reject(err)
|
||||||
|
this.dequeue()
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Queue
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# @bot-whatsapp/provider
|
|
||||||
|
|
||||||
```js
|
|
||||||
// bootstrap.js Como iniciar el provider
|
|
||||||
const { inout, provider, database } = require('@bot-whatsapp')
|
|
||||||
|
|
||||||
provider.start()
|
|
||||||
provider.close()
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] whatsapp-web.js _verificar update_
|
|
||||||
- [ ] Meta _verificar tokens_
|
|
||||||
- [ ] Twilio _verificar tokens_
|
|
||||||
@@ -11,10 +11,10 @@ class TwilioProvider extends ProviderClass {
|
|||||||
twilioHook
|
twilioHook
|
||||||
vendor
|
vendor
|
||||||
vendorNumber
|
vendorNumber
|
||||||
constructor({ accountSid, authToken, vendorNumber }) {
|
constructor({ accountSid, authToken, vendorNumber }, _port = 3000) {
|
||||||
super()
|
super()
|
||||||
this.vendor = new twilio(accountSid, authToken)
|
this.vendor = new twilio(accountSid, authToken)
|
||||||
this.twilioHook = new TwilioWebHookServer()
|
this.twilioHook = new TwilioWebHookServer(_port)
|
||||||
this.vendorNumber = vendorNumber
|
this.vendorNumber = vendorNumber
|
||||||
|
|
||||||
this.twilioHook.start()
|
this.twilioHook.start()
|
||||||
|
|||||||
@@ -3,7 +3,24 @@ const polka = require('polka')
|
|||||||
const { urlencoded } = require('body-parser')
|
const { urlencoded } = require('body-parser')
|
||||||
const { parseNumber } = require('./utils')
|
const { parseNumber } = require('./utils')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encargado de levantar un servidor HTTP con una hook url
|
||||||
|
* [POST] /twilio-hook
|
||||||
|
*/
|
||||||
class TwilioWebHookServer extends EventEmitter {
|
class TwilioWebHookServer extends EventEmitter {
|
||||||
|
twilioServer
|
||||||
|
twilioPort
|
||||||
|
constructor(_twilioPort) {
|
||||||
|
this.twilioServer = this.buildHTTPServer()
|
||||||
|
this.twilioPort = _twilioPort
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mensaje entrante
|
||||||
|
* emit: 'message'
|
||||||
|
* @param {*} req
|
||||||
|
* @param {*} res
|
||||||
|
*/
|
||||||
incomingMsg = (req, res) => {
|
incomingMsg = (req, res) => {
|
||||||
const { body } = req
|
const { body } = req
|
||||||
this.emit('message', {
|
this.emit('message', {
|
||||||
@@ -15,13 +32,31 @@ class TwilioWebHookServer extends EventEmitter {
|
|||||||
res.end(json)
|
res.end(json)
|
||||||
}
|
}
|
||||||
|
|
||||||
start = () => {
|
/**
|
||||||
polka()
|
* Contruir HTTP Server
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
buildHTTPServer = () => {
|
||||||
|
return polka()
|
||||||
.use(urlencoded({ extended: true }))
|
.use(urlencoded({ extended: true }))
|
||||||
.post('/hook', this.incomingMsg)
|
.post('/twilio-hook', this.incomingMsg)
|
||||||
.listen(3000, () => {
|
}
|
||||||
console.log(`> Running on localhost:3000 /hook`)
|
|
||||||
})
|
/**
|
||||||
|
* Puerto del HTTP
|
||||||
|
* @param {*} port default 3000
|
||||||
|
*/
|
||||||
|
start = () => {
|
||||||
|
this.twilioServer.listen(this.twilioPort, () => {
|
||||||
|
console.log(``)
|
||||||
|
console.log(`[Twilio]: Agregar esta url "WHEN A MESSAGE COMES IN"`)
|
||||||
|
console.log(
|
||||||
|
`[Twilio]: http://localhost:${this.twilioPort}/twilio-hook`
|
||||||
|
)
|
||||||
|
console.log(`[Twilio]: Más información en la documentacion`)
|
||||||
|
console.log(``)
|
||||||
|
})
|
||||||
|
this.emit('ready')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user