Skip to content

Commit

Permalink
update checkout and simplify forge
Browse files Browse the repository at this point in the history
  • Loading branch information
dxbednarczyk committed Feb 9, 2024
1 parent 2f917be commit 51c6921
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 48 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
runs-on: ${{ matrix.os }}

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: "Run unit tests"
run: |
Expand Down
95 changes: 48 additions & 47 deletions src/loader/forge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ const BASE_MAVEN_URL: &str = "https://maven.minecraftforge.net/net/minecraftforg
// Forge does not provide installer jarfiles before Minecraft version 1.5.2
static MINECRAFT_CUTOFF: Lazy<Versioning> = Lazy::new(|| Versioning::new("1.5.2").unwrap());

// The cutoff in 1.9 builds after which versions are formatted as 1.X-[installer]-1.X.0
static LOADER_CUTOFF_TRIPLE: Lazy<Versioning> =
// The cutoff in 1.9 builds after which versions are formatted as 1.X-{installer}-1.X.0
static INSTALLER_CUTOFF_TRIPLE: Lazy<Versioning> =
Lazy::new(|| Versioning::new("12.16.1.1938").unwrap());

// The cutoff in 1.9 builds before which versions are formatted as 1.9-[installer]
static LOADER_CUTOFF_DOUBLE: Lazy<Versioning> =
// The cutoff in 1.9 builds before which versions are formatted as 1.9-{installer}
static INSTALLER_CUTOFF_DOUBLE: Lazy<Versioning> =
Lazy::new(|| Versioning::new("12.16.0.1885").unwrap());

