diff --git a/src/routes/search.rs b/src/routes/search.rs index 331710aeb..bfbe014fd 100644 --- a/src/routes/search.rs +++ b/src/routes/search.rs @@ -143,7 +143,7 @@ fn search(web::Query(info): web::Query) -> Vec { if filters.is_empty() { filters = v; } else { - filters = format!("({}) AND {}", filters, v); + filters = format!("({}) AND ({})", filters, v); } } @@ -181,26 +181,16 @@ pub async fn index_mods() -> Result<(), Box>{ info!("Indexing curseforge mods!"); - let mut indexing_complete = false; - let mut current_mod_id = 0; - let mut consecutive_returns = 0; + let res = reqwest::Client::new().post("https://addons-ecs.forgesvc.net/api/v2/addon") + .header(reqwest::header::CONTENT_TYPE, "application/json") + .body(format!("{:?}", (1..400000).collect::>())) + .send().await?; - while !(consecutive_returns > 1000 && current_mod_id > 300000) { - current_mod_id += 1; - info!("Requesting mod with id {} from CurseForge!", current_mod_id); + let text = &res.text().await?; + let mut curseforge_mods : Vec = serde_json::from_str(text)?; - let body = reqwest::get(&format!("https://addons-ecs.forgesvc.net/api/v2/addon/{}", current_mod_id)) - .await?.text().await?; - - if body.is_empty() { - consecutive_returns += 1; - continue; - } - - let curseforge_mod : CurseForgeMod = serde_json::from_str(&body)?; - consecutive_returns == 0; - - if curseforge_mod.game_slug != "minecraft" { continue; } + for curseforge_mod in curseforge_mods { + if curseforge_mod.game_slug != "minecraft" || !curseforge_mod.website_url.contains("/mc-mods/") { continue; } let mut mod_game_versions = vec![]; @@ -278,7 +268,7 @@ pub async fn index_mods() -> Result<(), Box>{ mod_categories.push(String::from("forge")); } if using_fabric { - mod_categories.push(String::from("fabric")); + mod_categories.push(String::from("fabric")); } let mut mod_attachments = curseforge_mod.attachments; @@ -298,7 +288,7 @@ pub async fn index_mods() -> Result<(), Box>{ }; docs_to_add.push(SearchMod { - mod_id: curseforge_mod.id, + mod_id: -curseforge_mod.id, author: (&curseforge_mod.authors[0].name).to_string(), title: curseforge_mod.name, description: curseforge_mod.summary, @@ -314,7 +304,7 @@ pub async fn index_mods() -> Result<(), Box>{ updated: curseforge_mod.date_modified.chars().filter(|c| c.is_ascii_digit()).collect::().parse()?, latest_version, empty: String::from("{}{}{}"), - }); + }) } //Write Indexes diff --git a/static/js/search.js b/static/js/search.js index 72e9cfa83..8beded7cd 100644 --- a/static/js/search.js +++ b/static/js/search.js @@ -22,6 +22,7 @@ let selectedType = "relevance"; let resultContainer = document.getElementById("results"); window.onload = function () { + //Add category ghosts let categories = document.getElementsByClassName("category-badge"); for (let category of categories) { @@ -32,6 +33,38 @@ window.onload = function () { category.appendChild(ghost); } + //Set Initial Values based on URL + const urlParams = new URLSearchParams(window.location.search); + + if(urlParams.has("q")) + document.getElementById("search-input").value = decodeURIComponent(urlParams.get("q")); + + if(urlParams.has("f")) { + let value = decodeURIComponent(urlParams.get("f")); + + for (let key in category_inputs) { + if (category_inputs.hasOwnProperty(key)) { + if(value.includes(key)) { + activateCategory(document.getElementById(key)) + } + } + } + } + + if(urlParams.has("s")) { + let value = decodeURIComponent(urlParams.get("s")); + + selectedType = value; + document.getElementById("filters").value = value; + } + + let urlVersions = ""; + + if(urlParams.has("v")) + urlVersions = urlParams.get("v"); + + // Set Version categories from Mojang Launcher Meta + let releases = document.getElementById("releases"); let snapshots = document.getElementById("snapshots"); let archaic = document.getElementById("archaic"); @@ -59,6 +92,9 @@ window.onload = function () { archaic.appendChild(versionElement) else versionElement.outerHTML = ""; + + if(urlVersions.includes(version.id)) + activateVersion(versionElement); } } } @@ -66,9 +102,6 @@ window.onload = function () { xmlHttp.open("GET", "https://launchermeta.mojang.com/mc/game/version_manifest.json", true); xmlHttp.send(null); - const urlParams = new URLSearchParams(window.location.search); - - } function clearFilters() { @@ -150,7 +183,6 @@ function activateVersion(element) { function changeSortType(element) { selectedType = element.options[element.selectedIndex].value; - console.log(selectedType) handleSearch(0); } @@ -162,7 +194,6 @@ let currentlyLoadingExtra = false; let currentOffset = 0; function loadExtra() { - console.log(body.scrollTop) if (body.scrollTop > 400) { backToTop.style.display = "block"; } else { @@ -208,12 +239,10 @@ function handleSearch(index) { queryString += "&f=" + encodeURIComponent( "keywords=" + filterString).replace(/%20/g,'+'); } - for (let key in version_inputs) { - if (version_inputs.hasOwnProperty(key)) { + for (let key in version_inputs) + if (version_inputs.hasOwnProperty(key)) if(version_inputs[key]) versionString += key + " OR versions="; - } - } let versionTakeOffLength = " OR versions=".length; @@ -222,17 +251,27 @@ function handleSearch(index) { queryString += "&v=" + encodeURIComponent( "versions=" + versionString).replace(/%20/g,'+'); } - if(selectedType) { + if(selectedType) queryString += "&s=" + encodeURIComponent(selectedType).replace(/%20/g,'+'); - } - if(index === 0) - window.history.pushState('Search', 'Search', queryString); + + if(!queryString.includes("?")) + queryString = queryString.replace("&", "?") + + if(index === 0) { + let viewString = queryString; + + viewString = viewString.replace("?q={}{}{}", ""); + viewString = viewString.replace("&s=relevance", ""); + + if(!viewString.includes("?")) + viewString = viewString.replace("&", "?") + + window.history.pushState('Search', 'Search', viewString); + } else queryString += "&o=" + index; - console.log(queryString); - let xmlHttp = new XMLHttpRequest(); xmlHttp.onreadystatechange = function() {