Compare commits
7 Commits
v0.4.1-pre
...
v0.4.2
Author | SHA1 | Date | |
---|---|---|---|
7ca7615222 | |||
2195f42abc | |||
f7635d4089 | |||
9598ec3dfe | |||
37266207e7 | |||
e041df80c5 | |||
b157bcb2c2 |
5
.github/workflows/release.yml
vendored
5
.github/workflows/release.yml
vendored
@ -11,8 +11,9 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: taiki-e/create-gh-release-action@v1
|
- uses: taiki-e/create-gh-release-action@v1
|
||||||
env:
|
with:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
draft: true
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
upload-assets:
|
upload-assets:
|
||||||
strategy:
|
strategy:
|
||||||
|
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -13,7 +13,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "alterware-launcher"
|
name = "alterware-launcher"
|
||||||
version = "0.4.0"
|
version = "0.4.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"http_req",
|
"http_req",
|
||||||
"mslnk",
|
"mslnk",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "alterware-launcher"
|
name = "alterware-launcher"
|
||||||
version = "0.4.0"
|
version = "0.4.2"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
build = "res/build.rs"
|
build = "res/build.rs"
|
||||||
|
|
||||||
|
@ -9,3 +9,6 @@
|
|||||||
- Passing ```iw4-sp```, ```iw5-mod```, ```iw6-mod``` or ```s1-mod``` as the first argument will skip automatic game detection
|
- Passing ```iw4-sp```, ```iw5-mod```, ```iw6-mod``` or ```s1-mod``` as the first argument will skip automatic game detection
|
||||||
- Passing ```update``` will stop the launcher from launching the game
|
- Passing ```update``` will stop the launcher from launching the game
|
||||||
- ```skip-launcher-update``` skips self-update
|
- ```skip-launcher-update``` skips self-update
|
||||||
|
|
||||||
|
### Note for server owners:
|
||||||
|
When the launcher updates itself it needs to be restarted. It will return exit code 101 in this case.
|
61
src/main.rs
61
src/main.rs
@ -2,7 +2,6 @@ mod http;
|
|||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
use mslnk::ShellLink;
|
use mslnk::ShellLink;
|
||||||
use semver::Version;
|
use semver::Version;
|
||||||
use std::time::{SystemTime, UNIX_EPOCH};
|
|
||||||
use std::{fs, path::PathBuf};
|
use std::{fs, path::PathBuf};
|
||||||
#[cfg(not(windows))]
|
#[cfg(not(windows))]
|
||||||
use std::{thread, time};
|
use std::{thread, time};
|
||||||
@ -27,13 +26,6 @@ struct Game<'a> {
|
|||||||
const MASTER: &str = "https://master.alterware.dev";
|
const MASTER: &str = "https://master.alterware.dev";
|
||||||
const REPO: &str = "mxve/alterware-launcher";
|
const REPO: &str = "mxve/alterware-launcher";
|
||||||
|
|
||||||
fn get_cache_buster() -> u64 {
|
|
||||||
match SystemTime::now().duration_since(UNIX_EPOCH) {
|
|
||||||
Ok(n) => n.as_secs(),
|
|
||||||
Err(_) => 1,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_file_sha1(path: &PathBuf) -> String {
|
fn get_file_sha1(path: &PathBuf) -> String {
|
||||||
let mut sha1 = sha1_smol::Sha1::new();
|
let mut sha1 = sha1_smol::Sha1::new();
|
||||||
sha1.update(&fs::read(path).unwrap());
|
sha1.update(&fs::read(path).unwrap());
|
||||||
@ -61,7 +53,7 @@ fn self_update_available() -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(windows))]
|
#[cfg(not(windows))]
|
||||||
fn self_update() {
|
fn self_update(_update_only: bool) {
|
||||||
if self_update_available() {
|
if self_update_available() {
|
||||||
println!("A new version of the AlterWare launcher is available.");
|
println!("A new version of the AlterWare launcher is available.");
|
||||||
println!("Download it at https://github.com/{}/releases/latest", REPO);
|
println!("Download it at https://github.com/{}/releases/latest", REPO);
|
||||||
@ -71,7 +63,7 @@ fn self_update() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
fn self_update() {
|
fn self_update(update_only: bool) {
|
||||||
let working_dir = std::env::current_dir().unwrap();
|
let working_dir = std::env::current_dir().unwrap();
|
||||||
let files = fs::read_dir(&working_dir).unwrap();
|
let files = fs::read_dir(&working_dir).unwrap();
|
||||||
|
|
||||||
@ -114,8 +106,10 @@ fn self_update() {
|
|||||||
self_replace::self_replace("alterware-launcher-update.exe").unwrap();
|
self_replace::self_replace("alterware-launcher-update.exe").unwrap();
|
||||||
fs::remove_file(&file_path).unwrap();
|
fs::remove_file(&file_path).unwrap();
|
||||||
println!("Launcher updated. Please run it again.");
|
println!("Launcher updated. Please run it again.");
|
||||||
std::io::stdin().read_line(&mut String::new()).unwrap();
|
if !update_only {
|
||||||
std::process::exit(0);
|
std::io::stdin().read_line(&mut String::new()).unwrap();
|
||||||
|
}
|
||||||
|
std::process::exit(101);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,8 +170,12 @@ fn windows_launcher_install(games: &Vec<Game>) {
|
|||||||
let game = games.iter().find(|&g| g.app_id == input).unwrap();
|
let game = games.iter().find(|&g| g.app_id == input).unwrap();
|
||||||
|
|
||||||
let launcher_path = std::env::current_exe().unwrap();
|
let launcher_path = std::env::current_exe().unwrap();
|
||||||
fs::copy(launcher_path, path.join("alterware-launcher.exe")).unwrap();
|
let target_path = path.join("alterware-launcher.exe");
|
||||||
println!("Launcher copied to {}", path.display());
|
|
||||||
|
if launcher_path != target_path {
|
||||||
|
fs::copy(launcher_path, target_path).unwrap();
|
||||||
|
println!("Launcher copied to {}", path.display());
|
||||||
|
}
|
||||||
setup_client_links(game, path);
|
setup_client_links(game, path);
|
||||||
|
|
||||||
println!("Create Desktop shortcut? (Y/n)");
|
println!("Create Desktop shortcut? (Y/n)");
|
||||||
@ -218,7 +216,7 @@ fn windows_launcher_install(games: &Vec<Game>) {
|
|||||||
|
|
||||||
fn update(game: &Game) {
|
fn update(game: &Game) {
|
||||||
let cdn_info: Vec<CdnFile> = serde_json::from_str(&http::get_body_string(
|
let cdn_info: Vec<CdnFile> = serde_json::from_str(&http::get_body_string(
|
||||||
format!("{}/files.json?{}", MASTER, get_cache_buster()).as_str(),
|
format!("{}/files.json", MASTER).as_str(),
|
||||||
))
|
))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
@ -238,10 +236,7 @@ fn update(game: &Game) {
|
|||||||
sha1_local,
|
sha1_local,
|
||||||
sha1_remote
|
sha1_remote
|
||||||
);
|
);
|
||||||
http::download_file(
|
http::download_file(&format!("{}/{}", MASTER, file.name), &file_path);
|
||||||
&format!("{}/{}?{}", MASTER, file.name, get_cache_buster()),
|
|
||||||
&file_path,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
println!("Downloading {}...", file_path.display());
|
println!("Downloading {}...", file_path.display());
|
||||||
@ -250,10 +245,7 @@ fn update(game: &Game) {
|
|||||||
fs::create_dir_all(parent).unwrap();
|
fs::create_dir_all(parent).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
http::download_file(
|
http::download_file(&format!("{}/{}", MASTER, file.name), &file_path);
|
||||||
&format!("{}/{}?{}", MASTER, file.name, get_cache_buster()),
|
|
||||||
&file_path,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -270,18 +262,6 @@ fn launch(file_path: &PathBuf) {
|
|||||||
fn main() {
|
fn main() {
|
||||||
let mut args: Vec<String> = std::env::args().collect();
|
let mut args: Vec<String> = std::env::args().collect();
|
||||||
|
|
||||||
if !args.contains(&String::from("skip-launcher-update")) {
|
|
||||||
self_update();
|
|
||||||
} else {
|
|
||||||
args.iter()
|
|
||||||
.position(|r| r == "skip-launcher-update")
|
|
||||||
.map(|e| args.remove(e));
|
|
||||||
}
|
|
||||||
|
|
||||||
let games_json =
|
|
||||||
http::get_body_string(format!("{}/games.json?{}", MASTER, get_cache_buster()).as_str());
|
|
||||||
let games: Vec<Game> = serde_json::from_str(&games_json).unwrap();
|
|
||||||
|
|
||||||
let mut update_only = false;
|
let mut update_only = false;
|
||||||
if args.contains(&String::from("update")) {
|
if args.contains(&String::from("update")) {
|
||||||
update_only = true;
|
update_only = true;
|
||||||
@ -290,6 +270,17 @@ fn main() {
|
|||||||
.map(|e| args.remove(e));
|
.map(|e| args.remove(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !args.contains(&String::from("skip-launcher-update")) {
|
||||||
|
self_update(update_only);
|
||||||
|
} else {
|
||||||
|
args.iter()
|
||||||
|
.position(|r| r == "skip-launcher-update")
|
||||||
|
.map(|e| args.remove(e));
|
||||||
|
}
|
||||||
|
|
||||||
|
let games_json = http::get_body_string(format!("{}/games.json", MASTER).as_str());
|
||||||
|
let games: Vec<Game> = serde_json::from_str(&games_json).unwrap();
|
||||||
|
|
||||||
let mut game: String = String::new();
|
let mut game: String = String::new();
|
||||||
if args.len() > 1 {
|
if args.len() > 1 {
|
||||||
game = String::from(&args[1]);
|
game = String::from(&args[1]);
|
||||||
|
Reference in New Issue
Block a user