mirror of
https://github.com/cheveguerra/bot-whatsapp.git
synced 2026-04-21 04:59:15 +00:00
extends conditional class
This commit is contained in:
@@ -1,77 +1,43 @@
|
|||||||
const { test } = require('uvu')
|
const { test } = require('uvu')
|
||||||
const assert = require('uvu/assert')
|
const assert = require('uvu/assert')
|
||||||
/**
|
|
||||||
* require('@bot-whatsapp')
|
|
||||||
*/
|
|
||||||
const { inout, provider, bot } = require('../lib/index.cjs')
|
|
||||||
|
|
||||||
/**
|
// const { inout, provider, database, botcore } = require('../lib/index.cjs')
|
||||||
* MockDB
|
const { inout, provider, database, botcore } = require('../packages/index')
|
||||||
*/
|
|
||||||
class DatabaseClass {
|
|
||||||
constructor() {}
|
|
||||||
|
|
||||||
saveLog = (ctx) => {
|
const adapterDB = database.create({
|
||||||
return ctx
|
engine: 'json', // 'mysql / pg / mongo / json (json-default)',
|
||||||
}
|
credentials: {},
|
||||||
}
|
})
|
||||||
|
|
||||||
const adapterDB = new DatabaseClass()
|
const adapterProvider = provider.create({
|
||||||
|
vendor: 'web', //'twilio / web / meta',
|
||||||
|
credentials: {},
|
||||||
|
})
|
||||||
|
|
||||||
const adapterFlow = new inout.instance(
|
const makeFlow = () => {
|
||||||
(() => {
|
|
||||||
const flowA = inout
|
const flowA = inout
|
||||||
.addKeyword('hola')
|
.addKeyword('hola')
|
||||||
.addAnswer('Bienvenido a tu tienda 🥲')
|
.addAnswer('Bienvenido a tu tienda 🥲')
|
||||||
.addAnswer('escribe *catalogo* o *ofertas*')
|
.addAnswer('escribe *catalogo* o *ofertas*')
|
||||||
.toJson()
|
.toJson()
|
||||||
|
|
||||||
const flowB = inout
|
return [...flowA]
|
||||||
.addKeyword(['catalogo', 'ofertas'])
|
}
|
||||||
.addAnswer('Este es nuestro CATALOGO mas reciente!', {
|
|
||||||
buttons: [{ body: 'Xiaomi' }, { body: 'Samsung' }],
|
|
||||||
})
|
|
||||||
.toJson()
|
|
||||||
|
|
||||||
const flowC = inout
|
const adapterFlow = inout.create(makeFlow())
|
||||||
.addKeyword('Xiaomi')
|
|
||||||
.addAnswer('Estos son nuestro productos XIAOMI ....', {
|
|
||||||
media: 'https://....',
|
|
||||||
})
|
|
||||||
.addAnswer('Si quieres mas info escrbie *info*')
|
|
||||||
.toJson()
|
|
||||||
|
|
||||||
const flowD = inout
|
test(`[BotClass]: recibe los mensajes entrantes del provider`, () => {
|
||||||
.addKeyword('chao!')
|
|
||||||
.addAnswer('bye!')
|
|
||||||
.addAnswer('Recuerda que tengo esta promo', {
|
|
||||||
media: 'https://media2.giphy.com/media/VQJu0IeULuAmCwf5SL/giphy.gif',
|
|
||||||
})
|
|
||||||
.toJson()
|
|
||||||
|
|
||||||
const flowE = inout
|
|
||||||
.addKeyword('Modelo C', { sensitive: false })
|
|
||||||
.addAnswer('100USD', { media: 'http//:...' })
|
|
||||||
.toJson()
|
|
||||||
|
|
||||||
return [...flowA, ...flowB, ...flowC, ...flowC, ...flowD, ...flowE]
|
|
||||||
})()
|
|
||||||
)
|
|
||||||
|
|
||||||
const adapterProvider = new provider.instance()
|
|
||||||
|
|
||||||
test(`[Flow Basico]: BotClass`, () => {
|
|
||||||
let messages = []
|
let messages = []
|
||||||
|
|
||||||
const flows = adapterFlow
|
const bot = botcore.create({
|
||||||
const databases = adapterDB
|
flow: adapterFlow,
|
||||||
const providers = adapterProvider
|
database: adapterDB,
|
||||||
|
provider: adapterProvider,
|
||||||
|
})
|
||||||
|
|
||||||
const botBasic = new bot.instance(flows, databases, providers)
|
bot.on('message', (ctx) => messages.push(ctx.body))
|
||||||
|
bot.emit('message', { body: 'hola' })
|
||||||
botBasic.on('message', (ctx) => messages.push(ctx.body))
|
bot.emit('message', { body: 'otro' })
|
||||||
botBasic.emit('message', { body: 'hola' })
|
|
||||||
botBasic.emit('message', { body: 'otro' })
|
|
||||||
|
|
||||||
assert.is(messages.join(','), ['hola', 'otro'].join(','))
|
assert.is(messages.join(','), ['hola', 'otro'].join(','))
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
"io:rollup": "rollup ./packages/io/index.js --config ./packages/io/rollup-cli.config.js",
|
"io:rollup": "rollup ./packages/io/index.js --config ./packages/io/rollup-cli.config.js",
|
||||||
"core:rollup": "rollup ./packages/core/index.js --config ./packages/core/rollup-cli.config.js",
|
"core:rollup": "rollup ./packages/core/index.js --config ./packages/core/rollup-cli.config.js",
|
||||||
"provider:rollup": "rollup ./packages/provider/index.js --config ./packages/provider/rollup-cli.config.js",
|
"provider:rollup": "rollup ./packages/provider/index.js --config ./packages/provider/rollup-cli.config.js",
|
||||||
|
"database:rollup": "rollup ./packages/database/index.js --config ./packages/database/rollup-cli.config.js",
|
||||||
"all:rollup": "rollup ./packages/index.js --config ./packages/rollup-cli.config.js",
|
"all:rollup": "rollup ./packages/index.js --config ./packages/rollup-cli.config.js",
|
||||||
"format:check": "prettier --check ./packages",
|
"format:check": "prettier --check ./packages",
|
||||||
"format:write": "prettier --write ./packages",
|
"format:write": "prettier --write ./packages",
|
||||||
|
|||||||
@@ -1,19 +1,18 @@
|
|||||||
const { EventEmitter } = require('node:events')
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clase principal del BOT
|
* Clase principal del BOT
|
||||||
*/
|
*/
|
||||||
class BotClass extends EventEmitter {
|
class BotClass {
|
||||||
flowClass
|
flowClass
|
||||||
databaseClass
|
databaseClass
|
||||||
providerClass
|
providerClass
|
||||||
constructor(_flow, _database, _provider) {
|
constructor(_flow, _database, _provider) {
|
||||||
super()
|
|
||||||
this.flowClass = _flow
|
this.flowClass = _flow
|
||||||
this.databaseClass = _database
|
this.databaseClass = _database
|
||||||
this.providerClass = _provider
|
this.providerClass = _provider
|
||||||
|
|
||||||
this.on('message', (ctxMessage) => this.handleOnMessage(ctxMessage))
|
this.providerClass.on('message', (ctxMessage) =>
|
||||||
|
this.handleOnMessage(ctxMessage)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
handleOnMessage = (ctxMessage) => {
|
handleOnMessage = (ctxMessage) => {
|
||||||
|
|||||||
@@ -1,2 +1,15 @@
|
|||||||
const BotClass = require('./classes/bot.class')
|
const BotClass = require('./classes/bot.class')
|
||||||
module.exports = { instance: BotClass }
|
|
||||||
|
/**
|
||||||
|
* Crear instancia de clase
|
||||||
|
* @param {*} args
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
const create = ({ flow, database, provider }) => {
|
||||||
|
return Object.setPrototypeOf(
|
||||||
|
new BotClass(flow, database, provider),
|
||||||
|
provider
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { create }
|
||||||
|
|||||||
9
packages/database/classes/database.class.js
Normal file
9
packages/database/classes/database.class.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
class DatabaseClass {
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
saveLog = (ctx) => {
|
||||||
|
return ctx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = DatabaseClass
|
||||||
12
packages/database/index.js
Normal file
12
packages/database/index.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
const DatabaseClass = require('./classes/database.class')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Crear instancia de clase
|
||||||
|
* @param {*} args
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
const create = (args) => {
|
||||||
|
return new DatabaseClass(args)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { create }
|
||||||
11
packages/database/package.json
Normal file
11
packages/database/package.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "@bot-whatsapp/database",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "Esto es el conector a mysql, pg, mongo",
|
||||||
|
"main": "index.js",
|
||||||
|
"private": true,
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"devDependencies": {}
|
||||||
|
}
|
||||||
10
packages/database/rollup-cli.config.js
Normal file
10
packages/database/rollup-cli.config.js
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
const commonjs = require('@rollup/plugin-commonjs')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
input: 'index.js',
|
||||||
|
output: {
|
||||||
|
file: 'lib/database/bundle.database.cjs',
|
||||||
|
format: 'cjs',
|
||||||
|
},
|
||||||
|
plugins: [commonjs()],
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
const inout = require('./io')
|
const inout = require('./io')
|
||||||
const provider = require('./provider')
|
const provider = require('./provider')
|
||||||
const bot = require('./core')
|
const botcore = require('./core')
|
||||||
|
const database = require('./database')
|
||||||
|
|
||||||
module.exports = { inout, provider, bot }
|
module.exports = { inout, provider, botcore, database }
|
||||||
|
|||||||
@@ -1,3 +1,13 @@
|
|||||||
const { addKeyword, addAnswer } = require('./methods')
|
const { addKeyword, addAnswer } = require('./methods')
|
||||||
const FlowClass = require('./classes/flow.class')
|
const FlowClass = require('./classes/flow.class')
|
||||||
module.exports = { addKeyword, addAnswer, instance: FlowClass }
|
|
||||||
|
/**
|
||||||
|
* Crear instancia de clase
|
||||||
|
* @param {*} args
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
const create = (args) => {
|
||||||
|
return new FlowClass(args)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { addKeyword, addAnswer, create }
|
||||||
|
|||||||
5
packages/provider/adapters/mock.js
Normal file
5
packages/provider/adapters/mock.js
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
const { EventEmitter } = require('node:events')
|
||||||
|
|
||||||
|
class MockProvider extends EventEmitter {}
|
||||||
|
|
||||||
|
module.exports = MockProvider
|
||||||
1
packages/provider/adapters/twilio.js
Normal file
1
packages/provider/adapters/twilio.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
class TwilioProvider {}
|
||||||
@@ -1,4 +1,8 @@
|
|||||||
class ProviderClass {
|
class ProviderClass {
|
||||||
|
/**
|
||||||
|
* events: message | auth | auth_error | ...
|
||||||
|
*
|
||||||
|
*/
|
||||||
constructor() {}
|
constructor() {}
|
||||||
|
|
||||||
sendMessage = (message) => {
|
sendMessage = (message) => {
|
||||||
|
|||||||
@@ -1,2 +1,22 @@
|
|||||||
const ProviderClass = require('./classes/provider.class')
|
const ProviderClass = require('./classes/provider.class')
|
||||||
module.exports = { instance: ProviderClass }
|
const TwilioProvider = require('./adapters/twilio')
|
||||||
|
const MockProvider = require('./adapters/mock')
|
||||||
|
|
||||||
|
const prepareVendor = ({ vendor, credentials }) => {
|
||||||
|
if (vendor === 'twilio') return new TwilioProvider(credentials)
|
||||||
|
// if (vendor === 'meta') return new TwilioProvider(credentials)
|
||||||
|
// if (vendor === 'wev') return new TwilioProvider(credentials)
|
||||||
|
return new MockProvider()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Crear instancia de clase
|
||||||
|
* @param {*} args
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
const create = (args) => {
|
||||||
|
const vendor = prepareVendor(args)
|
||||||
|
return Object.setPrototypeOf(new ProviderClass(), vendor)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { create }
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@bot-whatsapp/provider",
|
"name": "@bot-whatsapp/provider",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"description": "",
|
"description": "Esto es el conector a Twilio, Meta, etc...",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
|
|||||||
Reference in New Issue
Block a user