const axios = require('axios'); class TelegramService { constructor() { this.botToken = process.env.TELEGRAM_BOT_TOKEN; this.chatId = process.env.TELEGRAM_CHAT_ID; this.baseUrl = `https://api.telegram.org/bot${this.botToken}`; this.isEnabled = !!(this.botToken && this.chatId); } async sendMessage(text, options = {}) { if (!this.isEnabled) { console.warn('Telegram bot is not configured. Missing TELEGRAM_BOT_TOKEN or TELEGRAM_CHAT_ID'); return { success: false, message: 'Telegram bot not configured' }; } try { const response = await axios.post(`${this.baseUrl}/sendMessage`, { chat_id: this.chatId, text: text, parse_mode: 'HTML', ...options }); return { success: true, data: response.data }; } catch (error) { console.error('Telegram send message error:', error.response?.data || error.message); return { success: false, error: error.message }; } } async sendContactNotification(contact) { const message = this.formatContactMessage(contact); return await this.sendMessage(message); } async sendNewContactAlert(contact) { const message = `🔔 Новый запрос с сайта!\n\n` + `👤 Клиент: ${contact.name}\n` + `📧 Email: ${contact.email}\n` + `📱 Телефон: ${contact.phone || 'Не указан'}\n` + `💼 Услуга: ${contact.serviceInterest || 'Общий запрос'}\n` + `💰 Бюджет: ${contact.budget || 'Не указан'}\n` + `⏱️ Сроки: ${contact.timeline || 'Не указаны'}\n\n` + `💬 Сообщение:\n${contact.message}\n\n` + `🕐 Время: ${new Date(contact.createdAt).toLocaleString('ru-RU')}\n\n` + `🔗 Открыть в админ-панели`; return await this.sendMessage(message); } async sendPortfolioNotification(portfolio) { const message = `📁 Новый проект добавлен в портфолио\n\n` + `🏷️ Название: ${portfolio.title}\n` + `📂 Категория: ${portfolio.category}\n` + `👤 Клиент: ${portfolio.clientName || 'Не указан'}\n` + `🌐 URL: ${portfolio.projectUrl || 'Не указан'}\n` + `⭐ Рекомендуемый: ${portfolio.featured ? 'Да' : 'Нет'}\n` + `📅 Время: ${new Date(portfolio.createdAt).toLocaleString('ru-RU')}\n\n` + `🔗 Посмотреть проект`; return await this.sendMessage(message); } async sendServiceNotification(service) { const message = `⚙️ Новая услуга добавлена\n\n` + `🏷️ Название: ${service.name}\n` + `📂 Категория: ${service.category}\n` + `💰 Стоимость: ${service.pricing?.basePrice ? `от $${service.pricing.basePrice}` : 'По запросу'}\n` + `⏱️ Время выполнения: ${service.estimatedTime || 'Не указано'}\n` + `⭐ Рекомендуемая: ${service.featured ? 'Да' : 'Нет'}\n` + `📅 Время: ${new Date(service.createdAt).toLocaleString('ru-RU')}\n\n` + `🔗 Посмотреть услуги`; return await this.sendMessage(message); } async sendCalculatorQuote(calculatorData) { const totalCost = calculatorData.services?.reduce((sum, service) => sum + (service.price || 0), 0) || 0; const message = `💰 Новый расчет стоимости\n\n` + `👤 Клиент: ${calculatorData.name || 'Не указан'}\n` + `📧 Email: ${calculatorData.email || 'Не указан'}\n` + `📱 Телефон: ${calculatorData.phone || 'Не указан'}\n\n` + `🛠️ Выбранные услуги:\n${this.formatServices(calculatorData.services)}\n` + `💵 Общая стоимость: $${totalCost}\n\n` + `📅 Время: ${new Date().toLocaleString('ru-RU')}`; return await this.sendMessage(message); } formatContactMessage(contact) { return `📞 Уведомление о контакте\n\n` + `👤 Клиент: ${contact.name}\n` + `📧 Email: ${contact.email}\n` + `📱 Телефон: ${contact.phone || 'Не указан'}\n` + `💼 Услуга: ${contact.serviceInterest || 'Общий запрос'}\n` + `📊 Статус: ${this.getStatusText(contact.status)}\n` + `⚡ Приоритет: ${this.getPriorityText(contact.priority)}\n\n` + `💬 Сообщение:\n${contact.message}\n\n` + `🔗 Открыть в админ-панели`; } formatServices(services) { if (!services || services.length === 0) return 'Не выбрано'; return services.map(service => `• ${service.name} - $${service.price || 0}` ).join('\n'); } getStatusText(status) { const statusMap = { 'new': '🆕 Новое', 'in_progress': '⏳ В работе', 'completed': '✅ Завершено' }; return statusMap[status] || status; } getPriorityText(priority) { const priorityMap = { 'low': '🟢 Низкий', 'medium': '🟡 Средний', 'high': '🔴 Высокий' }; return priorityMap[priority] || priority; } // Test connection async testConnection() { if (!this.isEnabled) { return { success: false, message: 'Telegram bot not configured' }; } try { const response = await axios.get(`${this.baseUrl}/getMe`); return { success: true, bot: response.data.result }; } catch (error) { console.error('Telegram connection test error:', error.response?.data || error.message); return { success: false, error: error.message }; } } // Webhook setup (for future use) async setWebhook(webhookUrl) { if (!this.isEnabled) { return { success: false, message: 'Telegram bot not configured' }; } try { const response = await axios.post(`${this.baseUrl}/setWebhook`, { url: webhookUrl }); return { success: true, data: response.data }; } catch (error) { console.error('Telegram webhook setup error:', error.response?.data || error.message); return { success: false, error: error.message }; } } } module.exports = new TelegramService();