#[derive(Debug, Deserialize)]
Expand All @@ -30,7 +30,12 @@ pub fn fetch(
installer_version: &str,
force_latest: bool,
) -> Result<(), anyhow::Error> {
let promos = get_promos()?;
let resp: PromosResponse = ureq::get(PROMOS_URL)
.set("User-Agent", pap::FAKE_USER_AGENT)
.call()?
.into_json()?;

let promos = resp.promos;

let minecraft = if minecraft_version == "latest" {
let mut versions: Vec<Versioning> = promos
Expand Down Expand Up @@ -64,7 +69,9 @@ pub fn fetch(
_ => installer_version,
};

let formatted_url = get_formatted_url(&minecraft, installer)?;
let version_tag = get_version_tag(&minecraft, installer)?;

let formatted_url = format!("{BASE_MAVEN_URL}/{version_tag}/forge-{version_tag}-installer.jar");

let resp = ureq::get(&formatted_url)
.set("User-Agent", pap::FAKE_USER_AGENT)
Expand All @@ -75,63 +82,48 @@ pub fn fetch(
let mut file = File::create(filename)?;
io::copy(&mut resp.into_reader(), &mut file)?;

Ok(())
}
eprintln!("This is an installer, not a server loader! Please run it and install the server before proceeding.");

fn get_promos() -> Result<HashMap<String, String>, anyhow::Error> {
let resp: PromosResponse = ureq::get(PROMOS_URL)
.set("User-Agent", pap::FAKE_USER_AGENT)
.call()?
.into_json()?;

Ok(resp.promos)
}

fn get_formatted_url(minecraft: &Versioning, loader: &str) -> Result<String, anyhow::Error> {
let tag: String = get_version_tag(minecraft, loader)?;

let formatted_url = format!("{BASE_MAVEN_URL}/{tag}/forge-{tag}-installer.jar");

Ok(formatted_url)
Ok(())
}

// Did I mention already how much I hate the Forge versioning scheme?
fn get_version_tag(minecraft: &Versioning, loader: &str) -> Result<String, anyhow::Error> {
fn get_version_tag(minecraft: &Versioning, installer: &str) -> Result<String, anyhow::Error> {
if minecraft < &MINECRAFT_CUTOFF {
return Err(anyhow!(
"forge does not provide installer jarfiles before Minecraft 1.5.2"
));
}

// Lots of edge cases here
match minecraft {
Versioning::Ideal(s) => {
if !(7..10).contains(&s.minor) {
return Ok(format!("{s}-{loader}"));
return Ok(format!("{s}-{installer}"));
}

if s.minor == 7 && s.patch == 2 {
return Ok(format!("1.7.2-{loader}-mc172"));
return Ok(format!("1.7.2-{installer}-mc172"));
}

Ok(format!("{s}-{loader}-{s}"))
Ok(format!("{s}-{installer}-{s}"))
}
Versioning::General(v) => {
let minor: u32 = v.chunks.0[1].to_string().parse()?;

let loader = Versioning::new(loader).unwrap();
let installer = Versioning::new(installer).unwrap();

if (9..11).contains(&minor) && &loader >= &LOADER_CUTOFF_TRIPLE {
return Ok(format!("{v}-{loader}-{v}.0"));
if (9..11).contains(&minor) && &installer >= &INSTALLER_CUTOFF_TRIPLE {
return Ok(format!("{v}-{installer}-{v}.0"));
}

if minor == 9 && &loader <= &LOADER_CUTOFF_DOUBLE {
return Ok(format!("{v}-{loader}-{v}"));
if minor == 9 && &installer <= &INSTALLER_CUTOFF_DOUBLE {
return Ok(format!("{v}-{installer}-{v}"));
}

Ok(format!("{v}-{loader}"))
Ok(format!("{v}-{installer}"))
}
// This is currently the only release that ends up down here...
Versioning::Complex(_) => Ok(format!("1.7.10_pre4-{loader}-prerelease")),
Versioning::Complex(_) => Ok(format!("1.7.10_pre4-{installer}-prerelease")),
}
}

Expand All @@ -142,40 +134,49 @@ mod tests {
#[test]
fn test_ideal_version() -> Result<(), anyhow::Error> {
let minecraft = Versioning::new("1.9.4").unwrap();
let installer = String::from("12.17.0.2317");
let installer = "12.17.0.2317";
let expected = "https://maven.minecraftforge.net/net/minecraftforge/forge/1.9.4-12.17.0.2317-1.9.4/forge-1.9.4-12.17.0.2317-1.9.4-installer.jar";

assert_eq!(expected, get_formatted_url(&minecraft, &installer)?);
let version_tag = get_version_tag(&minecraft, installer)?;

let formatted_url =
format!("{BASE_MAVEN_URL}/{version_tag}/forge-{version_tag}-installer.jar");

assert_eq!(expected, formatted_url);

Ok(())
}

#[test]
fn test_general_version() -> Result<(), anyhow::Error> {
let minecraft = Versioning::new("1.9").unwrap();
let installer = String::from("12.16.1.1938");
let installer = "12.16.1.1938";
let expected = "https://maven.minecraftforge.net/net/minecraftforge/forge/1.9-12.16.1.1938-1.9.0/forge-1.9-12.16.1.1938-1.9.0-installer.jar";

assert_eq!(expected, get_formatted_url(&minecraft, &installer)?);
let version_tag = get_version_tag(&minecraft, installer)?;

let formatted_url =
format!("{BASE_MAVEN_URL}/{version_tag}/forge-{version_tag}-installer.jar");

assert_eq!(expected, formatted_url);

Ok(())
}

#[test]
fn test_cutoff() -> Result<(), anyhow::Error> {
let minecraft = Versioning::new("1.2.5").unwrap();
let installer = String::from("who cares");
let installer = "who cares";
let expected: Result<(), anyhow::Error> = Err(anyhow!(
"forge does not provide installer jarfiles before Minecraft 1.5.2"
));

assert_eq!(
expected.err().unwrap().to_string(),
get_formatted_url(&minecraft, &installer)
.err()
.unwrap()
.to_string()
);
let resp = get_version_tag(&minecraft, installer)
.err()
.unwrap()
.to_string();

assert_eq!(expected.err().unwrap().to_string(), resp);

Ok(())
}
Expand Down

0 comments on commit 51c6921

Please sign in to comment.