feat: saving files and folders when updating modpaks

This commit is contained in:
2025-07-07 04:58:57 +05:00
parent 76917e3f90
commit 7eaf7a7610
3 changed files with 62 additions and 0 deletions

View File

@ -348,6 +348,7 @@ export function initMinecraftHandlers() {
apiReleaseUrl = 'https://api.github.com/repos/DIKER0K/Comfort/releases/latest', apiReleaseUrl = 'https://api.github.com/repos/DIKER0K/Comfort/releases/latest',
versionFileName = 'comfort_version.txt', versionFileName = 'comfort_version.txt',
packName = 'Comfort', packName = 'Comfort',
preserveFiles = [], // Новый параметр: список файлов/папок для сохранения
} = options || {}; } = options || {};
const appPath = path.dirname(app.getPath('exe')); const appPath = path.dirname(app.getPath('exe'));
@ -375,6 +376,7 @@ export function initMinecraftHandlers() {
} }
const tempDir = path.join(appPath, 'temp'); const tempDir = path.join(appPath, 'temp');
const packDir = path.join(versionsDir, packName); // Директория пакета
// Создаем/очищаем временную директорию // Создаем/очищаем временную директорию
if (fs.existsSync(tempDir)) { if (fs.existsSync(tempDir)) {
@ -400,10 +402,61 @@ export function initMinecraftHandlers() {
fs.mkdirSync(versionsDir, { recursive: true }); fs.mkdirSync(versionsDir, { recursive: true });
} }
// Сохраняем файлы/папки, которые нужно оставить
const backupDir = path.join(tempDir, 'backup');
fs.mkdirSync(backupDir, { recursive: true });
// Проверка и бэкап указанных файлов/папок
for (const filePath of preserveFiles) {
const fullPath = path.join(packDir, filePath);
if (fs.existsSync(fullPath)) {
const backupPath = path.join(backupDir, filePath);
// Создаем необходимые директории для бэкапа
const backupDirPath = path.dirname(backupPath);
if (!fs.existsSync(backupDirPath)) {
fs.mkdirSync(backupDirPath, { recursive: true });
}
// Копируем файл или директорию
if (fs.lstatSync(fullPath).isDirectory()) {
fs.cpSync(fullPath, backupPath, { recursive: true });
console.log(`Директория ${filePath} сохранена во временный бэкап`);
} else {
fs.copyFileSync(fullPath, backupPath);
console.log(`Файл ${filePath} сохранен во временный бэкап`);
}
}
}
// Распаковываем архив напрямую в папку versions // Распаковываем архив напрямую в папку versions
await extract(zipPath, { dir: versionsDir }); await extract(zipPath, { dir: versionsDir });
fs.unlinkSync(zipPath); fs.unlinkSync(zipPath);
// Восстанавливаем файлы/папки из бэкапа
for (const filePath of preserveFiles) {
const backupPath = path.join(backupDir, filePath);
if (fs.existsSync(backupPath)) {
const targetPath = path.join(packDir, filePath);
// Создаем необходимые директории для восстановления
const targetDirPath = path.dirname(targetPath);
if (!fs.existsSync(targetDirPath)) {
fs.mkdirSync(targetDirPath, { recursive: true });
}
// Копируем обратно файл или директорию
if (fs.lstatSync(backupPath).isDirectory()) {
fs.cpSync(backupPath, targetPath, { recursive: true });
console.log(`Директория ${filePath} восстановлена из бэкапа`);
} else {
fs.copyFileSync(backupPath, targetPath);
console.log(`Файл ${filePath} восстановлен из бэкапа`);
}
}
}
// Сохраняем новую версию // Сохраняем новую версию
fs.writeFileSync(versionFilePath, latestVersion); fs.writeFileSync(versionFilePath, latestVersion);

View File

@ -23,6 +23,13 @@ const launchOptions = {
baseVersion: '1.21.4', baseVersion: '1.21.4',
serverIp: 'popa-popa.ru', serverIp: 'popa-popa.ru',
fabricVersion: 'fabric0.16.14', fabricVersion: 'fabric0.16.14',
preserveFiles: [
'options.txt',
'screenshots',
'schematics',
'syncmatics',
'saves',
],
}; };
const AuthCheck = ({ children }: { children: ReactNode }) => { const AuthCheck = ({ children }: { children: ReactNode }) => {

View File

@ -33,6 +33,7 @@ interface LaunchPageProps {
baseVersion: string; baseVersion: string;
serverIp: string; serverIp: string;
fabricVersion: string; fabricVersion: string;
preserveFiles: string[];
}; };
} }
@ -115,6 +116,7 @@ const LaunchPage = ({ launchOptions }: LaunchPageProps) => {
apiReleaseUrl: launchOptions.apiReleaseUrl, apiReleaseUrl: launchOptions.apiReleaseUrl,
versionFileName: launchOptions.versionFileName, versionFileName: launchOptions.versionFileName,
packName: launchOptions.packName, packName: launchOptions.packName,
preserveFiles: launchOptions.preserveFiles,
}; };
// Передаем опции для скачивания // Передаем опции для скачивания