From 213a64b1ffd2b66eade4f9e8a9df0619d4443003 Mon Sep 17 00:00:00 2001 From: Geometrically <18202329+Geometrically@users.noreply.github.com> Date: Mon, 21 Nov 2022 18:59:21 -0700 Subject: [PATCH] FlameAnvil fixes (#484) --- src/main.rs | 2 +- src/queue/flameanvil.rs | 54 +++++++++++++++++++++++++--------- src/routes/project_creation.rs | 2 +- src/routes/version_creation.rs | 10 ++++++- src/validate/mod.rs | 2 +- 5 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/main.rs b/src/main.rs index 15b59fda7..a334221f8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -231,7 +231,7 @@ async fn main() -> std::io::Result<()> { .app_data(web::Data::new(search_config.clone())) .app_data(web::Data::new(download_queue.clone())) .app_data(web::Data::new(payouts_queue.clone())) - .app_data(flame_anvil_queue.clone()) + .app_data(web::Data::new(flame_anvil_queue.clone())) .app_data(web::Data::new(ip_salt.clone())) .wrap(sentry_actix::Sentry::new()) .configure(routes::v1_config) diff --git a/src/queue/flameanvil.rs b/src/queue/flameanvil.rs index 696afbc63..294f66fa3 100644 --- a/src/queue/flameanvil.rs +++ b/src/queue/flameanvil.rs @@ -35,6 +35,7 @@ struct FlameUploadFile { pub struct FlameAnvilQueue { mod_loaders: Vec, minecraft_versions: Vec, + bukkit_versions: Vec, last_updated: DateTime, } @@ -52,25 +53,26 @@ impl FlameAnvilQueue { FlameAnvilQueue { mod_loaders: vec![], minecraft_versions: vec![], + bukkit_versions: vec![], last_updated: Utc::now() - Duration::days(365), } } - pub fn convert_game_versions_to_flame( + fn convert_game_versions_to_flame( &self, original: Vec, + flame_game_versions: &[FlameGameVersion], game_versions: &[GameVersion], ) -> Vec { let mut og_to_flame = HashMap::new(); - let mut last_visited = if self - .minecraft_versions + let mut last_visited = if flame_game_versions .last() .map(|x| x.name.ends_with("-Snapshot")) .unwrap_or_default() { None } else { - self.minecraft_versions + flame_game_versions .iter() .rfind(|x| !x.name.ends_with("-Snapshot")) .cloned() @@ -78,7 +80,7 @@ impl FlameAnvilQueue { for game_version in game_versions { if let Some(flame_game_version) = - self.minecraft_versions.iter().find(|x| { + flame_game_versions.iter().find(|x| { x.name == if game_version.version.starts_with('b') { game_version.version.replace('b', "Beta ") @@ -101,10 +103,8 @@ impl FlameAnvilQueue { splits.next().unwrap_or_default() ); - if let Some(flame_game_version) = self - .minecraft_versions - .iter() - .find(|x| x.name == new_str) + if let Some(flame_game_version) = + flame_game_versions.iter().find(|x| x.name == new_str) { og_to_flame.insert( &game_version.version, @@ -115,8 +115,8 @@ impl FlameAnvilQueue { .insert(&game_version.version, last_visited.id); } } - } else if let Some(first) = self.minecraft_versions.last() { - og_to_flame.insert(&game_version.version, first.id); + } else if let Some(last) = flame_game_versions.last() { + og_to_flame.insert(&game_version.version, last.id); } } @@ -141,6 +141,7 @@ impl FlameAnvilQueue { file: Vec, file_name: String, mime_type: String, + is_plugin: bool, ) -> Result { if self.last_updated < (Utc::now() - Duration::minutes(30)) { self.index(api_token).await.map_err(|_| { @@ -159,6 +160,11 @@ impl FlameAnvilQueue { let mut game_versions_converted = self.convert_game_versions_to_flame( upload_file.game_versions, + if is_plugin { + &self.bukkit_versions + } else { + &self.minecraft_versions + }, game_versions, ); @@ -209,14 +215,23 @@ impl FlameAnvilQueue { &mut self, api_token: &str, ) -> Result<(), reqwest::Error> { - let (game_versions, game_version_types) = futures::future::try_join( + let (game_versions, game_version_types, bukkit_game_versions, bukkit_game_versions_types) = futures::future::try_join4( reqwest::get(format!("https://minecraft.curseforge.com/api/game/versions?token={api_token}")), - reqwest::get(format!("https://minecraft.curseforge.com/api/game/version-types?token={api_token}")) + reqwest::get(format!("https://minecraft.curseforge.com/api/game/version-types?token={api_token}")), + reqwest::get(format!("https://dev.bukkit.org/api/game/versions?token={api_token}")), + reqwest::get(format!("https://dev.bukkit.org/api/game/version-types?token={api_token}")) ).await?; - let (game_versions, game_version_types) = futures::future::try_join( + let ( + game_versions, + game_version_types, + bukkit_game_versions, + bukkit_game_versions_types, + ) = futures::future::try_join4( game_versions.json::>(), game_version_types.json::>(), + bukkit_game_versions.json::>(), + bukkit_game_versions_types.json::>(), ) .await?; @@ -230,6 +245,11 @@ impl FlameAnvilQueue { .filter(|x| x.slug.starts_with("minecraft")) .map(|x| x.id) .collect::>(); + let bukkit_types = bukkit_game_versions_types + .iter() + .filter(|x| x.slug.starts_with("bukkit")) + .map(|x| x.id) + .collect::>(); let mod_loaders = game_versions .iter() @@ -241,9 +261,15 @@ impl FlameAnvilQueue { .filter(|x| minecraft_types.contains(&x.game_version_type_id)) .cloned() .collect::>(); + let bukkit_versions = bukkit_game_versions + .iter() + .filter(|x| bukkit_types.contains(&x.game_version_type_id)) + .cloned() + .collect::>(); self.mod_loaders = mod_loaders; self.minecraft_versions = minecraft_versions; + self.bukkit_versions = bukkit_versions; Ok(()) } diff --git a/src/routes/project_creation.rs b/src/routes/project_creation.rs index 0b8d3dd33..fe515afed 100644 --- a/src/routes/project_creation.rs +++ b/src/routes/project_creation.rs @@ -42,7 +42,7 @@ pub enum CreateError { SerDeError(#[from] serde_json::Error), #[error("Error while validating input: {0}")] ValidationError(String), - #[error("Error while uploading file")] + #[error("Error while uploading file: {0}")] FileHostingError(#[from] FileHostingError), #[error("Error while validating uploaded file: {0}")] FileValidationError(#[from] crate::validate::ValidationError), diff --git a/src/routes/version_creation.rs b/src/routes/version_creation.rs index 172f87914..b8da9ed4f 100644 --- a/src/routes/version_creation.rs +++ b/src/routes/version_creation.rs @@ -15,7 +15,8 @@ use crate::routes::project_creation::{CreateError, UploadedFile}; use crate::util::auth::get_user_from_headers; use crate::util::routes::read_from_field; use crate::util::validate::validation_errors_to_string; -use crate::validate::{validate_file, ValidationResult}; +use crate::validate::plugin::PluginYmlValidator; +use crate::validate::{validate_file, ValidationResult, Validator}; use actix::fut::ready; use actix_multipart::{Field, Multipart}; use actix_web::web::Data; @@ -802,6 +803,12 @@ pub async fn upload_file( if let Some(key) = flame_anvil_key { let mut flame_anvil_queue = flame_anvil_queue.lock().await; + let is_plugin = loaders.iter().any(|x| { + PluginYmlValidator {} + .get_supported_loaders() + .contains(&&*x.0) + }); + flame_anvil_queue .upload_file( &key, @@ -820,6 +827,7 @@ pub async fn upload_file( data.to_vec(), file_name.to_string(), content_type.to_string(), + is_plugin, ) .await?; } diff --git a/src/validate/mod.rs b/src/validate/mod.rs index 8a05972ae..dc80f77f5 100644 --- a/src/validate/mod.rs +++ b/src/validate/mod.rs @@ -16,7 +16,7 @@ mod fabric; mod forge; mod liteloader; mod modpack; -mod plugin; +pub mod plugin; mod quilt; mod resourcepack;