diff --git a/electron/export.html b/electron/export.html new file mode 100644 index 000000000..dd76a842b --- /dev/null +++ b/electron/export.html @@ -0,0 +1,30 @@ + + + + + Bitburner + + + + +
+

Close me when operation is completed.

+
+ + diff --git a/electron/main.js b/electron/main.js index b1f95e6bd..5047c7f8d 100644 --- a/electron/main.js +++ b/electron/main.js @@ -1,11 +1,12 @@ /* eslint-disable no-process-exit */ /* eslint-disable @typescript-eslint/no-var-requires */ -const { app } = require("electron"); +const { app, BrowserWindow } = require("electron"); const log = require("electron-log"); const greenworks = require("./greenworks"); const api = require("./api-server"); const gameWindow = require("./gameWindow"); const achievements = require("./achievements"); +const utils = require("./utils"); log.catchErrors(); log.info(`Started app: ${JSON.stringify(process.argv)}`); @@ -88,7 +89,16 @@ global.app_handlers = { createWindow: startWindow, } -app.whenReady().then(() => { +app.whenReady().then(async () => { log.info('Application is ready!'); - startWindow(process.argv.includes("--no-scripts")); + + if (process.argv.includes("--export-save")) { + const window = new BrowserWindow({ show: false }); + await window.loadFile("export.html", false); + window.show(); + setStopProcessHandler(app, window, true); + await utils.exportSave(window); + } else { + startWindow(process.argv.includes("--no-scripts")); + } }); diff --git a/electron/utils.js b/electron/utils.js index 0c22632c3..8e45eba3e 100644 --- a/electron/utils.js +++ b/electron/utils.js @@ -62,7 +62,38 @@ function showErrorBox(title, error) { ); } +function exportSaveFromIndexedDb() { + return new Promise((resolve) => { + const dbRequest = indexedDB.open("bitburnerSave"); + dbRequest.onsuccess = () => { + const db = dbRequest.result; + const transaction = db.transaction(['savestring'], "readonly"); + const store = transaction.objectStore('savestring'); + const request = store.get('save'); + request.onsuccess = () => { + const file = new Blob([request.result], {type: 'text/plain'}); + const a = document.createElement("a"); + const url = URL.createObjectURL(file); + a.href = url; + a.download = 'save.json'; + document.body.appendChild(a); + a.click(); + setTimeout(function () { + document.body.removeChild(a); + window.URL.revokeObjectURL(url); + resolve(); + }, 0); + } + } + }); +} + +async function exportSave(window) { + await window.webContents + .executeJavaScript(`${exportSaveFromIndexedDb.toString()}; exportSaveFromIndexedDb();`, true); +} + module.exports = { - reloadAndKill, showErrorBox, + reloadAndKill, showErrorBox, exportSave, attachUnresponsiveAppHandler, detachUnresponsiveAppHandler, }