mirror of
https://github.com/WarrenHood/MCModpackManager.git
synced 2025-04-29 23:04:58 +01: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