[🐬] generar un mensaje de bienvenida cada 24 horas
Surita-pixel opened this issue · comments
Reina Surita commented
¿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_
Leopoldo Crhistian Riverin Gomez commented
@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.