mirror of
https://github.com/eaglerforge/EaglerForgeInjector
synced 2025-07-24 14:41:18 -09:00
Switch files fully to IDB, GUI fixes
This commit is contained in:
parent
5fd5eefdbd
commit
4c605ec5cf
@ -169,7 +169,7 @@
|
|||||||
|
|
||||||
<!-- Code assets -->
|
<!-- Code assets -->
|
||||||
<script src="postinit.js"></script>
|
<script src="postinit.js"></script>
|
||||||
<script src="modloader.injector.js"></script>
|
<script src="modloader.js"></script>
|
||||||
<script src="modgui.js"></script>
|
<script src="modgui.js"></script>
|
||||||
<script src="efserver.js"></script>
|
<script src="efserver.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
18
modgui.js
18
modgui.js
@ -24,7 +24,7 @@ globalThis.modapi_guikit = "(" + (() => {
|
|||||||
</h5>
|
</h5>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<table class="modTable">
|
<table id="modapi_gui_modTable">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
@ -162,15 +162,18 @@ globalThis.modapi_guikit = "(" + (() => {
|
|||||||
font-size: 1.25rem;
|
font-size: 1.25rem;
|
||||||
box-shadow: 0 -4px 6px rgba(0, 0, 0, 0.1);
|
box-shadow: 0 -4px 6px rgba(0, 0, 0, 0.1);
|
||||||
}
|
}
|
||||||
|
#modapi_gui_modTable {
|
||||||
|
min-width: 40vw;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</div>`;
|
</div>`;
|
||||||
|
|
||||||
async function fileToDataURI(file) {
|
async function fileToText(file) {
|
||||||
return new Promise((res, rej) => {
|
return new Promise((res, rej) => {
|
||||||
var fr = new FileReader();
|
var fr = new FileReader();
|
||||||
fr.addEventListener("error", (e) => { rej(e); });
|
fr.addEventListener("error", (e) => { rej(e); });
|
||||||
fr.addEventListener("load", (e) => { res(fr.result); });
|
fr.addEventListener("load", (e) => { res(fr.result); });
|
||||||
fr.readAsDataURL(file);
|
fr.readAsText(file);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
window.modapi_displayModGui = async function (cb) {
|
window.modapi_displayModGui = async function (cb) {
|
||||||
@ -191,7 +194,7 @@ globalThis.modapi_guikit = "(" + (() => {
|
|||||||
document.querySelector("#modapi_gui_container")._cb = cb;
|
document.querySelector("#modapi_gui_container")._cb = cb;
|
||||||
|
|
||||||
var modsList = await getMods();
|
var modsList = await getMods();
|
||||||
var tbody = document.querySelector("#modapi_gui_container .modTable tbody");
|
var tbody = document.querySelector("#modapi_gui_container #modapi_gui_modTable tbody");
|
||||||
tbody.innerHTML = "";
|
tbody.innerHTML = "";
|
||||||
modsList.forEach((modtxt, i) => {
|
modsList.forEach((modtxt, i) => {
|
||||||
if (!modtxt) { return }
|
if (!modtxt) { return }
|
||||||
@ -245,7 +248,6 @@ globalThis.modapi_guikit = "(" + (() => {
|
|||||||
var button = document.createElement("button");
|
var button = document.createElement("button");
|
||||||
button.innerText = "Delete";
|
button.innerText = "Delete";
|
||||||
button.style.height = "3rem";
|
button.style.height = "3rem";
|
||||||
button.style.marginTop = "calc(50% - 1.5rem)";
|
|
||||||
button.addEventListener("click", async () => {
|
button.addEventListener("click", async () => {
|
||||||
await removeMod(i);
|
await removeMod(i);
|
||||||
window.modapi_displayModGui();
|
window.modapi_displayModGui();
|
||||||
@ -254,7 +256,7 @@ globalThis.modapi_guikit = "(" + (() => {
|
|||||||
controls.appendChild(button);
|
controls.appendChild(button);
|
||||||
tr.appendChild(mod);
|
tr.appendChild(mod);
|
||||||
tr.appendChild(spacer);
|
tr.appendChild(spacer);
|
||||||
tr.appendChild(button);
|
tr.appendChild(controls);
|
||||||
tbody.appendChild(tr);
|
tbody.appendChild(tr);
|
||||||
});
|
});
|
||||||
var once = false;
|
var once = false;
|
||||||
@ -279,7 +281,7 @@ globalThis.modapi_guikit = "(" + (() => {
|
|||||||
if (!mod || mod.length === 0) {
|
if (!mod || mod.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await addMod("web@" + mod);
|
await addMod(mod);
|
||||||
window.modapi_displayModGui();
|
window.modapi_displayModGui();
|
||||||
}
|
}
|
||||||
window.modapi_uploadmod = async () => {
|
window.modapi_uploadmod = async () => {
|
||||||
@ -292,7 +294,7 @@ globalThis.modapi_guikit = "(" + (() => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (let i = 0; i < f.files.length; i++) {
|
for (let i = 0; i < f.files.length; i++) {
|
||||||
await addMod("web@" + (await fileToDataURI(f.files[i])).replaceAll(";base64", ";fs=" + f.files[i].name + ";base64"));
|
await addFileMod(f.files[i].name, (await fileToText(f.files[i])));
|
||||||
}
|
}
|
||||||
window.modapi_displayModGui();
|
window.modapi_displayModGui();
|
||||||
});
|
});
|
||||||
|
@ -1,212 +0,0 @@
|
|||||||
globalThis.modapi_modloader = `function promisifyIDBRequest(request) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
request.onsuccess = () => resolve(request.result);
|
|
||||||
request.onerror = () => reject(request.error);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getDatabase() {
|
|
||||||
const dbRequest = indexedDB.open("EF_MODS");
|
|
||||||
const db = await promisifyIDBRequest(dbRequest);
|
|
||||||
|
|
||||||
if (!db.objectStoreNames.contains("filesystem")) {
|
|
||||||
db.close();
|
|
||||||
const version = db.version + 1;
|
|
||||||
const upgradeRequest = indexedDB.open("EF_MODS", version);
|
|
||||||
upgradeRequest.onupgradeneeded = (event) => {
|
|
||||||
const upgradedDb = event.target.result;
|
|
||||||
upgradedDb.createObjectStore("filesystem");
|
|
||||||
};
|
|
||||||
return promisifyIDBRequest(upgradeRequest);
|
|
||||||
}
|
|
||||||
|
|
||||||
return db;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getMods() {
|
|
||||||
const db = await getDatabase();
|
|
||||||
const transaction = db.transaction(["filesystem"], "readonly");
|
|
||||||
const objectStore = transaction.objectStore("filesystem");
|
|
||||||
const object = await promisifyIDBRequest(objectStore.get("mods.txt"));
|
|
||||||
return object ? (await object.text()).split("|") : [];
|
|
||||||
}
|
|
||||||
|
|
||||||
async function saveMods(mods) {
|
|
||||||
const db = await getDatabase();
|
|
||||||
const transaction = db.transaction(["filesystem"], "readwrite");
|
|
||||||
const objectStore = transaction.objectStore("filesystem");
|
|
||||||
const encoder = new TextEncoder();
|
|
||||||
const modsData = encoder.encode(mods.join("|"));
|
|
||||||
const modsBlob = new Blob([modsData], { type: "text/plain" });
|
|
||||||
await promisifyIDBRequest(objectStore.put(modsBlob, "mods.txt"));
|
|
||||||
}
|
|
||||||
|
|
||||||
async function addMod(mod) {
|
|
||||||
const mods = await getMods();
|
|
||||||
mods.push(mod);
|
|
||||||
await saveMods(mods);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function removeMod(index) {
|
|
||||||
const mods = await getMods();
|
|
||||||
if (index >= 0 && index < mods.length) {
|
|
||||||
mods.splice(index, 1);
|
|
||||||
await saveMods(mods);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function resetMods() {
|
|
||||||
await saveMods([]);
|
|
||||||
console.log("Mods reset");
|
|
||||||
}
|
|
||||||
|
|
||||||
window.modLoader = async function modLoader(modsArr = []) {
|
|
||||||
if (!window.eaglerMLoaderMainRun) {
|
|
||||||
var searchParams = new URLSearchParams(location.search);
|
|
||||||
searchParams.getAll("mod").forEach((modToAdd) => {
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Adding mod to loadlist from search params: " + modToAdd
|
|
||||||
);
|
|
||||||
modsArr.push(modToAdd);
|
|
||||||
});
|
|
||||||
searchParams.getAll("plugin").forEach((modToAdd) => {
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Adding mod to loadlist from search params: " + modToAdd
|
|
||||||
);
|
|
||||||
modsArr.push(modToAdd);
|
|
||||||
});
|
|
||||||
if (
|
|
||||||
!!eaglercraftXOpts &&
|
|
||||||
!!eaglercraftXOpts.Mods &&
|
|
||||||
Array.isArray(eaglercraftXOpts.Mods)
|
|
||||||
) {
|
|
||||||
eaglercraftXOpts.Mods.forEach((modToAdd) => {
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Adding mod to loadlist from eaglercraftXOpts: " +
|
|
||||||
modToAdd
|
|
||||||
);
|
|
||||||
modsArr.push(modToAdd);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("[EaglerML] Searching in iDB");
|
|
||||||
try {
|
|
||||||
var idbMods = await getMods();
|
|
||||||
modsArr = modsArr.concat(idbMods
|
|
||||||
.filter(x => { return x && x.length > 0 })
|
|
||||||
.flatMap(x => { if (x.startsWith("web@")) { return x.replace("web@", "") } return x })
|
|
||||||
);
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
|
|
||||||
window.eaglerMLoaderMainRun = true;
|
|
||||||
}
|
|
||||||
if (window.noLoadMods === true) {
|
|
||||||
modsArr.splice(0, modsArr.length);
|
|
||||||
}
|
|
||||||
function checkModsLoaded(totalLoaded, identifier) {
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Checking if mods are finished :: " +
|
|
||||||
totalLoaded +
|
|
||||||
"/" +
|
|
||||||
modsArr.length
|
|
||||||
);
|
|
||||||
if (totalLoaded >= modsArr.length) {
|
|
||||||
clearInterval(identifier);
|
|
||||||
window.ModGracePeriod = false;
|
|
||||||
if (
|
|
||||||
window.eaglerMLoaderMainRun &&
|
|
||||||
ModAPI &&
|
|
||||||
ModAPI.events &&
|
|
||||||
ModAPI.events.callEvent
|
|
||||||
) {
|
|
||||||
ModAPI.events.callEvent("load", {});
|
|
||||||
}
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Checking if mods are finished :: All mods loaded! Grace period off."
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function methodB(currentMod) {
|
|
||||||
try {
|
|
||||||
console.log("[EaglerML] Loading " + currentMod + " via method B.");
|
|
||||||
var script = document.createElement("script");
|
|
||||||
script.setAttribute("data-hash", ModAPI.util.hashCode("web@"+currentMod));
|
|
||||||
script.src = currentMod;
|
|
||||||
script.setAttribute("data-isMod", "true");
|
|
||||||
script.onerror = () => {
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Failed to load " + currentMod + " via method B!"
|
|
||||||
);
|
|
||||||
script.remove();
|
|
||||||
totalLoaded++;
|
|
||||||
};
|
|
||||||
script.onload = () => {
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Successfully loaded " + currentMod + " via method B."
|
|
||||||
);
|
|
||||||
totalLoaded++;
|
|
||||||
};
|
|
||||||
document.body.appendChild(script);
|
|
||||||
} catch (error) {
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Oh no! The mod " + currentMod + " failed to load!"
|
|
||||||
);
|
|
||||||
totalLoaded++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
window.ModGracePeriod = true;
|
|
||||||
var totalLoaded = 0;
|
|
||||||
var loaderCheckInterval = null;
|
|
||||||
modsArr.forEach((c) => {
|
|
||||||
let currentMod = c;
|
|
||||||
console.log("[EaglerML] Starting " + currentMod);
|
|
||||||
try {
|
|
||||||
var req = new XMLHttpRequest();
|
|
||||||
req.open("GET", currentMod);
|
|
||||||
req.onload = function xhrLoadHandler() {
|
|
||||||
console.log("[EaglerML] Loading " + currentMod + " via method A.");
|
|
||||||
var script = document.createElement("script");
|
|
||||||
script.setAttribute("data-hash", ModAPI.util.hashCode("web@"+currentMod));
|
|
||||||
try {
|
|
||||||
script.src =
|
|
||||||
"data:text/javascript," + encodeURIComponent(req.responseText);
|
|
||||||
} catch (error) {
|
|
||||||
methodB(currentMod);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
script.setAttribute("data-isMod", "true");
|
|
||||||
script.onerror = () => {
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Failed to load " + currentMod + " via method A!"
|
|
||||||
);
|
|
||||||
script.remove();
|
|
||||||
totalLoaded++;
|
|
||||||
};
|
|
||||||
script.onload = () => {
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Successfully loaded " + currentMod + " via method A."
|
|
||||||
);
|
|
||||||
totalLoaded++;
|
|
||||||
};
|
|
||||||
document.body.appendChild(script);
|
|
||||||
};
|
|
||||||
req.onerror = function xhrErrorHandler() {
|
|
||||||
methodB(currentMod);
|
|
||||||
};
|
|
||||||
req.send();
|
|
||||||
} catch (error) {
|
|
||||||
methodB(currentMod);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
loaderCheckInterval = setInterval(() => {
|
|
||||||
checkModsLoaded(totalLoaded, loaderCheckInterval);
|
|
||||||
}, 500);
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Starting to load " + modsArr.length + " mods..."
|
|
||||||
);
|
|
||||||
window.returnTotalLoadedMods = function returnTotalLoadedMods() {
|
|
||||||
return totalLoaded;
|
|
||||||
};
|
|
||||||
};`;
|
|
380
modloader.js
380
modloader.js
@ -1,177 +1,219 @@
|
|||||||
function promisifyIDBRequest(request) {
|
globalThis.modapi_modloader = "(" + (() => {
|
||||||
return new Promise((resolve, reject) => {
|
globalThis.promisifyIDBRequest = function promisifyIDBRequest(request) {
|
||||||
request.onsuccess = () => resolve(request.result);
|
return new Promise((resolve, reject) => {
|
||||||
request.onerror = () => reject(request.error);
|
request.onsuccess = () => resolve(request.result);
|
||||||
});
|
request.onerror = () => reject(request.error);
|
||||||
}
|
});
|
||||||
|
|
||||||
async function getDatabase() {
|
|
||||||
const dbRequest = indexedDB.open("EF_MODS");
|
|
||||||
const db = await promisifyIDBRequest(dbRequest);
|
|
||||||
|
|
||||||
if (!db.objectStoreNames.contains("filesystem")) {
|
|
||||||
db.close();
|
|
||||||
const version = db.version + 1;
|
|
||||||
const upgradeRequest = indexedDB.open("EF_MODS", version);
|
|
||||||
upgradeRequest.onupgradeneeded = (event) => {
|
|
||||||
const upgradedDb = event.target.result;
|
|
||||||
upgradedDb.createObjectStore("filesystem");
|
|
||||||
};
|
|
||||||
return promisifyIDBRequest(upgradeRequest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return db;
|
globalThis.getDatabase = async function getDatabase() {
|
||||||
}
|
const dbRequest = indexedDB.open("EF_MODS");
|
||||||
|
const db = await promisifyIDBRequest(dbRequest);
|
||||||
|
|
||||||
async function getMods() {
|
if (!db.objectStoreNames.contains("filesystem")) {
|
||||||
const db = await getDatabase();
|
db.close();
|
||||||
const transaction = db.transaction(["filesystem"], "readonly");
|
const version = db.version + 1;
|
||||||
const objectStore = transaction.objectStore("filesystem");
|
const upgradeRequest = indexedDB.open("EF_MODS", version);
|
||||||
const object = await promisifyIDBRequest(objectStore.get("mods.txt"));
|
upgradeRequest.onupgradeneeded = (event) => {
|
||||||
return object ? (await object.text()).split("|") : [];
|
const upgradedDb = event.target.result;
|
||||||
}
|
upgradedDb.createObjectStore("filesystem");
|
||||||
|
};
|
||||||
|
return promisifyIDBRequest(upgradeRequest);
|
||||||
|
}
|
||||||
|
|
||||||
async function saveMods(mods) {
|
return db;
|
||||||
const db = await getDatabase();
|
}
|
||||||
const transaction = db.transaction(["filesystem"], "readwrite");
|
|
||||||
const objectStore = transaction.objectStore("filesystem");
|
|
||||||
const encoder = new TextEncoder();
|
|
||||||
const modsData = encoder.encode(mods.join("|"));
|
|
||||||
const modsBlob = new Blob([modsData], { type: "text/plain" });
|
|
||||||
await promisifyIDBRequest(objectStore.put(modsBlob, "mods.txt"));
|
|
||||||
}
|
|
||||||
|
|
||||||
async function addMod(mod) {
|
globalThis.getMods = async function getMods() {
|
||||||
const mods = await getMods();
|
const db = await getDatabase();
|
||||||
mods.push(mod);
|
const transaction = db.transaction(["filesystem"], "readonly");
|
||||||
await saveMods(mods);
|
const objectStore = transaction.objectStore("filesystem");
|
||||||
}
|
const object = await promisifyIDBRequest(objectStore.get("mods.txt"));
|
||||||
|
var out = object ? (await object.text()).split("|") : [];
|
||||||
|
db.close();
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
async function removeMod(index) {
|
globalThis.getMod = async function getMod(mod) {
|
||||||
const mods = await getMods();
|
const db = await getDatabase();
|
||||||
if (index >= 0 && index < mods.length) {
|
const transaction = db.transaction(["filesystem"], "readonly");
|
||||||
mods.splice(index, 1);
|
const objectStore = transaction.objectStore("filesystem");
|
||||||
|
const object = await promisifyIDBRequest(objectStore.get("mods/" + mod));
|
||||||
|
var out = object ? (await object.text()) : "";
|
||||||
|
db.close();
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
globalThis.saveMods = async function saveMods(mods) {
|
||||||
|
const db = await getDatabase();
|
||||||
|
const transaction = db.transaction(["filesystem"], "readwrite");
|
||||||
|
const objectStore = transaction.objectStore("filesystem");
|
||||||
|
const encoder = new TextEncoder();
|
||||||
|
const modsData = encoder.encode(mods.join("|"));
|
||||||
|
const modsBlob = new Blob([modsData], { type: "text/plain" });
|
||||||
|
await promisifyIDBRequest(objectStore.put(modsBlob, "mods.txt"));
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
globalThis.addMod = async function addMod(mod) {
|
||||||
|
const mods = await getMods();
|
||||||
|
mods.push("web@" + mod);
|
||||||
await saveMods(mods);
|
await saveMods(mods);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
async function resetMods() {
|
globalThis.addFileMod = async function addFileMod(mod, textContents) {
|
||||||
await saveMods([]);
|
const mods = await getMods();
|
||||||
console.log("Mods reset");
|
mods.push(mod);
|
||||||
}
|
await saveMods(mods);
|
||||||
|
|
||||||
window.modLoader = async function modLoader(modsArr = []) {
|
const db = await getDatabase();
|
||||||
if (!window.eaglerMLoaderMainRun) {
|
const transaction = db.transaction(["filesystem"], "readwrite");
|
||||||
var searchParams = new URLSearchParams(location.search);
|
const objectStore = transaction.objectStore("filesystem");
|
||||||
searchParams.getAll("mod").forEach((modToAdd) => {
|
const encoder = new TextEncoder();
|
||||||
console.log(
|
const modsData = encoder.encode(textContents);
|
||||||
"[EaglerML] Adding mod to loadlist from search params: " + modToAdd
|
const modsBlob = new Blob([modsData], { type: "text/plain" });
|
||||||
);
|
await promisifyIDBRequest(objectStore.put(modsBlob, "mods/" + mod));
|
||||||
modsArr.push(modToAdd);
|
db.close();
|
||||||
});
|
|
||||||
searchParams.getAll("plugin").forEach((modToAdd) => {
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Adding mod to loadlist from search params: " + modToAdd
|
|
||||||
);
|
|
||||||
modsArr.push(modToAdd);
|
|
||||||
});
|
|
||||||
if (
|
|
||||||
!!eaglercraftXOpts &&
|
|
||||||
!!eaglercraftXOpts.Mods &&
|
|
||||||
Array.isArray(eaglercraftXOpts.Mods)
|
|
||||||
) {
|
|
||||||
eaglercraftXOpts.Mods.forEach((modToAdd) => {
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Adding mod to loadlist from eaglercraftXOpts: " +
|
|
||||||
modToAdd
|
|
||||||
);
|
|
||||||
modsArr.push(modToAdd);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("[EaglerML] Searching in iDB");
|
|
||||||
try {
|
|
||||||
var idbMods = await getMods();
|
|
||||||
modsArr = modsArr.concat(idbMods
|
|
||||||
.filter(x => { return x && x.length > 0 })
|
|
||||||
.flatMap(x => { if (x.startsWith("web@")) { return x.replace("web@", "") } return x })
|
|
||||||
);
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
|
|
||||||
window.eaglerMLoaderMainRun = true;
|
|
||||||
}
|
}
|
||||||
if (window.noLoadMods === true) {
|
|
||||||
modsArr.splice(0, modsArr.length);
|
globalThis.removeMod = async function removeMod(index) {
|
||||||
}
|
const mods = await getMods();
|
||||||
function checkModsLoaded(totalLoaded, identifier) {
|
if (index >= 0 && index < mods.length) {
|
||||||
console.log(
|
var deleted = mods.splice(index, 1)[0];
|
||||||
"[EaglerML] Checking if mods are finished :: " +
|
await saveMods(mods);
|
||||||
totalLoaded +
|
if (!deleted.startsWith("web@")) {
|
||||||
"/" +
|
const db = await getDatabase();
|
||||||
modsArr.length
|
const transaction = db.transaction(["filesystem"], "readwrite");
|
||||||
);
|
const objectStore = transaction.objectStore("filesystem");
|
||||||
if (totalLoaded >= modsArr.length) {
|
await promisifyIDBRequest(objectStore.delete("mods/" + deleted));
|
||||||
clearInterval(identifier);
|
db.close();
|
||||||
window.ModGracePeriod = false;
|
|
||||||
if (
|
|
||||||
window.eaglerMLoaderMainRun &&
|
|
||||||
ModAPI &&
|
|
||||||
ModAPI.events &&
|
|
||||||
ModAPI.events.callEvent
|
|
||||||
) {
|
|
||||||
ModAPI.events.callEvent("load", {});
|
|
||||||
}
|
}
|
||||||
console.log(
|
|
||||||
"[EaglerML] Checking if mods are finished :: All mods loaded! Grace period off."
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function methodB(currentMod) {
|
|
||||||
try {
|
globalThis.resetMods = async function resetMods() {
|
||||||
console.log("[EaglerML] Loading " + currentMod + " via method B.");
|
console.log("Resetting mods...");
|
||||||
var script = document.createElement("script");
|
const db = await getDatabase();
|
||||||
script.setAttribute("data-hash", ModAPI.util.hashCode("web@"+currentMod));
|
const transaction = db.transaction(["filesystem"], "readwrite");
|
||||||
script.src = currentMod;
|
const objectStore = transaction.objectStore("filesystem");
|
||||||
script.setAttribute("data-isMod", "true");
|
await promisifyIDBRequest(objectStore.clear());
|
||||||
script.onerror = () => {
|
console.log("Mods reset");
|
||||||
console.log(
|
db.close();
|
||||||
"[EaglerML] Failed to load " + currentMod + " via method B!"
|
|
||||||
);
|
|
||||||
script.remove();
|
|
||||||
totalLoaded++;
|
|
||||||
};
|
|
||||||
script.onload = () => {
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Successfully loaded " + currentMod + " via method B."
|
|
||||||
);
|
|
||||||
totalLoaded++;
|
|
||||||
};
|
|
||||||
document.body.appendChild(script);
|
|
||||||
} catch (error) {
|
|
||||||
console.log(
|
|
||||||
"[EaglerML] Oh no! The mod " + currentMod + " failed to load!"
|
|
||||||
);
|
|
||||||
totalLoaded++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
window.ModGracePeriod = true;
|
|
||||||
var totalLoaded = 0;
|
globalThis.modLoader = async function modLoader(modsArr = []) {
|
||||||
var loaderCheckInterval = null;
|
if (!window.eaglerMLoaderMainRun) {
|
||||||
modsArr.forEach((c) => {
|
var searchParams = new URLSearchParams(location.search);
|
||||||
let currentMod = c;
|
searchParams.getAll("mod").forEach((modToAdd) => {
|
||||||
console.log("[EaglerML] Starting " + currentMod);
|
console.log(
|
||||||
try {
|
"[EaglerML] Adding mod to loadlist from search params: " + modToAdd
|
||||||
var req = new XMLHttpRequest();
|
);
|
||||||
req.open("GET", currentMod);
|
modsArr.push("web@" + modToAdd);
|
||||||
req.onload = function xhrLoadHandler() {
|
});
|
||||||
|
searchParams.getAll("plugin").forEach((modToAdd) => {
|
||||||
|
console.log(
|
||||||
|
"[EaglerML] Adding mod to loadlist from search params: " + modToAdd
|
||||||
|
);
|
||||||
|
modsArr.push("web@" + modToAdd);
|
||||||
|
});
|
||||||
|
if (
|
||||||
|
!!eaglercraftXOpts &&
|
||||||
|
!!eaglercraftXOpts.Mods &&
|
||||||
|
Array.isArray(eaglercraftXOpts.Mods)
|
||||||
|
) {
|
||||||
|
eaglercraftXOpts.Mods.forEach((modToAdd) => {
|
||||||
|
console.log(
|
||||||
|
"[EaglerML] Adding mod to loadlist from eaglercraftXOpts: " +
|
||||||
|
modToAdd
|
||||||
|
);
|
||||||
|
modsArr.push(modToAdd);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("[EaglerML] Searching in iDB");
|
||||||
|
try {
|
||||||
|
var idbMods = await getMods();
|
||||||
|
modsArr = modsArr.concat(idbMods
|
||||||
|
.filter(x => { return x && x.length > 0 })
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.eaglerMLoaderMainRun = true;
|
||||||
|
}
|
||||||
|
if (window.noLoadMods === true) {
|
||||||
|
modsArr.splice(0, modsArr.length);
|
||||||
|
}
|
||||||
|
function checkModsLoaded(totalLoaded, identifier) {
|
||||||
|
console.log(
|
||||||
|
"[EaglerML] Checking if mods are finished :: " +
|
||||||
|
totalLoaded +
|
||||||
|
"/" +
|
||||||
|
modsArr.length
|
||||||
|
);
|
||||||
|
if (totalLoaded >= modsArr.length) {
|
||||||
|
clearInterval(identifier);
|
||||||
|
window.ModGracePeriod = false;
|
||||||
|
if (
|
||||||
|
window.eaglerMLoaderMainRun &&
|
||||||
|
ModAPI &&
|
||||||
|
ModAPI.events &&
|
||||||
|
ModAPI.events.callEvent
|
||||||
|
) {
|
||||||
|
ModAPI.events.callEvent("load", {});
|
||||||
|
}
|
||||||
|
console.log(
|
||||||
|
"[EaglerML] Checking if mods are finished :: All mods loaded! Grace period off."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function methodB(currentMod) {
|
||||||
|
try {
|
||||||
|
console.log("[EaglerML] Loading " + currentMod + " via method B.");
|
||||||
|
var script = document.createElement("script");
|
||||||
|
script.setAttribute("data-hash", ModAPI.util.hashCode("web@" + currentMod));
|
||||||
|
script.src = currentMod;
|
||||||
|
script.setAttribute("data-isMod", "true");
|
||||||
|
script.onerror = () => {
|
||||||
|
console.log(
|
||||||
|
"[EaglerML] Failed to load " + currentMod + " via method B!"
|
||||||
|
);
|
||||||
|
script.remove();
|
||||||
|
totalLoaded++;
|
||||||
|
};
|
||||||
|
script.onload = () => {
|
||||||
|
console.log(
|
||||||
|
"[EaglerML] Successfully loaded " + currentMod + " via method B."
|
||||||
|
);
|
||||||
|
totalLoaded++;
|
||||||
|
};
|
||||||
|
document.body.appendChild(script);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(
|
||||||
|
"[EaglerML] Oh no! The mod " + currentMod + " failed to load!"
|
||||||
|
);
|
||||||
|
totalLoaded++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
window.ModGracePeriod = true;
|
||||||
|
var totalLoaded = 0;
|
||||||
|
var loaderCheckInterval = null;
|
||||||
|
for (let i = 0; i < modsArr.length; i++) {
|
||||||
|
let currentMod = modsArr[i];
|
||||||
|
var isIDBMod = !currentMod.startsWith("web@");
|
||||||
|
if (!isIDBMod) {
|
||||||
|
currentMod = currentMod.replace("web@", "");
|
||||||
|
}
|
||||||
|
console.log("[EaglerML] Starting " + currentMod);
|
||||||
|
try {
|
||||||
|
var responseText = isIDBMod ? await getMod(currentMod) : await (await fetch(currentMod)).text();
|
||||||
console.log("[EaglerML] Loading " + currentMod + " via method A.");
|
console.log("[EaglerML] Loading " + currentMod + " via method A.");
|
||||||
var script = document.createElement("script");
|
var script = document.createElement("script");
|
||||||
script.setAttribute("data-hash", ModAPI.util.hashCode("web@"+currentMod));
|
script.setAttribute("data-hash", ModAPI.util.hashCode((isIDBMod ? "" : "web@") + currentMod));
|
||||||
try {
|
try {
|
||||||
script.src =
|
script.src =
|
||||||
"data:text/javascript," + encodeURIComponent(req.responseText);
|
"data:text/javascript," + encodeURIComponent(responseText);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
methodB(currentMod);
|
methodB(currentMod);
|
||||||
return;
|
return;
|
||||||
@ -191,22 +233,18 @@ window.modLoader = async function modLoader(modsArr = []) {
|
|||||||
totalLoaded++;
|
totalLoaded++;
|
||||||
};
|
};
|
||||||
document.body.appendChild(script);
|
document.body.appendChild(script);
|
||||||
};
|
} catch (error) {
|
||||||
req.onerror = function xhrErrorHandler() {
|
|
||||||
methodB(currentMod);
|
methodB(currentMod);
|
||||||
};
|
}
|
||||||
req.send();
|
|
||||||
} catch (error) {
|
|
||||||
methodB(currentMod);
|
|
||||||
}
|
}
|
||||||
});
|
loaderCheckInterval = setInterval(() => {
|
||||||
loaderCheckInterval = setInterval(() => {
|
checkModsLoaded(totalLoaded, loaderCheckInterval);
|
||||||
checkModsLoaded(totalLoaded, loaderCheckInterval);
|
}, 500);
|
||||||
}, 500);
|
console.log(
|
||||||
console.log(
|
"[EaglerML] Starting to load " + modsArr.length + " mods..."
|
||||||
"[EaglerML] Starting to load " + modsArr.length + " mods..."
|
);
|
||||||
);
|
window.returnTotalLoadedMods = function returnTotalLoadedMods() {
|
||||||
window.returnTotalLoadedMods = function returnTotalLoadedMods() {
|
return totalLoaded;
|
||||||
return totalLoaded;
|
};
|
||||||
};
|
};
|
||||||
};
|
}).toString() + ")();"
|
Loading…
x
Reference in New Issue
Block a user