const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes
let cacheTimestamp = Date.now();
+// Helper function to fetch data from URL
+async function fetchData(url) {
+ try {
+ const response = await fetch(url);
+ if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
+ return await response.json();
+ } catch (error) {
+ logger.error("Error fetching data:", error);
+ return null; // Return null on error
+ }
+}
+
// Fetch and cache the assignments data
async function fetchAssignments(index = "all", list = false) { // Default to "all"
logger.log(`Fetch Assignment: ${index}`);
- // Check if we need to fetch new data
- if (index != "all" || (!cachedData || (Date.now() - cacheTimestamp) > CACHE_EXPIRATION_MS)) {
- try {
- let urlBuild = `./data/assignments.json?q=${encodeURIComponent(index)}`;
- if (list) urlBuild += `&list`;
- if (index != "all") urlBuild += `&cache_bust=${Date.now()}`;
- const response = await fetch(urlBuild);
- cachedData = await response.json();
- cacheTimestamp = Date.now() + (index == "all" ? 0 : -CACHE_EXPIRATION_MS); // Update timestamp after fetching new data
- } catch (error) {
- logger.error("Error fetching data:", error);
- cachedData = []; // Set to empty array on error to prevent further errors
- }
+
+ // Check if we need to fetch new data for "all"
+ if (!list && (index === "all" && cachedData && (Date.now() - cacheTimestamp) <= CACHE_EXPIRATION_MS)) {
+ return cachedData; // Return cached data if still valid
}
- return cachedData;
+
+ // Fetch new data
+ const urlBuild = `./data/assignments.json?q=${encodeURIComponent(index)}${list ? `&list` : ''}&cache_bust=${Date.now()}`;
+ const data = await fetchData(urlBuild);
+ if (index === "all") {
+ cachedData = data; // Cache data if fetching all
+ cacheTimestamp = Date.now(); // Update timestamp
+ }
+
+ return data; // Return the fetched data
}
// Fetch a single assignment based on the index or alias
export async function get(assignment) {
- const data = await fetchAssignments(assignment); // By default, fetch all assignments
+ const data = await fetchAssignments(assignment); // Fetch all assignments by default
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;
+ return data?.find(a =>
+ a["index"].toLowerCase() === lowerCasedAssignment ||
+ a["alias"].some(alias => alias.toLowerCase() === lowerCasedAssignment)
+ ) || null; // Return the found assignment or null
}
// Get an array of the index
export async function getIndexList() {
const data = await fetchAssignments("all", true); // Fetch all assignments for the index list
-
- return data.map(a => a["index"]);
+ return data.map(a => a["index"]); // Return the list of indices
}
let cachedCreaturesData = null;
const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes
-let creaturesCacheTimestamp = Date.now();
+let creaturesCacheTimestamp = Date.now(); // Initial timestamp
+
+// Fetch creatures data
+async function fetchData(url) {
+ try {
+ const response = await fetch(url);
+ if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
+ return await response.json();
+ } catch (error) {
+ logger.error("Error fetching data:", error);
+ return null; // Return null on error
+ }
+}
// Fetch and cache the creatures data
export async function fetchCreatures(name = "all") {
logger.log(`Fetch Creature: ${name}`);
- // Check if we need to fetch new data
- if (name != "all" || (!cachedCreaturesData || (Date.now() - creaturesCacheTimestamp) > CACHE_EXPIRATION_MS)) {
- try {
- let urlBuild = `./data/creatures.json?q=${encodeURIComponent(name)}`;
- if (name != "all") urlBuild += `&cache_bust=${Date.now()}`;
- const response = await fetch(urlBuild);
- cachedCreaturesData = await response.json();
- creaturesCacheTimestamp = Date.now() + (name == "all" ? 0 : -CACHE_EXPIRATION_MS); // Update timestamp after fetching new data
- } catch (error) {
- logger.error("Error fetching data:", error);
- cachedCreaturesData = []; // Set to empty array on error to prevent further errors
- }
+
+ // If fetching "all", check cache expiration
+ if (name === "all" && cachedCreaturesData && (Date.now() - creaturesCacheTimestamp <= CACHE_EXPIRATION_MS)) {
+ return cachedCreaturesData; // Return cached data if still valid
}
- return cachedCreaturesData;
+
+ // Fetch new data
+ const urlBuild = `./data/creatures.json?q=${encodeURIComponent(name)}&cache_bust=${Date.now()}`;
+ const data = await fetchData(urlBuild);
+ if (name === "all") {
+ cachedCreaturesData = data; // Cache data if fetching all
+ creaturesCacheTimestamp = Date.now(); // Update timestamp
+ }
+ return data; // Return the fetched data
}
// Fetch a single creature based on the name
export async function get(creature) {
- const data = await fetchCreatures(creature);
+ const data = await fetchCreatures("all"); // Ensure we have all creatures cached
const lowerCasedCreature = creature.toLowerCase();
- for (const a of data) {
- logger.log(`Creature Compare: ${a["name"]} | ${creature}`);
- if (decodeHtml(a["name"].toLowerCase()) === lowerCasedCreature) {
- return a;
- }
- }
- return null;
+ return data?.find(a => decodeHtml(a["name"].toLowerCase()) === lowerCasedCreature) || null; // Use find for compactness
}
let cachedMastersData = null;
const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes
-let mastersCacheTimestamp = Date.now();
+let mastersCacheTimestamp = Date.now(); // Initial timestamp
+
+// Fetch masters data
+async function fetchData(url) {
+ try {
+ const response = await fetch(url);
+ if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
+ return await response.json();
+ } catch (error) {
+ logger.error("Error fetching data:", error);
+ return null; // Return null on error
+ }
+}
// Fetch and cache the masters data
-async function fetchMasters(name = "all") {
- // Check if we need to fetch new data
- if (name != "all" || (!cachedMastersData || (Date.now() - mastersCacheTimestamp) > CACHE_EXPIRATION_MS)) {
- try {
- let urlBuild = `./data/masters.json?q=${encodeURIComponent(name)}`;
- if (name != "all") urlBuild += `&cache_bust=${Date.now()}`;
- const response = await fetch(urlBuild);
- cachedMastersData = await response.json();
- mastersCacheTimestamp = Date.now() + (name == "all" ? 0 : -CACHE_EXPIRATION_MS); // Update timestamp after fetching new data
- } catch (error) {
- logger.error("Error fetching data:", error);
- cachedMastersData = []; // Set to empty array on error to prevent further errors
- }
+export async function fetchMasters(name = "all") {
+ logger.log(`Fetch Master: ${name}`);
+
+ // If fetching "all", check cache expiration
+ if (name === "all" && cachedMastersData && (Date.now() - mastersCacheTimestamp <= CACHE_EXPIRATION_MS)) {
+ return cachedMastersData; // Return cached data if still valid
}
- return cachedMastersData;
+
+ // Fetch new data
+ const urlBuild = `./data/masters.json?q=${encodeURIComponent(name)}&cache_bust=${Date.now()}`;
+ const data = await fetchData(urlBuild);
+ if (name === "all") {
+ cachedMastersData = data; // Cache data if fetching all
+ mastersCacheTimestamp = Date.now(); // Update timestamp
+ }
+ return data; // Return the fetched data
}
// Fetch a single master based on the name
export async function get(master) {
- const data = await fetchMasters(master);
+ const data = await fetchMasters("all"); // Ensure we have all masters cached
const lowerCasedMaster = master.toLowerCase();
- for (const a of data) {
- if (decodeHtml(a["name"].toLowerCase()) === lowerCasedMaster) {
- return a;
- }
- }
- return null;
+ return data?.find(a => decodeHtml(a["name"].toLowerCase()) === lowerCasedMaster) || null; // Use find for compactness
}
const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes
let reapersCacheTimestamp = Date.now();
+// Helper function to fetch data from URL
+async function fetchData(url) {
+ try {
+ const response = await fetch(url);
+ if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
+ return await response.json();
+ } catch (error) {
+ logger.error("Error fetching data:", error);
+ return null; // Return null on error
+ }
+}
+
// Fetch and cache the reapers data
async function fetchReapers(index = "all", list = false) {
logger.log(`Fetch Assignment: ${index}`);
- // Check if we need to fetch new data
- if (index != "all" || (!cachedReapersData || (Date.now() - reapersCacheTimestamp) > CACHE_EXPIRATION_MS)) {
- try {
- let urlBuild = `./data/reapers.json?q=${encodeURIComponent(index)}`;
- if (list) urlBuild += `&list`;
- if (index != "all") urlBuild += `&cache_bust=${Date.now()}`;
- const response = await fetch(urlBuild);
- cachedReapersData = await response.json();
- reapersCacheTimestamp = Date.now() + (index == "all" ? 0 : -CACHE_EXPIRATION_MS); // Update timestamp after fetching new data
- } catch (error) {
- logger.error("Error fetching data:", error);
- cachedReapersData = []; // Set to empty array on error to prevent further errors
- }
+
+ // Check if we need to fetch new data for "all"
+ if (!list && (index === "all" && cachedReapersData && (Date.now() - reapersCacheTimestamp) <= CACHE_EXPIRATION_MS)) {
+ return cachedReapersData; // Return cached data if still valid
+ }
+
+ // Fetch new data
+ const urlBuild = `./data/reapers.json?q=${encodeURIComponent(index)}${list ? `&list` : ''}&cache_bust=${Date.now()}`;
+ const data = await fetchData(urlBuild);
+ if (index === "all") {
+ cachedReapersData = data; // Cache data if fetching all
+ reapersCacheTimestamp = Date.now(); // Update timestamp
}
- return cachedReapersData;
+
+ return data; // Return the fetched data
}
// Fetch a single reaper based on the index or alias
export async function get(reaper) {
- const data = await fetchReapers(reaper);
- const lowerCasedReaper = reaper.toLowerCase();
-
- for (const a of data) {
- if (a["index"].toLowerCase() === lowerCasedReaper) {
- return a;
- }
- }
- return null;
+ return await fetchReapers(reaper); // Directly fetch the specific reaper
}
// Get an array of the index as HTML option elements
export async function getIndexList() {
- const data = await fetchReapers();
-
- return data.map(a => a["index"]);
+ const data = await fetchReapers("all", true); // Requesting list, so set list to true
+ return data.map(a => a["index"]); // Return the list of indices
}