]> Slayer Assistant Repositories - slayer.unlishema.org/.git/commitdiff
Updated more for testing.
authorunlishema <unlishema@jtryba.com>
Thu, 2 Oct 2025 00:03:09 +0000 (20:03 -0400)
committerunlishema <unlishema@jtryba.com>
Thu, 2 Oct 2025 00:03:09 +0000 (20:03 -0400)
dist/.htaccess
dist/dev.html
src/.htaccess
src/dev.html
src/index.ts
src/modules/query.ts

index ea4f9f2ed43274aa6ed325f4a94015021e59fa93..0110fd813c05157070dc5add3fb577d905ae1d1b 100644 (file)
@@ -36,7 +36,7 @@ Options -Indexes
     Header set X-XSS-Protection "1; mode=block"
     Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
     Header set Referrer-Policy "strict-origin-when-cross-origin"
-    Header set Content-Security-Policy "default-src 'self' https://runescape.wiki https://oldschool.runescape.wiki; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://oldschool.runescape.wiki; font-src 'self'; frame-ancestors http://unlishema.local https://unlishema.org https://*.unlishema.org"
+    Header set Content-Security-Policy "default-src 'self' https://runescape.wiki https://oldschool.runescape.wiki; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://runescape.wiki https://oldschool.runescape.wiki; font-src 'self'; frame-ancestors http://unlishema.local https://unlishema.org https://*.unlishema.org"
     Header set Permissions-Policy "geolocation=(), microphone=(), camera=()"
     
     # Set the Host header to ensure requests target slayer.unlishema.org
index 665b5c3503cd8e77b1119cf5c1fde679b6e13225..169c6887df29f41521222b198c03d9dfd131fe2d 100644 (file)
 
             <label for="querySearch">Enter a bucket API query:</label>
             <span style="margin: 65px"></span>
-            <input type="number" id="limit" min="0" max="500" value="20"><label for="limit">Limit</label>
+            <input type="number" id="limit" min="0" max="5000" value="20"><label for="limit">Limit</label>
             <input type="number" id="offset" min="0" max="50000" step="20" value="0"><label
                 for="limit">Offset</label><br>
             <input type="text" id="querySearch"
-                value="bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()">
+                value="bucket('infobox_item').select('item_name','image','examine').limit(20).offset(0).run()">
             <button onclick="fetchAndDisplayRS3()">Search</button><br>
             <label for="querySelect">Choose an default bucket:</label><br>
             <select id="querySelect"></select><br>
 
             <label for="querySearch-oldschool">Enter a bucket API query:</label>
             <span style="margin: 65px"></span>
-            <input type="number" id="limit-oldschool" min="0" max="500" value="20"><label for="limit">Limit</label>
+            <input type="number" id="limit-oldschool" min="0" max="5000" value="20"><label for="limit">Limit</label>
             <input type="number" id="offset-oldschool" min="0" max="50000" step="20" value="0"><label
                 for="limit">Offset</label><br>
             <input type="text" id="querySearch-oldschool"
-                value="bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()">
+                value="bucket('infobox_item').select('item_name','image','examine').limit(20).offset(0).run()">
             <button onclick="fetchAndDisplayOSRS()">Search</button><br>
             <label for="querySelect-oldschool">Choose an default bucket:</label><br>
             <select id="querySelect-oldschool"></select><br>
         document.addEventListener("DOMContentLoaded", async () => {
             // Populate the RS3 combobox with some default items
             const defaultItemsRS3 = [
-                { name: "Items", query: "bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()" },
+                { name: "Items", query: "bucket('infobox_item').select('item_name','image','examine').limit(20).offset(0).run()" },
                 { name: "Monsters", query: "bucket('infobox_monster').select('name', 'examine').limit(20).offset(0).run()" },
                 { name: "Locations", query: "bucket('infobox_location').select('page_name', 'is_members_only').limit(20).offset(0).run()" },
             ];
 
             // Populate the OSRS combobox with some default items
             const defaultItemsOSRS = [
-                { name: "Items", query: "bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()" },
+                { name: "Items", query: "bucket('infobox_item').select('item_name','image','examine').limit(20).offset(0).run()" },
                 { name: "Monsters", query: "bucket('infobox_monster').select('name', 'examine').limit(20).offset(0).run()" },
                 { name: "Construction", query: "bucket('infobox_construction').select('page_name', 'image').limit(20).offset(0).run()" },
                 { name: "Locations", query: "bucket('infobox_location').select('page_name', 'is_members_only').limit(20).offset(0).run()" },
             ];
 
+            const querySearch = document.getElementById("querySearch");
+            const querySearchOldSchool = document.getElementById("querySearch-oldschool");
             const limitRS3 = document.getElementById("limit");
             const offsetRS3 = document.getElementById("offset");
             const queryBoxRS3 = document.getElementById("querySelect");
                 queryBoxOSRS.appendChild(option);
             });
 
