skailan-conversations
Version:
Servicio de conversaciones y mensajería para Skailan
221 lines (213 loc) • 8.58 kB
JavaScript
import { Message } from "../entities/Message";
import { v4 as uuidv4 } from "uuid";
export class TelegramSenderService {
telegramService;
messageRepository;
conversationRepository;
constructor(telegramService, messageRepository, conversationRepository) {
this.telegramService = telegramService;
this.messageRepository = messageRepository;
this.conversationRepository = conversationRepository;
}
/**
* Envía un mensaje de texto a Telegram y lo guarda en la base de datos
*/
async sendMessage(request) {
try {
console.log(`📤 Enviando mensaje de Telegram: "${request.text}" a chat ${request.chatId}`);
// Enviar mensaje a Telegram
const telegramResponse = await this.telegramService.sendMessage(request.chatId, request.text, request.options);
// Crear mensaje en la base de datos
const message = new Message(uuidv4(), request.organizationId, request.conversationId, "system", // senderType
"telegram_system", // senderId
"text", // type
request.text, // content
null, // mediaUrl
telegramResponse.message_id?.toString() || null, // externalMessageId
"sent", // status
new Date(), // timestamp
new Date() // createdAt
);
// Guardar mensaje en la base de datos
const savedMessage = await this.messageRepository.save(message);
console.log(`✅ Mensaje enviado y guardado: ${savedMessage.id}`);
// Actualizar lastMessageAt de la conversación
await this.updateConversationLastMessage(request.conversationId, request.organizationId);
return savedMessage;
}
catch (error) {
console.error("❌ Error enviando mensaje de Telegram:", error);
// Crear mensaje con estado de error
const errorMessage = new Message(uuidv4(), request.organizationId, request.conversationId, "system", "telegram_system", "text", request.text, null, // mediaUrl
null, // externalMessageId
"failed", new Date(), new Date());
await this.messageRepository.save(errorMessage);
throw error;
}
}
/**
* Envía un mensaje interactivo con botones a Telegram
*/
async sendInteractiveMessage(request) {
try {
console.log(`📤 Enviando mensaje interactivo a chat ${request.chatId}`);
// Enviar mensaje interactivo a Telegram
const telegramResponse = await this.telegramService.sendInteractiveMessage(request.chatId, request.text, request.buttons);
// Crear mensaje en la base de datos
const message = new Message(uuidv4(), request.organizationId, request.conversationId, "system", "telegram_system", "text", request.text, null, // mediaUrl
telegramResponse.message_id?.toString() || null, "sent", new Date(), new Date());
// Guardar mensaje en la base de datos
const savedMessage = await this.messageRepository.save(message);
console.log(`✅ Mensaje interactivo enviado y guardado: ${savedMessage.id}`);
// Actualizar lastMessageAt de la conversación
await this.updateConversationLastMessage(request.conversationId, request.organizationId);
return savedMessage;
}
catch (error) {
console.error("❌ Error enviando mensaje interactivo:", error);
throw error;
}
}
/**
* Responde a un callback query de Telegram
*/
async answerCallbackQuery(callbackQueryId, text) {
try {
console.log(`📤 Respondiendo callback query: ${callbackQueryId}`);
await this.telegramService.answerCallbackQuery(callbackQueryId, text);
console.log(`✅ Callback query respondido: ${callbackQueryId}`);
}
catch (error) {
console.error("❌ Error respondiendo callback query:", error);
throw error;
}
}
/**
* Envía una respuesta automática basada en el contenido del mensaje
*/
async sendAutoResponse(organizationId, conversationId, chatId, userMessage) {
try {
console.log(`🤖 Generando respuesta automática para: "${userMessage}"`);
// Aquí podrías integrar con el AI Service para generar respuestas inteligentes
let autoResponse = this.generateBasicResponse(userMessage);
// Enviar respuesta automática
const message = await this.sendMessage({
organizationId,
conversationId,
chatId,
text: autoResponse,
options: {
parse_mode: "HTML",
},
});
console.log(`✅ Respuesta automática enviada: "${autoResponse}"`);
return message;
}
catch (error) {
console.error("❌ Error enviando respuesta automática:", error);
throw error;
}
}
/**
* Envía un mensaje de bienvenida
*/
async sendWelcomeMessage(organizationId, conversationId, chatId, userName) {
const welcomeText = `
🤖 <b>¡Hola ${userName}!</b>
Bienvenido al sistema de atención al cliente de Skailan.
¿En qué puedo ayudarte hoy?
• 📞 <b>Soporte técnico</b>
• 💳 <b>Información de facturación</b>
• 📋 <b>Estado de pedidos</b>
• ❓ <b>Preguntas generales</b>
Escribe tu consulta y te responderé lo antes posible.
`.trim();
return this.sendMessage({
organizationId,
conversationId,
chatId,
text: welcomeText,
options: {
parse_mode: "HTML",
},
});
}
/**
* Envía un mensaje de despedida
*/
async sendGoodbyeMessage(organizationId, conversationId, chatId) {
const goodbyeText = `
👋 <b>¡Gracias por contactarnos!</b>
Ha sido un placer ayudarte. Si tienes más preguntas, no dudes en escribirnos.
¡Que tengas un excelente día!
`.trim();
return this.sendMessage({
organizationId,
conversationId,
chatId,
text: goodbyeText,
options: {
parse_mode: "HTML",
},
});
}
/**
* Envía un mensaje de error
*/
async sendErrorMessage(organizationId, conversationId, chatId, errorMessage) {
const errorText = `
⚠️ <b>Lo sentimos, ha ocurrido un error</b>
${errorMessage}
Por favor, intenta nuevamente o contacta a soporte técnico.
`.trim();
return this.sendMessage({
organizationId,
conversationId,
chatId,
text: errorText,
options: {
parse_mode: "HTML",
},
});
}
/**
* Genera una respuesta básica basada en palabras clave
*/
generateBasicResponse(userMessage) {
const message = userMessage.toLowerCase();
if (message.includes("hola") ||
message.includes("buenos días") ||
message.includes("buenas")) {
return "¡Hola! ¿En qué puedo ayudarte hoy?";
}
if (message.includes("gracias") || message.includes("thank you")) {
return "¡De nada! Estoy aquí para ayudarte.";
}
if (message.includes("adiós") ||
message.includes("chao") ||
message.includes("bye")) {
return "¡Hasta luego! Que tengas un excelente día.";
}
if (message.includes("ayuda") || message.includes("help")) {
return "Estoy aquí para ayudarte. ¿Qué necesitas?";
}
// Respuesta por defecto
return "Entiendo tu mensaje. Un agente humano te responderá pronto.";
}
/**
* Actualiza el lastMessageAt de la conversación
*/
async updateConversationLastMessage(conversationId, organizationId) {
try {
const conversation = await this.conversationRepository.findById(conversationId, organizationId);
if (conversation) {
conversation.lastMessageAt = new Date();
await this.conversationRepository.save(conversation);
}
}
catch (error) {
console.error("❌ Error actualizando lastMessageAt de conversación:", error);
}
}
}
//# sourceMappingURL=TelegramSenderService.js.map