1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
use crate::constants::NS_LAUNCHER_COMMITS_API_URL;
use crate::github::{
pull_requests::{check_github_api, download_zip_into_memory, get_launcher_download_link},
CommitInfo,
};
#[tauri::command]
pub async fn install_git_main(game_install_path: &str) -> Result<String, String> {
// Get list of commits
let commits: Vec<CommitInfo> = serde_json::from_value(
check_github_api(NS_LAUNCHER_COMMITS_API_URL)
.await
.expect("Failed request"),
)
.unwrap();
// Get latest commit...
let latest_commit_sha = commits[0].sha.clone();
// ...and according artifact download URL
let download_url = get_launcher_download_link(latest_commit_sha.clone()).await?;
let archive = match download_zip_into_memory(download_url).await {
Ok(archive) => archive,
Err(err) => return Err(err.to_string()),
};
let extract_directory = format!(
"{}/___flightcore-temp/download-dir/launcher-pr-{}",
game_install_path, latest_commit_sha
);
match std::fs::create_dir_all(extract_directory.clone()) {
Ok(_) => (),
Err(err) => {
return Err(format!(
"Failed creating temporary download directory: {}",
err
))
}
};
let target_dir = std::path::PathBuf::from(extract_directory.clone()); // Doesn't need to exist
match zip_extract::extract(std::io::Cursor::new(archive), &target_dir, true) {
Ok(()) => (),
Err(err) => {
return Err(format!("Failed unzip: {}", err));
}
};
// Copy only necessary files from temp dir
// Copy:
// - NorthstarLauncher.exe
// - Northstar.dll
let files_to_copy = vec!["NorthstarLauncher.exe", "Northstar.dll"];
for file_name in files_to_copy {
let source_file_path = format!("{}/{}", extract_directory, file_name);
let destination_file_path = format!("{}/{}", game_install_path, file_name);
match std::fs::copy(source_file_path, destination_file_path) {
Ok(_result) => (),
Err(err) => {
return Err(format!(
"Failed to copy necessary file {} from temp dir: {}",
file_name, err
))
}
};
}
// delete extract directory
match std::fs::remove_dir_all(&extract_directory) {
Ok(()) => (),
Err(err) => {
return Err(format!(
"Failed to delete temporary download directory: {}",
err
))
}
}
log::info!(
"All done with installing launcher from {}",
latest_commit_sha
);
Ok(latest_commit_sha)
}
|