Files
sst_site/.history/services/telegram_20251021213227.js
2025-10-22 21:22:44 +09:00

163 lines
7.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 = `🔔 <b>Новый запрос с сайта!</b>\n\n` +
`👤 <b>Клиент:</b> ${contact.name}\n` +
`📧 <b>Email:</b> ${contact.email}\n` +
`📱 <b>Телефон:</b> ${contact.phone || 'Не указан'}\n` +
`💼 <b>Услуга:</b> ${contact.serviceInterest || 'Общий запрос'}\n` +
`💰 <b>Бюджет:</b> ${contact.budget || 'Не указан'}\n` +
`⏱️ <b>Сроки:</b> ${contact.timeline || 'Не указаны'}\n\n` +
`💬 <b>Сообщение:</b>\n${contact.message}\n\n` +
`🕐 <b>Время:</b> ${new Date(contact.createdAt).toLocaleString('ru-RU')}\n\n` +
`🔗 <a href="${process.env.BASE_URL || 'http://localhost:3000'}/admin/contacts/${contact.id}">Открыть в админ-панели</a>`;
return await this.sendMessage(message);
}
async sendPortfolioNotification(portfolio) {
const message = `📁 <b>Новый проект добавлен в портфолио</b>\n\n` +
`🏷️ <b>Название:</b> ${portfolio.title}\n` +
`📂 <b>Категория:</b> ${portfolio.category}\n` +
`👤 <b>Клиент:</b> ${portfolio.clientName || 'Не указан'}\n` +
`🌐 <b>URL:</b> ${portfolio.projectUrl || 'Не указан'}\n` +
`⭐ <b>Рекомендуемый:</b> ${portfolio.featured ? 'Да' : 'Нет'}\n` +
`📅 <b>Время:</b> ${new Date(portfolio.createdAt).toLocaleString('ru-RU')}\n\n` +
`🔗 <a href="${process.env.BASE_URL || 'http://localhost:3000'}/portfolio/${portfolio.id}">Посмотреть проект</a>`;
return await this.sendMessage(message);
}
async sendServiceNotification(service) {
const message = `⚙️ <b>Новая услуга добавлена</b>\n\n` +
`🏷️ <b>Название:</b> ${service.name}\n` +
`📂 <b>Категория:</b> ${service.category}\n` +
`💰 <b>Стоимость:</b> ${service.pricing?.basePrice ? `от $${service.pricing.basePrice}` : 'По запросу'}\n` +
`⏱️ <b>Время выполнения:</b> ${service.estimatedTime || 'Не указано'}\n` +
`⭐ <b>Рекомендуемая:</b> ${service.featured ? 'Да' : 'Нет'}\n` +
`📅 <b>Время:</b> ${new Date(service.createdAt).toLocaleString('ru-RU')}\n\n` +
`🔗 <a href="${process.env.BASE_URL || 'http://localhost:3000'}/services">Посмотреть услуги</a>`;
return await this.sendMessage(message);
}
async sendCalculatorQuote(calculatorData) {
const totalCost = calculatorData.services?.reduce((sum, service) => sum + (service.price || 0), 0) || 0;
const message = `💰 <b>Новый расчет стоимости</b>\n\n` +
`👤 <b>Клиент:</b> ${calculatorData.name || 'Не указан'}\n` +
`📧 <b>Email:</b> ${calculatorData.email || 'Не указан'}\n` +
`📱 <b>Телефон:</b> ${calculatorData.phone || 'Не указан'}\n\n` +
`🛠️ <b>Выбранные услуги:</b>\n${this.formatServices(calculatorData.services)}\n` +
`💵 <b>Общая стоимость:</b> $${totalCost}\n\n` +
`📅 <b>Время:</b> ${new Date().toLocaleString('ru-RU')}`;
return await this.sendMessage(message);
}
formatContactMessage(contact) {
return `📞 <b>Уведомление о контакте</b>\n\n` +
`👤 <b>Клиент:</b> ${contact.name}\n` +
`📧 <b>Email:</b> ${contact.email}\n` +
`📱 <b>Телефон:</b> ${contact.phone || 'Не указан'}\n` +
`💼 <b>Услуга:</b> ${contact.serviceInterest || 'Общий запрос'}\n` +
`📊 <b>Статус:</b> ${this.getStatusText(contact.status)}\n` +
`⚡ <b>Приоритет:</b> ${this.getPriorityText(contact.priority)}\n\n` +
`💬 <b>Сообщение:</b>\n${contact.message}\n\n` +
`🔗 <a href="${process.env.BASE_URL || 'http://localhost:3000'}/admin/contacts/${contact.id}">Открыть в админ-панели</a>`;
}
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();