+            // Add event listener to the querySearch box
+            querySearch.addEventListener("keydown", (event) => { if (event.key === "Enter") { fetchAndDisplayRS3(); } });
+            querySearchOldSchool.addEventListener("keydown", (event) => { if (event.key === "Enter") { fetchAndDisplayOSRS(); } });
+
             // Add event listener to the limit & offset using arrow functions
             limitRS3.addEventListener("change", () => { handleNumberChange("limit", false); });
             offsetRS3.addEventListener("change", () => { handleNumberChange("offset", false); });
 
         // Main function to fetch and display data
         async function fetchAndDisplayData(query, updateItemList = true, oldschool = false) {
-            /*
-            if (!query)
-                query = document.getElementById(`querySearch${oldschool ? "-oldschool" : ""}`).value;
-
-            const bucketName = extractBucketName(query);
-            const keys = extractSelectKeys(query);
-
-            const extractedDataElement = document.getElementById(`extractedData${oldschool ? "-oldschool" : ""}`);
-            const rawDataElement = document.getElementById(`rawData${oldschool ? "-oldschool" : ""}`);
-
-            extractedDataElement.innerHTML = "<p>Loading data...</p>";
-            rawDataElement.innerHTML = "<p>Loading raw data...</p>";
-
-            const itemData = await requestBucket(query, oldschool);
-
-            if (itemData) {
-                // Clear previous content
-                extractedDataElement.innerHTML = "";
-
-                // Set itemCount for for query results
-                let itemCount = document.getElementById(`itemCount${oldschool ? "-oldschool" : ""}`);
-                itemCount.innerText = `Items Found: ${itemData.bucket.length}`;
-
-                // Hide/show previous button
-                if (parseInt(document.getElementById(`offset${oldschool ? "-oldschool" : ""}`).value) <= 0)
-                    document.getElementById(`prevOffset${oldschool ? "-oldschool" : ""}`).style = "display: none";
-                else
-                    document.getElementById(`prevOffset${oldschool ? "-oldschool" : ""}`).style = "display: inline";
-
-                // Hide/show next button
-                if (itemData.bucket.length < parseInt(document.getElementById(`limit${oldschool ? "-oldschool" : ""}`).value))
-                    document.getElementById(`nextOffset${oldschool ? "-oldschool" : ""}`).style = "display: none";
-                else
-                    document.getElementById(`nextOffset${oldschool ? "-oldschool" : ""}`).style = "display: inline";
-
-                const maxCount = 500; // Limit the number of displayed items
-                let previousItemValue = null;
-                for (let i = 0; i < itemData.bucket.length; i++) {
-                    const item = itemData.bucket[i];
-
-                    // Add each item to the combobox if updateItemList is true
-                    if (updateItemList && itemData.bucket.length > 1) {
-                        let itemSelect = document.getElementById(`itemSelect${oldschool ? "-oldschool" : ""}`);
-                        if (i == 0) {
-                            itemSelect.innerHTML = "";
-                            const option = document.createElement(`option`);
-                            option.value = query;
-                            option.textContent = `--- Select an item ---`;
-                            itemSelect.appendChild(option);
-                        }
-
-                        // Add each item to the combobox
-                        const option = document.createElement(`option`);
-
-                        // Build the select query dynamically based on keys
-                        option.value = `bucket('${bucketName}').select(`;
-                        for (const key of keys)
-                            option.value += `'${key}',`;
-                        option.value = option.value.slice(0, -1); // Remove trailing comma
-                        option.value += `).where('${keys[0]}', '${item[keys[0]].replaceAll("'", "\\'")}').limit(20).offset(0).run()`;
-
-                        option.textContent = keys ? item[keys[0]] : "No KEYS";
-                        if (!previousItemValue || previousItemValue != item[keys[0]])
-                            itemSelect.appendChild(option);
-
-                        previousItemValue = item[keys[0]];
-                    }
-                    if (i > maxCount) continue; // Only display the first item by default
-
-                    // Setup the table header row
-                    if (i == 0) {
-                        let rowEntry = document.createElement('tr');
-                        for (const key of keys) {
-                            let cellEntry = document.createElement('th')
-                            cellEntry.innerHTML = `<strong>${key}</strong>`;
-                            rowEntry.appendChild(cellEntry);
-                        }
-                        extractedDataElement.appendChild(rowEntry);
-                    }
-
-                    let rowEntry = document.createElement('tr');
-                    for (const key of keys) {
-                        let cellEntry = document.createElement('td')
-                        cellEntry.innerHTML = `${!(key in item) ? 'false' : (item[key] === '' ? 'true' : item[key])}`;
-                        rowEntry.appendChild(cellEntry);
-                    }
-                    extractedDataElement.appendChild(rowEntry);
-
-                }
-
-                rawDataElement.innerHTML = `<pre>${JSON.stringify(itemData, null, 2)}</pre>`;
-                return parseInt(itemData.bucket.length);
-            } else {
-                extractedDataElement.textContent = "Failed to fetch data from the API.";
-                rawDataElement.textContent = "No raw data available.";
-            }
-            return 0;*/
             const data = await gatherData(query, oldschool);
             return renderData(data, updateItemList);
         }
                 let rowEntry = document.createElement('tr');
                 for (const key of keys) {
                     let cellEntry = document.createElement('td');
-                    cellEntry.innerHTML = `${!(key in item) ? 'false' : (item[key] === '' ? 'true' : item[key])}`;
+                    if (key === 'image' && item[key]) {
+                        let rawName = String(item[key]);
+                        let imageName = rawName.replaceAll('File:', '').replaceAll(' ', '_');
+                        let url = `https://${oldschool ? "oldschool." : ""}runescape.wiki/images/${imageName}`;
+                        cellEntry.innerHTML = `<img src="${url}" alt="${rawName}" title="${imageName}">`;
+                    } else
+                        cellEntry.innerHTML = `${!(key in item) ? 'false' : (item[key] === '' ? 'true' : item[key])}`;
                     rowEntry.appendChild(cellEntry);
                 }
                 extractedDataElement.appendChild(rowEntry);
