From 62cf340c8520c35f9afd2cd25afba2753c83aa39 Mon Sep 17 00:00:00 2001 From: zumbiepig <121742281+zumbiepig@users.noreply.github.com> Date: Mon, 9 Sep 2024 21:19:29 -0700 Subject: [PATCH] shaun pls fix, the function works but not the button --- bun.lockb | Bin 114280 -> 114685 bytes package.json | 1 + src/articles/index.html | 2 +- src/console/index.html | 105 ++++++++ src/home/archive/index.html | 2 +- src/home/clients/index.html | 2 +- src/home/downloads/index.html | 2 +- src/home/game/index.html | 2 +- src/mods/mods/index.html | 2 +- src/mods/resourcepacks/index.html | 2 +- .../eagler-launch/1.8.8/eaglerforge.ts | 57 ---- src/resources/scripts/main.ts | 252 ++++++++++++++---- src/resources/styles/themes/default.css | 4 + src/servers/index.html | 2 +- src/settings/backups/index.html | 107 ++++++++ src/settings/{ => general}/index.html | 23 +- src/updates/index.html | 2 +- 17 files changed, 441 insertions(+), 126 deletions(-) create mode 100644 src/console/index.html delete mode 100644 src/resources/scripts/eagler-launch/1.8.8/eaglerforge.ts create mode 100644 src/settings/backups/index.html rename src/settings/{ => general}/index.html (84%) diff --git a/bun.lockb b/bun.lockb index 6af9cff56f14152d4b55031a7aa88e8852cafd30..0c10e672105cb95dd4d68ab891336771c3991327 100755 GIT binary patch delta 19799 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 delta 19416 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 WHNA*kW9z~3>O!ThF_YDw2K*n{m4#ja diff --git a/package.json b/package.json index ed09330..9ee7ef6 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "errorhandler": "^1.5.1", "express": "^4.19.2", "helmet": "^7.1.0", + "indexeddb-export-import": "^2.1.5", "morgan": "^1.10.0", "pako": "^2.1.0", "semver": "^7.6.3", diff --git a/src/articles/index.html b/src/articles/index.html index a519ce3..7586475 100644 --- a/src/articles/index.html +++ b/src/articles/index.html @@ -55,7 +55,7 @@ Tutorials -
  • +
  • Settings
  • diff --git a/src/console/index.html b/src/console/index.html new file mode 100644 index 0000000..c334d1e --- /dev/null +++ b/src/console/index.html @@ -0,0 +1,105 @@ + + + + + + MineXLauncher + + + + + + + + +
    + +
    +
    + MineXLauncher +
    + +
    +
    +
    +
    +
    +
    +
    + Join the MineXLauncher Discord + © 2024 MineXLauncher. All rights reserved. +
    +
    +
    + +
    + + diff --git a/src/home/archive/index.html b/src/home/archive/index.html index 4dc621c..b19621b 100644 --- a/src/home/archive/index.html +++ b/src/home/archive/index.html @@ -55,7 +55,7 @@ Tutorials -
  • +
  • Settings
  • diff --git a/src/home/clients/index.html b/src/home/clients/index.html index ea8b169..2958295 100644 --- a/src/home/clients/index.html +++ b/src/home/clients/index.html @@ -55,7 +55,7 @@ Tutorials -
  • +
  • Settings
  • diff --git a/src/home/downloads/index.html b/src/home/downloads/index.html index 27c7b84..097ea68 100644 --- a/src/home/downloads/index.html +++ b/src/home/downloads/index.html @@ -55,7 +55,7 @@ Tutorials -
  • +
  • Settings
  • diff --git a/src/home/game/index.html b/src/home/game/index.html index bbd718b..028e145 100644 --- a/src/home/game/index.html +++ b/src/home/game/index.html @@ -55,7 +55,7 @@ Tutorials -
  • +
  • Settings
  • diff --git a/src/mods/mods/index.html b/src/mods/mods/index.html index d0f0834..43348ef 100644 --- a/src/mods/mods/index.html +++ b/src/mods/mods/index.html @@ -55,7 +55,7 @@ Tutorials -
  • +
  • Settings
  • diff --git a/src/mods/resourcepacks/index.html b/src/mods/resourcepacks/index.html index 8cf1613..5687f70 100644 --- a/src/mods/resourcepacks/index.html +++ b/src/mods/resourcepacks/index.html @@ -55,7 +55,7 @@ Tutorials -
  • +
  • Settings
  • diff --git a/src/resources/scripts/eagler-launch/1.8.8/eaglerforge.ts b/src/resources/scripts/eagler-launch/1.8.8/eaglerforge.ts deleted file mode 100644 index 8395b01..0000000 --- a/src/resources/scripts/eagler-launch/1.8.8/eaglerforge.ts +++ /dev/null @@ -1,57 +0,0 @@ -// @ts-nocheck -window.addEventListener('load', () => { - const relayId = Math.floor(Math.random() * 3); - window.eaglercraftXOpts = { - container: 'game_frame', - assetsURI: `${window.location.pathname}/assets.epk`, - localesURI: `${window.location.pathname}/lang/`, - servers: [ - { addr: 'wss://mc.ricenetwork.xyz', name: 'Rice Network' }, - { addr: 'wss://mc.lamplifesteal.xyz', name: 'LampLifesteal' }, - { addr: 'wss://electronmc.club', name: 'Electron Network' }, - { addr: 'wss://play.brickmc.net', name: 'BrickMC' }, - ], - relays: [ - { - addr: 'wss://relay.deev.is/', - comment: 'lax1dude relay #1', - primary: relayId === 0, - }, - { - addr: 'wss://relay.lax1dude.net/', - comment: 'lax1dude relay #2', - primary: relayId === 1, - }, - { - addr: 'wss://relay.shhnowisnottheti.me/', - comment: 'ayunami relay #1', - primary: relayId === 2, - }, - ], - }; - - const storage = { - local: { - get: function (key: string) { - const item = localStorage.getItem('minexlauncher'); - if (item !== null) { - const json = JSON.parse(item); - if (json[key] !== undefined) { - return json[key]; - } else { - return null; - } - } else { - return null; - } - }, - }, - }; - - const urlParams = new URLSearchParams(window.location.search); - window.eaglercraftXOpts.joinServer = urlParams.get('server') ?? undefined; - window.eaglercraftXOpts.Mods = storage.local.get('mods') ?? []; - - history.replaceState({}, '', '/play'); - main(); -}); diff --git a/src/resources/scripts/main.ts b/src/resources/scripts/main.ts index 3b8a4b2..0bf22ae 100644 --- a/src/resources/scripts/main.ts +++ b/src/resources/scripts/main.ts @@ -1,5 +1,6 @@ import { gt, coerce } from 'semver'; import { inflate, deflate } from 'pako'; +import idbExportImport from 'indexeddb-export-import'; let selectedVersion: string | undefined = undefined; let articleAnimationLock = false; @@ -47,23 +48,78 @@ const versionSelector = { }, }; +function consoleLog( + type: 'debug' | 'log' | 'info' | 'warn' | 'error', + msg: string, +) { + const consoleElement = document.querySelector('.console'); + if (consoleElement) { + const messageElement = document.createElement('p'); + messageElement.classList.add(type); + messageElement.innerText = msg; + consoleElement.appendChild(messageElement); + storage.session.set( + 'console', + base64Gzip.compress(consoleElement.innerHTML), + ); + consoleElement.scroll(0, consoleElement.scrollHeight); + } +} + const game = { play: function (version?: string) { - if (version) { - document.body.style.display = 'none'; - storage.session.set('lastGame', version); - // @ts-expect-error - window.top.location.href = version; - } else if (selectedVersion) { - document.body.style.display = 'none'; - storage.session.set('lastGame', selectedVersion); - // @ts-expect-error - window.top.location.href = selectedVersion; - } else { + version = version ?? selectedVersion; + if (!version) { alert('Please select a version to play.'); return; } + document.body.style.display = 'none'; + storage.session.set('lastGame', selectedVersion); + + window.open(version, '_blank', 'popup=true'); + + /*window.top.instanceWindow = window.open(version); + window.top.instanceWindow.onload = function () { + window.top.instanceWindow.history.replaceState({}, '', '/play'); + window.top.instanceWindow.console.debug = (msg: string) => + consoleLog('debug', msg); + window.top.instanceWindow.console.log = (msg: string) => + consoleLog('log', msg); + window.top.instanceWindow.console.info = (msg: string) => + consoleLog('info', msg); + window.top.instanceWindow.console.warn = (msg: string) => + consoleLog('warn', msg); + window.top.instanceWindow.console.error = (msg: string) => + consoleLog('error', msg); + }; + const waitForCrash = setInterval(() => { + if (window.top.instanceWindow.closed) { + clearInterval(waitForCrash); + game.stop(); + } else { + window.top.instanceWindow.document + .querySelectorAll('div') + .forEach((element: HTMLElement) => { + if (element.innerText.includes('Game Crashed!')) { + clearInterval(waitForCrash); + game.stop(element.innerHTML); + } + }); + } + }, 50);*/ }, + /*stop: function (error?: string) { + if (window.top.instanceWindow) { + window.top.instanceWindow.onbeforeunload = null; + window.top.instanceWindow.close(); + if (error) { + consoleLog('error', '\n\nMineXLauncher: Game crashed with error:'); + consoleLog('error', error); + } else { + consoleLog('error', '\n\nMineXLauncher: Game process killed by user'); + } + } + },*/ select: function (path: string, name?: string) { selectedVersion = path; const selector = document.querySelector('.installations div .selector'); @@ -135,6 +191,18 @@ const navigate = { window.location.href = navUrl; }, }, + settings: { + general: function () { + const navUrl = '/settings/general/'; + storage.session.set('lastPage', navUrl); + window.location.href = navUrl; + }, + backups: function () { + const navUrl = '/settings/backups/'; + storage.session.set('lastPage', navUrl); + window.location.href = navUrl; + }, + }, articles: function () { const navUrl = '/articles/'; storage.session.set('lastPage', navUrl); @@ -155,11 +223,6 @@ const navigate = { storage.session.set('lastPage', navUrl); window.location.href = navUrl; }, - settings: function () { - const navUrl = '/settings/'; - storage.session.set('lastPage', navUrl); - window.location.href = navUrl; - }, }; const article = { @@ -346,6 +409,117 @@ const mods = { }, }; +const backups = { + export: async function () { + const exportData: { + cookies: Record; + localStorage: Record; + indexedDb: Record; + } = { + cookies: {}, + localStorage: { ...localStorage }, + indexedDb: {}, + }; + + document.cookie.split('; ').forEach((cookie) => { + const pair = cookie.split('='); + if (pair[0] !== undefined && pair[1] !== undefined) + exportData.cookies[pair[0]] = pair[1]; + }); + + for (const dbInfo of await indexedDB.databases()) { + if (dbInfo.name) + indexedDB.open(dbInfo.name).onsuccess = (event) => + (exportData.indexedDb[dbInfo.name ?? ''] = + idbExportImport.exportToJsonString( + (event.target as IDBOpenDBRequest).result, + )); + } + + const url = URL.createObjectURL( + new Blob([base64Gzip.compress(JSON.stringify(exportData))]), + ); + const a = document.createElement('a'); + a.href = url; + a.target = '_blank'; + a.download = `MineXLauncher_${new Date().toLocaleDateString('en-GB').replace(/\//g, '-')}.backup`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + }, + import: async function () { + await new Promise((resolve, reject) => { + const fileInput = document.createElement('input'); + fileInput.type = 'file'; + fileInput.accept = '.backup'; + fileInput.multiple = false; + fileInput.onchange = (event) => { + const file = (event.target as HTMLInputElement).files?.[0]; + if (file) resolve(file); + else reject(); + }; + fileInput.oncancel = () => reject(); + document.body.appendChild(fileInput); + fileInput.click(); + document.body.removeChild(fileInput); + }) + .then(async (file) => { + const importData = JSON.parse(base64Gzip.decompress(await file.text())); + + // @ts-expect-error + if (typeof cookieStore !== 'undefined') + // @ts-expect-error + await cookieStore.getAll().then((cookies: object[]) => + // @ts-expect-error + cookies.forEach((cookie) => cookieStore.delete(cookie)), + ); + else + document.cookie + .split('; ') + .forEach( + (cookie) => + (document.cookie = `${cookie.split('=')[0]}=; Path=/; Max-Age=0`), + ); + + localStorage.clear(); + + for (const dbInfo of await indexedDB.databases()) + if (dbInfo.name) indexedDB.deleteDatabase(dbInfo.name); + + for (const key in importData.localStorage) + if (importData.localStorage[key] !== undefined) + localStorage.setItem(key, importData.localStorage[key]); + + for (const key in importData.cookies) + document.cookie = `${key}=${importData.cookies[key]}; Max-Age=${365 * 24 * 60 * 60}; Path=/; SameSite=Lax; Secure`; + + if (Object.keys(importData.indexedDb).length > 0) + for (const dbName in importData.indexedDb) { + const dbRequest = indexedDB.open(dbName); + dbRequest.onsuccess = async (event) => { + const db = (event.target as IDBOpenDBRequest).result; + const transaction = db.transaction( + Array.from(db.objectStoreNames), + 'readwrite', + ); + + for (const storeName of Array.from(db.objectStoreNames)) + transaction.objectStore(storeName).clear(); + + transaction.oncomplete = () => + idbExportImport.importFromJsonString( + db, + importData.indexedDb[dbName], + ); + }; + } + window.top?.location.reload(); + }) + .catch((error) => console.error(error)); + }, +}; + const sw = { register: function (url: string) { if ('serviceWorker' in navigator) { @@ -365,40 +539,16 @@ const sw = { }; const base64Gzip = { - decode: function (base64: string) { - // Decode Base64 to binary string - const binaryString = atob(base64); - - // Convert binary string to Uint8Array - const len = binaryString.length; - const bytes = new Uint8Array(len); - for (let i = 0; i < len; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - - // Use pako to decompress the Uint8Array - const decompressed = inflate(bytes, { to: 'string' }); - - return decompressed; + compress: function (string: string): string { + return btoa( + String.fromCharCode(...deflate(new TextEncoder().encode(string))), + ); }, - encode: function (inputString: string) { - // Convert the input string to a Uint8Array - const encoder = new TextEncoder(); - const inputBytes = encoder.encode(inputString); - - // Use pako to compress the Uint8Array - const compressedBytes = deflate(inputBytes); - - // Convert the compressed Uint8Array to a binary string - let binaryString = ''; - for (const byte of compressedBytes) { - binaryString += String.fromCharCode(byte); - } - - // Encode the binary string to Base64 - const base64String = btoa(binaryString); - - return base64String; + decompress: function (string: string): string { + return inflate( + Uint8Array.from(atob(string), (c) => c.charCodeAt(0)), + { to: 'string' }, + ); }, }; @@ -435,6 +585,7 @@ if (window.location.pathname === '/') { } }); */ document.addEventListener('load', () => sw.register('/sw.js')); + window.addEventListener('beforeunload', () => game.stop()); window.addEventListener('beforeinstallprompt', (event) => { // @ts-expect-error @@ -500,7 +651,7 @@ if (window.location.pathname === '/') { } */ } -if (window.location.pathname === '/settings/') { +if (window.location.pathname === '/settings/general/') { document.addEventListener('DOMContentLoaded', async () => { const profileName = document.querySelector('.username'); const usernameInput = document.querySelector( @@ -731,5 +882,6 @@ if (window.location.hostname === null) { base64Gzip, article, downloadFile, + backups, ]); } diff --git a/src/resources/styles/themes/default.css b/src/resources/styles/themes/default.css index 9b37886..5f4635c 100644 --- a/src/resources/styles/themes/default.css +++ b/src/resources/styles/themes/default.css @@ -699,6 +699,10 @@ body { outline: none; } +.settings form[id='settings-backups'] { + padding-bottom: 60px; +} + .settings form button[type='submit'] { width: 100%; padding: 10px; diff --git a/src/servers/index.html b/src/servers/index.html index 4ebbdf6..7b0e9ec 100644 --- a/src/servers/index.html +++ b/src/servers/index.html @@ -55,7 +55,7 @@ Tutorials -
  • +
  • Settings
  • diff --git a/src/settings/backups/index.html b/src/settings/backups/index.html new file mode 100644 index 0000000..32ff6c0 --- /dev/null +++ b/src/settings/backups/index.html @@ -0,0 +1,107 @@ + + + + + + MineXLauncher + + + + + + + +
    + +
    +
    + MineXLauncher +
    + +
    +
    +
      +
    • General
    • +
    • + Backups +
    • +
    +
    +
    +
    +
    +

    Backups

    +

    + Save a backup of your launcher data.
    Note: Backing up + worlds is not yet supported. Please export them from + Eaglercraft for now. +

    + + +
    +
    +
    +
    +
    +
    + Join the MineXLauncher Discord + © 2024 MineXLauncher. All rights reserved. +
    +
    +
    + +
    + + diff --git a/src/settings/index.html b/src/settings/general/index.html similarity index 84% rename from src/settings/index.html rename to src/settings/general/index.html index 4ebcb86..eb9b3b2 100644 --- a/src/settings/index.html +++ b/src/settings/general/index.html @@ -55,14 +55,21 @@ Tutorials -
  • +
  • Settings
  • - Settings +
    +
      +
    • + General +
    • +
    • Backups
    • +
    +
    @@ -72,15 +79,11 @@ + +
    - -
    diff --git a/src/updates/index.html b/src/updates/index.html index a4b3edc..abaaf80 100644 --- a/src/updates/index.html +++ b/src/updates/index.html @@ -55,7 +55,7 @@ Tutorials -
  • +
  • Settings