Compare commits
26 Commits
73eae30395
...
f46cea0ab8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f46cea0ab8 | ||
|
|
506c82e86a | ||
|
|
7e45cb0fa2 | ||
|
|
3729d3c656 | ||
|
|
773d24a00c | ||
|
|
08f1f9f4d1 | ||
|
|
ec7daf7f6b | ||
|
|
d0de2974d8 | ||
|
|
5a54d43601 | ||
|
|
1dfe9cd9df | ||
|
|
f2124218e4 | ||
|
|
cf087d96c7 | ||
|
|
6bb59f4060 | ||
|
|
d53476399d | ||
|
|
d34293e2c8 | ||
|
|
f82df9eacf | ||
|
|
23fb10f48e | ||
|
|
eeca71fc25 | ||
|
|
89f37ab70d | ||
|
|
9d1ee7e130 | ||
|
|
9a37cebe47 | ||
|
|
239f806f7e | ||
|
|
54e2d2feaa | ||
|
|
796dcd5588 | ||
|
|
35f1f180d2 | ||
|
|
fe40a5e54f |
16
CHANGELOG.md
@ -1,5 +1,21 @@
|
||||
# Changelog
|
||||
|
||||
## [6.0.0-beta.8] XXXX-XX-XX
|
||||
## Added
|
||||
- Flag to disable branch toggle for distro-packaged releases
|
||||
- Test whether script was sourced inline
|
||||
- Commandline usage help text
|
||||
|
||||
## Fixed
|
||||
- ESC key destroying wait dialogs while thread is pending
|
||||
- Tooltip signals being processed on main menu
|
||||
- Leaky variable name in dialog title
|
||||
- Prevent extraneous signals from propagating when column width is adjusted
|
||||
- Script failing to start when remote endpoints are unavailable
|
||||
|
||||
## Changed
|
||||
- Optimize time cost of setup checks
|
||||
|
||||
## [6.0.0-beta.7] 2025-09-20
|
||||
## Added
|
||||
- Users can save text notes to describe servers
|
||||
|
||||
@ -1,16 +1,15 @@
|
||||
# Introduction
|
||||
|
||||
Thank you for considering contributing to DZGUI!
|
||||
Thank you for your interest in DZGUI!
|
||||
|
||||
This is a guide for contributors containing conventions best practices and rules
|
||||
of development and aims to ease the beginning of a contribution.
|
||||
This guide goes over development conventions and best practices for contributors.
|
||||
If you are a developer, you can skip to the end.
|
||||
|
||||
# How can I request help?
|
||||
# Requesting help
|
||||
|
||||
There is an issue tracker on github
|
||||
(link)[https://github.com/aclist/dzgui-devel/issues] where you can submit
|
||||
tickets. If you need help troubleshooting a problem, submit a ticket. There is a
|
||||
category called `troubleshooting` which is exactly what you need.
|
||||
If you encounter a problem with DZGUI, you can submit tickets on the GitHub
|
||||
(issue tracker)[https://github.com/aclist/dzgui-devel/issues] under the
|
||||
`troubleshooting` tag.
|
||||
|
||||
# How can I help the project?
|
||||
|
||||
@ -23,44 +22,48 @@ There are several ways to help this project.
|
||||
Before making any contribution, please read the `CODE_OF_CONDUCT.md` and act
|
||||
accordingly.
|
||||
|
||||
## How to report
|
||||
## Submitting a ticket
|
||||
|
||||
Navigate to the GitHub (issue tracker)[https://github.com/aclist/dzgui-devel/issues].
|
||||
From there, follow the onscreen prompts. You will be asked questions such as:
|
||||
|
||||
Reproduce the bug that you found. Navigate to the issue tracker on github:
|
||||
(link)[https://github.com/aclist/dzgui-devel/issues]
|
||||
Create a ticket where you give us the following:
|
||||
- What version are you using?
|
||||
- What distribution are you using?
|
||||
- What is the issue that you found?
|
||||
- How can we reproduce the issue?
|
||||
- Possible screenshots, logs, other data that can help us
|
||||
|
||||
## How to request a feature
|
||||
You can also attach screenshots, logs, or other data that can help us.
|
||||
|
||||
Navigate to the projects issue tracker
|
||||
(link)[https://github.com/aclist/dzgui-devel/issues]. Search for your idea to
|
||||
see if anyone had posted a simmilar idea. If not, open a ticket where you
|
||||
describe your feature and its possible benefits. Please note, that this is a
|
||||
community project, it takes time for us to develop features, having a feature
|
||||
request doesn't mean that it will be implemented, but we do our best to support
|
||||
as many cool ideas as possible.
|
||||
## Requesting a feature
|
||||
|
||||
## How to contribute code or documentation
|
||||
You can also request features via the same issue tracker. It is good practice to
|
||||
first search for your idea to see if a similar one has already been posted.
|
||||
If not, open a ticket where you describe your feature and its possible benefits.
|
||||
|
||||
If you have an issue of interest in the issue tracker or any other change that
|
||||
you would like to have implemented you can contribute code to this project. For
|
||||
this, you may fork this repository and checkout to
|
||||
`prerelease/<latest-version>`. All new features and fixes will be merged to this
|
||||
branch, so open your branch from here. Name it according to our convention:
|
||||
- fix/<your-fix> - fix branches
|
||||
Please note that this is a community project, so it takes time for us to develop
|
||||
features. Putting in a feature request does not mean that it will be implemented,
|
||||
but we will do our best to support as many cool ideas as possible.
|
||||
|
||||
## Contributing code or documentation
|
||||
|
||||
If you would like to take ownership or assist with an issue on the issue tracker, or
|
||||
contribute a new change, please follow the guidelines below.
|
||||
|
||||
Fork this repository and check out the code up to `prerelease/<latest-version>`.
|
||||
All new features and fixes will be merged to this branch, so open your branch
|
||||
from here.
|
||||
|
||||
The following naming conventions apply for PRs:
|
||||
- fix/<your-fix> - patch/hotfix branches
|
||||
- feat/<your-feature> - feature branches
|
||||
- doc/<your-doc-branch> - documentation branches
|
||||
- infra/<your-infra-branch> - infrastructure branches
|
||||
|
||||
Now you can implement your changes and test it locally. If they work you may
|
||||
Implement your changes and test them locally. If they work you may
|
||||
open a merge request, and then we review your changes. If everything is OK, it
|
||||
will be merged to `prerelease/<latest-version>`, then `testing` and after a live
|
||||
testing phase, to `stable` as well.
|
||||
|
||||
During development, it is recommended to follow (conventional
|
||||
commits)[https://www.conventionalcommits.org/en/v1.0.0/], it helps the project
|
||||
maintainers when they review your code.
|
||||
It is recommended to follow
|
||||
(Conventional Commits)[https://www.conventionalcommits.org/en/v1.0.0/], as this
|
||||
integrates well with tooling and helps the project review your code.
|
||||
|
||||
139
dzgui.sh
@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
set -o pipefail
|
||||
|
||||
version=6.0.0.beta-7
|
||||
version=6.0.0.beta-8
|
||||
|
||||
#CONSTANTS
|
||||
aid=221100
|
||||
@ -63,17 +63,14 @@ testing_url="$url_prefix/testing"
|
||||
releases_url="https://github.com/$author/$repo/releases/download/browser"
|
||||
km_helper_url="$releases_url/latlon"
|
||||
|
||||
|
||||
set_im_module(){
|
||||
#TODO: drop pending SteamOS changes
|
||||
pgrep -a gamescope | grep -q "generate-drm-mode"
|
||||
if [[ $? -eq 0 ]]; then
|
||||
GTK_IM_MODULE=""
|
||||
if pgrep -a gamescope | grep -q "generate-drm-mode"; then
|
||||
unset GTK_IM_MODULE
|
||||
logger INFO "Detected Steam Deck (Game Mode), unsetting GTK_IM_MODULE"
|
||||
else
|
||||
return
|
||||
fi
|
||||
}
|
||||
|
||||
redact(){
|
||||
sed 's@\(/home/\)[^/]*@\1REDACTED@g'
|
||||
}
|
||||
@ -87,13 +84,21 @@ logger(){
|
||||
printf "%s␞%s␞%s::%s()::%s␞%s\n" "$date" "$tag" "$self" "$caller" "$line" "$string" \
|
||||
| redact >> "$debug_log"
|
||||
}
|
||||
|
||||
setup_dirs(){
|
||||
for dir in "$state_path" "$cache_path" "$share_path" "$helpers_path" "$freedesktop_path" "$config_path" "$log_path"; do
|
||||
if [[ ! -d $dir ]]; then
|
||||
directories=()
|
||||
directories+=("$state_path")
|
||||
directories+=("$cache_path")
|
||||
directories+=("$share_path")
|
||||
directories+=("$helpers_path")
|
||||
directories+=("$freedesktop_path")
|
||||
directories+=("$config_path")
|
||||
directories+=("$log_path")
|
||||
for dir in "${directories[@]}"; do
|
||||
mkdir -p "$dir"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
setup_state_files(){
|
||||
if [[ -f "$debug_log" ]]; then
|
||||
rm "$debug_log" && touch $debug_log
|
||||
@ -104,9 +109,8 @@ setup_state_files(){
|
||||
logger INFO "Migrating legacy version file"
|
||||
fi
|
||||
# wipe cache files
|
||||
local path="$cache_path"
|
||||
if find "$path" -mindepth 1 -maxdepth 1 | read; then
|
||||
for file in $path/*; do
|
||||
if [[ $(ls -A "$cache_path") ]]; then
|
||||
for file in "$cache_path"/*; do
|
||||
rm "$file"
|
||||
done
|
||||
logger INFO "Wiped cache files"
|
||||
@ -221,8 +225,7 @@ END
|
||||
}
|
||||
depcheck(){
|
||||
for dep in "${!deps[@]}"; do
|
||||
command -v "$dep" 2>&1>/dev/null
|
||||
if [[ $? -eq 1 ]]; then
|
||||
if ! command -v "$dep" &> /dev/null; then
|
||||
local msg="Requires $dep >= ${deps[$dep]}"
|
||||
raise_error_and_quit "$msg"
|
||||
fi
|
||||
@ -493,20 +496,47 @@ stale_symlinks(){
|
||||
unlink "$l"
|
||||
done
|
||||
}
|
||||
|
||||
check_availability() {
|
||||
if [[ -z $1 ]]; then
|
||||
return 1
|
||||
fi
|
||||
local url=$1
|
||||
local timeout_sec="3"
|
||||
if [[ $2 ]]; then
|
||||
timeout_sec=$2
|
||||
fi
|
||||
if ! ping -w "$timeout_sec" "$url" > /dev/null 2>&1; then
|
||||
logger WARN "Failed to reach $url, service may be down."
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
local_latlon(){
|
||||
if [[ -z $(command -v dig) ]]; then
|
||||
local local_ip=$(curl -Ls "https://ipecho.net/plain")
|
||||
local url_ipecho="https://ipecho.net/plain"
|
||||
if ! check_availability "ipecho.net"; then
|
||||
logger WARN "Failed to get external ip address, ipecho.net service may be down."
|
||||
return 1
|
||||
fi
|
||||
local local_ip=$(curl -Ls "$url_ipecho")
|
||||
else
|
||||
# TODO : implement checking remote
|
||||
local local_ip=$(dig -4 +short myip.opendns.com @resolver1.opendns.com)
|
||||
fi
|
||||
local url="http://ip-api.com/json/$local_ip"
|
||||
local res=$(curl -Ls "$url" | jq -r '"\(.lat)\n\(.lon)"')
|
||||
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."
|
||||
return 1
|
||||
fi
|
||||
local res=$(curl -Ls "$url_ip_api" | jq -r '"\(.lat)\n\(.lon)"')
|
||||
if [[ -z "$res" ]]; then
|
||||
logger WARN "Failed to get local coordinates"
|
||||
return 1
|
||||
fi
|
||||
echo "$res" > "$coords_file"
|
||||
}
|
||||
|
||||
lock(){
|
||||
[[ ! -f $lock_file ]] && touch $lock_file
|
||||
local pid=$(cat $lock_file)
|
||||
@ -585,10 +615,10 @@ fetch_helpers_by_sum(){
|
||||
[[ -f "$config_file" ]] && source "$config_file"
|
||||
declare -A sums
|
||||
sums=(
|
||||
["funcs"]="c27a81577c818b4f4d786ada52ad5042"
|
||||
["funcs"]="6ae3ead7034dc8e7543472bddee75c63"
|
||||
["query_v2.py"]="55d339ba02512ac69de288eb3be41067"
|
||||
["servers.py"]="7f83d5c1ca54acb12f1bd6657feb2ecf"
|
||||
["ui.py"]="8d6e52b3e9032acbb84ba6cf137f455a"
|
||||
["servers.py"]="ed442c3aecf33f777d59dcf53650d263"
|
||||
["ui.py"]="f03879f088ad074f2ce3c92607c30202"
|
||||
["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397"
|
||||
["pefile.py"]="21531f2c0d9dfa5f110cf6779f9d22c0"
|
||||
)
|
||||
@ -1090,13 +1120,61 @@ uninstall(){
|
||||
rm "$self"
|
||||
echo "Uninstall routine complete"
|
||||
}
|
||||
|
||||
usage(){
|
||||
cat <<- EOM
|
||||
DZGUI - Free and Open Source DayZ launcher
|
||||
|
||||
Usage:
|
||||
|
||||
dzgui.sh [options]
|
||||
|
||||
Description:
|
||||
|
||||
When no option is provided, the script launches DZGUI.
|
||||
|
||||
Options:
|
||||
|
||||
-u, --uninstall:
|
||||
Uninstalls the software
|
||||
|
||||
-v, --version:
|
||||
Prints the version
|
||||
|
||||
-h, --help:
|
||||
Prints this message
|
||||
EOM
|
||||
}
|
||||
|
||||
main(){
|
||||
local zenv=$(zenity --version 2>/dev/null)
|
||||
# setup zenity environment
|
||||
local zenv=""
|
||||
zenv=$(zenity --version 2>/dev/null)
|
||||
[[ -z $zenv ]] && { echo "Requires zenity >= ${deps[$steamsafe_zenity]}"; exit 1; }
|
||||
if [[ $1 == "--uninstall" ]] || [[ $1 == "-u" ]]; then
|
||||
uninstall &&
|
||||
|
||||
# parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
"--uninstall" | "-u")
|
||||
uninstall
|
||||
exit 0
|
||||
fi
|
||||
# shift
|
||||
;;
|
||||
"--version" | "-v")
|
||||
echo $version
|
||||
exit 0
|
||||
# shift
|
||||
;;
|
||||
"--help" | "-h")
|
||||
usage
|
||||
exit 0
|
||||
# shift
|
||||
;;
|
||||
*)
|
||||
echo "Unrecognized command!"
|
||||
return 1
|
||||
esac
|
||||
done
|
||||
|
||||
set_im_module
|
||||
|
||||
@ -1105,7 +1183,12 @@ main(){
|
||||
|
||||
printf "All OK. Kicking off UI...\n"
|
||||
python3 "$ui_helper" "--init-ui" "$version" "$is_steam_deck"
|
||||
|
||||
}
|
||||
main "$@"
|
||||
#TODO: tech debt: cruddy handling for steam forking
|
||||
[[ $? -eq 1 ]] && pkill -f dzgui.sh
|
||||
|
||||
if [[ $(basename "$0") == "dzgui.sh" ]]; then
|
||||
main "$@"
|
||||
|
||||
#TODO: tech debt: cruddy handling for steam forking
|
||||
[[ $? -eq 1 ]] && pkill -f dzgui.sh
|
||||
fi
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
set -o pipefail
|
||||
version="6.0.0-beta.7"
|
||||
version="6.0.0-beta.8"
|
||||
|
||||
#CONSTANTS
|
||||
aid=221100
|
||||
@ -369,6 +369,10 @@ local_latlon(){
|
||||
get_dist(){
|
||||
shift
|
||||
local given_ip="$1"
|
||||
if [[ ! -f $_cache_coords ]]; then
|
||||
printf "Unknown"
|
||||
return
|
||||
fi
|
||||
readarray -t coords < "$_cache_coords"
|
||||
readarray -t n < <(<<< "$given_ip" awk 'BEGIN{RS="."}{$1=$1}1')
|
||||
|
||||
|
||||
@ -87,6 +87,7 @@ def parse_json(json: list) -> list:
|
||||
except KeyError:
|
||||
continue
|
||||
|
||||
malformed = False
|
||||
for key in [
|
||||
"map",
|
||||
"gametype",
|
||||
@ -98,6 +99,10 @@ def parse_json(json: list) -> list:
|
||||
try:
|
||||
row[key]
|
||||
except KeyError:
|
||||
malformed = True
|
||||
break
|
||||
|
||||
if malformed is True:
|
||||
continue
|
||||
|
||||
try:
|
||||
@ -167,7 +172,7 @@ def parse_json(json: list) -> list:
|
||||
return rows
|
||||
|
||||
|
||||
def query_direct(ip: str, qport: int, TIMEOUT=3.0) -> dict | None:
|
||||
def query_direct(ip: str, qport: int, TIMEOUT: float=3.0) -> dict | None:
|
||||
try:
|
||||
info = a2s.info((ip, qport), TIMEOUT)
|
||||
|
||||
@ -440,7 +445,7 @@ def query_bm_api(api_key: str, bm_id: str) -> Record:
|
||||
raise BmAPIError("Failed to query Battlemetrics")
|
||||
|
||||
|
||||
def validate_ip(addr: str):
|
||||
def validate_ip(addr: str) -> Record:
|
||||
fields = addr.split(":")
|
||||
if len(fields) != 2:
|
||||
raise InvalidIpError("Address must be formatted as IP:Queryport")
|
||||
|
||||
@ -1872,6 +1872,9 @@ class TreeView(Gtk.TreeView):
|
||||
) -> bool:
|
||||
if self.is_server_context(self.view) is False:
|
||||
return
|
||||
if self.subpage is None:
|
||||
return
|
||||
|
||||
coords = widget.convert_widget_to_bin_window_coords(x, y)
|
||||
path = self.get_path_at_pos(coords.bx, coords.by)
|
||||
if path is None:
|
||||
@ -2573,7 +2576,7 @@ class TreeView(Gtk.TreeView):
|
||||
App.right_panel.filters_vbox.set_active_combo(0)
|
||||
App.grid.right_panel.filters_vbox.set_visible(True)
|
||||
for column in self.get_columns():
|
||||
column.connect("notify::width", self._on_col_width_changed)
|
||||
column.connect("notify::fixed-width", self._on_col_width_changed)
|
||||
|
||||
App.grid.statusbar.update_server_meta()
|
||||
|
||||
@ -3207,8 +3210,11 @@ class GenericDialog(Gtk.MessageDialog):
|
||||
self.outer.set_margin_end(30)
|
||||
|
||||
def _on_dialog_delete(
|
||||
self, response_id: Gtk.ResponseType
|
||||
self, response_id: Gtk.ResponseType, event: Gdk.Event
|
||||
) -> Literal[True]:
|
||||
"""
|
||||
Prevent manual dialog destruction
|
||||
"""
|
||||
return True
|
||||
|
||||
def _return_to_main_menu(self, widget: Gtk.Widget) -> None:
|
||||
@ -3232,7 +3238,7 @@ class LanDialog(Gtk.MessageDialog):
|
||||
buttons=Gtk.ButtonsType.OK_CANCEL,
|
||||
text="Scan LAN servers",
|
||||
secondary_text="Select the query port",
|
||||
title="{appname}",
|
||||
title=f"{app_name} - Dialog",
|
||||
modal=True,
|
||||
)
|
||||
|
||||
@ -3758,7 +3764,7 @@ class LeftLabel(Gtk.Label):
|
||||
|
||||
|
||||
class Options(Gtk.Box):
|
||||
def __init__(self):
|
||||
def __init__(self, self_update=True):
|
||||
super().__init__(
|
||||
orientation=Gtk.Orientation.VERTICAL,
|
||||
margin_start=10,
|
||||
@ -3835,11 +3841,18 @@ class Options(Gtk.Box):
|
||||
self.branch_combo.append_text("Testing")
|
||||
self.branch_combo.set_active(0)
|
||||
self.branch_combo.connect("changed", self._on_branch_changed)
|
||||
self.branch_combo.set_sensitive(self_update)
|
||||
|
||||
if self_update is True:
|
||||
msg = (
|
||||
"Stable: only contains stable features. "
|
||||
"Testing: pre-release beta, contains new features."
|
||||
)
|
||||
else:
|
||||
msg = (
|
||||
"In-app updates are disabled when installing "
|
||||
"DZGUI via the system package manager."
|
||||
)
|
||||
eb = InfoEventBox(msg)
|
||||
|
||||
version_rows = [
|
||||
@ -4355,7 +4368,7 @@ class Notebook(Gtk.Notebook):
|
||||
self.keys.show_all()
|
||||
self.append_page(self.keys)
|
||||
|
||||
self.settings = Options()
|
||||
self.settings = Options(self_update=True)
|
||||
self.settings.type = RowType.OPTIONS
|
||||
self.settings.show_all()
|
||||
self.append_page(self.settings)
|
||||
|
||||
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 608 KiB |
|
Before Width: | Height: | Size: 569 KiB |
|
Before Width: | Height: | Size: 417 KiB |
|
Before Width: | Height: | Size: 223 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 31 KiB |