codigoencasa / builderbot

🤖 Crear Chatbot WhatsApp en minutos. Únete a este proyecto OpenSource

Home Page:https://www.builderbot.app

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[🐬] generar un mensaje de bienvenida cada 24 horas

Surita-pixel opened this issue · comments

¿Cual proveedor usaste?

whatsapp-web.js

¿Cual base de datos usaste?

memory

Conclusion de la prueba

muy buena

Describe tu caso

tengo el codigo donde reacciona a chatwoot, lo importante es acá

const flowPrincipal = addKeyword(['']).addAction(
    async (ctx, { flowDynamic }) => {
        try {
            const MESSAGE = "hi, welcome to vivemed";
            await sendMessageChatWood(MESSAGE, 'incoming',ctx);
            await flowDynamic(MESSAGE);
        } catch (e) {
            console.log(`error en app.js: ${e}`)
        }
    }
);

quisiera poder hacer que si el usuario escribe algun mensaje en un lapso de 24 horas no lo vuelva a saludar sino que siga otro flujo por ejemplo

¿Logs Importantes?

No response

Información Adicional

así se ve el web hook, por si alguno quiere saber más

chatwoot-hook.js

const { createReadStream } = require('fs')
const { join } = require('path')
const express = require('express')
const router = express.Router()

const chatWoodWook = async (req, res) => {
  const providerWs = req.providerWs;
  const body = req.body
  if (body?.private) {
    res.send(null)
    return
  }
  
  const phone = body?.conversation?.meta?.sender?.phone_number.replace('+', '')
  await providerWs.sendText(`${phone}@c.us`, body.content)
  res.send(body)
}
router.post('/chatwood-hook', chatWoodWook)
router.get("/get-qr", async (_, res) => {
  const YOUR_PATH_QR = join(process.cwd(), `bot.qr.png`);
  const fileStream = createReadStream(YOUR_PATH_QR);

  res.writeHead(200, { "Content-Type": "image/png" });
  fileStream.pipe(res);
});

module.exports = router 

chatwoot.js

const client = require('../database/database');
const {API_CHATWOOD, headers} =require('../constantes')

const sendMessageChatWood = async (msg = "", message_type = "", ctx) => {
    try {
        // Consultar la base de datos para obtener información del contacto
        const contactQuery = {
            text: 'SELECT * FROM contacts WHERE phone_number = $1',
            values: [`+${ctx.from}`]    
        };
        let contactResult = await client.query(contactQuery);
        let contacto = contactResult.rows.length > 0 ? contactResult.rows[0] : null;
        if (!contacto) {
            let insertQuery = { 
                text: 'INSERT INTO contacts(name, phone_number, account_id, created_at, updated_at) VALUES ($1, $2, $3, NOW(), NOW())',
                values: [`${ctx.pushName}`, `+${ctx.from}`, 1],
            };
            const result = await client.query(insertQuery);
            console.log('Se insertó correctamente:', result);
            contactResult = await client.query(contactQuery);
            contacto = contactResult.rows.length > 0 ? contactResult.rows[0] : null;
        } else {
            console.log(contacto)
        }

        console.log('Información encontrada para el número de teléfono:', ctx.from);

        // Preparar el cuerpo de la solicitud para enviar a ChatWood
        let mensajeEnviar
       
        let requestBody = {
            content: ctx.message.conversation,
            message_type: 'outgoing',
            private: true,
            content_attributes: {},
        };
        console.log(requestBody)

        // Configurar las opciones de la solicitud HTTP
        const requestOptions = {
            method: "POST",
            headers,
            body: JSON.stringify(requestBody),
        };


        // Consultar la base de datos para obtener información de la conversación
        const conversationQuery = {
            text: "SELECT * FROM conversations WHERE contact_id = $1 LIMIT 1",

            values: [contacto.id]
        };

        let conversationResult = await client.query(conversationQuery);
        let conversation = conversationResult.rows.length > 0 ? conversationResult.rows[0] : null;

        if (!conversation) {
            let createConversationBody = {
                inbox_id: "5", // Ajusta según tu necesidad
                contact_id: contacto.id,
                status: "open",
            };

            // Configurar las opciones de la solicitud HTTP para crear la conversación
            const createConversationRequestOptions = {
                method: "POST",
                headers,
                body: JSON.stringify(createConversationBody),
            };

            // Hacer la solicitud para crear una nueva conversación
            const createConversationUrl = `${API_CHATWOOD}api/v1/accounts/1/conversations`;
            const createConversationDataRaw = await fetch(createConversationUrl, createConversationRequestOptions);

            if (!createConversationDataRaw.ok) {
                throw new Error(`${createConversationDataRaw.statusText}`);
            }

            const createConversationData = await createConversationDataRaw.json();
            

            // Utilizar la información de la conversación creada

            conversationResult = await client.query(conversationQuery);
            conversation = conversationResult.rows.length > 0 ? conversationResult.rows[0] : null
        }

        // Enviar el mensaje a ChatWood
        const apiUrl = `${API_CHATWOOD}api/v1/accounts/1/conversations/${conversation.display_id}/messages`;
        const dataRaw = await fetch(apiUrl, requestOptions);

        if (!dataRaw.ok) {
            const todasC = await client.query({ text: 'select * from conversations' })
            console.log(todasC.rows)
            throw new Error(`${dataRaw.statusText}`);
        }

        const data = await dataRaw.json();
        return data;

    } catch (error) {
        console.error('Error durante la solicitud:', error.message);
        // Puedes decidir qué hacer en caso de error, como lanzar una excepción, retornar un valor predeterminado o realizar alguna otra acción de manejo de errores.
    }
};
module.exports = sendMessageChatWood

¿Quieres que te mencionemos?

twitter: @Reinahoe_

@Surita-pixel puedes utilizar el state para asignarle un step al usuario, y en tu flujo inicial que tiene a EVENTS.WELCOME, pasarle una validación que revise si el step esta en un valor determinado.

const flowPreMain = addKeyword(EVENTS.WELCOME)
    .addAction(
        async (ctx, { gotoFlow, state, endFlow }) => {
            const customerObject = {
                name: ctx.pushName,
                phone: ctx.from
            };
            state.update(customerObject);
            const chatState = state.getMyState();
            
            if (chatState.step === '1') { // Si el usuario ya esta registrado y se le asigno un step en un flujo posterior
                return gotoFlow('un flow especifico a donde quieras redirigir la conversacion');
            } else {
                return endFlow();
            }
        }
    )
    ```
    Por favor confirma si la respuesta satisface tu consulta, para que pueda cerrar el issue.