mirror of
https://github.com/cheveguerra/bot-whatsapp.git
synced 2026-04-19 20:19:15 +00:00
3
.github/workflows/ci.yml
vendored
3
.github/workflows/ci.yml
vendored
@@ -1,6 +1,9 @@
|
|||||||
name: 🤪 Build and Test
|
name: 🤪 Build and Test
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- dev
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- dev
|
- dev
|
||||||
|
|||||||
@@ -115,24 +115,16 @@ class CoreClass {
|
|||||||
|
|
||||||
// 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo
|
// 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo
|
||||||
const cbEveryCtx = (inRef) => {
|
const cbEveryCtx = (inRef) => {
|
||||||
const indexFlow = this.flowClass.findIndexByRef(inRef)
|
this.flowClass.allCallbacks[inRef](messageCtxInComming, {
|
||||||
this.flowClass.allCallbacks[indexFlow].callback(
|
fallBack,
|
||||||
messageCtxInComming,
|
flowDynamic,
|
||||||
{
|
})
|
||||||
fallBack,
|
|
||||||
flowDynamic,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 📄 [options: callback]: Si se tiene un callback se ejecuta
|
// 📄 [options: callback]: Si se tiene un callback se ejecuta
|
||||||
if (!fallBackFlag) {
|
if (!fallBackFlag) {
|
||||||
if (refToContinue && prevMsg?.options?.callback) {
|
for (const ite of this.flowClass.find(body)) {
|
||||||
cbEveryCtx(refToContinue?.ref)
|
cbEveryCtx(ite?.ref)
|
||||||
} else {
|
|
||||||
for (const ite of this.flowClass.find(body)) {
|
|
||||||
cbEveryCtx(ite?.ref)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,6 +136,11 @@ class CoreClass {
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
msgToSend = this.flowClass.find(body, false, flowStandalone) || []
|
msgToSend = this.flowClass.find(body, false, flowStandalone) || []
|
||||||
|
|
||||||
|
for (const ite of msgToSend) {
|
||||||
|
cbEveryCtx(ite?.ref)
|
||||||
|
}
|
||||||
|
|
||||||
this.sendFlow(msgToSend, from)
|
this.sendFlow(msgToSend, from)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
const { toSerialize } = require('./methods/toSerialize')
|
const { toSerialize } = require('./methods/toSerialize')
|
||||||
|
const { flatObject } = require('../utils/flattener')
|
||||||
|
|
||||||
class FlowClass {
|
class FlowClass {
|
||||||
allCallbacks = []
|
allCallbacks = []
|
||||||
@@ -8,7 +9,8 @@ class FlowClass {
|
|||||||
if (!Array.isArray(_flow)) throw new Error('Esto debe ser un ARRAY')
|
if (!Array.isArray(_flow)) throw new Error('Esto debe ser un ARRAY')
|
||||||
this.flowRaw = _flow
|
this.flowRaw = _flow
|
||||||
|
|
||||||
this.getAllCb(this.flowRaw)
|
this.allCallbacks = flatObject(_flow)
|
||||||
|
console.log('[🙌🙌🙌]', this.allCallbacks)
|
||||||
|
|
||||||
const mergeToJsonSerialize = Object.keys(_flow)
|
const mergeToJsonSerialize = Object.keys(_flow)
|
||||||
.map((indexObjectFlow) => _flow[indexObjectFlow].toJson())
|
.map((indexObjectFlow) => _flow[indexObjectFlow].toJson())
|
||||||
@@ -17,17 +19,6 @@ class FlowClass {
|
|||||||
this.flowSerialize = toSerialize(mergeToJsonSerialize)
|
this.flowSerialize = toSerialize(mergeToJsonSerialize)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Buscar y aplanar todos los callbacks
|
|
||||||
* @param {*} inFlow
|
|
||||||
*/
|
|
||||||
getAllCb = (inFlow) => {
|
|
||||||
this.allCallbacks = inFlow
|
|
||||||
.map((cbIn) => cbIn.ctx.callbacks)
|
|
||||||
.flat(2)
|
|
||||||
.map((c, i) => ({ callback: c?.callback, index: i }))
|
|
||||||
}
|
|
||||||
|
|
||||||
find = (keyOrWord, symbol = false, overFlow = null) => {
|
find = (keyOrWord, symbol = false, overFlow = null) => {
|
||||||
keyOrWord = `${keyOrWord}`
|
keyOrWord = `${keyOrWord}`
|
||||||
let capture = false
|
let capture = false
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
|
const { flatObject } = require('../../utils/flattener')
|
||||||
const { generateRef } = require('../../utils/hash')
|
const { generateRef } = require('../../utils/hash')
|
||||||
|
const { addChild } = require('./addChild')
|
||||||
const { toJson } = require('./toJson')
|
const { toJson } = require('./toJson')
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -27,9 +29,28 @@ const addAnswer =
|
|||||||
delay: typeof options?.delay === 'number' ? options?.delay : 0,
|
delay: typeof options?.delay === 'number' ? options?.delay : 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
const getNested = () => ({
|
const getNested = () => {
|
||||||
nested: Array.isArray(nested) ? nested : [],
|
let flatNested = []
|
||||||
})
|
if (Array.isArray(nested)) {
|
||||||
|
for (const iterator of nested) {
|
||||||
|
flatNested = [...flatNested, ...addChild(iterator)]
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
nested: flatNested,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
nested: addChild(nested),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Esta funcion aplana y busca los callback anidados de los hijos
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
const getCbFromNested = () =>
|
||||||
|
flatObject(Array.isArray(nested) ? nested : [nested])
|
||||||
|
|
||||||
const callback = typeof cb === 'function' ? cb : () => null
|
const callback = typeof cb === 'function' ? cb : () => null
|
||||||
|
|
||||||
@@ -59,12 +80,12 @@ const addAnswer =
|
|||||||
},
|
},
|
||||||
])
|
])
|
||||||
|
|
||||||
const callbacks = [].concat(inCtx.callbacks).concat([
|
getCbFromNested()
|
||||||
{
|
const callbacks = {
|
||||||
ref: lastCtx.ref,
|
...inCtx.callbacks,
|
||||||
callback,
|
...getCbFromNested(),
|
||||||
},
|
[ref]: callback,
|
||||||
])
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...lastCtx,
|
...lastCtx,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@bot-whatsapp/bot",
|
"name": "@bot-whatsapp/bot",
|
||||||
"version": "0.0.27-alpha.0",
|
"version": "0.0.28-alpha.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "./lib/bundle.bot.cjs",
|
"main": "./lib/bundle.bot.cjs",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -3,14 +3,23 @@ const commonjs = require('@rollup/plugin-commonjs')
|
|||||||
const { nodeResolve } = require('@rollup/plugin-node-resolve')
|
const { nodeResolve } = require('@rollup/plugin-node-resolve')
|
||||||
const { join } = require('path')
|
const { join } = require('path')
|
||||||
|
|
||||||
const PATH = join(__dirname, 'lib', 'bundle.bot.cjs')
|
module.exports = [
|
||||||
|
{
|
||||||
module.exports = {
|
input: join(__dirname, 'index.js'),
|
||||||
input: join(__dirname, 'index.js'),
|
output: {
|
||||||
output: {
|
banner: banner['banner.output'].join(''),
|
||||||
banner: banner['banner.output'].join(''),
|
file: join(__dirname, 'lib', 'bundle.bot.cjs'),
|
||||||
file: PATH,
|
format: 'cjs',
|
||||||
format: 'cjs',
|
},
|
||||||
|
plugins: [commonjs(), nodeResolve()],
|
||||||
},
|
},
|
||||||
plugins: [commonjs(), nodeResolve()],
|
{
|
||||||
}
|
input: join(__dirname, 'index.js'),
|
||||||
|
output: {
|
||||||
|
banner: banner['banner.output'].join(''),
|
||||||
|
file: join(__dirname, 'lib', 'bundle.bot.cjs'),
|
||||||
|
format: 'cjs',
|
||||||
|
},
|
||||||
|
plugins: [commonjs(), nodeResolve()],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ const {
|
|||||||
} = require('../index')
|
} = require('../index')
|
||||||
|
|
||||||
class MockFlow {
|
class MockFlow {
|
||||||
allCallbacks = [{ callback: () => console.log('') }]
|
allCallbacks = { ref: () => 1 }
|
||||||
flowSerialize = []
|
flowSerialize = []
|
||||||
flowRaw = []
|
flowRaw = []
|
||||||
find = (arg) => {
|
find = (arg) => {
|
||||||
|
|||||||
25
packages/bot/utils/flattener.js
Normal file
25
packages/bot/utils/flattener.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
const flatObject = (listArray = []) => {
|
||||||
|
const cbNestedList = Array.isArray(listArray) ? listArray : []
|
||||||
|
|
||||||
|
if (!listArray.length) return {}
|
||||||
|
|
||||||
|
const cbNestedObj = cbNestedList
|
||||||
|
.map(({ ctx }) => ctx?.callbacks)
|
||||||
|
.filter((i) => !!i)
|
||||||
|
const queueCb = cbNestedObj.reduce((acc, current) => {
|
||||||
|
const getKeys = Object.keys(current)
|
||||||
|
const parse = getKeys.map((icb, i) => ({
|
||||||
|
[icb]: Object.values(current)[i],
|
||||||
|
}))
|
||||||
|
return [...acc, ...parse]
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const flatObj = {}
|
||||||
|
for (const iteration of queueCb) {
|
||||||
|
const [keyCb] = Object.keys(iteration)
|
||||||
|
flatObj[keyCb] = iteration[keyCb]
|
||||||
|
}
|
||||||
|
return flatObj
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { flatObject }
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@bot-whatsapp/cli",
|
"name": "@bot-whatsapp/cli",
|
||||||
"version": "0.0.34-alpha.0",
|
"version": "0.0.35-alpha.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "create-bot-whatsapp",
|
"name": "create-bot-whatsapp",
|
||||||
"version": "0.0.45-alpha.0",
|
"version": "0.0.46-alpha.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "./lib/bundle.create-bot-whatsapp.cjs",
|
"main": "./lib/bundle.create-bot-whatsapp.cjs",
|
||||||
"files": [
|
"files": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@bot-whatsapp/database",
|
"name": "@bot-whatsapp/database",
|
||||||
"version": "0.0.26-alpha.0",
|
"version": "0.0.27-alpha.0",
|
||||||
"description": "Esto es el conector a mysql, pg, mongo",
|
"description": "Esto es el conector a mysql, pg, mongo",
|
||||||
"main": "./lib/mock/index.cjs",
|
"main": "./lib/mock/index.cjs",
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-named-instance: 'Regular';
|
font-named-instance: 'Regular';
|
||||||
src: url('../fonts/Inter-roman-latin.var.woff2') format('woff2');
|
src: url('../fonts/Inter-roman-latin.var.woff2') format('woff2');
|
||||||
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
@@ -14,6 +15,7 @@
|
|||||||
font-style: italic;
|
font-style: italic;
|
||||||
font-named-instance: 'Italic';
|
font-named-instance: 'Italic';
|
||||||
src: url('../fonts/Inter-italic-latin.var.woff2') format('woff2');
|
src: url('../fonts/Inter-italic-latin.var.woff2') format('woff2');
|
||||||
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
@@ -22,6 +24,7 @@
|
|||||||
font-style: normal;
|
font-style: normal;
|
||||||
src: url('../fonts/FiraCode-VF.woff2') format('woff2-variations'),
|
src: url('../fonts/FiraCode-VF.woff2') format('woff2-variations'),
|
||||||
url('../fonts/FiraCode-VF.woff') format('woff-variations');
|
url('../fonts/FiraCode-VF.woff') format('woff-variations');
|
||||||
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.font-mono {
|
.font-mono {
|
||||||
@@ -34,6 +37,7 @@
|
|||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url('../fonts/SourceSansPro-Regular.otf') format('opentype');
|
src: url('../fonts/SourceSansPro-Regular.otf') format('opentype');
|
||||||
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
@@ -41,4 +45,5 @@
|
|||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
src: url('../fonts/Ubuntu-Mono-bold.woff2') format('woff2');
|
src: url('../fonts/Ubuntu-Mono-bold.woff2') format('woff2');
|
||||||
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Bienvenido al proyecto! Estamos emocionados de tenerte a bordo y esperamos traba
|
|||||||
|
|
||||||
Deseamos que te sientas cómodo y que puedas aportar tu valioso conocimiento y habilidades.
|
Deseamos que te sientas cómodo y que puedas aportar tu valioso conocimiento y habilidades.
|
||||||
|
|
||||||
Recuerda que si tienes alguna inquietud, o simplemente deseas interactuar con los otros colaboradores puedes unirte a la comunidad.
|
Recuerda que si tienes alguna inquietud, o simplemente deseas interactuar con los otros colaboradores puedes unirte a la comunidad.
|
||||||
|
|
||||||
## Ventajas al unirme
|
## Ventajas al unirme
|
||||||
|
|
||||||
@@ -14,12 +14,11 @@ Al unirte te estará brindando la oportunidad de **adquirir experiencia en el de
|
|||||||
|
|
||||||
La visibilidad es uno de los puntos que más se requieren hoy en día, al unirte se te brinda la oportunidad de **mayor visibilidad en la comunidad de desarrolladores y de demostrar tus habilidades**. Esto puede ayudarte a encontrar oportunidades de trabajo o a colaborar con otros proyectos.
|
La visibilidad es uno de los puntos que más se requieren hoy en día, al unirte se te brinda la oportunidad de **mayor visibilidad en la comunidad de desarrolladores y de demostrar tus habilidades**. Esto puede ayudarte a encontrar oportunidades de trabajo o a colaborar con otros proyectos.
|
||||||
|
|
||||||
Colaboración con otros desarrolladores de todo el mundo y **trabajar juntos para mejorar el proyecto** Al trabajar en equipo y colaborar con otros, podrás mejorar tu comunicación, resolución de problemas y liderazgo, habilidades que cada vez son más demandadas en el entorno laboral.
|
Colaboración con otros desarrolladores de todo el mundo y **trabajar juntos para mejorar el proyecto** Al trabajar en equipo y colaborar con otros, podrás mejorar tu comunicación, resolución de problemas y liderazgo, habilidades que cada vez son más demandadas en el entorno laboral.
|
||||||
|
|
||||||
Contribución al bien común Participar en un proyecto de código abierto te permite contribuir a la comunidad y a la sociedad en general, ya que el código abierto es accesible y utilizable por cualquier persona. **Esto puede ser muy gratificante y sentirte parte de algo más grande**.
|
Contribución al bien común Participar en un proyecto de código abierto te permite contribuir a la comunidad y a la sociedad en general, ya que el código abierto es accesible y utilizable por cualquier persona. **Esto puede ser muy gratificante y sentirte parte de algo más grande**.
|
||||||
|
|
||||||
Es una excelente manera de incrementar tus habilidades tecnológicas y **estar al tanto de las últimas tendencias y desarrollos en el mundo del software**. Al trabajar con otros desarrolladores y contribuir a proyectos de código abierto, tendrás la oportunidad de **aprender y practicar nuevas tecnologías y metodologías, lo que te ayudará a mejorar tus habilidades y a mantenerte actualizado en el mundo en constante cambio de la tecnología.
|
Es una excelente manera de incrementar tus habilidades tecnológicas y **estar al tanto de las últimas tendencias y desarrollos en el mundo del software**. Al trabajar con otros desarrolladores y contribuir a proyectos de código abierto, tendrás la oportunidad de \*\*aprender y practicar nuevas tecnologías y metodologías, lo que te ayudará a mejorar tus habilidades y a mantenerte actualizado en el mundo en constante cambio de la tecnología.
|
||||||
|
|
||||||
|
|
||||||
Esperamos que estés listo para **unirte a nosotros en esta emocionante aventura**
|
Esperamos que estés listo para **unirte a nosotros en esta emocionante aventura**
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@bot-whatsapp/provider",
|
"name": "@bot-whatsapp/provider",
|
||||||
"version": "0.0.32-alpha.0",
|
"version": "0.0.33-alpha.0",
|
||||||
"description": "Esto es el conector a Twilio, Meta, etc...",
|
"description": "Esto es el conector a Twilio, Meta, etc...",
|
||||||
"main": "./lib/mock/index.cjs",
|
"main": "./lib/mock/index.cjs",
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
const { EventEmitter } = require('node:events')
|
const { EventEmitter } = require('node:events')
|
||||||
const polka = require('polka')
|
const polka = require('polka')
|
||||||
const { urlencoded } = require('body-parser')
|
const { urlencoded, json } = require('body-parser')
|
||||||
|
|
||||||
class MetaWebHookServer extends EventEmitter {
|
class MetaWebHookServer extends EventEmitter {
|
||||||
metaServer
|
metaServer
|
||||||
@@ -8,9 +8,11 @@ class MetaWebHookServer extends EventEmitter {
|
|||||||
token
|
token
|
||||||
constructor(_token, _metaPort) {
|
constructor(_token, _metaPort) {
|
||||||
super()
|
super()
|
||||||
this.metaServer = this.buildHTTPServer()
|
this.metaServer = polka()
|
||||||
this.metaPort = _metaPort
|
this.metaPort = _metaPort
|
||||||
this.token = _token
|
this.token = _token
|
||||||
|
|
||||||
|
this.buildHTTPServer()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -21,12 +23,18 @@ class MetaWebHookServer extends EventEmitter {
|
|||||||
*/
|
*/
|
||||||
incomingMsg = (req, res) => {
|
incomingMsg = (req, res) => {
|
||||||
const { body } = req
|
const { body } = req
|
||||||
const message = body.entry[0].changes[0].value.messages[0]
|
|
||||||
|
const messages = body.entry[0].changes[0].value?.messages
|
||||||
|
|
||||||
|
if (!messages) return
|
||||||
|
|
||||||
|
const [message] = messages
|
||||||
const to = body.entry[0].changes[0].value.metadata.display_phone_number
|
const to = body.entry[0].changes[0].value.metadata.display_phone_number
|
||||||
|
|
||||||
this.emit('message', {
|
this.emit('message', {
|
||||||
from: message.from,
|
from: message.from,
|
||||||
to,
|
to,
|
||||||
body: message.text.body,
|
body: message.text?.body,
|
||||||
})
|
})
|
||||||
const json = JSON.stringify({ body })
|
const json = JSON.stringify({ body })
|
||||||
res.end(json)
|
res.end(json)
|
||||||
@@ -55,16 +63,16 @@ class MetaWebHookServer extends EventEmitter {
|
|||||||
const challenge = query['hub.challenge']
|
const challenge = query['hub.challenge']
|
||||||
|
|
||||||
if (!mode || !token) {
|
if (!mode || !token) {
|
||||||
return res.sendStatus(403)
|
return (res.statusCode = 403), res.end('No token!')
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.tokenIsValid(mode, token)) {
|
if (this.tokenIsValid(mode, token)) {
|
||||||
console.log('Webhook verified--->😎😎😎😎')
|
console.log('Webhook verified--->😎😎😎😎')
|
||||||
res.status(200).send(challenge)
|
return (res.statusCode = 200), res.end(challenge)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.tokenIsValid(mode, token)) {
|
if (!this.tokenIsValid(mode, token)) {
|
||||||
res.sendStatus(403)
|
return (res.statusCode = 403), res.end('No token!')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,12 +81,13 @@ class MetaWebHookServer extends EventEmitter {
|
|||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
buildHTTPServer = () => {
|
buildHTTPServer = () => {
|
||||||
polka()
|
this.metaServer
|
||||||
.use(urlencoded({ extended: true }))
|
.use(urlencoded({ extended: true }))
|
||||||
.get('/webhook', this.verifyToken)
|
.get('/webhook', this.verifyToken)
|
||||||
|
|
||||||
return polka()
|
this.metaServer
|
||||||
.use(urlencoded({ extended: true }))
|
.use(urlencoded({ extended: true }))
|
||||||
|
.use(json())
|
||||||
.post('/webhook', this.incomingMsg)
|
.post('/webhook', this.incomingMsg)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,7 +100,7 @@ class MetaWebHookServer extends EventEmitter {
|
|||||||
console.log(``)
|
console.log(``)
|
||||||
console.log(`[meta]: Agregar esta url "WHEN A MESSAGE COMES IN"`)
|
console.log(`[meta]: Agregar esta url "WHEN A MESSAGE COMES IN"`)
|
||||||
console.log(
|
console.log(
|
||||||
`[meta]: POST http://localhost:${this.metaPort}/meta-hook`
|
`[meta]: POST http://localhost:${this.metaPort}/webhook`
|
||||||
)
|
)
|
||||||
console.log(`[meta]: Más información en la documentacion`)
|
console.log(`[meta]: Más información en la documentacion`)
|
||||||
console.log(``)
|
console.log(``)
|
||||||
|
|||||||
34
starters/apps/base-meta-json/README.md
Normal file
34
starters/apps/base-meta-json/README.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
### CHATBOT Whatsapp
|
||||||
|
|
||||||
|
Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos.
|
||||||
|
|
||||||
|
Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde:
|
||||||
|
- Bienvenido a mi tienda
|
||||||
|
- ¿Como puedo ayudarte?
|
||||||
|
- Tengo: Zapatos, Bolsos etc..
|
||||||
|
|
||||||
|
__Iniciar__
|
||||||
|
|
||||||
|
Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo:
|
||||||
|
|
||||||
|
Menu Principal
|
||||||
|
- SubMenu 1
|
||||||
|
- Submenu 1.1
|
||||||
|
- Submenu 2
|
||||||
|
- Submenu 2.1
|
||||||
|
|
||||||
|
Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose)
|
||||||
|
|
||||||
|
------
|
||||||
|
> ¿Quieres se parte de este proyecto?
|
||||||
|
> - [Discord](https://link.codigoencasa.com/DISCORD)
|
||||||
|
> - [Twitter](https://twitter.com/leifermendez)
|
||||||
|
> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR)
|
||||||
|
> - [Telegram](https://t.me/leifermendez)
|
||||||
95
starters/apps/base-meta-json/app.js
Normal file
95
starters/apps/base-meta-json/app.js
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
const {
|
||||||
|
createBot,
|
||||||
|
createProvider,
|
||||||
|
createFlow,
|
||||||
|
addKeyword,
|
||||||
|
addChild,
|
||||||
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
|
const MetaProvider = require('@bot-whatsapp/provider/meta')
|
||||||
|
const JsonFileAdapter = require('@bot-whatsapp/database/json')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo:
|
||||||
|
*
|
||||||
|
* Menu Principal
|
||||||
|
* - SubMenu 1
|
||||||
|
* - Submenu 1.1
|
||||||
|
* - Submenu 2
|
||||||
|
* - Submenu 2.1
|
||||||
|
*
|
||||||
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
||||||
|
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
||||||
|
.addAnswer('y mas bolsos... bla bla')
|
||||||
|
|
||||||
|
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
||||||
|
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
||||||
|
.addAnswer('y algunas otras cosas.')
|
||||||
|
|
||||||
|
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
||||||
|
.addAnswer('🤯 Veo que elegiste zapatos')
|
||||||
|
.addAnswer('Tengo muchos zapatos...bla bla')
|
||||||
|
.addAnswer(
|
||||||
|
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowZapatos2)]
|
||||||
|
)
|
||||||
|
|
||||||
|
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
||||||
|
.addAnswer('🙌 Veo que elegiste bolsos')
|
||||||
|
.addAnswer('Tengo muchos bolsos...bla bla')
|
||||||
|
.addAnswer(
|
||||||
|
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowBolsos2)]
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declarando flujo principal
|
||||||
|
*/
|
||||||
|
|
||||||
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
|
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
||||||
|
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
||||||
|
.addAnswer(
|
||||||
|
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowBolsos), ...addChild(flowZapatos)]
|
||||||
|
)
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const adapterDB = new JsonFileAdapter()
|
||||||
|
const adapterFlow = createFlow([flowPrincipal])
|
||||||
|
|
||||||
|
const adapterProvider = createProvider(MetaProvider, {
|
||||||
|
jwtToken: 'jwtToken',
|
||||||
|
numberId: 'numberId',
|
||||||
|
verifyToken: 'verifyToken',
|
||||||
|
})
|
||||||
|
|
||||||
|
createBot({
|
||||||
|
flow: adapterFlow,
|
||||||
|
provider: adapterProvider,
|
||||||
|
database: adapterDB,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
||||||
22
starters/apps/base-meta-json/package.json
Normal file
22
starters/apps/base-meta-json/package.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"name": "bot-whatsapp-base-meta-json",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "app.js",
|
||||||
|
"scripts": {
|
||||||
|
"pre-copy": "cd .. && yarn run copy.lib base-meta-json",
|
||||||
|
"start": "node app.js"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"dependencies": {
|
||||||
|
"body-parser": "^1.20.1",
|
||||||
|
"polka": "^0.5.2",
|
||||||
|
"@bot-whatsapp/bot": "latest",
|
||||||
|
"@bot-whatsapp/cli": "latest",
|
||||||
|
"@bot-whatsapp/database": "latest",
|
||||||
|
"@bot-whatsapp/provider": "latest",
|
||||||
|
"axios": "^1.2.1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@ const {
|
|||||||
addChild,
|
addChild,
|
||||||
} = require('@bot-whatsapp/bot')
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
const TwilioProvider = require('@bot-whatsapp/provider/twilio')
|
const MetaProvider = require('@bot-whatsapp/provider/meta')
|
||||||
const MockAdapter = require('@bot-whatsapp/database/mock')
|
const MockAdapter = require('@bot-whatsapp/database/mock')
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -79,10 +79,10 @@ const main = async () => {
|
|||||||
const adapterDB = new MockAdapter()
|
const adapterDB = new MockAdapter()
|
||||||
const adapterFlow = createFlow([flowPrincipal])
|
const adapterFlow = createFlow([flowPrincipal])
|
||||||
|
|
||||||
const adapterProvider = createProvider(TwilioProvider, {
|
const adapterProvider = createProvider(MetaProvider, {
|
||||||
accountSid: 'YOUR_ACCOUNT_SID',
|
jwtToken: 'jwtToken',
|
||||||
authToken: 'YOUR_ACCOUNT_TOKEN',
|
numberId: 'numberId',
|
||||||
vendorNumber: '+14155238886',
|
verifyToken: 'verifyToken',
|
||||||
})
|
})
|
||||||
|
|
||||||
createBot({
|
createBot({
|
||||||
|
|||||||
@@ -14,7 +14,8 @@
|
|||||||
"@bot-whatsapp/bot": "latest",
|
"@bot-whatsapp/bot": "latest",
|
||||||
"@bot-whatsapp/cli": "latest",
|
"@bot-whatsapp/cli": "latest",
|
||||||
"@bot-whatsapp/database": "latest",
|
"@bot-whatsapp/database": "latest",
|
||||||
"@bot-whatsapp/provider": "latest"
|
"@bot-whatsapp/provider": "latest",
|
||||||
|
"axios": "^1.2.1"
|
||||||
},
|
},
|
||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
|
|||||||
34
starters/apps/base-meta-mongo/README.md
Normal file
34
starters/apps/base-meta-mongo/README.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
### CHATBOT Whatsapp
|
||||||
|
|
||||||
|
Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos.
|
||||||
|
|
||||||
|
Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde:
|
||||||
|
- Bienvenido a mi tienda
|
||||||
|
- ¿Como puedo ayudarte?
|
||||||
|
- Tengo: Zapatos, Bolsos etc..
|
||||||
|
|
||||||
|
__Iniciar__
|
||||||
|
|
||||||
|
Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo:
|
||||||
|
|
||||||
|
Menu Principal
|
||||||
|
- SubMenu 1
|
||||||
|
- Submenu 1.1
|
||||||
|
- Submenu 2
|
||||||
|
- Submenu 2.1
|
||||||
|
|
||||||
|
Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose)
|
||||||
|
|
||||||
|
------
|
||||||
|
> ¿Quieres se parte de este proyecto?
|
||||||
|
> - [Discord](https://link.codigoencasa.com/DISCORD)
|
||||||
|
> - [Twitter](https://twitter.com/leifermendez)
|
||||||
|
> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR)
|
||||||
|
> - [Telegram](https://t.me/leifermendez)
|
||||||
106
starters/apps/base-meta-mongo/app.js
Normal file
106
starters/apps/base-meta-mongo/app.js
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
const {
|
||||||
|
createBot,
|
||||||
|
createProvider,
|
||||||
|
createFlow,
|
||||||
|
addKeyword,
|
||||||
|
addChild,
|
||||||
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
|
const MetaProvider = require('@bot-whatsapp/provider/meta')
|
||||||
|
const MongoAdapter = require('@bot-whatsapp/database/mongo')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declaramos las conexiones de Mongo
|
||||||
|
*/
|
||||||
|
|
||||||
|
const MONGO_DB_URI = 'mongodb://0.0.0.0:27017'
|
||||||
|
const MONGO_DB_NAME = 'db_bot'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo:
|
||||||
|
*
|
||||||
|
* Menu Principal
|
||||||
|
* - SubMenu 1
|
||||||
|
* - Submenu 1.1
|
||||||
|
* - Submenu 2
|
||||||
|
* - Submenu 2.1
|
||||||
|
*
|
||||||
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
||||||
|
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
||||||
|
.addAnswer('y mas bolsos... bla bla')
|
||||||
|
|
||||||
|
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
||||||
|
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
||||||
|
.addAnswer('y algunas otras cosas.')
|
||||||
|
|
||||||
|
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
||||||
|
.addAnswer('🤯 Veo que elegiste zapatos')
|
||||||
|
.addAnswer('Tengo muchos zapatos...bla bla')
|
||||||
|
.addAnswer(
|
||||||
|
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowZapatos2)]
|
||||||
|
)
|
||||||
|
|
||||||
|
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
||||||
|
.addAnswer('🙌 Veo que elegiste bolsos')
|
||||||
|
.addAnswer('Tengo muchos bolsos...bla bla')
|
||||||
|
.addAnswer(
|
||||||
|
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowBolsos2)]
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declarando flujo principal
|
||||||
|
*/
|
||||||
|
|
||||||
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
|
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
||||||
|
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
||||||
|
.addAnswer(
|
||||||
|
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowBolsos), ...addChild(flowZapatos)]
|
||||||
|
)
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const adapterDB = new MongoAdapter({
|
||||||
|
dbUri: MONGO_DB_URI,
|
||||||
|
dbName: MONGO_DB_NAME,
|
||||||
|
})
|
||||||
|
|
||||||
|
const adapterFlow = createFlow([flowPrincipal])
|
||||||
|
|
||||||
|
const adapterProvider = createProvider(MetaProvider, {
|
||||||
|
jwtToken: 'jwtToken',
|
||||||
|
numberId: 'numberId',
|
||||||
|
verifyToken: 'verifyToken',
|
||||||
|
})
|
||||||
|
|
||||||
|
createBot({
|
||||||
|
flow: adapterFlow,
|
||||||
|
provider: adapterProvider,
|
||||||
|
database: adapterDB,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
||||||
23
starters/apps/base-meta-mongo/package.json
Normal file
23
starters/apps/base-meta-mongo/package.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "bot-whatsapp-base-meta-mongo",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "app.js",
|
||||||
|
"scripts": {
|
||||||
|
"pre-copy": "cd .. && yarn run copy.lib base-meta-mongo",
|
||||||
|
"start": "node app.js"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"dependencies": {
|
||||||
|
"body-parser": "^1.20.1",
|
||||||
|
"polka": "^0.5.2",
|
||||||
|
"@bot-whatsapp/bot": "latest",
|
||||||
|
"@bot-whatsapp/cli": "latest",
|
||||||
|
"@bot-whatsapp/database": "latest",
|
||||||
|
"@bot-whatsapp/provider": "latest",
|
||||||
|
"axios": "^1.2.1",
|
||||||
|
"mongodb": "^4.12.1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
||||||
34
starters/apps/base-meta-mysql/README.md
Normal file
34
starters/apps/base-meta-mysql/README.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
### CHATBOT Whatsapp
|
||||||
|
|
||||||
|
Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos.
|
||||||
|
|
||||||
|
Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde:
|
||||||
|
- Bienvenido a mi tienda
|
||||||
|
- ¿Como puedo ayudarte?
|
||||||
|
- Tengo: Zapatos, Bolsos etc..
|
||||||
|
|
||||||
|
__Iniciar__
|
||||||
|
|
||||||
|
Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo:
|
||||||
|
|
||||||
|
Menu Principal
|
||||||
|
- SubMenu 1
|
||||||
|
- Submenu 1.1
|
||||||
|
- Submenu 2
|
||||||
|
- Submenu 2.1
|
||||||
|
|
||||||
|
Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose)
|
||||||
|
|
||||||
|
------
|
||||||
|
> ¿Quieres se parte de este proyecto?
|
||||||
|
> - [Discord](https://link.codigoencasa.com/DISCORD)
|
||||||
|
> - [Twitter](https://twitter.com/leifermendez)
|
||||||
|
> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR)
|
||||||
|
> - [Telegram](https://t.me/leifermendez)
|
||||||
108
starters/apps/base-meta-mysql/app.js
Normal file
108
starters/apps/base-meta-mysql/app.js
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
const {
|
||||||
|
createBot,
|
||||||
|
createProvider,
|
||||||
|
createFlow,
|
||||||
|
addKeyword,
|
||||||
|
addChild,
|
||||||
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
|
const MetaProvider = require('@bot-whatsapp/provider/meta')
|
||||||
|
const MySQLAdapter = require('@bot-whatsapp/database/mysql')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declaramos las conexiones de MySQL
|
||||||
|
*/
|
||||||
|
const MYSQL_DB_HOST = 'localhost'
|
||||||
|
const MYSQL_DB_USER = 'usr'
|
||||||
|
const MYSQL_DB_PASSWORD = 'pass'
|
||||||
|
const MYSQL_DB_NAME = 'bot'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo:
|
||||||
|
*
|
||||||
|
* Menu Principal
|
||||||
|
* - SubMenu 1
|
||||||
|
* - Submenu 1.1
|
||||||
|
* - Submenu 2
|
||||||
|
* - Submenu 2.1
|
||||||
|
*
|
||||||
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
||||||
|
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
||||||
|
.addAnswer('y mas bolsos... bla bla')
|
||||||
|
|
||||||
|
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
||||||
|
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
||||||
|
.addAnswer('y algunas otras cosas.')
|
||||||
|
|
||||||
|
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
||||||
|
.addAnswer('🤯 Veo que elegiste zapatos')
|
||||||
|
.addAnswer('Tengo muchos zapatos...bla bla')
|
||||||
|
.addAnswer(
|
||||||
|
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowZapatos2)]
|
||||||
|
)
|
||||||
|
|
||||||
|
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
||||||
|
.addAnswer('🙌 Veo que elegiste bolsos')
|
||||||
|
.addAnswer('Tengo muchos bolsos...bla bla')
|
||||||
|
.addAnswer(
|
||||||
|
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowBolsos2)]
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declarando flujo principal
|
||||||
|
*/
|
||||||
|
|
||||||
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
|
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
||||||
|
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
||||||
|
.addAnswer(
|
||||||
|
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowBolsos), ...addChild(flowZapatos)]
|
||||||
|
)
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const adapterDB = new MySQLAdapter({
|
||||||
|
host: MYSQL_DB_HOST,
|
||||||
|
user: MYSQL_DB_USER,
|
||||||
|
database: MYSQL_DB_NAME,
|
||||||
|
password: MYSQL_DB_PASSWORD,
|
||||||
|
})
|
||||||
|
const adapterFlow = createFlow([flowPrincipal])
|
||||||
|
|
||||||
|
const adapterProvider = createProvider(MetaProvider, {
|
||||||
|
jwtToken: 'jwtToken',
|
||||||
|
numberId: 'numberId',
|
||||||
|
verifyToken: 'verifyToken',
|
||||||
|
})
|
||||||
|
|
||||||
|
createBot({
|
||||||
|
flow: adapterFlow,
|
||||||
|
provider: adapterProvider,
|
||||||
|
database: adapterDB,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
||||||
23
starters/apps/base-meta-mysql/package.json
Normal file
23
starters/apps/base-meta-mysql/package.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "bot-whatsapp-base-meta-mysql",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "app.js",
|
||||||
|
"scripts": {
|
||||||
|
"pre-copy": "cd .. && yarn run copy.lib base-meta-mysql",
|
||||||
|
"start": "node app.js"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"dependencies": {
|
||||||
|
"body-parser": "^1.20.1",
|
||||||
|
"polka": "^0.5.2",
|
||||||
|
"@bot-whatsapp/bot": "latest",
|
||||||
|
"@bot-whatsapp/cli": "latest",
|
||||||
|
"@bot-whatsapp/database": "latest",
|
||||||
|
"@bot-whatsapp/provider": "latest",
|
||||||
|
"axios": "^1.2.1",
|
||||||
|
"mysql2": "^2.3.3"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user