json loading was slow so I optimized it by adding a cache system.
+let cachedData = null;
+const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes
+let cacheTimestamp = Date.now();
+
+// Fetch and cache the assignments data
+async function fetchAssignments() {
+ // Check if we need to fetch new data
+ if (!cachedData || (Date.now() - cacheTimestamp) > CACHE_EXPIRATION_MS) {
+ try {
+ const response = await fetch("./data/assignments.json");
+ cachedData = await response.json();
+ cacheTimestamp = Date.now(); // Update timestamp after fetching new data
+ } catch (error) {
+ console.error("Error fetching data:", error);
+ cachedData = []; // Set to empty array on error to prevent further errors
+ }
+ }
+ return cachedData;
+}
+
// Fetch a single assignment based on the index or alias
export async function get(assignment) {
- try {
- const response = await fetch("./data/assignments.json");
- const data = await response.json();
-
- for (const a of data) {
- if (a["index"].toLowerCase() === assignment.toLowerCase()) {
- return a;
- }
- for (const b of a["alias"]) {
- if (b.toLowerCase() === assignment.toLowerCase()) {
- return a;
- }
- }
+ const data = await fetchAssignments();
+ const lowerCasedAssignment = assignment.toLowerCase();
+
+ for (const a of data) {
+ if (a["index"].toLowerCase() === lowerCasedAssignment) {
+ return a;
+ }
+ if (a["alias"].some(alias => alias.toLowerCase() === lowerCasedAssignment)) {
+ return a;
}
- return null;
- } catch (error) {
- console.error("Error fetching data:", error);
- return null;
}
+ return null;
}
// Get an array of the index
export async function getIndexList() {
- try {
- let dataList = "";
- const response = await fetch("./data/assignments.json");
- const data = await response.json();
-
- for (const a of data) {
- dataList += `<option>${a["index"]}</option>\n\r`;
- }
- return dataList;
- } catch (error) {
- console.error("Error fetching data:", error);
- return "";
- }
+ const data = await fetchAssignments();
+
+ return data.map(a => `<option>${a["index"]}</option>\n\r`).join('');
}
-// Assuming decodeHtml function is defined or imported elsewhere
import { decodeHtml } from '../extrafuncs';
+let cachedCreaturesData = null;
+const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes
+let creaturesCacheTimestamp = Date.now();
+
+// Fetch and cache the creatures data
+async function fetchCreatures() {
+ // Check if we need to fetch new data
+ if (!cachedCreaturesData || (Date.now() - creaturesCacheTimestamp) > CACHE_EXPIRATION_MS) {
+ try {
+ const response = await fetch("./data/creatures.json");
+ cachedCreaturesData = await response.json();
+ creaturesCacheTimestamp = Date.now(); // Update timestamp after fetching new data
+ } catch (error) {
+ console.error("Error fetching data:", error);
+ cachedCreaturesData = []; // Set to empty array on error to prevent further errors
+ }
+ }
+ return cachedCreaturesData;
+}
+
// Fetch a single creature based on the name
export async function get(creature) {
- try {
- const response = await fetch("./data/creatures.json");
- const data = await response.json();
-
- for (const a of data) {
- if (decodeHtml(a["name"].toLowerCase()) === creature.toLowerCase()) {
- return a;
- }
+ const data = await fetchCreatures();
+ const lowerCasedCreature = creature.toLowerCase();
+
+ for (const a of data) {
+ if (decodeHtml(a["name"].toLowerCase()) === lowerCasedCreature) {
+ return a;
}
- return null;
- } catch (error) {
- console.error("Error fetching data:", error);
- return null;
}
+ return null;
}
-// Assuming decodeHtml function is defined or imported elsewhere
import { decodeHtml } from '../extrafuncs';
+let cachedMastersData = null;
+const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes
+let mastersCacheTimestamp = Date.now();
+
+// Fetch and cache the masters data
+async function fetchMasters() {
+ // Check if we need to fetch new data
+ if (!cachedMastersData || (Date.now() - mastersCacheTimestamp) > CACHE_EXPIRATION_MS) {
+ try {
+ const response = await fetch("./data/masters.json");
+ cachedMastersData = await response.json();
+ mastersCacheTimestamp = Date.now(); // Update timestamp after fetching new data
+ } catch (error) {
+ console.error("Error fetching data:", error);
+ cachedMastersData = []; // Set to empty array on error to prevent further errors
+ }
+ }
+ return cachedMastersData;
+}
+
// Fetch a single master based on the name
export async function get(master) {
- try {
- const response = await fetch("./data/masters.json");
- const data = await response.json();
-
- for (const a of data) {
- if (decodeHtml(a["name"].toLowerCase()) === master.toLowerCase()) {
- return a;
- }
+ const data = await fetchMasters();
+ const lowerCasedMaster = master.toLowerCase();
+
+ for (const a of data) {
+ if (decodeHtml(a["name"].toLowerCase()) === lowerCasedMaster) {
+ return a;
}
- return null;
- } catch (error) {
- console.error("Error fetching data:", error);
- return null;
}
+ return null;
}
+let cachedReapersData = null;
+const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes
+let reapersCacheTimestamp = Date.now();
+
+// Fetch and cache the reapers data
+async function fetchReapers() {
+ // Check if we need to fetch new data
+ if (!cachedReapersData || (Date.now() - reapersCacheTimestamp) > CACHE_EXPIRATION_MS) {
+ try {
+ const response = await fetch("./data/reapers.json");
+ cachedReapersData = await response.json();
+ reapersCacheTimestamp = Date.now(); // Update timestamp after fetching new data
+ } catch (error) {
+ console.error("Error fetching data:", error);
+ cachedReapersData = []; // Set to empty array on error to prevent further errors
+ }
+ }
+ return cachedReapersData;
+}
+
// Fetch a single reaper based on the index or alias
export async function get(reaper) {
- try {
- const response = await fetch("./data/reapers.json");
- const data = await response.json();
-
- for (const a of data) {
- if (a["index"].toLowerCase() === reaper.toLowerCase()) {
- return a;
- }
+ const data = await fetchReapers();
+ const lowerCasedReaper = reaper.toLowerCase();
+
+ for (const a of data) {
+ if (a["index"].toLowerCase() === lowerCasedReaper) {
+ return a;
}
- return null;
- } catch (error) {
- console.error("Error fetching data:", error);
- return null;
}
+ return null;
}
// Get an array of the index as HTML option elements
export async function getIndexList() {
- try {
- let dataList = "";
- const response = await fetch("./data/reapers.json");
- const data = await response.json();
-
- for (const a of data) {
- dataList += `<option>${a["index"]}</option>\n\r`;
- }
- return dataList;
- } catch (error) {
- console.error("Error fetching data:", error);
- return "";
- }
+ const data = await fetchReapers();
+
+ return data.map(a => `<option>${a["index"]}</option>\n\r`).join('');
}
-// Import the decodeHtml function
import { decodeHtml } from '../extrafuncs';
+let cachedCreaturesData = null;
+const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes
+let creaturesCacheTimestamp = Date.now();
+
+// Fetch and cache the creatures data
+async function fetchCreatures() {
+ // Check if we need to fetch new data
+ if (!cachedCreaturesData || (Date.now() - creaturesCacheTimestamp) > CACHE_EXPIRATION_MS) {
+ try {
+ const response = await fetch("./data/creatures.json");
+ cachedCreaturesData = await response.json();
+ creaturesCacheTimestamp = Date.now(); // Update timestamp after fetching new data
+ } catch (error) {
+ console.error("Error fetching data:", error);
+ cachedCreaturesData = []; // Set to empty array on error to prevent further errors
+ }
+ }
+ return cachedCreaturesData;
+}
+
// Fetch a single variant based on the creature name and variant name
export async function get(creature, variant) {
- try {
- const response = await fetch("./data/creatures.json");
- const data = await response.json();
+ const data = await fetchCreatures();
+ const lowerCasedCreature = decodeHtml(creature.toLowerCase());
+ const lowerCasedVariant = variant.toLowerCase();
- for (const a of data) {
- if (decodeHtml(a["name"].toLowerCase()) === creature.toLowerCase()) {
- for (const b of a["variants"]) {
- if (b["name"].toLowerCase() === variant.toLowerCase()) {
- return b;
- }
+ for (const a of data) {
+ if (decodeHtml(a["name"].toLowerCase()) === lowerCasedCreature) {
+ for (const b of a["variants"]) {
+ if (b["name"].toLowerCase() === lowerCasedVariant) {
+ return b;
}
}
}
- return null;
- } catch (error) {
- console.error("Error fetching data:", error);
- return null;
}
+ return null;
}