scl_core/download/
authlib.rs1use async_trait::async_trait;
4
5use super::{DownloadSource, Downloader};
6use crate::prelude::*;
7
8#[derive(Debug, Deserialize)]
9struct LatestData {
10 pub version: String,
11 pub download_url: String,
12}
13
14#[async_trait]
18pub trait AuthlibDownloadExt: Sync {
19 async fn download_authlib_injector(&self, dest_path: &str) -> DynResult;
21 async fn install_authlib_injector(&self) -> DynResult;
23}
24
25#[async_trait]
26impl<R: Reporter> AuthlibDownloadExt for Downloader<R> {
27 async fn download_authlib_injector(&self, dest_path: &str) -> DynResult {
28 let r = self.reporter.clone();
32 r.add_max_progress(2.);
33 r.set_message("正在获取 Authlib-Injector 版本元数据".into());
34 let latest_data: LatestData = crate::http::get(match self.source {
35 DownloadSource::BMCLAPI => {
36 "https://bmclapi2.bangbang93.com/mirrors/authlib-injector/artifact/latest.json"
37 }
38 _ => "https://authlib-injector.yushi.moe/artifact/latest.json",
39 })
40 .recv_json()
41 .await
42 .map_err(|e| anyhow::anyhow!(e))?;
43 r.add_progress(1.);
44 r.set_message(format!("正在下载 Authlib-Injector {}", latest_data.version));
45 let download_url = latest_data.download_url;
46 let resp = crate::http::get(download_url)
47 .await
48 .map_err(|e| anyhow::anyhow!(e))?;
49 let temp_dest_path = format!("{dest_path}.tmp");
50 let f = inner_future::fs::OpenOptions::new()
51 .write(true)
52 .truncate(true)
53 .create(true)
54 .open(&temp_dest_path)
55 .await?;
56 inner_future::io::copy(resp, f).await?;
57 r.add_progress(1.);
58 inner_future::fs::rename(temp_dest_path, dest_path).await?;
59 Ok(())
60 }
61
62 async fn install_authlib_injector(&self) -> DynResult {
63 let dest_path = format!(
64 "{}{sep}authlib-injector.jar",
65 self.minecraft_path.as_str(),
66 sep = std::path::MAIN_SEPARATOR
67 );
68 let p = std::path::Path::new(&dest_path);
69 if !p.is_file() {
70 inner_future::fs::create_dir_all(p.parent().unwrap()).await?;
71 self.download_authlib_injector(&dest_path).await?;
72 }
73 Ok(())
74 }
75}