1
1
use anyhow:: Context ;
2
+ use std:: sync:: atomic:: { AtomicBool , Ordering } ;
3
+ use std:: sync:: Arc ;
4
+ use std:: time:: SystemTime ;
2
5
use std:: {
3
6
fs:: { self , File } ,
4
7
io,
@@ -11,6 +14,8 @@ use zip::ZipArchive;
11
14
const JAR_URL : & str =
12
15
"https://launcher.mojang.com/v1/objects/c5f6fb23c3876461d46ec380421e42b289789530/server.jar" ;
13
16
const JAR_NAME : & str = "server-1.16.2.jar" ;
17
+ const DOWNLOAD_WARNING_MINUTES : f64 = 2.0 ;
18
+ const DOWNLOAD_TIMEOUT_MINUTES : u64 = 30 ;
14
19
15
20
/// Downloads vanilla server/client JARs and assets, used
16
21
/// for loot tables, recipes, etc.
@@ -19,7 +24,10 @@ const JAR_NAME: &str = "server-1.16.2.jar";
19
24
/// The vanilla datapack will be extracted to `$base/datapacks`.
20
25
pub fn download_vanilla_assets ( base : & Path ) -> anyhow:: Result < ( ) > {
21
26
let jar = download_jar ( base)
22
- . context ( "failed to download vanilla server JAR" )
27
+ . context ( format ! (
28
+ "failed to download vanilla server JAR in {} minutes" ,
29
+ DOWNLOAD_TIMEOUT_MINUTES
30
+ ) )
23
31
. context ( "please make sure you have an Internet connection." ) ?;
24
32
// NB: JAR files are just glorified ZIP files, so we can use the zip crate
25
33
// to process the data.
@@ -32,10 +40,37 @@ pub fn download_vanilla_assets(base: &Path) -> anyhow::Result<()> {
32
40
33
41
fn download_jar ( base : & Path ) -> anyhow:: Result < File > {
34
42
log:: info!( "Downloading vanilla server JAR from {}" , JAR_URL ) ;
43
+
44
+ let downloaded = Arc :: new ( AtomicBool :: new ( false ) ) ;
45
+ let download_start_time = SystemTime :: now ( ) ;
46
+ let mut download_time = 1.0 ;
47
+ let mut warning = 1 ;
48
+ let downloaded1 = downloaded. clone ( ) ;
49
+ std:: thread:: spawn ( move || {
50
+ while !downloaded1. load ( Ordering :: Relaxed ) {
51
+ let elapsed = download_start_time. elapsed ( ) . unwrap ( ) . as_secs_f64 ( ) ;
52
+ if elapsed / 60.0 >= warning as f64 * DOWNLOAD_WARNING_MINUTES
53
+ && download_time / 60.0 < warning as f64 * DOWNLOAD_WARNING_MINUTES
54
+ {
55
+ log:: warn!( "Looks like you have a slow internet connection! Downloading vanilla server JAR for {} minutes" , warning as f64 * DOWNLOAD_WARNING_MINUTES ) ;
56
+ warning += 1 ;
57
+ }
58
+ download_time = elapsed;
59
+ std:: thread:: sleep ( Duration :: from_secs ( 1 ) ) ;
60
+ }
61
+ } ) ;
62
+
35
63
let mut data = ureq:: get ( JAR_URL )
36
- . timeout ( Duration :: from_secs ( 10 ) )
37
- . call ( ) ?
64
+ . timeout ( Duration :: from_secs ( 60 * DOWNLOAD_TIMEOUT_MINUTES ) )
65
+ . call ( )
66
+ . map_err ( |err| {
67
+ // stop download time counter
68
+ downloaded. store ( true , Ordering :: Relaxed ) ;
69
+ err
70
+ } ) ?
38
71
. into_reader ( ) ;
72
+ downloaded. store ( true , Ordering :: Relaxed ) ;
73
+ log:: info!( "Downloaded vanilla server JAR successfully" ) ;
39
74
40
75
let downloaded_dir = base. join ( "downloaded" ) ;
41
76
fs:: create_dir_all ( & downloaded_dir) ?;
0 commit comments