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,
}