Upload via GUI (25 Dateien)

This commit is contained in:
Git Manager GUI
2026-08-02 10:14:02 +02:00
parent dc55e64ca3
commit a803f297ea
15 changed files with 2587 additions and 324 deletions
+106 -3
View File
@@ -20,7 +20,10 @@ const auth = require('./auth');
const updater = require('./updater');
const icons = require('./icons');
const bedrock = require('./bedrock');
const backup = require('./backup');
const mmcimport = require('./mmcimport');
const cfimport = require('./cfimport');
const mcimport = require('./mcimport');
// undici als globales fetch verwenden -> ermöglicht Proxy via setGlobalDispatcher
const undici = require('undici');
@@ -412,7 +415,7 @@ async function importMrpack(buf, zip) {
else if (deps.forge) { loader = 'forge'; loaderVersion = deps.forge; }
else if (deps.neoforge) { loader = 'neoforge'; loaderVersion = deps.neoforge; }
const created = store.createInstance({
const created = store.createOrReplaceImportedInstance({
name: index.name || 'Modpack',
minecraft: { version: deps.minecraft || '', loader, loaderVersion },
});
@@ -495,8 +498,8 @@ ipcMain.handle('instances:import', async () => {
throw new Error('Keine gültige Instanz im Archiv (instance.json fehlt).');
}
const imported = JSON.parse(fs.readFileSync(path.join(base, 'instance.json'), 'utf8'));
const created = store.createInstance({
name: (imported.name || 'Import') + ' (Import)',
const created = store.createOrReplaceImportedInstance({
name: imported.name || 'Import',
icon: imported.icon || 'grass',
notes: imported.notes || '',
minecraft: imported.minecraft || {},
@@ -519,6 +522,54 @@ ipcMain.handle('instances:import', async () => {
}
});
ipcMain.handle('backup:global', async () => {
const destinationPath = backup.resolveAutoBackupPath(app.getPath('documents'));
try {
const result = await backup.createGlobalBackup({
instancesDir: store.getInstancesDir(),
userDataDir: app.getPath('userData'),
includeSettings: true,
destinationPath,
onProgress: (progress) => {
if (mainWindow && !mainWindow.isDestroyed()) mainWindow.webContents.send('backup:progress', progress);
},
});
if (mainWindow && !mainWindow.isDestroyed()) {
mainWindow.webContents.send('backup:progress', { mode: 'create', percent: 100, detail: 'Backup abgeschlossen' });
}
return result;
} catch (err) {
return { ok: false, message: 'Backup fehlgeschlagen: ' + err.message };
}
});
ipcMain.handle('backup:list', async () => backup.listGlobalBackups(app.getPath('documents')));
ipcMain.handle('backup:restore', async (_e, sourcePath) => {
if (!sourcePath || !String(sourcePath).trim()) {
return { ok: false, message: 'Kein Backup ausgewählt.' };
}
try {
const currentSettings = store.getSettings();
const result = await backup.restoreGlobalBackup({
sourcePath,
instancesDir: store.getInstancesDir(),
userDataDir: app.getPath('userData'),
includeSettings: true,
instancesDirSetting: currentSettings.instancesDir || null,
onProgress: (progress) => {
if (mainWindow && !mainWindow.isDestroyed()) mainWindow.webContents.send('backup:progress', progress);
},
});
if (mainWindow && !mainWindow.isDestroyed()) {
mainWindow.webContents.send('backup:progress', { mode: 'restore', percent: 100, detail: 'Wiederherstellen abgeschlossen' });
}
return result;
} catch (err) {
return { ok: false, message: 'Wiederherstellen fehlgeschlagen: ' + err.message };
}
});
// Phase 2: echter Vanilla-Download & -Start (Start selbst ist an Login gebunden).
ipcMain.handle('instances:launch', async (_e, id, accountId) => {
const inst = store.getInstance(id);
@@ -666,6 +717,58 @@ ipcMain.handle('mmc:import', (_e, entries, copyData) => {
return { ok: true, imported: done, failed };
});
ipcMain.handle('cf:pickFolder', async () => {
const res = await dialog.showOpenDialog(mainWindow, {
title: 'CurseForge-Ordner wählen (oder direkt den Instances-Ordner)',
properties: ['openDirectory'],
});
return res.canceled ? null : res.filePaths[0];
});
ipcMain.handle('cf:scan', (_e, folder) => {
try { return cfimport.scan(folder); }
catch (err) { return { ok: false, reason: err.message }; }
});
ipcMain.handle('cf:import', (_e, entries, copyData) => {
const done = [];
const failed = [];
for (const entry of entries || []) {
try { done.push(cfimport.importOne(store, entry, copyData !== false)); }
catch (err) { failed.push({ name: entry.name, message: err.message }); }
if (mainWindow && !mainWindow.isDestroyed()) {
mainWindow.webContents.send('cf:progress', { current: done.length + failed.length, total: entries.length });
}
}
return { ok: true, imported: done, failed };
});
ipcMain.handle('mc:pickFolder', async () => {
const res = await dialog.showOpenDialog(mainWindow, {
title: 'Minecraft-Launcher-Ordner waehlen (meist .minecraft)',
properties: ['openDirectory'],
});
return res.canceled ? null : res.filePaths[0];
});
ipcMain.handle('mc:scan', (_e, folder) => {
try { return mcimport.scan(folder); }
catch (err) { return { ok: false, reason: err.message }; }
});
ipcMain.handle('mc:import', (_e, entries, copyData) => {
const done = [];
const failed = [];
for (const entry of entries || []) {
try { done.push(mcimport.importOne(store, entry, copyData !== false)); }
catch (err) { failed.push({ name: entry.name, message: err.message }); }
if (mainWindow && !mainWindow.isDestroyed()) {
mainWindow.webContents.send('mc:progress', { current: done.length + failed.length, total: entries.length });
}
}
return { ok: true, imported: done, failed };
});
// ---------------------------------------------------------------------------
// IPC Minecraft Bedrock (Windows-Store-App)
// ---------------------------------------------------------------------------