feat: новая функция

This commit is contained in:
2025-10-09 16:48:20 +03:00
parent dd2c9988a5
commit 13fb51e447
60 changed files with 7694 additions and 1157 deletions

View File

@@ -13,6 +13,7 @@
const { Telegraf } = require('telegraf');
const logger = require('../utils/logger');
const encryptedDb = require('./encryptedDatabaseService');
const universalMediaProcessor = require('./UniversalMediaProcessor');
/**
* TelegramBot - обработчик Telegram сообщений
@@ -139,6 +140,29 @@ class TelegramBot {
ctx.reply('Добро пожаловать! Отправьте код подтверждения для аутентификации.');
});
// Обработчик команды /connect - подключение кошелька
this.bot.command('connect', async (ctx) => {
try {
logger.info('[TelegramBot] 📨 Получена команда /connect');
const telegramId = ctx.from.id.toString();
const identityLinkService = require('./IdentityLinkService');
const linkData = await identityLinkService.generateLinkToken('telegram', telegramId);
await ctx.reply(
`🔗 *Подключите Web3 кошелек для полного доступа*\n\n` +
`Перейдите по ссылке:\n${linkData.linkUrl}\n\n` +
`⏱ Ссылка действительна 1 час`,
{ parse_mode: 'Markdown' }
);
logger.info('[TelegramBot] Отправлена ссылка для подключения кошелька');
} catch (error) {
logger.error('[TelegramBot] Ошибка команды /connect:', error);
ctx.reply('Произошла ошибка при создании ссылки. Попробуйте позже.');
}
});
// Обработчик текстовых сообщений
this.bot.on('text', async (ctx) => {
logger.info('[TelegramBot] 📨 Получено текстовое сообщение');
@@ -188,11 +212,11 @@ class TelegramBot {
* @param {Object} ctx - Telegraf context
* @returns {Object} - Стандартизированные данные сообщения
*/
extractMessageData(ctx) {
try {
const telegramId = ctx.from.id.toString();
async extractMessageData(ctx) {
try {
const telegramId = ctx.from.id.toString();
let content = '';
let attachments = [];
let contentData = null;
// Текст сообщения
if (ctx.message.text) {
@@ -201,8 +225,9 @@ class TelegramBot {
content = ctx.message.caption.trim();
}
// Обработка вложений
let fileId, fileName, mimeType, fileSize;
// Обработка медиа через UniversalMediaProcessor
const mediaFiles = [];
let fileId, fileName, mimeType, fileSize, fileData;
if (ctx.message.document) {
fileId = ctx.message.document.file_id;
@@ -227,28 +252,79 @@ class TelegramBot {
fileSize = ctx.message.video.file_size;
}
if (fileId) {
attachments.push({
type: 'telegram_file',
fileId: fileId,
filename: fileName,
mimetype: mimeType,
size: fileSize,
ctx: ctx // Сохраняем контекст для последующей загрузки
});
// Если есть файл, загружаем его и обрабатываем
if (fileId) {
try {
// Скачиваем файл из Telegram
const file = await ctx.telegram.getFile(fileId);
const fileUrl = `https://api.telegram.org/file/bot${this.settings.token}/${file.file_path}`;
// Загружаем данные файла
const response = await fetch(fileUrl);
fileData = Buffer.from(await response.arrayBuffer());
// Обрабатываем через медиа-процессор
const processedFile = await universalMediaProcessor.processFile(
fileData,
fileName,
{
telegramFileId: fileId,
mimeType: mimeType,
originalSize: fileSize
}
);
mediaFiles.push(processedFile);
} catch (fileError) {
logger.error('[TelegramBot] Ошибка загрузки файла:', fileError);
// Fallback: сохраняем как есть
mediaFiles.push({
type: 'telegram_file',
content: `[Файл: ${fileName}]`,
processed: false,
error: fileError.message,
file: {
fileId: fileId,
filename: fileName,
mimetype: mimeType,
size: fileSize
}
});
}
}
// Создаем структурированные данные контента
if (mediaFiles.length > 0) {
contentData = {
text: content,
files: mediaFiles.map(file => ({
data: file.file?.data || null,
filename: file.file?.originalName || file.file?.filename,
metadata: {
type: file.type,
processed: file.processed,
telegramFileId: file.file?.telegramFileId,
mimeType: file.file?.mimetype,
originalSize: file.file?.size
}
}))
};
}
return {
channel: 'telegram',
identifier: telegramId,
content: content,
attachments: attachments,
contentData: contentData,
attachments: mediaFiles, // Обратная совместимость
metadata: {
telegramUsername: ctx.from.username,
telegramFirstName: ctx.from.first_name,
telegramLastName: ctx.from.last_name,
messageId: ctx.message.message_id,
chatId: ctx.chat.id
chatId: ctx.chat.id,
hasMedia: mediaFiles.length > 0,
mediaTypes: mediaFiles.map(f => f.type)
}
};
} catch (error) {
@@ -283,7 +359,7 @@ class TelegramBot {
await ctx.replyWithChatAction('typing');
// Извлекаем данные из сообщения
const messageData = this.extractMessageData(ctx);
const messageData = await this.extractMessageData(ctx);
logger.info(`[TelegramBot] Обработка сообщения от пользователя: ${messageData.identifier}`);