wynnbuilder-forked-for-changes/load.js

150 lines
4.3 KiB
JavaScript
Raw Normal View History

2021-01-23 16:38:13 +00:00
const DB_VERSION = 27;
2021-01-07 00:08:19 +00:00
// @See https://github.com/mdn/learning-area/blob/master/javascript/apis/client-side-storage/indexeddb/video-store/index.js
let db;
let reload = false;
let items;
2021-01-10 01:33:42 +00:00
let sets;
2021-01-07 00:08:19 +00:00
/*
* Load item set from local DB. Calls init() on success.
*/
async function load_local(init_func) {
let get_tx = db.transaction(['item_db', 'set_db'], 'readonly');
2021-01-10 02:16:19 +00:00
let sets_store = get_tx.objectStore('set_db');
2021-01-07 00:08:19 +00:00
let get_store = get_tx.objectStore('item_db');
let request = get_store.getAll();
request.onerror = function(event) {
2021-01-10 02:16:19 +00:00
console.log("Could not read local item db...");
2021-01-07 00:08:19 +00:00
}
request.onsuccess = function(event) {
2021-01-10 02:16:19 +00:00
console.log("Successfully read local item db.");
2021-01-07 00:08:19 +00:00
items = request.result;
2021-01-10 02:16:19 +00:00
let request2 = sets_store.openCursor();
sets = {};
request2.onerror = function(event) {
console.log("Could not read local set db...");
}
request2.onsuccess = function(event) {
let cursor = event.target.result;
if (cursor) {
sets[cursor.primaryKey] = cursor.value;
cursor.continue();
}
else {
console.log("Successfully read local set db.");
2021-01-23 16:38:13 +00:00
//console.log(sets);
2021-01-10 02:16:19 +00:00
init_func();
}
}
2021-01-07 00:08:19 +00:00
}
await get_tx.complete;
db.close();
}
/*
* Clean bad item data. For now just assigns display name if it isn't already assigned.
*/
function clean_item(item) {
2021-01-23 10:53:24 +00:00
if (item.remapID === undefined) {
if (item.displayName === undefined) {
item.displayName = item.name;
}
item.skillpoints = [item.str, item.dex, item.int, item.def, item.agi];
item.has_negstat = item.str < 0 || item.dex < 0 || item.int < 0 || item.def < 0 || item.agi < 0;
item.reqs = [item.strReq, item.dexReq, item.intReq, item.defReq, item.agiReq];
2021-01-07 00:08:19 +00:00
}
}
/*
* Load item set from remote DB (aka a big json file). Calls init() on success.
*/
async function load(init_func) {
let getUrl = window.location;
let baseUrl = getUrl.protocol + "//" + getUrl.host + "/" + getUrl.pathname.split('/')[1];
let url = baseUrl + "/compress.json";
2021-01-07 00:08:19 +00:00
let result = await (await fetch(url)).json();
items = result.items;
2021-01-10 01:33:42 +00:00
sets = result.sets;
2021-01-07 00:08:19 +00:00
2021-01-19 21:07:10 +00:00
let clear_tx = db.transaction(['item_db', 'set_db'], 'readwrite');
let clear_items = clear_tx.objectStore('item_db');
let clear_sets = clear_tx.objectStore('item_db');
await clear_items.clear();
await clear_sets.clear();
await clear_tx.complete;
2021-01-10 02:16:19 +00:00
let add_tx = db.transaction(['item_db', 'set_db'], 'readwrite');
2021-01-23 11:36:38 +00:00
add_tx.onabort = function(e) {
console.log(e);
2021-01-19 21:07:10 +00:00
console.log("Not enough space...");
};
2021-01-10 02:16:19 +00:00
let items_store = add_tx.objectStore('item_db');
2021-01-07 00:08:19 +00:00
let add_promises = [];
for (const item of items) {
clean_item(item);
2021-01-19 21:07:10 +00:00
let req = items_store.add(item, item.name);
req.onerror = function() {
console.log("ADD ITEM ERROR? " + item.name);
};
add_promises.push(req);
2021-01-10 02:16:19 +00:00
}
let sets_store = add_tx.objectStore('set_db');
for (const set in sets) {
add_promises.push(sets_store.add(sets[set], set));
2021-01-07 00:08:19 +00:00
}
add_promises.push(add_tx.complete);
Promise.all(add_promises).then((values) => {
db.close();
init_func();
});
}
function load_init(init_func) {
let request = window.indexedDB.open('item_db', DB_VERSION);
2021-01-07 00:08:19 +00:00
request.onerror = function() {
console.log("DB failed to open...");
};
2021-01-07 00:08:19 +00:00
request.onsuccess = function() {
db = request.result;
if (!reload) {
console.log("Using stored data...")
load_local(init_func);
}
else {
console.log("Using new data...")
load(init_func);
}
}
request.onupgradeneeded = function(e) {
reload = true;
let db = e.target.result;
try {
db.deleteObjectStore('item_db');
}
catch (error) {
2021-01-10 02:16:19 +00:00
console.log("Could not delete item DB. This is probably fine");
}
try {
db.deleteObjectStore('set_db');
}
catch (error) {
console.log("Could not delete set DB. This is probably fine");
2021-01-07 00:08:19 +00:00
}
2021-01-10 02:16:19 +00:00
db.createObjectStore('item_db');
db.createObjectStore('set_db');
2021-01-07 00:08:19 +00:00
console.log("DB setup complete...");
}
}