index ea4f9f2ed43274aa6ed325f4a94015021e59fa93..0110fd813c05157070dc5add3fb577d905ae1d1b 100644 (file)
@@ -36,7 +36,7 @@ Options -Indexes
     Header set X-XSS-Protection "1; mode=block"
     Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
     Header set Referrer-Policy "strict-origin-when-cross-origin"
-    Header set Content-Security-Policy "default-src 'self' https://runescape.wiki https://oldschool.runescape.wiki; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://oldschool.runescape.wiki; font-src 'self'; frame-ancestors http://unlishema.local https://unlishema.org https://*.unlishema.org"
+    Header set Content-Security-Policy "default-src 'self' https://runescape.wiki https://oldschool.runescape.wiki; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://runescape.wiki https://oldschool.runescape.wiki; font-src 'self'; frame-ancestors http://unlishema.local https://unlishema.org https://*.unlishema.org"
     Header set Permissions-Policy "geolocation=(), microphone=(), camera=()"
     
     # Set the Host header to ensure requests target slayer.unlishema.org
index 665b5c3503cd8e77b1119cf5c1fde679b6e13225..169c6887df29f41521222b198c03d9dfd131fe2d 100644 (file)
 
             <label for="querySearch">Enter a bucket API query:</label>
             <span style="margin: 65px"></span>
-            <input type="number" id="limit" min="0" max="500" value="20"><label for="limit">Limit</label>
+            <input type="number" id="limit" min="0" max="5000" value="20"><label for="limit">Limit</label>
             <input type="number" id="offset" min="0" max="50000" step="20" value="0"><label
                 for="limit">Offset</label><br>
             <input type="text" id="querySearch"
-                value="bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()">
+                value="bucket('infobox_item').select('item_name','image','examine').limit(20).offset(0).run()">
             <button onclick="fetchAndDisplayRS3()">Search</button><br>
             <label for="querySelect">Choose an default bucket:</label><br>
             <select id="querySelect"></select><br>
 
             <label for="querySearch-oldschool">Enter a bucket API query:</label>
             <span style="margin: 65px"></span>
-            <input type="number" id="limit-oldschool" min="0" max="500" value="20"><label for="limit">Limit</label>
+            <input type="number" id="limit-oldschool" min="0" max="5000" value="20"><label for="limit">Limit</label>
             <input type="number" id="offset-oldschool" min="0" max="50000" step="20" value="0"><label
                 for="limit">Offset</label><br>
             <input type="text" id="querySearch-oldschool"
