// Скрипт для восстановления оригинальной функциональности callbackHandlers.ts const fs = require('fs'); const path = require('path'); // Находим самую последнюю версию файла callbackHandlers.ts в репозитории const { execSync } = require('child_process'); try { console.log('Поиск оригинальной версии CallbackHandlers.ts с полной функциональностью...'); // Находим коммиты, содержащие значительные изменения в файле (более 1000 символов) const commits = execSync('git log --format="%H" -- src/handlers/callbackHandlers.ts') .toString() .trim() .split('\n'); console.log(`Найдено ${commits.length} коммитов с изменениями файла`); // Пробуем разные коммиты, начиная с последнего, чтобы найти полную реализацию let foundFullImplementation = false; let fullImplementationContent = ''; for (const commit of commits) { console.log(`Проверяем коммит ${commit.substring(0, 8)}...`); try { const fileContent = execSync(`git show ${commit}:src/handlers/callbackHandlers.ts`).toString(); // Проверяем, содержит ли файл полные реализации методов const hasFullImplementations = !fileContent.includes('// Заглушка метода') && fileContent.includes('await this.bot.sendMessage'); if (hasFullImplementations) { console.log(`✅ Найдена полная реализация в коммите ${commit.substring(0, 8)}`); fullImplementationContent = fileContent; foundFullImplementation = true; break; } else { console.log(`❌ Коммит ${commit.substring(0, 8)} не содержит полной реализации`); } } catch (error) { console.error(`Ошибка при проверке коммита ${commit}:`, error.message); } } if (!foundFullImplementation) { console.error('❌ Не удалось найти полную реализацию в истории коммитов'); process.exit(1); } // Теперь получаем текущую версию файла с поддержкой уведомлений console.log('Получаем текущую версию с поддержкой уведомлений...'); const currentFilePath = path.join(__dirname, '..', 'src', 'handlers', 'callbackHandlers.ts'); const currentContent = fs.readFileSync(currentFilePath, 'utf-8'); // Сначала создаем бэкап текущего файла const backupPath = currentFilePath + '.backup-' + Date.now(); fs.writeFileSync(backupPath, currentContent); console.log(`✅ Создан бэкап текущей версии: ${path.basename(backupPath)}`); // Извлекаем код для поддержки уведомлений из текущей версии console.log('Извлекаем код для поддержки уведомлений...'); // Находим импорт NotificationHandlers const notificationImportRegex = /import\s+{\s*NotificationHandlers\s*}\s*from\s*['"]\.\/notificationHandlers['"]\s*;/; const notificationImport = currentContent.match(notificationImportRegex)?.[0] || ''; // Находим объявление поля notificationHandlers const notificationFieldRegex = /private\s+notificationHandlers\?\s*:\s*NotificationHandlers\s*;/; const notificationField = currentContent.match(notificationFieldRegex)?.[0] || ''; // Находим инициализацию notificationHandlers в конструкторе const notificationInitRegex = /\/\/\s*Создаем экземпляр NotificationHandlers[\s\S]*?try\s*{[\s\S]*?this\.notificationHandlers\s*=\s*new\s*NotificationHandlers[\s\S]*?}\s*catch[\s\S]*?}/; const notificationInit = currentContent.match(notificationInitRegex)?.[0] || ''; // Находим метод handleNotificationSettings const notificationSettingsMethodRegex = /async\s+handleNotificationSettings[\s\S]*?}\s*}/; const notificationSettingsMethod = currentContent.match(notificationSettingsMethodRegex)?.[0] || ''; // Находим обработку callback для notifications в handleCallback const notificationCallbackRegex = /\/\/\s*Настройки уведомлений[\s\S]*?else\s+if\s*\(data\s*===\s*['"]notifications['"][\s\S]*?}\s*}/; const notificationCallback = currentContent.match(notificationCallbackRegex)?.[0] || ''; // Получаем часть обработки коллбэков для уведомлений const notificationToggleRegex = /\/\/\s*Обработка переключения настроек уведомлений[\s\S]*?else\s+if[\s\S]*?notif_[\s\S]*?}\s*}/; const notificationToggle = currentContent.match(notificationToggleRegex)?.[0] || ''; console.log(`✅ Извлечены блоки кода для уведомлений`); // Интегрируем код уведомлений в оригинальную версию console.log('Интегрируем код уведомлений в оригинальную версию...'); // 1. Добавляем импорт let newContent = fullImplementationContent; if (notificationImport) { newContent = newContent.replace(/import\s*{[^}]*}\s*from\s*['"]\.\/messageHandlers['"]\s*;/, match => match + '\n' + notificationImport); } // 2. Добавляем объявление поля if (notificationField) { newContent = newContent.replace(/private\s+translationController\s*:\s*TranslationController\s*;/, match => match + '\n ' + notificationField); } // 3. Добавляем инициализацию в конструкторе if (notificationInit) { newContent = newContent.replace(/this\.translationController\s*=\s*new\s*TranslationController\(\);/, match => match + '\n ' + notificationInit); } // 4. Добавляем обработку коллбэков для уведомлений if (notificationCallback) { newContent = newContent.replace(/else\s+{\s*await\s+this\.bot\.answerCallbackQuery\(query\.id[\s\S]*?return;/, match => notificationCallback + '\n ' + match); } // 5. Добавляем обработку переключения настроек уведомлений if (notificationToggle) { newContent = newContent.replace(/else\s+{\s*await\s+this\.bot\.answerCallbackQuery\(query\.id[\s\S]*?return;/, match => notificationToggle + '\n ' + match); } // 6. Добавляем метод handleNotificationSettings в конец класса if (notificationSettingsMethod) { newContent = newContent.replace(/}(\s*)$/, notificationSettingsMethod + '\n}$1'); } // Сохраняем обновленный файл const outputPath = currentFilePath + '.fixed'; fs.writeFileSync(outputPath, newContent); console.log(`✅ Создана исправленная версия файла: ${path.basename(outputPath)}`); console.log('\nИнструкция по восстановлению:'); console.log(`1. Проверьте файл ${path.basename(outputPath)}`); console.log('2. Если все выглядит правильно, выполните команду:'); console.log(` Move-Item -Force "${path.basename(outputPath)}" "${path.basename(currentFilePath)}"`); console.log('3. Перезапустите бота'); } catch (error) { console.error('Произошла ошибка:', error); }