Skip to content

Commit

Permalink
Merge pull request #886 from C4rlos-Mor4n/main
Browse files Browse the repository at this point in the history
fix(bot): 🔥 se incorpora la funcionalidad de blacklist dinámica
  • Loading branch information
leifermendez authored Oct 24, 2023
2 parents 2a1726b + 966834e commit 4851419
Show file tree
Hide file tree
Showing 6 changed files with 258 additions and 39 deletions.
6 changes: 5 additions & 1 deletion packages/bot/core/core.class.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const loggerQueue = new Console({
})

const idleForCallback = new IdleState()
const DynamicBlacklist = require('../utils/BlacklistDynamic')

/**
* [ ] Escuchar eventos del provider asegurarte que los provider emitan eventos
Expand All @@ -33,6 +34,7 @@ class CoreClass extends EventEmitter {
queuePrincipal
stateHandler = new SingleState()
globalStateHandler = new GlobalState()
dynamicBlacklist = new DynamicBlacklist()
generalArgs = {
blackList: [],
listEvents: {},
Expand All @@ -51,6 +53,8 @@ class CoreClass extends EventEmitter {
this.providerClass = _provider
this.generalArgs = { ...this.generalArgs, ..._args }

this.dynamicBlacklist.addToBlacklist(this.generalArgs.blackList)

this.queuePrincipal = new Queue(
loggerQueue,
this.generalArgs.queue.concurrencyLimit,
Expand Down Expand Up @@ -108,7 +112,7 @@ class CoreClass extends EventEmitter {
let msgToSend = []
let endFlowFlag = false
let fallBackFlag = false
if (this.generalArgs.blackList.includes(from)) return
if (this.dynamicBlacklist.isInBlacklist(from)) return
if (!body) return

let prevMsg = await this.databaseClass.getPrevByNumber(from)
Expand Down
80 changes: 80 additions & 0 deletions packages/bot/utils/BlacklistDynamic.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
class DynamicBlacklist {
#blacklist = new Set()

/**
* Constructor para inicializar la lista negra.
* @param {Array<string>} initialNumbers - Lista inicial de números a bloquear.
*/
constructor(initialNumbers = []) {
this.addToBlacklist(initialNumbers)
}

/**
* Excepción lanzada cuando un número ya existe en la lista negra.
*/
static PhoneNumberAlreadyExistsError = class extends Error {
constructor(phoneNumber) {
super(`El número de teléfono ${phoneNumber} ya está en la lista negra.`)
this.name = 'PhoneNumberAlreadyExistsError'
}
}

/**
* Excepción lanzada cuando un número no se encuentra en la lista negra.
*/
static PhoneNumberNotFoundError = class extends Error {
constructor(phoneNumber) {
super(`El número de teléfono ${phoneNumber} no está en la lista negra.`)
this.name = 'PhoneNumberNotFoundError'
}
}

/**
* Añade uno o varios números de teléfono a la lista negra.
* @param {string | Array<string>} phoneNumbers - Número o números a añadir.
* @returns {Array<string>} - Devuelve una lista de mensajes indicando el resultado de añadir cada número.
*/
addToBlacklist(...phoneNumbers) {
const responseMessages = []

phoneNumbers.flat().forEach((number) => {
if (this.#blacklist.has(number)) {
responseMessages.push(`El número de teléfono ${number} ya está en la lista negra.`)
} else {
this.#blacklist.add(number)
responseMessages.push(`Número ${number} añadido exitosamente.`)
}
})

return responseMessages
}

/**
* Elimina un número de teléfono de la lista negra.
* @param {string} phoneNumber - El número a eliminar.
*/
removeFromBlacklist(phoneNumber) {
if (!this.#blacklist.has(phoneNumber)) {
throw new DynamicBlacklist.PhoneNumberNotFoundError(phoneNumber)
}
this.#blacklist.delete(phoneNumber)
}

/**
* Verifica si un número de teléfono está en la lista negra.
* @param {string} phoneNumber - El número a verificar.
* @returns {boolean} - Verdadero si está en la lista, falso en caso contrario.
*/
isInBlacklist(phoneNumber) {
return this.#blacklist.has(phoneNumber)
}

/**
* Proporciona una copia de la lista negra actual.
* @returns {Array<string>} - Los números de teléfono en la lista negra.
*/
getBlacklistSnapshot() {
return [...this.#blacklist]
}
}
module.exports = DynamicBlacklist
1 change: 1 addition & 0 deletions packages/docs/src/root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ export default component$(() => {
{ name: 'fallBack', link: '/docs/fall-back' },
{ name: 'endFlow', link: '/docs/end-flow' },
{ name: 'gotoFlow', link: '/docs/goto-flow' },
{ name: 'idle', link: '/docs/idle' },
{ name: 'blacklist', link: '/docs/blacklist' },
],
},
Expand Down
45 changes: 45 additions & 0 deletions packages/docs/src/routes/docs/idle/index.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import Navigation from '../../../components/widgets/Navigation'

# idle

Esta funcionalidad te permite dada una cantidad de tiempo de inactividad en el chat, ejecutar una acción.

## Ejemplo

En el siguiente ejemplo, si el usuario no responde en 2 segundos, se ejecutará la acción de cancelar el flujo.

```js
const { addKeyword } = require('@bot-whatsapp/bot')

const flujoFinal = addKeyword(EVENTS.ACTION).addAnswer('Se canceló por inactividad')

const flujoPrincipal = addKeyword(['hola'])
.addAnswer(
'Debes de responder antes de que transcurran 2 segundos',
{ capture: true, idle: 2000 }, // idle: 2000 = 2 segundos
async (ctx, { gotoFlow, inRef }) => {
if (ctx?.idleFallBack) {
return gotoFlow(flujoFinal)
}
}
)
.addAnswer('gracias!')

```
## API
### Propiedades
- **idle** - Tiempo de inactividad en milisegundos
- **idleFallBack** - Si se ejecutó la acción por inactividad
---
<Navigation
pages={[
{ name: 'Instalación', link: '/docs/install' },
{ name: 'Conceptos', link: '/docs/essential' },
]}
/>
15 changes: 5 additions & 10 deletions packages/docs/src/services/github.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,13 @@ export const fetchGithub = async (token: string) => {
Authorization: `Bearer ${token}`,
},
})
const listUsers = await data.json()
try {
const listUsers = await data.json()
return listUsers.map((u: any) => ({
...u,
avatar_url: `${u.avatar_url}&s=80`,
}))
// try {
// const listUsers = await data.json()
// return listUsers.map((u: any) => ({
// ...u,
// avatar_url: `${u.avatar_url}&s=80`,
// }))
// } catch (error) {
// return []
// }
} catch (error) {
return []
}
}
Loading

0 comments on commit 4851419

Please sign in to comment.