270 Commits

Author SHA1 Message Date
bb66366f41 write games.json content to file on error 2024-02-20 19:54:16 +01:00
bd26533ae2 add debug print to get_body 2024-02-20 19:44:11 +01:00
1452dfb265 v0.6.8 2024-02-20 02:00:20 +01:00
55328a969b remove unused imports 2024-02-20 01:56:23 +01:00
512a073b07 remove debug print 2024-02-20 01:47:35 +01:00
99010664bf fix unix self_update::run 2024-02-20 01:37:46 +01:00
c93fcba652 Merge pull request #78 from mxve/dependabot/cargo/semver-1.0.22
Bump semver from 1.0.21 to 1.0.22
2024-02-20 01:33:09 +01:00
5450109cf2 remove http_req from deps 2024-02-20 01:28:49 +01:00
02c3004231 fully replace http_req with reqwest
close #43
Should also help to either resolve or at least investigate seemingly random TLS & IO errors #64 #77
2024-02-20 01:28:31 +01:00
6bb96006de Bump semver from 1.0.21 to 1.0.22
Bumps [semver](https://github.com/dtolnay/semver) from 1.0.21 to 1.0.22.
- [Release notes](https://github.com/dtolnay/semver/releases)
- [Commits](https://github.com/dtolnay/semver/compare/1.0.21...1.0.22)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-19 15:21:09 +00:00
9de8543590 Merge branch 'main' of github.com:mxve/alterware-launcher 2024-02-15 01:05:46 +01:00
dba849e3be add --ignore-required-files to --help 2024-02-15 01:05:42 +01:00
399d7da9aa Merge pull request #76 from mxve/dependabot/cargo/indicatif-0.17.8
Bump indicatif from 0.17.7 to 0.17.8
2024-02-12 17:17:21 +01:00
2454547c8f Bump indicatif from 0.17.7 to 0.17.8
Bumps [indicatif](https://github.com/console-rs/indicatif) from 0.17.7 to 0.17.8.
- [Release notes](https://github.com/console-rs/indicatif/releases)
- [Commits](https://github.com/console-rs/indicatif/commits)

---
updated-dependencies:
- dependency-name: indicatif
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-12 15:22:11 +00:00
3d0a47ec60 prepare v0.6.7 2024-02-09 19:13:11 +01:00
5ef075d4c3 add --ignore-required-files 2024-02-09 18:45:19 +01:00
e8aee89f45 check for required files 2024-02-07 12:53:43 +01:00
2760e2ab1e keep console open & exit process when game not found 2024-02-07 12:29:58 +01:00
d44ae36f86 whoopsie 2024-02-07 12:23:31 +01:00
6e3c06af86 remove unused src files 2024-02-07 12:06:11 +01:00
fcdc875272 add use_https
close #70
2024-02-07 12:05:57 +01:00
32d1b129c8 only download iw4x-sp if selected
close #63
2024-02-07 11:52:21 +01:00
1dd18317cf require references
close #67
2024-02-07 11:37:34 +01:00
ccdde3d99f Merge pull request #73 from mxve/dependabot/cargo/serde-1.0.196
Bump serde from 1.0.195 to 1.0.196
2024-02-07 11:29:14 +01:00
d5973b0aff Bump serde from 1.0.195 to 1.0.196
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.195 to 1.0.196.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.195...v1.0.196)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-07 10:15:01 +00:00
652b908a39 Merge pull request #75 from mxve/dependabot/cargo/tokio-1.36.0
Bump tokio from 1.35.1 to 1.36.0
2024-02-07 11:14:44 +01:00
f387a34b35 Merge pull request #74 from mxve/dependabot/cargo/reqwest-0.11.24
Bump reqwest from 0.11.23 to 0.11.24
2024-02-07 11:14:35 +01:00
ea69e6d964 Merge pull request #72 from mxve/dependabot/cargo/serde_json-1.0.113
Bump serde_json from 1.0.111 to 1.0.113
2024-02-07 11:14:24 +01:00
9cbfed8bf3 Bump tokio from 1.35.1 to 1.36.0
Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.35.1 to 1.36.0.
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.35.1...tokio-1.36.0)

---
updated-dependencies:
- dependency-name: tokio
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-05 15:46:38 +00:00
9f789ba556 Bump reqwest from 0.11.23 to 0.11.24
Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.11.23 to 0.11.24.
- [Release notes](https://github.com/seanmonstar/reqwest/releases)
- [Changelog](https://github.com/seanmonstar/reqwest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/seanmonstar/reqwest/compare/v0.11.23...v0.11.24)

---
updated-dependencies:
- dependency-name: reqwest
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-05 15:46:31 +00:00
7fc39f24bc Bump serde_json from 1.0.111 to 1.0.113
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.111 to 1.0.113.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.111...v1.0.113)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-29 15:13:01 +00:00
Edo
1dd2e898d9 Merge pull request #71 from mxve/dependabot/cargo/openssl-0.10.63
Bump openssl from 0.10.62 to 0.10.63
2024-01-27 10:12:30 +01:00
006ca15232 Bump openssl from 0.10.62 to 0.10.63
Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.62 to 0.10.63.
- [Release notes](https://github.com/sfackler/rust-openssl/releases)
- [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.62...openssl-v0.10.63)

---
updated-dependencies:
- dependency-name: openssl
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-22 15:46:30 +00:00
Edo
1730bf40be Merge pull request #69 from mxve/dependabot/cargo/serde_json-1.0.111
Bump serde_json from 1.0.109 to 1.0.111
2024-01-21 10:29:41 +01:00
f40448b6fc Bump serde_json from 1.0.109 to 1.0.111
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.109 to 1.0.111.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.109...v1.0.111)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-15 15:37:54 +00:00
Edo
b418732ddf Merge pull request #65 from mxve/dependabot/cargo/serde-1.0.195
Bump serde from 1.0.193 to 1.0.195
2024-01-10 22:22:07 +01:00
Edo
bef7a88db0 Merge pull request #66 from mxve/dependabot/cargo/semver-1.0.21
Bump semver from 1.0.20 to 1.0.21
2024-01-10 22:22:00 +01:00
9f95397bd2 Bump semver from 1.0.20 to 1.0.21
Bumps [semver](https://github.com/dtolnay/semver) from 1.0.20 to 1.0.21.
- [Release notes](https://github.com/dtolnay/semver/releases)
- [Commits](https://github.com/dtolnay/semver/compare/1.0.20...1.0.21)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-08 15:51:12 +00:00
c2ec4f6a45 Bump serde from 1.0.193 to 1.0.195
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.193 to 1.0.195.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.193...v1.0.195)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-08 15:50:50 +00:00
cab26cfa16 v0.6.6 2024-01-04 18:55:05 +01:00
1147e0673b use new cdn 2024-01-04 18:53:44 +01:00
Edo
4fec555c1f Merge pull request #62 from mxve/dependabot/cargo/serde_json-1.0.109
Bump serde_json from 1.0.107 to 1.0.109
2024-01-04 13:18:43 +01:00
48fe7a4780 set fix steamlocate version until stable release 2024-01-02 11:52:42 +01:00
0e8b9285c9 fix steamlocate beta.2 2024-01-02 11:44:34 +01:00
725ec09e5e v0.6.5 2024-01-02 11:22:33 +01:00
caaf73e9f3 add support for Game.delete 2024-01-02 11:22:18 +01:00
458cd6d8bc Bump serde_json from 1.0.107 to 1.0.109
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.107 to 1.0.109.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.107...v1.0.109)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-01 15:14:18 +00:00
2261a9a655 Merge pull request #57 from mxve/dependabot/cargo/openssl-0.10.62
Bump openssl from 0.10.61 to 0.10.62
2023-12-27 22:14:13 +01:00
25a781df8e Merge pull request #59 from mxve/dependabot/cargo/futures-util-0.3.30
Bump futures-util from 0.3.29 to 0.3.30
2023-12-27 21:58:03 +01:00
637fa0a504 Bump openssl from 0.10.61 to 0.10.62
Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.61 to 0.10.62.
- [Release notes](https://github.com/sfackler/rust-openssl/releases)
- [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.61...openssl-v0.10.62)

---
updated-dependencies:
- dependency-name: openssl
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-27 20:56:47 +00:00
23df31735d Merge pull request #58 from mxve/dependabot/cargo/steamlocate-2.0.0-beta.2
Bump steamlocate from 2.0.0-alpha.0 to 2.0.0-beta.2
2023-12-27 21:55:58 +01:00
6ae5ff66f0 Bump futures-util from 0.3.29 to 0.3.30
Bumps [futures-util](https://github.com/rust-lang/futures-rs) from 0.3.29 to 0.3.30.
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/futures-rs/compare/0.3.29...0.3.30)

---
updated-dependencies:
- dependency-name: futures-util
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-27 20:55:08 +00:00
11f49cca32 Merge pull request #60 from mxve/dependabot/cargo/reqwest-0.11.23
Bump reqwest from 0.11.22 to 0.11.23
2023-12-27 21:54:40 +01:00
ad024ab997 Merge pull request #61 from mxve/dependabot/cargo/tokio-1.35.1
Bump tokio from 1.35.0 to 1.35.1
2023-12-27 21:54:30 +01:00
2db8e83502 Bump tokio from 1.35.0 to 1.35.1
Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.35.0 to 1.35.1.
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.35.0...tokio-1.35.1)

---
updated-dependencies:
- dependency-name: tokio
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-25 15:46:03 +00:00
8f674ef4e5 Bump reqwest from 0.11.22 to 0.11.23
Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.11.22 to 0.11.23.
- [Release notes](https://github.com/seanmonstar/reqwest/releases)
- [Changelog](https://github.com/seanmonstar/reqwest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/seanmonstar/reqwest/compare/v0.11.22...v0.11.23)

---
updated-dependencies:
- dependency-name: reqwest
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-25 15:45:55 +00:00
19484c8b79 Bump steamlocate from 2.0.0-alpha.0 to 2.0.0-beta.2
Bumps [steamlocate](https://github.com/WilliamVenner/steamlocate-rs) from 2.0.0-alpha.0 to 2.0.0-beta.2.
- [Commits](https://github.com/WilliamVenner/steamlocate-rs/commits)

---
updated-dependencies:
- dependency-name: steamlocate
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-25 15:45:41 +00:00
92c46a9d87 update readme 2023-12-22 21:29:04 +01:00
e4de326b41 v0.6.4 2023-12-18 16:51:20 +01:00
0728561eca remove iw4 files not present on remote 2023-12-18 16:49:57 +01:00
Edo
7178f2ed22 Merge pull request #51 from mxve/dependabot/cargo/tokio-1.35.0
Bump tokio from 1.34.0 to 1.35.0
2023-12-12 18:59:48 +01:00
Edo
ad4b5ca8aa Merge pull request #52 from mxve/dependabot/cargo/colored-2.1.0
Bump colored from 2.0.4 to 2.1.0
2023-12-12 18:59:33 +01:00
Edo
9945fd1b1f Merge pull request #53 from mxve/dependabot/cargo/openssl-0.10.61
Bump openssl from 0.10.60 to 0.10.61
2023-12-12 18:59:13 +01:00
3f8cadea8e Bump openssl from 0.10.60 to 0.10.61
Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.60 to 0.10.61.
- [Release notes](https://github.com/sfackler/rust-openssl/releases)
- [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.60...openssl-v0.10.61)

---
updated-dependencies:
- dependency-name: openssl
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-11 15:47:00 +00:00
08b04425a5 Bump colored from 2.0.4 to 2.1.0
Bumps [colored](https://github.com/mackwic/colored) from 2.0.4 to 2.1.0.
- [Release notes](https://github.com/mackwic/colored/releases)
- [Changelog](https://github.com/colored-rs/colored/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mackwic/colored/compare/v2.0.4...v2.1.0)

---
updated-dependencies:
- dependency-name: colored
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-11 15:46:49 +00:00
55fd51a1cc Bump tokio from 1.34.0 to 1.35.0
Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.34.0 to 1.35.0.
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.34.0...tokio-1.35.0)

---
updated-dependencies:
- dependency-name: tokio
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-11 15:46:41 +00:00
Edo
22bac811fc Merge pull request #50 from mxve/dependabot/cargo/http_req-0.10.2
Bump http_req from 0.10.1 to 0.10.2
2023-12-05 11:33:54 +01:00
bb7786cb0a Bump http_req from 0.10.1 to 0.10.2
Bumps [http_req](https://github.com/jayjamesjay/http_req) from 0.10.1 to 0.10.2.
- [Release notes](https://github.com/jayjamesjay/http_req/releases)
- [Commits](https://github.com/jayjamesjay/http_req/compare/v0.10.1...v0.10.2)

---
updated-dependencies:
- dependency-name: http_req
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-04 15:06:18 +00:00
e3775ef3dc Merge pull request #49 from mxve/dependabot/cargo/openssl-0.10.60
Bump openssl from 0.10.58 to 0.10.60
2023-11-27 19:03:41 +01:00
62e3569195 Bump openssl from 0.10.58 to 0.10.60
Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.58 to 0.10.60.
- [Release notes](https://github.com/sfackler/rust-openssl/releases)
- [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.58...openssl-v0.10.60)

---
updated-dependencies:
- dependency-name: openssl
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-27 17:59:24 +00:00
e48090a00c Merge pull request #48 from mxve/dependabot/cargo/serde-1.0.193
Bump serde from 1.0.190 to 1.0.193
2023-11-27 18:57:47 +01:00
168e8bc110 Merge pull request #45 from mxve/dependabot/cargo/tokio-1.34.0
Bump tokio from 1.33.0 to 1.34.0
2023-11-27 18:57:27 +01:00
8782642e4e Bump serde from 1.0.190 to 1.0.193
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.190 to 1.0.193.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.190...v1.0.193)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-27 15:13:31 +00:00
Edo
646c10d95a maint(cargo): undo addition of "symbols" option since it does nothing 2023-11-27 00:10:45 +01:00
25c3d25b10 Bump tokio from 1.33.0 to 1.34.0
Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.33.0 to 1.34.0.
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.33.0...tokio-1.34.0)

---
updated-dependencies:
- dependency-name: tokio
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-24 14:13:08 +00:00
570150777d v0.6.3 2023-11-24 14:54:26 +01:00
0652f77355 fix: attempt fix on Linux by "vendoring" OpenSSL 2023-11-24 14:44:40 +01:00
6494af20de Merge branch 'main' of github.com:mxve/alterware-launcher 2023-11-13 15:26:32 +01:00
35a1d1866f iw4 default arg -stdout; add cfg.engine 2023-11-13 15:26:28 +01:00
3bbfc9bb81 remove rustls dep
reduces binary size by using os ssl/openssl for http_req and reqwest until #43 gets done
2023-11-10 00:04:00 +01:00
3f6de0350b set useragent header 2023-11-07 17:14:40 +01:00
73c45de4be Merge pull request #42 from mxve/selfrestart
Selfrestart
2023-11-07 00:20:32 +01:00
9fe9f58e70 fix linux 2023-11-06 22:33:58 +01:00
09cec3f1ad v0.6.2 2023-11-06 22:27:53 +01:00
1e62b5ffad cleanup 2023-11-06 22:27:09 +01:00
f582cdd625 self restart 2023-11-06 03:20:46 +01:00
8cc1047367 don't panic if cleaning up left over files fails 2023-11-06 02:08:29 +01:00
0c004b6f0f v0.6.1 2023-11-06 01:56:49 +01:00
f0a63a241a fix existing file hashes always being calculated 2023-11-06 01:56:26 +01:00
76896a22f9 v0.6.0 2023-11-05 17:20:59 +01:00
7c37334199 improve setup_env on Windows
(real)
935a72e05be1a213a12238f522c8b35f872ecf63
2023-11-04 11:48:04 +01:00
897c5dae4b lint 2023-11-04 11:35:19 +01:00
fdcf3d31bd import std::env 2023-11-04 07:48:40 +01:00
935a72e05b maint(win): improve setup_env on Windows 2023-11-04 07:27:58 +01:00
174333ff93 Merge pull request #40 from mxve/async
Async
2023-11-02 16:05:10 +01:00
17454d4dc8 update iw4x first
so we don't have to pass the progressbar to iw4x just to not have it break by a little println
2023-11-02 11:44:08 +01:00
9a6b7b531a only show filename in pb 2023-11-02 11:31:50 +01:00
806118862f use String::default() for empty strings
as suggested by diamante quality control ™️
2023-11-02 11:27:43 +01:00
9a9e64fb0e remove linux i686 2023-11-02 11:05:28 +01:00
8c407de8fb consume 2023-11-02 10:43:36 +01:00
7f6027fe2e Merge branch 'main' of github.com:mxve/alterware-launcher 2023-11-02 10:40:45 +01:00
dacaf322d4 stream files to disk
- Greatly reduced memory usage while downloading
- Added progressbar, download rate
- Added async runtime
- Tweaks to allow usage of async download function
2023-11-02 10:39:58 +01:00
78fa91ded4 Merge pull request #38 from mxve/dependabot/cargo/serde-1.0.190
Bump serde from 1.0.189 to 1.0.190
2023-10-30 22:00:19 +01:00
aa69a26f1f Merge pull request #39 from mxve/dependabot/cargo/http_req-0.10.1
Bump http_req from 0.10.0 to 0.10.1
2023-10-30 22:00:07 +01:00
f2f388e0bb Bump http_req from 0.10.0 to 0.10.1
Bumps [http_req](https://github.com/jayjamesjay/http_req) from 0.10.0 to 0.10.1.
- [Release notes](https://github.com/jayjamesjay/http_req/releases)
- [Commits](https://github.com/jayjamesjay/http_req/compare/v0.10.0...v0.10.1)

---
updated-dependencies:
- dependency-name: http_req
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 15:31:10 +00:00
9cf7049aaa Bump serde from 1.0.189 to 1.0.190
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.189 to 1.0.190.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.189...v1.0.190)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 15:30:54 +00:00
f609a53377 dc 2023-10-28 20:14:39 +02:00
24a745abff typo 2023-10-28 19:49:21 +02:00
58b57f48ad clippy 2023-10-28 19:38:53 +02:00
9c26679a5a print download size 2023-10-28 19:35:28 +02:00
ca836bbda6 add av info on permission denied 2023-10-26 06:25:12 +02:00
360d2376e1 Merge pull request #36 from mxve/dependabot/cargo/serde-1.0.189
Bump serde from 1.0.188 to 1.0.189
2023-10-16 17:46:15 +02:00
0b60b2a893 Merge pull request #37 from mxve/dependabot/cargo/semver-1.0.20
Bump semver from 1.0.19 to 1.0.20
2023-10-16 17:46:08 +02:00
cddc697e89 Bump semver from 1.0.19 to 1.0.20
Bumps [semver](https://github.com/dtolnay/semver) from 1.0.19 to 1.0.20.
- [Release notes](https://github.com/dtolnay/semver/releases)
- [Commits](https://github.com/dtolnay/semver/compare/1.0.19...1.0.20)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-16 15:07:26 +00:00
ec1b580b21 Bump serde from 1.0.188 to 1.0.189
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.188 to 1.0.189.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.188...v1.0.189)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-16 15:07:20 +00:00
eeacb15d6f update actions 2023-10-16 16:11:56 +02:00
4273d00417 Merge pull request #35 from mxve/dependabot/cargo/http_req-0.10.0
Bump http_req from 0.9.3 to 0.10.0
2023-10-09 18:29:43 +02:00
9596c5d491 Bump http_req from 0.9.3 to 0.10.0
Bumps [http_req](https://github.com/jayjamesjay/http_req) from 0.9.3 to 0.10.0.
- [Release notes](https://github.com/jayjamesjay/http_req/releases)
- [Commits](https://github.com/jayjamesjay/http_req/compare/v0.9.3...v0.10.0)

---
updated-dependencies:
- dependency-name: http_req
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 15:58:32 +00:00
123a8b7caf add client-args.md; document config file 2023-10-07 13:24:26 +02:00
141b60393a v0.5.3 2023-10-06 09:03:34 +02:00
4bdecabbe5 misc 2023-10-06 08:34:42 +02:00
6a8c11b101 add changelog link 2023-10-06 08:30:29 +02:00
12526d7f36 handle notfound; give tips to fix permission denied 2023-10-02 15:49:01 +02:00
f3e7a42043 Create config path if it doesn't exist; don't panic 2023-10-02 15:48:22 +02:00
fddd146361 improve logging of http errors 2023-10-02 04:39:49 +02:00
b86d252c4b handle shortcut creation errors 2023-10-01 00:36:12 +02:00
dee9011812 set matrix target 2023-09-25 18:57:51 +02:00
96bc7a73e5 v0.5.2 2023-09-25 18:52:35 +02:00
f756e818b6 Merge branch 'main' of github.com:mxve/alterware-launcher 2023-09-25 18:51:54 +02:00
686a6e6352 build i686 target 2023-09-25 18:51:43 +02:00
a56b7f12ee Merge pull request #34 from mxve/dependabot/cargo/semver-1.0.19
Bump semver from 1.0.18 to 1.0.19
2023-09-25 17:51:50 +02:00
e6cc1a9e34 self-replace 1.3.7 2023-09-25 17:51:21 +02:00
3e5c0cc4ed Bump semver from 1.0.18 to 1.0.19
Bumps [semver](https://github.com/dtolnay/semver) from 1.0.18 to 1.0.19.
- [Release notes](https://github.com/dtolnay/semver/releases)
- [Commits](https://github.com/dtolnay/semver/compare/1.0.18...1.0.19)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-25 15:28:54 +00:00
5fa3332266 don't ask if --bonus set 2023-09-23 01:29:04 +02:00
66b7187c0e Merge pull request #31 from mxve/dependabot/cargo/http_req-0.9.3
Bump http_req from 0.9.2 to 0.9.3
2023-09-18 20:12:38 +02:00
eb8ada5040 Merge pull request #32 from mxve/dependabot/cargo/serde_json-1.0.107
Bump serde_json from 1.0.106 to 1.0.107
2023-09-18 20:12:30 +02:00
e34939f303 Bump serde_json from 1.0.106 to 1.0.107
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.106 to 1.0.107.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.106...v1.0.107)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 15:05:36 +00:00
1e7f2f6514 Bump http_req from 0.9.2 to 0.9.3
Bumps [http_req](https://github.com/jayjamesjay/http_req) from 0.9.2 to 0.9.3.
- [Release notes](https://github.com/jayjamesjay/http_req/releases)
- [Commits](https://github.com/jayjamesjay/http_req/compare/v0.9.2...v0.9.3)

---
updated-dependencies:
- dependency-name: http_req
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 15:05:29 +00:00
d50f3b83e9 pwettify comfig file :3 2023-09-18 16:29:37 +02:00
ce18aea5aa v0.5.1 2023-09-18 12:27:01 +02:00
93d1c9841a set current_dir when launching 2023-09-18 12:26:47 +02:00
d8beb754fa v0.5.0 2023-09-17 17:49:50 +02:00
af78ebfcaf print passed args when launching; trim args 2023-09-16 16:41:18 +02:00
Edo
79c48c240b Merge pull request #30 from diamante0018/main
maint(main): simply return out of the main function
2023-09-15 19:22:11 +02:00
Edo
fe6e3c227f maint(main): simply return out of the main function
instead of calling exit()
2023-09-15 19:19:04 +02:00
65f106541c update readme 2023-09-15 01:48:04 +02:00
428c75bbf2 add --help, --version/-v 2023-09-15 01:45:47 +02:00
d47ebbcb28 allow loading client args from config 2023-09-14 10:32:03 +02:00
a1004405ca 💩 2023-09-14 10:25:44 +02:00
3efecdad74 Merge pull request #29 from mxve/dependabot/cargo/serde_json-1.0.106
Bump serde_json from 1.0.105 to 1.0.106
2023-09-14 10:24:26 +02:00
be3c45b79d add --pass to allow passing args to the client 2023-09-14 10:23:48 +02:00
b830ab7085 remove debug print 2023-09-14 10:09:21 +02:00
be3e7c8ac1 strip value AND arg 😑 2023-09-14 10:08:26 +02:00
a5af98b0f3 add --path, -p 2023-09-14 09:44:35 +02:00
0b4c6325c7 prepend args with --, -, add short args 2023-09-14 09:37:35 +02:00
e1b76c8e04 update readme 2023-09-12 21:35:50 +02:00
26bb7567de store file hashes; added "force" arg
close #28
2023-09-12 21:28:53 +02:00
0814c99363 Bump serde_json from 1.0.105 to 1.0.106
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.105 to 1.0.106.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.105...v1.0.106)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-11 15:16:24 +00:00
f23acb6788 improve progress prints 2023-09-11 13:05:18 +02:00
813d0613c1 Show more progress 2023-09-10 20:00:04 +02:00
349efa4e43 download bonus content 2023-09-10 18:29:30 +02:00
86b0bb1b7a use config values 2023-09-10 17:36:01 +02:00
32b1272ff6 cfg 2023-09-10 16:58:42 +02:00
ab8461b6df v0.4.8 2023-09-10 12:39:44 +02:00
a7008ecbd5 check first dir when matching files to download 2023-09-10 12:38:21 +02:00
a76efc6e6f update readme 2023-09-03 19:03:46 +02:00
932c41d369 misc
- reduce github calls
- latest_tag returns full tag
- rev_to_int default to 0 on strip_prefix
- lint
2023-08-30 13:06:49 +02:00
0ec2a44082 github::latest -> latest_tag 2023-08-30 12:46:13 +02:00
94b6d26ddd steamlocate 2.0.0-alpha.0 2023-08-30 12:45:10 +02:00
7bc677cf81 v0.4.7 2023-08-29 22:13:05 +02:00
1f76f8529c update iw4x if dll doesn't exist 2023-08-29 22:12:42 +02:00
afda8902df whoops/v0.4.6 2023-08-29 22:00:31 +02:00
bb5b3f8bf9 v0.4.6 2023-08-29 21:57:35 +02:00
64c63bf24f obtain iw4x.dll from iw4x/iw4x-client 2023-08-29 21:53:47 +02:00
9dc569e646 update io::unzip 2023-08-29 06:59:04 +02:00
00c3740af0 Merge branch 'main' of github.com:mxve/alterware-launcher 2023-08-29 06:51:52 +02:00
42f48bbaf4 add io::unzip 2023-08-29 06:51:44 +02:00
63f160ff4a seperate into multiple source files 2023-08-29 06:51:40 +02:00
ff13d11934 Merge pull request #26 from mxve/dependabot/cargo/serde-1.0.188
Bump serde from 1.0.185 to 1.0.188
2023-08-28 22:38:55 +02:00
2cec22e170 Merge pull request #25 from mxve/dependabot/cargo/self-replace-1.3.6
Bump self-replace from 1.3.5 to 1.3.6
2023-08-28 22:38:47 +02:00
7a2c6c7e37 Bump serde from 1.0.185 to 1.0.188
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.185 to 1.0.188.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.185...v1.0.188)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-28 15:52:58 +00:00
416de17876 Bump self-replace from 1.3.5 to 1.3.6
Bumps [self-replace](https://github.com/mitsuhiko/self-replace) from 1.3.5 to 1.3.6.
- [Changelog](https://github.com/mitsuhiko/self-replace/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mitsuhiko/self-replace/compare/1.3.5...1.3.6)

---
updated-dependencies:
- dependency-name: self-replace
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-28 15:52:49 +00:00
ced346f776 v0.4.5 2023-08-26 21:17:01 +02:00
030c869fec linting 2023-08-26 20:59:38 +02:00
5ad73dcc1c feat: manual client selection
fix: crash if steam not installed/steamdir is none
2023-08-26 20:53:41 +02:00
32f9fc2afe restart required ex.code 101->201
rust panic returns 101, so this wasn't a good choice
2023-08-22 11:37:34 +02:00
d8609fd7b1 Merge pull request #23 from mxve/dependabot/cargo/serde-1.0.185
Bump serde from 1.0.183 to 1.0.185
2023-08-21 17:31:09 +02:00
7ea4db486b Bump serde from 1.0.183 to 1.0.185
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.183 to 1.0.185.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.183...v1.0.185)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-21 15:26:04 +00:00
31d9f5497e Merge pull request #24 from mxve/dependabot/cargo/serde_json-1.0.105
Bump serde_json from 1.0.104 to 1.0.105
2023-08-21 17:25:29 +02:00
917aa5cf6f Bump serde_json from 1.0.104 to 1.0.105
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.104 to 1.0.105.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.104...v1.0.105)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-21 15:10:09 +00:00
c7da419866 v0.4.4 2023-08-18 14:38:15 +02:00
86b969fa26 Don't ask what client to launch if update is set 2023-08-18 13:36:06 +02:00
618227a484 v0.4.3 2023-08-18 12:53:28 +02:00
5c3bd72482 update after windows setup; match cur dir to steam dirs 2023-08-18 12:51:51 +02:00
2ccb17a342 v0.4.2 2023-08-17 20:26:25 +02:00
f98e9ffed2 fix: unix.. again 2023-08-17 20:26:08 +02:00
58423863f5 return 101 when restart is required after self-update 2023-08-17 18:32:32 +02:00
f787feed05 v0.4.1 2023-08-16 13:01:32 +02:00
c8abf1567f create release as draft 2023-08-16 13:01:25 +02:00
5847b6a28a don't copy if current & target path are the same 2023-08-16 13:00:15 +02:00
0dda3d295f remove cache busting 2023-08-16 12:57:27 +02:00
ea209776b3 Merge pull request #21 from mxve/build/symbols
build: add symbols
2023-08-15 19:05:22 +02:00
Edo
e3d13df76a build: add symbols 2023-08-15 19:03:38 +02:00
4c4da71f6a v0.4.0 2023-08-15 13:02:32 +02:00
d11326ffde fix: remove windows target from get_input 2023-08-15 11:13:59 +02:00
ed82e072d0 fix: don't run setup_client_links on unix 2023-08-15 11:10:40 +02:00
39039c842f Merge branch 'main' of github.com:mxve/alterware-launcher 2023-08-15 09:45:21 +02:00
35ebdd4118 feat: support multiple clients per game
- Game.client changed from str to Vec<str>
- Create launch shortcuts for multi-client games
- Add prompt if multiple clients available and none specified
2023-08-15 09:45:18 +02:00
1efe17dc9e bruh 2023-08-12 15:35:41 +02:00
b8dd271aec Update readme 2023-08-12 15:30:28 +02:00
e90255539a v0.3.1 2023-08-12 15:27:39 +02:00
35da7817d1 feat(flag): skip-launcher-update 2023-08-12 15:26:35 +02:00
02f98c732c v0.3.0 2023-08-12 15:09:26 +02:00
7fd9381629 fix: don't even look at it 2023-08-12 14:33:25 +02:00
0a3edba1ba fix: unix build 2023-08-12 14:31:58 +02:00
9205c0b12b feat: self-update
closes #17

- launcher updates itself (only on windows target for now)
- added cache buster to games.json request
- rearranged some functions
- file description is now "AlterWare Launcher" as it shows up in the task manager
2023-08-12 14:08:59 +02:00
5da40e87a5 mark get_input as windows target 2023-08-12 06:41:08 +02:00
dc36f83a9f Merge branch 'main' of github.com:mxve/alterware-launcher 2023-08-12 06:30:08 +02:00
bef4c64c81 feat(win): setup for installed steam games
steamlocate requires steamy-vdf which requires a in the future unsupported version of nom (1.2.4). This should get fixed with a future release of steamlocate
https://github.com/WilliamVenner/steamlocate-rs/issues/19
2023-08-12 06:30:02 +02:00
ff43574c87 Merge pull request #18 from mxve/dependabot/cargo/serde-1.0.183
Bump serde from 1.0.179 to 1.0.183
2023-08-08 02:29:59 +02:00
e296609ff3 Bump serde from 1.0.179 to 1.0.183
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.179 to 1.0.183.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.179...v1.0.183)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-07 15:23:26 +00:00
bb1ab05588 check for launcher update 2023-08-03 02:49:55 +02:00
f5216d7e29 Merge pull request #14 from mxve/dependabot/cargo/serde_json-1.0.104
Bump serde_json from 1.0.103 to 1.0.104
2023-07-31 22:44:19 +02:00
a389b6d9fa Bump serde_json from 1.0.103 to 1.0.104
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.103 to 1.0.104.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.103...v1.0.104)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-31 20:10:02 +00:00
97f24c27bb Merge pull request #13 from mxve/dependabot/cargo/serde-1.0.179
Bump serde from 1.0.175 to 1.0.179
2023-07-31 22:09:28 +02:00
66f905e8d7 Bump serde from 1.0.175 to 1.0.179
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.175 to 1.0.179.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.175...v1.0.179)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-31 15:37:10 +00:00
b46065a800 minor cleanup 2023-07-25 03:24:52 +02:00
a5d3d9162e Merge pull request #12 from mxve/dependabot/cargo/serde-1.0.175
Bump serde from 1.0.171 to 1.0.175
2023-07-24 18:14:48 +02:00
b2efdfd4b2 Bump serde from 1.0.171 to 1.0.175
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.171 to 1.0.175.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.171...v1.0.175)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-24 15:40:30 +00:00
bc3eb8e5ba dependabot daily -> weekly 2023-07-19 08:54:07 +02:00
c7d8035eab Merge pull request #11 from mxve/dependabot/cargo/serde_json-1.0.103
Bump serde_json from 1.0.102 to 1.0.103
2023-07-19 08:52:21 +02:00
753f60b83d Bump serde_json from 1.0.102 to 1.0.103
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.102 to 1.0.103.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.102...v1.0.103)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-17 15:12:34 +00:00
Edo
21acf7893d fix: remove return statement 2023-07-13 11:18:45 +02:00
389643078d Merge pull request #10 from diamante0018/main
feat: use current time as cache busting method
2023-07-13 10:39:16 +02:00
e95e31610e Merge pull request #9 from mxve/dependabot/cargo/serde_json-1.0.102
Bump serde_json from 1.0.100 to 1.0.102
2023-07-13 10:39:06 +02:00
06904102a4 Bump serde_json from 1.0.100 to 1.0.102
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.100 to 1.0.102.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.100...v1.0.102)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-13 08:37:53 +00:00
e89f70e399 Merge pull request #8 from mxve/dependabot/cargo/serde-1.0.171
Bump serde from 1.0.167 to 1.0.171
2023-07-13 10:36:56 +02:00
4620de247c Merge pull request #7 from mxve/dependabot/cargo/http_req-0.9.2
Bump http_req from 0.9.1 to 0.9.2
2023-07-13 10:36:48 +02:00
27102f810a feat: use current time as cache busting method 2023-07-13 10:31:23 +02:00
12550fd524 Bump serde from 1.0.167 to 1.0.171
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.167 to 1.0.171.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.167...v1.0.171)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-10 16:08:19 +00:00
53bad9c7c4 Bump http_req from 0.9.1 to 0.9.2
Bumps [http_req](https://github.com/jayjamesjay/http_req) from 0.9.1 to 0.9.2.
- [Release notes](https://github.com/jayjamesjay/http_req/releases)
- [Commits](https://github.com/jayjamesjay/http_req/compare/v0.9.1...v0.9.2)

---
updated-dependencies:
- dependency-name: http_req
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-10 16:08:13 +00:00
dd3d1fd82b Merge pull request #6 from mxve/dependabot/cargo/serde-1.0.167
Bump serde from 1.0.166 to 1.0.167
2023-07-07 22:09:54 +02:00
ee52e616c0 Bump serde from 1.0.166 to 1.0.167
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.166 to 1.0.167.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.166...v1.0.167)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-07 15:26:08 +00:00
3a393776a3 Merge pull request #5 from mxve/dependabot/cargo/serde_json-1.0.100
Bump serde_json from 1.0.99 to 1.0.100
2023-07-05 18:34:45 +02:00
62e8fc02ed Bump serde_json from 1.0.99 to 1.0.100
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.99 to 1.0.100.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.99...v1.0.100)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-05 16:05:39 +00:00
8184d468bc Merge pull request #4 from mxve/dependabot/cargo/serde-1.0.166
Bump serde from 1.0.164 to 1.0.166
2023-07-05 03:57:07 +02:00
58b361ed45 Bump serde from 1.0.164 to 1.0.166
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.164 to 1.0.166.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.164...v1.0.166)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-04 15:32:28 +00:00
2289bcaa87 Revert "windows self-update"
This reverts commit cee51300b27998da0e2351f6f011980d436286e6.
2023-06-28 15:13:41 +02:00
23dc1c085c Merge pull request #2 from mxve/dependabot/cargo/serde_json-1.0.99
Bump serde_json from 1.0.97 to 1.0.99
2023-06-28 13:09:40 +02:00
13052d6727 Bump serde_json from 1.0.97 to 1.0.99
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.97 to 1.0.99.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.97...v1.0.99)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-26 16:06:00 +00:00
f07a5684d3 delete update.bat 2023-06-22 16:48:43 +02:00
cee51300b2 windows self-update 2023-06-22 16:45:00 +02:00
a2be263a7b Merge pull request #1 from mxve/dependabot/cargo/serde_json-1.0.97
Bump serde_json from 1.0.96 to 1.0.97
2023-06-16 18:13:57 +02:00
000ebd466a Bump serde_json from 1.0.96 to 1.0.97
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.96 to 1.0.97.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.96...v1.0.97)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-16 16:04:00 +00:00
36534e56d9 update readme 2023-06-12 18:34:47 +02:00
757c1acf1b v0.2.3 2023-06-12 18:11:16 +02:00
b15d0eb7d7 Add "update" cli arg 2023-06-12 02:54:55 +02:00
eb508f2b48 v0.2.2 2023-06-11 18:52:17 +02:00
6ae9bcabad get available mods from master 2023-06-11 18:48:27 +02:00
d25e7cf3cd Keep console open if game not found 2023-06-11 18:30:55 +02:00
d587553845 update all game-specific files, add iw6 2023-06-11 16:16:29 +02:00
4a488abb8e lint 2023-06-10 13:42:42 +02:00
872bad1b25 add hash check 2023-06-10 12:38:21 +02:00
f60555a442 replace icon 2023-06-10 11:12:43 +02:00
03575e8fc0 update readme 2023-06-10 09:44:26 +02:00
580d6e9646 update release workflow 2023-06-10 09:43:54 +02:00
b6933d357a 'V B ~vomiting face~'- cherry, 2023 2023-06-10 09:33:16 +02:00
46f452a71f v0.1.1 2023-06-09 19:31:04 +02:00
9986ce1172 fix iw5-mod not launching without admin 2023-06-09 19:30:09 +02:00
6bc598cb2d typo 2023-06-01 12:24:48 +02:00
28 changed files with 3177 additions and 714 deletions

63
.gitattributes vendored
View File

@ -1,63 +0,0 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

6
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "cargo" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"

30
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,30 @@
name: Build
on:
workflow_dispatch:
jobs:
build:
name: build ${{ matrix.target }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
target: [x86_64-pc-windows-gnu, x86_64-unknown-linux-musl]
steps:
- uses: actions/checkout@master
- name: Compile and release
id: compile
uses: rust-build/rust-build.action@v1.4.3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
RUSTTARGET: ${{ matrix.target }}
UPLOAD_MODE: none
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: Binary
path: |
${{ steps.compile.outputs.BUILT_ARCHIVE }}
${{ steps.compile.outputs.BUILT_CHECKSUM }}

67
.github/workflows/lint.yml vendored Normal file
View File

@ -0,0 +1,67 @@
on: [push, pull_request]
name: lint
jobs:
check:
name: Check
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
- name: Run cargo check
uses: clechasseur/rs-cargo@v2
continue-on-error: true
with:
command: check
test:
name: Test Suite
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
- name: Run cargo test
uses: clechasseur/rs-cargo@v2
continue-on-error: true
with:
command: test
lints:
name: Lints
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
components: rustfmt, clippy
- name: Run cargo fmt
uses: clechasseur/rs-cargo@v2
continue-on-error: true
with:
command: fmt
args: --all -- --check
- name: Run cargo clippy
uses: clechasseur/rs-cargo@v2
continue-on-error: true
with:
command: clippy
args: -- -D warnings

38
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,38 @@
name: Release
on:
push:
tags:
- v[0-9]+.*
jobs:
create-release:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- uses: taiki-e/create-gh-release-action@v1
with:
draft: true
token: ${{ secrets.GITHUB_TOKEN }}
upload-assets:
strategy:
matrix:
include:
- target: x86_64-unknown-linux-gnu
os: ubuntu-20.04
- target: x86_64-pc-windows-msvc
os: windows-latest
- target: i686-pc-windows-msvc
os: windows-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: taiki-e/upload-rust-binary-action@v1
with:
target: ${{ matrix.target }}
bin: alterware-launcher
tar: unix
zip: windows
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

364
.gitignore vendored
View File

@ -1,363 +1 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
/target

1665
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

40
Cargo.toml Normal file
View File

@ -0,0 +1,40 @@
[package]
name = "alterware-launcher"
version = "0.6.9"
edition = "2021"
build = "res/build.rs"
[profile.release]
opt-level = "s"
panic = "abort"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
sha1_smol = "1.0.0"
serde = { version = "1.0.196", features = ["derive"] }
serde_json = "1.0.113"
rand = "0.8.5"
semver = "1.0.22"
colored = "2.1.0"
reqwest = { version = "0.11.24", features = ["stream"] }
futures-util = "0.3.30"
indicatif = "0.17.8"
tokio = {version="1.36.0", features = ["rt-multi-thread", "macros"]}
[target.'cfg(unix)'.dependencies]
openssl = { version = "0.10.63", default-features = false, features = ["vendored"] }
[target.'cfg(windows)'.dependencies]
steamlocate = "=2.0.0-beta.2"
mslnk = "0.1.8"
self-replace = "1.3.7"
[build-dependencies]
winres = "0.1.12"
[package.metadata.winres]
OriginalFilename = "alterware-launcher.exe"
FileDescription = "AlterWare Launcher"
ProductName = "AlterWare Launcher"

View File

@ -1,63 +0,0 @@
'------------------------------------------------------------------------------
' <auto-generated>
' This code was generated by a tool.
' Runtime Version:4.0.30319.42000
'
' Changes to this file may cause incorrect behavior and will be lost if
' the code is regenerated.
' </auto-generated>
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On
Imports System
Namespace My.Resources
'This class was auto-generated by the StronglyTypedResourceBuilder
'class via a tool like ResGen or Visual Studio.
'To add or remove a member, edit your .ResX file then rerun ResGen
'with the /str option, or rebuild your VS project.
'''<summary>
''' A strongly-typed resource class, for looking up localized strings, etc.
'''</summary>
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0"), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
Friend Module Resources
Private resourceMan As Global.System.Resources.ResourceManager
Private resourceCulture As Global.System.Globalization.CultureInfo
'''<summary>
''' Returns the cached ResourceManager instance used by this class.
'''</summary>
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
Get
If Object.ReferenceEquals(resourceMan, Nothing) Then
Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("alterware_launcher.Resources", GetType(Resources).Assembly)
resourceMan = temp
End If
Return resourceMan
End Get
End Property
'''<summary>
''' Overrides the current thread's CurrentUICulture property for all
''' resource lookups using this strongly typed resource class.
'''</summary>
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Friend Property Culture() As Global.System.Globalization.CultureInfo
Get
Return resourceCulture
End Get
Set
resourceCulture = value
End Set
End Property
End Module
End Namespace

View File

@ -1,110 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1">this is my long string</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
[base64 mime encoded serialized .NET Framework object]
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
[base64 mime encoded string representing a byte array form of the .NET Framework object]
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -1,39 +0,0 @@
Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Http
Module Program
Private master As String = "https://master.alterware.dev"
Sub download_and_run(game As String)
Dim filename As String = game & ".exe"
Dim remote_path As String = If(game = "iw4-sp", "/iw4/", "/iw5/")
Console.WriteLine("Downloading " & game & "...")
Using wc As New WebClient
wc.DownloadFile(master & remote_path & filename, filename)
End Using
Console.WriteLine("Starting " & game)
Process.Start(filename)
End
End Sub
Sub Main(args As String())
Dim game As String
Try
game = args(0)
Catch ex As Exception
If File.Exists("iw4sp.exe") Or File.Exists("iw4mp.exe") Then
game = "iw4-sp"
ElseIf File.Exists("iw5sp.exe") Or File.Exists("iw5mp.exe") Or File.Exists("iw5mp_server.exe") Then
game = "iw5-mod"
Else
Console.WriteLine("No game specified nor found in local directory")
Console.ReadLine()
Return
End If
End Try
download_and_run(game)
End Sub
End Module

View File

@ -1,7 +1,95 @@
# alterware-launcher
# AlterWare Launcher
1. Download [latest release](https://github.com/mxve/alterware-launcher/releases/latest/download/alterware-launcher.exe)
2. Please alterware-launcher.exe in MW2/MW3 game directory
3. Run alterware-launcher.exe
### [AlterWare.dev](https://alterware.dev)
If the launcher doesn't work make sure you have dotnet 6.0 installed. Also try running the launcher as administrator.
##### IW4x | IW4-SP | IW5-Mod | IW6-Mod | S1-Mod
![GitHub tag (with filter)](https://img.shields.io/github/v/tag/mxve/alterware-launcher?filter=!v*-pre&style=flat-square&label=Latest%20release&labelColor=F3F8FF&color=E26EE5) ![GitHub (Pre-)Release Date](https://img.shields.io/github/release-date-pre/mxve/alterware-launcher?style=flat-square&label=Release%20date&labelColor=F3F8FF&color=E26EE5) ![GitHub all releases](https://img.shields.io/github/downloads/mxve/alterware-launcher/total?style=flat-square&label=Total%20downloads&labelColor=F3F8FF&color=E26EE5)
---
## Installation
1. Download the game from [Steam](https://store.steampowered.com/)
2. Download the [latest alterware-launcher.exe](https://github.com/mxve/alterware-launcher/releases/latest/download/alterware-launcher.exe)
3. Place alterware-launcher.exe in the game directory
4. Run alterware-launcher.exe, after updating the game will launch automatically
---
#### Command line arguments
- ```iw4-sp```, ```iw4x```, ```iw5-mod```, ```iw6-mod```, ```s1-mod```
- Skip automatic detection and launch the specified game
- This should always be the first argument if used
- ```--update```, ```-u```
- Only update the game, don't launch it
- ```--skip-launcher-update```
- Don't update the launcher
- ```--bonus```
- Download bonus content
- ```--force```, ```-f```
- Force file hash recheck
- ```--path```, ```-p```
- Set the game path
- Do not include a trailing backslash in the path
- ```--pass```
- Pass additional arguments to the game
- See [client-args.md](client-args.md)
- ```--version```, ```-v```
- Print the launcher version
- ```--ignore-required-files```
- Install client even if required files are missing
Example: ```alterware-launcher.exe iw4x --bonus -u --path "C:\Games\IW4x" --pass "-console"```
Some arguments can be set in alterware-launcher.json, args generally override the values of the config.
---
#### Config file
alterware-launcher.json
- ```update_only```
- See --update
- Default: false
- ```skip_self_update```
- See --skip-launcher-update
- Default: false
- ```download_bonus_content```
- See --bonus
- Default: false
- ```ask_bonus_content```
- Ask the user if they want to download bonus content
- Default: true; false after asking
- ```force_update```
- See --force
- Default: false
- ```args```
- See --pass
- Default: ""
- ```use_https```
- Use HTTPS for downloads
- Default: false
---
#### Support
Visit the [AlterWare Forum](https://forum.alterware.dev/) or [Discord](https://discord.gg/2ETE8engZM) for support.
---
#### Building from Source
- [Install Rust](https://rustup.rs/)
- Clone the repository
- Run ```cargo build --release```
- The executable will be located in ```target/release```
---
### Note for server owners:
When the launcher updates itself __on Windows__ it will restart by spawning a new console. If you are automating this process, you should probably use ```--skip-launcher-update``` and download the latest launcher yourself from [here](https://github.com/mxve/alterware-launcher/releases/latest/download/alterware-launcher.exe).
The linux build does __not__ update itself.

View File

@ -1,25 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33530.505
MinimumVisualStudioVersion = 10.0.40219.1
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "alterware-launcher", "alterware-launcher.vbproj", "{FDEA6E70-5F8E-438C-A79A-604DC8CEC5C2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{FDEA6E70-5F8E-438C-A79A-604DC8CEC5C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FDEA6E70-5F8E-438C-A79A-604DC8CEC5C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FDEA6E70-5F8E-438C-A79A-604DC8CEC5C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FDEA6E70-5F8E-438C-A79A-604DC8CEC5C2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9C3806A8-30BF-4467-A257-B01E592BBF6E}
EndGlobalSection
EndGlobal

View File

@ -1,46 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<RootNamespace>alterware_launcher</RootNamespace>
<TargetFramework>net6.0</TargetFramework>
<PublishSingleFile>true</PublishSingleFile>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>true</SelfContained>
<ApplicationIcon>icon.ico</ApplicationIcon>
<Description>AlterWare iw4-sp/iw5-mod updater</Description>
<PackageProjectUrl>https://github.com/mxve/alterware-launcher</PackageProjectUrl>
<PackageIcon>icon.png</PackageIcon>
<RepositoryType>git</RepositoryType>
<FileVersion>0.1.0</FileVersion>
<AssemblyVersion>0.1.0</AssemblyVersion>
</PropertyGroup>
<ItemGroup>
<Content Include="icon.ico" />
</ItemGroup>
<ItemGroup>
<None Include="..\..\Seafile\GFX\mxve\icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<Compile Update="My Project\Resources.Designer.vb">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="My Project\Resources.resx">
<CustomToolNamespace>My.Resources</CustomToolNamespace>
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>

32
client-args.md Normal file
View File

@ -0,0 +1,32 @@
# IW4x
[github.com/iw4x/iw4x-client#command-line-arguments](https://github.com/iw4x/iw4x-client#command-line-arguments)
| Argument | Description |
|:------------------------|:-----------------------------------------------|
| `-tests` | Perform unit tests. |
| `-entries` | Print to the console a list of every asset as they are loaded from zonefiles. |
| `-stdout` | Redirect all logging output to the terminal iw4x is started from, or if there is none, creates a new terminal window to write log information in. |
| `-console` | Allow the game to display its own separate interactive console window. |
| `-dedicated` | Starts the game as a headless dedicated server. |
| `-bigminidumps` | Include all code sections from loaded modules in the dump. |
| `-reallybigminidumps` | Include data sections from all loaded modules in the dump. |
| `-dump` | Write info of loaded assets to the raw folder as they are being loaded. |
| `-nointro` | Skip game's cinematic intro. |
| `-version` | Print IW4x build info on startup. |
| `-nosteam` | Disable friends feature and do not update Steam about the game's current status just like an invisible mode. |
| `-unprotect-dvars` | Allow the server to modify saved/archive dvars. |
| `-zonebuilder` | Start the interactive zonebuilder tool console instead of starting the game. |
| `-disable-notifies` | Disable "Anti-CFG" checks |
| `-disable-mongoose` | Disable Mongoose HTTP server |
| `-disable-rate-limit-check` | Disable RCOn rate limit checks |
| `+<command>` | Execute game command (ex. `+set net_port 1337`)|
# S1-Mod, IW6-Mod
| Argument | Description |
|:------------------------|:-----------------------------------------------|
| `-headless` | Use system console |
| `-dedicated` | Dedicated server |
| `-singleplayer` | Start singleplayer; Skip launcher |
| `-multiplayer` | Start multiplayer; Skip launcher |
| `+<command>` | Execute game command (ex. `+set net_port 1337`)|

BIN
icon.ico

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

16
res/build.rs Normal file
View File

@ -0,0 +1,16 @@
#[cfg(windows)]
extern crate winres;
#[cfg(windows)]
fn main() {
let mut res = winres::WindowsResource::new();
res.set_icon("res/icon.ico").set_language(0x0409);
if let Err(e) = res.compile() {
eprintln!("{}", e);
std::process::exit(1);
}
}
#[cfg(unix)]
fn main() {}

BIN
res/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

53
src/config.rs Normal file
View File

@ -0,0 +1,53 @@
use crate::structs::Config;
use std::{fs, path::PathBuf};
pub fn load(config_path: PathBuf) -> Config {
if config_path.exists() {
let cfg = fs::read_to_string(&config_path).unwrap();
let cfg: Config = serde_json::from_str(&cfg).unwrap_or(Config::default());
return cfg;
}
save(config_path.clone(), Config::default());
Config::default()
}
pub fn save(config_path: PathBuf, config: Config) {
match fs::write(
config_path.clone(),
serde_json::to_string_pretty(&config).unwrap(),
) {
Ok(_) => (),
Err(e) => match e.kind() {
std::io::ErrorKind::NotFound => {
fs::create_dir_all(config_path.parent().unwrap()).unwrap();
save(config_path, config);
}
_ => println!("Could not save config file, got:\n{}\n", e),
},
}
}
pub fn save_value(config_path: PathBuf, key: &str, value: bool) {
let mut config = load(config_path.clone());
match key {
"update_only" => config.update_only = value,
"skip_self_update" => config.skip_self_update = value,
"download_bonus_content" => config.download_bonus_content = value,
"ask_bonus_content" => config.ask_bonus_content = value,
"force_update" => config.force_update = value,
"use_https" => config.use_https = value,
_ => (),
}
save(config_path, config);
}
pub fn save_value_s(config_path: PathBuf, key: &str, value: String) {
let mut config = load(config_path.clone());
match key {
"args" => config.args = value.to_string(),
"engine" => config.engine = value.to_string(),
_ => (),
}
save(config_path, config);
}

24
src/github.rs Normal file
View File

@ -0,0 +1,24 @@
use semver::Version;
pub async fn latest_tag(owner: &str, repo: &str) -> String {
let github_body = crate::http_async::get_body_string(
format!(
"https://api.github.com/repos/{}/{}/releases/latest",
owner, repo
)
.as_str(),
)
.await
.unwrap();
let github_json: serde_json::Value = serde_json::from_str(&github_body).unwrap();
github_json["tag_name"].to_string().replace('"', "")
}
pub async fn latest_version(owner: &str, repo: &str) -> Version {
let tag = latest_tag(owner, repo).await.replace('v', "");
Version::parse(&tag).unwrap()
}
pub fn latest_release_url(owner: &str, repo: &str) -> String {
format!("https://github.com/{}/{}/releases/latest", owner, repo)
}

5
src/global.rs Normal file
View File

@ -0,0 +1,5 @@
pub const MASTER: &str = "cdn.alterware.ovh";
pub const GH_OWNER: &str = "mxve";
pub const GH_REPO: &str = "alterware-launcher";
pub const GH_IW4X_OWNER: &str = "iw4x";
pub const GH_IW4X_REPO: &str = "iw4x-client";

127
src/http_async.rs Normal file
View File

@ -0,0 +1,127 @@
use std::cmp::min;
use std::fs::File;
use std::io::Write;
use std::path::PathBuf;
use colored::*;
use futures_util::StreamExt;
use indicatif::ProgressBar;
use reqwest::Client;
use crate::misc;
pub async fn download_file_progress(
client: &Client,
pb: &ProgressBar,
url: &str,
path: &PathBuf,
size: u64,
) -> Result<(), String> {
let res = client
.get(url)
.header(
"User-Agent",
&format!(
"AlterWare Launcher | github.com/{}/{}",
crate::global::GH_OWNER,
crate::global::GH_REPO
),
)
.send()
.await
.or(Err(format!("Failed to GET from '{}'", &url)))?;
// Fix for CF shenanigans
let total_size = res.content_length().unwrap_or(size);
pb.set_length(total_size);
pb.println(format!(
"[{}] {} ({})",
"Downloading".bright_yellow(),
misc::cute_path(path),
misc::human_readable_bytes(total_size)
));
pb.set_message(path.file_name().unwrap().to_str().unwrap().to_string());
let mut file =
File::create(path).or(Err(format!("Failed to create file '{}'", path.display())))?;
let mut downloaded: u64 = 0;
let mut stream = res.bytes_stream();
while let Some(item) = stream.next().await {
let chunk = item.or(Err("Error while downloading file"))?;
file.write_all(&chunk)
.or(Err("Error while writing to file"))?;
let new = min(downloaded + (chunk.len() as u64), total_size);
downloaded = new;
pb.set_position(new);
}
pb.set_message(String::default());
Ok(())
}
pub async fn download_file(url: &str, path: &PathBuf) -> Result<(), String> {
let client = Client::new();
match client
.get(url)
.header(
"User-Agent",
&format!(
"AlterWare Launcher | github.com/{}/{}",
crate::global::GH_OWNER,
crate::global::GH_REPO
),
)
.send()
.await
{
Ok(res) => {
let body = res.bytes().await.or(Err("Failed to download file"))?;
let mut file = File::create(path).or(Err("Failed to create file"))?;
file.write_all(&body).or(Err("Failed to write to file"))?;
Ok(())
}
Err(e) => {
misc::fatal_error(&format!(
"Could not download file from {}, got:\n{}",
url, e
));
Err("Could not download file".to_string())
}
}
}
pub async fn get_body(url: &str) -> Result<Vec<u8>, String> {
let client = Client::new();
match client
.get(url)
.header(
"User-Agent",
&format!(
"AlterWare Launcher | github.com/{}/{}",
crate::global::GH_OWNER,
crate::global::GH_REPO
),
)
.send()
.await
{
Ok(res) => {
println!(
"[DEBUG] {} {}",
res.status().to_string().bright_yellow(),
url.bright_yellow()
);
let body = res.bytes().await.or(Err("Failed to get body"))?;
Ok(body.to_vec())
}
Err(e) => {
misc::fatal_error(&format!("Could not get body from {}, got:\n{}", url, e));
Err("Could not get body".to_string())
}
}
}
pub async fn get_body_string(url: &str) -> Result<String, String> {
let body = get_body(url).await?;
Ok(String::from_utf8(body).unwrap())
}

52
src/iw4x.rs Normal file
View File

@ -0,0 +1,52 @@
use crate::github;
use crate::global::*;
use crate::http_async;
use crate::misc;
use colored::*;
use std::{fs, path::Path};
pub fn local_revision(dir: &Path) -> u16 {
if let Ok(revision) = fs::read_to_string(dir.join(".iw4xrevision")) {
misc::rev_to_int(&revision)
} else {
0
}
}
pub async fn remote_revision() -> u16 {
misc::rev_to_int(&github::latest_tag(GH_IW4X_OWNER, GH_IW4X_REPO).await)
}
pub async fn update(dir: &Path) {
let remote = remote_revision().await;
let local = local_revision(dir);
if remote <= local && dir.join("iw4x.dll").exists() {
println!(
"[{}] No files to download for IW4x",
"Info".bright_magenta(),
);
return;
}
println!(
"[{}] Downloading outdated or missing files for IW4x",
"Info".bright_magenta()
);
println!(
"[{}] {}",
"Downloading".bright_yellow(),
misc::cute_path(&dir.join("iw4x.dll"))
);
http_async::download_file(
&format!(
"{}/download/iw4x.dll",
github::latest_release_url(GH_IW4X_OWNER, GH_IW4X_REPO)
),
&dir.join("iw4x.dll"),
)
.await
.unwrap();
fs::write(dir.join(".iw4xrevision"), format!("r{}", remote)).unwrap();
}

698
src/main.rs Normal file
View File

@ -0,0 +1,698 @@
mod config;
mod github;
mod global;
mod http_async;
mod iw4x;
mod misc;
mod self_update;
mod structs;
use global::*;
use structs::*;
use colored::*;
use indicatif::ProgressBar;
#[cfg(windows)]
use mslnk::ShellLink;
use std::{borrow::Cow, collections::HashMap, env, fs, path::Path, path::PathBuf};
#[cfg(windows)]
use steamlocate::SteamDir;
#[cfg(windows)]
fn get_installed_games(games: &Vec<Game>) -> Vec<(u32, PathBuf)> {
let mut installed_games = Vec::new();
let steamdir_result = SteamDir::locate();
let steamdir = match steamdir_result {
Ok(steamdir) => steamdir,
Err(error) => {
println!("Error locating Steam: {}", error);
return installed_games;
}
};
for game in games {
if let Ok(Some((app, library))) = steamdir.find_app(game.app_id) {
let game_path = library
.path()
.join("steamapps")
.join("common")
.join(&app.install_dir);
installed_games.push((game.app_id, game_path));
}
}
installed_games
}
#[cfg(windows)]
fn create_shortcut(path: &Path, target: &Path, icon: String, args: String) {
if let Ok(mut sl) = ShellLink::new(target) {
sl.set_arguments(Some(args));
sl.set_icon_location(Some(icon));
sl.create_lnk(path).unwrap_or_else(|error| {
println!("Error creating shortcut.\n{:#?}", error);
});
} else {
println!("Error creating shortcut.");
}
}
#[cfg(windows)]
fn setup_client_links(game: &Game, game_dir: &Path) {
if game.client.len() > 1 {
println!("Multiple clients installed, use the shortcuts (launch-<client>.lnk in the game directory or on the desktop) to launch a specific client.");
}
for c in game.client.iter() {
create_shortcut(
&game_dir.join(format!("launch-{}.lnk", c)),
&game_dir.join("alterware-launcher.exe"),
game_dir
.join(format!("{}.exe", c))
.to_string_lossy()
.into_owned(),
c.to_string(),
);
}
}
#[cfg(windows)]
fn setup_desktop_links(path: &Path, game: &Game) {
println!("Create Desktop shortcut? (Y/n)");
let input = misc::stdin().to_ascii_lowercase();
if input == "y" || input.is_empty() {
let desktop = PathBuf::from(&format!("{}\\Desktop", env::var("USERPROFILE").unwrap()));
for c in game.client.iter() {
create_shortcut(
&desktop.join(format!("{}.lnk", c)),
&path.join("alterware-launcher.exe"),
path.join(format!("{}.exe", c))
.to_string_lossy()
.into_owned(),
c.to_string(),
);
}
}
}
#[cfg(windows)]
async fn auto_install(path: &Path, game: &Game<'_>, master_url: &String) {
setup_client_links(game, path);
setup_desktop_links(path, game);
update(game, path, false, false, None, master_url, None).await;
}
#[cfg(windows)]
async fn windows_launcher_install(games: &Vec<Game<'_>>, master_url: &String) {
println!(
"{}",
"No game specified/found. Checking for installed Steam games..".yellow()
);
let installed_games = get_installed_games(games);
if !installed_games.is_empty() {
let current_dir = env::current_dir().unwrap();
for (id, path) in installed_games.iter() {
if current_dir.starts_with(path) {
println!("Found game in current directory.");
println!("Installing AlterWare client for {}.", id);
let game = games.iter().find(|&g| g.app_id == *id).unwrap();
auto_install(path, game, master_url).await;
println!("Installation complete. Please run the launcher again or use a shortcut to launch the game.");
std::io::stdin().read_line(&mut String::new()).unwrap();
std::process::exit(0);
}
}
println!("Installed games:");
for (id, path) in installed_games.iter() {
println!("{}: {}", id, path.display());
}
println!("Enter the ID of the game you want to install the AlterWare client for:");
let input: u32 = misc::stdin().parse().unwrap();
for (id, path) in installed_games.iter() {
if *id == input {
let game = games.iter().find(|&g| g.app_id == input).unwrap();
let launcher_path = env::current_exe().unwrap();
let target_path = path.join("alterware-launcher.exe");
if launcher_path != target_path {
fs::copy(launcher_path, target_path).unwrap();
println!("Launcher copied to {}", path.display());
}
auto_install(path, game, master_url).await;
println!("Installation complete. Please run the launcher again or use a shortcut to launch the game.");
std::io::stdin().read_line(&mut String::new()).unwrap();
break;
}
}
std::process::exit(0);
} else {
println!(
"No installed games found. Make sure to place the launcher in the game directory."
);
std::io::stdin().read_line(&mut String::new()).unwrap();
std::process::exit(0);
}
}
// fn prompt_client_selection(games: &[Game]) -> String {
// println!(
// "Couldn't detect any games, please select a client to install in the current directory:"
// );
// for (i, g) in games.iter().enumerate() {
// for c in g.client.iter() {
// println!("{}: {}", i, c);
// }
// }
// let input: usize = misc::stdin().parse().unwrap();
// String::from(games[input].client[0])
// }
// async fn manual_install(games: &[Game<'_>]) {
// let selection = prompt_client_selection(games);
// let game = games.iter().find(|&g| g.client[0] == selection).unwrap();
// update(game, &env::current_dir().unwrap(), false, false).await;
// println!("Installation complete. Please run the launcher again or use a shortcut to launch the game.");
// std::io::stdin().read_line(&mut String::new()).unwrap();
// std::process::exit(0);
// }
fn total_download_size(cdn_info: &Vec<CdnFile>, remote_dir: &str) -> u64 {
let remote_dir = format!("{}/", remote_dir);
let mut size: u64 = 0;
for file in cdn_info {
if !file.name.starts_with(&remote_dir) || file.name == "iw4/iw4x.dll" {
continue;
}
size += file.size as u64;
}
size
}
async fn update_dir(
cdn_info: &Vec<CdnFile>,
remote_dir: &str,
dir: &Path,
hashes: &mut HashMap<String, String>,
pb: &ProgressBar,
skip_iw4x_sp: bool,
master_url: &String,
) {
misc::pb_style_download(pb, false);
let remote_dir_pre = format!("{}/", remote_dir);
let mut files_to_download: Vec<CdnFile> = vec![];
for file in cdn_info {
if !file.name.starts_with(&remote_dir_pre) || file.name == "iw4/iw4x.dll" {
continue;
}
if skip_iw4x_sp && file.name == "iw4/iw4x-sp.exe" {
continue;
}
let sha1_remote = file.hash.to_lowercase();
let file_name = &file.name.replace(remote_dir_pre.as_str(), "");
let file_path = dir.join(file_name);
if file_path.exists() {
let sha1_local = hashes
.get(file_name)
.map(Cow::Borrowed)
.unwrap_or_else(|| Cow::Owned(misc::get_file_sha1(&file_path)))
.to_string();
if sha1_local != sha1_remote {
files_to_download.push(file.clone());
} else {
pb.println(format!(
"[{}] {}",
"Checked".bright_blue(),
misc::cute_path(&file_path)
));
hashes.insert(file_name.to_owned(), file.hash.to_lowercase());
}
} else {
files_to_download.push(file.clone());
}
}
if files_to_download.is_empty() {
pb.println(format!(
"[{}] No files to download for {}",
"Info".bright_magenta(),
remote_dir
));
return;
}
pb.println(format!(
"[{}] Downloading outdated or missing files for {}, {}",
"Info".bright_magenta(),
remote_dir,
misc::human_readable_bytes(total_download_size(&files_to_download, remote_dir))
));
misc::pb_style_download(pb, true);
let client = reqwest::Client::new();
for file in files_to_download {
let file_name = &file.name.replace(&remote_dir_pre, "");
let file_path = dir.join(file_name);
if let Some(parent) = file_path.parent() {
if !parent.exists() {
fs::create_dir_all(parent).unwrap();
}
}
http_async::download_file_progress(
&client,
pb,
&format!("{}/{}", master_url, file.name),
&file_path,
file.size as u64,
)
.await
.unwrap();
hashes.insert(file_name.to_owned(), file.hash.to_lowercase());
}
misc::pb_style_download(pb, false);
}
async fn update(
game: &Game<'_>,
dir: &Path,
bonus_content: bool,
force: bool,
skip_iw4x_sp: Option<bool>,
master_url: &String,
ignore_required_files: Option<bool>,
) {
let skip_iw4x_sp = skip_iw4x_sp.unwrap_or(false);
let ignore_required_files = ignore_required_files.unwrap_or(false);
let res = http_async::get_body_string(format!("{}/files.json", master_url).as_str())
.await
.unwrap();
let cdn_info: Vec<CdnFile> = serde_json::from_str(&res).unwrap();
if !ignore_required_files && !game.required_files_exist(dir) {
println!(
"{}\nVerify game file integrity on Steam or reinstall the game.",
"Critical game files missing.".bright_red()
);
std::io::stdin().read_line(&mut String::new()).unwrap();
std::process::exit(0);
}
let mut hashes = HashMap::new();
let hash_file = dir.join(".sha-sums");
if hash_file.exists() && !force {
let hash_file = fs::read_to_string(hash_file).unwrap();
for line in hash_file.lines() {
let mut split = line.split_whitespace();
let hash = split.next().unwrap();
let file = split.next().unwrap();
hashes.insert(file.to_owned(), hash.to_owned());
}
}
if game.engine == "iw4" {
iw4x::update(dir).await;
let iw4x_dirs = vec!["iw4x", "zone/patch"];
for d in &iw4x_dirs {
if let Ok(dir_iter) = dir.join(d).read_dir() {
'outer: for file in dir_iter.filter_map(|entry| entry.ok()) {
let file_path = file.path();
if file_path.is_dir() {
continue;
}
let file_path_rel = match file_path.strip_prefix(dir) {
Ok(rel) => rel.to_path_buf(),
Err(_) => continue,
};
if iw4x_dirs
.iter()
.any(|prefix| file_path_rel.starts_with(Path::new(prefix)))
{
if !cdn_info
.iter()
.any(|cdn_file| cdn_file.name.starts_with("iw4"))
{
continue;
}
let should_continue = cdn_info.iter().any(|cdn_file| {
let path_rem = Path::new(&cdn_file.name)
.strip_prefix(Path::new("iw4"))
.unwrap_or_else(|_| Path::new(&cdn_file.name));
path_rem == file_path_rel
});
if should_continue {
continue 'outer;
}
println!(
"[{}] {}",
"Removed".bright_red(),
misc::cute_path(&file_path)
);
if fs::remove_file(&file_path).is_err() {
println!(
"[{}] Couldn't delete {}",
"Error".bright_red(),
misc::cute_path(&file_path)
);
}
}
}
}
}
}
let pb = ProgressBar::new(0);
update_dir(
&cdn_info,
game.engine,
dir,
&mut hashes,
&pb,
skip_iw4x_sp,
master_url,
)
.await;
if bonus_content && !game.bonus.is_empty() {
for bonus in game.bonus.iter() {
update_dir(
&cdn_info,
bonus,
dir,
&mut hashes,
&pb,
skip_iw4x_sp,
master_url,
)
.await;
}
}
pb.finish();
for f in game.delete.iter() {
let file_path = dir.join(f);
if file_path.exists() {
if fs::remove_file(&file_path).is_err() {
println!(
"[{}] Couldn't delete {}",
"Error".bright_red(),
misc::cute_path(&file_path)
);
} else {
println!(
"[{}] {}",
"Removed".bright_red(),
misc::cute_path(&file_path)
);
}
}
}
let mut hash_file_content = String::new();
for (file, hash) in hashes.iter() {
hash_file_content.push_str(&format!("{} {}\n", hash, file));
}
fs::write(dir.join(".sha-sums"), hash_file_content).unwrap();
}
fn launch(file_path: &PathBuf, args: &str) {
println!("\n\nJoin the AlterWare Discord server:\nhttps://discord.gg/2ETE8engZM\n\n");
println!("Launching {} {}", file_path.display(), args);
std::process::Command::new(file_path)
.args(args.trim().split(' '))
.current_dir(file_path.parent().unwrap())
.spawn()
.expect("Failed to launch the game")
.wait()
.expect("Failed to wait for the game process to finish");
}
#[cfg(windows)]
fn setup_env() {
colored::control::set_virtual_terminal(true).unwrap_or_else(|error| {
println!("{:#?}", error);
colored::control::SHOULD_COLORIZE.set_override(false);
});
if let Ok(system_root) = env::var("SystemRoot") {
if let Ok(current_dir) = env::current_dir() {
if current_dir.starts_with(system_root) {
if let Ok(current_exe) = env::current_exe() {
if let Some(parent) = current_exe.parent() {
if let Err(error) = env::set_current_dir(parent) {
eprintln!("{:#?}", error);
} else {
println!("Running from the system directory. Changed working directory to the executable location.");
}
}
}
}
}
}
}
fn arg_value(args: &[String], arg: &str) -> Option<String> {
args.iter()
.position(|r| r == arg)
.map(|e| args[e + 1].clone())
}
fn arg_bool(args: &[String], arg: &str) -> bool {
args.iter().any(|r| r == arg)
}
fn arg_remove(args: &mut Vec<String>, arg: &str) {
args.iter().position(|r| r == arg).map(|e| args.remove(e));
}
fn arg_remove_value(args: &mut Vec<String>, arg: &str) {
if let Some(e) = args.iter().position(|r| r == arg) {
args.remove(e);
args.remove(e);
};
}
#[tokio::main]
async fn main() {
#[cfg(windows)]
setup_env();
let mut args: Vec<String> = env::args().collect();
if arg_bool(&args, "--help") {
println!("CLI Args:");
println!(" <client>: Specify the client to launch");
println!(" --help: Display this help message");
println!(" --version: Display the launcher version");
println!(" --path/-p <path>: Specify the game directory");
println!(" --update/-u: Update only, don't launch the game");
println!(" --bonus: Download bonus content");
println!(" --force/-f: Force file hash recheck");
println!(" --pass <args>: Pass arguments to the game");
println!(" --skip-launcher-update: Skip launcher self-update");
println!(" --ignore-required-files: Skip required files check");
println!(
"\nExample:\n alterware-launcher.exe iw4x --bonus --pass \"-console -nointro\""
);
return;
}
if arg_bool(&args, "--version") || arg_bool(&args, "-v") {
println!(
"{} v{}",
"AlterWare Launcher".bright_green(),
env!("CARGO_PKG_VERSION")
);
println!("https://github.com/{}/{}", GH_OWNER, GH_REPO);
println!(
"\n{}{}{}{}{}{}{}",
"For ".on_black(),
"Alter".bright_blue().on_black().underline(),
"Ware".white().on_black().underline(),
".dev".on_black().underline(),
" by ".on_black(),
"mxve".bright_magenta().on_black().underline(),
".de".on_black().underline()
);
return;
}
let install_path: PathBuf;
if let Some(path) = arg_value(&args, "--path") {
install_path = PathBuf::from(path);
arg_remove_value(&mut args, "--path");
} else if let Some(path) = arg_value(&args, "-p") {
install_path = PathBuf::from(path);
arg_remove_value(&mut args, "-p");
} else {
install_path = env::current_dir().unwrap();
}
let mut cfg = config::load(install_path.join("alterware-launcher.json"));
let master_url = if cfg.use_https {
format!("https://{}", MASTER)
} else {
format!("http://{}", MASTER)
};
if !arg_bool(&args, "--skip-launcher-update") && !cfg.skip_self_update {
self_update::run(cfg.update_only).await;
} else {
arg_remove(&mut args, "--skip-launcher-update");
}
if arg_bool(&args, "--update") || arg_bool(&args, "-u") {
cfg.update_only = true;
arg_remove(&mut args, "--update");
arg_remove(&mut args, "-u");
}
if arg_bool(&args, "--bonus") {
cfg.download_bonus_content = true;
cfg.ask_bonus_content = false;
arg_remove(&mut args, "--bonus");
}
if arg_bool(&args, "--force") || arg_bool(&args, "-f") {
cfg.force_update = true;
arg_remove(&mut args, "--force");
arg_remove(&mut args, "-f");
}
let ignore_required_files = arg_bool(&args, "--ignore-required-files");
if ignore_required_files {
arg_remove(&mut args, "--ignore-required-files");
}
if let Some(pass) = arg_value(&args, "--pass") {
cfg.args = pass;
arg_remove_value(&mut args, "--pass");
} else if cfg.args.is_empty() {
cfg.args = String::default();
}
let games_json = http_async::get_body_string(format!("{}/games.json", master_url).as_str())
.await
.unwrap();
let games: Vec<Game> = serde_json::from_str(&games_json).unwrap_or_else(|error| {
println!("Error parsing games.json: {:#?}", error);
fs::write("alterware-launcher-error.txt", &games_json).unwrap();
misc::stdin();
std::process::exit(1);
});
let mut game: String = String::new();
if args.len() > 1 {
game = String::from(&args[1]);
} else {
'main: for g in games.iter() {
for r in g.references.iter() {
if install_path.join(r).exists() {
if g.client.len() > 1 {
if cfg.update_only {
game = String::from(g.client[0]);
break 'main;
}
#[cfg(windows)]
setup_client_links(g, &env::current_dir().unwrap());
#[cfg(not(windows))]
println!("Multiple clients installed, set the client as the first argument to launch a specific client.");
println!("Select a client to launch:");
for (i, c) in g.client.iter().enumerate() {
println!("{}: {}", i, c);
}
game = String::from(g.client[misc::stdin().parse::<usize>().unwrap()]);
break 'main;
}
game = String::from(g.client[0]);
break 'main;
}
}
}
}
for g in games.iter() {
for c in g.client.iter() {
if c == &game {
if cfg.engine.is_empty() {
cfg.engine = String::from(g.engine);
config::save_value_s(
install_path.join("alterware-launcher.json"),
"engine",
cfg.engine.clone(),
);
if cfg.engine == "iw4" && cfg.args.is_empty() {
cfg.args = String::from("-stdout");
config::save_value_s(
install_path.join("alterware-launcher.json"),
"args",
cfg.args.clone(),
);
}
}
if cfg.ask_bonus_content && !g.bonus.is_empty() {
println!("Download bonus content? (Y/n)");
let input = misc::stdin().to_ascii_lowercase();
cfg.download_bonus_content = input != "n";
config::save_value(
install_path.join("alterware-launcher.json"),
"download_bonus_content",
cfg.download_bonus_content,
);
config::save_value(
install_path.join("alterware-launcher.json"),
"ask_bonus_content",
false,
);
}
update(
g,
install_path.as_path(),
cfg.download_bonus_content,
cfg.force_update,
Some(&game != "iw4x-sp"),
&master_url,
Some(ignore_required_files),
)
.await;
if !cfg.update_only {
launch(&install_path.join(format!("{}.exe", c)), &cfg.args);
}
return;
}
}
}
#[cfg(windows)]
windows_launcher_install(&games, &master_url).await;
println!("{}", "Game not found!".bright_red());
println!("Place the launcher in the game folder, if that doesn't work specify the client on the command line (ex. alterware-launcher.exe iw4-sp)");
println!("Press enter to exit...");
std::io::stdin().read_line(&mut String::new()).unwrap();
}

58
src/misc.rs Normal file
View File

@ -0,0 +1,58 @@
use std::{
fs,
path::{Path, PathBuf},
};
use colored::Colorize;
use indicatif::{ProgressBar, ProgressStyle};
pub fn get_file_sha1(path: &PathBuf) -> String {
let mut sha1 = sha1_smol::Sha1::new();
sha1.update(&fs::read(path).unwrap());
sha1.digest().to_string()
}
pub fn stdin() -> String {
let mut input = String::new();
std::io::stdin().read_line(&mut input).unwrap();
input.trim().to_string()
}
pub fn rev_to_int(rev: &str) -> u16 {
rev.strip_prefix('r')
.unwrap_or("0")
.parse::<u16>()
.unwrap_or(0)
}
pub fn fatal_error(error: &str) {
println!("\n\n{}:\n{}", "Error".bright_red(), error);
stdin();
std::process::exit(1);
}
pub fn human_readable_bytes(bytes: u64) -> String {
let mut bytes = bytes as f64;
let mut i = 0;
let units = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
while bytes > 1024.0 {
bytes /= 1024.0;
i += 1;
}
format!("{:.2}{}", bytes, units[i])
}
pub fn pb_style_download(pb: &ProgressBar, state: bool) {
if state {
pb.set_style(
ProgressStyle::with_template("{spinner:.magenta} {msg:.magenta} > {bytes}/{total_bytes} | {bytes_per_sec} | {eta}")
.unwrap(),
);
} else {
pb.set_style(ProgressStyle::with_template("{spinner:.magenta} {msg}").unwrap());
}
}
pub fn cute_path(path: &Path) -> String {
path.to_str().unwrap().replace('\\', "/")
}

111
src/self_update.rs Normal file
View File

@ -0,0 +1,111 @@
use crate::github;
use crate::global::*;
use semver::Version;
pub async fn self_update_available() -> bool {
let current_version: Version = Version::parse(env!("CARGO_PKG_VERSION")).unwrap();
let latest_version = github::latest_version(GH_OWNER, GH_REPO).await;
current_version < latest_version
}
#[cfg(not(windows))]
pub async fn run(_update_only: bool) {
if self_update_available().await {
println!("A new version of the AlterWare launcher is available.");
println!(
"Download it at {}",
github::latest_release_url(GH_OWNER, GH_REPO)
);
println!("Launching in 10 seconds..");
tokio::time::sleep(tokio::time::Duration::from_secs(10)).await;
}
}
#[cfg(windows)]
pub fn restart() -> std::io::Error {
use std::os::windows::process::CommandExt;
match std::process::Command::new(std::env::current_exe().unwrap())
.args(std::env::args().skip(1))
.creation_flags(0x00000010) // CREATE_NEW_CONSOLE
.spawn()
{
Ok(_) => std::process::exit(0),
Err(err) => err,
}
}
#[cfg(windows)]
pub async fn run(update_only: bool) {
use std::{fs, path::PathBuf};
use crate::http_async;
use crate::misc;
let working_dir = std::env::current_dir().unwrap();
let files = fs::read_dir(&working_dir).unwrap();
for file in files {
let file = file.unwrap();
let file_name = file.file_name().into_string().unwrap();
if file_name.contains("alterware-launcher")
&& (file_name.contains(".__relocated__.exe")
|| file_name.contains(".__selfdelete__.exe"))
{
fs::remove_file(file.path()).unwrap_or_else(|_| {
println!("Failed to remove old launcher file.");
});
}
}
if self_update_available().await {
println!("Performing launcher self-update.");
println!(
"If you run into any issues, please download the latest version at {}",
github::latest_release_url(GH_OWNER, GH_REPO)
);
let update_binary = PathBuf::from("alterware-launcher-update.exe");
let file_path = working_dir.join(&update_binary);
if update_binary.exists() {
fs::remove_file(&update_binary).unwrap();
}
let launcher_name = if cfg!(target_arch = "x86") {
"alterware-launcher-x86.exe"
} else {
"alterware-launcher.exe"
};
http_async::download_file(
&format!(
"{}/download/{}",
github::latest_release_url(GH_OWNER, GH_REPO),
launcher_name
),
&file_path,
)
.await
.unwrap();
if !file_path.exists() {
println!("Failed to download launcher update.");
return;
}
self_replace::self_replace("alterware-launcher-update.exe").unwrap();
fs::remove_file(&file_path).unwrap();
// restarting spawns a new console, automation should manually restart on exit code 201
if !update_only {
let restart_error = restart().to_string();
println!("Failed to restart launcher: {}", restart_error);
println!("Please restart the launcher manually.");
misc::stdin();
}
std::process::exit(201);
}
}

61
src/structs.rs Normal file
View File

@ -0,0 +1,61 @@
use std::path::Path;
#[derive(serde::Deserialize, serde::Serialize, Clone)]
pub struct CdnFile {
pub name: String,
pub size: u32,
pub hash: String,
}
#[derive(serde::Deserialize, serde::Serialize)]
pub struct Game<'a> {
pub engine: &'a str,
pub client: Vec<&'a str>,
pub references: Vec<&'a str>,
pub app_id: u32,
pub bonus: Vec<&'a str>,
pub delete: Vec<&'a str>,
pub required: Vec<&'a str>,
}
impl<'a> Game<'a> {
pub fn required_files_exist(&self, dir: &Path) -> bool {
for required_file in &self.required {
let file_path = dir.join(required_file);
if !file_path.exists() {
println!("Required file {} does not exist", file_path.display());
return false;
}
}
true
}
}
#[derive(serde::Deserialize, serde::Serialize)]
pub struct Config {
pub update_only: bool,
pub skip_self_update: bool,
pub download_bonus_content: bool,
pub ask_bonus_content: bool,
pub force_update: bool,
pub args: String,
#[serde(default)]
pub engine: String,
#[serde(default)]
pub use_https: bool,
}
impl Default for Config {
fn default() -> Self {
Self {
update_only: false,
skip_self_update: false,
download_bonus_content: false,
ask_bonus_content: true,
force_update: false,
args: String::default(),
engine: String::default(),
use_https: false,
}
}
}