diff --git a/generateCacheAssetsList.js b/generateCacheAssetsList.js
new file mode 100644
index 0000000..e398b37
--- /dev/null
+++ b/generateCacheAssetsList.js
@@ -0,0 +1,21 @@
+import { readdirSync, statSync, writeFileSync } from 'fs';
+import { join } from 'path';
+
+const directoryPath = join(import.meta.dirname, 'public'); // Adjust the path to your assets folder
+
+function getFiles(dir, files_) {
+ files_ = files_ || [];
+ const files = readdirSync(dir);
+ for (let i in files) {
+ const name = dir + '/' + files[i];
+ if (statSync(name).isDirectory()) {
+ getFiles(name, files_);
+ } else {
+ files_.push(name.replace(`${import.meta.dirname}/public`, '')); // Adjust the path to match your public folder
+ }
+ }
+ return files_;
+}
+
+const cacheAssets = getFiles(directoryPath);
+writeFileSync(join(import.meta.dirname, '/public/cacheAssets.json'), JSON.stringify(cacheAssets, null, 2));
diff --git a/package.json b/package.json
index 3e439e6..239d46a 100644
--- a/package.json
+++ b/package.json
@@ -5,8 +5,9 @@
"main": "./server.js",
"scripts": {
"start": "node ./server.js",
- "build": "npm run build:clean && npm run build:compile && npm run build:obfuscate",
- "build:clean": "rimraf ./public/resources/scripts",
+ "build": "npm run build:clean && npm run build:generateCacheAssetsList && npm run build:compile && npm run build:obfuscate",
+ "build:clean": "rimraf ./public/resources/scripts ./public/cacheAssets.json",
+ "build:generateCacheAssetsList": "node ./generateCacheAssetsList.js",
"build:compile": "tsc",
"build:obfuscate": "javascript-obfuscator ./public/resources/scripts --output ./public/resources/scripts --options-preset high-obfuscation",
"lint": "eslint ./src",
diff --git a/public/cacheAssets.json b/public/cacheAssets.json
new file mode 100644
index 0000000..e5fd5bf
--- /dev/null
+++ b/public/cacheAssets.json
@@ -0,0 +1,685 @@
+[
+ "/404.html",
+ "/game/offline/clients/Astra_Client.html",
+ "/game/offline/clients/EaglerForge.html",
+ "/game/offline/clients/Resent_Client.html",
+ "/game/offline/clients/Shadow_Client.html",
+ "/game/offline/clients/Starlike_Client.html",
+ "/game/offline/main/EaglercraftL_1.9.html",
+ "/game/offline/main/EaglercraftX_1.8.html",
+ "/game/offline/main/Eaglercraft_1.2.5.html",
+ "/game/offline/main/Eaglercraft_1.5.html",
+ "/game/offline/main/Eaglercraft_Indev.html",
+ "/game/offline/main/Eaglercraft_a1.2.6.html",
+ "/game/offline/main/Eaglercraft_b1.3.html",
+ "/game/offline/main/Eaglercraft_b1.7.3.html",
+ "/game/offline/mobile/EaglerPocketMobile_1.8.8.html",
+ "/game/web/clients/astra/assets.epk",
+ "/game/web/clients/astra/classes.js",
+ "/game/web/clients/astra/index.html",
+ "/game/web/clients/astra/lang/af_ZA.lang",
+ "/game/web/clients/astra/lang/ar_SA.lang",
+ "/game/web/clients/astra/lang/ast_ES.lang",
+ "/game/web/clients/astra/lang/az_AZ.lang",
+ "/game/web/clients/astra/lang/bg_BG.lang",
+ "/game/web/clients/astra/lang/ca_ES.lang",
+ "/game/web/clients/astra/lang/cs_CZ.lang",
+ "/game/web/clients/astra/lang/cy_GB.lang",
+ "/game/web/clients/astra/lang/da_DK.lang",
+ "/game/web/clients/astra/lang/de_DE.lang",
+ "/game/web/clients/astra/lang/el_GR.lang",
+ "/game/web/clients/astra/lang/en_AU.lang",
+ "/game/web/clients/astra/lang/en_CA.lang",
+ "/game/web/clients/astra/lang/en_GB.lang",
+ "/game/web/clients/astra/lang/en_PT.lang",
+ "/game/web/clients/astra/lang/eo_UY.lang",
+ "/game/web/clients/astra/lang/es_AR.lang",
+ "/game/web/clients/astra/lang/es_ES.lang",
+ "/game/web/clients/astra/lang/es_MX.lang",
+ "/game/web/clients/astra/lang/es_UY.lang",
+ "/game/web/clients/astra/lang/es_VE.lang",
+ "/game/web/clients/astra/lang/et_EE.lang",
+ "/game/web/clients/astra/lang/eu_ES.lang",
+ "/game/web/clients/astra/lang/fa_IR.lang",
+ "/game/web/clients/astra/lang/fi_FI.lang",
+ "/game/web/clients/astra/lang/fil_PH.lang",
+ "/game/web/clients/astra/lang/fr_CA.lang",
+ "/game/web/clients/astra/lang/fr_FR.lang",
+ "/game/web/clients/astra/lang/ga_IE.lang",
+ "/game/web/clients/astra/lang/gl_ES.lang",
+ "/game/web/clients/astra/lang/gv_IM.lang",
+ "/game/web/clients/astra/lang/he_IL.lang",
+ "/game/web/clients/astra/lang/hi_IN.lang",
+ "/game/web/clients/astra/lang/hr_HR.lang",
+ "/game/web/clients/astra/lang/hu_HU.lang",
+ "/game/web/clients/astra/lang/hy_AM.lang",
+ "/game/web/clients/astra/lang/id_ID.lang",
+ "/game/web/clients/astra/lang/is_IS.lang",
+ "/game/web/clients/astra/lang/it_IT.lang",
+ "/game/web/clients/astra/lang/ja_JP.lang",
+ "/game/web/clients/astra/lang/ka_GE.lang",
+ "/game/web/clients/astra/lang/ko_KR.lang",
+ "/game/web/clients/astra/lang/kw_GB.lang",
+ "/game/web/clients/astra/lang/la_LA.lang",
+ "/game/web/clients/astra/lang/lb_LU.lang",
+ "/game/web/clients/astra/lang/lt_LT.lang",
+ "/game/web/clients/astra/lang/lv_LV.lang",
+ "/game/web/clients/astra/lang/mi_NZ.lang",
+ "/game/web/clients/astra/lang/ms_MY.lang",
+ "/game/web/clients/astra/lang/mt_MT.lang",
+ "/game/web/clients/astra/lang/nds_DE.lang",
+ "/game/web/clients/astra/lang/nl_NL.lang",
+ "/game/web/clients/astra/lang/nn_NO.lang",
+ "/game/web/clients/astra/lang/no_NO.lang",
+ "/game/web/clients/astra/lang/oc_FR.lang",
+ "/game/web/clients/astra/lang/pl_PL.lang",
+ "/game/web/clients/astra/lang/pt_BR.lang",
+ "/game/web/clients/astra/lang/pt_PT.lang",
+ "/game/web/clients/astra/lang/qya_AA.lang",
+ "/game/web/clients/astra/lang/ro_RO.lang",
+ "/game/web/clients/astra/lang/ru_RU.lang",
+ "/game/web/clients/astra/lang/se_NO.lang",
+ "/game/web/clients/astra/lang/sk_SK.lang",
+ "/game/web/clients/astra/lang/sl_SI.lang",
+ "/game/web/clients/astra/lang/sr_SP.lang",
+ "/game/web/clients/astra/lang/sv_SE.lang",
+ "/game/web/clients/astra/lang/th_TH.lang",
+ "/game/web/clients/astra/lang/tlh_AA.lang",
+ "/game/web/clients/astra/lang/tr_TR.lang",
+ "/game/web/clients/astra/lang/uk_UA.lang",
+ "/game/web/clients/astra/lang/val_ES.lang",
+ "/game/web/clients/astra/lang/vi_VN.lang",
+ "/game/web/clients/astra/lang/zh_CN.lang",
+ "/game/web/clients/astra/lang/zh_TW.lang",
+ "/game/web/clients/eaglerforge/ModAPI.js",
+ "/game/web/clients/eaglerforge/ModGUI.js",
+ "/game/web/clients/eaglerforge/ModLoader.js",
+ "/game/web/clients/eaglerforge/assets.epk",
+ "/game/web/clients/eaglerforge/classes.js",
+ "/game/web/clients/eaglerforge/index.html",
+ "/game/web/clients/eaglerforge/lang/af_ZA.lang",
+ "/game/web/clients/eaglerforge/lang/ar_SA.lang",
+ "/game/web/clients/eaglerforge/lang/ast_ES.lang",
+ "/game/web/clients/eaglerforge/lang/az_AZ.lang",
+ "/game/web/clients/eaglerforge/lang/bg_BG.lang",
+ "/game/web/clients/eaglerforge/lang/ca_ES.lang",
+ "/game/web/clients/eaglerforge/lang/cs_CZ.lang",
+ "/game/web/clients/eaglerforge/lang/cy_GB.lang",
+ "/game/web/clients/eaglerforge/lang/da_DK.lang",
+ "/game/web/clients/eaglerforge/lang/de_DE.lang",
+ "/game/web/clients/eaglerforge/lang/el_GR.lang",
+ "/game/web/clients/eaglerforge/lang/en_AU.lang",
+ "/game/web/clients/eaglerforge/lang/en_CA.lang",
+ "/game/web/clients/eaglerforge/lang/en_GB.lang",
+ "/game/web/clients/eaglerforge/lang/en_PT.lang",
+ "/game/web/clients/eaglerforge/lang/eo_UY.lang",
+ "/game/web/clients/eaglerforge/lang/es_AR.lang",
+ "/game/web/clients/eaglerforge/lang/es_ES.lang",
+ "/game/web/clients/eaglerforge/lang/es_MX.lang",
+ "/game/web/clients/eaglerforge/lang/es_UY.lang",
+ "/game/web/clients/eaglerforge/lang/es_VE.lang",
+ "/game/web/clients/eaglerforge/lang/et_EE.lang",
+ "/game/web/clients/eaglerforge/lang/eu_ES.lang",
+ "/game/web/clients/eaglerforge/lang/fa_IR.lang",
+ "/game/web/clients/eaglerforge/lang/fi_FI.lang",
+ "/game/web/clients/eaglerforge/lang/fil_PH.lang",
+ "/game/web/clients/eaglerforge/lang/fr_CA.lang",
+ "/game/web/clients/eaglerforge/lang/fr_FR.lang",
+ "/game/web/clients/eaglerforge/lang/ga_IE.lang",
+ "/game/web/clients/eaglerforge/lang/gl_ES.lang",
+ "/game/web/clients/eaglerforge/lang/gv_IM.lang",
+ "/game/web/clients/eaglerforge/lang/he_IL.lang",
+ "/game/web/clients/eaglerforge/lang/hi_IN.lang",
+ "/game/web/clients/eaglerforge/lang/hr_HR.lang",
+ "/game/web/clients/eaglerforge/lang/hu_HU.lang",
+ "/game/web/clients/eaglerforge/lang/hy_AM.lang",
+ "/game/web/clients/eaglerforge/lang/id_ID.lang",
+ "/game/web/clients/eaglerforge/lang/is_IS.lang",
+ "/game/web/clients/eaglerforge/lang/it_IT.lang",
+ "/game/web/clients/eaglerforge/lang/ja_JP.lang",
+ "/game/web/clients/eaglerforge/lang/ka_GE.lang",
+ "/game/web/clients/eaglerforge/lang/ko_KR.lang",
+ "/game/web/clients/eaglerforge/lang/kw_GB.lang",
+ "/game/web/clients/eaglerforge/lang/la_LA.lang",
+ "/game/web/clients/eaglerforge/lang/lb_LU.lang",
+ "/game/web/clients/eaglerforge/lang/lt_LT.lang",
+ "/game/web/clients/eaglerforge/lang/lv_LV.lang",
+ "/game/web/clients/eaglerforge/lang/mi_NZ.lang",
+ "/game/web/clients/eaglerforge/lang/ms_MY.lang",
+ "/game/web/clients/eaglerforge/lang/mt_MT.lang",
+ "/game/web/clients/eaglerforge/lang/nds_DE.lang",
+ "/game/web/clients/eaglerforge/lang/nl_NL.lang",
+ "/game/web/clients/eaglerforge/lang/nn_NO.lang",
+ "/game/web/clients/eaglerforge/lang/no_NO.lang",
+ "/game/web/clients/eaglerforge/lang/oc_FR.lang",
+ "/game/web/clients/eaglerforge/lang/pl_PL.lang",
+ "/game/web/clients/eaglerforge/lang/pt_BR.lang",
+ "/game/web/clients/eaglerforge/lang/pt_PT.lang",
+ "/game/web/clients/eaglerforge/lang/qya_AA.lang",
+ "/game/web/clients/eaglerforge/lang/ro_RO.lang",
+ "/game/web/clients/eaglerforge/lang/ru_RU.lang",
+ "/game/web/clients/eaglerforge/lang/se_NO.lang",
+ "/game/web/clients/eaglerforge/lang/sk_SK.lang",
+ "/game/web/clients/eaglerforge/lang/sl_SI.lang",
+ "/game/web/clients/eaglerforge/lang/sr_SP.lang",
+ "/game/web/clients/eaglerforge/lang/sv_SE.lang",
+ "/game/web/clients/eaglerforge/lang/th_TH.lang",
+ "/game/web/clients/eaglerforge/lang/tlh_AA.lang",
+ "/game/web/clients/eaglerforge/lang/tr_TR.lang",
+ "/game/web/clients/eaglerforge/lang/uk_UA.lang",
+ "/game/web/clients/eaglerforge/lang/val_ES.lang",
+ "/game/web/clients/eaglerforge/lang/vi_VN.lang",
+ "/game/web/clients/eaglerforge/lang/zh_CN.lang",
+ "/game/web/clients/eaglerforge/lang/zh_TW.lang",
+ "/game/web/clients/resent/assets.epk",
+ "/game/web/clients/resent/classes.js",
+ "/game/web/clients/resent/index.html",
+ "/game/web/clients/resent/lang/af_ZA.lang",
+ "/game/web/clients/resent/lang/ar_SA.lang",
+ "/game/web/clients/resent/lang/ast_ES.lang",
+ "/game/web/clients/resent/lang/az_AZ.lang",
+ "/game/web/clients/resent/lang/bg_BG.lang",
+ "/game/web/clients/resent/lang/ca_ES.lang",
+ "/game/web/clients/resent/lang/cs_CZ.lang",
+ "/game/web/clients/resent/lang/cy_GB.lang",
+ "/game/web/clients/resent/lang/da_DK.lang",
+ "/game/web/clients/resent/lang/de_DE.lang",
+ "/game/web/clients/resent/lang/el_GR.lang",
+ "/game/web/clients/resent/lang/en_AU.lang",
+ "/game/web/clients/resent/lang/en_CA.lang",
+ "/game/web/clients/resent/lang/en_GB.lang",
+ "/game/web/clients/resent/lang/en_PT.lang",
+ "/game/web/clients/resent/lang/eo_UY.lang",
+ "/game/web/clients/resent/lang/es_AR.lang",
+ "/game/web/clients/resent/lang/es_ES.lang",
+ "/game/web/clients/resent/lang/es_MX.lang",
+ "/game/web/clients/resent/lang/es_UY.lang",
+ "/game/web/clients/resent/lang/es_VE.lang",
+ "/game/web/clients/resent/lang/et_EE.lang",
+ "/game/web/clients/resent/lang/eu_ES.lang",
+ "/game/web/clients/resent/lang/fa_IR.lang",
+ "/game/web/clients/resent/lang/fi_FI.lang",
+ "/game/web/clients/resent/lang/fil_PH.lang",
+ "/game/web/clients/resent/lang/fr_CA.lang",
+ "/game/web/clients/resent/lang/fr_FR.lang",
+ "/game/web/clients/resent/lang/ga_IE.lang",
+ "/game/web/clients/resent/lang/gl_ES.lang",
+ "/game/web/clients/resent/lang/gv_IM.lang",
+ "/game/web/clients/resent/lang/he_IL.lang",
+ "/game/web/clients/resent/lang/hi_IN.lang",
+ "/game/web/clients/resent/lang/hr_HR.lang",
+ "/game/web/clients/resent/lang/hu_HU.lang",
+ "/game/web/clients/resent/lang/hy_AM.lang",
+ "/game/web/clients/resent/lang/id_ID.lang",
+ "/game/web/clients/resent/lang/is_IS.lang",
+ "/game/web/clients/resent/lang/it_IT.lang",
+ "/game/web/clients/resent/lang/ja_JP.lang",
+ "/game/web/clients/resent/lang/ka_GE.lang",
+ "/game/web/clients/resent/lang/ko_KR.lang",
+ "/game/web/clients/resent/lang/kw_GB.lang",
+ "/game/web/clients/resent/lang/la_LA.lang",
+ "/game/web/clients/resent/lang/lb_LU.lang",
+ "/game/web/clients/resent/lang/lt_LT.lang",
+ "/game/web/clients/resent/lang/lv_LV.lang",
+ "/game/web/clients/resent/lang/mi_NZ.lang",
+ "/game/web/clients/resent/lang/ms_MY.lang",
+ "/game/web/clients/resent/lang/mt_MT.lang",
+ "/game/web/clients/resent/lang/nds_DE.lang",
+ "/game/web/clients/resent/lang/nl_NL.lang",
+ "/game/web/clients/resent/lang/nn_NO.lang",
+ "/game/web/clients/resent/lang/no_NO.lang",
+ "/game/web/clients/resent/lang/oc_FR.lang",
+ "/game/web/clients/resent/lang/pl_PL.lang",
+ "/game/web/clients/resent/lang/pt_BR.lang",
+ "/game/web/clients/resent/lang/pt_PT.lang",
+ "/game/web/clients/resent/lang/qya_AA.lang",
+ "/game/web/clients/resent/lang/ro_RO.lang",
+ "/game/web/clients/resent/lang/ru_RU.lang",
+ "/game/web/clients/resent/lang/se_NO.lang",
+ "/game/web/clients/resent/lang/sk_SK.lang",
+ "/game/web/clients/resent/lang/sl_SI.lang",
+ "/game/web/clients/resent/lang/sr_SP.lang",
+ "/game/web/clients/resent/lang/sv_SE.lang",
+ "/game/web/clients/resent/lang/th_TH.lang",
+ "/game/web/clients/resent/lang/tlh_AA.lang",
+ "/game/web/clients/resent/lang/tr_TR.lang",
+ "/game/web/clients/resent/lang/uk_UA.lang",
+ "/game/web/clients/resent/lang/val_ES.lang",
+ "/game/web/clients/resent/lang/vi_VN.lang",
+ "/game/web/clients/resent/lang/zh_CN.lang",
+ "/game/web/clients/resent/lang/zh_TW.lang",
+ "/game/web/clients/shadow/assets.epk",
+ "/game/web/clients/shadow/classes.js",
+ "/game/web/clients/shadow/index.html",
+ "/game/web/clients/shadow/lang/af_ZA.lang",
+ "/game/web/clients/shadow/lang/ar_SA.lang",
+ "/game/web/clients/shadow/lang/ast_ES.lang",
+ "/game/web/clients/shadow/lang/az_AZ.lang",
+ "/game/web/clients/shadow/lang/bg_BG.lang",
+ "/game/web/clients/shadow/lang/ca_ES.lang",
+ "/game/web/clients/shadow/lang/cs_CZ.lang",
+ "/game/web/clients/shadow/lang/cy_GB.lang",
+ "/game/web/clients/shadow/lang/da_DK.lang",
+ "/game/web/clients/shadow/lang/de_DE.lang",
+ "/game/web/clients/shadow/lang/el_GR.lang",
+ "/game/web/clients/shadow/lang/en_AU.lang",
+ "/game/web/clients/shadow/lang/en_CA.lang",
+ "/game/web/clients/shadow/lang/en_GB.lang",
+ "/game/web/clients/shadow/lang/en_PT.lang",
+ "/game/web/clients/shadow/lang/eo_UY.lang",
+ "/game/web/clients/shadow/lang/es_AR.lang",
+ "/game/web/clients/shadow/lang/es_ES.lang",
+ "/game/web/clients/shadow/lang/es_MX.lang",
+ "/game/web/clients/shadow/lang/es_UY.lang",
+ "/game/web/clients/shadow/lang/es_VE.lang",
+ "/game/web/clients/shadow/lang/et_EE.lang",
+ "/game/web/clients/shadow/lang/eu_ES.lang",
+ "/game/web/clients/shadow/lang/fa_IR.lang",
+ "/game/web/clients/shadow/lang/fi_FI.lang",
+ "/game/web/clients/shadow/lang/fil_PH.lang",
+ "/game/web/clients/shadow/lang/fr_CA.lang",
+ "/game/web/clients/shadow/lang/fr_FR.lang",
+ "/game/web/clients/shadow/lang/ga_IE.lang",
+ "/game/web/clients/shadow/lang/gl_ES.lang",
+ "/game/web/clients/shadow/lang/gv_IM.lang",
+ "/game/web/clients/shadow/lang/he_IL.lang",
+ "/game/web/clients/shadow/lang/hi_IN.lang",
+ "/game/web/clients/shadow/lang/hr_HR.lang",
+ "/game/web/clients/shadow/lang/hu_HU.lang",
+ "/game/web/clients/shadow/lang/hy_AM.lang",
+ "/game/web/clients/shadow/lang/id_ID.lang",
+ "/game/web/clients/shadow/lang/is_IS.lang",
+ "/game/web/clients/shadow/lang/it_IT.lang",
+ "/game/web/clients/shadow/lang/ja_JP.lang",
+ "/game/web/clients/shadow/lang/ka_GE.lang",
+ "/game/web/clients/shadow/lang/ko_KR.lang",
+ "/game/web/clients/shadow/lang/kw_GB.lang",
+ "/game/web/clients/shadow/lang/la_LA.lang",
+ "/game/web/clients/shadow/lang/lb_LU.lang",
+ "/game/web/clients/shadow/lang/lt_LT.lang",
+ "/game/web/clients/shadow/lang/lv_LV.lang",
+ "/game/web/clients/shadow/lang/mi_NZ.lang",
+ "/game/web/clients/shadow/lang/ms_MY.lang",
+ "/game/web/clients/shadow/lang/mt_MT.lang",
+ "/game/web/clients/shadow/lang/nds_DE.lang",
+ "/game/web/clients/shadow/lang/nl_NL.lang",
+ "/game/web/clients/shadow/lang/nn_NO.lang",
+ "/game/web/clients/shadow/lang/no_NO.lang",
+ "/game/web/clients/shadow/lang/oc_FR.lang",
+ "/game/web/clients/shadow/lang/pl_PL.lang",
+ "/game/web/clients/shadow/lang/pt_BR.lang",
+ "/game/web/clients/shadow/lang/pt_PT.lang",
+ "/game/web/clients/shadow/lang/qya_AA.lang",
+ "/game/web/clients/shadow/lang/ro_RO.lang",
+ "/game/web/clients/shadow/lang/ru_RU.lang",
+ "/game/web/clients/shadow/lang/se_NO.lang",
+ "/game/web/clients/shadow/lang/sk_SK.lang",
+ "/game/web/clients/shadow/lang/sl_SI.lang",
+ "/game/web/clients/shadow/lang/sr_SP.lang",
+ "/game/web/clients/shadow/lang/sv_SE.lang",
+ "/game/web/clients/shadow/lang/th_TH.lang",
+ "/game/web/clients/shadow/lang/tlh_AA.lang",
+ "/game/web/clients/shadow/lang/tr_TR.lang",
+ "/game/web/clients/shadow/lang/uk_UA.lang",
+ "/game/web/clients/shadow/lang/val_ES.lang",
+ "/game/web/clients/shadow/lang/vi_VN.lang",
+ "/game/web/clients/shadow/lang/zh_CN.lang",
+ "/game/web/clients/shadow/lang/zh_TW.lang",
+ "/game/web/clients/starlike/assets.epk",
+ "/game/web/clients/starlike/classes.js",
+ "/game/web/clients/starlike/index.html",
+ "/game/web/clients/starlike/lang/af_ZA.lang",
+ "/game/web/clients/starlike/lang/ar_SA.lang",
+ "/game/web/clients/starlike/lang/ast_ES.lang",
+ "/game/web/clients/starlike/lang/az_AZ.lang",
+ "/game/web/clients/starlike/lang/bg_BG.lang",
+ "/game/web/clients/starlike/lang/ca_ES.lang",
+ "/game/web/clients/starlike/lang/cs_CZ.lang",
+ "/game/web/clients/starlike/lang/cy_GB.lang",
+ "/game/web/clients/starlike/lang/da_DK.lang",
+ "/game/web/clients/starlike/lang/de_DE.lang",
+ "/game/web/clients/starlike/lang/el_GR.lang",
+ "/game/web/clients/starlike/lang/en_AU.lang",
+ "/game/web/clients/starlike/lang/en_CA.lang",
+ "/game/web/clients/starlike/lang/en_GB.lang",
+ "/game/web/clients/starlike/lang/en_PT.lang",
+ "/game/web/clients/starlike/lang/eo_UY.lang",
+ "/game/web/clients/starlike/lang/es_AR.lang",
+ "/game/web/clients/starlike/lang/es_ES.lang",
+ "/game/web/clients/starlike/lang/es_MX.lang",
+ "/game/web/clients/starlike/lang/es_UY.lang",
+ "/game/web/clients/starlike/lang/es_VE.lang",
+ "/game/web/clients/starlike/lang/et_EE.lang",
+ "/game/web/clients/starlike/lang/eu_ES.lang",
+ "/game/web/clients/starlike/lang/fa_IR.lang",
+ "/game/web/clients/starlike/lang/fi_FI.lang",
+ "/game/web/clients/starlike/lang/fil_PH.lang",
+ "/game/web/clients/starlike/lang/fr_CA.lang",
+ "/game/web/clients/starlike/lang/fr_FR.lang",
+ "/game/web/clients/starlike/lang/ga_IE.lang",
+ "/game/web/clients/starlike/lang/gl_ES.lang",
+ "/game/web/clients/starlike/lang/gv_IM.lang",
+ "/game/web/clients/starlike/lang/he_IL.lang",
+ "/game/web/clients/starlike/lang/hi_IN.lang",
+ "/game/web/clients/starlike/lang/hr_HR.lang",
+ "/game/web/clients/starlike/lang/hu_HU.lang",
+ "/game/web/clients/starlike/lang/hy_AM.lang",
+ "/game/web/clients/starlike/lang/id_ID.lang",
+ "/game/web/clients/starlike/lang/is_IS.lang",
+ "/game/web/clients/starlike/lang/it_IT.lang",
+ "/game/web/clients/starlike/lang/ja_JP.lang",
+ "/game/web/clients/starlike/lang/ka_GE.lang",
+ "/game/web/clients/starlike/lang/ko_KR.lang",
+ "/game/web/clients/starlike/lang/kw_GB.lang",
+ "/game/web/clients/starlike/lang/la_LA.lang",
+ "/game/web/clients/starlike/lang/lb_LU.lang",
+ "/game/web/clients/starlike/lang/lt_LT.lang",
+ "/game/web/clients/starlike/lang/lv_LV.lang",
+ "/game/web/clients/starlike/lang/mi_NZ.lang",
+ "/game/web/clients/starlike/lang/ms_MY.lang",
+ "/game/web/clients/starlike/lang/mt_MT.lang",
+ "/game/web/clients/starlike/lang/nds_DE.lang",
+ "/game/web/clients/starlike/lang/nl_NL.lang",
+ "/game/web/clients/starlike/lang/nn_NO.lang",
+ "/game/web/clients/starlike/lang/no_NO.lang",
+ "/game/web/clients/starlike/lang/oc_FR.lang",
+ "/game/web/clients/starlike/lang/pl_PL.lang",
+ "/game/web/clients/starlike/lang/pt_BR.lang",
+ "/game/web/clients/starlike/lang/pt_PT.lang",
+ "/game/web/clients/starlike/lang/qya_AA.lang",
+ "/game/web/clients/starlike/lang/ro_RO.lang",
+ "/game/web/clients/starlike/lang/ru_RU.lang",
+ "/game/web/clients/starlike/lang/se_NO.lang",
+ "/game/web/clients/starlike/lang/sk_SK.lang",
+ "/game/web/clients/starlike/lang/sl_SI.lang",
+ "/game/web/clients/starlike/lang/sr_SP.lang",
+ "/game/web/clients/starlike/lang/sv_SE.lang",
+ "/game/web/clients/starlike/lang/th_TH.lang",
+ "/game/web/clients/starlike/lang/tlh_AA.lang",
+ "/game/web/clients/starlike/lang/tr_TR.lang",
+ "/game/web/clients/starlike/lang/uk_UA.lang",
+ "/game/web/clients/starlike/lang/val_ES.lang",
+ "/game/web/clients/starlike/lang/vi_VN.lang",
+ "/game/web/clients/starlike/lang/zh_CN.lang",
+ "/game/web/clients/starlike/lang/zh_TW.lang",
+ "/game/web/main/1.5.2/assets.epk",
+ "/game/web/main/1.5.2/classes.js",
+ "/game/web/main/1.5.2/classes_server.js",
+ "/game/web/main/1.5.2/eagswebrtc.js",
+ "/game/web/main/1.5.2/index.html",
+ "/game/web/main/1.5.2/worker_bootstrap.js",
+ "/game/web/main/1.8.8/assets.epk",
+ "/game/web/main/1.8.8/classes.js",
+ "/game/web/main/1.8.8/index.html",
+ "/game/web/main/1.8.8/lang/af_ZA.lang",
+ "/game/web/main/1.8.8/lang/ar_SA.lang",
+ "/game/web/main/1.8.8/lang/ast_ES.lang",
+ "/game/web/main/1.8.8/lang/az_AZ.lang",
+ "/game/web/main/1.8.8/lang/bg_BG.lang",
+ "/game/web/main/1.8.8/lang/ca_ES.lang",
+ "/game/web/main/1.8.8/lang/cs_CZ.lang",
+ "/game/web/main/1.8.8/lang/cy_GB.lang",
+ "/game/web/main/1.8.8/lang/da_DK.lang",
+ "/game/web/main/1.8.8/lang/de_DE.lang",
+ "/game/web/main/1.8.8/lang/el_GR.lang",
+ "/game/web/main/1.8.8/lang/en_AU.lang",
+ "/game/web/main/1.8.8/lang/en_CA.lang",
+ "/game/web/main/1.8.8/lang/en_GB.lang",
+ "/game/web/main/1.8.8/lang/en_PT.lang",
+ "/game/web/main/1.8.8/lang/eo_UY.lang",
+ "/game/web/main/1.8.8/lang/es_AR.lang",
+ "/game/web/main/1.8.8/lang/es_ES.lang",
+ "/game/web/main/1.8.8/lang/es_MX.lang",
+ "/game/web/main/1.8.8/lang/es_UY.lang",
+ "/game/web/main/1.8.8/lang/es_VE.lang",
+ "/game/web/main/1.8.8/lang/et_EE.lang",
+ "/game/web/main/1.8.8/lang/eu_ES.lang",
+ "/game/web/main/1.8.8/lang/fa_IR.lang",
+ "/game/web/main/1.8.8/lang/fi_FI.lang",
+ "/game/web/main/1.8.8/lang/fil_PH.lang",
+ "/game/web/main/1.8.8/lang/fr_CA.lang",
+ "/game/web/main/1.8.8/lang/fr_FR.lang",
+ "/game/web/main/1.8.8/lang/ga_IE.lang",
+ "/game/web/main/1.8.8/lang/gl_ES.lang",
+ "/game/web/main/1.8.8/lang/gv_IM.lang",
+ "/game/web/main/1.8.8/lang/he_IL.lang",
+ "/game/web/main/1.8.8/lang/hi_IN.lang",
+ "/game/web/main/1.8.8/lang/hr_HR.lang",
+ "/game/web/main/1.8.8/lang/hu_HU.lang",
+ "/game/web/main/1.8.8/lang/hy_AM.lang",
+ "/game/web/main/1.8.8/lang/id_ID.lang",
+ "/game/web/main/1.8.8/lang/is_IS.lang",
+ "/game/web/main/1.8.8/lang/it_IT.lang",
+ "/game/web/main/1.8.8/lang/ja_JP.lang",
+ "/game/web/main/1.8.8/lang/ka_GE.lang",
+ "/game/web/main/1.8.8/lang/ko_KR.lang",
+ "/game/web/main/1.8.8/lang/kw_GB.lang",
+ "/game/web/main/1.8.8/lang/la_LA.lang",
+ "/game/web/main/1.8.8/lang/lb_LU.lang",
+ "/game/web/main/1.8.8/lang/lt_LT.lang",
+ "/game/web/main/1.8.8/lang/lv_LV.lang",
+ "/game/web/main/1.8.8/lang/mi_NZ.lang",
+ "/game/web/main/1.8.8/lang/ms_MY.lang",
+ "/game/web/main/1.8.8/lang/mt_MT.lang",
+ "/game/web/main/1.8.8/lang/nds_DE.lang",
+ "/game/web/main/1.8.8/lang/nl_NL.lang",
+ "/game/web/main/1.8.8/lang/nn_NO.lang",
+ "/game/web/main/1.8.8/lang/no_NO.lang",
+ "/game/web/main/1.8.8/lang/oc_FR.lang",
+ "/game/web/main/1.8.8/lang/pl_PL.lang",
+ "/game/web/main/1.8.8/lang/pt_BR.lang",
+ "/game/web/main/1.8.8/lang/pt_PT.lang",
+ "/game/web/main/1.8.8/lang/qya_AA.lang",
+ "/game/web/main/1.8.8/lang/ro_RO.lang",
+ "/game/web/main/1.8.8/lang/ru_RU.lang",
+ "/game/web/main/1.8.8/lang/se_NO.lang",
+ "/game/web/main/1.8.8/lang/sk_SK.lang",
+ "/game/web/main/1.8.8/lang/sl_SI.lang",
+ "/game/web/main/1.8.8/lang/sr_SP.lang",
+ "/game/web/main/1.8.8/lang/sv_SE.lang",
+ "/game/web/main/1.8.8/lang/th_TH.lang",
+ "/game/web/main/1.8.8/lang/tlh_AA.lang",
+ "/game/web/main/1.8.8/lang/tr_TR.lang",
+ "/game/web/main/1.8.8/lang/uk_UA.lang",
+ "/game/web/main/1.8.8/lang/val_ES.lang",
+ "/game/web/main/1.8.8/lang/vi_VN.lang",
+ "/game/web/main/1.8.8/lang/zh_CN.lang",
+ "/game/web/main/1.8.8/lang/zh_TW.lang",
+ "/game/web/main/1.9.4/assets.epk",
+ "/game/web/main/1.9.4/classes.js",
+ "/game/web/main/1.9.4/index.html",
+ "/game/web/main/1.9.4/lang/af_ZA.lang",
+ "/game/web/main/1.9.4/lang/ar_SA.lang",
+ "/game/web/main/1.9.4/lang/ast_ES.lang",
+ "/game/web/main/1.9.4/lang/az_AZ.lang",
+ "/game/web/main/1.9.4/lang/bg_BG.lang",
+ "/game/web/main/1.9.4/lang/ca_ES.lang",
+ "/game/web/main/1.9.4/lang/cs_CZ.lang",
+ "/game/web/main/1.9.4/lang/cy_GB.lang",
+ "/game/web/main/1.9.4/lang/da_DK.lang",
+ "/game/web/main/1.9.4/lang/de_DE.lang",
+ "/game/web/main/1.9.4/lang/el_GR.lang",
+ "/game/web/main/1.9.4/lang/en_AU.lang",
+ "/game/web/main/1.9.4/lang/en_CA.lang",
+ "/game/web/main/1.9.4/lang/en_GB.lang",
+ "/game/web/main/1.9.4/lang/en_PT.lang",
+ "/game/web/main/1.9.4/lang/eo_UY.lang",
+ "/game/web/main/1.9.4/lang/es_AR.lang",
+ "/game/web/main/1.9.4/lang/es_ES.lang",
+ "/game/web/main/1.9.4/lang/es_MX.lang",
+ "/game/web/main/1.9.4/lang/es_UY.lang",
+ "/game/web/main/1.9.4/lang/es_VE.lang",
+ "/game/web/main/1.9.4/lang/et_EE.lang",
+ "/game/web/main/1.9.4/lang/eu_ES.lang",
+ "/game/web/main/1.9.4/lang/fa_IR.lang",
+ "/game/web/main/1.9.4/lang/fi_FI.lang",
+ "/game/web/main/1.9.4/lang/fil_PH.lang",
+ "/game/web/main/1.9.4/lang/fr_CA.lang",
+ "/game/web/main/1.9.4/lang/fr_FR.lang",
+ "/game/web/main/1.9.4/lang/ga_IE.lang",
+ "/game/web/main/1.9.4/lang/gl_ES.lang",
+ "/game/web/main/1.9.4/lang/gv_IM.lang",
+ "/game/web/main/1.9.4/lang/he_IL.lang",
+ "/game/web/main/1.9.4/lang/hi_IN.lang",
+ "/game/web/main/1.9.4/lang/hr_HR.lang",
+ "/game/web/main/1.9.4/lang/hu_HU.lang",
+ "/game/web/main/1.9.4/lang/hy_AM.lang",
+ "/game/web/main/1.9.4/lang/id_ID.lang",
+ "/game/web/main/1.9.4/lang/is_IS.lang",
+ "/game/web/main/1.9.4/lang/it_IT.lang",
+ "/game/web/main/1.9.4/lang/ja_JP.lang",
+ "/game/web/main/1.9.4/lang/ka_GE.lang",
+ "/game/web/main/1.9.4/lang/ko_KR.lang",
+ "/game/web/main/1.9.4/lang/kw_GB.lang",
+ "/game/web/main/1.9.4/lang/la_LA.lang",
+ "/game/web/main/1.9.4/lang/lb_LU.lang",
+ "/game/web/main/1.9.4/lang/lt_LT.lang",
+ "/game/web/main/1.9.4/lang/lv_LV.lang",
+ "/game/web/main/1.9.4/lang/mi_NZ.lang",
+ "/game/web/main/1.9.4/lang/ms_MY.lang",
+ "/game/web/main/1.9.4/lang/mt_MT.lang",
+ "/game/web/main/1.9.4/lang/nds_DE.lang",
+ "/game/web/main/1.9.4/lang/nl_NL.lang",
+ "/game/web/main/1.9.4/lang/nn_NO.lang",
+ "/game/web/main/1.9.4/lang/no_NO.lang",
+ "/game/web/main/1.9.4/lang/oc_FR.lang",
+ "/game/web/main/1.9.4/lang/pl_PL.lang",
+ "/game/web/main/1.9.4/lang/pt_BR.lang",
+ "/game/web/main/1.9.4/lang/pt_PT.lang",
+ "/game/web/main/1.9.4/lang/qya_AA.lang",
+ "/game/web/main/1.9.4/lang/ro_RO.lang",
+ "/game/web/main/1.9.4/lang/ru_RU.lang",
+ "/game/web/main/1.9.4/lang/se_NO.lang",
+ "/game/web/main/1.9.4/lang/sk_SK.lang",
+ "/game/web/main/1.9.4/lang/sl_SI.lang",
+ "/game/web/main/1.9.4/lang/sr_SP.lang",
+ "/game/web/main/1.9.4/lang/sv_SE.lang",
+ "/game/web/main/1.9.4/lang/th_TH.lang",
+ "/game/web/main/1.9.4/lang/tlh_AA.lang",
+ "/game/web/main/1.9.4/lang/tr_TR.lang",
+ "/game/web/main/1.9.4/lang/uk_UA.lang",
+ "/game/web/main/1.9.4/lang/val_ES.lang",
+ "/game/web/main/1.9.4/lang/vi_VN.lang",
+ "/game/web/main/1.9.4/lang/zh_CN.lang",
+ "/game/web/main/1.9.4/lang/zh_TW.lang",
+ "/game/web/main/a1.2.6/index.html",
+ "/game/web/main/a1.2.6/js/app.js",
+ "/game/web/main/a1.2.6/resources.mc",
+ "/game/web/main/b1.3/assets.epk",
+ "/game/web/main/b1.3/classes.js",
+ "/game/web/main/b1.3/index.html",
+ "/game/web/main/b1.7.3/index.html",
+ "/game/web/main/b1.7.3/js/app.js",
+ "/game/web/main/b1.7.3/js/app.js.map",
+ "/game/web/main/b1.7.3/resources.mc",
+ "/game/web/main/classic/app.js",
+ "/game/web/main/classic/index.html",
+ "/game/web/main/classic/resources.mc",
+ "/game/web/main/indev/app.js",
+ "/game/web/main/indev/index.html",
+ "/game/web/main/indev/resources.mc",
+ "/game/web/main/infdev/app.js",
+ "/game/web/main/infdev/index.html",
+ "/game/web/main/infdev/resources.epk",
+ "/home/archive/index.html",
+ "/home/clients/index.html",
+ "/home/downloads/index.html",
+ "/home/game/index.html",
+ "/index.html",
+ "/manifest.json",
+ "/mobile/index.html",
+ "/mods/client/index.html",
+ "/mods/mods/index.html",
+ "/mods/resourcepacks/index.html",
+ "/offline.html",
+ "/resources/fonts/Minecraftia-Regular.ttf",
+ "/resources/images/backgrounds/themes/campfire.webp",
+ "/resources/images/backgrounds/themes/cherry-blossom.webp",
+ "/resources/images/backgrounds/themes/nether.webp",
+ "/resources/images/backgrounds/themes/overworld.webp",
+ "/resources/images/backgrounds/themes/retro.webp",
+ "/resources/images/backgrounds/themes/starfall.webp",
+ "/resources/images/backgrounds/themes/the-end.webp",
+ "/resources/images/covers/clients.webp",
+ "/resources/images/covers/eaglerforge.webp",
+ "/resources/images/covers/minecraft.webp",
+ "/resources/images/icons/clients/1.9.4.webp",
+ "/resources/images/icons/clients/all.webp",
+ "/resources/images/icons/clients/astra.webp",
+ "/resources/images/icons/clients/eagler.webp",
+ "/resources/images/icons/clients/eaglerforge.webp",
+ "/resources/images/icons/clients/eaglermobile.webp",
+ "/resources/images/icons/clients/eaglerpocketmobile.webp",
+ "/resources/images/icons/clients/resent.webp",
+ "/resources/images/icons/clients/shadow.webp",
+ "/resources/images/icons/clients/starlike.webp",
+ "/resources/images/icons/favicon.webp",
+ "/resources/images/icons/loading.webp",
+ "/resources/images/icons/minexlauncher.webp",
+ "/resources/images/icons/nav/game.webp",
+ "/resources/images/icons/nav/mods.webp",
+ "/resources/images/icons/nav/servers.webp",
+ "/resources/images/icons/nav/settings.webp",
+ "/resources/images/icons/nav/updates.webp",
+ "/resources/manifest/icons/any/192x192.webp",
+ "/resources/manifest/icons/any/512x512.webp",
+ "/resources/manifest/icons/maskable/2275x2275.webp",
+ "/resources/manifest/screenshots/home.webp",
+ "/resources/mods/data.json",
+ "/resources/mods/downloads/autoclicker.js",
+ "/resources/mods/downloads/autofish.js",
+ "/resources/mods/downloads/barebones-bossbars.zip",
+ "/resources/mods/downloads/barneys-music-mod.js",
+ "/resources/mods/downloads/blink.js",
+ "/resources/mods/downloads/blur.js",
+ "/resources/mods/downloads/burmod.js",
+ "/resources/mods/downloads/chat-commands-mod.js",
+ "/resources/mods/downloads/chat-shortcuts.js",
+ "/resources/mods/downloads/daggers.zip",
+ "/resources/mods/downloads/faithful-32x.zip",
+ "/resources/mods/downloads/fresheaglerui.js",
+ "/resources/mods/downloads/fullbright.js",
+ "/resources/mods/downloads/grapplehook.js",
+ "/resources/mods/downloads/jetpack.js",
+ "/resources/mods/downloads/low-on-fire.zip",
+ "/resources/mods/downloads/nofall.js",
+ "/resources/mods/downloads/semiautologin.js",
+ "/resources/mods/downloads/serified-font.zip",
+ "/resources/mods/downloads/speed-mod.js",
+ "/resources/mods/downloads/statshud.js",
+ "/resources/mods/downloads/xray.js",
+ "/resources/mods/icons/all.webp",
+ "/resources/mods/icons/autoclicker.webp",
+ "/resources/mods/icons/barebones-bossbars.webp",
+ "/resources/mods/icons/barneys-music-mod.webp",
+ "/resources/mods/icons/blur.webp",
+ "/resources/mods/icons/daggers.webp",
+ "/resources/mods/icons/faithful-32x.webp",
+ "/resources/mods/icons/fullbright.webp",
+ "/resources/mods/icons/grapplehook.webp",
+ "/resources/mods/icons/jetpack.webp",
+ "/resources/mods/icons/low-on-fire.webp",
+ "/resources/mods/icons/serified-font.webp",
+ "/resources/mods/icons/speed-mod.webp",
+ "/resources/mods/icons/statshud.webp",
+ "/resources/mods/icons/xray.webp",
+ "/resources/styles/eagler.css",
+ "/resources/styles/index.css",
+ "/resources/styles/mobile.css",
+ "/resources/styles/themes/campfire.css",
+ "/resources/styles/themes/cherry-blossom.css",
+ "/resources/styles/themes/default.css",
+ "/resources/styles/themes/hyperdark.css",
+ "/resources/styles/themes/light.css",
+ "/resources/styles/themes/nether.css",
+ "/resources/styles/themes/overworld.css",
+ "/resources/styles/themes/retro.css",
+ "/resources/styles/themes/starfall.css",
+ "/resources/styles/themes/the-end.css",
+ "/servers/index.html",
+ "/service-worker.js",
+ "/settings/index.html",
+ "/sw-register.js",
+ "/updates/index.html",
+ "/welcome.html"
+]
\ No newline at end of file
diff --git a/public/index.html b/public/index.html
index 71657b2..2e9c939 100644
--- a/public/index.html
+++ b/public/index.html
@@ -9,7 +9,7 @@
-
+
-
+
diff --git a/public/manifest.json b/public/manifest.json
index 8322dde..c423b12 100644
--- a/public/manifest.json
+++ b/public/manifest.json
@@ -1,7 +1,7 @@
{
"name": "MineXLauncher",
"short_name": "MineX",
- "description": "Custom launcher for Eaglercraft, which contains many versions and clients.",
+ "description": "MineXLauncher is a custom launcher for Eaglercraft that has many versions and clients.",
"id": "/",
"start_url": "/",
"theme_color": "#333",
@@ -12,29 +12,28 @@
"categories": ["games"],
"icons": [
{
- "src": "/resources/images/icons/minexlauncher.webp",
- "sizes": "192x192 512x512 2048x2048",
+ "src": "/resources/manifest/icons/any/192x192.webp",
+ "sizes": "192x192",
"type": "image/webp"
},
{
- "src": "/resources/manifest/icons/maskable-2275x2275.webp",
- "sizes": "192x192 512x512 2275x2275",
+ "src": "/resources/manifest/icons/any/512x512.webp",
+ "sizes": "512x512",
+ "type": "image/webp"
+ },
+ {
+ "src": "/resources/manifest/icons/maskable/2275x2275.webp",
+ "sizes": "2275x2275",
"type": "image/webp",
"purpose": "maskable"
}
],
"screenshots": [
{
- "src": "/resources/manifest/screenshots/desktop/later.webp",
- "sizes": "1280x720",
+ "src": "/resources/manifest/screenshots/home.webp",
+ "sizes": "1366x768",
"type": "image/webp",
"form_factor": "wide"
- },
- {
- "src": "/resources/manifest/screenshots/mobile/later.webp",
- "sizes": "1280x720",
- "type": "image/webp",
- "form_factor": "narrow"
}
]
}
diff --git a/public/resources/manifest/icons/any/192x192.webp b/public/resources/manifest/icons/any/192x192.webp
new file mode 100644
index 0000000..03e378c
Binary files /dev/null and b/public/resources/manifest/icons/any/192x192.webp differ
diff --git a/public/resources/manifest/icons/any/512x512.webp b/public/resources/manifest/icons/any/512x512.webp
new file mode 100644
index 0000000..1008f6c
Binary files /dev/null and b/public/resources/manifest/icons/any/512x512.webp differ
diff --git a/public/resources/manifest/icons/maskable-2275x2275.webp b/public/resources/manifest/icons/maskable/2275x2275.webp
similarity index 100%
rename from public/resources/manifest/icons/maskable-2275x2275.webp
rename to public/resources/manifest/icons/maskable/2275x2275.webp
diff --git a/public/resources/manifest/screenshots/home.webp b/public/resources/manifest/screenshots/home.webp
new file mode 100644
index 0000000..946241e
Binary files /dev/null and b/public/resources/manifest/screenshots/home.webp differ
diff --git a/public/service-worker.js b/public/service-worker.js
index 6a74a56..cb99fa4 100644
--- a/public/service-worker.js
+++ b/public/service-worker.js
@@ -1,49 +1,34 @@
-const cacheAssets = [
- '/offline.html',
- '/resources/images/icons/favicon.webp',
- '/resources/scripts/google-tag.js',
- '/resources/scripts/main.js',
- '/resources/styles/mobile.css',
- '/resources/styles/themes/default.css',
- '/resources/styles/themes/light.css',
- '/resources/styles/themes/hyperdark.css',
- '/resources/styles/themes/overworld.css',
- '/resources/styles/themes/nether.css',
- '/resources/styles/themes/the-end.css',
- '/resources/styles/themes/cherry-blossom.css',
- '/resources/styles/themes/retro.css',
- '/resources/styles/themes/starfall.css',
- '/resources/styles/themes/campfire.css',
- '/resources/images/backgrounds/themes/overworld.webp',
- '/resources/images/backgrounds/themes/nether.webp',
- '/resources/images/backgrounds/themes/the-end.webp',
- '/resources/images/backgrounds/themes/cherry-blossom.webp',
- '/resources/images/backgrounds/themes/retro.webp',
- '/resources/images/backgrounds/themes/starfall.webp',
- '/resources/images/backgrounds/themes/campfire.webp',
-];
+const cacheVersion = 'v1.5';
+const cacheName = `minexlauncher-${cacheVersion}`;
self.addEventListener('install', (event) => {
event.waitUntil(
- caches.delete('minexlauncher'),
- caches.open('minexlauncher').then(async (cache) => {
+ caches.open(cacheName).then(async (cache) => {
+ const response = await fetch('/cacheAssets.json');
+ const cacheAssets = await response.json();
return await cache.addAll(cacheAssets);
})
);
});
-self.addEventListener('fetch', (event) => {
- if (event.request.mode === 'navigate') {
- event.respondWith(
- fetch(event.request).catch(() => {
- return caches.match('/offline.html');
- })
- );
- } else {
- event.respondWith(
- fetch(event.request).catch(() => {
- return caches.match(event.request);
- })
- );
- }
+self.addEventListener('activate', (event) => {
+ event.waitUntil(
+ caches.keys().then((keyList) => {
+ return Promise.all(
+ keyList.map((key) => {
+ if (key !== cacheName) {
+ return caches.delete(key);
+ }
+ })
+ );
+ })
+ );
+});
+
+self.addEventListener('fetch', (event) => {
+ event.respondWith(
+ caches.open(cacheName).then(async (cache) => {
+ return (await cache.match(event.request)) || fetch(event.request);
+ })
+ );
});
diff --git a/src/resources/scripts/main.ts b/src/resources/scripts/main.ts
index 49d2935..8f58c6c 100644
--- a/src/resources/scripts/main.ts
+++ b/src/resources/scripts/main.ts
@@ -1,5 +1,13 @@
+interface BeforeInstallPromptEvent extends Event {
+ readonly platforms: string[];
+ readonly userChoice: Promise<{ outcome: 'accepted' | 'dismissed'; platform: string }>;
+ prompt(): Promise<{ outcome: 'accepted' | 'dismissed'; platform: string }>;
+}
+
let selectedVersion: string | undefined;
const launcherVersion = '1.5';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+let installPwaEvent: BeforeInstallPromptEvent;
const theme = {
load: function (themeToLoad?: string) {
@@ -265,23 +273,22 @@ const detect = {
},
};
-if (detect.mobile()) {
- const link = document.createElement('link');
- link.rel = 'stylesheet';
- link.href = '/resources/styles/mobile.css';
- document.head.appendChild(link);
-}
-theme.load();
+if (window.location.pathname === '/') {
+ window.addEventListener('beforeinstallprompt', (event) => {
+ installPwaEvent = event as BeforeInstallPromptEvent;
+ });
+} else {
+ document.addEventListener('DOMContentLoaded', () => {
+ // @ts-expect-error 123
+ delete window.installPwaEvent;
-if (window.location.pathname !== '/') {
- document.addEventListener('DOMContentLoaded', function () {
const profileName = document.getElementById('profile-name');
if (profileName) {
profileName.textContent = storage.local.get('username');
}
});
- document.addEventListener('DOMContentLoaded', function () {
+ document.addEventListener('DOMContentLoaded', () => {
const lastVersion = storage.local.get('lastVersion');
if (lastVersion !== null && lastVersion < launcherVersion) {
alert(`MineXLauncher has been updated to v${launcherVersion}!
@@ -292,3 +299,11 @@ Changes in v${launcherVersion}:
}
});
}
+
+if (detect.mobile()) {
+ const link = document.createElement('link');
+ link.rel = 'stylesheet';
+ link.href = '/resources/styles/mobile.css';
+ document.head.appendChild(link);
+}
+theme.load();
\ No newline at end of file
diff --git a/src/resources/scripts/settings.ts b/src/resources/scripts/settings.ts
index 3ffa3b0..f9c4871 100644
--- a/src/resources/scripts/settings.ts
+++ b/src/resources/scripts/settings.ts
@@ -1,5 +1,5 @@
if (window.location.pathname === '/settings/') {
- document.addEventListener('DOMContentLoaded', function () {
+ document.addEventListener('DOMContentLoaded', () => {
const profileName = document.getElementById('profile-name');
const usernameInput = document.getElementById('username-input') as HTMLInputElement;
const themeSelect = document.getElementById('theme-select') as HTMLSelectElement;
@@ -7,7 +7,7 @@ if (window.location.pathname === '/settings/') {
usernameInput.placeholder = storage.local.get('username') ?? '';
themeSelect.value = storage.local.get('theme') ?? '';
- usernameInput.addEventListener('input', function () {
+ usernameInput.addEventListener('input', () => {
let username = usernameInput.value.replace(/[^A-Za-z0-9]/g, '_').substring(0, 16);
usernameInput.value = username;
while (username.length < 3) {
@@ -19,28 +19,28 @@ if (window.location.pathname === '/settings/') {
}
});
- themeSelect.addEventListener('change', function () {
+ themeSelect.addEventListener('change', () => {
theme.set(themeSelect.value);
});
});
}
if (window.location.pathname === '/welcome.html') {
- document.addEventListener('DOMContentLoaded', function () {
+ document.addEventListener('DOMContentLoaded', () => {
const setupForm = document.getElementById('setup-form') as HTMLFormElement;
const usernameInput = document.getElementById('username-input') as HTMLInputElement;
const themeSelect = document.getElementById('theme-select') as HTMLSelectElement;
- usernameInput.addEventListener('input', function () {
+ usernameInput.addEventListener('input', () => {
const username = usernameInput.value.replace(/[^A-Za-z0-9]/g, '_').substring(0, 16);
usernameInput.value = username;
});
- themeSelect.addEventListener('change', function () {
+ themeSelect.addEventListener('change', () => {
theme.load(themeSelect.value);
});
- setupForm.addEventListener('submit', function (event) {
+ setupForm.addEventListener('submit', (event) => {
event.preventDefault();
let username = usernameInput.value.replace(/[^A-Za-z0-9]/g, '_').substring(0, 16);
@@ -56,6 +56,12 @@ if (window.location.pathname === '/welcome.html') {
storage.local.set('username', username);
storage.local.set('theme', themeSelect.value);
storage.local.set('lastVersion', launcherVersion);
+ try {
+ // @ts-expect-error 123
+ window.top?.installPwaEvent.prompt();
+ } catch (error) {
+ console.warn('Failed to prompt PWA install:', error);
+ }
// @ts-expect-error 123
window.top.location.href = '/';
}