Primeros pasos
@bot/provider
Avanzado
Comunidad
State
Algunas veces queremos mantener un state
o contexto
por usuario que nos escribe y poder compartir esta informacion con todos nuestros flujos.
Esto tambien funciona si usas gotoFlow
const flujoPrincipal = addKeyword(['hola'])
.addAnswer(
'¿Cual es tu nombre?',
{
capture: true,
},
async (ctx, { flowDynamic, state }) => {
await state.update({ name: ctx.body })
flowDynamic('Gracias por tu nombre!')
}
)
.addAnswer(
'¿Cual es tu edad?',
{
capture: true,
},
async (ctx, { flowDynamic, state }) => {
await state.update({ age: ctx.body })
const myState = state.getMyState()
await flowDynamic(`Gracias por tu edad! ${myState.name}`)
}
)
.addAnswer('Tus datos son:', null, async (_, { flowDynamic, state }) => {
const myState = state.getMyState()
flowDynamic(`Nombre: ${myState.name} Edad: ${myState.age}`)
})
.addAnswer('🤖🤖 Gracias por tu participacion')
state.get('prop')
De esta manera puedes recuperar el valor de una propiedad del estado
...
.addAnswer(
'Tu edad es',
null,
async (ctx, { flowDynamic, state }) => {
const age = state.get('age')
await flowDynamic(`Edad: ${age}`)
}
)
...
GlobalState
De igual manera que el state
anterior nosotros podemos usar globalState
para tener un esta general de la app (NO es por usuario), esto es muy util si quieres ejemplo apagar o prender el bot
const flowOnOff = addKeyword(['onoff'])
.addAction(async (_, { flowDynamic, globalState }) => {
const currentGlobalState = globalState.getMyState();
if(currentGlobalState.encendido){
await globalState.update({encendido:false})
}else{
await globalState.update({encendido:true})
}
})
.addAnswer('🤖🤖 Gracias por tu participacion')
...
const flowWelcome = addKeyword(EVENTS.WELCOME)
.addAction((_, { endFlow, globalState }) => {
const currentGlobalState = globalState.getMyState();
if (!currentGlobalState.encendido) {
return endFlow();
}
})
...
createBot(
{
flow: adapterFlow,
provider: adapterProvider,
database: adapterDB,
},
{
globalState: {
encendido: true,
}
}
);
globalState.get('prop')
De esta manera puedes recuperar el valor de una propiedad del estado global
...
.addAnswer(
'La version del bot es',
null,
async (ctx, { flowDynamic, globalState }) => {
const version = globalState.get('version')
await flowDynamic(`Version: ${version}`)
}
)
...
Ejemplos
En este ejemplo, se utiliza el contexto para capturar y almacenar información proporcionada por el usuario en diferentes etapas del flujo de conversación. El método addAnswer se utiliza para hacer preguntas al usuario y capturar sus respuestas utilizando {capture: true}
. Luego, se utiliza state.update para actualizar el estado con la información capturada.
En la última respuesta, se utiliza state.get para obtener los valores almacenados en el estado y mostrarlos en la consola. Esto demuestra cómo se puede acceder a la información almacenada en el estado en diferentes partes del flujo de conversación.
Recuerda que estos son solo ejemplos básicos y puedes adaptarlos según tus necesidades específicas.
const flujo = addKeyword(['hola'])
.addAnswer('¿Cual es tu nombre?', {capture: true}, async (ctx, { state }) => {
await state.update({ name: ctx.body })
})
.addAnswer('¿Cual es tu edad?', {capture: true}, async (ctx, { state }) => {
await state.update({ age: ctx.body })
})
.addAnswer('¿Prefieres inglés o español?', {capture: true}, async (ctx, { state }) => {
await state.update({ language: ctx.body })
})
.addAnswer('¿Cuál es tu comida favorita?', {capture: true}, async (ctx, { state }) => {
await state.update({ favoriteFood: ctx.body })
})
.addAnswer('¡Gracias por la información!',null, async ({ state }) => {
const name = state.get('name');
const age = state.get('age');
const language = state.get('language');
const favoriteFood = state.get('favoriteFood');
console.log(`Nombre: ${name}`);
console.log(`Edad: ${age}`);
console.log(`Lenguaje preferido: ${language}`);
console.log(`Comida favorita: ${favoriteFood}`);
});
- 📄 Editar esta pagina
Forma parte de esta comunidad mejorando la documentación siente libre de poder agregar o editar lo que quieras