Compare commits

...

175 Commits

Author SHA1 Message Date
aclist
7e4197cdbc fix: uncomment code
Some checks failed
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
2026-01-18 15:04:26 +09:00
aclist
c0f9d8a508
Merge pull request #267 from aclist/fix/threaded-dialog
fix/threaded dialog
2026-01-18 15:02:43 +09:00
aclist
2da2b19001
Merge branch 'testing' into fix/threaded-dialog 2026-01-18 15:01:48 +09:00
aclist
62936fa7b7 fix: threaded dialog 2026-01-18 15:00:12 +09:00
aclist
2d58bb491e
Merge pull request #264 from aclist/fix/explicit-version
Some checks failed
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
fix: explicitly use python 3.13
2026-01-17 01:19:40 +09:00
aclist
2f123da63a fix: explicitly use python 3.13 2026-01-17 01:18:40 +09:00
aclist
7016edf7cd
Merge pull request #259 from aclist/prerelease/6.0.0
Some checks failed
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
Prerelease/6.0.0
2026-01-15 05:38:25 +09:00
aclist
b630cf4080 fix: write file after wiping cache
Some checks failed
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
2026-01-15 05:13:35 +09:00
aclist
1034a5ac04 fix: store source path 2026-01-15 05:04:10 +09:00
aclist
ebc62b0b1b fix: steam deck compatible source path expansion 2026-01-15 04:30:44 +09:00
aclist
4b47ff1fe0 fix: remove duplicate line 2026-01-15 03:41:38 +09:00
aclist
e3155ad7ee fix: patch changes from testing 2026-01-15 03:08:00 +09:00
aclist
c45d9fb234
Update funcs 2026-01-15 03:02:24 +09:00
aclist
22e92e67a7
Merge branch 'dzgui' into prerelease/6.0.0 2026-01-15 03:01:14 +09:00
aclist
cb45ce7b9a chore: prepare 6.0.0 release
Some checks are pending
Mirror to Codeberg / mirror-to-codeberg (push) Waiting to run
2026-01-15 02:48:05 +09:00
aclist
236a5dd0a3
Merge pull request #256 from aclist/fix/unlink-loop
Some checks failed
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
chore: normalize checksums
2026-01-04 21:34:41 +09:00
aclist
4c10958d10 chore: normalize checksums 2026-01-04 21:33:56 +09:00
aclist
23f7140c66
Merge pull request #255 from aclist/fix/unlink-loop
fix: regression introduced in 5.8.1
2026-01-04 21:25:38 +09:00
aclist
fbcfa1fb34 fix: regression introduced in 5.8.1. 2026-01-04 21:24:06 +09:00
aclist
52f36e0d0a
Merge pull request #252 from aclist/fix/setup-whitespaces
Some checks failed
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
fix: whitespaces during setup
2025-12-28 00:03:40 +09:00
aclist
d90c069a73 chore: correct version number in changelog 2025-12-28 00:01:30 +09:00
aclist
203ca0d388 chore: update changelog 2025-12-27 23:44:54 +09:00
aclist
34ee8c6645 fix: enclose whitespaces during setup 2025-12-27 23:42:49 +09:00
aclist
0cd561b62a fix: enclose game_dir in quotes 2025-12-27 23:06:11 +09:00
aclist
b9c30b4f52 fix: encapsulate paths 2025-12-27 21:06:44 +09:00
aclist
4bcf894704 chore: update installscript branch 2025-12-27 20:41:25 +09:00
aclist
c37800795b fix: malformed vdf path discovery 2025-12-27 20:39:09 +09:00
aclist
adf8a62e8a
Merge pull request #238 from aclist/doc/port-contributing
Some checks failed
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
Doc/port contributing
2025-10-30 11:50:23 +09:00
aclist
a1d14669c7
Merge pull request #237 from aclist/doc/port-contributing
Some checks failed
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
docs: add contributing file
2025-10-30 11:49:04 +09:00
aclist
46a54cef12 docs: add contributing file 2025-10-30 11:47:10 +09:00
aclist
321384dc7b
Merge pull request #222 from aclist/release/5.8.0
Some checks failed
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
chore: release 5.8.0
2025-07-07 10:28:57 +09:00
aclist
e02f02b775 chore: update changelog
Some checks failed
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
2025-07-07 10:18:25 +09:00
aclist
de524bd2a5 chore: backports from testing 2025-07-06 12:37:29 +09:00
aclist
edee9b6234
Merge pull request #219 from aclist/feat/coc2
Some checks failed
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
feat: add code of conduct
2025-06-05 17:49:08 +09:00
aclist
cefd041e08 feat: add code of conduct 2025-06-05 17:48:38 +09:00
aclist
881b0b3008
Merge pull request #218 from aclist/feat/coc
Some checks failed
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
feat: add code of conduct
2025-06-05 17:48:05 +09:00
aclist
2a59441dbc feat: add code of conduct 2025-06-05 17:47:07 +09:00
aclist
5ab18d0796
Merge pull request #214 from aclist/release/5.7.0
Release/5.7.0
2025-04-17 22:13:38 +09:00
aclist
23e3d34947 chore: update IP checksum 2025-04-17 21:52:36 +09:00
aclist
b86dd37b50 chore: bump minor version 2025-04-17 21:50:33 +09:00
aclist
59fdd30236 docs: update changelog 2025-04-17 21:49:35 +09:00
aclist
a35bfda5f1 fix: constrain window to viewport 2025-04-17 21:47:47 +09:00
aclist
5393bf1f5f fix: more robust ping method 2025-04-17 21:43:43 +09:00
aclist
90b3aa8663
Merge pull request #209 from aclist/aclist-patch-1
chore: update CHANGELOG.md
2025-04-05 09:15:56 +09:00
aclist
728e4daf7c
chore: update CHANGELOG.md 2025-04-05 09:15:23 +09:00
aclist
7a210c7f39
Merge pull request #208 from aclist/fix/test-connection
chore: drop pre-boot check
2025-04-05 09:08:35 +09:00
aclist
459dd69359 chore: bump version 2025-04-05 09:07:02 +09:00
aclist
fbd1a355d5 chore: drop pre-boot api check 2025-04-05 09:03:29 +09:00
aclist
82d2afb1f2
Merge pull request #207 from aclist/chore/2025-03-ipdb
chore: update ip records
2025-03-16 12:18:52 +09:00
aclist
8193980878 chore: update ip records 2025-03-16 12:17:41 +09:00
aclist
acdb34d36a
Merge pull request #206 from aclist/chore/index-url
chore: update to new index url
2025-03-15 17:01:19 +09:00
aclist
d6d0b241e0 chore: update to new index url 2025-03-15 17:00:08 +09:00
aclist
f75ef947c9
Merge pull request #204 from aclist/fix/batch-queries
fix: batch queries
2025-03-05 11:15:31 +09:00
aclist
6dc9a719ee fix: split up batch queries 2025-03-05 11:13:20 +09:00
aclist
785df28f66
Merge pull request #202 from aclist/chore/backports
chore: backports
2025-02-12 20:15:51 +09:00
aclist
66e114a400 chore: backports 2025-02-10 17:54:45 +09:00
aclist
2ba07bbba8
Merge pull request #197 from aclist/dzgui
chore: merge stable onto archival branch
2025-02-09 19:55:27 +09:00
aclist
65eda05d9f
Merge pull request #200 from aclist/chore/templates-stable
chore: back up templates from stable
2025-02-09 19:54:17 +09:00
aclist
f3b3f79bfb chore: back up templates from main 2025-02-09 19:53:25 +09:00
aclist
28c7d7f949
Merge pull request #198 from aclist/fix/drop-files
chore: drop extraneous file
2025-02-09 19:02:02 +09:00
aclist
d072c8107e chore: drop extraneous file 2025-02-09 19:01:30 +09:00
aclist
0629c8a6ba
Merge pull request #196 from aclist/release/5.6.3
chore: update IP db
2025-02-09 18:56:13 +09:00
aclist
8aea4af687 chore: update IP db 2025-02-09 18:55:33 +09:00
aclist
0562d8230d
Merge pull request #195 from aclist/release/5.6.2
chore: prepare release
2025-01-24 16:40:07 +09:00
aclist
759327e932 chore: prepare release 2025-01-23 12:02:27 +09:00
aclist
36753e02f1
Merge pull request #193 from aclist/release/5.6.1
Release/5.6.1
2025-01-10 22:48:54 +09:00
aclist
2ab2e23736 docs: update readme 2025-01-10 22:45:56 +09:00
aclist
34e7b2e480 fix: jq 1.6 support 2025-01-10 22:45:25 +09:00
aclist
540d0ad7e4
Update bug_report.yml 2025-01-09 23:32:28 +09:00
aclist
47bea45111
Update feature.yml 2025-01-09 23:32:27 +09:00
aclist
d03346b56a
Update trouble.yml 2025-01-09 23:32:26 +09:00
aclist
54e0762882
Update feature.yml 2025-01-09 23:31:21 +09:00
aclist
0834a86d33
Update trouble.yml 2025-01-09 23:30:54 +09:00
aclist
c6a8841614
Update trouble.yml 2025-01-09 23:30:37 +09:00
aclist
df92acb7dc
Update bug_report.yml 2025-01-09 23:30:24 +09:00
aclist
a333571f94
Update bug_report.yml 2025-01-09 23:28:46 +09:00
aclist
05f88b6019
Update trouble.yml 2025-01-09 23:27:08 +09:00
aclist
1f31c43fe4
Update trouble.yml 2025-01-09 20:39:35 +09:00
aclist
0763416903
Update feature.yml 2025-01-09 20:39:25 +09:00
aclist
3b384c5a4d
Update bug_report.yml 2025-01-09 20:39:17 +09:00
aclist
3ab666a807
Merge pull request #190 from aclist/release/5.6.0
Release/5.6.0
2025-01-07 21:46:53 +09:00
aclist
c8f7a32284 chore: update db checksum 2025-01-07 21:39:16 +09:00
aclist
a070e9fc65 chore: drop unused log file 2025-01-07 20:54:03 +09:00
aclist
5f55e3c664 Merge branch 'release/5.6.0' of github.com:aclist/dztui into release/5.6.0 2025-01-07 20:52:58 +09:00
aclist
07606d8852 docs: update changelog 2025-01-07 20:51:57 +09:00
aclist
afffc90abc
Update trouble.yml 2025-01-07 19:55:31 +09:00
aclist
70db7b45b3
Update trouble.yml 2025-01-07 19:54:19 +09:00
aclist
aac8558079
Update trouble.yml 2025-01-07 19:53:15 +09:00
aclist
ac8ff2febf
Update trouble.yml 2025-01-07 19:52:29 +09:00
aclist
6369d895fd
Update feature.yml 2025-01-07 19:51:58 +09:00
aclist
7413f7c029
Update bug_report.yml 2025-01-07 19:51:46 +09:00
aclist
3f1d8cb24f
Merge branch 'dzgui' into release/5.6.0 2025-01-07 00:59:57 +09:00
aclist
4df12605fc chore: update changelog 2025-01-07 00:55:58 +09:00
aclist
2c5da88e06
Update bug_report.yml 2025-01-06 20:28:34 +09:00
aclist
3cb6175436
Update feature.yml 2025-01-06 20:28:23 +09:00
aclist
3739f19ab2
Update trouble.yml 2025-01-06 20:28:12 +09:00
aclist
2da4d001d6
Update trouble.yml 2025-01-06 20:27:30 +09:00
aclist
5d61a1f513
Update trouble.yml 2025-01-06 20:26:29 +09:00
aclist
56c80d187b
Update trouble.yml 2025-01-06 20:26:20 +09:00
aclist
e08f66cdcb
Update trouble.yml 2025-01-06 20:25:22 +09:00
aclist
48fee301bb
Update trouble.yml 2025-01-06 20:24:47 +09:00
aclist
20511f5661
Update trouble.yml 2025-01-06 20:24:14 +09:00
aclist
d2e8333ba9
Update trouble.yml 2025-01-06 20:21:10 +09:00
aclist
5d37039064
Update trouble.yml 2025-01-06 20:20:57 +09:00
aclist
ce44cdbc54
Update trouble.yml 2025-01-06 20:20:36 +09:00
aclist
5b2738420e
Create trouble.yml 2025-01-06 20:19:41 +09:00
aclist
1e29288e2a
Update feature.yml 2025-01-06 20:10:08 +09:00
aclist
745cc06091
Update feature.yml 2025-01-06 20:09:08 +09:00
aclist
0311cc8a95
Create feature.yml 2025-01-06 20:08:29 +09:00
aclist
7c3521cf97
Delete .github/ISSUE_TEMPLATE/feature.md 2025-01-06 20:08:16 +09:00
aclist
bb0eefadd2
Delete .github/ISSUE_TEMPLATE/test.yml 2025-01-06 20:03:41 +09:00
aclist
7eb5a4fac5
Update bug_report.yml 2025-01-06 20:02:52 +09:00
aclist
ebce329c3d
Delete .github/ISSUE_TEMPLATE/bug_report.md 2025-01-06 20:02:38 +09:00
aclist
23464d3b51
Update bug_report.yml 2025-01-06 20:01:30 +09:00
aclist
602a7b8edc
Update bug_report.yml 2025-01-06 19:59:20 +09:00
aclist
59c58a1df5
Update bug_report.yml 2025-01-06 19:57:56 +09:00
aclist
830318d98e
Update bug_report.yml 2025-01-06 19:57:00 +09:00
aclist
271c3e6197
Update bug_report.yml 2025-01-06 19:56:39 +09:00
aclist
1ab9634069
Update bug_report.yml 2025-01-06 19:54:29 +09:00
aclist
8666b0055a
Update bug_report.yml 2025-01-06 19:53:52 +09:00
aclist
406554e011
Create bug_report.yml 2025-01-06 19:50:39 +09:00
aclist
5334d07f7f
Create test.yml 2025-01-06 19:41:34 +09:00
aclist
6cab96d1f8
Create config.yml 2025-01-06 19:39:18 +09:00
aclist
bc94d989d4
Delete .github/feature.md 2025-01-06 19:37:57 +09:00
aclist
e4fff5f242
Create feature.md 2025-01-06 19:37:38 +09:00
aclist
53f2fe922a
Create feature.md 2025-01-06 19:37:00 +09:00
aclist
800f68a1b7
Update bug_report.md 2025-01-06 19:32:55 +09:00
aclist
c6c377e8b9
Update bug_report.md 2025-01-06 19:30:16 +09:00
aclist
7a68d7e097
Update issue templates 2025-01-06 19:27:44 +09:00
aclist
f60a6edf2b
Merge pull request #182 from aclist/patch/yaml
Patch/yaml
2024-12-25 14:21:49 +09:00
aclist
8c33a1b371 chore: drop branch logic 2024-12-25 14:21:24 +09:00
aclist
e5f7391b89 chore: add YAML file 2024-12-25 14:20:36 +09:00
aclist
a8f51280e8
Update mirror.yml 2024-12-25 14:19:04 +09:00
aclist
c19346529b
Update mirror.yml 2024-12-25 14:12:08 +09:00
aclist
85451f765b
Update mirror.yml 2024-12-25 14:09:54 +09:00
aclist
5a144f7815
Merge pull request #179 from jiriks74/add_mirror_action
feat(ci): Add workflow for pushing to Codeberg
2024-12-25 12:42:58 +09:00
jiriks74
2370e81403
feat(ci): Add workflow for pushing to Codeberg 2024-12-17 17:24:32 +01:00
aclist
c11511abff Merge pull request 'chore: backports into stable' (#5) from release/testing-backports into dzgui
Reviewed-on: https://codeberg.org/aclist/dztui/pulls/5
2024-12-13 01:50:01 +00:00
aclist
bda7223ac8
Merge pull request #176 from aclist/release/testing-backports
Release/testing backports
2024-12-13 10:47:54 +09:00
aclist
6b48ee127d chore: backports into stable 2024-12-13 10:45:39 +09:00
aclist
aa8a52bfc0 Merge pull request 'release/readme' (#4) from release/readme into dzgui
Reviewed-on: https://codeberg.org/aclist/dztui/pulls/4
2024-12-12 09:33:32 +00:00
aclist
8ea62434ee docs: update docs link 2024-12-12 18:32:44 +09:00
aclist
baeaeb1b64 docs: update README 2024-12-12 17:57:27 +09:00
aclist
32b424da5c fix: update installscript 2024-12-12 12:25:26 +09:00
aclist
d71110d0a1 fix: url syntax 2024-12-12 12:10:04 +09:00
aclist
bc9178d2de fix: triage hotfix from testing 2024-12-12 11:56:10 +09:00
aclist
1533febf9a
Merge pull request #172 from aclist/release/5.5.1
fix: backport hotfix (#168)
2024-12-03 20:10:29 +09:00
aclist
c3c8872fad fix: backport hotfix (#168) 2024-12-03 20:09:19 +09:00
aclist
bae6a57e1e
Merge pull request #164 from aclist/dzgui
5.5.0 backports
2024-11-11 09:35:17 +09:00
aclist
3bdc0057a2
Merge pull request #163 from aclist/release/5.5.0-stable
Release/5.5.0 stable
2024-11-11 09:22:06 +09:00
aclist
5496f914f2
fix: correct typo 2024-11-11 09:17:47 +09:00
aclist
cb9db55bcb
Merge branch 'dzgui' into release/5.5.0-stable 2024-11-11 06:08:47 +09:00
aclist
c0ab8111fd chore: bump version 2024-11-11 06:05:56 +09:00
aclist
10c6a79b17 chore: normalize changelog 2024-11-11 06:05:49 +09:00
aclist
2b4b533a5b
Merge pull request #156 from aclist/release/5.4.2
Release/5.4.2
2024-10-06 03:31:10 +09:00
aclist
dcb8be9132 chore: update checksum 2024-10-06 03:27:49 +09:00
aclist
278aa8c28a chore: update checksum 2024-10-06 03:26:24 +09:00
aclist
32e5bafb33
Merge branch 'dzgui' into release/5.4.2 2024-10-06 03:25:16 +09:00
aclist
59e19510e3
Merge pull request #152 from aclist/release/5.4.1
Release/5.4.1
2024-09-28 20:51:19 +09:00
aclist
45ab112970
Merge branch 'dzgui' into release/5.4.1 2024-09-25 23:11:28 +09:00
aclist
ed07fd0343 chore: normalize changelog 2024-09-25 23:08:29 +09:00
aclist
c2c7b37b90
Merge pull request #151 from aclist/release/5.3.0-backports
Release/5.3.0 backports
2024-09-09 17:16:31 +09:00
aclist
23798c91d3
Merge pull request #149 from aclist/release/5.3.0
chore: normalize version
2024-09-01 13:19:35 +09:00
aclist
659cbb83a3 chore: normalize version 2024-09-01 13:19:16 +09:00
aclist
32c467fc6d
Merge pull request #147 from aclist/release/5.3.3
Release/5.3.3 (stable)
2024-09-01 13:13:54 +09:00
aclist
d01add3573 docs: update changelog 2024-08-29 22:11:49 +09:00
aclist
0de89a3ef1 add: set WM_CLASS name 2024-08-28 08:44:13 +09:00
aclist
5686ea76c2 fix: boolean operator 2024-08-28 08:09:32 +09:00
aclist
5fda598173 chore: update url 2024-08-28 07:31:14 +09:00
aclist
049fb47019 chore: normalize version 2024-08-28 07:30:38 +09:00
aclist
81f269b71b chore: normalize changelog 2024-08-28 07:29:02 +09:00
aclist
c97a7a260f
Merge pull request #133 from aclist/docs/kb
docs: update API info
2024-07-14 22:26:03 +09:00
aclist
b715eb5a3e
Merge pull request #132 from aclist/docs/kb
docs: fix url
2024-07-06 20:45:12 +09:00
aclist
8e6cf7e792
Merge pull request #126 from aclist/dzgui
backports
2024-06-23 12:51:24 +09:00
aclist
98868073a5
Merge pull request #124 from aclist/dzgui
backports
2024-06-23 12:00:35 +09:00
4 changed files with 204 additions and 161 deletions

View File

@ -1,5 +1,18 @@
# Changelog
## [6.0.2-beta.2] 2026-01-18
## Fixed
- Helpers not being downloaded (uncommented boilerplate)
## [6.0.2-beta.1] 2026-01-18
## Fixed
- Do not spawn dialogs from inside of thread when fetching prereqs
## Changed
- Optimize time complexity of startup checks
- Optimize coordinate calculation by using local records first
- Rename some internal functions
- Wrap entire startup process in dialog
## [6.0.1-beta.1] 2026-01-16
## Fixed
- Explicitly use Python 3.13 when calling subprocesses

177
dzgui.sh
View File

@ -2,8 +2,7 @@
set -o pipefail
src_path="$(readlink -e "$0")"
version=6.0.1.beta-1
version=6.0.2-beta.2
#CONSTANTS
aid=221100
@ -143,7 +142,7 @@ test_gobject(){
python3.13 -c "import gi"
if [[ ! $? -eq 0 ]]; then
logger CRITICAL "Missing PyGObject"
quit_with_pdialog "Requires PyGObject (python-gobject)"
quit_with_help_dialog "Requires PyGObject (python-gobject)"
exit 1
fi
logger INFO "Found PyGObject in Python env"
@ -248,7 +247,7 @@ open_url(){
xdg-open "$url"
fi
}
quit_with_pdialog(){
quit_with_help_dialog(){
local sel
msg="$1"
help_button="Open help page"
@ -261,7 +260,7 @@ quit_with_pdialog(){
check_pyver(){
if [[ ! $(python3.13 --version) ]]; then
local msg="Requires Python 3.13"
quit_with_pdialog "$msg"
quit_with_help_dialog "$msg"
fi
}
watcher_deps(){
@ -336,6 +335,7 @@ check_unmerged(){
fi
}
check_version(){
echo "# Checking version"
[[ -n $reference_branch ]] && return
local version_url=$(format_version_url)
local upstream=$(curl -Ls "$version_url" | awk -F= '/^version=/ {print $2}')
@ -415,6 +415,7 @@ test_display_mode(){
fi
}
check_architecture(){
echo "# Checking system architecture"
local cpu=$(< /proc/cpuinfo awk -F": " '/AMD Custom APU [0-9]{4}$/ {print $2; exit}')
read -a APU_MODEL <<< "$cpu"
if [[ ${APU_MODEL[3]} != "0932" ]] && [[ ${APU_MODEL[3]} != "0405" ]]; then
@ -431,6 +432,7 @@ check_architecture(){
logger INFO "Setting architecture to 'Steam Deck'"
}
check_map_count(){
echo "# Checking map count"
[[ $is_steam_deck -gt 0 ]] && return 0
local map_count_file="/proc/sys/vm/max_map_count"
local min_count=1048576
@ -480,6 +482,7 @@ tdialog(){
$steamsafe_zenity --info --text="$1" "${zenity_flags[@]}"
}
steam_deps(){
echo "# Checking Steam"
local flatpak
local steam
[[ $(command -v flatpak) ]] && flatpak=$(flatpak list | grep valvesoftware.Steam)
@ -490,16 +493,8 @@ steam_deps(){
exit 1
fi
}
migrate_files(){
if [[ ! -f $config_path/dztuirc.oldapi ]]; then
cp $config_file $config_path/dztuirc.oldapi
logger INFO "Migrated old API file"
fi
[[ ! -f $hist_file ]] && return
rm $hist_file
logger INFO "Wiped old history file"
}
stale_symlinks(){
echo "# Cleaning stale symlinks"
local game_dir="$steam_path/steamapps/common/DayZ"
readarray -t links < <(find "$game_dir" -xtype l)
for link in "${links[@]}"; do
@ -513,7 +508,7 @@ check_availability() {
return 1
fi
local url=$1
local timeout_sec="3"
local timeout_sec="1"
if [[ $2 ]]; then
timeout_sec=$2
fi
@ -524,6 +519,7 @@ check_availability() {
}
local_latlon(){
echo "# Checking coordinates"
if [[ -z $(command -v dig) ]]; then
local url_ipecho="https://ipecho.net/plain"
if ! check_availability "ipecho.net"; then
@ -535,6 +531,9 @@ local_latlon(){
# TODO : implement checking remote
local local_ip=$(dig -4 +short myip.opendns.com @resolver1.opendns.com)
fi
if calc_local_coords "$local_ip"; then
return 0
fi
local url_ip_api="http://ip-api.com/json/$local_ip"
if ! check_availability "ip-api.com"; then
logger WARN "Failed to get local coordinates, ip-api.com service may be down."
@ -549,6 +548,7 @@ local_latlon(){
}
lock(){
echo "# Setting up lock file"
[[ ! -f $lock_file ]] && touch $lock_file
local pid=$(cat $lock_file)
ps -p $pid -o pid= >/dev/null 2>&1
@ -626,10 +626,10 @@ fetch_helpers_by_sum(){
[[ -f "$config_file" ]] && source "$config_file"
declare -A sums
sums=(
["funcs"]="2a71d60974f5a869ff170366fd80676f"
["funcs"]="69e83db00cbc7674e241565c88aed83d"
["query_v2.py"]="55d339ba02512ac69de288eb3be41067"
["servers.py"]="ed442c3aecf33f777d59dcf53650d263"
["ui.py"]="3d67e5e8e85a23dde1fd0e85a9be62a9"
["ui.py"]="d09b9d8bed3854efd51377289786c5ac"
["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397"
["pefile.py"]="21531f2c0d9dfa5f110cf6779f9d22c0"
)
@ -691,12 +691,12 @@ fetch_km_helper(){
}
get_response_code(){
local url="$1"
curl -Ls -I -o /dev/null -w "%{http_code}" "$url"
curl --connect-timeout 3 -Ls -I -o /dev/null -w "%{http_code}" "$url"
}
fetch_ip_db(){
parse_dl_url(){
curl -Ls "$url" \
curl --connect-timeout 3 -Ls "$url" \
| grep "csv.gz" \
| awk -F"['']" '{print $2}'
}
@ -712,6 +712,9 @@ fetch_ip_db(){
fetch(){
logger INFO "Triggering fetch routine"
local url="$1"
local ip_file="${state_path}/ips.csv"
local base_file="${state_path}/${this_month}.csv.gz"
local extracted_file="${state_path}/${this_month}.csv"
curl -Ls "$url" > "$base_file"
if [[ $? -ne 0 ]]; then
@ -731,7 +734,7 @@ fetch_ip_db(){
logger WARN "Abnormal exit while parsing IPs"
return
fi
rm "${state_path}/${month}.csv"
rm "${state_path}/${this_month}.csv"
readarray -t records < <(cat $ip_file | awk -F, 'NR==1 {print $1} END {print $1}')
if [[ ${records[0]} != "0.0.0.0" ]] && [[ ${records[1]} != "224.0.0.0" ]]; then
@ -746,55 +749,57 @@ fetch_ip_db(){
rm "$ip_file"
fi
echo "$month" > "$month_file"
logger INFO "Wrote '$month' to stub '$month_file'"
echo "$this_month" > "$month_file"
logger INFO "Wrote '$this_month' to stub '$month_file'"
logger INFO "Updated '$ip_file'"
}
check_remote(){
local url="$1"
local res=$(get_response_code "$url")
if [[ $res -ne 200 ]]; then
logger WARN "Failed to retrieve remote resource: '$url' ($res)"
return
fi
logger INFO "Resolved remote URL: '$url'"
# test dl url
local dl_url="$(parse_dl_url)"
local res=$(get_response_code "$dl_url")
if [[ $res -ne 200 ]]; then
logger WARN "Remote resource unavailable: '$dl_url' ($res)"
return
fi
logger INFO "Resolved download URL: '$dl_url'"
fetch "$dl_url"
}
local url="https://db-ip.com/db/download/ip-to-city-lite"
local month_file="${state_path}/.month"
local ip_file="${state_path}/ips.csv"
# test main url
local res=$(get_response_code "$url")
if [[ $res -ne 200 ]]; then
logger WARN "Failed to retrieve remote resource: '$url' ($res)"
return
fi
logger INFO "Resolved remote URL: '$url'"
# test dl url
local dl_url="$(parse_dl_url)"
local res=$(get_response_code "$dl_url")
if [[ $res -ne 200 ]]; then
logger WARN "Remote resource unavailable: '$dl_url' ($res)"
return
fi
logger INFO "Resolved download URL: '$dl_url'"
local month=$(parse_dl_url_date "$dl_url")
local base_file="${state_path}/${month}.csv.gz"
local extracted_file="${state_path}/${month}.csv"
month_file="${state_path}/.month"
this_month=$(date +%Y-%m)
# no stub file
if [[ ! -f $month_file ]]; then
logger WARN "No stub file '$month_file' present"
fetch "$dl_url"
return
fi
# local needs update
local last_month=$(< "$month_file")
if [[ $last_month != "$month" ]]; then
logger WARN "Local stub '$last_month' does not match remote stub '$month'"
fetch "$dl_url"
check_remote "$url"
return
fi
# if stub is same date, abort
logger INFO "Local stub '$last_month' is identical to remote, skipping"
local last_month=$(< "$month_file")
if [[ $last_month == "$this_month" ]]; then
logger INFO "Local stub '$last_month' is identical to remote, skipping"
return
fi
# local needs update
logger WARN "Local stub '$last_month' does not match '$this_month'"
check_remote "$url"
return
}
fetch_helpers(){
echo "# Checking helper files"
fetch_a2s
fetch_dzq
fetch_km_helper
@ -982,6 +987,7 @@ create_config(){
done
}
varcheck(){
echo "# Checking config file"
local msg="Config file '$config_file' missing. Start first-time setup now?"
local msg2="The Steam paths set in your config file appear to be invalid (DayZ was moved or uninstalled). Restart first-time setup now?"
if [[ ! -f $config_file ]]; then
@ -1008,12 +1014,14 @@ varcheck(){
fi
}
is_dzg_downloading(){
echo "# Checking DayZ"
if [[ -d $steam_path ]] && [[ -d $steam_path/downloading/$aid ]]; then
logger WARN "DayZ may be scheduling updates"
return 0
fi
}
is_steam_running(){
echo "# Checking Steam"
local res=$(ps aux | grep "steamwebhelper" | grep -v grep)
if [[ -z $res ]]; then
logger WARN "Steam may not be running"
@ -1026,6 +1034,7 @@ get_response_code(){
curl -Ls -I -o /dev/null -w "%{http_code}" "$url"
}
test_connection(){
echo "# Testing connection"
declare -A hr
local res1
local res2
@ -1059,6 +1068,7 @@ legacy_cols(){
mv $cols_file.new $cols_file
}
stale_mod_signatures(){
echo "# Checking stale mods"
[[ ! -f "$versions_file" ]] && return
local workshop_dir="$steam_path/steamapps/workshop/content/$aid"
if [[ -d $workshop_dir ]]; then
@ -1072,18 +1082,48 @@ stale_mod_signatures(){
}
create_new_links(){
echo "# Setting up symlinks"
"$func_helper" "update_symlinks"
}
calc_local_coords(){
local ip="$1"
[[ ! -f "$geo_helper" ]] && return 1
IFS="." read -ra split <<< "$ip"
[[ ${#split[@]} -ne 4 ]] && return 1
prefix="^${split[0]}.${split[1]}."
readarray -t res < <(grep "$prefix" "$geo_helper")
for address in "${res[@]}"; do
IFS="," read -ra fields <<< "$address"
upper="${fields[1]}"
IFS="." read -ra upper_digits <<< "$upper"
if [[ ${split[2]} -gt ${upper_digits[2]} ]]; then
continue
fi
if [[ ${split[2]} -eq ${upper_digits[2]} ]]; then
if [[ ${split[3]} -gt ${upper_digits[3]} ]]; then
continue
fi
if [[ ${split[3]} -eq ${upper_digits[3]} ]]; then
echo "${fields[-2]}" >> "$coords_file"
echo "${fields[-1]}" >> "$coords_file"
return 0
fi
fi
if [[ ${split[2]} -lt ${upper_digits[2]} ]]; then
echo "${fields[-2]}" >> "$coords_file"
echo "${fields[-1]}" >> "$coords_file"
return 0
fi
done
return 1
}
initial_setup(){
setup_dirs
setup_state_files
depcheck
check_pyver
test_gobject
watcher_deps
check_architecture
test_connection
fetch_helpers > >(pdialog "Checking helper files")
fetch_helpers
varcheck
source "$config_file"
lock
@ -1092,14 +1132,12 @@ initial_setup(){
check_version
check_map_count
steam_deps
migrate_files
stale_symlinks
stale_mod_signatures
create_new_links
local_latlon
is_steam_running
is_dzg_downloading
print_config_vals
}
uninstall(){
_full(){
@ -1201,8 +1239,15 @@ main(){
set_im_module
printf "Initializing setup...\n"
initial_setup
printf "Checking dependencies...\n"
setup_dirs
setup_state_files
depcheck
check_pyver
test_gobject
watcher_deps
initial_setup > >(pdialog "Initializing setup")
printf "All OK. Kicking off UI...\n"
python3.13 "$ui_helper" "--init-ui" "$version" "$is_steam_deck"

View File

@ -1,6 +1,6 @@
#!/usr/bin/env bash
set -o pipefail
version="6.0.1-beta.1"
version="6.0.2-beta.1"
#CONSTANTS
aid=221100

View File

@ -19,7 +19,7 @@ from collections.abc import Callable
from concurrent.futures import wait
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
from typing import Literal, Self, Any
from typing import Literal, Self, Any, TYPE_CHECKING
import servers as Servers # noqa E402
import pefile as PeFile # noqa E402
@ -32,10 +32,12 @@ from pefile import (
)
from pefile import VersionMatch
if TYPE_CHECKING:
from servers import Prereqs
locale.setlocale(locale.LC_ALL, "")
import gi # noqa E402
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa E402
@ -1027,13 +1029,7 @@ def process_tree_option(choice: RowType) -> None:
return
record = str_to_record(record)
thread_new_with_dialog(
App.treeview.prepare_connection,
parse_shell_output,
"Querying server",
command,
[record],
)
prepare_connection(command, record)
return
match command.dict["type"]:
@ -1061,48 +1057,54 @@ def parse_shell_output(proc: subprocess.CompletedProcess, row: RowType):
process_shell_return_code(msg, proc.returncode, row)
def thread_new_with_dialog(
func: Callable,
callback: Callable | None,
msg: str,
row: RowType | None,
args: list,
def prepare_connection(rowtype: RowType, record: Record) -> None:
def background(rowtype: RowType, record: Record) -> None:
def cleanup() -> None:
App.treeview.wait_dialog.destroy()
# NOTE: When using RowType.CONN_BY_IP, the gameport needs to be interpolated
record.gameport = prereqs.gameport
addr = record_to_str(record)
if proceed is False:
spawn_dialog(msg, Popup.NOTIFY)
return
if msg != "":
res = spawn_dialog(msg, Popup.CONFIRM)
if res is False:
try_connect(addr, str(prereqs.appid), str(pefile_path), rowtype)
else:
try_connect(addr, str(prereqs.appid), str(pefile_path), rowtype)
proceed, msg, pefile_path, prereqs = App.treeview.get_prereqs(record)
GLib.idle_add(cleanup)
msg = "Checking prerequisites"
App.treeview.dialog_show(msg)
thread = threading.Thread(target=background, args=(rowtype, record))
thread.start()
def try_connect(
addr: str,
appid: str,
path: str,
row: RowType
) -> None:
"""
Pop a GenericDialog transient to App.treeview and
call a function on a thread, with optional callback.
Chiefly used for connection-related subprocesses.
After completion, the dialog is destroyed in the main event loop
and additional exception handling occurs.
This is intended as a bridge between legacy shell methods and the UI.
A more abstracted version of call_on_thread() for when extra threaded
processing occurs before calls to shell subprocesses.
"""
def background(*args):
def background(addr, appid, path):
def cleanup():
App.treeview.dialog_hide()
if exception is not None:
spawn_dialog(str(exception), Popup.NOTIFY)
process_user_input(row)
return
if callback is not None and proc is not None:
callback(proc, row)
parse_shell_output(proc, row)
exception = None
proc = None
try:
proc = func(*args)
proc = call_out("try_connect", addr, appid, path)
except Exception as e:
exception = e
logger.critical(e)
GLib.idle_add(cleanup)
return
GLib.idle_add(cleanup)
msg = "Querying server"
App.treeview.dialog_show(msg)
thread = threading.Thread(target=background, args=(args))
thread = threading.Thread(target=background, args=(addr, appid, path))
thread.start()
@ -1142,27 +1144,31 @@ def record_to_str(record: Record) -> str:
def connect_by_ip(enum: RowType, response: str) -> None:
def _prep(response: str) -> None:
try:
record = Servers.validate_ip(response)
proc = App.treeview.prepare_connection(record)
return proc
thread_new_with_dialog(
_prep, parse_shell_output, "Querying IP", enum, [response]
)
return
except Exception as e:
spawn_dialog(str(e), Popup.NOTIFY)
return
prepare_connection(enum, record)
def connect_by_id(enum: RowType, response: str, key: str) -> None:
def _prep(key: str, response: str) -> None:
record = Servers.query_bm_api(key, response)
proc = App.treeview.prepare_connection(record)
return proc
def cleanup() -> None:
App.treeview.dialog_hide()
prepare_connection(enum, record)
thread_new_with_dialog(
_prep, parse_shell_output, "Querying API", enum, [key, response]
)
return
try:
record = Servers.query_bm_api(key, response)
except Exception as e:
spawn_dialog(str(e), Popup.NOTIFY)
App.treeview.dialog_hide()
return
GLib.idle_add(cleanup)
msg = "Validating ID"
App.treeview.dialog_show(msg)
thread = threading.Thread(target=_prep, args=(key, response))
thread.start()
def process_user_input(enum: RowType) -> None:
@ -2493,6 +2499,8 @@ class TreeView(Gtk.TreeView):
def _dump_servers(self, ips: list) -> list | None:
if len(ips) == 0:
return []
# NOTE: block malformed records
ips = [ip for ip in ips if len(ip.split(":")) == 3 and ip.split(":")[2] != "" ]
with ThreadPoolExecutor() as executor:
futures = [
executor.submit(
@ -2943,9 +2951,9 @@ class TreeView(Gtk.TreeView):
def get_view(self):
return self.view
def prepare_connection(
def get_prereqs(
self, record: Record
) -> subprocess.CompletedProcess | None:
) -> tuple[bool, str, str|None, "Prereqs"]:
"""
Always called on a thread with a dialog on the transient parent window
"""
@ -2953,8 +2961,7 @@ class TreeView(Gtk.TreeView):
if prereqs.appid is None:
logger.warning(f"Query to '{record.ip}:{record.qport}' timed out")
msg = "Timed out when querying server, check IP or try again later"
spawn_dialog(msg, Popup.NOTIFY)
return None
return (False, msg, None, prereqs)
build = "DayZ" if prereqs.appid == APPID_DAYZ else "DayZ Experimental"
steam_path = query_config("default_steam_path")[0]
@ -2964,8 +2971,7 @@ class TreeView(Gtk.TreeView):
"Config file has no value set for 'default_steam_path'"
)
msg = "Local Steam installation is not set, possibly malformed config file."
spawn_dialog(msg, Popup.NOTIFY)
return None
return (False, msg, None, prereqs)
try:
pefile_path = PeFile.get_pefile_path(steam_path, prereqs.appid)
@ -2979,8 +2985,7 @@ class TreeView(Gtk.TreeView):
f"If you recently installed {build} or moved it to a different drive, "
"restart Steam to allow these changes to synchronize, then try again."
)
spawn_dialog(msg, Popup.NOTIFY)
return None
return (False, msg, None, prereqs)
except AppMovedError:
logger.critical(
f"Library folder synch error for '{prereqs.appid}'"
@ -2990,13 +2995,11 @@ class TreeView(Gtk.TreeView):
f"If you recently installed {build} or moved it to a different drive, "
"restart Steam to allow these changes to synchronize, then try again."
)
spawn_dialog(msg, Popup.NOTIFY)
return None
return (False, msg, None, prereqs)
except (VDFLoadError, PeFileError, Exception) as e:
logger.critical(e)
msg = "Steam settings or DayZ installation may be corrupted. Try restarting Steam."
spawn_dialog(msg, Popup.NOTIFY)
return None
return (False, msg, None, prereqs)
try:
local_vers = PeFile.get_dayz_version(pefile_path)
@ -3008,7 +3011,7 @@ class TreeView(Gtk.TreeView):
local_vers = None
try:
remote_vers = PeFile.dayz_version_from_str(prereqs.version)
remote_vers = PeFile.dayz_version_from_str(prereqs)
except Exception:
remote_vers = None
@ -3021,18 +3024,15 @@ class TreeView(Gtk.TreeView):
f"This server is running a newer build ({prereqs.version}) of {build} than "
f"your local version. You may be unable to connect. Proceed anyway?"
)
res = spawn_dialog(msg, Popup.CONFIRM)
if res is True:
return None
return (True, msg, pefile_path, prereqs)
case VersionMatch.LOCAL_NEWER:
msg = (
f"This server is running an out-of-date build ({prereqs.version}) of {build}. "
"You may be unable to connect. Proceed anyway?"
)
res = spawn_dialog(msg, Popup.CONFIRM)
if res is True:
return None
return (True, msg, pefile_path, prereqs)
case VersionMatch.SAME_VERSION:
return (True, "", pefile_path, prereqs)
pass
if prereqs.password is True:
@ -3040,19 +3040,10 @@ class TreeView(Gtk.TreeView):
"This server is password-protected and you will be "
"prompted when connecting. Do you want to proceed?"
)
res = spawn_dialog(msg, Popup.CONFIRM)
if res is True:
return None
return (True, msg, pefile_path, prereqs)
return (True, "", pefile_path, prereqs)
"""
When using RowType.CONN_BY_IP, the gameport needs to be interpolated
"""
record.gameport = prereqs.gameport
addr = record_to_str(record)
proc = call_out(
"try_connect", addr, str(prereqs.appid), str(pefile_path)
)
return proc
@signal_emission
@update_window_labels
@ -3122,13 +3113,7 @@ class TreeView(Gtk.TreeView):
record = self.get_record()
if record is None:
return
thread_new_with_dialog(
self.prepare_connection,
parse_shell_output,
"Querying server",
None,
[record],
)
prepare_connection(None, record)
case _: # any other non-server option from the main menu
process_tree_option(output)