mirror of
				https://github.com/WarrenHood/MCModpackManager.git
				synced 2025-11-04 01:18:40 +00:00 
			
		
		
		
	Add support for the raw mod provider
This commit is contained in:
		
							parent
							
								
									c216873393
								
							
						
					
					
						commit
						6aa9cff368
					
				
							
								
								
									
										8
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| 
						 | 
					@ -1930,12 +1930,6 @@ dependencies = [
 | 
				
			||||||
 "smallvec",
 | 
					 "smallvec",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					 | 
				
			||||||
name = "lhash"
 | 
					 | 
				
			||||||
version = "1.1.0"
 | 
					 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					 | 
				
			||||||
checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "libc"
 | 
					name = "libc"
 | 
				
			||||||
version = "0.2.158"
 | 
					version = "0.2.158"
 | 
				
			||||||
| 
						 | 
					@ -2073,10 +2067,10 @@ dependencies = [
 | 
				
			||||||
 "clap",
 | 
					 "clap",
 | 
				
			||||||
 "git2",
 | 
					 "git2",
 | 
				
			||||||
 "home",
 | 
					 "home",
 | 
				
			||||||
 "lhash",
 | 
					 | 
				
			||||||
 "reqwest",
 | 
					 "reqwest",
 | 
				
			||||||
 "semver",
 | 
					 "semver",
 | 
				
			||||||
 "serde",
 | 
					 "serde",
 | 
				
			||||||
 | 
					 "sha1",
 | 
				
			||||||
 "sha2",
 | 
					 "sha2",
 | 
				
			||||||
 "tempfile",
 | 
					 "tempfile",
 | 
				
			||||||
 "tokio",
 | 
					 "tokio",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,10 +9,10 @@ anyhow = "1.0.86"
 | 
				
			||||||
clap = { version = "4.5.15", features = ["derive"] }
 | 
					clap = { version = "4.5.15", features = ["derive"] }
 | 
				
			||||||
git2 = "0.19.0"
 | 
					git2 = "0.19.0"
 | 
				
			||||||
home = "0.5.9"
 | 
					home = "0.5.9"
 | 
				
			||||||
lhash = { version = "1.1.0", features = ["sha1", "sha512"] }
 | 
					 | 
				
			||||||
reqwest = { version = "0.12.5", features = ["json"] }
 | 
					reqwest = { version = "0.12.5", features = ["json"] }
 | 
				
			||||||
semver = { version = "1.0.23", features = ["serde"] }
 | 
					semver = { version = "1.0.23", features = ["serde"] }
 | 
				
			||||||
serde = { version = "1.0.207", features = ["derive"] }
 | 
					serde = { version = "1.0.207", features = ["derive"] }
 | 
				
			||||||
 | 
					sha1 = "0.10.6"
 | 
				
			||||||
sha2 = "0.10.8"
 | 
					sha2 = "0.10.8"
 | 
				
			||||||
tempfile = "3.12.0"
 | 
					tempfile = "3.12.0"
 | 
				
			||||||
tokio = { version = "1.39.2", features = ["full"] }
 | 
					tokio = { version = "1.39.2", features = ["full"] }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,7 +34,9 @@ pub struct ModMeta {
 | 
				
			||||||
    pub providers: Option<Vec<ModProvider>>,
 | 
					    pub providers: Option<Vec<ModProvider>>,
 | 
				
			||||||
    pub mc_version: Option<String>,
 | 
					    pub mc_version: Option<String>,
 | 
				
			||||||
    pub loader: Option<ModLoader>,
 | 
					    pub loader: Option<ModLoader>,
 | 
				
			||||||
    download_url: Option<String>,
 | 
					    pub download_url: Option<String>,
 | 
				
			||||||
 | 
					    pub server_side: Option<bool>,
 | 
				
			||||||
 | 
					    pub client_side: Option<bool>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl PartialEq for ModMeta {
 | 
					impl PartialEq for ModMeta {
 | 
				
			||||||
| 
						 | 
					@ -106,6 +108,8 @@ impl Default for ModMeta {
 | 
				
			||||||
            download_url: Default::default(),
 | 
					            download_url: Default::default(),
 | 
				
			||||||
            mc_version: None,
 | 
					            mc_version: None,
 | 
				
			||||||
            loader: None,
 | 
					            loader: None,
 | 
				
			||||||
 | 
					            server_side: None,
 | 
				
			||||||
 | 
					            client_side: None,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,7 @@
 | 
				
			||||||
use anyhow::Result;
 | 
					use anyhow::Result;
 | 
				
			||||||
 | 
					use reqwest::{header::CONTENT_DISPOSITION, Url};
 | 
				
			||||||
use serde::{Deserialize, Serialize};
 | 
					use serde::{Deserialize, Serialize};
 | 
				
			||||||
 | 
					use sha1::Sha1;
 | 
				
			||||||
use sha2::{Digest, Sha512};
 | 
					use sha2::{Digest, Sha512};
 | 
				
			||||||
use std::{
 | 
					use std::{
 | 
				
			||||||
    collections::{BTreeMap, HashSet},
 | 
					    collections::{BTreeMap, HashSet},
 | 
				
			||||||
| 
						 | 
					@ -10,7 +12,7 @@ use std::{
 | 
				
			||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
    mod_meta::{ModMeta, ModProvider},
 | 
					    mod_meta::{ModMeta, ModProvider},
 | 
				
			||||||
    modpack::ModpackMeta,
 | 
					    modpack::ModpackMeta,
 | 
				
			||||||
    providers::{modrinth::Modrinth, DownloadSide, PinnedMod},
 | 
					    providers::{modrinth::Modrinth, DownloadSide, FileSource, PinnedMod},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const MODPACK_LOCK_FILENAME: &str = "modpack.lock";
 | 
					const MODPACK_LOCK_FILENAME: &str = "modpack.lock";
 | 
				
			||||||
| 
						 | 
					@ -244,7 +246,54 @@ impl PinnedPackMeta {
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                crate::mod_meta::ModProvider::Raw => unimplemented!(),
 | 
					                crate::mod_meta::ModProvider::Raw => {
 | 
				
			||||||
 | 
					                    let url = mod_metadata
 | 
				
			||||||
 | 
					                        .download_url
 | 
				
			||||||
 | 
					                        .clone()
 | 
				
			||||||
 | 
					                        .ok_or(anyhow::format_err!(
 | 
				
			||||||
 | 
					                            "A download url is required to pin {}",
 | 
				
			||||||
 | 
					                            mod_metadata.name
 | 
				
			||||||
 | 
					                        ))?;
 | 
				
			||||||
 | 
					                    let file_response = reqwest::get(&url).await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // TODO: Get filename from content disposition
 | 
				
			||||||
 | 
					                    let _content_disposition = file_response.headers().get(CONTENT_DISPOSITION);
 | 
				
			||||||
 | 
					                    let url_parsed = Url::parse(&url)?;
 | 
				
			||||||
 | 
					                    let filename = url_parsed
 | 
				
			||||||
 | 
					                        .path_segments()
 | 
				
			||||||
 | 
					                        .ok_or(anyhow::format_err!(
 | 
				
			||||||
 | 
					                            "Cannot get path segments from url {}",
 | 
				
			||||||
 | 
					                            url
 | 
				
			||||||
 | 
					                        ))?
 | 
				
			||||||
 | 
					                        .last()
 | 
				
			||||||
 | 
					                        .ok_or(anyhow::format_err!("Cannot get filename from url {}", url))?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    let file_contents = file_response.bytes().await?;
 | 
				
			||||||
 | 
					                    let mut sha1_hasher = Sha1::new();
 | 
				
			||||||
 | 
					                    let mut sha512_hasher = Sha512::new();
 | 
				
			||||||
 | 
					                    sha1_hasher.update(&file_contents);
 | 
				
			||||||
 | 
					                    sha512_hasher.update(&file_contents);
 | 
				
			||||||
 | 
					                    let sha1_hash = format!("{:X}", sha1_hasher.finalize()).to_ascii_lowercase();
 | 
				
			||||||
 | 
					                    let sha512_hash =
 | 
				
			||||||
 | 
					                        format!("{:X}", sha512_hasher.finalize()).to_ascii_lowercase();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    let pinned_mod = PinnedMod {
 | 
				
			||||||
 | 
					                        source: vec![FileSource::Download {
 | 
				
			||||||
 | 
					                            url: url.into(),
 | 
				
			||||||
 | 
					                            sha1: sha1_hash,
 | 
				
			||||||
 | 
					                            sha512: sha512_hash,
 | 
				
			||||||
 | 
					                            filename: filename.into(),
 | 
				
			||||||
 | 
					                        }],
 | 
				
			||||||
 | 
					                        version: "Unknown".into(),
 | 
				
			||||||
 | 
					                        deps: None,
 | 
				
			||||||
 | 
					                        server_side: mod_metadata.server_side.unwrap_or(true),
 | 
				
			||||||
 | 
					                        client_side: mod_metadata.client_side.unwrap_or(true),
 | 
				
			||||||
 | 
					                    };
 | 
				
			||||||
 | 
					                    self.mods
 | 
				
			||||||
 | 
					                        .insert(mod_metadata.name.clone(), pinned_mod.clone());
 | 
				
			||||||
 | 
					                    println!("Pinned {}@{}", mod_metadata.name, pinned_mod.version);
 | 
				
			||||||
 | 
					                    return Ok(vec![]);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -378,9 +427,7 @@ impl PinnedPackMeta {
 | 
				
			||||||
        Ok(toml::from_str(&modpack_lock_contents)?)
 | 
					        Ok(toml::from_str(&modpack_lock_contents)?)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub async fn load_from_current_directory(
 | 
					    pub async fn load_from_current_directory(ignore_transitive_versions: bool) -> Result<Self> {
 | 
				
			||||||
        ignore_transitive_versions: bool,
 | 
					 | 
				
			||||||
    ) -> Result<Self> {
 | 
					 | 
				
			||||||
        Self::load_from_directory(&std::env::current_dir()?, ignore_transitive_versions).await
 | 
					        Self::load_from_directory(&std::env::current_dir()?, ignore_transitive_versions).await
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue