FlameAnvil fixes (#484)

This commit is contained in:
Geometrically
2022-11-21 18:59:21 -07:00
committed by GitHub
parent f259d81249
commit 213a64b1ff
5 changed files with 52 additions and 18 deletions

View File

@@ -231,7 +231,7 @@ async fn main() -> std::io::Result<()> {
.app_data(web::Data::new(search_config.clone())) .app_data(web::Data::new(search_config.clone()))
.app_data(web::Data::new(download_queue.clone())) .app_data(web::Data::new(download_queue.clone()))
.app_data(web::Data::new(payouts_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())) .app_data(web::Data::new(ip_salt.clone()))
.wrap(sentry_actix::Sentry::new()) .wrap(sentry_actix::Sentry::new())
.configure(routes::v1_config) .configure(routes::v1_config)

View File

@@ -35,6 +35,7 @@ struct FlameUploadFile {
pub struct FlameAnvilQueue { pub struct FlameAnvilQueue {
mod_loaders: Vec<FlameGameVersion>, mod_loaders: Vec<FlameGameVersion>,
minecraft_versions: Vec<FlameGameVersion>, minecraft_versions: Vec<FlameGameVersion>,
bukkit_versions: Vec<FlameGameVersion>,
last_updated: DateTime<Utc>, last_updated: DateTime<Utc>,
} }
@@ -52,25 +53,26 @@ impl FlameAnvilQueue {
FlameAnvilQueue { FlameAnvilQueue {
mod_loaders: vec![], mod_loaders: vec![],
minecraft_versions: vec![], minecraft_versions: vec![],
bukkit_versions: vec![],
last_updated: Utc::now() - Duration::days(365), last_updated: Utc::now() - Duration::days(365),
} }
} }
pub fn convert_game_versions_to_flame( fn convert_game_versions_to_flame(
&self, &self,
original: Vec<String>, original: Vec<String>,
flame_game_versions: &[FlameGameVersion],
game_versions: &[GameVersion], game_versions: &[GameVersion],
) -> Vec<i32> { ) -> Vec<i32> {
let mut og_to_flame = HashMap::new(); let mut og_to_flame = HashMap::new();
let mut last_visited = if self let mut last_visited = if flame_game_versions
.minecraft_versions
.last() .last()
.map(|x| x.name.ends_with("-Snapshot")) .map(|x| x.name.ends_with("-Snapshot"))
.unwrap_or_default() .unwrap_or_default()
{ {
None None
} else { } else {
self.minecraft_versions flame_game_versions
.iter() .iter()
.rfind(|x| !x.name.ends_with("-Snapshot")) .rfind(|x| !x.name.ends_with("-Snapshot"))
.cloned() .cloned()
@@ -78,7 +80,7 @@ impl FlameAnvilQueue {
for game_version in game_versions { for game_version in game_versions {
if let Some(flame_game_version) = if let Some(flame_game_version) =
self.minecraft_versions.iter().find(|x| { flame_game_versions.iter().find(|x| {
x.name x.name
== if game_version.version.starts_with('b') { == if game_version.version.starts_with('b') {
game_version.version.replace('b', "Beta ") game_version.version.replace('b', "Beta ")
@@ -101,10 +103,8 @@ impl FlameAnvilQueue {
splits.next().unwrap_or_default() splits.next().unwrap_or_default()
); );
if let Some(flame_game_version) = self if let Some(flame_game_version) =
.minecraft_versions flame_game_versions.iter().find(|x| x.name == new_str)
.iter()
.find(|x| x.name == new_str)
{ {
og_to_flame.insert( og_to_flame.insert(
&game_version.version, &game_version.version,
@@ -115,8 +115,8 @@ impl FlameAnvilQueue {
.insert(&game_version.version, last_visited.id); .insert(&game_version.version, last_visited.id);
} }
} }
} else if let Some(first) = self.minecraft_versions.last() { } else if let Some(last) = flame_game_versions.last() {
og_to_flame.insert(&game_version.version, first.id); og_to_flame.insert(&game_version.version, last.id);
} }
} }
@@ -141,6 +141,7 @@ impl FlameAnvilQueue {
file: Vec<u8>, file: Vec<u8>,
file_name: String, file_name: String,
mime_type: String, mime_type: String,
is_plugin: bool,
) -> Result<i32, CreateError> { ) -> Result<i32, CreateError> {
if self.last_updated < (Utc::now() - Duration::minutes(30)) { if self.last_updated < (Utc::now() - Duration::minutes(30)) {
self.index(api_token).await.map_err(|_| { self.index(api_token).await.map_err(|_| {
@@ -159,6 +160,11 @@ impl FlameAnvilQueue {
let mut game_versions_converted = self.convert_game_versions_to_flame( let mut game_versions_converted = self.convert_game_versions_to_flame(
upload_file.game_versions, upload_file.game_versions,
if is_plugin {
&self.bukkit_versions
} else {
&self.minecraft_versions
},
game_versions, game_versions,
); );
@@ -209,14 +215,23 @@ impl FlameAnvilQueue {
&mut self, &mut self,
api_token: &str, api_token: &str,
) -> Result<(), reqwest::Error> { ) -> 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/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?; ).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::<Vec<FlameGameVersion>>(), game_versions.json::<Vec<FlameGameVersion>>(),
game_version_types.json::<Vec<FlameGameVersionType>>(), game_version_types.json::<Vec<FlameGameVersionType>>(),
bukkit_game_versions.json::<Vec<FlameGameVersion>>(),
bukkit_game_versions_types.json::<Vec<FlameGameVersionType>>(),
) )
.await?; .await?;
@@ -230,6 +245,11 @@ impl FlameAnvilQueue {
.filter(|x| x.slug.starts_with("minecraft")) .filter(|x| x.slug.starts_with("minecraft"))
.map(|x| x.id) .map(|x| x.id)
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let bukkit_types = bukkit_game_versions_types
.iter()
.filter(|x| x.slug.starts_with("bukkit"))
.map(|x| x.id)
.collect::<Vec<_>>();
let mod_loaders = game_versions let mod_loaders = game_versions
.iter() .iter()
@@ -241,9 +261,15 @@ impl FlameAnvilQueue {
.filter(|x| minecraft_types.contains(&x.game_version_type_id)) .filter(|x| minecraft_types.contains(&x.game_version_type_id))
.cloned() .cloned()
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let bukkit_versions = bukkit_game_versions
.iter()
.filter(|x| bukkit_types.contains(&x.game_version_type_id))
.cloned()
.collect::<Vec<_>>();
self.mod_loaders = mod_loaders; self.mod_loaders = mod_loaders;
self.minecraft_versions = minecraft_versions; self.minecraft_versions = minecraft_versions;
self.bukkit_versions = bukkit_versions;
Ok(()) Ok(())
} }

View File

@@ -42,7 +42,7 @@ pub enum CreateError {
SerDeError(#[from] serde_json::Error), SerDeError(#[from] serde_json::Error),
#[error("Error while validating input: {0}")] #[error("Error while validating input: {0}")]
ValidationError(String), ValidationError(String),
#[error("Error while uploading file")] #[error("Error while uploading file: {0}")]
FileHostingError(#[from] FileHostingError), FileHostingError(#[from] FileHostingError),
#[error("Error while validating uploaded file: {0}")] #[error("Error while validating uploaded file: {0}")]
FileValidationError(#[from] crate::validate::ValidationError), FileValidationError(#[from] crate::validate::ValidationError),

View File

@@ -15,7 +15,8 @@ use crate::routes::project_creation::{CreateError, UploadedFile};
use crate::util::auth::get_user_from_headers; use crate::util::auth::get_user_from_headers;
use crate::util::routes::read_from_field; use crate::util::routes::read_from_field;
use crate::util::validate::validation_errors_to_string; 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::fut::ready;
use actix_multipart::{Field, Multipart}; use actix_multipart::{Field, Multipart};
use actix_web::web::Data; use actix_web::web::Data;
@@ -802,6 +803,12 @@ pub async fn upload_file(
if let Some(key) = flame_anvil_key { if let Some(key) = flame_anvil_key {
let mut flame_anvil_queue = flame_anvil_queue.lock().await; 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 flame_anvil_queue
.upload_file( .upload_file(
&key, &key,
@@ -820,6 +827,7 @@ pub async fn upload_file(
data.to_vec(), data.to_vec(),
file_name.to_string(), file_name.to_string(),
content_type.to_string(), content_type.to_string(),
is_plugin,
) )
.await?; .await?;
} }

View File

@@ -16,7 +16,7 @@ mod fabric;
mod forge; mod forge;
mod liteloader; mod liteloader;
mod modpack; mod modpack;
mod plugin; pub mod plugin;
mod quilt; mod quilt;
mod resourcepack; mod resourcepack;