-                value="bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()">
+                value="bucket('infobox_item').select('item_name','image','examine').limit(20).offset(0).run()">
             <button onclick="fetchAndDisplayOSRS()">Search</button><br>
             <label for="querySelect-oldschool">Choose an default bucket:</label><br>
             <select id="querySelect-oldschool"></select><br>
         document.addEventListener("DOMContentLoaded", async () => {
             // Populate the RS3 combobox with some default items
             const defaultItemsRS3 = [
-                { name: "Items", query: "bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()" },
+                { name: "Items", query: "bucket('infobox_item').select('item_name','image','examine').limit(20).offset(0).run()" },
                 { name: "Monsters", query: "bucket('infobox_monster').select('name', 'examine').limit(20).offset(0).run()" },
                 { name: "Locations", query: "bucket('infobox_location').select('page_name', 'is_members_only').limit(20).offset(0).run()" },
             ];
 
             // Populate the OSRS combobox with some default items
             const defaultItemsOSRS = [
-                { name: "Items", query: "bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()" },
+                { name: "Items", query: "bucket('infobox_item').select('item_name','image','examine').limit(20).offset(0).run()" },
                 { name: "Monsters", query: "bucket('infobox_monster').select('name', 'examine').limit(20).offset(0).run()" },
                 { name: "Construction", query: "bucket('infobox_construction').select('page_name', 'image').limit(20).offset(0).run()" },
                 { name: "Locations", query: "bucket('infobox_location').select('page_name', 'is_members_only').limit(20).offset(0).run()" },
             ];
 
+            const querySearch = document.getElementById("querySearch");
+            const querySearchOldSchool = document.getElementById("querySearch-oldschool");
             const limitRS3 = document.getElementById("limit");
             const offsetRS3 = document.getElementById("offset");
             const queryBoxRS3 = document.getElementById("querySelect");
                 queryBoxOSRS.appendChild(option);
             });
 
