Skip to content

Commit 3039105

Browse files
committed
feat: add suffixes support
1 parent d713b09 commit 3039105

File tree

1 file changed

+69
-8
lines changed

1 file changed

+69
-8
lines changed

crates/nomi-core/src/loaders/forge.rs

+69-8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
1-
use std::{collections::HashMap, fmt::Debug};
1+
use std::{collections::HashMap, fmt::Debug, slice::Iter};
22

33
use anyhow::anyhow;
44
use itertools::Itertools;
55
use serde::{Deserialize, Serialize};
66

7+
use crate::{
8+
downloads::{
9+
progress::ProgressSender,
10+
traits::{DownloadResult, Downloader},
11+
},
12+
PinnedFutureWithBounds,
13+
};
14+
715
const FORGE_REPO_URL: &str = "https://maven.minecraftforge.net";
816
const FORGE_GROUP: &str = "net.minecraftforge";
917
const FORGE_ARTIFACT: &str = "forge";
@@ -12,8 +20,25 @@ const NEO_FORGE_REPO_URL: &str = "https://maven.neoforged.net/releases/";
1220
const NEO_FORGE_GROUP: &str = "net.neoforged";
1321
const NEO_FORGE_ARTIFACT: &str = "neoforge";
1422

23+
/// Some versions require to have a suffix
24+
const FORGE_SUFFIXES: &[(&str, &[&str])] = &[
25+
("1.11", &["-1.11.x"]),
26+
("1.10.2", &["-1.10.0"]),
27+
("1.10", &["-1.10.0"]),
28+
("1.9.4", &["-1.9.4"]),
29+
("1.9", &["-1.9.0", "-1.9"]),
30+
("1.8.9", &["-1.8.9"]),
31+
("1.8.8", &["-1.8.8"]),
32+
("1.8", &["-1.8"]),
33+
("1.7.10", &["-1.7.10", "-1710ls", "-new"]),
34+
("1.7.2", &["-mc172"]),
35+
];
36+
37+
#[derive(Debug)]
1538
pub struct Forge {
16-
url: String,
39+
urls: Vec<String>,
40+
game_version: String,
41+
forge_version: String,
1742
}
1843

1944
impl Forge {
@@ -26,6 +51,7 @@ impl Forge {
2651
.text()
2752
.await?;
2853

54+
// Parsing the XML to get versions list
2955
let versions = raw
3056
.find("<version>")
3157
.and_then(|s| raw.find("</versions>").map(|e| (s, e)))
@@ -50,6 +76,7 @@ impl Forge {
5076
}
5177
}
5278

79+
/// Get forge versions that are recommended for specific game version
5380
pub async fn get_promo_versions() -> anyhow::Result<ForgeVersions> {
5481
reqwest::get("https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json")
5582
.await?
@@ -67,6 +94,7 @@ impl Forge {
6794
let promo_versions = Self::get_promo_versions().await?;
6895

6996
let from_promo = |version| {
97+
// Sometime one of those does not exist so we have a fallback.
7098
let next_version = match version {
7199
ForgeVersion::Recommended => ForgeVersion::Latest,
72100
ForgeVersion::Latest => ForgeVersion::Recommended,
@@ -86,13 +114,43 @@ impl Forge {
86114
version => from_promo(version),
87115
};
88116

89-
let Some(spesific_version) = opt else {
117+
let Some(ForgeVersion::Specific(forge_version)) = opt else {
90118
return Err(anyhow!("Cannot match version"));
91119
};
92120

93-
dbg!(&spesific_version);
121+
let mut suffixes = vec![""];
94122

95-
Err(anyhow!("not yet implemented"))
123+
if let Some((_, s)) = FORGE_SUFFIXES.iter().find(|(k, _)| k == &game_version) {
124+
suffixes.extend(s.iter());
125+
}
126+
127+
// Make list of urls that we should try to get installer from
128+
let urls = suffixes.into_iter().map(|suffix| {
129+
format!(
130+
"{FORGE_REPO_URL}/net/minecraftforge/forge/{game_version}-{forge_version}{suffix}/forge-{game_version}-{forge_version}{suffix}-installer.jar",
131+
)
132+
}).collect_vec();
133+
134+
Ok(Self {
135+
urls,
136+
game_version,
137+
forge_version,
138+
})
139+
}
140+
}
141+
142+
#[async_trait::async_trait]
143+
impl Downloader for Forge {
144+
type Data = DownloadResult;
145+
146+
fn total(&self) -> u32 {
147+
1
148+
}
149+
150+
async fn download(self: Box<Self>, sender: &dyn ProgressSender<Self::Data>) {}
151+
152+
fn io(&self) -> PinnedFutureWithBounds<anyhow::Result<()>> {
153+
todo!();
96154
}
97155
}
98156

@@ -129,13 +187,16 @@ mod tests {
129187

130188
#[tokio::test]
131189
async fn get_versions_test() {
132-
let versions = Forge::get_versions("1.19.2").await.unwrap();
190+
let versions = Forge::get_versions("1.7.10").await.unwrap();
133191
println!("{versions:#?}");
134192
}
135193

136194
#[tokio::test]
137195
async fn create_forge_test() {
138-
let _recommended = Forge::new("1.19.2", ForgeVersion::Recommended).await;
139-
let _latest = Forge::new("1.19.2", ForgeVersion::Latest).await;
196+
let recommended = Forge::new("1.7.10", ForgeVersion::Recommended).await.unwrap();
197+
println!("{recommended:#?}");
198+
199+
let latest = Forge::new("1.19.2", ForgeVersion::Latest).await.unwrap();
200+
println!("{latest:#?}");
140201
}
141202
}

0 commit comments

Comments
 (0)