Skip to content

Commit d1031c0

Browse files
committed
basic Paper's fill v3 impl
1 parent 3e23af3 commit d1031c0

File tree

1 file changed

+31
-31
lines changed

1 file changed

+31
-31
lines changed

src/softwares.rs

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::{fs, io::Write};
2+
use colored::Colorize;
23

34
fn download_jar(res: reqwest::blocking::Response) -> Result<(), Box<dyn std::error::Error>> {
45
let mut file = fs::File::create("server.jar")?;
@@ -14,7 +15,6 @@ pub fn get_purpur(version: String) -> Result<(), Box<dyn std::error::Error>> {
1415
version
1516
))
1617
.send();
17-
1818
if let Ok(res) = res {
1919
download_jar(res)?;
2020
Ok(())
@@ -27,43 +27,43 @@ pub fn get_other(software: String, version: String) -> Result<(), Box<dyn std::e
2727
let client = reqwest::blocking::Client::new();
2828
let res = client
2929
.get(format!(
30-
"https://api.papermc.io/v2/projects/{}/versions/{}/builds",
30+
"https://fill.papermc.io/v3/projects/{}/versions/{}/builds",
3131
software, version
3232
))
3333
.send();
3434

3535
if let Ok(res) = res {
36-
let json: serde_json::Value = res.json()?;
37-
38-
let latest_build = json["builds"]
39-
.as_array()
40-
.unwrap_or(&vec![])
41-
.iter()
42-
.filter_map(|build| build["build"].as_u64())
43-
.max();
44-
45-
if let Some(latest_build) = latest_build {
46-
let jar_name = format!("{}-{}-{}.jar", software, version, latest_build);
47-
let res = client
48-
.get(format!(
49-
"https://api.papermc.io/v2/projects/{}/versions/{}/builds/{}/downloads/{}",
50-
software.to_lowercase(),
51-
version,
52-
latest_build,
53-
jar_name
54-
))
55-
.send();
56-
if let Ok(res) = res {
57-
download_jar(res)?;
58-
Ok(())
59-
} else {
60-
Err(format!("failed to download {}", software).into())
61-
}
36+
let builds: serde_json::Value = res.json()?;
37+
38+
let builds_array = builds.as_array()
39+
.ok_or("Invalid response format: expected array of builds")?;
40+
41+
if builds_array.is_empty() {
42+
return Err(format!("No builds available for {} version {}", software, version).into());
43+
}
44+
45+
let latest_build = &builds_array[0];
46+
47+
// Extract the download URL from the build object
48+
let download_url = latest_build["downloads"]["server:default"]["url"]
49+
.as_str()
50+
.ok_or("Download URL not found in build response")?;
51+
52+
if latest_build["channel"] != "STABLE" && latest_build["channel"] != "RECOMMENDED" {
53+
println!("You are downloading an {} build, {} use it in production environment!", "unstable".red(), "DON'T".red());
54+
}
55+
56+
// Download the jar file directly using the provided URL
57+
let res = client.get(download_url).send();
58+
59+
if let Ok(res) = res {
60+
download_jar(res)?;
61+
Ok(())
6262
} else {
63-
Err(format!("failed to download {}", software).into())
63+
Err(format!("failed to download {} jar file", software).into())
6464
}
6565
} else {
66-
Err(format!("failed to download {}", software).into())
66+
Err(format!("failed to fetch builds for {}", software).into())
6767
}
6868
}
6969

@@ -72,4 +72,4 @@ pub fn get(name: String, version: String) -> Result<(), Box<dyn std::error::Erro
7272
"purpur" => get_purpur(version),
7373
_ => get_other(name, version),
7474
}
75-
}
75+
}

0 commit comments

Comments
 (0)