diff --git a/FCLauncher/package-lock.json b/FCLauncher/package-lock.json index 16abb3d..9b9254c 100644 --- a/FCLauncher/package-lock.json +++ b/FCLauncher/package-lock.json @@ -8,9 +8,26 @@ "name": "fclauncher", "version": "0.0.0", "devDependencies": { + "@tauri-apps/api": "^1.5.6", "@tauri-apps/cli": "^1" } }, + "node_modules/@tauri-apps/api": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.5.6.tgz", + "integrity": "sha512-LH5ToovAHnDVe5Qa9f/+jW28I6DeMhos8bNDtBOmmnaDpPmJmYLyHdeDblAWWWYc7KKRDg9/66vMuKyq0WIeFA==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "engines": { + "node": ">= 14.6.0", + "npm": ">= 6.6.0", + "yarn": ">= 1.19.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, "node_modules/@tauri-apps/cli": { "version": "1.5.14", "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.5.14.tgz", diff --git a/FCLauncher/package.json b/FCLauncher/package.json index ba4afd4..cd1e382 100644 --- a/FCLauncher/package.json +++ b/FCLauncher/package.json @@ -7,6 +7,7 @@ "tauri": "tauri" }, "devDependencies": { + "@tauri-apps/api": "^1.5.6", "@tauri-apps/cli": "^1" } } diff --git a/FCLauncher/src-tauri/src/ftp.rs b/FCLauncher/src-tauri/src/ftp.rs index ea1d263..16a3302 100644 --- a/FCLauncher/src-tauri/src/ftp.rs +++ b/FCLauncher/src-tauri/src/ftp.rs @@ -24,7 +24,7 @@ fn ftp_connection(username: &str, password: &str) -> Result Result { +pub fn ftp_retr(window: Option, file: PathBuf , mut writer: impl Write, mut callback: impl FnMut(Option, usize, usize)) -> Result { let mut ftp_stream = ftp_connection_anonymous().unwrap(); let file = file.to_str().unwrap().replace("\\", "/"); let size = ftp_stream.size(&file)?; @@ -36,9 +36,10 @@ pub fn ftp_retr(file: PathBuf , mut writer: impl Write, mut callback: impl FnMut writer.write_all(&mut tx_bytes.split_at(bytes_read).0).unwrap(); total += bytes_read; if total == size || bytes_read == 0 { + callback(window.clone(), 0, size); break; }else{ - callback(bytes_read); + callback(window.clone(), bytes_read, size); } } Ok(true) diff --git a/FCLauncher/src-tauri/src/java.rs b/FCLauncher/src-tauri/src/java.rs index 7c9be22..29a2e4c 100644 --- a/FCLauncher/src-tauri/src/java.rs +++ b/FCLauncher/src-tauri/src/java.rs @@ -14,15 +14,13 @@ fn check_java(version: u8) -> bool { dir.exists() } -pub fn install_java(version: u8) { +pub fn install_java(version: u8, window: tauri::Window) { if check_java(version) { return; } let ftp_dir = PathBuf::new().join("java").join(format!("java-{}-{}", version, if env::consts::OS == "windows" { "win.zip" } else {"lin.tar.gz"})); let mut buff = Cursor::new(vec![]); - let mut total: usize = 0; - let size = ftp_get_size(ftp_dir.clone()).unwrap(); - ftp::ftp_retr(ftp_dir, &mut buff, |data| util::download_callback(data, &mut total, size)).unwrap(); + ftp::ftp_retr(Some(window), ftp_dir, &mut buff, |window, data, size| util::download_callback(format!("Java {}", version), window,data, size)).unwrap(); std::fs::create_dir_all(get_local_data_directory().join("java").join(format!("java-{}-{}", version, if env::consts::OS == "windows" { "win" } else {"lin"}))).unwrap(); buff.rewind().unwrap(); diff --git a/FCLauncher/src-tauri/src/main.rs b/FCLauncher/src-tauri/src/main.rs index e7f5437..e703f9a 100644 --- a/FCLauncher/src-tauri/src/main.rs +++ b/FCLauncher/src-tauri/src/main.rs @@ -29,9 +29,10 @@ fn greet(name: &str) -> String { fn main() { - prism::install_prism(); + modpack::get_modpacks(); + //prism::install_prism(); tauri::Builder::default() - .invoke_handler(tauri::generate_handler![greet, modpack::get_modpacks, modpack::launch_modpack, prism::launch_prism]) + .invoke_handler(tauri::generate_handler![greet, modpack::get_modpacks, modpack::launch_modpack, prism::launch_prism, prism::install_prism]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/FCLauncher/src-tauri/src/modpack.rs b/FCLauncher/src-tauri/src/modpack.rs index a00dbbd..73493ba 100644 --- a/FCLauncher/src-tauri/src/modpack.rs +++ b/FCLauncher/src-tauri/src/modpack.rs @@ -10,6 +10,7 @@ use std::io::{Read, Seek, Write}; use serde_json::Value; use serde::Serialize; use serde::Deserialize; +use crate::util; @@ -61,22 +62,22 @@ fn check_modpack_needs_update(id: String) -> bool{ } #[tauri::command] -pub fn launch_modpack(id: String){ +pub async fn launch_modpack(window: tauri::Window, id: String){ if check_modpack_needs_update(id.clone()) { - install_modpack(id.clone()); + install_modpack(window, id.clone()); } // Launch let mut child = Command::new(get_local_data_directory().join("prism").join(get_prism_executable())).arg("-l").arg(get_modpack_name(id)).spawn().unwrap(); } -fn install_modpack(id: String){ +fn install_modpack(window: tauri::Window, id: String){ let versions = get_versions(id.clone()); let path = env::temp_dir().join(format!("{}.mrpack", get_modpack_name(id.clone()))); let mut file = File::create(path.clone()).unwrap(); let ftp_path = PathBuf::new().join(id.clone()).join(versions[versions.len()-1].file.clone().as_str()); println!("Downloading file {}", ftp_path.to_str().unwrap()); - ftp::ftp_retr(ftp_path, &mut file, |_| return).unwrap(); + ftp::ftp_retr(Some(window.clone()), ftp_path, &mut file, |window, data, size| util::download_callback(get_modpack_name(id.clone()), window, data, size)).unwrap(); let mut child = Command::new(get_local_data_directory().join("prism").join(get_prism_executable())).arg("-I").arg(path).spawn().unwrap(); loop { let version_path = get_local_data_directory().join("prism").join("instances").join(get_modpack_name(id.clone())).join(".minecraft").join("version.txt"); @@ -102,7 +103,7 @@ fn install_modpack(id: String){ } } let java = get_java_version(mc_version); - java::install_java(java); + java::install_java(java, window.clone()); let option_path = get_local_data_directory().join("prism").join("instances").join(get_modpack_name(id.clone())).join("instance.cfg"); let mut option_file = File::open(option_path.clone()).unwrap(); @@ -132,7 +133,7 @@ pub fn get_modpacks() -> Vec { static mut modpacks: Vec = Vec::new(); if modpacks.is_empty() { let mut buf = Cursor::new(vec![]); - ftp::ftp_retr(PathBuf::new().join("modpacks.json"), &mut buf, |_| return); + ftp::ftp_retr(None, PathBuf::new().join("modpacks.json"), &mut buf, |_, _, _| return); buf.rewind(); let v: Value = serde_json::from_reader(buf).unwrap(); println!("{}", v[0]["name"]); @@ -147,7 +148,7 @@ pub fn get_modpacks() -> Vec { fn get_versions(id: String) -> Vec { let mut versions: Vec = Vec::new(); let mut buf = Cursor::new(vec![]); - ftp::ftp_retr(PathBuf::new().join(id).join("versions.json"), &mut buf, |_| return); + ftp::ftp_retr(None, PathBuf::new().join(id).join("versions.json"), &mut buf, |_, _, _| return); buf.rewind(); let v: Value = serde_json::from_reader(buf).unwrap(); for version in v.as_array().unwrap() { diff --git a/FCLauncher/src-tauri/src/prism.rs b/FCLauncher/src-tauri/src/prism.rs index b062a03..6af00fc 100644 --- a/FCLauncher/src-tauri/src/prism.rs +++ b/FCLauncher/src-tauri/src/prism.rs @@ -3,7 +3,7 @@ use flate2::read::GzDecoder; use tar::Archive; use tauri::api::file; -use crate::{ftp, java, system_dirs::{get_local_data_directory, get_prism_executable}}; +use crate::{ftp, java, system_dirs::{get_local_data_directory, get_prism_executable}, util}; pub fn check_prism() -> bool { @@ -11,21 +11,19 @@ pub fn check_prism() -> bool { path.exists() } -pub fn install_prism() -> Result<(), Box>{ +#[tauri::command] +pub async fn install_prism(window: tauri::Window){ if check_prism() { - return Ok(()); + return; } - java::install_java(21); + java::install_java(21, window.clone()); let path = PathBuf::new().join("prism").join(format!("prism-{}",if env::consts::OS == "windows" {"win.zip"} else {"lin.tar.gz"})); - let size = ftp::ftp_get_size(path.clone())?; + let size = ftp::ftp_get_size(path.clone()).unwrap(); let mut buff = Cursor::new(vec![]); let mut total = 0; - ftp::ftp_retr(path, &mut buff, |data| { - total += data; - println!("Downloading Prism: {}MB / {}MB", total/(1024*1024), size/(1024*1024)); - }).unwrap(); - std::fs::create_dir_all(get_local_data_directory().join("prism"))?; - buff.rewind()?; + ftp::ftp_retr(Some(window.clone()), path, &mut buff, |window: Option, data, size| util::download_callback("Prism Launcher".to_string(),window, data, size)).unwrap(); + std::fs::create_dir_all(get_local_data_directory().join("prism")).unwrap(); + buff.rewind().unwrap(); if env::consts::OS != "windows" { let tar = GzDecoder::new(buff); let mut archive = Archive::new(tar); @@ -39,7 +37,7 @@ pub fn install_prism() -> Result<(), Box>{ } let mut buff = Cursor::new(vec![]); - ftp::ftp_retr(PathBuf::new().join("prism").join("prismlauncher.cfg"), &mut buff, |_| return).unwrap(); + ftp::ftp_retr(Some(window.clone()), PathBuf::new().join("prism").join("prismlauncher.cfg"), &mut buff, |_, _, _| return).unwrap(); buff.rewind(); let mut file = File::create(get_local_data_directory().join("prism").join("prismlauncher.cfg")).unwrap(); loop { @@ -57,7 +55,6 @@ pub fn install_prism() -> Result<(), Box>{ } - Ok(()) } diff --git a/FCLauncher/src-tauri/src/util.rs b/FCLauncher/src-tauri/src/util.rs index 3195d68..41fdde7 100644 --- a/FCLauncher/src-tauri/src/util.rs +++ b/FCLauncher/src-tauri/src/util.rs @@ -1,6 +1,30 @@ +use std::clone; -pub fn download_callback(count: usize, total: &mut usize, size: usize){ - *total += count; - println!("Downloading {}MB / {}MB", *total/(1024*1024), size/(1024*1024)); +use serde::Serialize; + + +#[derive(Clone, Serialize)] +pub struct DownloadStatus { + downloaded: usize, + total: usize, + time_elapsed: usize, + download_name: String +} + +pub fn download_callback(download_name: String, window: Option, count: usize, size: usize){ + unsafe{ + static mut total: usize = 0; + total += count; + if let Some(window1) = window.clone() { + window1.emit("download_progress", DownloadStatus{downloaded: total, total: size, time_elapsed: 0, download_name: download_name}); + } + println!("Downloading {}MB / {}MB", total/(1024*1024), size/(1024*1024)); + if count == 0 { + if let Some(window2) = window { + window2.emit("download_finished", true); + } + total = 0; + } + } } diff --git a/FCLauncher/src/index.html b/FCLauncher/src/index.html index 9194cf8..85e97a6 100644 --- a/FCLauncher/src/index.html +++ b/FCLauncher/src/index.html @@ -12,7 +12,7 @@ - +