UNPKG

skailan-conversations

Version:

Servicio de conversaciones y mensajería para Skailan

221 lines (213 loc) 8.58 kB
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