some fixes
This commit is contained in:
163
.history/services/telegram_20251021213227.js
Normal file
163
.history/services/telegram_20251021213227.js
Normal file
@@ -0,0 +1,163 @@
|
||||
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();
|
||||
Reference in New Issue
Block a user