diff --git a/src/helpers/format_human.rs b/src/helpers/format_human.rs index db15b410..fb4d8a57 100644 --- a/src/helpers/format_human.rs +++ b/src/helpers/format_human.rs @@ -13,12 +13,16 @@ impl HelperDef for HumanFormatHelper { _rc: &mut RenderContext<'reg, 'rc>, out: &mut dyn Output, ) -> HelperResult { - let param = h.param(0).and_then(|v| v.value().as_f64()).unwrap_or(0.0); + let param = h.param(0).and_then(|v| v.value().as_str()).unwrap_or("0.0"); - let mut formatted = human_format::Formatter::new().format(param); - formatted.retain(|c| !c.is_whitespace()); + if param.len() > 3 { + let mut formatted = human_format::Formatter::new().format(param.parse().unwrap()); + formatted.retain(|c| !c.is_whitespace()); - out.write(formatted.to_uppercase().as_ref())?; + out.write(formatted.to_uppercase().as_ref())?; + } else { + out.write(param)?; + } Ok(()) } diff --git a/src/main.rs b/src/main.rs index dd6022e7..e62c258c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -33,7 +33,7 @@ async fn main() -> std::io::Result<()> { let handlebars_ref = web::Data::new(handlebars); let client = database::connect().await.unwrap(); - routes::index_mods().await; + routes::index_mods(client).await.unwrap(); info!("Starting Actix HTTP server!"); //Init App @@ -42,7 +42,6 @@ async fn main() -> std::io::Result<()> { .wrap(Logger::default()) .wrap(Logger::new("%a %{User-Agent}i")) .app_data(handlebars_ref.clone()) - .app_data(client.clone()) .service(fs::Files::new("/static", "./static").show_files_listing()) .service(routes::index_get) .service(routes::search_post) diff --git a/src/routes/search.rs b/src/routes/search.rs index bfbe014f..c8f8fdec 100644 --- a/src/routes/search.rs +++ b/src/routes/search.rs @@ -2,16 +2,14 @@ use actix_web::{get, post, web, web::Data, HttpResponse}; use handlebars::*; use meilisearch_sdk::{client::*, document::*, search::*}; use serde::{Deserialize, Serialize}; - -use crate::database::*; - -use futures::stream::StreamExt; use meilisearch_sdk::settings::Settings; +use futures::stream::StreamExt; use bson::Bson; -use mongodb::Cursor; use std::collections::{HashMap, VecDeque}; use std::error::Error; +use crate::database::*; + #[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] struct Attachment { @@ -125,7 +123,7 @@ pub async fn search_get( fn search(web::Query(info): web::Query) -> Vec { let client = Client::new("http://localhost:7700", ""); - let mut search_query: String; + let search_query: String; let mut filters = "".to_string(); let mut offset = 0; let mut index = "relevance".to_string(); @@ -173,21 +171,113 @@ TODO This method needs a lot of refactoring. Here's a list of changes that need - Remove code fragment duplicates */ -pub async fn index_mods() -> Result<(), Box>{ - let client = Client::new("http://localhost:7700", ""); +pub async fn index_mods(client: mongodb::Client) -> Result<(), Box>{ let mut docs_to_add: Vec = vec![]; + docs_to_add.append(&mut index_database(client).await?); + docs_to_add.append(&mut index_curseforge().await); + + //Write Indexes + //Relevance Index + let client = Client::new("http://localhost:7700", ""); + + let mut relevance_index = client.get_or_create("relevance_mods").unwrap(); + + let mut relevance_rules = default_rules(); + relevance_rules.push_back("desc(downloads)".to_string()); + + relevance_index.set_settings(&default_settings().with_ranking_rules(relevance_rules.into())).unwrap(); + relevance_index.add_documents(docs_to_add.clone(), Some("mod_id")).unwrap(); + + //Downloads Index + let mut downloads_index = client.get_or_create("downloads_mods").unwrap(); + + let mut downloads_rules = default_rules(); + downloads_rules.push_front("desc(downloads)".to_string()); + + downloads_index.set_settings(&default_settings().with_ranking_rules(downloads_rules.into())).unwrap(); + downloads_index.add_documents(docs_to_add.clone(), Some("mod_id")).unwrap(); + + //Updated Index + let mut updated_index = client.get_or_create("updated_mods").unwrap(); + + let mut updated_rules = default_rules(); + updated_rules.push_front("desc(updated)".to_string()); + + updated_index.set_settings(&default_settings().with_ranking_rules(updated_rules.into())).unwrap(); + updated_index.add_documents(docs_to_add.clone(), Some("mod_id")).unwrap(); + + //Created Index + let mut newest_index = client.get_or_create("newest_mods").unwrap(); + + let mut newest_rules = default_rules(); + newest_rules.push_back("desc(created)".to_string()); + + newest_index.set_settings(&default_settings().with_ranking_rules(newest_rules.into())).unwrap(); + newest_index.add_documents(docs_to_add.clone(), Some("mod_id")).unwrap(); + + Ok(()) +} + +async fn index_database(client: mongodb::Client) -> Result, Box> { info!("Indexing database mods!"); + let mut docs_to_add: Vec = vec![]; + + let db = client.database("fabricate"); + + let mods = db.collection("mods"); + let versions = db.collection("versions"); + + let mut results = mods.find(None, None).await?; + + while let Some(unparsed_result) = results.next().await { + let result : Mod = bson::from_bson(Bson::from(unparsed_result?))?; + + let mut mod_versions = versions.find(doc!{ "mod_id": result.id}, None).await?; + + let mut mod_game_versions = vec![]; + + while let Some(unparsed_version) = mod_versions.next().await { + let mut version : Version = bson::from_bson(Bson::from(unparsed_version?))?; + mod_game_versions.append(&mut version.game_versions); + } + + docs_to_add.push(SearchMod { + mod_id: result.id, + author: result.author, + title: result.title, + description: result.description, + keywords: result.categories, + versions: mod_game_versions, + downloads: result.downloads, + page_url: "".to_string(), + icon_url: "".to_string(), + author_url: "".to_string(), + date_created: "".to_string(), + created: 0, + date_modified: "".to_string(), + updated: 0, + latest_version: "".to_string(), + empty: String::from("{}{}{}"), + }); + } + + Ok(docs_to_add) +} + +async fn index_curseforge() -> Result, Box>{ info!("Indexing curseforge mods!"); + let mut docs_to_add: Vec = vec![]; + 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?; let text = &res.text().await?; - let mut curseforge_mods : Vec = serde_json::from_str(text)?; + let curseforge_mods : Vec = serde_json::from_str(text)?; for curseforge_mod in curseforge_mods { if curseforge_mod.game_slug != "minecraft" || !curseforge_mod.website_url.contains("/mc-mods/") { continue; } @@ -307,45 +397,7 @@ pub async fn index_mods() -> Result<(), Box>{ }) } - //Write Indexes - - //Relevance Index - let mut relevance_index = client.get_or_create("relevance_mods").unwrap(); - - let mut relevance_rules = default_rules(); - relevance_rules.push_back("desc(downloads)".to_string()); - - relevance_index.set_settings(&default_settings().with_ranking_rules(relevance_rules.into())).unwrap(); - relevance_index.add_documents(docs_to_add.clone(), Some("mod_id")).unwrap(); - - //Downloads Index - let mut downloads_index = client.get_or_create("downloads_mods").unwrap(); - - let mut downloads_rules = default_rules(); - downloads_rules.push_front("desc(downloads)".to_string()); - - downloads_index.set_settings(&default_settings().with_ranking_rules(downloads_rules.into())).unwrap(); - downloads_index.add_documents(docs_to_add.clone(), Some("mod_id")).unwrap(); - - //Updated Index - let mut updated_index = client.get_or_create("updated_mods").unwrap(); - - let mut updated_rules = default_rules(); - updated_rules.push_front("desc(updated)".to_string()); - - updated_index.set_settings(&default_settings().with_ranking_rules(updated_rules.into())).unwrap(); - updated_index.add_documents(docs_to_add.clone(), Some("mod_id")).unwrap(); - - //Created Index - let mut newest_index = client.get_or_create("newest_mods").unwrap(); - - let mut newest_rules = default_rules(); - newest_rules.push_back("desc(created)".to_string()); - - newest_index.set_settings(&default_settings().with_ranking_rules(newest_rules.into())).unwrap(); - newest_index.add_documents(docs_to_add.clone(), Some("mod_id")).unwrap(); - - Ok(()) + Ok(docs_to_add) } fn default_rules() -> VecDeque { diff --git a/static/js/search.js b/static/js/search.js index 8beded7c..6ab75673 100644 --- a/static/js/search.js +++ b/static/js/search.js @@ -58,10 +58,16 @@ window.onload = function () { document.getElementById("filters").value = value; } - let urlVersions = ""; + let urlVersions = []; - if(urlParams.has("v")) - urlVersions = urlParams.get("v"); + if(urlParams.has("v")) { + let versionsString = urlParams.get("v"); + + versionsString = versionsString.replace(/ /g, ''); + versionsString = versionsString.replace(/versions=/g, ''); + + urlVersions = versionsString.split("OR") + } // Set Version categories from Mojang Launcher Meta @@ -93,8 +99,9 @@ window.onload = function () { else versionElement.outerHTML = ""; - if(urlVersions.includes(version.id)) + if(urlVersions.includes(version.id)) { activateVersion(versionElement); + } } } }