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}`);
    });