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
<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);
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
<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);
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);
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;