+            // Add event listener to the querySearch box
+            querySearch.addEventListener("keydown", (event) => { if (event.key === "Enter") { fetchAndDisplayRS3(); } });
+            querySearchOldSchool.addEventListener("keydown", (event) => { if (event.key === "Enter") { fetchAndDisplayOSRS(); } });
+
             // Add event listener to the limit & offset using arrow functions
             limitRS3.addEventListener("change", () => { handleNumberChange("limit", false); });
             offsetRS3.addEventListener("change", () => { handleNumberChange("offset", false); });
 
         // Main function to fetch and display data
         async function fetchAndDisplayData(query, updateItemList = true, oldschool = false) {
-            /*
-            if (!query)
-                query = document.getElementById(`querySearch${oldschool ? "-oldschool" : ""}`).value;
-
-            const bucketName = extractBucketName(query);
-            const keys = extractSelectKeys(query);
-
-            const extractedDataElement = document.getElementById(`extractedData${oldschool ? "-oldschool" : ""}`);
-            const rawDataElement = document.getElementById(`rawData${oldschool ? "-oldschool" : ""}`);
-
-            extractedDataElement.innerHTML = "<p>Loading data...</p>";
-            rawDataElement.innerHTML = "<p>Loading raw data...</p>";
-
-            const itemData = await requestBucket(query, oldschool);
-
-            if (itemData) {
-                // Clear previous content
-                extractedDataElement.innerHTML = "";
-
-                // Set itemCount for for query results
-                let itemCount = document.getElementById(`itemCount${oldschool ? "-oldschool" : ""}`);
-                itemCount.innerText = `Items Found: ${itemData.bucket.length}`;
-
-                // Hide/show previous button
-                if (parseInt(document.getElementById(`offset${oldschool ? "-oldschool" : ""}`).value) <= 0)
-                    document.getElementById(`prevOffset${oldschool ? "-oldschool" : ""}`).style = "display: none";
-                else
-                    document.getElementById(`prevOffset${oldschool ? "-oldschool" : ""}`).style = "display: inline";
-
-                // Hide/show next button
-                if (itemData.bucket.length < parseInt(document.getElementById(`limit${oldschool ? "-oldschool" : ""}`).value))
-                    document.getElementById(`nextOffset${oldschool ? "-oldschool" : ""}`).style = "display: none";
-                else
-                    document.getElementById(`nextOffset${oldschool ? "-oldschool" : ""}`).style = "display: inline";
-
-                const maxCount = 500; // Limit the number of displayed items
-                let previousItemValue = null;
-                for (let i = 0; i < itemData.bucket.length; i++) {
-                    const item = itemData.bucket[i];
-
-                    // Add each item to the combobox if updateItemList is true
-                    if (updateItemList && itemData.bucket.length > 1) {
-                        let itemSelect = document.getElementById(`itemSelect${oldschool ? "-oldschool" : ""}`);
-                        if (i == 0) {
-                            itemSelect.innerHTML = "";
-                            const option = document.createElement(`option`);
-                            option.value = query;
-                            option.textContent = `--- Select an item ---`;
-                            itemSelect.appendChild(option);
-                        }
-
-                        // Add each item to the combobox
-                        const option = document.createElement(`option`);
-
-                        // Build the select query dynamically based on keys
-                        option.value = `bucket('${bucketName}').select(`;
-                        for (const key of keys)
-                            option.value += `'${key}',`;
-                        option.value = option.value.slice(0, -1); // Remove trailing comma
-                        option.value += `).where('${keys[0]}', '${item[keys[0]].replaceAll("'", "\\'")}').limit(20).offset(0).run()`;
-
-                        option.textContent = keys ? item[keys[0]] : "No KEYS";
-                        if (!previousItemValue || previousItemValue != item[keys[0]])
-                            itemSelect.appendChild(option);
-
-                        previousItemValue = item[keys[0]];
-                    }
-                    if (i > maxCount) continue; // Only display the first item by default
-
-                    // Setup the table header row
-                    if (i == 0) {
-                        let rowEntry = document.createElement('tr');
-                        for (const key of keys) {
-                            let cellEntry = document.createElement('th')
-                            cellEntry.innerHTML = `<strong>${key}</strong>`;
-                            rowEntry.appendChild(cellEntry);
-                        }
-                        extractedDataElement.appendChild(rowEntry);
-                    }
-
-                    let rowEntry = document.createElement('tr');
-                    for (const key of keys) {
-                        let cellEntry = document.createElement('td')
-                        cellEntry.innerHTML = `${!(key in item) ? 'false' : (item[key] === '' ? 'true' : item[key])}`;
-                        rowEntry.appendChild(cellEntry);
-                    }
-                    extractedDataElement.appendChild(rowEntry);
-
-                }
-
-                rawDataElement.innerHTML = `<pre>${JSON.stringify(itemData, null, 2)}</pre>`;
-                return parseInt(itemData.bucket.length);
-            } else {
-                extractedDataElement.textContent = "Failed to fetch data from the API.";
-                rawDataElement.textContent = "No raw data available.";
-            }
-            return 0;*/
             const data = await gatherData(query, oldschool);
             return renderData(data, updateItemList);
         }
                 let rowEntry = document.createElement('tr');
                 for (const key of keys) {
                     let cellEntry = document.createElement('td');
-                    cellEntry.innerHTML = `${!(key in item) ? 'false' : (item[key] === '' ? 'true' : item[key])}`;
+                    if (key === 'image' && item[key]) {
+                        let rawName = String(item[key]);
+                        let imageName = rawName.replaceAll('File:', '').replaceAll(' ', '_');
+                        let url = `https://${oldschool ? "oldschool." : ""}runescape.wiki/images/${imageName}`;
+                        cellEntry.innerHTML = `<img src="${url}" alt="${rawName}" title="${imageName}">`;
+                    } else
+                        cellEntry.innerHTML = `${!(key in item) ? 'false' : (item[key] === '' ? 'true' : item[key])}`;
                     rowEntry.appendChild(cellEntry);
                 }
                 extractedDataElement.appendChild(rowEntry);
index 696a8e4965da7e0bd9e31550ed9284787b7ed917..2df36692f59ccdf5eda621e708148891ebb5eb58 100644 (file)
@@ -60,7 +60,7 @@ if (window.alt1) alt1.identifyAppUrl("./appconfig.json");
 document.addEventListener("DOMContentLoaded", async () => {
     try {
         /*
-        let searchQuery = new query.QueryData("infobox_monster", ['name', 'slayer_level'], [], 20, 0);
+        let searchQuery = new query.QueryData("infobox_monster", ['name', 'slayer_level'], ['slayer_level', '>=', '99'], 5000, 0);
         console.log("Search Query Statement:", searchQuery.statement());
         let queryData = await searchQuery.run();
         console.log("Query Data Result:", queryData);
index 21b6c4654cf6ec50171cb2ed64984e3b21e744b1..57712cbcd68a789443bcfb809b2349bdbb3ffea7 100644 (file)
@@ -5,7 +5,7 @@ export class QueryData {
     limit: number;
     offset: number;
 
-    constructor(bucket = "infobox_item", select = ['*'], where = [], limit = 500, offset = 0) {
+    constructor(bucket = "infobox_item", select = ['page_name'], where = [], limit = 500, offset = 0) {
         this.bucket = bucket;
         this.select = select;
         this.where = where;