11use std:: { fs, io:: Write } ;
2+ use colored:: Colorize ;
23
34fn 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