From 9fe300cfe4c8bb9a6de0b7818a08744e2f2bae7e Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 17 Dec 2023 11:23:45 +0900 Subject: [PATCH 001/122] chore: bump version --- CHANGELOG.md | 8 ++++++-- dzgui.sh | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 187a866..db81c5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # Changelog ## [4.1.0] 2023-12-03 + +This update adds support for DayZ servers running on a local area network. To connect or add to your server list, supply the server IP and query port in the format IP:PORT. + +Support for Steam Deck Game Mode has also been restored, with a new dialog format that allows for virtual keyboard input. This should allow you to enter text in form fields by activating the Steam button + X. In addition, you can unlock the mouse and keyboard input when launching DZGUI through Steam by using an internal binding provided by Steam Deck: long-press the three dots button on the right of the device for three seconds to toggle the input state. This allows you to use mouse and keyboard-style bindings on Game Mode and vice versa. + ### Added - Virtual keyboard support for text entry fields on Steam Deck Game Mode - Validate and connect to LAN server IPs @@ -19,8 +24,7 @@ ## [4.0.1] 2023-11-22 ### Fixed -- Emergency hotfix to remove build artifacts leaking into main script: if you updated DZGUI from 3.3.18 to 4.0.0 between 2023-11-22 15:00:02 and 2023-11-22 15:03:37 GMT, there is a small chance it - will be unable to launch correctly. If so, please follow the instructions on the manual to reinstall. +- Emergency hotfix to remove build artifacts leaking into main script: if you updated DZGUI from 3.3.18 to 4.0.0 between 2023-11-22 15:00:02 and 2023-11-22 15:03:37 GMT, there is a small chance it will be unable to launch correctly. If so, please follow the instructions on the manual to reinstall. ## [4.0.0] 2023-11-22 diff --git a/dzgui.sh b/dzgui.sh index c6b3a75..e1a8085 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=4.1.0.rc-8 +version=4.2.0.rc-1 aid=221100 game="dayz" From b4301c6635f472ce13e57e3dcae6853a092b9a0a Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Mon, 18 Dec 2023 12:17:38 +0900 Subject: [PATCH 002/122] chore: backports --- CHANGELOG.md | 7 ++++++- dzgui.sh | 36 +++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db81c5d..67cfc88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # Changelog -## [4.1.0] 2023-12-03 +## [4.1.1] 2023-12-18 +### Fixed + +- News marquee not showing + +## [4.1.0] 2023-12-17 This update adds support for DayZ servers running on a local area network. To connect or add to your server list, supply the server IP and query port in the format IP:PORT. diff --git a/dzgui.sh b/dzgui.sh index e1a8085..708fd90 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -40,31 +40,33 @@ version_file="$config_path/versions" steamsafe_zenity="/usr/bin/zenity" update_last_seen(){ - mv $config_file ${config_path}dztuirc.old - nr=$(awk '/seen_news=/ {print NR}' ${config_path}dztuirc.old) - seen_news="seen_news=\"$sum\"" - awk -v "var=$seen_news" -v "nr=$nr" 'NR==nr {$0=var}{print}' ${config_path}dztuirc.old > $config_file - source $config_file + local news_sum="$1" + seen_news="$news_sum" + update_config } check_news(){ logger INFO "${FUNCNAME[0]}" - echo "# Checking news" [[ $branch == "stable" ]] && news_url="$stable_url/news" [[ $branch == "testing" ]] && news_url="$testing_url/news" local result=$(curl -Ls "$news_url") - sum=$(echo -n "$result" | md5sum | awk '{print $1}') + local sum=$(echo -n "$result" | md5sum | awk '{print $1}') + printf "%s\n%s\n" "$result" "$sum" logger INFO "News: $result" } print_news(){ + readarray -t news_result < <(check_news) + local news_marquee=${news_result[0]} + local news_sum=${news_result[1]} + local hchar + local news logger INFO "${FUNCNAME[0]}" - if [[ $sum == $seen_news || -z $result ]]; then - hchar="" - news="" - else - hchar="─" - news="$result\n$(awk -v var="$hchar" 'BEGIN{for(c=0;c<90;c++) printf var;}')\n" - update_last_seen - fi + if [[ $news_sum == $seen_news ]] || [[ -z $news_marquee ]]; then + return 1 + fi + hchar="─" + news="$news_marquee\n$(awk -v var="$hchar" 'BEGIN{for(c=0;c<90;c++) printf var;}')\n" + update_last_seen "$news_sum" + echo "$news" } declare -A deps @@ -998,7 +1000,8 @@ set_header(){ local switch="$1" logger INFO "${FUNCNAME[0]}" logger INFO "Header mode is $1" - print_news + local news + news=$(print_news) [[ $auto_install -eq 2 ]] && install_mode="auto" [[ $auto_install -eq 1 ]] && install_mode="headless" [[ $auto_install -eq 0 ]] && install_mode=manual @@ -2117,7 +2120,6 @@ initial_setup(){ stale_symlinks init_items setup - check_news echo "100" } main(){ From d41082b1d4f67ef6f9f845351d4b51a00eefc708 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 13:39:04 +0900 Subject: [PATCH 003/122] feat: GTK UI --- dzgui.sh | 2703 +++++++++++-------------------------------- helpers/funcs | 1200 +++++++++++++++++++ helpers/query_v2.py | 75 ++ helpers/ui.py | 1635 ++++++++++++++++++++++++++ 4 files changed, 3598 insertions(+), 2015 deletions(-) create mode 100644 helpers/funcs create mode 100644 helpers/query_v2.py create mode 100644 helpers/ui.py diff --git a/dzgui.sh b/dzgui.sh index 708fd90..ece043f 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,163 +1,177 @@ #!/usr/bin/env bash - set -o pipefail -version=4.2.0.rc-1 +version="4.2.0.rc-1" +src_path=$(realpath "$0") + +#CONSTANTS aid=221100 game="dayz" +app_name="dzgui" +app_name_upper="DZGUI" workshop="steam://url/CommunityFilePage/" -api="https://api.battlemetrics.com/servers" sd_res="--width=1280 --height=800" -config_path="$HOME/.config/dztui/" -config_file="${config_path}dztuirc" -hist_file="${config_path}history" -tmp=/tmp/dzgui.tmp -fifo=/tmp/table.tmp -debug_log="$PWD/DZGUI_DEBUG.log" -separator="%%" -check_config_msg="Check config values and restart." -issues_url="https://github.com/aclist/dztui/issues" -url_prefix="https://raw.githubusercontent.com/aclist/dztui" -stable_url="$url_prefix/dzgui" -testing_url="$url_prefix/testing" -releases_url="https://github.com/aclist/dztui/releases/download/browser" -help_url="https://aclist.github.io/dzgui/dzgui" -sponsor_url="https://github.com/sponsors/aclist" +steamsafe_zenity="/usr/bin/zenity" +zenity_flags=("--width=500" "--title=DZGUI") +declare -A deps +deps=([awk]="5.1.1" [curl]="7.80.0" [jq]="1.6" [tr]="9.0" [$steamsafe_zenity]="3.42.1") + +#CONFIG +config_path="$HOME/.config/dztui" +config_file="$config_path/dztuirc" + +#PATHS +state_path="$HOME/.local/state/$app_name" +cache_path="$HOME/.cache/$app_name" +share_path="$HOME/.local/share/$app_name" +script_path="$share_path/dzgui.sh" +helpers_path="$share_path/helpers" + +#LOGS +log_path="$state_path/logs" +debug_log="$log_path/DZGUI_DEBUG.log" + +#STATE FILES +prefix="dzg" +history_file="$state_path/$prefix.history" +versions_file="$state_path/$prefix.versions" +lock_file="$state_path/$prefix.lock" + +#CACHE FILES +coords_file="$cache_path/$prefix.coords" + +#legacy paths +hist_file="$config_path/history" +version_file="$config_path/versions" + +#XDG freedesktop_path="$HOME/.local/share/applications" -sd_install_path="$HOME/.local/share/dzgui" -helpers_path="$sd_install_path/helpers" + +#HELPERS +ui_helper="$helpers_path/ui.py" geo_file="$helpers_path/ips.csv" km_helper="$helpers_path/latlon" sums_path="$helpers_path/sums.md5" -scmd_file="$helpers_path/scmd.sh" +func_helper="$helpers_path/funcs" + +#URLS +author="aclist" +repo="dztui" +url_prefix="https://raw.githubusercontent.com/$author/$repo" +stable_url="$url_prefix/dzgui" +testing_url="$url_prefix/testing" +releases_url="https://github.com/$author/$repo/releases/download/browser" km_helper_url="$releases_url/latlon" -db_file="$releases_url/ips.csv.gz" -sums_url="$testing_url/helpers/sums.md5" -scmd_url="$testing_url/helpers/scmd.sh" -vdf2json_url="$testing_url/helpers/vdf2json.py" -forum_url="https://github.com/aclist/dztui/discussions" -version_file="$config_path/versions" -steamsafe_zenity="/usr/bin/zenity" +geo_file_url="$releases_url/ips.csv.gz" +#TODO: normalize +vdf2json_url="$stable_url/helpers/vdf2json.py" +#TODO: move adoc to index +help_url="https://$author.github.io/dzgui/dzgui" +sponsor_url="https://github.com/sponsors/$author" -update_last_seen(){ - local news_sum="$1" - seen_news="$news_sum" - update_config +logger(){ + local date="$(date "+%F %T,%3N")" + local tag="$1" + local string="$2" + local self="${BASH_SOURCE[0]}" + local caller="${FUNCNAME[1]}" + local line="${BASH_LINENO[0]}" + printf "%s␞%s␞%s::%s()::%s␞%s\n" "$date" "$tag" "$self" "$caller" "$line" "$string" >> "$debug_log" } -check_news(){ - logger INFO "${FUNCNAME[0]}" - [[ $branch == "stable" ]] && news_url="$stable_url/news" - [[ $branch == "testing" ]] && news_url="$testing_url/news" - local result=$(curl -Ls "$news_url") - local sum=$(echo -n "$result" | md5sum | awk '{print $1}') - printf "%s\n%s\n" "$result" "$sum" - logger INFO "News: $result" +setup_dirs(){ + for dir in "$state_path" "$cache_path" "$share_path" "$helpers_path" "$freedesktop_path" "$config_path" "$log_path"; do + if [[ ! -d $dir ]]; then + mkdir -p "$dir" + fi + done } -print_news(){ - readarray -t news_result < <(check_news) - local news_marquee=${news_result[0]} - local news_sum=${news_result[1]} - local hchar - local news - logger INFO "${FUNCNAME[0]}" - if [[ $news_sum == $seen_news ]] || [[ -z $news_marquee ]]; then - return 1 +setup_state_files(){ + if [[ -f "$debug_log" ]]; then + rm "$debug_log" && touch $debug_log + logger INFO "Initializing DZGUI version $version" + fi + if [[ -f "$version_file" ]]; then + mv "$version_file" "$versions_file" && + 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 + rm "$file" + done + logger INFO "Wiped cache files" fi - hchar="─" - news="$news_marquee\n$(awk -v var="$hchar" 'BEGIN{for(c=0;c<90;c++) printf var;}')\n" - update_last_seen "$news_sum" - echo "$news" } +print_config_vals(){ + local keys=( + "branch" + "seen_news" + "name" + "fav_server" + "fav_label" + "auto_install" + "steam_path" + "default_steam_path" + "preferred_client" + ) + for i in "${keys[@]}"; do + logger INFO "Read key '$i': '${!i}'" + done + if [[ ${#ip_list[@]} -lt 1 ]]; then + logger WARN "No IPs in saved server list" + fi -declare -A deps -deps=([awk]="5.1.1" [curl]="7.80.0" [jq]="1.6" [tr]="9.0" [$steamsafe_zenity]="3.42.1" [fold]="9.0") -changelog(){ - build(){ - local mdbranch - case "$branch" in - "stable") - mdbranch="dzgui" - ;; - *) - mdbranch="testing" - ;; - esac - local md="https://raw.githubusercontent.com/aclist/dztui/${mdbranch}/CHANGELOG.md" - prefix="This window can be scrolled." - echo $prefix - echo "" - curl -Ls "$md" - } - build | $steamsafe_zenity --text-info $sd_res --title="DZGUI" 2>/dev/null } - -depcheck(){ - for dep in "${!deps[@]}"; do - command -v "$dep" 2>&1>/dev/null || (printf "Requires %s >=%s\n" "$dep" ${deps[$dep]}; exit 1) - done +test_gobject(){ + python3 -c "import gi" + if [[ ! $? -eq 0 ]]; then + logger CRITICAL "Missing PyGObject" + fdialog "Requires PyGObject" + exit 1 + fi + logger INFO "Found PyGObject in Python env" } -watcher_deps(){ - logger INFO "${FUNCNAME[0]}" - if [[ ! $(command -v wmctrl) ]] && [[ ! $(command -v xdotool) ]]; then - echo "100" - warn "Missing dependency: requires 'wmctrl' or 'xdotool'.\nInstall from your system's package manager." - logger ERROR "Missing watcher dependencies" - exit 1 - fi +update_config(){ + # handling for legacy files + [[ -z $branch ]] && branch="stable" + [[ -f $config_file ]] && mv $config_file ${config_file}.old + write_config > $config_file && return 90 || return 1 + logger INFO "Updated config file at '$config_file'" } -init_items(){ - #array order determines menu selector; this is destructive - #change favorite index affects setup() and add_by_fav() -items=( - "[Connect]" - " Server browser" - " My servers" - " Quick connect to favorite server" - " Connect by ID" - " Connect by IP" - " Recent servers (last 10)" - "[Manage servers]" - " Add server by ID" - " Add server by IP" - " Add favorite server" - " Delete server" - "[Options]" - " List installed mods" - " View changelog" - " Advanced options" - "[Help]" - " Help file ⧉" - " Report bug ⧉" - " Forum ⧉" - " Sponsor ⧉" - " Hall of fame ⧉" - ) +setup_steam_client(){ + local flatpak + local steam + local steam_cmd + [[ -n $preferred_client ]] && return 0 + [[ $(command -v flatpak) ]] && flatpak=$(flatpak list | grep valvesoftware.Steam) + steam=$(command -v steam) + if [[ -z "$steam" ]] && [[ -z "$flatpak" ]]; then + raise_error_and_quit "Requires Steam or Flatpak Steam" + elif [[ -n "$steam" ]] && [[ -n "$flatpak" ]]; then + preferred_client="steam" + elif [[ -n "$steam" ]]; then + preferred_client="steam" + else + steam_cmd="flatpak run com.valvesoftware.Steam" + fi + update_config && logger INFO "Preferred client set to '$steam_cmd'" || return 1 } -warn(){ - logger WARN "$1" - $steamsafe_zenity --info --title="DZGUI" --text="$1" --width=500 --icon-name="dialog-warning" 2>/dev/null -} -info(){ - $steamsafe_zenity --info --title="DZGUI" --text="$1" --width=500 2>/dev/null -} -set_api_params(){ - logger INFO "${FUNCNAME[0]}" - response=$(curl -s "$api" -H "Authorization: Bearer "$api_key"" -G -d "sort=-players" \ - -d "filter[game]=$game" -d "filter[ids][whitelist]=$list_of_ids") - list_response=$response - first_entry=1 +print_ip_list(){ + [[ ${#ip_list[@]} -eq 0 ]] && return 1 + printf "\t\"%s\"\n" "${ip_list[@]}" } write_config(){ -cat <<-END +cat <<-END #Path to DayZ installation steam_path="$steam_path" -#Your unique API key +#Battlemetrics API key api_key="$api_key" #Favorited server IP:PORT array ip_list=( - $(print_ip_list) +$(print_ip_list) ) #Favorite server to fast-connect to (limit one) @@ -192,1945 +206,604 @@ default_steam_path="$default_steam_path" #Preferred Steam launch command (for Flatpak support) preferred_client="$preferred_client" - END + +#DZGUI source path +src_path="$src_path" +END +} +depcheck(){ + for dep in "${!deps[@]}"; do + command -v "$dep" 2>&1>/dev/null + if [[ $? -eq 1 ]]; then + local msg="Requires $dep >= ${deps[$dep]}" + raise_error_and_quit "$msg" + fi + done + logger INFO "Initial dependencies satisfied" +} +check_pyver(){ + local pyver=$(python3 --version | awk '{print $2}') + local minor=$(<<< $pyver awk -F. '{print $2}') + if [[ -z $pyver ]] || [[ ${pyver:0:1} -lt 3 ]] || [[ $minor -lt 10 ]]; then + local msg="Requires Python >=3.10" + raise_error_and_quit "$msg" + fi + logger INFO "Found Python version: $pyver" +} +watcher_deps(){ + if [[ ! $(command -v wmctrl) ]] && [[ ! $(command -v xdotool) ]]; then + raise_error_and_quit "Missing dependency: requires 'wmctrl' or 'xdotool'" + exit 1 + fi + logger INFO "Found DZG Watcher dependencies" +} +format_version_url(){ + echo FORMAT + case "$branch" in + "stable") + version_url="$stable_url/dzgui.sh" + ;; + "testing") + version_url="$testing_url/dzgui.sh" + ;; + esac + echo "$version_url" } write_desktop_file(){ -cat <<-END +cat <<-END [Desktop Entry] Version=1.0 Type=Application Terminal=false -Exec=$sd_install_path/dzgui.sh -Name=DZGUI -Comment=dzgui -Icon=$sd_install_path/dzgui +Exec=$share_path/dzgui.sh +Name=$app_name_upper +Comment=$appname +Icon=$share_path/$appname Categories=Game - END +END } freedesktop_dirs(){ - mkdir -p "$sd_install_path" - mkdir -p "$freedesktop_path" - curl -s "$version_url" > "$sd_install_path/dzgui.sh" - chmod +x "$sd_install_path/dzgui.sh" - img_url="$testing_url/images" - for i in dzgui grid.png hero.png logo.png; do - curl -s "$img_url/$i" > "$sd_install_path/$i" - done - write_desktop_file > "$freedesktop_path/dzgui.desktop" - if [[ $is_steam_deck -eq 1 ]]; then - write_desktop_file > "$HOME/Desktop/dzgui.desktop" - fi -} -find_library_folder(){ - logger INFO "${FUNCNAME[0]}" - logger INFO "User picked directory: '$1'" - steam_path="$(python3 "$helpers_path/vdf2json.py" -i "$1/steamapps/libraryfolders.vdf" | jq -r '.libraryfolders[]|select(.apps|has("221100")).path')" - logger INFO "Steam path resolved to: $steam_path" -} -file_picker(){ - logger INFO "${FUNCNAME[0]}" - local path=$($steamsafe_zenity --file-selection --directory 2>/dev/null) - logger INFO "File picker path resolve to: $path" - if [[ -z "$path" ]]; then - logger INFO "Path was empty" - return - else - default_steam_path="$path" - find_library_folder "$default_steam_path" - fi -} -create_config(){ - logger INFO "${FUNCNAME[0]}" - check_pyver - write_to_config(){ - mkdir -p $config_path - write_config > $config_file - info "Config file created at $config_file." - source $config_file - } - while true; do - player_input="$($steamsafe_zenity --forms --add-entry="Player name (required for some servers)" --add-entry="Steam API key" --add-entry="BattleMetrics API key (optional)" --title="DZGUI" --text="DZGUI" $sd_res --separator="@" 2>/dev/null)" - #explicitly setting IFS crashes $steamsafe_zenity in loop - #and mapfile does not support high ascii delimiters - #so split fields with newline - readarray -t args < <(echo "$player_input" | sed 's/@/\n/g') - name="${args[0]}" - steam_api="${args[1]}" - api_key="${args[2]}" - - [[ -z $player_input ]] && exit - if [[ -z $steam_api ]]; then - warn "Steam API key cannot be empty" - continue - elif [[ $(test_steam_api) -eq 1 ]]; then - warn "Invalid Steam API key" - continue - fi - if [[ -n $api_key ]] && [[ $(test_bm_api $api_key) -eq 1 ]]; then - warn "Invalid BM API key" - continue - fi - while true; do - logger INFO "steamsafe_zenity is $steamsafe_zenity" - if [[ -n $steam_path ]]; then - write_to_config - return - fi - find_default_path - find_library_folder "$default_steam_path" - if [[ -z $steam_path ]]; then - logger WARN "Steam path was empty" - zenity --question --text="DayZ not found or not installed at the chosen path." --ok-label="Choose path manually" --cancel-label="Exit" - if [[ $? -eq 0 ]]; then - logger INFO "User selected file picker" - file_picker - else - exit - fi - else - write_to_config - return - fi - done - done - -} -err(){ - printf "[ERROR] %s\n" "$1" -} -varcheck(){ - if [[ ! -d $steam_path ]] || [[ ! -d $game_dir ]]; then - echo 1 - fi -} -run_depcheck(){ - logger INFO "${FUNCNAME[0]}" - if [[ -n $(depcheck) ]]; then - echo "100" - logger ERROR "Missing dependencies, quitting" - $steamsafe_zenity --warning --ok-label="Exit" --title="DZGUI" --text="$(depcheck)" - exit - fi -} -logger(){ - local date="$(date "+%F %T")" - local tag="$1" - local string="$2" - printf "[%s] [%s] %s\n" "$date" "$tag" "$string" >> "$debug_log" -} -check_pyver(){ - local pyver=$(python3 --version | awk '{print $2}') - local minor=$(<<< $pyver awk -F. '{print $2}') - if [[ -z $pyver ]] || [[ ${pyver:0:1} -lt 3 ]] || [[ $minor -lt 10 ]]; then - warn "Requires python >=3.10" && - exit - fi -} -run_varcheck(){ - logger INFO "${FUNCNAME[0]}" - source $config_file - workshop_dir="$steam_path/steamapps/workshop/content/$aid" - game_dir="$steam_path/steamapps/common/DayZ" - if [[ $(varcheck) -eq 1 ]]; then - $steamsafe_zenity --question --cancel-label="Exit" --text="Malformed config file. This is probably user error.\nStart first-time setup process again?" --width=500 2>/dev/null - code=$? - if [[ $code -eq 1 ]]; then - logger ERROR "Malformed config vars" - exit - else - create_config - fi - fi -} -config(){ - logger INFO "${FUNCNAME[0]}" - if [[ ! -f $config_file ]]; then - logger WARN "Config file missing" - logger INFO "steamsafe_zenity is $steamsafe_zenity" - $steamsafe_zenity --width=500 --info --text="Config file not found. Click OK to proceed to first-time setup." 2>/dev/null - code=$? - logger INFO "Return code $code" - #TODO: prevent progress if user hits ESC - if [[ $code -eq 1 ]]; then - exit - else - create_config - fi - else - source $config_file - fi - -} -steam_deck_mods(){ - until [[ -z $diff ]]; do - next=$(echo -e "$diff" | head -n1) - $steamsafe_zenity --question --ok-label="Open" --cancel-label="Cancel" --title="DZGUI" --text="Missing mods. Click [Open] to open mod $next in Steam Workshop and subscribe to it by clicking the green Subscribe button. After the mod is downloaded, return to this menu to continue validation." --width=500 2>/dev/null - rc=$? - if [[ $rc -eq 0 ]]; then - echo "[DZGUI] Opening ${workshop}$next" - $steam_cmd steam://url/CommunityFilePage/$next 2>/dev/null & - $steamsafe_zenity --info --title="DZGUI" --ok-label="Next" --text="Click [Next] to continue mod check." --width=500 2>/dev/null - else - return 1 - fi - compare - done -} -test_display_mode(){ - pgrep -a gamescope | grep -q "generate-drm-mode" - if [[ $? -eq 0 ]]; then - echo gm - else - echo dm - fi -} -foreground(){ - if [[ $(command -v wmctrl) ]]; then - wmctrl -a "DZG Watcher" - else - local window_id=$(xdotool search --name "DZG Watcher") - xdotool windowactivate $window_id - fi -} -manual_mod_install(){ - local ip="$1" - local gameport="$2" - - local ex="/tmp/dzc.tmp" - [[ -f $ex ]] && rm $ex - watcher(){ - readarray -t stage_mods <<< "$diff" - for((i=0;i<${#stage_mods[@]};i++)); do - [[ -f $ex ]] && return 1 - local downloads_dir="$steam_path/steamapps/workshop/downloads/$aid" - local workshop_dir="$steam_path/steamapps/workshop/content/$aid" - $steam_cmd "steam://url/CommunityFilePage/${stage_mods[$i]}" - echo "# Opening workshop page for ${stage_mods[$i]}. If you see no progress after subscribing, try unsubscribing and resubscribing again until the download commences." - sleep 1s - foreground - until [[ -d $downloads_dir/${stage_mods[$i]} ]]; do - [[ -f $ex ]] && return 1 - sleep 0.1s - if [[ -d $workshop_dir/${stage_mods[$i]} ]]; then - break - fi - done - foreground - echo "# Steam is downloading ${stage_mods[$i]} (mod $((i+1)) of ${#stage_mods[@]})" - until [[ -d $workshop_dir/${stage_mods[$i]} ]]; do - [[ -f $ex ]] && return 1 - sleep 0.1s - done - foreground - echo "# ${stage_mods[$i]} moved to mods dir" + local version_url=$(format_version_url) + local img_url="$stable_url/images" + curl -s "$version_url" > "$script_path" + chmod +x "$script_path" + for i in dzgui grid.png hero.png logo.png; do + curl -s "$img_url/$i" > "$share_path/$i" done - echo "100" - } - watcher > >($steamsafe_zenity --pulsate --progress --auto-close --title="DZG Watcher" --width=500 2>/dev/null; rc=$?; [[ $rc -eq 1 ]] && touch $ex) - compare - if [[ -z $diff ]]; then - passed_mod_check > >($steamsafe_zenity --pulsate --progress --auto-close --width=500 2>/dev/null) - launch "$ip" "$gameport" - else - return 1 + write_desktop_file > "$freedesktop_path/$appname.desktop" + [[ $is_steam_deck -eq 0 ]] && return + write_desktop_file > "$HOME/Desktop/$appname.desktop" +} +legacy_vars(){ + local suffix="fav" + local hr_msg="Config file contains values based on old API. Please update and re-run setup." + local msg="Config file contains legacy API value: '$suffix'" + if [[ -n $fav ]]; then + logger WARN "$msg" + fdialog "$hr_msg" + exit 1 fi -} -encode(){ - echo "$1" | md5sum | cut -c -8 -} -stale_symlinks(){ - logger INFO "${FUNCNAME[0]}" - for l in $(find "$game_dir" -xtype l); do - unlink $l - done -} -legacy_symlinks(){ - for d in "$game_dir"/*; do - if [[ $d =~ @[0-9]+-.+ ]]; then - unlink "$d" - fi - done - for d in "$workshop_dir"/*; do - local id=$(awk -F"= " '/publishedid/ {print $2}' "$d"/meta.cpp | awk -F\; '{print $1}') - local encoded_id=$(echo "$id" | awk '{printf("%c",$1)}' | base64 | sed 's/\//_/g; s/=//g; s/+/]/g') - if [[ -h "$game_dir/@$encoded_id" ]]; then - unlink "$game_dir/@$encoded_id" - fi - done -} -symlinks(){ - for d in "$workshop_dir"/*; do - id=$(awk -F"= " '/publishedid/ {print $2}' "$d"/meta.cpp | awk -F\; '{print $1}') - encoded_id=$(encode "$id") - mod=$(awk -F\" '/name/ {print $2}' "$d"/meta.cpp | sed -E 's/[^[:alpha:]0-9]+/_/g; s/^_|_$//g') - link="@$encoded_id" - if [[ -h "$game_dir/$link" ]]; then - : - else - printf "[DZGUI] Creating symlink for $mod\n" - ln -fs "$d" "$game_dir/$link" - fi - done -} -passed_mod_check(){ - echo "[DZGUI] Passed mod check" - echo "# Preparing symlinks" - legacy_symlinks - symlinks - echo "100" - -} -auto_mod_install(){ - local ip="$1" - local gameport="$2" - popup 300 - rc=$? - if [[ $rc -eq 1 ]]; then - manual_mod_install "$ip" "$gameport" - return + if [[ -n $whitelist ]]; then + suffix="whitelist" + logger WARN "$msg" + fdialog "$hr_msg" + exit 1 fi - log="$default_steam_path/logs/content_log.txt" - [[ -f "/tmp/dz.status" ]] && rm "/tmp/dz.status" - touch "/tmp/dz.status" - console_dl "$diff" && - $steam_cmd steam://open/downloads && 2>/dev/null 1>&2 - foreground - until [[ -z $(comm -23 <(printf "%s\n" "${modids[@]}" | sort) <(ls -1 $workshop_dir | sort)) ]]; do - local missing=$(comm -23 <(printf "%s\n" "${modids[@]}" | sort) <(ls -1 $workshop_dir | sort) | wc -l) - echo "# Downloaded $((${#modids[@]}-missing)) of ${#modids[@]} mods. ESC cancels" - done | $steamsafe_zenity --pulsate --progress --title="DZG Watcher" --auto-close --no-cancel --width=500 2>/dev/null - compare - [[ $force_update -eq 1 ]] && { unset force_update; return; } - if [[ -z $diff ]]; then - check_timestamps - passed_mod_check > >($steamsafe_zenity --pulsate --progress --title="DZGUI" --auto-close --width=500 2>/dev/null) - launch "$ip" "$gameport" - else - manual_mod_install "$ip" "$gameport" - fi -} -get_local_stamps(){ - concat(){ - for ((i=0;i<$max;i++)); do - echo "publishedfileids[$i]=${local_modlist[$i]}&" - done | awk '{print}' ORS='' - } - payload(){ - echo -e "itemcount=${max}&$(concat)" - } - post(){ - curl -s -X POST -H "Content-Type:application/x-www-form-urlencoded" \ - -d "$(payload)" 'https://api.steampowered.com/ISteamRemoteStorage/GetPublishedFileDetails/v1/?format=json' - } - post -} -update_stamps(){ - for((i=0;i<${#local_modlist[@]};i++)); do - mod=${local_modlist[$i]} - stamp=${stamps[$i]} - printf "%s\t%s\n" "$mod" "$stamp" >> $version_file - done -} -check_timestamps(){ - readarray -t local_modlist < <(ls -1 $workshop_dir) - max=${#local_modlist[@]} - [[ $max -eq 0 ]] && return - readarray -t stamps < <(get_local_stamps | jq -r '.response.publishedfiledetails[].time_updated') - if [[ ! -f $version_file ]]; then - update_stamps - return - else - needs_update=() - for((i=0;i<${#local_modlist[@]};i++)); do - mod=${local_modlist[$i]} - stamp=${stamps[$i]} - if [[ ! $(awk -v var=$mod '$1 == var' $version_file) ]]; then - echo -e "$mod\t$stamp" >> $version_file - elif [[ $(awk -v var=$mod -v var2=$stamp '$1 == var && $2 == var2' $version_file) ]]; then - : - else - awk -v var=$mod -v var2=$stamp '$1 == var {$2=var2;print $1"\t"$2; next;};{print}' $version_file > $version_file.new - mv $version_file.new $version_file - needs_update+=($mod) - fi - done - fi -} -merge_modlists(){ - echo "# Aligning modlists" - [[ $force_update -eq 1 ]] && echo "# Checking mod versions" - check_timestamps - if [[ -z "$diff" ]] && [[ ${#needs_update[@]} -gt 0 ]]; then - diff=$(printf "%s\n" "${needs_update[@]}") - elif [[ -z "$diff" ]] && [[ ${#needs_update[@]} -eq 0 ]]; then - diff= - elif [[ -n "$diff" ]] && [[ ${#needs_update[@]} -eq 0 ]]; then - : - else - diff="$(printf "%s\n%s\n" "$diff" "${needs_update[@]}")" - fi - [[ $force_update -eq 1 ]] && echo "100" -} -update_history(){ - local ip="$1" - local gameport="$2" - local qport="$3" - [[ -n $(grep "$ip:$gameport:$qport" $hist_file) ]] && return - if [[ -f $hist_file ]]; then - old=$(tail -n9 "$hist_file") - old="$old\n" - fi - echo -e "${old}${ip}:${gameport}:${qport}" > "$hist_file" -} -connect(){ - local ip=$1 - local gameport=$2 - local qport=$3 - logger INFO "Querying $ip:$gameport:$qport" - connect_dialog(){ - echo "# Querying modlist" - local remote - remote=$(a2s "$ip" "$qport" rules) - if [[ $? -eq 1 ]]; then - echo "100" - popup 1200 - return 1 - fi - logger INFO "Server returned modlist: $(<<< $remote tr '\n' ' ')" - echo "# Checking for defunct mods" - query_defunct "$remote" - } - (connect_dialog "$ip" "$qport") | pdialog - rc=$? - [[ $rc -eq 1 ]] && return - readarray -t newlist < /tmp/dz.modlist - compare - [[ $auto_install -eq 2 ]] && merge_modlists > >(pdialog) - if [[ -n $diff ]]; then - if [[ $is_steam_deck -eq 1 ]] && [[ $(test_display_mode) == "gm" ]]; then - popup 1400 - return 1 - fi - case $auto_install in - 1|2) auto_mod_install "$ip" "$gameport" ;; - *) manual_mod_install "$ip" "$gameport" ;; - esac - else - passed_mod_check > >(pdialog) - update_history "$ip" "$gameport" "$qport" - launch "$ip" "$gameport" "$qport" - fi -} -update_config(){ - mv $config_file ${config_file}.old - write_config > $config_file - source $config_file -} -prepare_ip_list(){ - local res="$1" - local ct=$(<<< "$res" jq '[.response.servers[]]|length' 2>/dev/null) - if [[ -n $ct ]]; then - for((i=0;i<$ct;i++));do - readarray -t json_arr < <(<<< $res jq --arg i $i -r '[.response.servers[]][($i|tonumber)]|"\(.name)\n\(.addr)\n\(.players)\n\(.max_players)\n\(.gameport)\n\(.gametype)"') - local name=${json_arr[0]} - local addr=${json_arr[1]} - local ip=$(<<< $addr awk -F: '{print $1}') - local qport=$(<<< $addr awk -F: '{print $2}') - local current=${json_arr[2]} - local max=${json_arr[3]} - local players="${current}/${max}" - local gameport="${json_arr[4]}" - local gametime="${json_arr[5]}" - gametime=$(<<< "$gametime" grep -o '[0-9][0-9]:[0-9][0-9]') - - echo "$name" - echo "${ip}:${gameport}" - echo "$players" - echo "$gametime" - echo "$qport" - done - fi -} -ip_table(){ - local sel - local res="$1" - while true; do - sel=$(prepare_ip_list "$res" | $steamsafe_zenity --width 1200 --height 800 --text="Multiple maps found at this server. Select map from the list below" --title="DZGUI" --list --column=Name --column=IP --column=Players --column=Gametime --column=Qport --print-column=1,2,5 --separator=%% 2>/dev/null) - [[ $? -eq 1 ]] && return 1 - echo "$sel" - return 0 - done -} -fetch_ip_metadata(){ - local ip="$1" - source $config_file - local url="https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100\gameaddr\\$ip&key=$steam_api" - curl -Ls "$url" -} - -validate_local_ip(){ - <<< "$1" grep -qP '(^127.\d+.\d+.\d+:\d+$)|(^10\.\d+.\d+.\d+:\d+$)|(^172\.1[6-9]\.\d+.\d+:\d+$)|(^172\.2[0-9]\.\d+.\d+:\d+$)|(^172\.3[0-1]\.\d+.\d+:\d+$)|(^192\.168\.\d+.\d+:\d+$)' -} -test_steam_api(){ - local url="https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100&limit=10&key=$steam_api" - local code=$(curl -ILs "$url" | grep -E "^HTTP") - [[ $code =~ 403 ]] && echo 1 - [[ $code =~ 200 ]] && echo 0 -} -test_bm_api(){ - local api_key="$1" - [[ -z $api_key ]] && return 1 - local code=$(curl -ILs "$api" -H "Authorization: Bearer "$api_key"" -G \ - -d "filter[game]=$game" | grep -E "^HTTP") - [[ $code =~ 401 ]] && echo 1 - [[ $code =~ 200 ]] && echo 0 -} -add_steam_api(){ - [[ $(test_steam_api) -eq 1 ]] && return 1 - mv $config_file ${config_path}dztuirc.old - nr=$(awk '/steam_api=/ {print NR}' ${config_path}dztuirc.old) - steam_api="steam_api=\"$steam_api\"" - awk -v "var=$steam_api" -v "nr=$nr" 'NR==nr {$0=var}{print}' ${config_path}dztuirc.old > ${config_path}dztuirc - echo "[DZGUI] Added Steam API key" - $steamsafe_zenity --info --title="DZGUI" --text="Added Steam API key to:\n\n${config_path}dztuirc\nIf errors occur, you can restore the file:\n${config_path}dztuirc.old" --width=500 2>/dev/null - source $config_file -} -check_steam_api(){ - if [[ -z $steam_api ]]; then - steam_api=$($steamsafe_zenity --entry --text="Key 'steam_api' not present in config file. Enter Steam API key:" --title="DZGUI" 2>/dev/null) - if [[ $? -eq 1 ]] ; then - return - elif [[ ${#steam_api} -lt 32 ]] || [[ $(test_steam_api) -eq 1 ]]; then - $steamsafe_zenity --warning --title="DZGUI" --text="Check API key and try again." 2>/dev/null - return 1 - else - add_steam_api - fi - fi -} -validate_ip(){ - echo "$1" | grep -qP '^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$' -} -connect_by_id(){ - local ip - ip=$(add_by_id "connect") - [[ $? -eq 1 ]] && return - readarray -t address < <(format_config_address "$ip") - local ip="${address[0]}" - local gameport="${address[1]}" - local qport="${address[2]}" - unset address - - connect "$ip" "$gameport" "$qport" -} -connect_by_ip(){ - local sel - sel=$(parse_ips) - [[ -z $sel ]] && return - - readarray -t address < <(format_table_results "$sel") - local ip="${address[1]}" - local gameport="${address[2]}" - local qport="${address[3]}" - - connect "$ip" "$gameport" "$qport" -} -parse_ips(){ - local res - source $config_file - check_steam_api - [[ $? -eq 1 ]] && return - while true; do - local ip - ip=$(edialog "Enter server IP (for LAN servers, include query port in IP:PORT format)") - [[ $? -eq 1 ]] && return 1 - if [[ $ip =~ ':' ]]; then - if ! validate_local_ip "$ip"; then - warn "Invalid local IP. Check IP:PORT combination and try again." - continue - fi - local lan_ip=$(<<< $ip awk -F: '{print $1}') - local lan_qport=$(<<< $ip awk -F: '{print $2}') - logger INFO "Given LAN IP was $lan_ip" - logger INFO "Given LAN port was $lan_qport" - res=$(a2s $lan_ip $lan_qport info) - if [[ ! $? -eq 0 ]] || [[ $(<<< $res jq 'length') -eq 0 ]]; then - warn "Failed to retrieve server metadata. Check IP:PORT combination and try again." - return 1 - fi - logger INFO "$res" - local name=$(<<< $res jq -r '.name') - local address=$(<<< $res jq -r '.address') - local ip=$(<<< $address awk -F: '{print $1}') - local gameport=$(<<< $address awk -F: '{print $2}') - local qport=$(<<< $res jq -r '.qport') - logger INFO "Found '${name}' at ${ip}:${gameport}:${qport}" - echo "${name}%%${ip}:${gameport}%%${qport}" - return 0 - else - if validate_ip "$ip"; then - res=$(fetch_ip_metadata "$ip") - if [[ ! $? -eq 0 ]] || [[ $(<<< $res jq '.response|length') -eq 0 ]]; then - warn "Failed to retrieve server metadata. Check IP or API key and try again." - return 1 - fi - local ct=$(<<< "$res" jq '.response.servers|length') - if [[ $ct -eq 1 ]]; then - local name=$(<<< $res jq -r '.response.servers[].name') - local address=$(<<< $res jq -r '.response.servers[].addr') - local ip=$(<<< "$address" awk -F: '{print $1}') - local qport=$(<<< "$address" awk -F: '{print $2}') - local gameport=$(<<< $res jq -r '.response.servers[].gameport') - echo "${name}%%${ip}:${gameport}%%${qport}" - return 0 - fi - ip_table "$res" - return 0 - else - warn "Invalid IP" - fi - fi - done -} -query_defunct(){ - readarray -t modlist <<< "$@" - local max=${#modlist[@]} - concat(){ - for ((i=0;i<$max;i++)); do - echo "publishedfileids[$i]=${modlist[$i]}&" - done | awk '{print}' ORS='' - } - payload(){ - echo -e "itemcount=${max}&$(concat)" - } - post(){ - curl -s \ - -X POST \ - -H "Content-Type:application/x-www-form-urlencoded"\ - -d "$(payload)" 'https://api.steampowered.com/ISteamRemoteStorage/GetPublishedFileDetails/v1/?format=json' - } - local result=$(post | jq -r '.[].publishedfiledetails[] | select(.result==1) | "\(.file_size) \(.publishedfileid)"') - <<< "$result" awk '{print $2}' > /tmp/dz.modlist -} -server_modlist(){ - for i in "${newlist[@]}"; do - printf "$i\n" - done -} -compare(){ - diff=$(comm -23 <(server_modlist | sort -u) <(installed_mods | sort)) -} - -installed_mods(){ - ls -1 "$workshop_dir" -} -concat_mods(){ - readarray -t serv <<< "$(server_modlist)" - for i in "${serv[@]}"; do - id=$(awk -F"= " '/publishedid/ {print $2}' "$workshop_dir"/$i/meta.cpp | awk -F\; '{print $1}') - encoded_id=$(encode $id) - link="@$encoded_id;" - echo -e "$link" - done | tr -d '\n' | perl -ple 'chop' -} -launch(){ - local ip="$1" - local gameport="$2" - local qport="$3" - source $config_file - mods=$(concat_mods) - if [[ ! ${ip_list[@]} =~ "$ip:$gameport:$qport" ]]; then - qdialog "Before connecting, add this server to My Servers?" - if [[ $? -eq 0 ]]; then - ip_list+=("$ip:$gameport:$qport") - update_config - fi - fi - if [[ $debug -eq 1 ]]; then - launch_options="$steam_cmd -applaunch $aid -connect=$ip:$gameport -nolauncher -nosplash -name=$name -skipintro \"-mod=$mods\"" - print_launch_options="$(printf "This is a dry run.\nThese options would have been used to launch the game:\n\n$launch_options\n" | fold -w 60)" - $steamsafe_zenity --question --title="DZGUI" --ok-label="Write to file" --cancel-label="Back"\ - --text="$print_launch_options" 2>/dev/null - if [[ $? -eq 0 ]]; then - source_script=$(realpath "$0") - source_dir=$(dirname "$source_script") - echo "$launch_options" > "$source_dir"/options.log - echo "[DZGUI] Wrote launch options to $source_dir/options.log" - $steamsafe_zenity --info --width=500 --title="DZGUI" --text="Wrote launch options to \n$source_dir/options.log" 2>/dev/null - fi - else - $steamsafe_zenity --width=500 --title="DZGUI" --info --text="Launch conditions satisfied.\nDayZ will now launch after clicking [OK]." 2>/dev/null - $steam_cmd -applaunch $aid -connect=$ip:$gameport -nolauncher -nosplash -skipintro -name=$name \"-mod=$mods\" - fi -} -browser(){ - if [[ $is_steam_deck -eq 1 ]]; then - steam steam://openurl/"$1" 2>/dev/null - elif [[ $is_steam_deck -eq 0 ]]; then - if [[ -n "$BROWSER" ]]; then - "$BROWSER" "$1" 2>/dev/null - else - xdg-open "$1" 2>/dev/null - fi - fi -} -report_bug(){ - browser "$issues_url" -} -forum(){ - browser "$forum_url" -} -help_file(){ - browser "$help_url" -} -sponsor(){ - browser "$sponsor_url" -} -hof(){ - browser "${help_url}#_hall_of_fame" -} -set_mode(){ - logger INFO "${FUNCNAME[0]}" - if [[ $debug -eq 1 ]]; then - mode=debug - else - mode=normal - fi - logger INFO "Mode is $mode" -} -delete_by_ip(){ - local to_delete="$1" - for (( i=0; i<${#ip_list[@]}; ++i )); do - if [[ ${ip_list[$i]} == "$to_delete" ]]; then - unset ip_list[$i] - fi - done - if [[ ${#ip_list} -gt 0 ]]; then - readarray -t ip_list < <(printf "%s\n" "${ip_list[@]}") - fi - update_config - info "Removed $to_delete from:\n${config_path}dztuirc\nIf errors occur, you can restore the file:\n${config_path}dztuirc.old" -} -format_table_results(){ - local sel="$1" - local name=$(<<< "$sel" awk -F"%%" '{print $1}') - local address=$(<<< "$sel" awk -F"%%" '{print $2}') - local ip=$(<<< "$address" awk -F":" '{print $1}') - local gameport=$(<<< "$address" awk -F":" '{print $2}') - local qport=$(<<< "$sel" awk -F"%%" '{print $3}') - printf "%s\n%s\n%s\n%s\n" "$name" "$ip" "$gameport" "$qport" -} -delete_or_connect(){ - local sel="$1" - local mode="$2" - - readarray -t address < <(format_table_results "$sel") - local server_name="${address[0]}" - local ip="${address[1]}" - local gameport="${address[2]}" - local qport="${address[3]}" - unset address - - case "$mode" in - "delete") - qdialog "Delete this server?\n$server_name" - [[ $? -eq 1 ]] && return - - delete_by_ip "$ip:$gameport:$qport" - source $config_file - - local str="^$ip:$gameport$" - local nr=$(awk -v v="$str" '$1 ~ v {print NR}' $tmp) - local st=$((nr-1)) - local en=$((st+5)) - sed -i "${st},${en}d" $tmp - # if [[ ${#ip_list[@]} -eq 0 ]]; then - # return 1 - # fi - ;; - "connect"|"history") - connect "$ip" "$gameport" "$qport" - return - esac -} -populate(){ - local switch="$1" - while true; do - cols="--column="Server" --column="IP" --column="Players" --column="Gametime" --column="Distance" --column="Qport"" - set_header "$switch" - rc=$? - if [[ $rc -eq 0 ]]; then - if [[ -z $sel ]]; then - warn "No item was selected." - else - delete_or_connect "$sel" "$switch" - fi - else - return 1 - fi - done -} -list_mods(){ - if [[ -z $(installed_mods) ]] || [[ -z $(find $workshop_dir -maxdepth 2 -name "*.cpp" | grep .cpp) ]]; then - $steamsafe_zenity --info --text="94: No mods currently installed or incorrect path given" $sd_res 2>/dev/null - else - for d in $(find $game_dir/* -maxdepth 1 -type l); do - dir=$(basename $d) - awk -v d=$dir -F\" '/name/ {printf "%s\t%s\t", $2,d}' "$gamedir"/$d/meta.cpp - printf "%s\n" "$(basename $(readlink -f $game_dir/$dir))" - done | sort -k1 - fi -} -connect_to_fav(){ - logger INFO "${FUNCNAME[0]}" - - local fav="$1" - [[ -z $fav ]] && { popup 1300; return; } - - readarray -t address < <(format_config_address "$fav") - local ip="${address[0]}" - local gameport="${address[1]}" - local qport="${address[2]}" - - unset address - connect "$ip" "$gameport" "$qport" - [[ $? -eq 1 ]] && return 1 -} -set_header(){ - local switch="$1" - logger INFO "${FUNCNAME[0]}" - logger INFO "Header mode is $1" - local news - news=$(print_news) - [[ $auto_install -eq 2 ]] && install_mode="auto" - [[ $auto_install -eq 1 ]] && install_mode="headless" - [[ $auto_install -eq 0 ]] && install_mode=manual - case "$switch" in - "delete") - [[ -z $(< $tmp) ]] && return 1 - sel=$(< $tmp $steamsafe_zenity $sd_res --list $cols --title="DZGUI" \ - --text="DZGUI $version | Mode: $mode | Branch: $branch | Mods: $install_mode | Fav: $fav_label" \ - --separator="$separator" --print-column=1,2,6 --ok-label="Delete" 2>/dev/null) - ;; - - "connect"|"history") - sel=$(< $tmp $steamsafe_zenity $sd_res --list $cols --title="DZGUI" \ - --text="DZGUI $version | Mode: $mode | Branch: $branch | Mods: $install_mode | Fav: $fav_label" \ - --separator="$separator" --print-column=1,2,6 --ok-label="Connect" 2>/dev/null) - ;; - - "main_menu") - sel=$($steamsafe_zenity $sd_res --list --title="DZGUI" \ - --text="${news}DZGUI $version | Mode: $mode | Branch: $branch | Mods: $install_mode | Fav: $fav_label" \ - --cancel-label="Exit" --ok-label="Select" --column="Select launch option" --hide-header "${items[@]}" 2>/dev/null) - ;; - esac -} -toggle_branch(){ - mv $config_file ${config_path}dztuirc.old - nr=$(awk '/branch=/ {print NR}' ${config_path}dztuirc.old) - if [[ $branch == "stable" ]]; then - branch="testing" - else - branch="stable" - fi - flip_branch="branch=\"$branch\"" - awk -v "var=$flip_branch" -v "nr=$nr" 'NR==nr {$0=var}{print}' ${config_path}dztuirc.old > $config_file - source $config_file -} -generate_log(){ - cat <<-DOC - Distro: $(< /etc/os-release grep -w NAME | awk -F\" '{print $2}') - Kernel: $(uname -mrs) - Version: $version - Branch: $branch - Mode: $mode - Auto: $auto_hr - Servers: - $(print_ip_list) - Steam path: $steam_path - Workshop path: $workshop_dir - Game path: $game_dir - - Mods: - $(list_mods) - DOC -} -focus_beta_client(){ - steam steam://open/library 2>/dev/null 1>&2 && - steam steam://open/console 2>/dev/null 1>&2 && - sleep 1s - wid(){ - wmctrl -ilx |\ - awk 'tolower($3) == "steamwebhelper.steam"' |\ - awk '$5 ~ /^Steam|Steam Games List/' |\ - awk '{print $1}' - } - until [[ -n $(wid) ]]; do - : - done - wmctrl -ia $(wid) - sleep 0.1s - wid=$(xdotool getactivewindow) - local geo=$(xdotool getwindowgeometry $wid) - local pos=$(<<< "$geo" awk 'NR==2 {print $2}' | sed 's/,/ /') - local dim=$(<<< "$geo" awk 'NR==3 {print $2}' | sed 's/x/ /') - local pos1=$(<<< "$pos" awk '{print $1}') - local pos2=$(<<< "$pos" awk '{print $2}') - local dim1=$(<<< "$dim" awk '{print $1}') - local dim2=$(<<< "$dim" awk '{print $2}') - local dim1=$(((dim1/2)+pos1)) - local dim2=$(((dim2/2)+pos2)) - xdotool mousemove $dim1 $dim2 - xdotool click 1 - sleep 0.5s - xdotool key Tab -} -console_dl(){ - readarray -t modids <<< "$@" - focus_beta_client - sleep 1.5s - for i in "${modids[@]}"; do - xdotool type --delay 0 "workshop_download_item $aid $i" - sleep 0.5s - xdotool key Return - sleep 0.5s - done -} -find_default_path(){ - logger INFO "${FUNCNAME[0]}" - discover(){ - echo "# Searching for Steam" - default_steam_path=$(find / -type d \( -path "/proc" -o -path "*/timeshift" -o -path \ - "/tmp" -o -path "/usr" -o -path "/boot" -o -path "/proc" -o -path "/root" \ - -o -path "/sys" -o -path "/etc" -o -path "/var" -o -path "/lost+found" \) -prune \ - -o -regex ".*/Steam/ubuntu12_32$" -print -quit 2>/dev/null | sed 's@/ubuntu12_32@@') - } - if [[ $is_steam_deck -eq 1 ]]; then - default_steam_path="$HOME/.local/share/Steam" - else - local def_path - local ub_path - local flat_path - def_path="$HOME/.local/share/Steam" - ub_path="$HOME/.steam/steam" - flat_path="$HOME/.var/app/com.valvesoftware.Steam/data/Steam" - - if [[ -d "$def_path" ]]; then - default_steam_path="$def_path" - elif [[ -d "$ub_path" ]]; then - default_steam_path="$ub_path" - elif [[ -d $flat_path ]]; then - default_steam_path="$flat_path" - else - local res=$(echo -e "Let DZGUI auto-discover Steam path (accurate, slower)\nSelect the Steam path manually (less accurate, faster)" | $steamsafe_zenity --list --column="Choice" --title="DZGUI" --hide-header --text="Steam is not installed in a standard location." $sd_res) - case "$res" in - *auto*) discover ;; - *manual*) - zenity --info --text="\nSelect the top-level entry point to the location where Steam (not DayZ)\nis installed and before entering the \"steamapps\" path.\n\nE.g., if Steam is installed at:\n\"/media/mydrive/Steam\"\n\nCorrect:\n- \"/media/mydrive/Steam\"\n\nIncorrect:\n- \"/media/mydrive/Steam/steamapps/common/DayZ\"\n- \"/media/mydrive/\"" --width=500 && - file_picker ;; - esac - fi - fi -} -fold_message(){ - echo "$1" | fold -s -w40 -} -popup(){ - pop(){ - $steamsafe_zenity --info --text="$1" --title="DZGUI" --width=500 2>/dev/null - } - case "$1" in - 100) pop "This feature requires xdotool and wmctrl.";; - 200) pop "This feature is not supported on Gaming Mode.";; - 300) pop "$(fold_message 'The Steam console will now open and briefly issue commands to download the workshop files, then return to the download progress page. Ensure that the Steam console has keyboard and mouse focus (keep hands off keyboard) while the commands are being issued. Depending on the number if mods, it may take some time to queue the downloads. If a popup or notification window steals focus, it could obstruct the process.')" ;; - 400) pop "$(fold_message 'Automod install enabled. Auto-downloaded mods will not appear in your Steam Workshop subscriptions, but DZGUI will track the version number of downloaded mods internally and trigger an update if necessary.')" ;; - 500) pop "$(fold_message 'Automod install disabled. Switched to manual mode.')" ;; - 600) pop "No preferred servers set." ;; - 700) pop "Toggled to Flatpak Steam." ;; - 800) pop "Toggled to native Steam." ;; - 900) pop "This feature is not supported on Steam Deck." ;; - 1000) pop "No recent history." ;; - 1100) pop "No results found." ;; - 1200) pop "Timed out. Server may be temporarily offline or not responding to queries." ;; - 1300) pop "No favorite server configured." ;; - 1400) pop "To install missing mods, run DZGUI via Desktop Mode on Steam Deck, preferably via the desktop shortcut." ;; - esac -} -toggle_console_dl(){ - [[ $is_steam_deck -eq 1 ]] && { popup 900; return; } - [[ ! $(command -v xdotool) ]] && { popup 100; return; } - [[ ! $(command -v wmctrl) ]] && { popup 100; return; } - mv $config_file ${config_path}dztuirc.old - local nr=$(awk '/auto_install=/ {print NR}' ${config_path}dztuirc.old) - if [[ $auto_install == "2" ]]; then - auto_install="0" - popup 500 - else - auto_install="2" - popup 400 - fi - local flip_state="auto_install=\"$auto_install\"" - awk -v "var=$flip_state" -v "nr=$nr" 'NR==nr {$0=var}{print}' ${config_path}dztuirc.old > $config_file - source $config_file -} -force_update_mods(){ - if [[ -f $version_file ]]; then - awk '{OFS="\t"}{$2="000"}1' $version_file > /tmp/versions - mv /tmp/versions $version_file - fi -} -toggle_steam_binary(){ - case "$steam_cmd" in - steam) - steam_cmd="flatpak run com.valvesoftware.Steam" - update_steam_cmd - popup 700 - ;; - flatpak*) - steam_cmd="steam" - update_steam_cmd - popup 800;; - esac -} -options_menu(){ - init_options_list(){ - source $config_file - set_mode - case "$auto_install" in - 0|1|"") auto_hr="OFF"; ;; - 2) auto_hr="ON"; ;; - esac - [[ -z $name ]] && name="null" - debug_list=( - "Toggle branch [current: $branch]" - "Toggle debug mode [current: $mode]" - "Toggle auto mod install [current: $auto_hr]" - "Change player name [current: $name]" - "Output system info" - ) - #TODO: tech debt: drop old flags - [[ $auto_install -eq 2 ]] || [[ $auto_install -eq 1 ]] && debug_list+=("Force update local mods") - case "$steam_cmd" in - steam) steam_hr=Steam ;; - flatpak*) steam_hr=Flatpak ;; - esac - [[ $toggle_steam -eq 1 ]] && debug_list+=("Toggle native Steam or Flatpak [$steam_hr]") - } - while true; do - init_options_list - debug_sel=$($steamsafe_zenity --list --width=1280 --height=800 --column="Options" --title="DZGUI" --hide-header "${debug_list[@]}" 2>/dev/null) - [[ -z $debug_sel ]] && return - case "$debug_sel" in - Toggle[[:space:]]branch*) - enforce_dl=1 - toggle_branch && - check_version - ;; - Toggle[[:space:]]debug*) toggle_debug ;; - "Output system info") - source_script=$(realpath "$0") - source_dir=$(dirname "$source_script") - output(){ - echo "# Generating log" - generate_log > "$source_dir/DZGUI.log" - } - (output) | pdialog - [[ $? -eq 1 ]] && return - info_dialog "Wrote log file to: $source_dir/DZGUI.log" - ;; - Toggle[[:space:]]auto*) toggle_console_dl ;; - "Force update local mods") - force_update=1 - force_update_mods - (merge_modlists) | pdialog - auto_mod_install - ;; - Toggle[[:space:]]native*) toggle_steam_binary ;; - Change[[:space:]]player[[:space:]]name*) change_name - ;; - esac - done -} -info_dialog(){ - local title="DZGUI" - $steamsafe_zenity --info --width=500 --title="$title" --text="$1" 2>/dev/null -} -a2s(){ - local ip="$1" - local qport="$2" - local mode="$3" - logger A2S "Querying '$ip:$qport' with mode '$mode'" - python3 $helpers_path/query.py "$ip" "$qport" "$mode" -} -format_config_address(){ - local address="$1" - parse(){ - local ind="$1" - <<< $address awk -F: "{print \$$ind}" - } - local ip=$(parse 1) - local gameport=$(parse 2) - local qport=$(parse 3) - printf "%s\n%s\n%s" "$ip" "$gameport" "$qport" -} -query_and_connect(){ - source $config_file - local switch="$1" - local ips="$2" - case "$switch" in - "history") - if [[ -z $2 ]]; then - warn "No recent servers in history" - return 1 - fi - readarray -t ip_arr <<< "$ips" - ;; - "connect"|"delete") - if [[ ${#ip_list[@]} -eq 0 ]]; then - warn "No servers currently saved" - return 1 - fi - ips="$(printf "%s\n" "${ip_list[@]}")" - readarray -t ip_arr <<< "$ips" - ;; - esac - [[ ${#ip_arr[@]} -lt 1 ]] && { popup 600; return; } - > $tmp - q(){ - for (( i = 0; i < ${#ip_arr[@]}; ++i )); do - - local address="${ip_arr[$i]}" - readarray -t address < <(format_config_address "$address") - local ip="${address[0]}" - local gameport="${address[1]}" - local qport="${address[2]}" - unset address - - local info - echo "# Querying $ip:$qport" - info=$(a2s "$ip" "$qport" info) - [[ $? -eq 1 ]] && continue - local keywords=$(<<< $info jq -r '.keywords') - local vars=("name" "address" "count" "time" "dist" "qport") - for j in ${vars[@]}; do - local -n var=$j - case "$j" in - "time") - var=$(<<< "$keywords" grep -o '[0-9][0-9]:[0-9][0-9]') - ;; - "name") - var=$(<<< "$info" jq -r --arg arg $j '.[$arg]') - if [[ "${#var}" -gt 50 ]]; then - var="$(<<< "$var" awk '{print substr($0,1,50) "..."}')" - fi - ;; - "dist") - check_geo_file - local_latlon - var=$(get_dist $(<<< $address awk -F: '{print $1}')) - ;; - *) - var=$(<<< "$info" jq -r --arg arg $j '.[$arg]') - ;; - esac - printf "%s\n" "$var" >> $tmp - done - unset $j - done - } - - (q) | pdialog - [[ $? -eq 1 ]] && return - populate "$switch" -} -exclude_fpp(){ - response=$(<<< "$response" jq '[.[]|select(.gametype|split(",")|any(. == "no3rd")|not)]') -} -exclude_tpp(){ - response=$(<<< "$response" jq '[.[]|select(.gametype|split(",")|any(. == "no3rd"))]') -} -exclude_full(){ - response=$(echo "$response" | jq '[.[]|select(.players!=.max_players)]') -} -exclude_empty(){ - response=$(echo "$response" | jq '[.[]|select(.players!=0)]') -} -filter_maps(){ - echo "# Filtering maps" - [[ $ret -eq 98 ]] && return - local maps=$(echo "$response" | jq -r '.[].map//empty|ascii_downcase' | sort -u) - local map_ct=$(echo "$maps" | wc -l) - local map_sel=$(echo "$maps" | $steamsafe_zenity --list --column="Check" --width=1200 --height=800 2>/dev/null --title="DZGUI" --text="Found $map_ct map types") - echo "[DZGUI] Selected '$map_sel'" - if [[ -z $map_sel ]]; then - ret=97 - return - fi - echo "100" - response=$(echo "$response" | jq --arg map "$map_sel" '[.[]|select(.map)//empty|select(.map|ascii_downcase == $map)]') -} -exclude_daytime(){ - response=$(echo "$response" | jq '[.[]|select(.gametype|test(",[0][6-9]:|,[1][0-6]:")|not)]') -} -exclude_nighttime(){ - response=$(echo "$response" | jq '[.[]|select(.gametype|test(",[1][7-9]:|,[2][0-4]:|[0][0-5]:")|not)]') -} -keyword_filter(){ - response=$(echo "$response" | jq --arg search "$search" '[.[]|select(.name|ascii_downcase | contains($search))]') -} -exclude_lowpop(){ - response=$(echo "$response" | jq '[.[]|select(.players > 9)]') -} -exclude_nonascii(){ - response=$(echo "$response" | jq -r '[.[]|select(.name|test("^([[:ascii:]])*$"))]') -} -strip_null(){ - response=$(echo "$response" | jq -r '[.[]|select(.map//empty)]') -} -local_latlon(){ - if [[ -z $(command -v dig) ]]; then - local local_ip=$(curl -Ls "https://ipecho.net/plain") - else - 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),\(.lon)"') - local_lat=$(echo "$res" | awk -F, '{print $1}') - local_lon=$(echo "$res" | awk -F, '{print $2}') -} -disabled(){ - if [[ -z ${disabled[@]} ]]; then - printf "%s" "-" - else - for((i=0;i<${#disabled[@]};i++)); do - if [[ $i < $((${#disabled[@]}-1)) ]]; then - printf "%s, " "${disabled[$i]}" - else - printf "%s" "${disabled[$i]}" - fi - - done - fi -} -pagination(){ - if [[ ${#qport[@]} -eq 1 ]]; then - entry=server - else - entry=servers - fi - printf "DZGUI %s | " "$version" - printf "Mode: %s |" "$mode" - printf "Fav: %s " "$fav_label" - printf "\nIncluded: %s | " "$filters" - printf "Excluded: %s " "$(disabled)" - if [[ -n $search ]]; then - printf "| Keyword: %s " "$search" - fi - printf "\nReturned: %s %s of %s | " "${#qport[@]}" "$entry" "$total_servers" - printf "Players in-game: %s" "$players_online" -} -check_geo_file(){ - local gzip="$helpers_path/ips.csv.gz" - curl -Ls "$sums_url" > "$sums_path" - cd "$helpers_path" - md5sum -c "$sums_path" 2>/dev/null 1>&2 - local res=$? - cd $OLDPWD - [[ $res -eq 0 ]] && return - update(){ - mkdir -p "$helpers_path" - echo "# Fetching new geolocation DB" - curl -Ls "$db_file" > "$gzip" - echo "# Extracting coordinates" - #force overwrite - gunzip -f "$gzip" - echo "# Preparing helper file" - curl -Ls "$km_helper_url" > "$km_helper" - chmod +x $km_helper - echo "100" - } - update > >(pdialog) -} -choose_filters(){ - if [[ $is_steam_deck -eq 0 ]]; then - sd_res="--width=1920 --height=1080" - fi - sels=$($steamsafe_zenity --title="DZGUI" --text="Server search" --list --checklist --column "Check" --column "Option" --hide-header TRUE "All maps (untick to select from map list)" TRUE "Daytime" TRUE "Nighttime" TRUE "1PP" TRUE "3PP" False "Empty" False "Full" TRUE "Low population" FALSE "Non-ASCII titles" FALSE "Keyword search" $sd_res 2>/dev/null) - if [[ $sels =~ Keyword ]]; then - local search - while true; do - search=$(edialog "Search (case insensitive)" | awk '{print tolower($0)}') - [[ $? -eq 1 ]] && return 1 - [[ -z $search ]] && warn "Cannot submit an empty keyword" - [[ -n $search ]] && break - done - fi - [[ -z $sels ]] && return - echo "$sels" | sed 's/|/, /g;s/ (untick to select from map list)//' - echo "$search" -} -get_dist(){ - local given_ip="$1" - local network="$(<<< "$given_ip" awk -F. '{OFS="."}{print $1"."$2}')" - local binary=$(grep -E "^$network\." $geo_file) - local three=$(<<< $given_ip awk -F. '{print $3}') - local host=$(<<< $given_ip awk -F. '{print $4}') - local res=$(<<< "$binary" awk -F[.,] -v three=$three -v host=$host '$3 <=three && $7 >= three{if($3>three || ($3==three && $4 > host) || $7 < three || ($7==three && $8 < host)){next}{print}}' | awk -F, '{print $7,$8}') - local remote_lat=$(<<< "$res" awk '{print $1}') - local remote_lon=$(<<< "$res" awk '{print $2}') - if [[ -z $remote_lat ]]; then - local dist="Unknown" - echo "$dist" - else - local dist=$($km_helper "$local_lat" "$local_lon" "$remote_lat" "$remote_lon") - LC_NUMERIC=C printf "%05.0f %s" "$dist" "km" - fi -} -prepare_filters(){ - local sels="$1" - local search="$2" - [[ ! "$sels" =~ "Full" ]] && { exclude_full; disabled+=("Full") ; } - [[ ! "$sels" =~ "Empty" ]] && { exclude_empty; disabled+=("Empty") ; } - [[ ! "$sels" =~ "Daytime" ]] && { exclude_daytime; disabled+=("Daytime") ; } - [[ ! "$sels" =~ "Nighttime" ]] && { exclude_nighttime; disabled+=("Nighttime") ; } - [[ ! "$sels" =~ "Low population" ]] && { exclude_lowpop; disabled+=("Low-pop") ; } - [[ ! "$sels" =~ "Non-ASCII titles" ]] && { exclude_nonascii; disabled+=("Non-ASCII") ; } - [[ ! "$sels" =~ "1PP" ]] && { exclude_fpp; disabled+=("FPP") ; } - [[ ! "$sels" =~ "3PP" ]] && { exclude_tpp; disabled+=("TPP") ; } - [[ -n "$search" ]] && keyword_filter - strip_null -} -munge_servers(){ - local sels="$1" - local search="$2" - write_fifo(){ - [[ -p $fifo ]] && rm $fifo - mkfifo $fifo - local dist - for((i=0;i<${#qport[@]};i++)); do - dist=$(get_dist ${addr[$i]}) - - printf "%s\n%s\n%s\n%s\n%03d\n%03d\n%s\n%s:%s\n%s\n" "${name[$i]}" "${map[$i]}" "${fpp[$i]}" "${gametime[$i]}" \ - "${players[$i]}" "${max[$i]}" "$dist" "${addr[$i]}" "${gameport[$i]}" "${qport[$i]}" >> $fifo - done - } - response="$(cat /tmp/dz.servers)" - if [[ ! "$sels" =~ "All maps" ]]; then - filter_maps > >(pdialog) - [[ $? -eq 1 ]] && return - disabled+=("All maps") - fi - [[ $ret -eq 97 ]] && return - prepare_filters "$sels" "$search" - [[ $? -eq 1 ]] && return - if [[ $(echo "$response" | jq 'length') -eq 0 ]]; then - $steamsafe_zenity --error --text="No matching servers" 2>/dev/null - return - fi - #jq bug #1788, raw output (-r) cannot be used with ASCII - local name=$(<<< "$response" jq -a '.[].name' | sed 's/\\u[0-9a-z]\{4\}//g;s/^"//;s/"$//') - local map=$(<<< "$response" jq -r '.[].map|if type == "string" then ascii_downcase else "null" end') - local gametime=$(<<< "$response" jq -r '.[]|(if .gametype == null then "null" else .gametype end)|scan("[0-9]{2}:[0-9]{2}$")') - local fpp=$(<<< "$response" jq -r '.[].gametype|split(",")|if any(. == "no3rd") then "1PP" else "3PP" end') - local players=$(<<< "$response" jq -r '.[].players') - local max=$(<<< "$response" jq -r '.[].max_players') - local addr=$(<<< "$response" jq -r '.[].addr|split(":")[0]') - local gameport=$(<<< "$response" jq -r '.[]|(if .gameport == null then "null" else .gameport end)') - local qport=$(<<< "$response" jq -r '.[].addr|split(":")[1]') - - readarray -t qport <<< $qport - readarray -t gameport <<< $gameport - readarray -t addr <<< $addr - readarray -t name <<< $name - readarray -t fpp <<< $fpp - readarray -t players <<< $players - readarray -t map <<< $map - readarray -t max <<< $max - readarray -t gametime <<< $gametime - - if [[ $is_steam_deck -eq 0 ]]; then - sd_res="--width=1920 --height=1080" - fi - write_fifo & - pid=$! - local sel=$($steamsafe_zenity --text="$(pagination)" --title="DZGUI" --list --column=Name --column=Map --column=PP --column=Gametime --column=Players --column=Max --column=Distance --column=IP --column=Qport $sd_res --print-column=1,8,9 --separator=%% 2>/dev/null < <(while true; do cat $fifo; done)) - if [[ -z $sel ]]; then - rm $fifo - kill -9 $pid 2>/dev/null - return 1 - else - rm $fifo - kill -9 $pid - echo $sel - fi -} -debug_servers(){ - debug_res=$(curl -Ls "https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100&limit=10&key=$steam_api") - local len=$(<<< "$debug_res" jq '[.response.servers[]]|length') - if [[ $len -eq 0 ]]; then - return 1 - else - return 0 - fi -} -server_browser(){ - unset ret - local filters="$(<<< "$1" awk 'NR==1 {print $0}')" - local keywords="$(<<< "$1" awk 'NR==2 {print $0}')" - echo "# Checking Steam API" - check_steam_api - [[ $? -eq 1 ]] && return - echo "# Checking geolocation file" - check_geo_file - echo "# Calculating server distances" - local_latlon - [[ $ret -eq 97 ]] && return - - local limit=20000 - local url="https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100&limit=$limit&key=$steam_api" - - echo "# Getting server list" - curl -Ls "$url" | jq -r '.response.servers' > /tmp/dz.servers - total_servers=$(< /tmp/dz.servers jq 'length' | numfmt --grouping) - players_online=$(curl -Ls "https://api.steampowered.com/ISteamUserStats/GetNumberOfCurrentPlayers/v1/?appid=$aid" \ - | jq '.response.player_count' | numfmt --grouping) - debug_servers - [[ $? -eq 1 ]] && { popup 1100; return 1; } - - echo "100" - local sel=$(munge_servers "$filters" "$keywords") - if [[ -z $sel ]]; then - unset filters - unset search - ret=98 - sd_res="--width=1280 --height=800" - return 1 - fi - - readarray -t address < <(format_table_results "$sel") - local ip="${address[1]}" - local gameport="${address[2]}" - local qport="${address[3]}" - unset address - - connect "$ip" "$gameport" "$qport" - sd_res="--width=1280 --height=800" -} -mods_disk_size(){ - printf "Total size on disk: %s | " $(du -sh "$workshop_dir" | awk '{print $1}') - printf "%s mods | " $(ls -1 "$workshop_dir" | wc -l) - printf "Location: %s/steamapps/workshop/content/221100" "$steam_path" -} -main_menu(){ - logger INFO "${FUNCNAME[0]}" - logger INFO "Setting mode" - set_mode - while true; do - set_header "main_menu" - rc=$? - logger INFO "set_header rc is $rc" - if [[ $rc -eq 0 ]]; then - case "$sel" in - "") warn "No item was selected." ;; - " Server browser") - local filters=$(choose_filters) - [[ -z $filters ]] && continue - (server_browser "$filters") | pdialog ;; - " My servers") query_and_connect "connect" ;; - " Quick connect to favorite server") connect_to_fav "$fav_server" ;; - " Connect by ID") connect_by_id ;; - " Connect by IP") connect_by_ip ;; - " Recent servers (last 10)") query_and_connect "history" "$(cat $hist_file)" ;; - " Add server by ID") add_by_id ;; - " Add server by IP") add_by_ip ;; - " Add favorite server") add_by_fav ;; - " Change favorite server") add_by_fav ;; - " Delete server") query_and_connect "delete" ;; - " List installed mods") - list_mods | sed 's/\t/\n/g' | $steamsafe_zenity --list --column="Mod" --column="Symlink" --column="Dir" \ - --title="DZGUI" $sd_res --text="$(mods_disk_size)" \ - --print-column="" 2>/dev/null - ;; - " View changelog") changelog ;; - " Advanced options") - options_menu - main_menu - return - ;; - " Help file ⧉") help_file ;; - " Report bug ⧉") report_bug ;; - " Forum ⧉") forum ;; - " Sponsor ⧉") sponsor ;; - " Hall of fame ⧉") hof ;; - esac - else - logger INFO "Returning from main menu" - return - fi - done -} -set_fav(){ - local fav="$1" - logger INFO "${FUNCNAME[0]}" - - readarray -t address < <(format_config_address "$fav") - local ip="${address[0]}" - local gameport="${address[1]}" - local qport="${address[2]}" - unset address - - local info=$(a2s "$ip" "$qport" info) - local name=$(<<< $info jq -r '.name') - echo "'$name'" -} -check_unmerged(){ - logger INFO "${FUNCNAME[0]}" - if [[ -f ${config_path}.unmerged ]]; then - merge_config - rm ${config_path}.unmerged - fi } merge_config(){ - source $config_file - legacy_fav - legacy_ids - [[ -z $staging_dir ]] && staging_dir="/tmp" + [[ -z $staging_dir ]] && staging_dir="/tmp" update_config - tdialog "Wrote new config format to \n${config_file}\nIf errors occur, you can restore the file:\n${config_file}.old" + tdialog "Wrote new config format to \n${config_file}\nIf errors occur, you can restore the file:\n${config_file}.old" } -download_new_version(){ - if [[ $is_steam_deck -eq 1 ]]; then - freedesktop_dirs - fi - source_script=$(realpath "$0") - source_dir=$(dirname "$source_script") - mv $source_script $source_script.old - echo "# Downloading version $upstream" - curl -Ls "$version_url" > $source_script - rc=$? - if [[ $rc -eq 0 ]]; then - echo "[DZGUI] Wrote $upstream to $source_script" - chmod +x $source_script - touch ${config_path}.unmerged - echo "100" - $steamsafe_zenity --question --width=500 --title="DZGUI" --text "DZGUI $upstream successfully downloaded.\nTo view the changelog, select Changelog.\nTo use the new version, select Exit and restart." --ok-label="Changelog" --cancel-label="Exit" 2>/dev/null - code=$? - if [[ $code -eq 0 ]]; then - changelog - exit - elif [[ $code -eq 1 ]]; then - exit - fi - else - echo "100" - mv $source_script.old $source_script - $steamsafe_zenity --info --title="DZGUI" --text "[ERROR] 99: Failed to download new version." 2>/dev/null - return - fi - -} -check_branch(){ - logger INFO "${FUNCNAME[0]}" - if [[ $branch == "stable" ]]; then - version_url="$stable_url/dzgui.sh" - elif [[ $branch == "testing" ]]; then - version_url="$testing_url/dzgui.sh" - fi - logger INFO "Branch is $branch" - upstream=$(curl -Ls "$version_url" | awk -F= '/^version=/ {print $2}') - logger INFO "Upstream version is $version" -} -enforce_dl(){ - download_new_version > >(pdialog) -} -prompt_dl(){ - $steamsafe_zenity --question --title="DZGUI" --text "Version conflict.\n\nYour branch:\t\t\t$branch\nYour version:\t\t\t$version\nUpstream version:\t\t$upstream\n\nVersion updates introduce important bug fixes and are encouraged.\n\nAttempt to download latest version?" --width=500 --ok-label="Yes" --cancel-label="No" 2>/dev/null - rc=$? - if [[ $rc -eq 1 ]]; then - return - else - echo "100" - download_new_version > >(pdialog) - fi +check_unmerged(){ + if [[ -f ${config_path}.unmerged ]]; then + merge_config + rm ${config_path}.unmerged + fi } check_version(){ - logger INFO "${FUNCNAME[0]}" - [[ -f $config_file ]] && source $config_file - [[ -z $branch ]] && branch="stable" - check_branch - [[ ! -f "$freedesktop_path/dzgui.desktop" ]] && freedesktop_dirs - if [[ $version == $upstream ]]; then - logger INFO "Local version is same as upstream" - check_unmerged - else - logger INFO "Local and remote version mismatch" - if [[ $enforce_dl -eq 1 ]]; then - enforce_dl - else - prompt_dl - fi - fi + local version_url=$(format_version_url) + local upstream=$(curl -Ls "$version_url" | awk -F= '/^version=/ {print $2}') + logger INFO "Local branch: '$branch', local version: $version" + if [[ $branch == "stable" ]]; then + version_url="$stable_url/dzgui.sh" + elif [[ $branch == "testing" ]]; then + version_url="$testing_url/dzgui.sh" + fi + local upstream=$(curl -Ls "$version_url" | awk -F= '/^version=/ {print $2}') + [[ ! -f "$freedesktop_path/$appname.desktop" ]] && freedesktop_dirs + if [[ $version == $upstream ]]; then + logger INFO "Local version is same as upstream" + check_unmerged + else + logger WARN "Local and remote version mismatch: $version != $upstream" + prompt_dl + fi +} +download_new_version(){ + local version_url="$(format_version_url)" + mv "$src_path" "$src_path.old" + curl -Ls "$version_url" > "$src_path" + rc=$? + if [[ $rc -eq 0 ]]; then + logger INFO "Wrote new version to $src_path" + chmod +x "$src_path" + touch "${config_path}.unmerged" + fdialog "DZGUI $upstream successfully downloaded. To use the new version, select Exit and restart." + logger INFO "User exited after version upgrade" + exit 0 + else + mv "$src_path.old" "$src_path" + logger WARN "curl failed to fetch new version. Rolling back" + fdialog "Failed to download the new version. Restoring old version" + return 1 + fi + dl_changelog +} +prompt_dl(){ + _text(){ + cat <<-EOF + Version conflict. + + Your branch: $branch + Your version: $version + Upstream version: $upstream + + Version updates introduce important bug fixes and are encouraged. Attempt to download the latest version? + EOF + } + qdialog "$(_text)" "Yes" "No" + if [[ $? -eq 1 ]]; then + return 0 + else + download_new_version + fi +} +dl_changelog(){ + local mdbranch + [[ $branch == "stable" ]] && mdbranch="dzgui" + [[ $branch == "" ]] && mdbranch="testing" + local md="https://raw.githubusercontent.com/$author/dztui/${mdbranch}/CHANGELOG.md" + curl -Ls "$md" > "$state_path/CHANGELOG.md" } check_architecture(){ - logger INFO "${FUNCNAME[0]}" - cpu=$(cat /proc/cpuinfo | grep "AMD Custom APU 0405") - if [[ -n "$cpu" ]]; then - is_steam_deck=1 - logger INFO "Setting architecture to 'Steam Deck'" - else - is_steam_deck=0 - logger INFO "Setting architecture to 'desktop'" - fi + local cpu=$(< /proc/cpuinfo grep "AMD Custom APU 0405") + if [[ -n "$cpu" ]]; then + is_steam_deck=1 + logger INFO "Setting architecture to 'Steam Deck'" + else + is_steam_deck=0 + logger INFO "Setting architecture to 'desktop'" + fi } -print_ip_list(){ - [[ ${#ip_list} -eq 0 ]] && return - printf "\t\"%s\"\n" "${ip_list[@]}" +check_map_count(){ + [[ $is_steam_deck -eq 1 ]] && return 0 + local count=1048576 + local conf_file="/etc/sysctl.d/dayz.conf" + if [[ -f $conf_file ]]; then + logger DEBUG "System map count is already $count or higher" + return 0 + fi + qdialog "sudo password required to check system vm map count." "OK" "Cancel" + if [[ $? -eq 0 ]]; then + local pass + logger INFO "Prompting user for sudo escalation" + pass=$($steamsafe_zenity --password) + if [[ $? -eq 1 ]]; then + logger WARN "User aborted password prompt" + return 1 + fi + local ct=$(sudo -S <<< "$pass" sh -c "sysctl -q vm.max_map_count | awk -F'= ' '{print \$2}'") + logger DEBUG "Old map count is $ct" + local new_ct + [[ $ct -lt $count ]] && ct=$count + sudo -S <<< "$pass" sh -c "echo 'vm.max_map_count=$ct' > $conf_file" + sudo sysctl -p "$conf_file" + logger DEBUG "Updated map count to $count" + else + logger WARN "User aborted map count prompt" + return 1 + fi +} +qdialog(){ + local text="$1" + local ok="$2" + local cancel="$3" + $steamsafe_zenity --question --text="$1" --ok-label="$ok" --cancel-label="$cancel" "${zenity_flags[@]}" +} +pdialog(){ + $steamsafe_zenity --progress --pulsate --auto-close "${zenity_flags[@]}" +} +fdialog(){ + $steamsafe_zenity --warning --ok-label="Exit" --text="$1" "${zenity_flags[@]}" +} +tdialog(){ + $steamsafe_zenity --info --text="$1" "${zenity_flags[@]}" +} +steam_deps(){ + local flatpak + local steam + [[ $(command -v flatpak) ]] && flatpak=$(flatpak list | grep valvesoftware.Steam) + steam=$(command -v steam) + if [[ -z "$steam" ]] && [[ -z "$flatpak" ]]; then + local msg="Found neither Steam nor Flatpak Steam" + raise_error_and_quit "$msg" + exit 1 + elif [[ -n "$steam" ]] && [[ -n "$flatpak" ]]; then + [[ -n $preferred_client ]] && return 0 + if [[ -z $preferred_client ]]; then + preferred_client="steam" + fi + elif [[ -n "$steam" ]]; then + preferred_client="steam" + else + preferred_client="flatpak" + fi + update_config + logger INFO "Preferred client set to '$preferred_client'" } migrate_files(){ if [[ ! -f $config_path/dztuirc.oldapi ]]; then cp $config_file $config_path/dztuirc.oldapi - rm $hist_file fi + logger INFO "Migrated old API file" + [[ -f $hist_file ]] && rm $hist_file + logger INFO "Wiped old history file" } -legacy_fav(){ - source $config_file - [[ -z $fav ]] && return - local res=$(map_fav_to_ip "$fav") - source $config_file -} -legacy_ids(){ - source $config_file - [[ -z $whitelist ]] && return - local res=$(map_id_to_ip "$whitelist") - source $config_file -} -map_fav_to_ip(){ - local to_add="$1" - fav_server=$(curl -s "$api" -H "Authorization: Bearer "$api_key"" \ - -G -d "sort=-players" \ - -d "filter[game]=$game" \ - -d "filter[ids][whitelist]=$to_add" \ - | jq -r '.data[].attributes|"\(.ip):\(.port):\(.portQuery)"') - update_config - fav_label=$(set_fav "$fav_server") -} -map_id_to_ip(){ - local to_add="$1" - local mode="$2" - local res=$(curl -s "$api" -H "Authorization: Bearer "$api_key"" \ - -G -d "sort=-players" \ - -d "filter[game]=$game" \ - -d "filter[ids][whitelist]=$to_add") - local len=$(<<< "$res" jq '.data|length') - [[ $len -eq 0 ]] && return 1 - local ip=$(<<< "$res" jq -r '.data[].attributes|"\(.ip):\(.port):\(.portQuery)"') - if [[ $mode == "connect" ]]; then - echo "$ip" - return 0 - fi - for i in $ip; do - if [[ ${ip_list[@]} =~ $i ]]; then - [[ ! $len -eq 1 ]] && continue - warn "This server is already in your list" - return 2 - fi - ip_list+=("$i") - update_config +stale_symlinks(){ + local game_dir="$steam_path/steamapps/common/DayZ" + for l in $(find "$game_dir" -xtype l); do + logger DEBUG "Updating stale symlink '$l'" + unlink $l done - echo $i } -add_by_ip(){ - local sel=$(parse_ips) - [[ -z $sel ]] && return - - readarray -t address < <(format_table_results "$sel") - local ip="${address[1]}" - local gameport="${address[2]}" - local qport="${address[3]}" - unset address - - if [[ ${ip_list[@]} =~ "$ip:$gameport:$qport" ]]; then - warn "This server is already in your favorites" - return +check_news(){ + [[ $branch == "stable" ]] && news_url="$stable_url/news" + [[ $branch == "testing" ]] && news_url="$testing_url/news" + local result=$(curl -Ls "$news_url") + local sum=$(<<< "$result" md5sum | awk '{print $1}') + if [[ $sum != "$seen_news" ]]; then + logger WARN "Local news checksum '$seen_news' != '$sum'" + seen_news="$sum" + update_config + echo "$result" fi - - ip_list+=("$ip:$gameport:$qport") - update_config - info "Added $ip:$gameport:$qport to:\n${config_path}dztuirc\nIf errors occurred, you can restore the file:\n${config_path}dztuirc.old" } -pdialog(){ - $steamsafe_zenity --progress --pulsate --auto-close --title="DZGUI" --width=500 2>/dev/null -} -edialog(){ - if [[ $is_steam_deck -eq 1 ]] && [[ $(test_display_mode) == "gm" ]]; then - kdialog --inputbox "$1" --title "DZGUI" --geometry 500 2>/dev/null +local_latlon(){ + if [[ -z $(command -v dig) ]]; then + local local_ip=$(curl -Ls "https://ipecho.net/plain") else - $steamsafe_zenity --entry --text="$1" --width=500 --title="DZGUI" 2>/dev/null + local local_ip=$(dig -4 +short myip.opendns.com @resolver1.opendns.com) fi -} -tdialog(){ - $steamsafe_zenity --info --text="$1" --width=500 --title="DZGUI" 2>/dev/null -} -qdialog(){ - $steamsafe_zenity --question --text="$1" --width=500 --title="DZGUI" 2>/dev/null -} -add_by_id(){ - local mode="$1" - if [[ -z $api_key ]]; then - qdialog "Requires Battlemetrics API key. Set one now?" - [[ $? -eq 1 ]] && return 1 - while true; do - api_key=$(edialog "Battlemetrics API key") - [[ $? -eq 1 ]] && return 1 - [[ -z $api_key ]] && { warn "Invalid API key"; continue; } - if [[ $(test_bm_api $api_key) -eq 1 ]]; then - warn "Invalid API key" - unset api_key - continue - fi - update_config - break - done + local url="http://ip-api.com/json/$local_ip" + local res=$(curl -Ls "$url" | jq -r '"\(.lat)\n\(.lon)"') + if [[ -z "$res" ]]; then + logger WARN "Failed to get local coordinates" + return 1 fi - while true; do - local id - id=$(edialog "Enter server ID") - [[ $? -eq 1 ]] && return 1 - if [[ ! $id =~ ^[0-9]+$ ]]; then - warn "Invalid ID" - else - local ip - ip=$(map_id_to_ip "$id" "$mode") - case "$?" in - 1) - warn "Invalid ID" - continue - ;; - 2) - continue - ;; - *) - if [[ $mode == "connect" ]]; then - echo "$ip" - return 0 - fi - tdialog "Added $ip to:\n${config_path}dztuirc\nIf errors occurred, you can restore the file:\n${config_path}dztuirc.old" - return 0 - ;; - esac - fi - done -} -toggle_debug(){ - if [[ $debug -eq 1 ]]; then - debug=0 - else - debug=1 - fi - update_config - -} -setup(){ - logger INFO "${FUNCNAME[0]}" - [[ -z $fav_server ]] && return - items[10]=" Change favorite server" - [[ -n $fav_label ]] && return - fav_label=$(set_fav $fav_server) - update_config -} -check_map_count(){ - logger INFO "${FUNCNAME[0]}" - [[ $is_steam_deck -eq 1 ]] && return - local count=1048576 - logger INFO "Checking system map count" - echo "[DZGUI] Checking system map count" - if [[ ! -f /etc/sysctl.d/dayz.conf ]]; then - $steamsafe_zenity --question --width=500 --title="DZGUI" --cancel-label="Cancel" --ok-label="OK" --text "sudo password required to check system vm map count." - local rc=$? - logger INFO "Return code is $rc" - if [[ $rc -eq 0 ]]; then - local pass - logger INFO "Prompting user for sudo escalation" - pass=$($steamsafe_zenity --password) - local rc - logger INFO "Return code is $rc" - [[ $rc -eq 1 ]] && exit 1 - local ct=$(sudo -S <<< "$pass" sh -c "sysctl -q vm.max_map_count | awk -F'= ' '{print \$2}'") - local new_ct - [[ $ct -lt $count ]] && ct=$count - logger INFO "Updating map count" - sudo -S <<< "$pass" sh -c "echo 'vm.max_map_count=$ct' > /etc/sysctl.d/dayz.conf" - sudo sysctl -p /etc/sysctl.d/dayz.conf - else - logger INFO "Zenity dialog failed or user exit" - exit 1 - fi - fi -} -change_name(){ - while true; do - local name=$($steamsafe_zenity --entry --text="Enter desired in-game name" --title="DZGUI" 2>/dev/null) - [[ -z "${name//[[:blank:]]/}" ]] && continue - update_config - info "Changed name to: '$name'.\nIf errors occur, you can restore the file '${config_path}dztuirc.old'." - return - done -} -add_by_fav(){ - local sel=$(parse_ips) - [[ -z $sel ]] && return - - readarray -t address < <(format_table_results "$sel") - local ip="${address[1]}" - local gameport="${address[2]}" - local qport="${address[3]}" - unset address - fav_server="$ip:$gameport:$qport" - fav_label=$(set_fav "$fav_server") - - update_config - info "Added $fav_server to:\n${config_path}dztuirc\nIf errors occurred, you can restore the file:\n${config_path}dztuirc.old" - - items[10]=" Change favorite server" + echo "$res" > "$coords_file" } lock(){ - [[ ! -d $config_path ]] && return - if [[ ! -f ${config_path}.lockfile ]]; then - touch ${config_path}.lockfile - fi - pid=$(cat ${config_path}.lockfile) - ps -p $pid -o pid= >/dev/null 2>&1 - res=$? - if [[ $res -eq 0 ]]; then - info "DZGUI already running ($pid)" - exit - elif [[ $pid == $$ ]]; then - : - else - echo $$ > ${config_path}.lockfile - fi + [[ ! -f $lock_file ]] && touch $lock_file + local pid=$(cat $lock_file) + ps -p $pid -o pid= >/dev/null 2>&1 + res=$? + if [[ $res -eq 0 ]]; then + local msg="DZGUI already running ($pid)" + raise_error_and_quit "$msg" + elif [[ $pid == $$ ]]; then + : + else + echo $$ > $lock_file + fi +} +get_hash(){ + local file="$1" + md5sum "$1" | awk '{print $1}' } fetch_a2s(){ - [[ -d $helpers_path/a2s ]] && return - local sha=c7590ffa9a6d0c6912e17ceeab15b832a1090640 - local author="yepoleb" - local repo="python-a2s" - local url="https://github.com/$author/$repo/tarball/$sha" - local prefix="${author^}-$repo-${sha:0:7}" - local file="$prefix.tar.gz" - curl -Ls "$url" > "$helpers_path/$file" - tar xf "$helpers_path/$file" -C "$helpers_path" "$prefix/a2s" --strip=1 - rm "$helpers_path/$file" + [[ -d $helpers_path/a2s ]] && { logger INFO "A2S helper is current"; return 0; } + local sha=c7590ffa9a6d0c6912e17ceeab15b832a1090640 + local author="yepoleb" + local repo="python-a2s" + local url="https://github.com/$author/$repo/tarball/$sha" + local prefix="${author^}-$repo-${sha:0:7}" + local file="$prefix.tar.gz" + curl -Ls "$url" > "$helpers_path/$file" + tar xf "$helpers_path/$file" -C "$helpers_path" "$prefix/a2s" --strip=1 + rm "$helpers_path/$file" + logger INFO "Updated A2S helper to sha '$sha'" } fetch_dzq(){ - [[ -f $helpers_path/dayzquery.py ]] && return - local sha=ccc4f71b48610a1885706c9d92638dbd8ca012a5 - local author="yepoleb" - local repo="dayzquery" - local url="https://raw.githubusercontent.com/$author/$repo/$sha/$repo.py" - curl -Ls "$url" > $helpers_path/a2s/$repo.py -} -fetch_query(){ - local sum="7cbae12ae68b526e7ff376b638123cc7" - local file="$helpers_path/query.py" - if [[ -f $file ]] && [[ $(md5sum $file | awk '{print $1}') == $sum ]]; then - return + local sum="232f42b98a3b50a0dd6e73fee55521b2" + local file="$helpers_path/a2s/dayzquery.py" + if [[ -f $file ]] && [[ $(get_hash "$file") == $sum ]]; then + logger INFO "DZQ is current" + return 0 + fi + local sha=ccc4f71b48610a1885706c9d92638dbd8ca012a5 + local author="yepoleb" + local repo="dayzquery" + local url="https://raw.githubusercontent.com/$author/$repo/$sha/dayzquery.py" + curl -Ls "$url" > "$file" + logger INFO "Updated DZQ to sha '$sha'" +} +fetch_helpers_by_sum(){ + declare -A sums + sums=( + ["ui.py"]="8c430f1465995cbd98f4ad8e2580a79d" + ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" + ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" + ["funcs"]="b04a0e34141e4e11da0a061802a822e3" + ) + local author="aclist" + local repo="dztui" + local branch="$branch" + local url="https://raw.githubusercontent.com/$author/$repo/$branch/helpers/$file" + + for i in "${!sums[@]}"; do + file="$i" + sum="${sums[$i]}" + full_path="$helpers_path/$file" + if [[ -f "$full_path" ]] && [[ $(get_hash "$helpers_path/$file") == $sum ]]; then + logger INFO "'$file' is current" + else + logger WARN "File '$full_path' checksum != '$sum'" + curl -Ls "$url" > "$full_path/$file" + if [[ ! $? -eq 0 ]]; then + raise_error_and_quit "Failed to fetch the file '$file'. Possible timeout?" + fi + fi + [[ $file == "funcs" ]] && chmod +x "$full_path" + logger INFO "Updated '$full_path' to sum '$sum'" + done + return 0 +} +fetch_geo_file(){ + # for binary releases + local geo_sum="e7f3b25223ac4dfd5e30a0b55bb3ff6c" + local km_sum="b038fdb8f655798207bd28de3a004706" + local gzip="$helpers_path/ips.csv.gz" + if [[ ! -f $geo_file ]] || [[ $(get_hash $geo_file) != $geo_sum ]]; then + curl -Ls "$geo_file_url" > "$gzip" + #force overwrite + gunzip -f "$gzip" + fi + if [[ ! -f $km_helper ]] || [[ $(get_hash $km_helper) != $km_sum ]]; then + curl -Ls "$km_helper_url" > "$km_helper" + chmod +x "$km_helper" fi - local author="aclist" - local repo="dzgui" - local url="https://raw.githubusercontent.com/$author/dztui/$repo/helpers/query.py" - curl -Ls "$url" > "$helpers_path/query.py" } fetch_helpers(){ - logger INFO "${FUNCNAME[0]}" - mkdir -p "$helpers_path" - [[ ! -f "$helpers_path/vdf2json.py" ]] && curl -Ls "$vdf2json_url" > "$helpers_path/vdf2json.py" fetch_a2s fetch_dzq - fetch_query + fetch_geo_file + fetch_helpers_by_sum } -update_steam_cmd(){ - preferred_client="$steam_cmd" - update_config +raise_error_and_quit(){ + local msg="$1" + logger CRITICAL "$msg" + fdialog "$msg" + exit 1 } -steam_deps(){ - logger INFO "${FUNCNAME[0]}" - local flatpak steam - [[ $(command -v flatpak) ]] && flatpak=$(flatpak list | grep valvesoftware.Steam) - steam=$(command -v steam) - if [[ -z "$steam" ]] && [[ -z "$flatpak" ]]; then - warn "Requires Steam or Flatpak Steam" - logger ERROR "Steam was missing" - exit - elif [[ -n "$steam" ]] && [[ -n "$flatpak" ]]; then - toggle_steam=1 - steam_cmd="steam" - [[ -n $preferred_client ]] && steam_cmd="$preferred_client" - [[ -z $preferred_client ]] && update_steam_cmd - elif [[ -n "$steam" ]]; then - steam_cmd="steam" - else - steam_cmd="flatpak run com.valvesoftware.Steam" - fi - logger INFO "steam_cmd set to $steam_cmd" +test_steam_api(){ + local key="$1" + [[ -z $key ]] && return 1 + local url="https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100&limit=10&key=$key" + local code=$(curl -ILs "$url" | grep -E "^HTTP") + [[ $code =~ 403 ]] && echo 1 + [[ $code =~ 200 ]] && echo 0 } -update_steam_cmd(){ - local new_cmd - preferred_client="$steam_cmd" - new_cmd="preferred_client=\"$preferred_client\"" - mv $config_file ${config_path}dztuirc.old - nr=$(awk '/preferred_client=/ {print NR}' ${config_path}dztuirc.old) - awk -v "var=$new_cmd" -v "nr=$nr" 'NR==nr {$0=var}{print}' ${config_path}dztuirc.old > ${config_path}dztuirc +test_bm_api(){ + local bm_api="https://api.battlemetrics.com/servers" + local key="$1" + [[ -z $key ]] && return 1 + local code=$(curl -ILs "$bm_api" \ + -H "Authorization: Bearer "$key"" -G \ + -d "filter[game]=$game" \ + | grep -E "^HTTP") + [[ $code =~ 401 ]] && echo 1 + [[ $code =~ 200 ]] && echo 0 } -steam_deps(){ - logger INFO "${FUNCNAME[0]}" - local flatpak steam - [[ $(command -v flatpak) ]] && flatpak=$(flatpak list | grep valvesoftware.Steam) - steam=$(command -v steam) - if [[ -z "$steam" ]] && [[ -z "$flatpak" ]]; then - warn "Requires Steam or Flatpak Steam" - logger ERROR "Steam was missing" - exit - elif [[ -n "$steam" ]] && [[ -n "$flatpak" ]]; then - toggle_steam=1 - steam_cmd="steam" - [[ -n $preferred_client ]] && steam_cmd="$preferred_client" - [[ -z $preferred_client ]] && update_steam_cmd - elif [[ -n "$steam" ]]; then - steam_cmd="steam" - else - steam_cmd="flatpak run com.valvesoftware.Steam" - fi - logger INFO "steam_cmd set to $steam_cmd" +find_default_path(){ + _discover(){ + default_steam_path=$(find / -type d \( -path "/proc" -o -path "*/timeshift" -o -path \ + "/tmp" -o -path "/usr" -o -path "/boot" -o -path "/proc" -o -path "/root" \ + -o -path "/sys" -o -path "/etc" -o -path "/var" -o -path "/lost+found" \) -prune \ + -o -regex ".*/Steam/ubuntu12_32$" -print -quit 2>/dev/null | sed 's@/ubuntu12_32@@') + } + if [[ $is_steam_deck -eq 1 ]]; then + default_steam_path="$HOME/.local/share/Steam" + logger INFO "Set default Steam path to $default_steam_path" + return 0 + fi + local def_path + local ubuntu_path + local flatpak_path + local debian_path + def_path="$HOME/.local/share/Steam" + ubuntu_path="$HOME/.steam/steam" + debian_path="$HOME/.steam/debian-installation" + flatpak_path="$HOME/.var/app/com.valvesoftware.Steam/data/Steam" + + for i in "$def_path" "$ubuntu_path" "$debian_path" "$flatpak_path"; do + if [[ -d "$i" ]]; then + default_steam_path="$i" + return 0 + fi + done + + local msg="Let DZGUI auto-discover Steam path (accurate, slower)\nSelect the Steam path manually (less accurate, faster)" + echo -e "$msg" | $steamsafe_zenity --list \ + --column="Choice" \ + --title="DZGUI" \ + --hide-header \ + --text="Steam is not installed in a standard location." \ + $sd_res + + case "$res" in + *auto*) discover ;; + *manual*) + zenity --info --text="\nSelect the top-level entry point to the location where Steam (not DayZ)\nis installed and before entering the \"steamapps\" path.\n\nE.g., if Steam is installed at:\n\"/media/mydrive/Steam\"\n\nCorrect:\n- \"/media/mydrive/Steam\"\n\nIncorrect:\n- \"/media/mydrive/Steam/steamapps/common/DayZ\"\n- \"/media/mydrive/\"" --width=500 && + file_picker ;; + esac +} +file_picker(){ + local path=$($steamsafe_zenity --file-selection --directory) + logger INFO "File picker path resolved to: $path" + if [[ -z "$path" ]]; then + logger WARN "Steam path selection was empty" + return + else + default_steam_path="$path" + fi +} +find_library_folder(){ + local search_path="$1" + steam_path="$(python3 "$helpers_path/vdf2json.py" -i "$1/steamapps/libraryfolders.vdf" \ + | jq -r '.libraryfolders[]|select(.apps|has("221100")).path')" + if [[ ! $? -eq 0 ]]; then + logger WARN "Failed to parse Steam path using '$search_path'" + return 1 + fi + logger INFO "Steam path resolved to: $steam_path" +} +create_config(){ + while true; do + local player_input="$($steamsafe_zenity \ + --forms \ + --add-entry="Player name (required for some servers)" \ + --add-entry="Steam API key" \ + --add-entry="BattleMetrics API key (optional)" \ + --title="DZGUI" \ + --text="DZGUI" $sd_res \ + --separator="@")" + #explicitly setting IFS crashes $steamsafe_zenity in loop + #and mapfile does not support high ascii delimiters + #so split fields with newline + readarray -t args < <(<<< "$player_input" sed 's/@/\n/g') + name="${args[0]}" + steam_api="${args[1]}" + api_key="${args[2]}" + + if [[ -z $player_input ]]; then + logger WARN "User aborted setup process" + exit 1 + fi + if [[ -z $steam_api ]]; then + tdialog "Steam API key canot be empty" + continue + elif [[ "${#steam_api}" -lt 32 ]] || [[ $(test_steam_api "$steam_api") -eq 1 ]]; then + tdialog "Invalid Steam API key" + continue + fi + if [[ -n $api_key ]] && [[ $(test_bm_api $api_key) -eq 1 ]]; then + tdialog "Invalid BM API key" + continue + fi + while true; do + if [[ -n $steam_path ]]; then + write_config + [[ $? -eq 0 ]] && logger INFO "Successfully created config file" + return 0 + fi + find_default_path + find_library_folder "$default_steam_path" + if [[ -z $steam_path ]]; then + logger raise_error "Steam path was empty" + zenity --question --text="DayZ not found or not installed at the chosen path." --ok-label="Choose path manually" --cancel-label="Exit" + if [[ $? -eq 0 ]]; then + logger INFO "User selected file picker" + file_picker + find_library_folder "$default_steam_path" + else + fdialog "Failed to find Steam at the provided location" + exit 1 + fi + else + branch="stable" + update_config + logger INFO "Wrote config to '$config_file'" + return 0 + fi + done + done +} +varcheck(){ + if [[ ! -f $config_file ]]; then + local msg="Config file '$config_file' missing. Start first-time setup now?" + qdialog "$msg" "Yes" "Exit" + if [[ $? -eq 1 ]]; then + logger CRITICAL "Config file missing, but user aborted setup" + exit 1 + fi + create_config + fi + source "$config_file" + local workshop_dir="$steam_path/steamapps/workshop/content/$aid" + local game_dir="$steam_path/steamapps/common/DayZ" + if [[ ! -d $steam_path ]] || [[ ! -d $game_dir ]]; then + logger WARN "DayZ path resolved to $game_dir" + logger WARN "Workshop path resolved to $workshop_dir" + pdialog "$msg" + if [[ $? -eq 1 ]]; then + logger CRITICAL "Malformed Steam path, but user aborted setup" + exit 1 + fi + create_config + return 0 + fi +} +is_dzg_downloading(){ + if [[ -d $steam_path ]] && [[ -d $steam_path/downloading/$aid ]]; then + logger WARN "DayZ may be scheduling updates" + return 0 + fi +} +is_steam_running(){ + local res=$(ps aux | grep "steamwebhelper" | grep -v grep) + if [[ -z $res ]]; then + logger WARN "Steam may not be running" + tdialog "Is Steam running? For best results, make sure Steam is open in the background." + return 0 + fi } initial_setup(){ - echo "# Initial setup" - run_depcheck - check_pyver - watcher_deps - check_architecture - check_version - check_map_count - fetch_helpers - config - steam_deps - run_varcheck + setup_dirs + setup_state_files + depcheck + check_pyver + test_gobject + watcher_deps + check_architecture + varcheck + source "$config_file" + lock + legacy_vars + check_version + check_map_count + steam_deps migrate_files - stale_symlinks - init_items - setup - echo "100" + stale_symlinks + #TODO: test fetching + fetch_helpers + local_latlon + is_steam_running + is_dzg_downloading + print_config_vals } main(){ - local parent=$(cat /proc/$PPID/comm) - [[ -f "$debug_log" ]] && rm "$debug_log" - lock - local zenv=$(zenity --version 2>/dev/null) - [[ -z $zenv ]] && { echo "Failed to find zenity"; logger "Missing zenity"; exit 1; } - initial_setup > >(pdialog) - main_menu - #TODO: tech debt: cruddy handling for steam forking - [[ $? -eq 1 ]] && pkill -f dzgui.sh + local zenv=$(zenity --version 2>/dev/null) + [[ -z $zenv ]] && { echo "Requires zenity <= 3.44.1"; exit 1; } + + printf "Initializing setup...\n" + initial_setup + local news=$(check_news) + + printf "All OK. Kicking off UI...\n" + [[ -n $news ]] && python3 "ui.py" "--init-ui" "$news" "$version" + [[ -z $news ]] && python3 "ui.py" "--init-ui" "null" "$version" } main +#TODO: tech debt: cruddy handling for steam forking +[[ $? -eq 1 ]] && pkill -f dzgui.sh diff --git a/helpers/funcs b/helpers/funcs new file mode 100644 index 0000000..0b09c00 --- /dev/null +++ b/helpers/funcs @@ -0,0 +1,1200 @@ +#!/usr/bin/env bash +set -o pipefail +version="5.0.0.rc-1" + +#CONSTANTS +aid=221100 +game="dayz" +app_name="dzgui" +app_name_upper="DZGUI" +workshop="steam://url/CommunityFilePage/" +sd_res="--width=1280 --height=800" +steamsafe_zenity="/usr/bin/zenity" +separator="␞" + +##CONFIG +config_path="$HOME/.config/dztui" +config_file="$config_path/dztuirc" +source $config_file + +#PATHS +state_path="$HOME/.local/state/$app_name" +cache_path="$HOME/.cache/$app_name" +share_path="$HOME/.local/share/$app_name" +script_path="$share_path/dzgui.sh" +helpers_path="$share_path/helpers" +prefix="dzg" + +#LOGS +log_path="$state_path/logs" +debug_log="$log_path/DZGUI_DEBUG.log" +system_log="$log_path/DZGUI_SYSTEM.log" + +#STATE FILES +history_file="$state_path/$prefix.history" +versions_file="$state_path/$prefix.versions" +lock_file="$state_path/$prefix.lock" + +#CACHE +cache_dir="$HOME/.cache/$appname" +_cache_servers="$cache_dir/$prefix.servers" +_cache_my_servers="$cache_dir/$prefix.my_servers" +_cache_history="$cache_dir/$prefix.history" +_cache_launch="$cache_dir/$prefix.launch_mods" +_cache_address="$cache_dir/$prefix.launch_address" +_cache_coords="$cache_path/$prefix.coords" + +#XDG +freedesktop_path="$HOME/.local/share/applications" + +#HELPERS +ui_helper="$helpers_path/ui.py" +geo_file="$helpers_path/ips.csv" +km_helper="$helpers_path/latlon" +sums_path="$helpers_path/sums.md5" +query_helper="$helpers_path/query_v2.py" +func_helper="$helpers_path/funcs" + +#STEAM PATHS +workshop_path="$steam_path/steamapps/workshop" +workshop_dir="$workshop_path/content/$aid" +downloads_dir="$workshop_path/downloads/$aid" +game_dir="$steam_path/steamapps/common/DayZ" + +#URLS +author="aclist" +repo="dztui" +gh_prefix="https://github.com" +issues_url="$gh_prefix/$author/$repo/issues" +url_prefix="https://raw.githubusercontent.com/$author/$repo" +stable_url="$url_prefix/dzgui" +testing_url="$url_prefix/testing" +releases_url="$gh_prefix/$author/$repo/releases/download/browser" +km_helper_url="$releases_url/latlon" +db_file="$releases_url/ips.csv.gz" +sums_url="$stable_url/helpers/sums.md5" +vdf2json_url="$stable_url/helpers/vdf2json.py" +#TODO: move adoc to index +help_url="https://$author.github.io/dzgui/dzgui" +forum_url="$gh_prefix/$author/$repo/discussions" +sponsor_url="$gh_prefix/sponsors/$author" +battlemetrics_server_url="https://www.battlemetrics.com/servers/dayz" +steam_api_url="https://steamcommunity.com/dev/apikey" +#TODO: update link in docs +battlemetrics_api_url="https://www.battlemetrics.com/developers" +bm_api="https://api.battlemetrics.com/servers" + +if [[ $preferred_client == "steam" ]]; then + steam_cmd="steam" +else + steam_cmd="flatpak run com.valvesoftware.Steam" +fi + +#TODO: dump servers methods can be merged +declare -A funcs=( +["My servers"]="dump_servers" +["Change player name"]="update_config_val" +["Change Steam API key"]="update_config_val" +["Change Battlemetrics API key"]="update_config_val" +["Change favorite server"]="add_record" +["Quick-connect to favorite server"]="quick_connect" +["Add server by IP"]="add_record" +["Add server by ID"]="add_record" +["Connect by IP"]="validate_and_connect" +["Connect by ID"]="validate_and_connect" +["Connect from table"]="connect_from_table" +["toggle"]="toggle" +["Open link"]="open_link" +["filter"]="dump_servers" +["dump_servers"]="dump_servers" +["get_unique_maps"]="get_unique_maps" +["get_dist"]="get_dist" +["query_config"]="query_config" +["list_mods"]="list_mods" +["delete"]="delete_local_mod" +["show_server_modlist"]="show_server_modlist" +["is_in_favs"]="is_in_favs" +["show_log"]="show_log" +["gen_log"]="generate_log" +["open_workshop_page"]="open_workshop_page" +["Add to my servers"]="update_favs_from_table" +["Remove from favorites"]="update_favs_from_table" +["Remove from history"]="remove_from_history" +["force_update"]="force_update" +["Handshake"]="final_handshake" +) + +validate_and_connect(){ + local context="$1" + local addr="$2" + + local record + case "$context" in + "Connect by ID") + if [[ -z "$api_key" ]]; then + printf "No Battlemetrics API key set" + return 4 + fi + record=$(map_id_to_ip "$addr") + if [[ $? -eq 1 ]]; then + logger WARN "Not a valid record: '$addr'" + printf "Not a valid ID" + return 2 + fi + logger INFO "Battlemetrics ID resolved to IP $record" + ;; + "Connect by IP") + if [[ $(validate_ip "$addr") -eq 1 ]]; then + printf "Not a valid IP format. Supply IP:Queryport" + return 2 + fi + local ip=$(<<< $addr awk -F: '{print $1}') + local qport=$(<<< $addr awk -F: '{print $2}') + local res + res=$(a2s $ip $qport info) + if [[ ! $? -eq 0 ]]; then + printf "Timed out when querying the server. Is this a valid server?" + return 2 + fi + local gameport="$(<<< $res jq -r '.[].gameport')" + record="${ip}:${gameport}:${qport}" + logger INFO "Record resolved to $record" + esac + try_connect "$record" +} +force_update(){ + if [[ ! $auto_install -eq 1 ]]; then + printf "Only available when mod auto-install is ON" + return 1 + fi + #TODO: force update + printf "Currently does nothing" + return 0 +} +map_id_to_ip(){ + local id="$1" + local res=$(curl -s "$bm_api" -H "Authorization: Bearer "$api_key"" \ + -G -d "sort=-players" \ + -d "filter[game]=$game" \ + -d "filter[ids][whitelist]=$id") + local len=$(<<< "$res" jq '.data|length') + [[ $len -eq 0 ]] && return 1 + local record=$(<<< "$res" jq -r '.data[].attributes|"\(.ip):\(.port):\(.portQuery)"') + echo "$record" +} +add_record(){ + local context="$1" + local addr="$2" + local record + if [[ $context != "Add server by ID" ]] && [[ $(validate_ip "$addr") -eq 1 ]]; then + printf "Not a valid IP format. Supply IP:Queryport" + return 2 + fi + local ip=$(<<< $addr awk -F: '{print $1}') + local qport=$(<<< $addr awk -F: '{print $2}') + local res + res=$(a2s $ip $qport info) + if [[ ! $? -eq 0 ]]; then + printf "Timed out when querying the server. Is this a valid server?" + return 2 + fi + local gameport="$(<<< $res jq -r '.[].gameport')" + record="${ip}:${gameport}:${qport}" + + case "$context" in + "Add server by IP") + if [[ ${ip_list[*]} =~ $record ]]; then + printf "Already in favorites list" + return 1 + fi + add_to_favs "$record" + ;; + "Change favorite server") + fav_label=$(<<< "$res" jq -r '.[].name') + fav_server="$record" + update_config + return 90 + ;; + "Add server by ID") + if [[ -z "$api_key" ]]; then + printf "No Battlemetrics API key set" + return 4 + fi + record=$(map_id_to_ip "$addr") + if [[ $? -eq 1 ]]; then + logger WARN "Not a valid record: '$addr'" + printf "Not a valid ID" + return 2 + fi + logger INFO "Battlemetrics ID resolved to IP $record" + if [[ ${ip_list[*]} =~ $record ]]; then + printf "Already in favorites list" + return 1 + fi + add_to_favs "$record" + ;; + esac +} +connect_by_id(){ + if [[ $(validate_ip "$addr") -eq 1 ]]; then + printf "Not a valid IP format. Supply IP:Queryport" + return 2 + fi + local ip=$(<<< $addr awk -F: '{print $1}') + local qport=$(<<< $addr awk -F: '{print $2}') + local res + res=$(a2s $ip $qport info) + if [[ ! $? -eq 0 ]]; then + printf "Timed out when querying the server. Is this a valid server?" + return 2 + fi + #res contains modlist +} +initialize_remote_servers(){ + local file="$_cache_servers" + [[ -f $file ]] && rm "$file" + local res + res=$(get_remote_servers) + parse_server_json "$res" >> "$file" +} +a2s(){ + local ip="$1" + local qport="$2" + local mode="$3" + logger INFO "Querying '$ip:$qport' with mode '$mode'" + python3 "$query_helper" "$ip" "$qport" "$mode" +} +is_in_favs(){ + shift + local record="$1" + for (( i = 0; i < ${#ip_list[@]}; i++ )); do + if [[ ${ip_list[$i]} == "$record" ]]; then + logger INFO "'$record' is in favorites list" + return 0 + fi + done + return 1 +} +list_mods(){ + local symlink + local sep + local name + local base_dir + local size + if [[ -z $(installed_mods) ]] || [[ -z $(find $workshop_dir -maxdepth 2 -name "*.cpp" | grep .cpp) ]]; then + echo "No mods currently installed or incorrect path set." + logger WARN "Found no locally installed mods" + return 1 + else + for dir in $(find $game_dir/* -maxdepth 1 -type l); do + symlink=$(basename $dir) + sep="␞" + name=$(awk -F\" '/name/ {print $2}' "${dir}/meta.cpp") + base_dir=$(basename $(readlink -f $game_dir/$symlink)) + size=$(du -s "$(readlink -f "$game_dir/$symlink")" | awk '{print $1}') + size=$(echo "scale=4; ($size / 1024) + .005" | bc) + printf "%s$sep%s$sep%s$sep%3.3f\n" "$name" "$symlink" "$base_dir" "$size" + done | sort -k1 + fi +} +installed_mods(){ + ls -1 "$workshop_dir" +} +open_url(){ + local context="$1" + local url + case "$context" in + "Help file ⧉") + url="$help_url" + ;; + "Report a bug ⧉") + url="$issues_url" + ;; + "Forum ⧉") + url="$forum_url" + ;; + "Sponsor ⧉") + url="$sponsor_url" + ;; + "Hall of fame ⧉") + url="${help_url}#_hall_of_fame" + ;; + esac + + if [[ -n "$BROWSER" ]]; then + "$BROWSER" "$url" 2>/dev/null + return + fi + xdg-open "$url" 2>/dev/null +} +local_latlon(){ + local url="http://ip-api.com/json/$local_ip" + local local_ip + + if [[ -z $(command -v dig) ]]; then + local_ip=$(curl -Ls "https://ipecho.net/plain") + else + local_ip=$(dig -4 +short myip.opendns.com @resolver1.opendns.com) + fi + curl -Ls "$url" | jq -r '"\(.lat)\n\(.lon)"' +} +get_dist(){ + shift + local given_ip="$1" + readarray -t coords < "$_cache_coords" + readarray -t n < <(<<< "$given_ip" awk 'BEGIN{RS="."}{$1=$1}1') + + local local_lat="${coords[0]}" + local local_lon="${coords[1]}" + local network="^${n[0]}.${n[1]}\." + local three="${n[2]}" + local host="${n[3]}" + + local binary=$(grep -E "$network" $geo_file) + local res=$(<<< "$binary" awk -F[.,] -v three=$three -v host=$host ' + $3 <=three && $7 >= three{if($3>three || ($3==three && $4 > host) || $7 < three || ($7==three && $8 < host)){next}{print}}' \ + | awk -F, '{print $7,$8}') + local remote_lat=$(<<< "$res" awk '{print $1}') + local remote_lon=$(<<< "$res" awk '{print $2}') + if [[ -z $remote_lat ]]; then + logger WARN "Failed to find geolocation candidate in IP database" + local dist="Unknown" + printf "Unknown" + else + logger INFO "Resolved remote server geolocation to '$remote_lat, $remote_lon'" + local dist=$($km_helper "$local_lat" "$local_lon" "$remote_lat" "$remote_lon") + LC_NUMERIC=C printf "%d" "$dist" + logger INFO "Distance: $dist km" + fi +} +get_remote_servers(){ + local limit=20000 + local url="https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100&limit=$limit&key=$steam_api" + curl -Ls "$url" | jq -r '.response.servers' +} +get_unique_maps(){ + shift + local context="$1" + local filter_file + case "$context" in + "My saved servers") + filter_file="$_cache_my_servers" + ;; + "Server browser") + filter_file="$_cache_servers" + ;; + "Recent servers") + filter_file="$_cache_history" + esac + logger INFO "Map filter context is: '$context', using cached file at '$filter_file'" + < "$filter_file" awk -F$separator '{print $2}' | sort -u +} +query_config(){ + local key="$1" + keys=( + "branch" + "debug" + "auto_install" + "name" + "fav_label" + "preferred_client" + ) + if [[ -n $key ]]; then + if [[ -n ${!key} ]]; then + echo "${!key}" + return 0 + else + return 1 + fi + fi + for i in "${keys[@]}"; do + echo "${!i}" + done +} +filter_servers(){ + local filtered="$(< "$1")" + shift + readarray -t filters < <(printf "%s\n" "$@") + + for ((i=0; i< ${#filters[@]}; ++i)); do + if [[ ${filters[$i]} =~ Keyword ]]; then + keyword=$(<<< ${filters[$i]} awk -F␞ '{print $2}') + elif [[ ${filters[$i]} =~ Map ]]; then + map=$(<<< ${filters[$i]} awk -F= '{print $2}') + fi + done + + filter_ascii(){ + if [[ ${filters[*]} =~ Non ]]; then + echo -n "$filtered" + else + <<< "$filtered" sed 's/␞/@@DZGUI_PLACEHOLDER@@/g' | grep -v -P '[^[:ascii:]]' | sed 's/@@DZGUI_PLACEHOLDER@@/␞/g' + fi + } + filter_time(){ + if [[ ${filters[*]} =~ Day ]] && [[ ${filters[*]} =~ Night ]]; then + echo -n "$filtered" + elif [[ ${filters[*]} =~ Day ]]; then + <<< "$filtered" awk -F$separator '$4~/^([0][6-9]:|[1][0-6])/' + elif [[ ${filters[*]} =~ Night ]]; then + <<< "$filtered" awk -F$separator '$4~/^([1][7-9]:|[2][0-3]:|[0][0-5])/' + else + echo -n "" + fi + } + filter_perspective(){ + if [[ ${filters[*]} =~ 1PP ]] && [[ ${filters[*]} =~ 3PP ]]; then + echo -n "$filtered" + elif [[ ${filters[*]} =~ 1PP ]]; then + <<< "$filtered" awk '!/3PP/' + elif [[ ${filters[*]} =~ 3PP ]]; then + <<< "$filtered" awk '!/1PP/' + else + echo -n "" + fi + } + filter_lowpop(){ + if [[ ${filters[*]} =~ Low ]]; then + echo -n "$filtered" + else + <<< "$filtered" awk -F$separator '{if (($5 > 0) && ($5/$6)*100 >=30){print $0}}' + fi + } + filter_full(){ + if [[ ${filters[*]} =~ Full ]]; then + echo -n "$filtered" + else + <<< "$filtered" awk -F$separator '$5 != $6' + fi + } + filter_empty(){ + if [[ ${filters[*]} =~ Empty ]]; then + echo -n "$filtered" + else + <<< "$filtered" awk -F$separator '$5 != "0"' + fi + } + filter_map(){ + if [[ $map == "All maps" ]]; then + echo "$filtered" + else + <<< "$filtered" awk -v var="$map" -F$separator '$2 == var' + fi + } + filter_keyword(){ + keyword=$(sanitize "$keyword") + <<< "$filtered" KEYWORD="$keyword" awk -F$separator 'BEGIN{IGNORECASE=1} $0 ~ ENVIRON["KEYWORD"] {print $0}' + } + filter_duplicates(){ + if [[ ${filters[*]} =~ Duplicate ]]; then + echo -n "$filtered" + else + <<< "$filtered" awk -F$separator '!seen[$1]++' + fi + } + + filtered=$(filter_perspective) + filtered=$(filter_full) + filtered=$(filter_empty) + filtered=$(filter_time) + filtered=$(filter_map) + filtered=$(filter_lowpop) + filtered=$(filter_ascii) + filtered=$(filter_duplicates) + filtered=$(filter_keyword) + + if [[ -z "$filtered" ]]; then + logger WARN "Filter result is empty" + echo -n "" + return + fi + + logger INFO "Returning sorted server list back to UI" + printf "%s\n" "$filtered" | sort -k1 +} +sanitize(){ + echo "$1" | sed \ + -e 's/\//\\\//g' \ + -e 's/\$/\\$/g' \ + -e 's/\[/\\[/g' \ + -e 's/\]/\\]/g' \ + -e 's/\#/\\#/g' \ + -e 's/\./\\./g' \ + -e 's/\^/\\^/g' \ + -e 's/\=/\\=/g' \ + -e 's/|/\\|/g' \ + -e 's/\+/\\+/g' \ + -e 's/(/\\(/g' \ + -e 's/)/\\)/g' +} +parse_server_json(){ + local response="$1" + <<< "$response" jq -r ' + .[]|"\(.name)␞" + + "\(.map|if type == "string" then ascii_downcase else "null" end)␞" + + "\(if .gametype == null then "null" else (.gametype|split(",")|if any(. == "no3rd") then "1PP" else "3PP" end) end)␞" + + "\(if .gametype == null then "null" else (.gametype as $time|$time|test("[0-9]{2}:[0-9]{2}$") as $match|(if $match == true then ($time|scan("[0-9]{2}:[0-9]{2}$")) else "XXXX" end)) end)␞" + + "\(.players)␞" + + "\(.max_players)␞" + + "\(.addr|split(":")[0]):\(if .gameport == null then "XXXX" else .gameport end)␞" + + "\(.addr|split(":")[1])" + ' | sort -k1 +} +delete_local_mod(){ + shift + local symlink="$1" + local dir="$2" + [[ ! -d $workshop_dir/$dir ]] && return 1 + [[ ! -L $game_dir/$symlink ]] && return 1 + #SC2115 + rm -rf "${workshop_dir:?}/$dir" && unlink "$game_dir/$symlink" || return 1 +} +dump_servers(){ + local context="$1" + local subcontext="$2" + local ip + local qport + local res + _iterate(){ + local file="$1" + shift + for server in "$@"; do + ip=$(<<< $server awk -F: '{print $1}') + qport=$(<<< $server awk -F: '{print $3}') + res=$(a2s "$ip" "$qport" info) + if [[ ! $? -eq 0 ]]; then + continue + fi + parse_server_json "$res" >> "$file" + done + } + case "$subcontext" in + *Server[[:space:]]browser*) + local file="$_cache_servers" + if [[ ! $subcontext =~ Name ]]; then + initialize_remote_servers + fi + ;; + *My[[:space:]]saved[[:space:]]servers*) + local file="$_cache_my_servers" + if [[ ! $subcontext =~ Name ]]; then + [[ -f $file ]] && rm $file + _iterate "$file" "${ip_list[@]}" + fi + ;; + *Recent[[:space:]]servers*) + local file="$_cache_history" + if [[ ! $subcontext =~ Name ]]; then + [[ -f $file ]] && rm $file + readarray -t iters < <(cat $history_file) + _iterate "$file" "${iters[@]}" + fi + ;; + esac + shift + logger INFO "Server context is '$subcontext', reading from file '$file'" + filter_servers "$file" "$@" +} +logger(){ + local date="$(date "+%F %T,%3N")" + local tag="$1" + local string="$2" + local self="${BASH_SOURCE[0]}" + local caller="${FUNCNAME[1]}" + local line="${BASH_LINENO[0]}" + printf "%s␞%s␞%s::%s()::%s␞%s\n" "$date" "$tag" "$self" "$caller" "$line" "$string" >> "$debug_log" +} +show_server_modlist(){ + shift + local ip="$1" + local qport="$2" + local res=$(a2s $ip $qport names) + [[ -z $res ]] && return 1 + [[ $(<<< $res jq '.ids|length') -lt 1 ]] && return 1 + local names=$(<<< "$res" jq -r '.names[]') + local ids=$(<<< "$res" jq -r '.ids[]') + local icon + local flag + local label + readarray -t names <<< "$names" + readarray -t ids <<< "$ids" + readarray -t mods < <(installed_mods) + for ((i=0; i<${#ids[@]}; ++i)); do + icon= + flag="WARN" + label="MISSING" + for j in "${mods[@]}"; do + if [[ $j == "${ids[$i]}" ]]; then + icon=✓ + flag="INFO" + label="installed" + break + fi + done + logger $flag "Mod '${names[$i]}' is $label" + printf "%s␞%s␞%s\n" "${names[$i]}" "${ids[i]}" "$icon" + done | sort -k1 +} +print_ip_list(){ + [[ ${#ip_list[@]} -eq 0 ]] && return 1 + printf "\t\"%s\"\n" "${ip_list[@]}" +} +write_config(){ +cat <<-END +#Path to DayZ installation +steam_path="$steam_path" + +#Battlemetrics API key +api_key="$api_key" + +#Favorited server IP:PORT array +ip_list=( +$(print_ip_list) +) + +#Favorite server to fast-connect to (limit one) +fav_server="$fav_server" + +#Favorite server label (human readable) +fav_label="$fav_label" + +#Custom player name (optional, required by some servers) +name="$name" + +#Set to 1 to perform dry-run and print launch options +debug="$debug" + +#Toggle stable/testing branch +branch="$branch" + +#Last seen news item +seen_news="$seen_news" + +#Steam API key +steam_api="$steam_api" + +#Auto-install mods +auto_install="$auto_install" + +#Automod staging directory +staging_dir="$staging_dir" + +#Path to default Steam client +default_steam_path="$default_steam_path" + +#Preferred Steam launch command (for Flatpak support) +preferred_client="$preferred_client" + +#DZGUI source path +src_path="$src_path" +END +} +format_version_url(){ + echo FORMAT + case "$branch" in + "stable") + version_url="$stable_url/dzgui.sh" + ;; + "testing") + version_url="$testing_url/dzgui.sh" + ;; + esac + echo "$version_url" +} +download_new_version(){ + local version_url="$(format_version_url)" + mv "$src_path" "$src_path.old" + curl -Ls "$version_url" > "$src_path" + rc=$? + if [[ $rc -eq 0 ]]; then + logger INFO "Wrote new version to $src_path" + chmod +x "$src_path" + touch "${config_path}.unmerged" + printf "New version downloaded. Please exit to apply changes" + logger INFO "User exited after version upgrade" + return 255 + else + mv "$src_path.old" "$src_path" + printf "Failed to fetch new version. Rolling back" + logger WARN "curl failed to fetch new version. Rolling back" + return 1 + fi + dl_changelog +} +dl_changelog(){ + local mdbranch + local file="CHANGELOG.md" + [[ $branch == "stable" ]] && mdbranch="dzgui" + [[ $branch == "" ]] && mdbranch="testing" + local md="https://raw.githubusercontent.com/$author/$repo/${mdbranch}/$file" + curl -Ls "$md" > "$state_path/$file" +} +toggle(){ + shift + local context="$1" + case "$context" in + Toggle[[:space:]]release[[:space:]]branch) + if [[ $branch == "stable" ]]; then + branch="testing" + else + branch="stable" + fi + update_config + download_new_version + ;; + Toggle[[:space:]]mod[[:space:]]install[[:space:]]mode) + if [[ -z $auto_install ]]; then + staging_dir="/tmp" + auto_install="1" + else + auto_install="" + fi + ;; + Toggle[[:space:]]debug[[:space:]]mode) + if [[ -z $debug ]]; then + debug="1" + else + debug="" + fi + ;; + Toggle[[:space:]]Steam/Flatpak) + if [[ $preferred_client == "steam" ]]; then + preferred_client="flatpak" + else + preferred_client="steam" + fi + esac + update_config + +} +add_to_favs(){ + local record="$1" + ip_list+=("$record") + update_config + logger INFO "Added the record $record to saved servers" +} +remove_from_history(){ + shift + local record="$1" + # remove ip from history file + local hist_cache=$(< "$history_file") + <<< "$hist_cache" grep -v "$record" > "$history_file" + # update cache + local cache=$(< "$_cache_history") + local r=$(<<< "$record" awk -F: '{print $1":"$2"␞"$3}') + <<< "$cache" grep -v -P "$r$" > "$_cache_history" +} +remove_from_favs(){ + local record="$1" + for (( i=0; i<${#ip_list[@]}; ++i )); do + if [[ ${ip_list[$i]} == "$record" ]]; then + unset ip_list[$i] + break + fi + done + if [[ ${#ip_list} -gt 0 ]]; then + readarray -t ip_list < <(printf "%s\n" "${ip_list[@]}") + fi + update_config + local r=$(<<< "$record" awk -F: '{print $1":"$2"␞"$3}') + local cache="$(< "$_cache_my_servers")" + <<< "$cache" grep -v -P "$r$" > $_cache_my_servers + logger INFO "Removed the record $record from saved servers" +} +update_favs_from_table(){ + local context="$1" + local record="$2" + if [[ $context =~ Remove ]]; then + remove_from_favs "$record" + else + add_to_favs "$record" + fi + return 0 +} +update_config(){ + # handling for legacy files + [[ -z $branch ]] && branch="stable" + mv $config_file ${config_file}.old + write_config > $config_file + if [[ $? -eq 0 ]]; then + printf "Updated config file" + return 90 + else + return 1 + fi + logger INFO "Updated config file at '$config_file'" +} +validate_ip(){ + local ip="$1" + local res + <<< "$ip" grep -qP '^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}:[0-9]+$' && echo 0 || echo 1 +} +test_steam_api(){ + local key="$1" + [[ -z $key ]] && return 1 + local url="https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100&limit=10&key=$key" + local code=$(curl -ILs "$url" | grep -E "^HTTP") + [[ $code =~ 403 ]] && echo 1 + [[ $code =~ 200 ]] && echo 0 +} +test_bm_api(){ + local key="$1" + if [[ ! $key =~ ^[0-9]+$ ]]; then + return + fi + [[ -z $key ]] && return 1 + local code=$(curl -ILs "$bm_api" \ + -H "Authorization: Bearer "$key"" -G \ + -d "filter[game]=$game" \ + | grep -E "^HTTP") + [[ $code =~ 401 ]] && echo 1 + [[ $code =~ 200 ]] && echo 0 +} +update_config_val(){ + local context="$1" + local value="$2" + case $1 in + "Change player name") + key="name" + ;; + "Change Steam API key") + key="steam_api" + if [[ ${#value} -lt 32 ]] || [[ $(test_steam_api "$value") -eq 1 ]]; then + printf "Invalid API key" + return 2 + fi + ;; + "Change Battlemetrics API key") + key="api_key" + if [[ $(test_bm_api "$value") -eq 1 ]]; then + printf "Invalid API key" + return 2 + fi + ;; + esac + declare -n nr=$key + nr="$value" + update_config +} +show_log(){ + < "$debug_log" sed 's/Keyword␞/Keyword/' +} +open_workshop_page(){ + shift + local id="$1" + local workshop_uri="steam://url/CommunityFilePage/$id" + $steam_cmd "$workshop_uri" $id +} +open_link(){ + shift + local destination="$1" + local url + case "$destination" in + "Open Battlemetrics") + url="$battlemetrics_server_url" + ;; + "Open Steam API page") + url="$steam_api_url" + ;; + "Open Battlemetrics API page") + url="$battlemetrics_api_url" + ;; + esac + +#if [[ $is_steam_deck -eq 1 ]]; then +#$steam_cmd steam://openurl/"$1" 2>/dev/null + if [[ -n "$BROWSER" ]]; then + logger INFO "Opening '$url' in '$BROWSER'" + "$BROWSER" "$url" + else + logger INFO "Opening '$url' with xdg-open" + xdg-open "$url" + fi +} + +quick_connect(){ + if [[ -z $fav_server ]]; then + printf "No favorite server currently set" + return 1 + fi + try_connect "$fav_server" +} +connect_from_table(){ + shift + local record="$1" + try_connect "$record" +} +pretty_print(){ + while read -r line; do + printf "\t%s\n" "$line" + done < "$@" +} +generate_log(){ + source $config_file + cat <<-DOC > $system_log + Distro: $(< /etc/os-release grep -w NAME | awk -F\" '{print $2}') + Kernel: $(uname -mrs) + Version: $version + Branch: $branch + Mode: $(if [[ -z $debug ]]; then echo normal; else echo debug; fi) + Auto: $(if [[ -z $auto_install ]]; then echo normal; else echo auto; fi) + Steam path: $steam_path + Workshop path: $workshop_dir + Game path: $game_dir + Servers: +$(print_ip_list | sed 's/"//g') + Mods: +$(list_mods | sed 's/^/\t/g') + DOC + printf "Wrote system log to %s" "$system_log" + return 0 +} +query_defunct(){ + readarray -t modlist <<< "$@" + local max=${#modlist[@]} + concat(){ + for ((i=0;i<$max;i++)); do + echo "publishedfileids[$i]=${modlist[$i]}&" + done | awk '{print}' ORS='' + } + payload(){ + echo -e "itemcount=${max}&$(concat)" + } + post(){ + curl -s \ + -X POST \ + -H "Content-Type:application/x-www-form-urlencoded"\ + -d "$(payload)" 'https://api.steampowered.com/ISteamRemoteStorage/GetPublishedFileDetails/v1/?format=json' + } + local result=$(post | jq -r '.[].publishedfiledetails[] | select(.result==1) | "\(.file_size) \(.publishedfileid)"') + local result2=$(post | jq -r '') + echo "$result2" > $HOME/json + <<< "$result" awk '{print $2}' +} +encode(){ + echo "$1" | md5sum | cut -c -8 +} +compare(){ + local modlist="$@" + diff=$(comm -23 <(<<< "$modlist" sort -u) <(installed_mods | sort)) + echo "$diff" +} +legacy_symlinks(){ + for d in "$game_dir"/*; do + if [[ $d =~ @[0-9]+-.+ ]]; then + unlink "$d" + fi + done + for d in "$workshop_dir"/*; do + local id=$(awk -F"= " '/publishedid/ {print $2}' "$d"/meta.cpp | awk -F\; '{print $1}') + local encoded_id=$(echo "$id" | awk '{printf("%c",$1)}' | base64 | sed 's/\//_/g; s/=//g; s/+/]/g') + if [[ -h "$game_dir/@$encoded_id" ]]; then + unlink "$game_dir/@$encoded_id" + fi + done +} +symlinks(){ + for d in "$workshop_dir"/*; do + id=$(awk -F"= " '/publishedid/ {print $2}' "$d"/meta.cpp | awk -F\; '{print $1}') + encoded_id=$(encode "$id") + link="@$encoded_id" + if [[ -h "$game_dir/$link" ]]; then + logger INFO "Symlink already exists: '$link' for mod '$id'" + continue + fi + ln -fs "$d" "$game_dir/$link" + logger INFO "Created symlink '$link' for mod '$id'" + done +} +update_history(){ + local record="$1" + local old + [[ -n $(grep "$record" $history_file) ]] && return + if [[ -f $history_file ]]; then + old=$(tail -n9 "$history_file") + rm $history_file + echo "$old" > "$history_file" + fi + echo "$record" >> "$history_file" +} +update_symlinks(){ + legacy_symlinks + symlinks +} +try_connect(){ + local record="$1" + local ip=$(<<< $record awk -F: '{print $1}') + local gameport=$(<<< $record awk -F: '{print $2}') + local qport=$(<<< $record awk -F: '{print $3}') + local remote_mods + remote_mods=$(a2s $ip $qport rules) + if [[ $? -eq 1 ]]; then + printf "Failed to fetch server modlist, possibly timed out" + return 1 + fi + logger INFO "Server returned modlist: $(<<< $remote_mods tr '\n' ' ')" + local sanitized_mods=$(query_defunct "$remote_mods") + local diff=$(compare "$sanitized_mods") + + logger INFO "Connection attempt for $ip:$qport" + update_history "$record" + # + if [[ -n $auto_install ]]; then + #TODO: remove when ready + printf "Auto install mode currently disabled" + return 1 + fi + #TODO: publishedfileid,timestamp + #if [[ -z $auto_install ]]; then + # merge_modlists + #fi + # + if [[ -n $diff ]]; then + if [[ $is_steam_deck -eq 1 ]] && [[ $(test_display_mode) == "gm" ]]; then + printf "Use Desktop Mode to download mods on Steam Deck" + return 1 + fi + case $auto_install in + "") manual_mod_install "$ip" "$gameport" "$diff" "$sanitized_mods";; + 1|2) auto_mod_install "$ip" "$gameport" "$diff" "$sanitized_mods" ;; + esac + else + launch "$ip" "$gameport" "$sanitized_mods" + fi +} +concat_mods(){ + readarray -t concat_arr <<< "$@" + local id + local encoded_id + local link + for i in "${concat_arr[@]}"; do + id=$(awk -F"= " '/publishedid/ {print $2}' "$workshop_dir"/$i/meta.cpp | awk -F\; '{print $1}') + encoded_id=$(encode $id) + link="@$encoded_id;" + echo -e "$link" + done | tr -d '\n' | perl -ple 'chop' +} +is_dayz_running(){ + local proc=$(ps aux | grep "DayZ.*\.exe" | grep -v grep) + if [[ -n $proc ]]; then + echo 1 + else + echo 0 + fi +} +launch(){ + local ip="$1" + local gameport="$2" + local mods="$3" + local concat + if [[ -n $mods ]]; then + concat=$(concat_mods "$mods") + else + concat="" + fi + + update_symlinks + if [[ $debug -eq 1 ]]; then + local launch_options="$steam_cmd -applaunch $aid -connect=$ip:$gameport -nolauncher -nosplash -name=$name -skipintro \"-mod=$concat\"" + printf "Dry-run mode: these options would have been used to launch the game: $launch_options" + return 0 + fi + echo "$concat" > "$_cache_launch" + echo "$ip:$gameport" > "$_cache_address" + printf "Launch conditions satisfied. DayZ will now launch after you confirm this dialog." + return 100 +} +final_handshake(){ + local saved_mods=$(< "$_cache_launch") + local saved_address=$(< "$_cache_address") + local res=$(is_dayz_running) + if [[ $res -eq 1 ]]; then + printf "Is DayZ already running? DZGUI cannot launch DayZ if another process is using it." + return 1 + fi + $steam_cmd -applaunch $aid -connect=$saved_address -nolauncher -nosplash -skipintro -name=$name \"-mod=$saved_mods\" & + until [[ $(is_dayz_running) -eq 1 ]]; do + sleep 0.1s + done + return 6 +} +manual_mod_install(){ + local ip="$1" + local gameport="$2" + local diff="$3" + local sanitized_mods="$4" + local ex="$state_path/dzg.watcher" + + readarray -t stage_mods <<< "$diff" + [[ -f $ex ]] && rm $ex + + _watcher(){ + for((i=0;i<${#stage_mods[@]};i++)); do + [[ -f $ex ]] && return 1 + log ${stage_mods[$i]} + + $steam_cmd "steam://url/CommunityFilePage/${stage_mods[$i]}" + echo "# Opening workshop page for ${stage_mods[$i]}. If you see no progress after subscribing, try unsubscribing and resubscribing again until the download commences." + sleep 1s + foreground + + until [[ -d $downloads_dir/${stage_mods[$i]} ]]; do + [[ -f $ex ]] && return 1 + sleep 0.1s + if [[ -d $workshop_dir/${stage_mods[$i]} ]]; then + break + fi + done + + foreground + echo "# Steam is downloading ${stage_mods[$i]} (mod $((i+1)) of ${#stage_mods[@]})" + until [[ -d $workshop_dir/${stage_mods[$i]} ]]; do + [[ -f $ex ]] && return 1 + sleep 0.1s + done + + foreground + echo "# ${stage_mods[$i]} moved to mods dir" + done + echo "100" + } + _watcher > >($steamsafe_zenity --pulsate --progress --auto-close --title="DZG Watcher" --width=500 2>/dev/null; rc=$?; [[ $rc -eq 1 ]] && touch $ex) + + # compare latest installed mods to modlist + local diff=$(compare "$sanitized_mods") + if [[ -z $diff ]]; then + launch "$ip" "$gameport" "$sanitized_mods" + else + printf "Some mods may have failed to download. Try connecting again to resync" + exit 1 + fi +} +test_display_mode(){ + pgrep -a gamescope | grep -q "generate-drm-mode" + if [[ $? -eq 0 ]]; then + echo gm + else + echo dm + fi +} +foreground(){ + if [[ $(command -v wmctrl) ]]; then + wmctrl -a "DZG Watcher" + else + local wid=$(xdotool search --name "DZG Watcher") + xdotool windowactivate $wid + fi +} +main(){ + local params="$(printf '"%s", ' "$@")" + logger INFO "Received request from UI constructor with params [${params::-2}]" + func=${funcs["$1"]} + [[ -z $func ]] && return 1 + if [[ -z $2 ]]; then + shift + $func + else + $func "$@" + fi +} +main "$@" diff --git a/helpers/query_v2.py b/helpers/query_v2.py new file mode 100644 index 0000000..4ed62e9 --- /dev/null +++ b/helpers/query_v2.py @@ -0,0 +1,75 @@ +import sys +import a2s +import math +import json +from a2s import dayzquery +sys.path.append('a2s') + +def get_info(ip, qport): + try: + info = a2s.info((ip, int(qport))) + + name = info.server_name + map = info.map_name + address = ip + ":" + qport + gameport = str(info.port) + players = info.player_count + max_players = info.max_players + keywords = info.keywords + ping = (info.ping*1000) + ping = math.floor(ping) + + res = {} + + res['name'] = name + res['map'] = map + res['gametype'] = keywords + res['players'] = players + res['max_players'] = max_players + res['addr'] = address + res['gameport'] = gameport + res['stat'] = "online" + res['qport'] = qport + res['ping'] = str(ping) + "ms" + + j = json.dumps([res]) + + print(j) + except: + sys.exit(1) + +def get_rules(ip, qport): + try: + mods = dayzquery.dayz_rules((ip, int(qport))).mods + for k in mods: + print(k.workshop_id) + except: + sys.exit(1) + +def get_names(ip, qport): + try: + mods = dayzquery.dayz_rules((ip, int(qport))).mods + ids = [] + names = [] + for mod in mods: + names.append(mod.name) + ids.append(mod.workshop_id) + res = {} + res['names'] = names + res['ids'] = ids + j = json.dumps(res) + print(j) + except: + sys.exit(1) + +ip = sys.argv[1] +qport = sys.argv[2] +mode = sys.argv[3] + +match mode: + case "info": + get_info(ip, qport) + case "rules": + get_rules(ip, qport) + case "names": + get_names(ip, qport) diff --git a/helpers/ui.py b/helpers/ui.py new file mode 100644 index 0000000..ebc044d --- /dev/null +++ b/helpers/ui.py @@ -0,0 +1,1635 @@ +import csv +import gi +import locale +import logging +import os +import signal +import multiprocessing +import re +import subprocess +import sys +import threading +import time + +locale.setlocale(locale.LC_ALL, '') +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, GLib, Gdk, GObject, Pango + +# 5.0.0-rc.1 +app_name = "DZGUI" + +cache = {} +config_vals = [] +stored_keys = [] +toggled_checks = [] +server_filters = [] +delimiter = "␞" +selected_map = ["Map=All maps"] +keyword_filter = ["Keyword%s" %(delimiter)] + +checks = list() +map_store = Gtk.ListStore(str) +row_store = Gtk.ListStore(str) +modlist_store = Gtk.ListStore(str, str, str) +# Name, Symlink, ID, Size +mod_store = Gtk.ListStore(str, str, str, float) +# Timestamp, Flag, Trace, Message +log_store = Gtk.ListStore(str, str, str, str) +# Name, Map, Perspective, Gametime, Players, Max, IP, Qport +server_store = Gtk.ListStore(str, str, str, str, int, int, str, int) + +default_tooltip = "Select a row to see its detailed description" +server_tooltip = [None, None] + +user_path = os.path.expanduser('~') +state_path = '%s/.local/state/dzgui' %(user_path) +helpers_path = '%s/.local/share/dzgui/helpers' %(user_path) +log_path = '%s/logs' %(state_path) +changelog_path = '%s/CHANGELOG.md' %(state_path) +funcs = '%s/funcs' %(helpers_path) + +logger = logging.getLogger(__name__) +log_file = '%s/DZGUI_DEBUG.log' %(log_path) +system_log = '%s/DZGUI_SYSTEM.log' %(log_path) +FORMAT = "%(asctime)s␞%(levelname)s␞%(filename)s::%(funcName)s::%(lineno)s␞%(message)s" +logging.basicConfig(filename=log_file, + format=FORMAT, +level=logging.DEBUG) + +browser_cols = [ + "Name", + "Map", + "Perspective", + "Gametime", + "Players", + "Maximum", + "IP", + "Qport", +] +mod_cols = [ + "Mod", + "Symlink", + "Dir", + "Size (MiB)" +] +log_cols = [ + "Timestamp", + "Flag", + "Traceback", + "Message" +] +connect = [ + ("Server browser",), + ("My saved servers",), + ("Quick-connect to favorite server",), + ("Recent servers",), + ("Connect by IP",), + ("Connect by ID",) +] +manage = [ + ("Add server by IP",), + ("Add server by ID",), + ("Change favorite server",), +] +options = [ + ("List installed mods",), + ("Toggle release branch",), + ("Toggle mod install mode",), + ("Toggle Steam/Flatpak",), + ("Change player name",), + ("Change Steam API key",), + ("Change Battlemetrics API key",), + ("Force update local mods",), + ("Output system info to log file",) +] +help = [ + ("View changelog",), + ("Show debug log",), + ("Help file ⧉",), + ("Report a bug ⧉",), + ("Forum ⧉",), + ("Sponsor ⧉",), + ("Hall of fame ⧉",), +] +filters = { + "1PP": True, + "3PP": True, + "Day": True, + "Night": True, + "Empty": False, + "Full": False, + "Low population": True, + "Non-ASCII": False, + "Duplicate names": False +} +side_buttons = [ + "Connect", + "Manage", + "Options", + "Help", + "Exit" +] +status_tooltip = { + "Server browser": "Used to browse the global server list", + "My saved servers": "Browse your saved servers", + "Quick-connect to favorite server": "Connect to your favorite server", + "Recent servers": "Shows the last 10 servers you connected to", + "Connect by IP": "Connect to a server by IP", + "Connect by ID": "Connect to a server by Battlemetrics ID", + "Add server by IP": "Add a server by IP", + "Add server by ID": "Add a server by Battlemetrics ID", + "Change favorite server": "Update your quick-connect server", + "List installed mods": "Browse a list of locally-installed mods", + "Toggle release branch": "Switch between stable and testing branches", + "Toggle mod install mode": "Switch between manual and auto mod installation", + "Toggle Steam/Flatpak": "Switch the preferred client to use for launching DayZ", + "Change player name": "Update your in-game name (required by some servers)", + "Change Steam API key": "Can be used if you revoked an old API key", + "Change Battlemetrics API key": "Can be used if you revoked an old API key", + "Force update local mods": "Attempts to update any local mods out of synch with remote versions (experimental)", + "Output system info to log file": "Generates a system log for troubleshooting", + "View changelog": "Opens the DZGUI changelog in a dialog window", + "Show debug log": "Read the DZGUI log generated since startup", + "Help file ⧉": "Opens the DZGUI documentation in a browser", + "Report a bug ⧉": "Opens the DZGUI issue tracker in a browser", + "Forum ⧉": "Opens the DZGUI discussion forum in a browser", + "Sponsor ⧉": "Sponsor the developer of DZGUI", + "Hall of fame ⧉": "A list of significant contributors and testers", +} + + +def format_distance(distance): + if distance == "Unknown": + distance = "| Distance: %s" %(distance) + else: + d = int(distance) + formatted = f'{d:n}' + distance = "| Distance: %s km" %(formatted) + return distance + + +def set_surrounding_margins(widget, margin): + widget.set_margin_top(margin) + widget.set_margin_start(margin) + widget.set_margin_end(margin) + + +def parse_modlist_rows(data): + lines = data.stdout.splitlines() + hits = len(lines) + reader = csv.reader(lines, delimiter=delimiter) + try: + rows = [[row[0], row[1], row[2]] for row in reader if row] + except IndexError: + return 1 + for row in rows: + modlist_store.append(row) + return hits + +def parse_log_rows(data): + lines = data.stdout.splitlines() + reader = csv.reader(lines, delimiter=delimiter) + try: + rows = [[row[0], row[1], row[2], row[3]] for row in reader if row] + except IndexError: + return 1 + for row in rows: + log_store.append(row) + +def parse_mod_rows(data): + # GTK pads trailing zeroes on floats + # https://stackoverflow.com/questions/26827434/gtk-cellrenderertext-with-format + sum = 0 + lines = data.stdout.splitlines() + hits = len(lines) + reader = csv.reader(lines, delimiter=delimiter) + try: + rows = [[row[0], row[1], row[2], locale.atof(row[3], func=float)] for row in reader if row] + except IndexError: + return 1 + for row in rows: + mod_store.append(row) + size = float(row[3]) + sum += size + return [sum, hits] + + +def parse_server_rows(data): + sum = 0 + lines = data.stdout.splitlines() + reader = csv.reader(lines, delimiter=delimiter) + hits = len(lines) + try: + rows = [[row[0], row[1], row[2], row[3], int(row[4]), int(row[5]), row[6], int(row[7])] for row in reader if row] + except IndexError: + return 1 + for row in rows: + server_store.append(row) + players = int(row[4]) + sum += players + return [sum, hits] + + +def query_config(widget, key=""): + proc = call_out(widget, "query_config", key) + config = list(proc.stdout.splitlines()) + return (config) + + +def call_out(widget, command, *args): + if widget is not None: + widget_name = widget.get_name() + try: + widget_name = widget_name.split('+')[1] + match widget_name: + case "TreeView": + context = widget.get_first_col() + case "ScrollableTree": + context = widget.treeview.get_first_col() + case "OuterWindow": + context = widget.grid.scrollable_treelist.treeview.get_first_col() + case "Grid": + context = widget.scrollable_treelist.treeview.get_first_col() + except IndexError: + context = "Generic" + else: + context = "Generic" + + arg_ar = [] + for i in args: + arg_ar.append(i) + logger.info("Context '%s' calling subprocess '%s' with args '%s'" %(context, command, arg_ar)) + proc = subprocess.run(["/usr/bin/env", "bash", funcs, command] + arg_ar, capture_output=True, text=True) + return proc + + +def spawn_dialog(transient_parent, msg, mode): + dialog = GenericDialog(transient_parent, msg, mode) + response = dialog.run() + dialog.destroy() + match response: + case Gtk.ResponseType.OK: + logger.info("User confirmed dialog with message '%s'" %(msg)) + return 0 + case Gtk.ResponseType.CANCEL | Gtk.ResponseType.DELETE_EVENT: + logger.info("User aborted dialog with message '%s'" %(msg)) + return 1 + + +def process_shell_return_code(transient_parent, msg, code, original_input): + match code: + #TODO: add logger output to each + case 0: + # success with notice popup + spawn_dialog(transient_parent, msg, "NOTIFY") + pass + case 1: + # error with notice popup + if msg == "": + msg = "Something went wrong" + spawn_dialog(transient_parent, msg, "NOTIFY") + pass + case 2: + # warn and recurse (e.g. validation failed) + spawn_dialog(transient_parent, msg, "NOTIFY") + treeview = transient_parent.grid.scrollable_treelist.treeview + process_tree_option(original_input, treeview) + case 4: + # for BM only + spawn_dialog(transient_parent, msg, "NOTIFY") + treeview = transient_parent.grid.scrollable_treelist.treeview + process_tree_option(["Options", "Change Battlemetrics API key"], treeview) + case 5: + # for steam only + spawn_dialog(transient_parent, msg, "NOTIFY") + treeview = transient_parent.grid.scrollable_treelist.treeview + process_tree_option(["Options", "Change Steam API key"], treeview) + case 6: + # return silently + pass + case 90: + # used to update configs and metadata in-place + treeview = transient_parent.grid.scrollable_treelist.treeview + col = treeview.get_column_at_index(0) + config_vals.clear() + for i in query_config(None): + config_vals.append(i) + tooltip = format_metadata(col) + transient_parent.grid.update_statusbar(tooltip) + spawn_dialog(transient_parent, msg, "NOTIFY") + return + case 100: + # final handoff before launch + final_conf = spawn_dialog(transient_parent, msg, "CONFIRM") + treeview = transient_parent.grid.scrollable_treelist.treeview + if final_conf == 1 or final_conf is None: + return + process_tree_option(["Handshake", ""], treeview) + case 255: + spawn_dialog(transient_parent, "Update complete. Please close DZGUI and restart.", "NOTIFY") + Gtk.main_quit() + + +def process_tree_option(input, treeview): + context = input[0] + command = input[1] + logger.info("Parsing tree option '%s' for the context '%s'" %(command, context)) + + transient_parent = treeview.get_outer_window() + toggle_contexts = ["Toggle mod install mode", "Toggle release branch", "Toggle Steam/Flatpak"] + + def call_on_thread(bool, subproc, msg, args): + def _background(subproc, args, dialog): + def _load(): + wait_dialog.destroy() + msg = proc.stdout + rc = proc.returncode + logger.info("Subprocess returned code %s with message '%s'" %(rc, msg)) + process_shell_return_code(transient_parent, msg, rc, input) + proc = call_out(transient_parent, subproc, args) + GLib.idle_add(_load) + if bool is True: + wait_dialog = GenericDialog(transient_parent, msg, "WAIT") + wait_dialog.show_all() + thread = threading.Thread(target=_background, args=(subproc, args, wait_dialog)) + thread.start() + else: + # False is used to bypass wait dialogs + proc = call_out(transient_parent, subproc, args) + rc = proc.returncode + msg = proc.stdout + process_shell_return_code(transient_parent, msg, rc, input) + + + match context: + case "Help": + if command == "View changelog": + diag = ChangelogDialog(transient_parent, '', "Changelog -- content can be scrolled") + diag.run() + diag.destroy() + else: + # non-blocking subprocess + subprocess.Popen(['/usr/bin/env', 'bash', funcs, "Open link", command]) + case "Handshake": + call_on_thread(True, context, "Waiting for DayZ", command) + case _: + if command == "Output system info to log file": + call_on_thread(True, "gen_log", "Generating log", "") + elif command == "Force update local mods": + call_on_thread(True, "force_update", "Updating mods", "") + elif command == "Quick-connect to favorite server": + call_on_thread(True, command, "Working", "") + elif command in toggle_contexts: + if command == "Toggle release branch": + call_on_thread(False, "toggle", "Updating DZGUI branch", command) + else: + proc = call_out(transient_parent, "toggle", command) + grid = treeview.get_parent().get_parent() + grid.update_right_statusbar() + tooltip = format_metadata(command) + transient_parent.grid.update_statusbar(tooltip) + else: + # This branch is only used by interactive dialogs + match command: + case "Connect by IP" | "Add server by IP" | "Change favorite server": + flag = True + link_label = "" + prompt = "Enter IP in IP:Queryport format\nE.g. 192.168.1.1:27016" + case "Connect by ID" | "Add server by ID": + flag = True + link_label = "Open Battlemetrics" + prompt = "Enter server ID" + case "Change player name": + flag = False + link_label = "" + prompt = "Enter new nickname" + case "Change Steam API key": + flag = True + link_label = "Open Steam API page" + prompt = "Enter new API key" + case "Change Battlemetrics API key": + flag = True + link_label = "Open Battlemetrics API page" + prompt = "Enter new API key" + + user_entry = EntryDialog(transient_parent, prompt, "ENTRY", link_label) + res = user_entry.get_input() + if res is None: + logger.info("User aborted entry dialog") + return + logger.info("User entered: '%s'" %(res)) + + call_on_thread(flag, command, "Working", res) + + +def reinit_checks(): + toggled_checks.clear() + for check in checks: + label = check.get_label() + if filters[label] is True: + check.set_active(True) + toggled_checks.append(label) + else: + check.set_active(False) + + +class OuterWindow(Gtk.Window): + def __init__(self): + super().__init__() + + self.connect("destroy", self.halt_proc_and_quit) + self.connect("delete-event", self.halt_proc_and_quit) + # Deprecated in GTK 4.0 + self.set_border_width(10) + + """ + app > win > grid > scrollable > treeview [row/server/mod store] + app > win > grid > vbox > buttonbox > filterpanel > combo [map store] + """ + self.grid = Grid() + self.add(self.grid) + self.hb = AppHeaderBar() + self.set_titlebar(self.hb) + + # Hide FilterPanel on main menu + self.show_all() + self.grid.right_panel.set_filter_visibility(False) + self.grid.scrollable_treelist.treeview.grab_focus() + + def halt_proc_and_quit(self, window): + self.grid.terminate_treeview_process() + Gtk.main_quit() + + +class ScrollableTree(Gtk.ScrolledWindow): + def __init__(self): + super().__init__() + self.set_vexpand(False) + + self.treeview = TreeView() + self.add(self.treeview) + + +class RightPanel(Gtk.Box): + def __init__(self): + super().__init__(spacing=6) + self.set_orientation(Gtk.Orientation.VERTICAL) + + self.button_vbox = ButtonBox() + self.filters_vbox = FilterPanel() + toggle_signal(self.filters_vbox, self.filters_vbox.maps_combo, '_on_map_changed', False) + + self.pack_start(self.button_vbox, False, False, 0) + self.pack_start(self.filters_vbox, False, False, 0) + + self.question_label = Gtk.Label(label="Type ? for keybindings") + self.question_label.set_ellipsize(Pango.EllipsizeMode.END) + self.question_label.set_margin_top(100) + self.question_label.set_margin_start(10) + self.pack_start(self.question_label, False, True, 0) + + def set_filter_visibility(self, bool): + self.filters_vbox.set_visible(bool) + + def focus_button_box(self): + self.button_vbox.focus_button(0) + + def set_active_combo(self): + self.filters_vbox.set_active_combo() + + +class ButtonBox(Gtk.Box): + def __init__(self): + super().__init__(spacing=6) + self.set_orientation(Gtk.Orientation.VERTICAL) + set_surrounding_margins(self, 10) + + self.buttons = list() + for side_button in side_buttons: + button = Gtk.Button(label=side_button) + button.set_size_request(100, 100) + button.set_opacity(0.6) + self.buttons.append(button) + button.connect("clicked", self._on_selection_button_clicked) + self.pack_start(button, False, False, True) + + self.buttons[0].set_opacity(1.0) + + def _update_single_column(self, context): + logger.info("Returning from multi-column view to monocolumn view for the context '%s'" %(context)) + treeview = self.get_treeview() + right_panel = self.get_parent() + right_panel.set_filter_visibility(False) + + """Block maps combo when returning to main menu""" + toggle_signal(right_panel.filters_vbox, right_panel.filters_vbox.maps_combo, '_on_map_changed', False) + right_panel.filters_vbox.keyword_entry.set_text("") + keyword_filter.clear() + keyword_filter.append("Keyword␞") + server_store.clear() + + for column in treeview.get_columns(): + treeview.remove_column(column) + for i, column_title in enumerate([context]): + renderer = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(column_title, renderer, text=i) + treeview.append_column(column) + treeview.set_model(row_store) + treeview.grab_focus() + + def _populate(self, array_context): + row_store.clear() + status = array_context[0][0] + treeview = self.get_treeview() + grid = self.get_parent().get_parent() + + for items in array_context: + row_store.append(list(items)) + grid.update_statusbar(status_tooltip[status]) + treeview.grab_focus() + + def _on_selection_button_clicked(self, button): + treeview = self.get_treeview() + toggle_signal(treeview, treeview.selected_row, '_on_tree_selection_changed', False) + context = button.get_label() + logger.info("User clicked '%s'" %(context)) + + if context == "Exit": + logger.info("Normal user exit") + sys.exit(1) + cols = treeview.get_columns() + + if len(cols) > 1: + self._update_single_column(context) + + # Highlight the active widget + for inactive_button in self.buttons: + inactive_button.set_opacity(0.6) + button.set_opacity(1.0) + + for col in cols: + col.set_title(context) + + match context: + case 'Manage': self._populate(manage) + case 'Connect': self._populate(connect) + case 'Options': self._populate(options) + case 'Help': self._populate(help) + + toggle_signal(treeview, treeview.selected_row, '_on_tree_selection_changed', True) + + def focus_button(self, index): + self.buttons[index].grab_focus() + + def get_treeview(self): + grid = self.get_parent().get_parent() + treeview = grid.scrollable_treelist.treeview + return treeview + + +class CalcDist(multiprocessing.Process): + def __init__(self, widget, addr, result_queue, cache): + super().__init__() + + self.widget = widget + self.result_queue = result_queue + self.addr = addr + self.ip = addr.split(':')[0] + + def run(self): + if self.addr in cache: + logger.info("Address '%s' already in cache" %(self.addr)) + self.result_queue.put([self.addr, cache[self.addr]]) + return + proc = call_out(self.widget, "get_dist", self.ip) + km = proc.stdout + self.result_queue.put([self.addr, km]) + + +class TreeView(Gtk.TreeView): + __gsignals__ = {"on_distcalc_started": (GObject.SignalFlags.RUN_FIRST, None, ())} + + def __init__(self): + super().__init__() + + self.queue = multiprocessing.Queue() + self.current_proc = None + + # Disables typeahead search + self.set_enable_search(False) + self.set_search_column(-1) + + # Populate model with initial context + for rows in connect: + row_store.append(list(rows)) + self.set_model(row_store) + + for i, column_title in enumerate( + ["Connect"] + ): + renderer = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(column_title, renderer, text=i) + self.append_column(column) + # TODO: change font size on the fly + # renderer.set_property("size-points", 20) + + self.connect("row-activated", self._on_row_activated) + self.connect("key-press-event", self._on_keypress) + self.connect("key-press-event", self._on_keypress_main_menu) + toggle_signal(self, self, '_on_keypress', False) + + self.selected_row = self.get_selection() + self.selected_row.connect("changed", self._on_tree_selection_changed) + self.connect("button-release-event", self._on_button_release) + + def terminate_process(self): + if self.current_proc and self.current_proc.is_alive(): + self.current_proc.terminate() + + def _on_menu_click(self, menu_item): + parent = self.get_outer_window() + context = self.get_first_col() + value = self.get_column_at_index(0) + context_menu_label = menu_item.get_label() + logger.info("User clicked context menu '%s'" %(context_menu_label)) + + match context_menu_label: + case "Add to my servers" | "Remove from favorites": + record = "%s:%s" %(self.get_column_at_index(6), self.get_column_at_index(7)) + call_out(parent, context_menu_label, record) + if context == "Name (My saved servers)": + iter = self.get_current_iter() + server_store.remove(iter) + res = spawn_dialog(parent, "Added %s to favorites" %(record), "NOTIFY") + case "Remove from history": + record = "%s:%s" %(self.get_column_at_index(6), self.get_column_at_index(7)) + call_out(parent, context_menu_label, record) + iter = self.get_current_iter() + server_store.remove(iter) + case "Copy IP to clipboard": + self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) + addr = self.get_column_at_index(6) + qport = self.get_column_at_index(7) + ip = addr.split(':')[0] + record = "%s:%s" %(ip, qport) + self.clipboard.set_text(record, -1) + case "Show server-side mods": + record = "%s:%s" %(self.get_column_at_index(6), self.get_column_at_index(7)) + dialog = ModDialog(parent, "Enter/double click a row to open in Steam Workshop. ESC exits this dialog", "Modlist", record) + modlist_store.clear() + case "Delete mod": + conf_msg = "Really delete the mod '%s'?" %(value) + success_msg = "Successfully deleted the mod '%s'." %(value) + fail_msg = "An error occurred during deletion. Aborting." + res = spawn_dialog(parent, conf_msg, "CONFIRM") + symlink = self.get_column_at_index(1) + dir = self.get_column_at_index(2) + if res == 0: + proc = call_out(parent, "delete", symlink, dir) + if proc.returncode == 0: + spawn_dialog(parent, success_msg, "NOTIFY") + self._update_quad_column("List installed mods") + else: + spawn_dialog(parent, fail_msg, "NOTIFY") + case "Open in Steam Workshop": + record = self.get_column_at_index(2) + call_out(parent, "open_workshop_page", record) + + def _on_button_release(self, widget, event): + try: + pathinfo = self.get_path_at_pos(event.x, event.y) + if pathinfo is None: + return + (path, col, cellx, celly) = pathinfo + self.set_cursor(path,col,0) + except AttributeError: + pass + + if event.type is Gdk.EventType.BUTTON_RELEASE and event.button != 3: + return + context = self.get_first_col() + self.menu = Gtk.Menu() + + mod_context_items = ["Open in Steam Workshop", "Delete mod"] + subcontext_items = {"Server browser": ["Add to my servers", "Copy IP to clipboard", "Show server-side mods"], + "My saved servers": ["Remove from favorites", "Copy IP to clipboard", "Show server-side mods"], + "Recent servers": ["Remove from history", "Copy IP to clipboard", "Show server-side mods"], + } + # submenu hierarchy https://stackoverflow.com/questions/52847909/how-to-add-a-sub-menu-to-a-gtk-menu + if context == "Mod": + items = mod_context_items + subcontext = "List installed mods" + elif "Name" in context: + subcontext = context.split('(')[1].split(')')[0] + items = subcontext_items[subcontext] + else: + return + + for item in items: + if subcontext == "Server browser" and item == "Add to my servers": + record = "%s:%s" %(self.get_column_at_index(6), self.get_column_at_index(7)) + proc = call_out(widget, "is_in_favs", record) + if proc.returncode == 0: + item = "Remove from favorites" + item = Gtk.MenuItem(label=item) + item.connect("activate", self._on_menu_click) + self.menu.append(item) + + self.menu.show_all() + + if event.type is Gdk.EventType.KEY_PRESS and event.keyval is Gdk.KEY_l: + self.menu.popup_at_widget(widget, Gdk.Gravity.CENTER, Gdk.Gravity.WEST) + else: + self.menu.popup_at_pointer(event) + + def get_outer_window(self): + win = self.get_parent().get_parent().get_parent() + return win + + def get_outer_grid(self): + grid = self.get_parent().get_parent() + return grid + + def get_current_iter(self): + iter = self.get_selection().get_selected()[1] + return iter + + def get_current_index(self): + index = treeview.get_selection().get_selected_rows()[1][0][0] + return index + + def _on_tree_selection_changed(self, selection): + grid = self.get_outer_grid() + context = self.get_first_col() + row_sel = self.get_column_at_index(0) + if context == "Mod" or context == "Timestamp": + return + logger.info("Tree selection for context '%s' changed to '%s'" %(context, row_sel)) + + if self.current_proc and self.current_proc.is_alive(): + self.current_proc.terminate() + + if "Name" in context: + addr = self.get_column_at_index(6) + if addr is None: + return + if addr in cache: + dist = format_distance(cache[addr]) + + tooltip = server_tooltip[0] + dist + grid.update_statusbar(tooltip) + return + self.emit("on_distcalc_started") + self.current_proc = CalcDist(self, addr, self.queue, cache) + self.current_proc.start() + elif None: + return + else: + tooltip = format_metadata(row_sel) + grid.update_statusbar(tooltip) + + def _on_keypress_main_menu(self, treeview, event): + window = self.get_outer_window() + grid = self.get_outer_grid() + match event.keyval: + case Gdk.KEY_Right: + grid.right_panel.focus_button_box() + case Gdk.KEY_question: + if event.state is Gdk.ModifierType.SHIFT_MASK: + diag = KeysDialog(window, '', "Keybindings") + diag.run() + diag.destroy() + case Gdk.KEY_f: + if event.state is Gdk.ModifierType.CONTROL_MASK: + return True + case _: + return False + + def _on_keypress(self, treeview, event): + if self.get_first_col == "Mod": + return + keyname = Gdk.keyval_name(event.keyval) + grid = self.get_outer_grid() + cur_proc = grid.scrollable_treelist.treeview.current_proc + if event.state is Gdk.ModifierType.CONTROL_MASK: + match event.keyval: + case Gdk.KEY_d: + debug = grid.right_panel.filters_vbox.debug_toggle + if debug.get_active(): + debug.set_active(False) + else: + debug.set_active(True) + case Gdk.KEY_l: + self._on_button_release(self, event) + case Gdk.KEY_f: + grid.right_panel.filters_vbox.grab_keyword_focus() + case Gdk.KEY_m: + grid.right_panel.filters_vbox.maps_combo.grab_focus() + grid.right_panel.filters_vbox.maps_combo.popup() + case _: + return False + elif keyname.isnumeric() and int(keyname) > 0: + digit = (int(keyname) - 1) + grid.right_panel.filters_vbox.toggle_check(checks[digit]) + else: + return False + + def get_column_at_index(self, index): + select = self.get_selection() + sels = select.get_selected_rows() + (model, pathlist) = sels + if len(pathlist) < 1: + return + path = pathlist[0] + tree_iter = model.get_iter(path) + value = model.get_value(tree_iter, index) + return value + + def _background(self, dialog, mode): + def loadTable(): + for map in maps: + map_store.append([map]) + toggle_signal(self, self.selected_row, '_on_tree_selection_changed', True) + right_panel.set_filter_visibility(True) + dialog.destroy() + self.grab_focus() + + grid = self.get_outer_grid() + right_panel = grid.right_panel + + filters = toggled_checks + keyword_filter + selected_map + data = call_out(self, "dump_servers", mode, *filters) + + toggle_signal(self, self.selected_row, '_on_tree_selection_changed', False) + row_metadata = parse_server_rows(data) + sum = row_metadata[0] + hits = row_metadata[1] + server_tooltip[0] = format_tooltip(sum, hits) + grid.update_statusbar(server_tooltip[0]) + + map_data = call_out(self, "get_unique_maps", mode) + maps = map_data.stdout.splitlines() + self.set_model(server_store) + GLib.idle_add(loadTable) + + def _background_quad(self, dialog, mode): + def load(): + dialog.destroy() + self.set_model(mod_store) + self.grab_focus() + size = locale.format_string('%.3f', total_size, grouping=True) + grid.update_statusbar("Found %s mods taking up %s MiB" %(f'{total_mods:n}', size)) + + grid = self.get_outer_grid() + right_panel = grid.right_panel + + right_panel.set_filter_visibility(False) + data = call_out(self, "list_mods", mode) + result = parse_mod_rows(data) + total_size = result[0] + total_mods = result[1] + GLib.idle_add(load) + + def _update_multi_column(self, mode): + # Local server lists may have different filter toggles from remote list + # FIXME: tree selection updates twice here. attach signal later + toggle_signal(self, self.selected_row, '_on_tree_selection_changed', False) + # toggle_signal(self, self.selected_row, '_on_check_toggled', False) + for column in self.get_columns(): + self.remove_column(column) + row_store.clear() + for i, column_title in enumerate(browser_cols): + renderer = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(column_title, renderer, text=i) + column.set_sort_column_id(i) + """Prevent columns from auto-adjusting""" + if ("Name" in column_title): + column.set_fixed_width(800) + if (column_title == "Map"): + column.set_fixed_width(300) + self.append_column(column) + + self.update_first_col(mode) + transient_parent = self.get_outer_window() + + for check in checks: + toggle_signal(self.get_outer_grid().right_panel.filters_vbox, check, '_on_check_toggle', True) + toggle_signal(self, self, '_on_keypress', True) + + wait_dialog = GenericDialog(transient_parent, "Fetching server metadata", "WAIT") + wait_dialog.show_all() + thread = threading.Thread(target=self._background, args=(wait_dialog, mode)) + thread.start() + + def update_first_col(self, title): + for col in self.get_columns(): + old_title = col.get_title() + col.set_title("%s (%s)" %(old_title, title)) + break + + def get_first_col(self): + for col in self.get_columns(): + cur_col = col.get_title() + break + return cur_col + + def _format_float(self, column, cell, model, iter, data): + # https://docs.huihoo.com/pygtk/2.0-tutorial/sec-CellRenderers.html + val = model[iter][3] + formatted = locale.format_string('%.3f', val, grouping=True) + cell.set_property('text', formatted) + return + + def _update_quad_column(self, mode): + # toggle_signal(self, self.selected_row, '_on_tree_selection_changed', False) + for column in self.get_columns(): + self.remove_column(column) + + mod_store.clear() + log_store.clear() + + if mode == "List installed mods": + cols = mod_cols + self.set_model(mod_store) + else: + cols = log_cols + self.set_model(log_store) + + for i, column_title in enumerate(cols): + renderer = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(column_title, renderer, text=i) + if mode == "List installed mods": + if i == 3: + column.set_cell_data_func(renderer, self._format_float, func_data=None) + column.set_sort_column_id(i) + if (column_title == "Name"): + column.set_fixed_width(600) + self.append_column(column) + + if mode == "List installed mods": + pass + else: + data = call_out(self, "show_log") + res = parse_log_rows(data) + if res == 1: + spawn_dialog(self.get_outer_window(), "Failed to load log file, possibly corrupted", "NOTIFY") + return + + transient_parent = self.get_outer_window() + + wait_dialog = GenericDialog(transient_parent, "Checking mods", "WAIT") + wait_dialog.show_all() + thread = threading.Thread(target=self._background_quad, args=(wait_dialog, mode)) + thread.start() + + def _background_connection(self, dialog, record): + def load(): + dialog.destroy() + transient = self.get_outer_window() + process_shell_return_code(transient, proc.stdout, proc.returncode, record) + + proc = call_out(self, "Connect from table", record) + GLib.idle_add(load) + + + def _attempt_connection(self): + transient_parent = self.get_outer_window() + addr = self.get_column_at_index(6) + qport = self.get_column_at_index(7) + record = "%s:%s" %(addr, str(qport)) + + wait_dialog = GenericDialog(transient_parent, "Querying server and aligning mods", "WAIT") + wait_dialog.show_all() + thread = threading.Thread(target=self._background_connection, args=(wait_dialog, record)) + thread.start() + + def _on_row_activated(self, treeview, tree_iter, col): + context = self.get_first_col() + chosen_row = self.get_column_at_index(0) + output = context, chosen_row + if context == "Mod" or context == "Timestamp": + return + logger.info("User selected '%s' for the context '%s'" %(chosen_row, context)) + + outer = self.get_outer_window() + right_panel = outer.grid.right_panel + filters_vbox = right_panel.filters_vbox + + valid_contexts = ["Server browser", "My saved servers", "Recent servers"] + if chosen_row in valid_contexts: + # server contexts share the same model type + for check in checks: + toggle_signal(filters_vbox, check, '_on_check_toggle', False) + + if chosen_row == "Server browser": + reinit_checks() + else: + for check in checks: + if check.get_label() not in toggled_checks: + toggled_checks.append(check.get_label()) + check.set_active(True) + self._update_multi_column(chosen_row) + + map_store.clear() + map_store.append(["All maps"]) + right_panel.set_active_combo() + + toggle_signal(filters_vbox, filters_vbox.maps_combo, '_on_map_changed', True) + toggle_signal(self, self.selected_row, '_on_tree_selection_changed', True) + self.grab_focus() + elif chosen_row == "List installed mods" or chosen_row == "Show debug log": + toggle_signal(self, self.selected_row, '_on_tree_selection_changed', False) + self._update_quad_column(chosen_row) + toggle_signal(self, self.selected_row, '_on_tree_selection_changed', True) + elif any(map(context.__contains__, valid_contexts)): + # implies activated row on any server list subcontext + self._attempt_connection() + else: + # implies any other non-server option selected from main menu + process_tree_option(output, self) + + +def format_metadata(row_sel): + prefix = status_tooltip[row_sel] + vals = { + "branch": config_vals[0], + "debug": config_vals[1], + "auto_install": config_vals[2], + "name": config_vals[3], + "fav_label": config_vals[4], + "preferred_client": config_vals[5] + } + match row_sel: + case "Quick-connect to favorite server" | "Change favorite server": + default = "unset" + val = "fav_label" + case "Change player name": + val = "name" + case "Toggle mod install mode": + default = "manual" + alt = "auto" + val = "auto_install" + case "Toggle debug mode": + default = "normal" + alt = "debug" + val = "debug" + case "Toggle release branch": + val = "branch" + case "Toggle Steam/Flatpak": + val = "preferred_client" + case _: + return prefix + + try: + cur_val = vals[val] + if cur_val == "": + return "%s | Current: %s" %(prefix, default) + # TODO: migrate to human readable config values + elif cur_val == "1": + return "%s | Current: %s" %(prefix, alt) + else: + return "%s | Current: '%s'" %(prefix, cur_val) + except KeyError: + return prefix + + +def format_tooltip(sum, hits): + if hits == 1: + hit_suffix = "match" + else: + hit_suffix = "matches" + if sum == 1: + player_suffix = "player" + else: + player_suffix = "players" + tooltip = "Found %s %s with %s %s" %(f'{hits:n}', hit_suffix, f'{sum:n}', player_suffix) + return tooltip + + +def filter_servers(transient_parent, filters_vbox, treeview, context): + def filter(dialog): + def clear_and_destroy(): + row_metadata = parse_server_rows(data) + sum = row_metadata[0] + hits = row_metadata[1] + server_tooltip[0] = format_tooltip(sum, hits) + transient_parent.grid.update_statusbar(server_tooltip[0]) + + toggle_signal(treeview, treeview.selected_row, '_on_tree_selection_changed', True) + toggle_signal(filters_vbox, filters_vbox, '_on_button_release', True) + toggle_signal(filters_vbox, filters_vbox.maps_combo, '_on_map_changed', True) + dialog.destroy() + treeview.grab_focus() + + server_filters = toggled_checks + keyword_filter + selected_map + data = call_out(transient_parent, "filter", context, *server_filters) + GLib.idle_add(clear_and_destroy) + + # block additional input on FilterPanel while filters are running + toggle_signal(treeview, treeview.selected_row, '_on_tree_selection_changed', False) + toggle_signal(filters_vbox, filters_vbox, '_on_button_release', False) + toggle_signal(filters_vbox, filters_vbox.maps_combo, '_on_map_changed', False) + + dialog = GenericDialog(transient_parent, "Filtering results", "WAIT") + dialog.show_all() + server_store.clear() + + thread = threading.Thread(target=filter, args=(dialog,)) + thread.start() + + +class AppHeaderBar(Gtk.HeaderBar): + def __init__(self): + super().__init__() + Gtk.HeaderBar() + self.props.title = app_name + self.set_show_close_button(True) + + +class NewsHeader(Gtk.Box): + def __init__(self, news): + super().__init__() + Gtk.Box(spacing=1) + self.set_valign(Gtk.Align.START) + news_label = Gtk.Label(label=news) + news_label.set_ellipsize(Pango.EllipsizeMode.END) + self.pack_start(news_label, False, False, 0) + + +class GenericDialog(Gtk.MessageDialog): + def __init__(self, parent, text, mode): + + def _on_dialog_delete(self, response_id): + """Passively ignore user-input""" + return True + + match mode: + case "WAIT": + dialog_type = Gtk.MessageType.INFO + button_type = Gtk.ButtonsType.NONE + header_text = "Please wait" + case "NOTIFY": + dialog_type = Gtk.MessageType.INFO + button_type = Gtk.ButtonsType.OK + header_text = "Notice" + case "CONFIRM": + dialog_type = Gtk.MessageType.QUESTION + button_type = Gtk.ButtonsType.OK_CANCEL + header_text = "Confirmation" + case "ENTRY": + dialog_type = Gtk.MessageType.QUESTION + button_type = Gtk.ButtonsType.OK_CANCEL + header_text = "User input required" + case _: + dialog_type = Gtk.MessageType.INFO + button_type = Gtk.ButtonsType.OK + header_text = mode + + Gtk.MessageDialog.__init__( + self, + transient_for=parent, + flags=0, + message_type=dialog_type, + text=header_text, + secondary_text=text, + buttons=button_type, + title=app_name, + modal=True, + ) + + if mode == "WAIT": + dialogBox = self.get_content_area() + spinner = Gtk.Spinner() + dialogBox.pack_end(spinner, False, False, 0) + spinner.start() + self.connect("delete-event", _on_dialog_delete) + + self.set_default_response(Gtk.ResponseType.OK) + self.set_size_request(500, 0) + self.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) + + def update_label(self, text): + self.format_secondary_text(text) + + +def ChangelogDialog(parent, text, mode): + + dialog = GenericDialog(parent, text, mode) + dialogBox = dialog.get_content_area() + dialog.set_default_response(Gtk.ResponseType.OK) + dialog.set_size_request(1000, 600) + + with open(changelog_path, 'r') as f: + changelog = f.read() + + scrollable = Gtk.ScrolledWindow() + label = Gtk.Label() + label.set_markup(changelog) + scrollable.add(label) + dialogBox.pack_end(scrollable, True, True, 0) + set_surrounding_margins(dialogBox, 30) + + dialog.show_all() + return dialog + + +def KeysDialog(parent, text, mode): + + dialog = GenericDialog(parent, text, mode) + dialogBox = dialog.get_content_area() + dialog.set_default_response(Gtk.ResponseType.OK) + dialog.set_size_request(700, 0) + + keybindings = """ + Basic navigation + Ctrl-q: quit + Enter/Space/Double click: select row item + Up, Down: navigate through row items + + Button navigation + Right: jump from main view to side buttons + Left: jump from side buttons to main view + Up, Down: navigate up and down through side buttons + Tab, Shift-Tab: navigate forward/back through menu elements + + Any server browsing context + Enter/Space/Double click: connect to server + Right-click on row/Ctrl-l: displays additional context menus + Ctrl-f: jump to keyword field + Ctrl-m: jump to maps dropdown + Ctrl-d: toggle dry run (debug) mode + 1-9: toggle filter ON/OFF + ESC: jump back to main view from keyword/maps + """ + + label = Gtk.Label() + label.set_markup(keybindings) + dialogBox.pack_end(label, False, False, 0) + dialog.show_all() + return dialog + + +class ModDialog(GenericDialog): + def __init__(self, parent, text, mode, record): + super().__init__(parent, text, mode) + + dialogBox = self.get_content_area() + self.set_default_response(Gtk.ResponseType.OK) + self.set_size_request(800, 500) + + self.scrollable = Gtk.ScrolledWindow() + self.view = Gtk.TreeView() + self.scrollable.set_vexpand(True) + self.scrollable.add(self.view) + set_surrounding_margins(self.scrollable, 20) + + self.view.connect("row-activated", self._on_row_activated) + + for i, column_title in enumerate( + ["Mod", "ID", "Installed"] + ): + renderer = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(column_title, renderer, text=i) + self.view.append_column(column) + column.set_sort_column_id(i) + dialogBox.pack_end(self.scrollable, True, True, 0) + + wait_dialog = GenericDialog(parent, "Fetching modlist", "WAIT") + wait_dialog.show_all() + thread = threading.Thread(target=self._background, args=(wait_dialog, parent, record)) + thread.start() + + def _background(self, dialog, parent, record): + def _load(): + dialog.destroy() + if data.returncode == 1: + spawn_dialog(parent, "Server has no mods installed", "NOTIFY") + return + self.show_all() + self.set_markup("Modlist (%s mods)" %(mod_count)) + res = self.run() + self.destroy() + + addr = record.split(':') + ip = addr[0] + qport = addr[2] + data = call_out(parent, "show_server_modlist", ip, qport) + mod_count = parse_modlist_rows(data) + self.view.set_model(modlist_store) + GLib.idle_add(_load) + + def popup(self): + pass + + def _on_row_activated(self, treeview, tree_iter, col): + select = treeview.get_selection() + sels = select.get_selected_rows() + (model, pathlist) = sels + if len(pathlist) < 1: + return + path = pathlist[0] + tree_iter = model.get_iter(path) + mod_id = model.get_value(tree_iter, 1) + call_out(treeview, "open_workshop_page", mod_id) + +class EntryDialog(GenericDialog): + def __init__(self, parent, text, mode, link): + super().__init__(parent, text, mode) + + """ Returns user input as a string or None """ + """ If user does not input text it returns None, NOT AN EMPTY STRING. """ + + self.dialog = GenericDialog(parent, text, mode) + self.dialogBox = self.dialog.get_content_area() + self.dialog.set_default_response(Gtk.ResponseType.OK) + self.dialog.set_size_request(500, 0) + + self.userEntry = Gtk.Entry() + set_surrounding_margins(self.userEntry, 20) + self.userEntry.set_margin_top(0) + self.userEntry.set_size_request(250, 0) + self.userEntry.set_activates_default(True) + self.dialogBox.pack_start(self.userEntry, False, False, 0) + + if link != "": + button = Gtk.Button(label=link) + button.set_margin_start(60) + button.set_margin_end(60) + button.connect("clicked", self._on_button_clicked) + self.dialogBox.pack_end(button, False, False, 0) + + def _on_button_clicked(self, button): + label = button.get_label() + subprocess.Popen(['/usr/bin/env', 'bash', funcs, "Open link", label]) + + def get_input(self): + self.dialog.show_all() + response = self.dialog.run() + text = self.userEntry.get_text() + self.dialog.destroy() + if (response == Gtk.ResponseType.OK) and (text != ''): + return text + else: + return None + + +class Grid(Gtk.Grid): + def __init__(self): + super().__init__() + Gtk.Grid() + self.set_column_homogeneous(True) + #self.set_row_homogeneous(True) + + self.scrollable_treelist = ScrollableTree() + self.scrollable_treelist.set_vexpand(True) + self.right_panel = RightPanel() + + _news = sys.argv[2] + self._version = "%s %s" %(app_name, sys.argv[3]) + + if _news != "null": + self.news = NewsHeader(_news) + self.attach(self.news, 0, -1, 8, 10) + + self.bar = Gtk.Statusbar() + self.scrollable_treelist.treeview.connect("on_distcalc_started", self._on_calclat_started) + + GLib.timeout_add(200, self._check_result_queue) + + self.update_statusbar(default_tooltip) + self.status_right_label = Gtk.Label(label="") + self.bar.add(self.status_right_label) + self.update_right_statusbar() + + self.attach(self.scrollable_treelist, 0, 0, 8, 10) + self.attach_next_to(self.bar, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 8, 1) + self.attach_next_to(self.right_panel, self.scrollable_treelist, Gtk.PositionType.RIGHT, 1, 1) + + def update_right_statusbar(self): + config_vals.clear() + for i in query_config(self): + config_vals.append(i) + _branch = config_vals[0] + _branch = _branch.upper() + _debug = config_vals[1] + if _debug == "": + _debug = "NORMAL" + else: + _debug = "DEBUG" + concat_label = "%s | %s | %s" %(_branch, _debug, self._version) + self.status_right_label.set_text(concat_label) + + def terminate_treeview_process(self): + self.scrollable_treelist.treeview.terminate_process() + + def _on_calclat_started(self, treeview): + server_tooltip[1] = server_tooltip[0] + "| Distance: calculating..." + self.update_statusbar(server_tooltip[1]) + + def _check_result_queue(self): + latest_result = None + result_queue = self.scrollable_treelist.treeview.queue + while not result_queue.empty(): + latest_result = result_queue.get() + + if latest_result is not None: + addr = latest_result[0] + km = latest_result[1] + cache[addr] = km + dist = format_distance(km) + tooltip = server_tooltip[1] = server_tooltip[0] + dist + self.update_statusbar(tooltip) + + return True + + def update_statusbar(self, string): + meta = self.bar.get_context_id("Statusbar") + self.bar.push(meta, string) + + +def toggle_signal(owner, widget, func_name, bool): + func = getattr(owner, func_name) + if (bool): + logger.debug("Unblocking %s for %s" %(func_name, widget)) + widget.handler_unblock_by_func(func) + else: + logger.debug("Blocking %s for %s" %(func_name, widget)) + widget.handler_block_by_func(func) + + +class App(Gtk.Application): + def __init__(self): + + self.win = OuterWindow() + + # TODO: steam deck + # self.win.set_size_request(1280,800) + self.win.fullscreen() + + accel = Gtk.AccelGroup() + accel.connect(Gdk.KEY_q, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE, self._halt_window_subprocess) + self.win.add_accel_group(accel) + + GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGINT, Gtk.main_quit) + Gtk.main() + + def _halt_window_subprocess(self, accel_group, window, code, flag): + self.win.halt_proc_and_quit(self) + + +class FilterPanel(Gtk.Box): + def __init__(self): + super().__init__(spacing=6) + + for check in filters.keys(): + checkbutton = Gtk.CheckButton(label=check) + label = checkbutton.get_children() + + label[0].set_ellipsize(Pango.EllipsizeMode.END) + if filters[check] is True: + checkbutton.set_active(True) + toggled_checks.append(check) + checkbutton.connect("toggled", self._on_check_toggle) + checks.append(checkbutton) + + self.connect("button-release-event", self._on_button_release) + self.set_orientation(Gtk.Orientation.VERTICAL) + set_surrounding_margins(self, 10) + + self.filters_label = Gtk.Label(label="Filters") + + self.keyword_entry = Gtk.Entry() + self.keyword_entry.set_placeholder_text("Filter by keyword") + self.keyword_entry.connect("activate", self._on_keyword_enter) + self.keyword_entry.connect("key-press-event", self._on_esc_pressed) + + renderer_text = Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END) + self.maps_combo = Gtk.ComboBox.new_with_model(map_store) + self.maps_combo.pack_start(renderer_text, True) + self.maps_combo.add_attribute(renderer_text, "text", 0) + self.maps_combo.connect("changed", self._on_map_changed) + self.maps_combo.connect("key-press-event", self._on_esc_pressed) + + self.debug_toggle = Gtk.ToggleButton(label="Debug mode") + self.debug_toggle.connect("toggled", self._on_button_toggled, "Toggle debug mode") + set_surrounding_margins(self.debug_toggle, 10) + + self.pack_start(self.filters_label, False, False, True) + self.pack_start(self.keyword_entry, False, False, True) + self.pack_start(self.maps_combo, False, False, True) + + for i, check in enumerate(checks[0:]): + self.pack_start(checks[i], False, False, True) + + self.pack_start(self.debug_toggle, False, False, 0) + + def _on_button_toggled(self, button, command): + transient_parent = self.get_outer_window() + grid = self.get_outer_grid() + call_out(transient_parent, "toggle", command) + grid.update_right_statusbar() + grid.scrollable_treelist.treeview.grab_focus() + + def grab_keyword_focus(self): + self.keyword_entry.grab_focus() + + def restore_focus_to_treeview(self): + grid = self.get_outer_grid() + grid.scrollable_treelist.treeview.grab_focus() + return False + + def _on_esc_pressed(self, entry, event): + keyname = Gdk.keyval_name(event.keyval) + if keyname == "Escape": + GLib.idle_add(self.restore_focus_to_treeview) + + def get_outer_grid(self): + panel = self.get_parent() + grid = panel.get_parent() + return grid + + def get_outer_window(self): + grid = self.get_outer_grid() + outer_window = grid.get_parent() + return outer_window + + def _on_keyword_enter(self, keyword_entry): + keyword = keyword_entry.get_text() + old_keyword = keyword_filter[0].split(delimiter)[1] + if keyword == old_keyword: + return + logger.info("User filtered by keyword '%s'" %(keyword)) + keyword_filter.clear() + keyword_filter.append("Keyword␞" + keyword) + transient_parent = self.get_outer_window() + grid = self.get_outer_grid() + treeview = grid.scrollable_treelist.treeview + context = grid.scrollable_treelist.treeview.get_first_col() + filter_servers(transient_parent, self, treeview, context) + + def _on_button_release(self, window, button): + return True + + def set_active_combo(self): + self.maps_combo.set_active(0) + + def toggle_check(self, button): + if button.get_active(): + button.set_active(False) + else: + button.set_active(True) + + def _on_check_toggle(self, button): + grid = self.get_outer_grid() + treeview = grid.scrollable_treelist.treeview + context = grid.scrollable_treelist.treeview.get_first_col() + label = button.get_label() + state = button.get_active() + + if context == "Mod": + return + if state is True: + toggled_checks.append(label) + else: + toggled_checks.remove(label) + + logger.info("User toggled button '%s' to %s" %(label, state)) + transient_parent = self.get_outer_window() + filter_servers(transient_parent, self, treeview, context) + + def _on_map_changed(self, combo): + grid = self.get_outer_grid() + transient_parent = self.get_outer_window() + treeview = grid.scrollable_treelist.treeview + context = grid.scrollable_treelist.treeview.get_first_col() + + tree_iter = combo.get_active_iter() + if tree_iter is not None: + selected_map.clear() + model = combo.get_model() + selection = model[tree_iter][0] + selected_map.append("Map=" + selection) + logger.info("User selected map '%s'" %(selection)) + filter_servers(transient_parent, self, treeview, context) + + +def main(): + + def usage(): + text = "UI constructor must be run via DZGUI" + logger.critical(text) + print(text) + sys.exit(1) + + expected_flag = "--init-ui" + if len(sys.argv) < 2: + usage() + if sys.argv[1] != expected_flag: + usage() + + logger.info("Spawned UI from DZGUI setup process") + App() + + +if __name__ == '__main__': + main() From 4bd1d4728d99c73e7c3a6811eddce7c7a6c735a9 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:13:41 +0900 Subject: [PATCH 004/122] chore: update logging --- dzgui.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index ece043f..a4d63bc 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -545,10 +545,11 @@ fetch_helpers_by_sum(){ file="$i" sum="${sums[$i]}" full_path="$helpers_path/$file" - if [[ -f "$full_path" ]] && [[ $(get_hash "$helpers_path/$file") == $sum ]]; then + cur_sum=$(get_hash "$helpers_path/$file") + if [[ -f "$full_path" ]] && [[ $cur_sum == $sum ]]; then logger INFO "'$file' is current" else - logger WARN "File '$full_path' checksum != '$sum'" + logger WARN "File '$full_path' checksum '$cur_sum' != '$sum'" curl -Ls "$url" > "$full_path/$file" if [[ ! $? -eq 0 ]]; then raise_error_and_quit "Failed to fetch the file '$file'. Possible timeout?" From 77ea5836f4b650740d67373ac10c615dce65820a Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:27:45 +0900 Subject: [PATCH 005/122] chore: cleanup --- dzgui.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index a4d63bc..01b25f2 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -63,8 +63,6 @@ testing_url="$url_prefix/testing" releases_url="https://github.com/$author/$repo/releases/download/browser" km_helper_url="$releases_url/latlon" geo_file_url="$releases_url/ips.csv.gz" -#TODO: normalize -vdf2json_url="$stable_url/helpers/vdf2json.py" #TODO: move adoc to index help_url="https://$author.github.io/dzgui/dzgui" sponsor_url="https://github.com/sponsors/$author" @@ -786,7 +784,6 @@ initial_setup(){ steam_deps migrate_files stale_symlinks - #TODO: test fetching fetch_helpers local_latlon is_steam_running From 1566f8ade69e7c8581fbb9baee8accf99655f787 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:29:27 +0900 Subject: [PATCH 006/122] chore: drop old vars --- dzgui.sh | 3 --- helpers/funcs | 1 - 2 files changed, 4 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 01b25f2..47db67d 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -63,9 +63,6 @@ testing_url="$url_prefix/testing" releases_url="https://github.com/$author/$repo/releases/download/browser" km_helper_url="$releases_url/latlon" geo_file_url="$releases_url/ips.csv.gz" -#TODO: move adoc to index -help_url="https://$author.github.io/dzgui/dzgui" -sponsor_url="https://github.com/sponsors/$author" logger(){ local date="$(date "+%F %T,%3N")" diff --git a/helpers/funcs b/helpers/funcs index 0b09c00..bc564d5 100644 --- a/helpers/funcs +++ b/helpers/funcs @@ -73,7 +73,6 @@ releases_url="$gh_prefix/$author/$repo/releases/download/browser" km_helper_url="$releases_url/latlon" db_file="$releases_url/ips.csv.gz" sums_url="$stable_url/helpers/sums.md5" -vdf2json_url="$stable_url/helpers/vdf2json.py" #TODO: move adoc to index help_url="https://$author.github.io/dzgui/dzgui" forum_url="$gh_prefix/$author/$repo/discussions" From 06a389eebe8fa7fbdef8afea1fd9bc0509646f54 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:33:33 +0900 Subject: [PATCH 007/122] fix: presetup checks --- dzgui.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 47db67d..c9bd89d 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -540,12 +540,11 @@ fetch_helpers_by_sum(){ file="$i" sum="${sums[$i]}" full_path="$helpers_path/$file" - cur_sum=$(get_hash "$helpers_path/$file") - if [[ -f "$full_path" ]] && [[ $cur_sum == $sum ]]; then + if [[ -f "$full_path" ]] && [[ $(get_hash "$full_path") == $sum ]]; then logger INFO "'$file' is current" else - logger WARN "File '$full_path' checksum '$cur_sum' != '$sum'" - curl -Ls "$url" > "$full_path/$file" + logger WARN "File '$full_path' checksum != '$sum'" + curl -Ls "$url" > "$full_path" if [[ ! $? -eq 0 ]]; then raise_error_and_quit "Failed to fetch the file '$file'. Possible timeout?" fi From f57973c1456607e38266d6af702a7c976fe7ed3e Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:34:25 +0900 Subject: [PATCH 008/122] fix: full path to UI helper --- dzgui.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index c9bd89d..0dae4f7 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -795,8 +795,8 @@ main(){ local news=$(check_news) printf "All OK. Kicking off UI...\n" - [[ -n $news ]] && python3 "ui.py" "--init-ui" "$news" "$version" - [[ -z $news ]] && python3 "ui.py" "--init-ui" "null" "$version" + [[ -n $news ]] && python3 "$ui_helper" "--init-ui" "$news" "$version" + [[ -z $news ]] && python3 "$ui_helper" "--init-ui" "null" "$version" } main #TODO: tech debt: cruddy handling for steam forking From de5b53096893540fb8f637ad6099801ca7347629 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:10:02 +0900 Subject: [PATCH 009/122] fix: return codes --- dzgui.sh | 9 ++++++--- helpers/funcs | 13 ++++++------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 0dae4f7..a8ce9a8 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -529,17 +529,20 @@ fetch_helpers_by_sum(){ ["ui.py"]="8c430f1465995cbd98f4ad8e2580a79d" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="b04a0e34141e4e11da0a061802a822e3" + ["funcs"]="3aae486ae5097fa9b7349df1dfd25734" ) local author="aclist" local repo="dztui" local branch="$branch" - local url="https://raw.githubusercontent.com/$author/$repo/$branch/helpers/$file" + local file + local sum + local full_path for i in "${!sums[@]}"; do file="$i" sum="${sums[$i]}" full_path="$helpers_path/$file" + url="https://raw.githubusercontent.com/$author/$repo/$branch/helpers/$file" if [[ -f "$full_path" ]] && [[ $(get_hash "$full_path") == $sum ]]; then logger INFO "'$file' is current" else @@ -548,9 +551,9 @@ fetch_helpers_by_sum(){ if [[ ! $? -eq 0 ]]; then raise_error_and_quit "Failed to fetch the file '$file'. Possible timeout?" fi + logger INFO "Updated '$full_path' to sum '$sum'" fi [[ $file == "funcs" ]] && chmod +x "$full_path" - logger INFO "Updated '$full_path' to sum '$sum'" done return 0 } diff --git a/helpers/funcs b/helpers/funcs index bc564d5..9313b09 100644 --- a/helpers/funcs +++ b/helpers/funcs @@ -739,7 +739,8 @@ toggle(){ branch="stable" fi update_config - download_new_version + return 255 +# download_new_version ;; Toggle[[:space:]]mod[[:space:]]install[[:space:]]mode) if [[ -z $auto_install ]]; then @@ -764,6 +765,7 @@ toggle(){ fi esac update_config + return 90 } add_to_favs(){ @@ -771,6 +773,7 @@ add_to_favs(){ ip_list+=("$record") update_config logger INFO "Added the record $record to saved servers" + return 90 } remove_from_history(){ shift @@ -799,6 +802,7 @@ remove_from_favs(){ local cache="$(< "$_cache_my_servers")" <<< "$cache" grep -v -P "$r$" > $_cache_my_servers logger INFO "Removed the record $record from saved servers" + return 90 } update_favs_from_table(){ local context="$1" @@ -815,12 +819,6 @@ update_config(){ [[ -z $branch ]] && branch="stable" mv $config_file ${config_file}.old write_config > $config_file - if [[ $? -eq 0 ]]; then - printf "Updated config file" - return 90 - else - return 1 - fi logger INFO "Updated config file at '$config_file'" } validate_ip(){ @@ -874,6 +872,7 @@ update_config_val(){ declare -n nr=$key nr="$value" update_config + return 90 } show_log(){ < "$debug_log" sed 's/Keyword␞/Keyword/' From ee1803c73cf27ca8176d9bb2d3ebcf54a67fce00 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:11:32 +0900 Subject: [PATCH 010/122] fix: control flow --- dzgui.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index a8ce9a8..c8bf364 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -442,7 +442,8 @@ migrate_files(){ cp $config_file $config_path/dztuirc.oldapi fi logger INFO "Migrated old API file" - [[ -f $hist_file ]] && rm $hist_file + [[ ! -f $hist_file ]] && return + rm $hist_file logger INFO "Wiped old history file" } stale_symlinks(){ From e5bc3abbd59a18d1f5e3dbf467be2c20d8036f2a Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:13:42 +0900 Subject: [PATCH 011/122] chore: update sums --- dzgui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index c8bf364..4bb1509 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -530,7 +530,7 @@ fetch_helpers_by_sum(){ ["ui.py"]="8c430f1465995cbd98f4ad8e2580a79d" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="3aae486ae5097fa9b7349df1dfd25734" + ["funcs"]="7cab1604d9a614bdbb324db756c68fd9" ) local author="aclist" local repo="dztui" From 0fd5cfdc8b397cce6617ff4a8fd088f649a65527 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:15:19 +0900 Subject: [PATCH 012/122] fix: download new version --- dzgui.sh | 2 +- helpers/funcs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 helpers/funcs diff --git a/dzgui.sh b/dzgui.sh index 4bb1509..bb591b4 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -530,7 +530,7 @@ fetch_helpers_by_sum(){ ["ui.py"]="8c430f1465995cbd98f4ad8e2580a79d" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="7cab1604d9a614bdbb324db756c68fd9" + ["funcs"]="2a308d08349c1cdd2dfff3830d49cd18" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs old mode 100644 new mode 100755 index 9313b09..8c4ec6e --- a/helpers/funcs +++ b/helpers/funcs @@ -739,8 +739,8 @@ toggle(){ branch="stable" fi update_config + download_new_version return 255 -# download_new_version ;; Toggle[[:space:]]mod[[:space:]]install[[:space:]]mode) if [[ -z $auto_install ]]; then From 38e199872133cc20bda71677b81b806df94a9374 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:26:33 +0900 Subject: [PATCH 013/122] fix: control flow --- dzgui.sh | 2 +- helpers/funcs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index bb591b4..e738445 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -530,7 +530,7 @@ fetch_helpers_by_sum(){ ["ui.py"]="8c430f1465995cbd98f4ad8e2580a79d" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="2a308d08349c1cdd2dfff3830d49cd18" + ["funcs"]="c6a6ae4d004245e34982078ec006ef3a" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 8c4ec6e..f528c88 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -706,6 +706,7 @@ download_new_version(){ curl -Ls "$version_url" > "$src_path" rc=$? if [[ $rc -eq 0 ]]; then + dl_changelog logger INFO "Wrote new version to $src_path" chmod +x "$src_path" touch "${config_path}.unmerged" @@ -718,7 +719,6 @@ download_new_version(){ logger WARN "curl failed to fetch new version. Rolling back" return 1 fi - dl_changelog } dl_changelog(){ local mdbranch From dc4e418540f7d557674214ee529e551c192dab23 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:32:16 +0900 Subject: [PATCH 014/122] fix: error handling --- dzgui.sh | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index e738445..477a72a 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -2,7 +2,6 @@ set -o pipefail version="4.2.0.rc-1" -src_path=$(realpath "$0") #CONSTANTS aid=221100 @@ -729,8 +728,9 @@ create_config(){ done } varcheck(){ + 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. Restart first-time setup now?" if [[ ! -f $config_file ]]; then - local msg="Config file '$config_file' missing. Start first-time setup now?" qdialog "$msg" "Yes" "Exit" if [[ $? -eq 1 ]]; then logger CRITICAL "Config file missing, but user aborted setup" @@ -742,9 +742,9 @@ varcheck(){ local workshop_dir="$steam_path/steamapps/workshop/content/$aid" local game_dir="$steam_path/steamapps/common/DayZ" if [[ ! -d $steam_path ]] || [[ ! -d $game_dir ]]; then - logger WARN "DayZ path resolved to $game_dir" - logger WARN "Workshop path resolved to $workshop_dir" - pdialog "$msg" + logger WARN "DayZ path resolved to '$game_dir'" + logger WARN "Workshop path resolved to '$workshop_dir'" + qdialog "$msg2" "Yes" "Exit" if [[ $? -eq 1 ]]; then logger CRITICAL "Malformed Steam path, but user aborted setup" exit 1 @@ -752,6 +752,10 @@ varcheck(){ create_config return 0 fi + if [[ $src_path != $(realpath "$0") ]]; then + src_path=$(realpath "$0") + update_config + fi } is_dzg_downloading(){ if [[ -d $steam_path ]] && [[ -d $steam_path/downloading/$aid ]]; then From 66d7d16c36252c685fbcb2bcc629ed11e6c9af5f Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:50:00 +0900 Subject: [PATCH 015/122] fix: download toggle --- dzgui.sh | 2 +- helpers/funcs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 477a72a..d35b359 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -529,7 +529,7 @@ fetch_helpers_by_sum(){ ["ui.py"]="8c430f1465995cbd98f4ad8e2580a79d" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="c6a6ae4d004245e34982078ec006ef3a" + ["funcs"]="bacc774e52229ed6848829d06f96376e" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index f528c88..03f3644 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -702,8 +702,8 @@ format_version_url(){ } download_new_version(){ local version_url="$(format_version_url)" - mv "$src_path" "$src_path.old" - curl -Ls "$version_url" > "$src_path" + curl -L "$version_url" > /tmp/dzg.new + mv /tmp/dzg.new "$src_path" rc=$? if [[ $rc -eq 0 ]]; then dl_changelog From b8fbe36c4e9fdda0a9853dc6644905022c158962 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:56:53 +0900 Subject: [PATCH 016/122] fix: curl failing --- dzgui.sh | 2 +- helpers/funcs | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index d35b359..60b3c01 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -529,7 +529,7 @@ fetch_helpers_by_sum(){ ["ui.py"]="8c430f1465995cbd98f4ad8e2580a79d" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="bacc774e52229ed6848829d06f96376e" + ["funcs"]="d2537e9b7916453fbfe55592d92e683f" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 03f3644..1842423 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -689,7 +689,6 @@ src_path="$src_path" END } format_version_url(){ - echo FORMAT case "$branch" in "stable") version_url="$stable_url/dzgui.sh" @@ -702,8 +701,8 @@ format_version_url(){ } download_new_version(){ local version_url="$(format_version_url)" - curl -L "$version_url" > /tmp/dzg.new - mv /tmp/dzg.new "$src_path" + mv "$src_path" "$src_path.old" + curl -Ls "$version_url" > "$src_path" rc=$? if [[ $rc -eq 0 ]]; then dl_changelog From 71fd37feb67525e609eb12517fba6c5b73455371 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 16:00:05 +0900 Subject: [PATCH 017/122] chore: comments --- dzgui.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index 60b3c01..3972630 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -315,11 +315,13 @@ check_version(){ fi } download_new_version(){ + # function differs slightly in helper file due to return codes local version_url="$(format_version_url)" mv "$src_path" "$src_path.old" curl -Ls "$version_url" > "$src_path" rc=$? if [[ $rc -eq 0 ]]; then + dl_changelog logger INFO "Wrote new version to $src_path" chmod +x "$src_path" touch "${config_path}.unmerged" @@ -332,7 +334,6 @@ download_new_version(){ fdialog "Failed to download the new version. Restoring old version" return 1 fi - dl_changelog } prompt_dl(){ _text(){ From c8e61e19c1c3b7c0cbf1f4e568de170b71b9f462 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 16:08:00 +0900 Subject: [PATCH 018/122] chore: update pdialog --- dzgui.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 3972630..857c3c8 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -315,7 +315,6 @@ check_version(){ fi } download_new_version(){ - # function differs slightly in helper file due to return codes local version_url="$(format_version_url)" mv "$src_path" "$src_path.old" curl -Ls "$version_url" > "$src_path" @@ -407,7 +406,7 @@ qdialog(){ $steamsafe_zenity --question --text="$1" --ok-label="$ok" --cancel-label="$cancel" "${zenity_flags[@]}" } pdialog(){ - $steamsafe_zenity --progress --pulsate --auto-close "${zenity_flags[@]}" + $steamsafe_zenity --progress --pulsate --auto-close "${zenity_flags[@]}" --text="$1" } fdialog(){ $steamsafe_zenity --warning --ok-label="Exit" --text="$1" "${zenity_flags[@]}" @@ -789,7 +788,7 @@ initial_setup(){ steam_deps migrate_files stale_symlinks - fetch_helpers + fetch_helpers > >(pdialog "Fetching additional helper files") local_latlon is_steam_running is_dzg_downloading From cb0f223c597a8aa21ed195d10d53032669bf5f87 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 17:04:12 +0900 Subject: [PATCH 019/122] chore: bump version --- dzgui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index 857c3c8..248d69b 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version="4.2.0.rc-1" +version="5.0.0" #CONSTANTS aid=221100 From d2cad55abcea176912fb118bcd0f880167c32ab6 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 17:31:45 +0900 Subject: [PATCH 020/122] chore: normalize version --- dzgui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index 248d69b..a616def 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version="5.0.0" +version="5.0.0.rc-1" #CONSTANTS aid=221100 From 43087b44d4e521d5f3e1a208d1a3e21a8c0f35c6 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 12 Jan 2024 18:09:40 +0900 Subject: [PATCH 021/122] fix: remove quotes on version --- dzgui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index a616def..0bb3ef9 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version="5.0.0.rc-1" +version=5.0.0.rc-1 #CONSTANTS aid=221100 From d214d40ad5112b23bfc3ba523e6839bd1b5ee694 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 04:58:18 +0900 Subject: [PATCH 022/122] fix: handle floats --- helpers/funcs | 2 +- helpers/ui.py | 80 ++++++++++++++++++++++++++++++++------------------- 2 files changed, 52 insertions(+), 30 deletions(-) diff --git a/helpers/funcs b/helpers/funcs index 1842423..e736bb1 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -291,7 +291,7 @@ list_mods(){ name=$(awk -F\" '/name/ {print $2}' "${dir}/meta.cpp") base_dir=$(basename $(readlink -f $game_dir/$symlink)) size=$(du -s "$(readlink -f "$game_dir/$symlink")" | awk '{print $1}') - size=$(echo "scale=4; ($size / 1024) + .005" | bc) + size=$(python3 -c "n=($size/1024) +.005; print(round(n,4))") printf "%s$sep%s$sep%s$sep%3.3f\n" "$name" "$symlink" "$base_dir" "$size" done | sort -k1 fi diff --git a/helpers/ui.py b/helpers/ui.py index ebc044d..48883ee 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -118,9 +118,9 @@ filters = { "Night": True, "Empty": False, "Full": False, - "Low population": True, + "Low pop": True, "Non-ASCII": False, - "Duplicate names": False + "Duplicate": False } side_buttons = [ "Connect", @@ -441,6 +441,7 @@ class OuterWindow(Gtk.Window): self.connect("delete-event", self.halt_proc_and_quit) # Deprecated in GTK 4.0 self.set_border_width(10) + self.set_type_hint(Gdk.WindowTypeHint.DIALOG) """ app > win > grid > scrollable > treeview [row/server/mod store] @@ -462,31 +463,39 @@ class OuterWindow(Gtk.Window): class ScrollableTree(Gtk.ScrolledWindow): - def __init__(self): + def __init__(self, is_steam_deck): super().__init__() + #self.set_propagate_natural_height(False) self.set_vexpand(False) - self.treeview = TreeView() + self.treeview = TreeView(is_steam_deck) self.add(self.treeview) class RightPanel(Gtk.Box): - def __init__(self): + def __init__(self, is_steam_deck): super().__init__(spacing=6) self.set_orientation(Gtk.Orientation.VERTICAL) - self.button_vbox = ButtonBox() + self.button_vbox = ButtonBox(is_steam_deck) self.filters_vbox = FilterPanel() toggle_signal(self.filters_vbox, self.filters_vbox.maps_combo, '_on_map_changed', False) self.pack_start(self.button_vbox, False, False, 0) self.pack_start(self.filters_vbox, False, False, 0) - self.question_label = Gtk.Label(label="Type ? for keybindings") - self.question_label.set_ellipsize(Pango.EllipsizeMode.END) - self.question_label.set_margin_top(100) - self.question_label.set_margin_start(10) - self.pack_start(self.question_label, False, True, 0) + self.question_button = Gtk.Button(label="?") + #TODO: too big on top + self.question_button.set_margin_top(10) + self.question_button.set_margin_start(50) + self.question_button.set_margin_end(50) +# set_surrounding_margins(self.question_label, 50) + self.pack_start(self.question_button, False, True, 0) + self.question_button.connect("clicked", self._on_button_clicked) + + def _on_button_clicked(self, button): + grid = self.get_parent() + grid.scrollable_treelist.treeview.spawn_keys_dialog(button) def set_filter_visibility(self, bool): self.filters_vbox.set_visible(bool) @@ -499,7 +508,7 @@ class RightPanel(Gtk.Box): class ButtonBox(Gtk.Box): - def __init__(self): + def __init__(self, is_steam_deck): super().__init__(spacing=6) self.set_orientation(Gtk.Orientation.VERTICAL) set_surrounding_margins(self, 10) @@ -507,7 +516,7 @@ class ButtonBox(Gtk.Box): self.buttons = list() for side_button in side_buttons: button = Gtk.Button(label=side_button) - button.set_size_request(100, 100) + button.set_size_request(50, 50) button.set_opacity(0.6) self.buttons.append(button) button.connect("clicked", self._on_selection_button_clicked) @@ -556,7 +565,7 @@ class ButtonBox(Gtk.Box): if context == "Exit": logger.info("Normal user exit") - sys.exit(1) + Gtk.main_quit() cols = treeview.get_columns() if len(cols) > 1: @@ -609,7 +618,7 @@ class CalcDist(multiprocessing.Process): class TreeView(Gtk.TreeView): __gsignals__ = {"on_distcalc_started": (GObject.SignalFlags.RUN_FIRST, None, ())} - def __init__(self): + def __init__(self, is_steam_deck): super().__init__() self.queue = multiprocessing.Queue() @@ -631,7 +640,8 @@ class TreeView(Gtk.TreeView): column = Gtk.TreeViewColumn(column_title, renderer, text=i) self.append_column(column) # TODO: change font size on the fly - # renderer.set_property("size-points", 20) + if is_steam_deck is True: + renderer.set_property("size-points", 20) self.connect("row-activated", self._on_row_activated) self.connect("key-press-event", self._on_keypress) @@ -788,6 +798,12 @@ class TreeView(Gtk.TreeView): tooltip = format_metadata(row_sel) grid.update_statusbar(tooltip) + def spawn_keys_dialog(self, widget): + diag = KeysDialog(self.get_outer_window(), '', "Keybindings") + diag.run() + diag.destroy() + self.grab_focus() + def _on_keypress_main_menu(self, treeview, event): window = self.get_outer_window() grid = self.get_outer_grid() @@ -796,9 +812,7 @@ class TreeView(Gtk.TreeView): grid.right_panel.focus_button_box() case Gdk.KEY_question: if event.state is Gdk.ModifierType.SHIFT_MASK: - diag = KeysDialog(window, '', "Keybindings") - diag.run() - diag.destroy() + self.spawn_keys_dialog(None) case Gdk.KEY_f: if event.state is Gdk.ModifierType.CONTROL_MASK: return True @@ -902,11 +916,11 @@ class TreeView(Gtk.TreeView): renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer, text=i) column.set_sort_column_id(i) - """Prevent columns from auto-adjusting""" + #"""Prevent columns from auto-adjusting""" if ("Name" in column_title): column.set_fixed_width(800) - if (column_title == "Map"): - column.set_fixed_width(300) + #if (column_title == "Map"): + # column.set_fixed_width(300) self.append_column(column) self.update_first_col(mode) @@ -962,8 +976,8 @@ class TreeView(Gtk.TreeView): if i == 3: column.set_cell_data_func(renderer, self._format_float, func_data=None) column.set_sort_column_id(i) - if (column_title == "Name"): - column.set_fixed_width(600) + #if (column_title == "Name"): + # column.set_fixed_width(600) self.append_column(column) if mode == "List installed mods": @@ -1380,17 +1394,24 @@ class Grid(Gtk.Grid): self.set_column_homogeneous(True) #self.set_row_homogeneous(True) - self.scrollable_treelist = ScrollableTree() - self.scrollable_treelist.set_vexpand(True) - self.right_panel = RightPanel() - _news = sys.argv[2] + _isd = sys.argv[3] self._version = "%s %s" %(app_name, sys.argv[3]) + if _isd == 1: + is_steam_deck = True + else: + is_steam_deck = False + if _news != "null": self.news = NewsHeader(_news) self.attach(self.news, 0, -1, 8, 10) + self.scrollable_treelist = ScrollableTree(is_steam_deck) + self.scrollable_treelist.set_vexpand(True) + self.right_panel = RightPanel(is_steam_deck) + + self.bar = Gtk.Statusbar() self.scrollable_treelist.treeview.connect("on_distcalc_started", self._on_calclat_started) @@ -1464,7 +1485,8 @@ class App(Gtk.Application): # TODO: steam deck # self.win.set_size_request(1280,800) - self.win.fullscreen() + #self.win.fullscreen() + self.win.set_keep_below(True) accel = Gtk.AccelGroup() accel.connect(Gdk.KEY_q, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE, self._halt_window_subprocess) From 6f9aaa252b18db67a3f6bf18d39fa56051287d61 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 04:59:26 +0900 Subject: [PATCH 023/122] fix: toggle news --- dzgui.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 0bb3ef9..fa1dac3 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -803,8 +803,8 @@ main(){ local news=$(check_news) printf "All OK. Kicking off UI...\n" - [[ -n $news ]] && python3 "$ui_helper" "--init-ui" "$news" "$version" - [[ -z $news ]] && python3 "$ui_helper" "--init-ui" "null" "$version" + [[ -z $news ]] && news="null" + python3 "$ui_helper" "--init-ui" "$news" "$version" "$is_steam_deck" } main #TODO: tech debt: cruddy handling for steam forking From d93c06c5dac446a54c04e1fcc0a0849a11357f73 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 05:22:51 +0900 Subject: [PATCH 024/122] fix: workshop page on own thread --- helpers/ui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/ui.py b/helpers/ui.py index 48883ee..6f9ff8a 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -1344,7 +1344,7 @@ class ModDialog(GenericDialog): path = pathlist[0] tree_iter = model.get_iter(path) mod_id = model.get_value(tree_iter, 1) - call_out(treeview, "open_workshop_page", mod_id) + subprocess.Popen(['/usr/bin/env', 'bash', funcs, "open_workshop_page", mod_id]) class EntryDialog(GenericDialog): def __init__(self, parent, text, mode, link): From e062d6cb60d4a07eee0d6e54742f503bc1c7b442 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 05:23:41 +0900 Subject: [PATCH 025/122] chore: bump version --- dzgui.sh | 2 +- helpers/funcs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index fa1dac3..e55346d 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-1 +version=5.0.0.rc-2 #CONSTANTS aid=221100 diff --git a/helpers/funcs b/helpers/funcs index e736bb1..8ae9a4e 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version="5.0.0.rc-1" +version="5.0.0.rc-2" #CONSTANTS aid=221100 From 810f4dbdc6ef28da8cf8cf34d69cd1978918a4cc Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 05:32:39 +0900 Subject: [PATCH 026/122] chore: update sums --- dzgui.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index e55346d..1029472 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -526,10 +526,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="8c430f1465995cbd98f4ad8e2580a79d" + ["ui.py"]="6870f75ff74a8ad65d82650499d739de" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="d2537e9b7916453fbfe55592d92e683f" + ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" ) local author="aclist" local repo="dztui" From 9847c95617f3ef8b3db565ba140cb880a295673a Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 05:44:21 +0900 Subject: [PATCH 027/122] fix: steam deck ui --- dzgui.sh | 6 ++++-- helpers/ui.py | 11 ++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 1029472..bb028ba 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-2 +version=5.0.0.rc-3 #CONSTANTS aid=221100 @@ -316,8 +316,10 @@ check_version(){ } download_new_version(){ local version_url="$(format_version_url)" + logger INFO "Version URL is '$version_url'" + logger INFO "$src_path" mv "$src_path" "$src_path.old" - curl -Ls "$version_url" > "$src_path" + curl -L "$version_url" > "$src_path" 2>$debug_log rc=$? if [[ $rc -eq 0 ]]; then dl_changelog diff --git a/helpers/ui.py b/helpers/ui.py index 6f9ff8a..26c9002 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -516,7 +516,10 @@ class ButtonBox(Gtk.Box): self.buttons = list() for side_button in side_buttons: button = Gtk.Button(label=side_button) - button.set_size_request(50, 50) + if is_steam_deck is True: + button.set_size_request(10, 10) + else + button.set_size_request(50,50) button.set_opacity(0.6) self.buttons.append(button) button.connect("clicked", self._on_selection_button_clicked) @@ -1483,10 +1486,8 @@ class App(Gtk.Application): self.win = OuterWindow() - # TODO: steam deck - # self.win.set_size_request(1280,800) - #self.win.fullscreen() - self.win.set_keep_below(True) + self.win.fullscreen() + #self.win.set_keep_below(True) accel = Gtk.AccelGroup() accel.connect(Gdk.KEY_q, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE, self._halt_window_subprocess) From 00aae2ce84c5606cb215e2fbb03b02173a4d4b69 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 05:53:54 +0900 Subject: [PATCH 028/122] chore: update sums --- dzgui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index bb028ba..b9a0445 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -528,7 +528,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="6870f75ff74a8ad65d82650499d739de" + ["ui.py"]="bc75587cad618090b370c2fe851f8893" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" From f3dcd058cd3b792336cad98f3e2c2b59eb0ff228 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 06:01:46 +0900 Subject: [PATCH 029/122] fix: else statement --- helpers/ui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/ui.py b/helpers/ui.py index 26c9002..ee7918d 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -518,7 +518,7 @@ class ButtonBox(Gtk.Box): button = Gtk.Button(label=side_button) if is_steam_deck is True: button.set_size_request(10, 10) - else + else: button.set_size_request(50,50) button.set_opacity(0.6) self.buttons.append(button) From ecc790123a0036c1aa77255c4875710cd72f2585 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 06:04:08 +0900 Subject: [PATCH 030/122] chore: bump sums --- dzgui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index b9a0445..e52c00e 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -528,7 +528,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="bc75587cad618090b370c2fe851f8893" + ["ui.py"]="840a96d695f1937c33f6e0da38c66164" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" From 42512e97a9528646b41f82e67d0163c0616801fb Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 06:16:40 +0900 Subject: [PATCH 031/122] fix: shift sys args --- dzgui.sh | 2 +- helpers/ui.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index e52c00e..b68598c 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -528,7 +528,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="840a96d695f1937c33f6e0da38c66164" + ["ui.py"]="f705b5e0eec2352aea99764b00bb8656" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" diff --git a/helpers/ui.py b/helpers/ui.py index ee7918d..d4275f1 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -1398,8 +1398,8 @@ class Grid(Gtk.Grid): #self.set_row_homogeneous(True) _news = sys.argv[2] - _isd = sys.argv[3] self._version = "%s %s" %(app_name, sys.argv[3]) + _isd = sys.argv[4] if _isd == 1: is_steam_deck = True From e05bf493959114c31d9d7830592e7e047baee339 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 06:18:59 +0900 Subject: [PATCH 032/122] chore: bump version --- dzgui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index b68598c..071f6ec 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-3 +version=5.0.0.rc-4 #CONSTANTS aid=221100 From 2a24bbfe6b22054f4054b715eeea32f2029db223 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 06:34:24 +0900 Subject: [PATCH 033/122] fix: type coercion --- dzgui.sh | 4 ++-- helpers/ui.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 071f6ec..3abf8cb 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-4 +version=5.0.0.rc-5 #CONSTANTS aid=221100 @@ -528,7 +528,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="f705b5e0eec2352aea99764b00bb8656" + ["ui.py"]="9cef55ccaa1c71b7e3ef648fe68d0eec" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" diff --git a/helpers/ui.py b/helpers/ui.py index d4275f1..f79c4a1 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -1399,7 +1399,7 @@ class Grid(Gtk.Grid): _news = sys.argv[2] self._version = "%s %s" %(app_name, sys.argv[3]) - _isd = sys.argv[4] + _isd = int(sys.argv[4]) if _isd == 1: is_steam_deck = True From 00452cca5f0762916bfa9e6aaaf6b596ad8f4614 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 06:39:22 +0900 Subject: [PATCH 034/122] chore: focus in signals --- dzgui.sh | 4 ++-- helpers/ui.py | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 3abf8cb..0a17188 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-5 +version=5.0.0.rc-6 #CONSTANTS aid=221100 @@ -528,7 +528,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="9cef55ccaa1c71b7e3ef648fe68d0eec" + ["ui.py"]="a6d80a2cfff27e7c02e16499a0983f8e" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" diff --git a/helpers/ui.py b/helpers/ui.py index f79c4a1..eaefb8f 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -1487,7 +1487,6 @@ class App(Gtk.Application): self.win = OuterWindow() self.win.fullscreen() - #self.win.set_keep_below(True) accel = Gtk.AccelGroup() accel.connect(Gdk.KEY_q, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE, self._halt_window_subprocess) @@ -1525,6 +1524,8 @@ class FilterPanel(Gtk.Box): self.keyword_entry.set_placeholder_text("Filter by keyword") self.keyword_entry.connect("activate", self._on_keyword_enter) self.keyword_entry.connect("key-press-event", self._on_esc_pressed) + self.keyword_entry.connect("focus-in-event", self._on_keyword_focused) + self.keyword_entry.connect("focus-out-event", self._on_keyword_unfocused) renderer_text = Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END) self.maps_combo = Gtk.ComboBox.new_with_model(map_store) @@ -1546,6 +1547,16 @@ class FilterPanel(Gtk.Box): self.pack_start(self.debug_toggle, False, False, 0) + def _on_keyword_unfocused(self, widget): + print("user unfocused keyword field") + win = self.get_outer_window() + win.set_keep_below(False) + + def _on_keyword_focused(self, widget): + print("user focused keyword field") + win = self.get_outer_window() + win.set_keep_below(True) + def _on_button_toggled(self, button, command): transient_parent = self.get_outer_window() grid = self.get_outer_grid() @@ -1577,6 +1588,8 @@ class FilterPanel(Gtk.Box): return outer_window def _on_keyword_enter(self, keyword_entry): + win = self.get_outer_window() + win.set_keep_below(False) keyword = keyword_entry.get_text() old_keyword = keyword_filter[0].split(delimiter)[1] if keyword == old_keyword: From 406663cd7abd97ce280878cc0ee804fee407880b Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 06:50:34 +0900 Subject: [PATCH 035/122] chore: focus in signals --- dzgui.sh | 6 +++--- helpers/funcs | 2 +- helpers/ui.py | 25 +++++++++++++------------ 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 0a17188..a7db1c9 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-6 +version=5.0.0.rc-7 #CONSTANTS aid=221100 @@ -528,7 +528,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="a6d80a2cfff27e7c02e16499a0983f8e" + ["ui.py"]="a4adb00c54d71ad9268cf3cbf8df0a1e" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" @@ -790,7 +790,7 @@ initial_setup(){ steam_deps migrate_files stale_symlinks - fetch_helpers > >(pdialog "Fetching additional helper files") +# fetch_helpers > >(pdialog "Fetching additional helper files") local_latlon is_steam_running is_dzg_downloading diff --git a/helpers/funcs b/helpers/funcs index 8ae9a4e..b8f44ef 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version="5.0.0.rc-2" +version="5.0.0.rc-7" #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index eaefb8f..b4cb48f 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.1 +# 5.0.0-rc.7 app_name = "DZGUI" cache = {} @@ -434,7 +434,7 @@ def reinit_checks(): class OuterWindow(Gtk.Window): - def __init__(self): + def __init__(self, is_steam_deck): super().__init__() self.connect("destroy", self.halt_proc_and_quit) @@ -447,7 +447,7 @@ class OuterWindow(Gtk.Window): app > win > grid > scrollable > treeview [row/server/mod store] app > win > grid > vbox > buttonbox > filterpanel > combo [map store] """ - self.grid = Grid() + self.grid = Grid(is_steam_deck) self.add(self.grid) self.hb = AppHeaderBar() self.set_titlebar(self.hb) @@ -1391,7 +1391,7 @@ class EntryDialog(GenericDialog): class Grid(Gtk.Grid): - def __init__(self): + def __init__(self, is_steam_deck): super().__init__() Gtk.Grid() self.set_column_homogeneous(True) @@ -1399,12 +1399,6 @@ class Grid(Gtk.Grid): _news = sys.argv[2] self._version = "%s %s" %(app_name, sys.argv[3]) - _isd = int(sys.argv[4]) - - if _isd == 1: - is_steam_deck = True - else: - is_steam_deck = False if _news != "null": self.news = NewsHeader(_news) @@ -1484,9 +1478,16 @@ def toggle_signal(owner, widget, func_name, bool): class App(Gtk.Application): def __init__(self): - self.win = OuterWindow() + _isd = sys.argv[4] + if _isd == 1: + is_steam_deck = True + else: + is_steam_deck = False - self.win.fullscreen() + self.win = OuterWindow(is_steam_deck) + + if is_steam_deck == 1: + self.win.fullscreen() accel = Gtk.AccelGroup() accel.connect(Gdk.KEY_q, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE, self._halt_window_subprocess) From c6a654d25a21b63c5518d83d13e2d2b26495d39d Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 07:07:45 +0900 Subject: [PATCH 036/122] chore: update keybindings dialog --- dzgui.sh | 4 ++-- helpers/funcs | 2 +- helpers/ui.py | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index a7db1c9..7786144 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-7 +version=5.0.0.rc-8 #CONSTANTS aid=221100 @@ -528,7 +528,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="a4adb00c54d71ad9268cf3cbf8df0a1e" + ["ui.py"]="309e9f77f7820d4387f148a2b6898bc4" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" diff --git a/helpers/funcs b/helpers/funcs index b8f44ef..3cf2a2d 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version="5.0.0.rc-7" +version=5.0.0.rc-8 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index b4cb48f..f76cd42 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.7 +# 5.0.0-rc.8 app_name = "DZGUI" cache = {} @@ -1262,6 +1262,7 @@ def KeysDialog(parent, text, mode): Ctrl-q: quit Enter/Space/Double click: select row item Up, Down: navigate through row items + ?: open this dialog Button navigation Right: jump from main view to side buttons From cadcae9b9d1770bf45a25e16670828057055a1f0 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 07:15:17 +0900 Subject: [PATCH 037/122] fix: stray output in stdout --- dzgui.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 7786144..54d2a88 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-8 +version=5.0.0.rc-9 #CONSTANTS aid=221100 @@ -232,7 +232,6 @@ watcher_deps(){ logger INFO "Found DZG Watcher dependencies" } format_version_url(){ - echo FORMAT case "$branch" in "stable") version_url="$stable_url/dzgui.sh" From 1e17b9b9a3ac39aae828768503d419bc9ec519e1 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 07:25:36 +0900 Subject: [PATCH 038/122] fix: type coercion --- dzgui.sh | 6 +++--- helpers/funcs | 2 +- helpers/ui.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 54d2a88..8c72c02 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-9 +version=5.0.0.rc-10 #CONSTANTS aid=221100 @@ -527,7 +527,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="309e9f77f7820d4387f148a2b6898bc4" + ["ui.py"]="bafc59a53216c12e3d3b605512cbe900" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" @@ -789,7 +789,7 @@ initial_setup(){ steam_deps migrate_files stale_symlinks -# fetch_helpers > >(pdialog "Fetching additional helper files") + fetch_helpers > >(pdialog "Fetching additional helper files") local_latlon is_steam_running is_dzg_downloading diff --git a/helpers/funcs b/helpers/funcs index 3cf2a2d..c9a8bde 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-8 +version=5.0.0.rc-10 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index f76cd42..9d8febf 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.8 +# 5.0.0-rc.10 app_name = "DZGUI" cache = {} @@ -1479,7 +1479,7 @@ def toggle_signal(owner, widget, func_name, bool): class App(Gtk.Application): def __init__(self): - _isd = sys.argv[4] + _isd = int(sys.argv[4]) if _isd == 1: is_steam_deck = True else: From e5c78f95ad8a4cb164138ae5129c8de85fd258c3 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 09:52:38 +0900 Subject: [PATCH 039/122] fix: grid allocation --- dzgui.sh | 4 ++-- helpers/funcs | 2 +- helpers/ui.py | 40 +++++++++++++++++++--------------------- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 8c72c02..e86e143 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-10 +version=5.0.0.rc-11 #CONSTANTS aid=221100 @@ -527,7 +527,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="bafc59a53216c12e3d3b605512cbe900" + ["ui.py"]="16db16b6fba95758e866ee955b573f01" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" diff --git a/helpers/funcs b/helpers/funcs index c9a8bde..1061b49 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-10 +version=5.0.0.rc-11 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 9d8febf..babcbd6 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.10 +# 5.0.0-rc.11 app_name = "DZGUI" cache = {} @@ -123,7 +123,7 @@ filters = { "Duplicate": False } side_buttons = [ - "Connect", + "Main menu", "Manage", "Options", "Help", @@ -584,7 +584,7 @@ class ButtonBox(Gtk.Box): match context: case 'Manage': self._populate(manage) - case 'Connect': self._populate(connect) + case 'Main menu': self._populate(connect) case 'Options': self._populate(options) case 'Help': self._populate(help) @@ -637,7 +637,7 @@ class TreeView(Gtk.TreeView): self.set_model(row_store) for i, column_title in enumerate( - ["Connect"] + ["Main menu"] ): renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer, text=i) @@ -1394,7 +1394,6 @@ class EntryDialog(GenericDialog): class Grid(Gtk.Grid): def __init__(self, is_steam_deck): super().__init__() - Gtk.Grid() self.set_column_homogeneous(True) #self.set_row_homogeneous(True) @@ -1406,7 +1405,13 @@ class Grid(Gtk.Grid): self.attach(self.news, 0, -1, 8, 10) self.scrollable_treelist = ScrollableTree(is_steam_deck) - self.scrollable_treelist.set_vexpand(True) + if is_steam_deck is True: + self.scrollable_treelist.set_hexpand(False) + self.scrollable_treelist.set_vexpand(False) + else: + self.scrollable_treelist.set_hexpand(True) + self.scrollable_treelist.set_vexpand(True) + self.right_panel = RightPanel(is_steam_deck) @@ -1420,9 +1425,14 @@ class Grid(Gtk.Grid): self.bar.add(self.status_right_label) self.update_right_statusbar() - self.attach(self.scrollable_treelist, 0, 0, 8, 10) - self.attach_next_to(self.bar, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 8, 1) - self.attach_next_to(self.right_panel, self.scrollable_treelist, Gtk.PositionType.RIGHT, 1, 1) + if is_steam_deck is True: + self.attach(self.scrollable_treelist, 0, 0, 5, 3) + self.attach_next_to(self.bar, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 5, 1) + self.attach_next_to(self.right_panel, self.scrollable_treelist, Gtk.PositionType.RIGHT, 3, 1) + else: + self.attach(self.scrollable_treelist, 0, 0, 7, 5) + self.attach_next_to(self.bar, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 7, 1) + self.attach_next_to(self.right_panel, self.scrollable_treelist, Gtk.PositionType.RIGHT, 1, 1) def update_right_statusbar(self): config_vals.clear() @@ -1526,8 +1536,6 @@ class FilterPanel(Gtk.Box): self.keyword_entry.set_placeholder_text("Filter by keyword") self.keyword_entry.connect("activate", self._on_keyword_enter) self.keyword_entry.connect("key-press-event", self._on_esc_pressed) - self.keyword_entry.connect("focus-in-event", self._on_keyword_focused) - self.keyword_entry.connect("focus-out-event", self._on_keyword_unfocused) renderer_text = Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END) self.maps_combo = Gtk.ComboBox.new_with_model(map_store) @@ -1549,16 +1557,6 @@ class FilterPanel(Gtk.Box): self.pack_start(self.debug_toggle, False, False, 0) - def _on_keyword_unfocused(self, widget): - print("user unfocused keyword field") - win = self.get_outer_window() - win.set_keep_below(False) - - def _on_keyword_focused(self, widget): - print("user focused keyword field") - win = self.get_outer_window() - win.set_keep_below(True) - def _on_button_toggled(self, button, command): transient_parent = self.get_outer_window() grid = self.get_outer_grid() From 0bc160c13f9e5804b116268b9b73da75d1ec1c84 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 09:54:17 +0900 Subject: [PATCH 040/122] fix: drop fullscreen --- dzgui.sh | 2 +- helpers/funcs | 2 +- helpers/ui.py | 5 +---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index e86e143..8c7bfe0 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -527,7 +527,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="16db16b6fba95758e866ee955b573f01" + ["ui.py"]="5b614859376857b3579dbc7fd1db783d" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" diff --git a/helpers/funcs b/helpers/funcs index 1061b49..6c50b81 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-11 +version=5.0.0.rc-12 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index babcbd6..000e8ac 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.11 +# 5.0.0-rc.12 app_name = "DZGUI" cache = {} @@ -1497,9 +1497,6 @@ class App(Gtk.Application): self.win = OuterWindow(is_steam_deck) - if is_steam_deck == 1: - self.win.fullscreen() - accel = Gtk.AccelGroup() accel.connect(Gdk.KEY_q, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE, self._halt_window_subprocess) self.win.add_accel_group(accel) From de3dec41a3b693254e9e77499c3f7ff1aadce8d2 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 10:47:02 +0900 Subject: [PATCH 041/122] fix; align grid elements --- dzgui.sh | 4 ++-- helpers/funcs | 2 +- helpers/ui.py | 19 ++++++++++++------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 8c7bfe0..fe3383a 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-11 +version=5.0.0.rc-13 #CONSTANTS aid=221100 @@ -527,7 +527,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="5b614859376857b3579dbc7fd1db783d" + ["ui.py"]="b3e8dca80ed61c1da896ac37bec70ca8" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" diff --git a/helpers/funcs b/helpers/funcs index 6c50b81..168a024 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-12 +version=5.0.0.rc-13 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 000e8ac..d166d6e 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.12 +# 5.0.0-rc.13 app_name = "DZGUI" cache = {} @@ -450,7 +450,12 @@ class OuterWindow(Gtk.Window): self.grid = Grid(is_steam_deck) self.add(self.grid) self.hb = AppHeaderBar() - self.set_titlebar(self.hb) + + if is_steam_deck is not 1: + self.set_titlebar(self.hb) + if is_steam_deck is 1: + self.maximize() + self.set_decorated(False) # Hide FilterPanel on main menu self.show_all() @@ -933,6 +938,7 @@ class TreeView(Gtk.TreeView): toggle_signal(self.get_outer_grid().right_panel.filters_vbox, check, '_on_check_toggle', True) toggle_signal(self, self, '_on_keypress', True) + self.get_parent().set_vexpand(False) wait_dialog = GenericDialog(transient_parent, "Fetching server metadata", "WAIT") wait_dialog.show_all() thread = threading.Thread(target=self._background, args=(wait_dialog, mode)) @@ -1297,7 +1303,6 @@ class ModDialog(GenericDialog): self.scrollable = Gtk.ScrolledWindow() self.view = Gtk.TreeView() - self.scrollable.set_vexpand(True) self.scrollable.add(self.view) set_surrounding_margins(self.scrollable, 20) @@ -1407,7 +1412,7 @@ class Grid(Gtk.Grid): self.scrollable_treelist = ScrollableTree(is_steam_deck) if is_steam_deck is True: self.scrollable_treelist.set_hexpand(False) - self.scrollable_treelist.set_vexpand(False) + self.scrollable_treelist.set_vexpand(True) else: self.scrollable_treelist.set_hexpand(True) self.scrollable_treelist.set_vexpand(True) @@ -1426,9 +1431,9 @@ class Grid(Gtk.Grid): self.update_right_statusbar() if is_steam_deck is True: - self.attach(self.scrollable_treelist, 0, 0, 5, 3) - self.attach_next_to(self.bar, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 5, 1) - self.attach_next_to(self.right_panel, self.scrollable_treelist, Gtk.PositionType.RIGHT, 3, 1) + self.attach(self.scrollable_treelist, 0, 0, 4, 1) + self.attach_next_to(self.bar, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 4, 1) + self.attach_next_to(self.right_panel, self.scrollable_treelist, Gtk.PositionType.RIGHT, 1, 1) else: self.attach(self.scrollable_treelist, 0, 0, 7, 5) self.attach_next_to(self.bar, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 7, 1) From 2dac511608fd1eea95c54e82f24d511c3251adb9 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 10:53:12 +0900 Subject: [PATCH 042/122] fix: else statement --- dzgui.sh | 4 ++-- helpers/funcs | 2 +- helpers/ui.py | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index fe3383a..d9fc71e 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-13 +version=5.0.0.rc-14 #CONSTANTS aid=221100 @@ -527,7 +527,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="b3e8dca80ed61c1da896ac37bec70ca8" + ["ui.py"]="af590bd7ac031409beb8fbc669398721" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" diff --git a/helpers/funcs b/helpers/funcs index 168a024..5869527 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-13 +version=5.0.0.rc-14 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index d166d6e..5659883 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.13 +# 5.0.0-rc.14 app_name = "DZGUI" cache = {} @@ -451,11 +451,11 @@ class OuterWindow(Gtk.Window): self.add(self.grid) self.hb = AppHeaderBar() - if is_steam_deck is not 1: - self.set_titlebar(self.hb) if is_steam_deck is 1: self.maximize() self.set_decorated(False) + else: + self.set_titlebar(self.hb) # Hide FilterPanel on main menu self.show_all() From c8fed9757539516d6693970d2042eb60ce4b304f Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 11:04:32 +0900 Subject: [PATCH 043/122] fix: conditional --- dzgui.sh | 4 ++-- helpers/funcs | 2 +- helpers/ui.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index d9fc71e..ea2503b 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-14 +version=5.0.0.rc-15 #CONSTANTS aid=221100 @@ -527,7 +527,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="af590bd7ac031409beb8fbc669398721" + ["ui.py"]="f4937dc60184eb7d53b9d14070820947" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" diff --git a/helpers/funcs b/helpers/funcs index 5869527..6fbce1f 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-14 +version=5.0.0.rc-15 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 5659883..3b637cc 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.14 +# 5.0.0-rc.15 app_name = "DZGUI" cache = {} @@ -451,7 +451,7 @@ class OuterWindow(Gtk.Window): self.add(self.grid) self.hb = AppHeaderBar() - if is_steam_deck is 1: + if is_steam_deck is True: self.maximize() self.set_decorated(False) else: From 0ca94a68d06fa31c1e796d287b30f53e5a2c8e4f Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 11:09:42 +0900 Subject: [PATCH 044/122] chore: test vexpand --- dzgui.sh | 4 ++-- helpers/funcs | 2 +- helpers/ui.py | 4 +--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index ea2503b..cd85428 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-15 +version=5.0.0.rc-16 #CONSTANTS aid=221100 @@ -527,7 +527,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="f4937dc60184eb7d53b9d14070820947" + ["ui.py"]="275629a53b5b7c28d897eb9902c23d19" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" diff --git a/helpers/funcs b/helpers/funcs index 6fbce1f..2618194 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-15 +version=5.0.0.rc-16 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 3b637cc..8001283 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.15 +# 5.0.0-rc.16 app_name = "DZGUI" cache = {} @@ -471,7 +471,6 @@ class ScrollableTree(Gtk.ScrolledWindow): def __init__(self, is_steam_deck): super().__init__() #self.set_propagate_natural_height(False) - self.set_vexpand(False) self.treeview = TreeView(is_steam_deck) self.add(self.treeview) @@ -938,7 +937,6 @@ class TreeView(Gtk.TreeView): toggle_signal(self.get_outer_grid().right_panel.filters_vbox, check, '_on_check_toggle', True) toggle_signal(self, self, '_on_keypress', True) - self.get_parent().set_vexpand(False) wait_dialog = GenericDialog(transient_parent, "Fetching server metadata", "WAIT") wait_dialog.show_all() thread = threading.Thread(target=self._background, args=(wait_dialog, mode)) From bb07cf3ac7f2e3f7d215c2dc65a98635b0ad735c Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 11:20:40 +0900 Subject: [PATCH 045/122] fix: changelog URL --- dzgui.sh | 4 ++-- helpers/funcs | 6 +++--- helpers/ui.py | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index cd85428..df3ecff 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-16 +version=5.0.0.rc-17 #CONSTANTS aid=221100 @@ -527,7 +527,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="275629a53b5b7c28d897eb9902c23d19" + ["ui.py"]="1c0c003c2dd9e5ed53c6bf193127d42d" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" diff --git a/helpers/funcs b/helpers/funcs index 2618194..9119ddf 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-16 +version=5.0.0.rc-17 #CONSTANTS aid=221100 @@ -723,7 +723,7 @@ dl_changelog(){ local mdbranch local file="CHANGELOG.md" [[ $branch == "stable" ]] && mdbranch="dzgui" - [[ $branch == "" ]] && mdbranch="testing" + [[ $branch == "testing" ]] && mdbranch="testing" local md="https://raw.githubusercontent.com/$author/$repo/${mdbranch}/$file" curl -Ls "$md" > "$state_path/$file" } @@ -1162,7 +1162,7 @@ manual_mod_install(){ if [[ -z $diff ]]; then launch "$ip" "$gameport" "$sanitized_mods" else - printf "Some mods may have failed to download. Try connecting again to resync" + printf "Some mods may have failed to download. Try connecting again to resync." exit 1 fi } diff --git a/helpers/ui.py b/helpers/ui.py index 8001283..9300e9e 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.16 +# 5.0.0-rc.17 app_name = "DZGUI" cache = {} @@ -489,13 +489,13 @@ class RightPanel(Gtk.Box): self.pack_start(self.filters_vbox, False, False, 0) self.question_button = Gtk.Button(label="?") - #TODO: too big on top self.question_button.set_margin_top(10) self.question_button.set_margin_start(50) self.question_button.set_margin_end(50) -# set_surrounding_margins(self.question_label, 50) - self.pack_start(self.question_button, False, True, 0) self.question_button.connect("clicked", self._on_button_clicked) + set_surrounding_margins(self.question_label, 50) + if is_steam_deck is False: + self.pack_start(self.question_button, False, True, 0) def _on_button_clicked(self, button): grid = self.get_parent() From 208e9ef7ad2ff56c3ee61f88fe9f882f6ca48a92 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 11:32:12 +0900 Subject: [PATCH 046/122] fix: strip SOH codes --- dzgui.sh | 4 ++-- helpers/funcs | 5 +++-- helpers/ui.py | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index df3ecff..8ac61dc 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-17 +version=5.0.0.rc-18 #CONSTANTS aid=221100 @@ -527,7 +527,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="1c0c003c2dd9e5ed53c6bf193127d42d" + ["ui.py"]="0cecc039d2026a65094f41587aeeea53" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" diff --git a/helpers/funcs b/helpers/funcs index 9119ddf..d0c2eaa 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-17 +version=5.0.0.rc-18 #CONSTANTS aid=221100 @@ -528,7 +528,8 @@ sanitize(){ } parse_server_json(){ local response="$1" - <<< "$response" jq -r ' + # some servers pad SOH in name + <<< "$response" sed 's/\\u0001//g' | jq -r ' .[]|"\(.name)␞" + "\(.map|if type == "string" then ascii_downcase else "null" end)␞" + "\(if .gametype == null then "null" else (.gametype|split(",")|if any(. == "no3rd") then "1PP" else "3PP" end) end)␞" + diff --git a/helpers/ui.py b/helpers/ui.py index 9300e9e..9e50ece 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.17 +# 5.0.0-rc.18 app_name = "DZGUI" cache = {} From af1bed9319b9b4c0127180a2991be0d8e69a7890 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 11:35:51 +0900 Subject: [PATCH 047/122] fix: element name --- dzgui.sh | 4 ++-- helpers/funcs | 2 +- helpers/ui.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 8ac61dc..bbffbd9 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-18 +version=5.0.0.rc-19 #CONSTANTS aid=221100 @@ -527,7 +527,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="0cecc039d2026a65094f41587aeeea53" + ["ui.py"]="67d9b617cf53213965bebfc91aae1e6e" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" diff --git a/helpers/funcs b/helpers/funcs index d0c2eaa..0ba98cc 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-18 +version=5.0.0.rc-19 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 9e50ece..36fb350 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.18 +# 5.0.0-rc.19 app_name = "DZGUI" cache = {} @@ -493,7 +493,7 @@ class RightPanel(Gtk.Box): self.question_button.set_margin_start(50) self.question_button.set_margin_end(50) self.question_button.connect("clicked", self._on_button_clicked) - set_surrounding_margins(self.question_label, 50) + set_surrounding_margins(self.question_button, 50) if is_steam_deck is False: self.pack_start(self.question_button, False, True, 0) From 87ba21a26a06f8e0c2980a6f28f6ad14fb3543f4 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 14:57:23 +0900 Subject: [PATCH 048/122] fix: restore URLs --- dzgui.sh | 6 +++--- helpers/funcs | 48 ++++++++++++++++++------------------------------ helpers/ui.py | 6 +----- 3 files changed, 22 insertions(+), 38 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index bbffbd9..40d2408 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-19 +version=5.0.0.rc-20 #CONSTANTS aid=221100 @@ -527,10 +527,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="67d9b617cf53213965bebfc91aae1e6e" + ["ui.py"]="62133c6c603584a283e86b4629c9c5aa" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="d9b0e6fa68314c18ac7aad565645948f" + ["funcs"]="8b5f43cb3647d96ffdcb8ce17822e104" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 0ba98cc..7c0eb8b 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-19 +version=5.0.0.rc-20 #CONSTANTS aid=221100 @@ -299,33 +299,6 @@ list_mods(){ installed_mods(){ ls -1 "$workshop_dir" } -open_url(){ - local context="$1" - local url - case "$context" in - "Help file ⧉") - url="$help_url" - ;; - "Report a bug ⧉") - url="$issues_url" - ;; - "Forum ⧉") - url="$forum_url" - ;; - "Sponsor ⧉") - url="$sponsor_url" - ;; - "Hall of fame ⧉") - url="${help_url}#_hall_of_fame" - ;; - esac - - if [[ -n "$BROWSER" ]]; then - "$BROWSER" "$url" 2>/dev/null - return - fi - xdg-open "$url" 2>/dev/null -} local_latlon(){ local url="http://ip-api.com/json/$local_ip" local local_ip @@ -897,10 +870,25 @@ open_link(){ "Open Battlemetrics API page") url="$battlemetrics_api_url" ;; + "Help file ⧉") + url="$help_url" + ;; + "Report a bug ⧉") + url="$issues_url" + ;; + "Forum ⧉") + url="$forum_url" + ;; + "Sponsor ⧉") + url="$sponsor_url" + ;; + "Hall of fame ⧉") + url="${help_url}#_hall_of_fame" + ;; esac -#if [[ $is_steam_deck -eq 1 ]]; then -#$steam_cmd steam://openurl/"$1" 2>/dev/null + #if [[ $is_steam_deck -eq 1 ]]; then + #$steam_cmd steam://openurl/"$1" 2>/dev/null if [[ -n "$BROWSER" ]]; then logger INFO "Opening '$url' in '$BROWSER'" "$BROWSER" "$url" diff --git a/helpers/ui.py b/helpers/ui.py index 36fb350..43073a0 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.19 +# 5.0.0-rc.20 app_name = "DZGUI" cache = {} @@ -493,7 +493,6 @@ class RightPanel(Gtk.Box): self.question_button.set_margin_start(50) self.question_button.set_margin_end(50) self.question_button.connect("clicked", self._on_button_clicked) - set_surrounding_margins(self.question_button, 50) if is_steam_deck is False: self.pack_start(self.question_button, False, True, 0) @@ -646,9 +645,6 @@ class TreeView(Gtk.TreeView): renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer, text=i) self.append_column(column) - # TODO: change font size on the fly - if is_steam_deck is True: - renderer.set_property("size-points", 20) self.connect("row-activated", self._on_row_activated) self.connect("key-press-event", self._on_keypress) From 03ab264e28d995d3c3bd5ec563429a30b961d2cf Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 15:14:09 +0900 Subject: [PATCH 049/122] feat: early connection test --- dzgui.sh | 13 ++++++++++--- helpers/funcs | 2 +- helpers/ui.py | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 40d2408..ea304ef 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-20 +version=5.0.0.rc-21 #CONSTANTS aid=221100 @@ -527,10 +527,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="62133c6c603584a283e86b4629c9c5aa" + ["ui.py"]="62731f2c617f11c057c43951283807b5" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="8b5f43cb3647d96ffdcb8ce17822e104" + ["funcs"]="73898be7185d77ccdc67ace906a7db2c" ) local author="aclist" local repo="dztui" @@ -772,6 +772,12 @@ is_steam_running(){ return 0 fi } +test_connection(){ + ping -c1 -4 github.com 1>/dev/null 2>&1 + if [[ ! $? -eq 0 ]]; then + raise_error_and_quit "DZGUI requires an active Internet connection, but no connection could be established. The remote may be down." + fi +} initial_setup(){ setup_dirs setup_state_files @@ -780,6 +786,7 @@ initial_setup(){ test_gobject watcher_deps check_architecture + test_connection varcheck source "$config_file" lock diff --git a/helpers/funcs b/helpers/funcs index 7c0eb8b..fcba496 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-20 +version=5.0.0.rc-21 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 43073a0..89142d7 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.20 +# 5.0.0-rc.21 app_name = "DZGUI" cache = {} From 42bee23108a94c0d715df853c55282212462cd29 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 13 Jan 2024 15:18:34 +0900 Subject: [PATCH 050/122] feat: extra sum check --- dzgui.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dzgui.sh b/dzgui.sh index ea304ef..bcf9acd 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -552,6 +552,9 @@ fetch_helpers_by_sum(){ if [[ ! $? -eq 0 ]]; then raise_error_and_quit "Failed to fetch the file '$file'. Possible timeout?" fi + if [[ $(get_hash) $full_path != $sum ]]; then + logger WARN "Downloaded new '$file', but checksum != '$sum'" + fi logger INFO "Updated '$full_path' to sum '$sum'" fi [[ $file == "funcs" ]] && chmod +x "$full_path" From 2202483a4f12651d3b1c9b130a05f1f3464c027c Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 14 Jan 2024 05:15:52 +0900 Subject: [PATCH 051/122] fix: unclosed braces --- dzgui.sh | 4 ++-- helpers/ui.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index bcf9acd..7f07460 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -527,7 +527,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="62731f2c617f11c057c43951283807b5" + ["ui.py"]="5e1d2af6cdd122d810de01a2252d1839" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="73898be7185d77ccdc67ace906a7db2c" @@ -552,7 +552,7 @@ fetch_helpers_by_sum(){ if [[ ! $? -eq 0 ]]; then raise_error_and_quit "Failed to fetch the file '$file'. Possible timeout?" fi - if [[ $(get_hash) $full_path != $sum ]]; then + if [[ $(get_hash $full_path) != $sum ]]; then logger WARN "Downloaded new '$file', but checksum != '$sum'" fi logger INFO "Updated '$full_path' to sum '$sum'" diff --git a/helpers/ui.py b/helpers/ui.py index 89142d7..5bf28b9 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -1396,12 +1396,12 @@ class Grid(Gtk.Grid): self.set_column_homogeneous(True) #self.set_row_homogeneous(True) - _news = sys.argv[2] self._version = "%s %s" %(app_name, sys.argv[3]) + _news = sys.argv[2] if _news != "null": self.news = NewsHeader(_news) - self.attach(self.news, 0, -1, 8, 10) + #self.attach(self.news, 0, -1, 8, 10) self.scrollable_treelist = ScrollableTree(is_steam_deck) if is_steam_deck is True: From 08686bb9615a147b06c6cd2c22d4ed68e4d076f0 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 17 Jan 2024 10:08:24 +0900 Subject: [PATCH 052/122] chore: drop news --- dzgui.sh | 12 +++++++----- helpers/ui.py | 19 ++----------------- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 7f07460..aab504c 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -527,7 +527,7 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="5e1d2af6cdd122d810de01a2252d1839" + ["ui.py"]="980b2363ff51c6d5b53573823413de35" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="73898be7185d77ccdc67ace906a7db2c" @@ -778,7 +778,11 @@ is_steam_running(){ test_connection(){ ping -c1 -4 github.com 1>/dev/null 2>&1 if [[ ! $? -eq 0 ]]; then - raise_error_and_quit "DZGUI requires an active Internet connection, but no connection could be established. The remote may be down." + raise_error_and_quit "No connection could be established to the remote server (github.com)." + fi + ping -c1 -4 api.steampowered.com 1>/dev/null 2>&1 + if [[ ! $? -eq 0 ]]; then + raise_error_and_quit "No connection could be established to the remote server (steampowered.com)." fi } initial_setup(){ @@ -811,11 +815,9 @@ main(){ printf "Initializing setup...\n" initial_setup - local news=$(check_news) printf "All OK. Kicking off UI...\n" - [[ -z $news ]] && news="null" - python3 "$ui_helper" "--init-ui" "$news" "$version" "$is_steam_deck" + python3 "$ui_helper" "--init-ui" "$version" "$is_steam_deck" } main #TODO: tech debt: cruddy handling for steam forking diff --git a/helpers/ui.py b/helpers/ui.py index 5bf28b9..a5cf826 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -1163,16 +1163,6 @@ class AppHeaderBar(Gtk.HeaderBar): self.set_show_close_button(True) -class NewsHeader(Gtk.Box): - def __init__(self, news): - super().__init__() - Gtk.Box(spacing=1) - self.set_valign(Gtk.Align.START) - news_label = Gtk.Label(label=news) - news_label.set_ellipsize(Pango.EllipsizeMode.END) - self.pack_start(news_label, False, False, 0) - - class GenericDialog(Gtk.MessageDialog): def __init__(self, parent, text, mode): @@ -1396,12 +1386,7 @@ class Grid(Gtk.Grid): self.set_column_homogeneous(True) #self.set_row_homogeneous(True) - self._version = "%s %s" %(app_name, sys.argv[3]) - _news = sys.argv[2] - - if _news != "null": - self.news = NewsHeader(_news) - #self.attach(self.news, 0, -1, 8, 10) + self._version = "%s %s" %(app_name, sys.argv[2]) self.scrollable_treelist = ScrollableTree(is_steam_deck) if is_steam_deck is True: @@ -1488,7 +1473,7 @@ def toggle_signal(owner, widget, func_name, bool): class App(Gtk.Application): def __init__(self): - _isd = int(sys.argv[4]) + _isd = int(sys.argv[3]) if _isd == 1: is_steam_deck = True else: From 359d57a3efec6d39ff54b8f584c30e640787ca2d Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 17 Jan 2024 10:09:27 +0900 Subject: [PATCH 053/122] chore: bump version --- dzgui.sh | 6 +++--- helpers/funcs | 2 +- helpers/ui.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index aab504c..e9416b6 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-21 +version=5.0.0.rc-22 #CONSTANTS aid=221100 @@ -527,10 +527,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="980b2363ff51c6d5b53573823413de35" + ["ui.py"]="920f67b7e1e18aef83a4da346fb08d9f" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="73898be7185d77ccdc67ace906a7db2c" + ["funcs"]="37e7a32b5ac1fc5cefb8d9afb431beb2" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index fcba496..7a44069 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-21 +version=5.0.0.rc-22 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index a5cf826..48a62ae 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.21 +# 5.0.0-rc.22 app_name = "DZGUI" cache = {} From 86d35c7868088776d1b834e87bd792956f5d347e Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Mon, 22 Jan 2024 14:22:09 +0900 Subject: [PATCH 054/122] feat: set im module --- dzgui.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index e9416b6..6802215 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-22 +version=5.0.0.rc-23 #CONSTANTS aid=221100 @@ -63,6 +63,15 @@ releases_url="https://github.com/$author/$repo/releases/download/browser" km_helper_url="$releases_url/latlon" geo_file_url="$releases_url/ips.csv.gz" +set_im_module(){ + pgrep -a gamescope | grep -q "generate-drm-mode" + if [[ $? -eq 0 ]]; then + GTK_IM_MODULE="" + logger INFO "Detected Steam Deck (Game Mode), unsetting GTK_IM_MODULE" + else + return + fi +} logger(){ local date="$(date "+%F %T,%3N")" local tag="$1" @@ -812,6 +821,7 @@ initial_setup(){ main(){ local zenv=$(zenity --version 2>/dev/null) [[ -z $zenv ]] && { echo "Requires zenity <= 3.44.1"; exit 1; } + set_im_module printf "Initializing setup...\n" initial_setup From 896a564764ad5bd375c45de27d18ae66a3b0596c Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 23 Jan 2024 14:30:43 +0900 Subject: [PATCH 055/122] feat: automod --- dzgui.sh | 4 +- helpers/funcs | 178 ++++++++++++++++++++++++++++++++++++++++++++++---- helpers/ui.py | 2 +- 3 files changed, 170 insertions(+), 14 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 6802215..43adfbc 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="920f67b7e1e18aef83a4da346fb08d9f" + ["ui.py"]="e7bde2fe61a1edb549c9294e5309ca67" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="37e7a32b5ac1fc5cefb8d9afb431beb2" + ["funcs"]="42c38038aa8d915d1207f06c936df288" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 7a44069..1f1efdf 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-22 +version=5.0.0.rc-23 #CONSTANTS aid=221100 @@ -1024,17 +1024,10 @@ try_connect(){ logger INFO "Connection attempt for $ip:$qport" update_history "$record" - # - if [[ -n $auto_install ]]; then - #TODO: remove when ready - printf "Auto install mode currently disabled" - return 1 + + if [[ -z $auto_install ]]; then + diff=$(merge_modlists "$diff") fi - #TODO: publishedfileid,timestamp - #if [[ -z $auto_install ]]; then - # merge_modlists - #fi - # if [[ -n $diff ]]; then if [[ $is_steam_deck -eq 1 ]] && [[ $(test_display_mode) == "gm" ]]; then printf "Use Desktop Mode to download mods on Steam Deck" @@ -1048,6 +1041,165 @@ try_connect(){ launch "$ip" "$gameport" "$sanitized_mods" fi } +focus_beta_client(){ + _wid(){ + wmctrl -ilx |\ + awk 'tolower($3) == "steamwebhelper.steam"' |\ + awk '$5 ~ /^Steam|Steam Games List/' |\ + awk '{print $1}' + } + $steam_cmd steam://open/library 2>/dev/null 1>&2 && + $steam_cmd steam://open/console 2>/dev/null 1>&2 && + sleep 1s + until [[ -n $(_wid) ]]; do + sleep 0.1s + done + wmctrl -ia $(_wid) + sleep 0.1s + + local wid=$(xdotool getactivewindow) + local geo=$(xdotool getwindowgeometry $wid) + local pos=$(<<< "$geo" awk 'NR==2 {print $2}' | sed 's/,/ /') + local dim=$(<<< "$geo" awk 'NR==3 {print $2}' | sed 's/x/ /') + local pos1=$(<<< "$pos" awk '{print $1}') + local pos2=$(<<< "$pos" awk '{print $2}') + local dim1=$(<<< "$dim" awk '{print $1}') + local dim2=$(<<< "$dim" awk '{print $2}') + local dim1=$(((dim1/2)+pos1)) + local dim2=$(((dim2/2)+pos2)) + + xdotool mousemove $dim1 $dim2 + xdotool click 1 + sleep 0.5s + xdotool key Tab +} +auto_mod_install(){ + local ip="$1" + local gameport="$2" + local diff="$3" + local sanitized_mods="$4" + + console_dl "$diff" && + $steam_cmd steam://open/downloads + + until [[ -z $(compare $diff) ]]; do + local missing=$(compare $diff | wc -l) + echo "# Downloaded $((${#modids[@]}-missing)) of ${#modids[@]} mods. ESC cancels" + done | $steamsafe_zenity --pulsate --progress --title="DZG Watcher" --auto-close --no-cancel --width=500 2>/dev/null + + local diff=$(compare "$sanitized_mods") + + if [[ -z $diff ]]; then + #wipe old version file and replace with latest stamps + rm "$versions_file" + check_timestamps + logger INFO "Local modlist matches remote, initiating launch request" + launch "$ip" "$gameport" "$sanitized_mods" + fi +} +force_update(){ + rm "$versions_file" + local update=$(check_timestamps) + console_dl "$update" && + $steam_cmd steam://open/downloads +} +console_dl(){ + readarray -t modids <<< "$@" + focus_beta_client + sleep 1.5s + for i in "${modids[@]}"; do + xdotool type --delay 0 "workshop_download_item $aid $i" + sleep 0.5s + xdotool key Return + sleep 0.5s + done +} +get_local_stamps(){ + local modlist="$1" + local max="${#modlist[@]}" + _concat(){ + for ((i=0;i<$max;i++)); do + echo "publishedfileids[$i]=${modlist[$i]}&" + done | awk '{print}' ORS='' + } + _payload(){ + echo -e "itemcount=${max}&$(_concat)" + } + _post(){ + curl -s -X POST \ + -H "Content-Type:application/x-www-form-urlencoded" \ + -d "$(_payload)" 'https://api.steampowered.com/ISteamRemoteStorage/GetPublishedFileDetails/v1/?format=json' + } + + _post +} +update_stamps(){ + readarray stamps <<< "$1" + for((i=0;i<${#stamps[@]};i++)); do + printf "%s\n" "${stamps[$i]}" >> $versions_file + done +} +check_timestamps(){ + readarray -t local_modlist < <(ls -1 $workshop_dir) + local max=${#local_modlist[@]} + logger INFO "Local mod count: $max" + [[ $max -eq 0 ]] && return 1 + local local_stamps=$(get_local_stamps "${local_modlist[@]}") + if [[ -z $local_stamps ]]; then + logger WARN "Timestamp query returned empty response" + return 1 + fi + local aligned=$(<<< "$local_stamps" jq -r '.response.publishedfiledetails[]|"\(.publishedfileid),\(.time_updated)"') + readarray -t remote_ids < <(<<< "$aligned" awk -F, '{print $1}' + readarray -t remote_times < <(<<< "$aligned" awk -F, '{print $2}' + readarray -t old_ids < <(< $version_file awk -F, '{print 1}' + readarray -t old_times < <(< $version_file awk -F, '{print 2}' + + if [[ ! -f $versions_file ]]; then + logger INFO "No prior versions file found, creating" + update_stamps "$aligned" + #force refresh all mods if versions file was missing + printf "%s\n" "${old_ids[$@]}" + return 0 + fi + + declare -A remote_version + declare -A local_version + + for((i = 0; i < ${remote_ids[@]}; ++i)); do + remote_version[$remote_ids[$i]]=${remote_times[$i]} + done + #TODO: if flag is update all + #fetch list again and write all new stamps into it + + needs_update=() + for((i=0;i<${#old_ids[@]};i++)); do + local id=${old_ids[$i]} + local time=${old_times[$i]} + if [[ $time != ${remote_version[$id]} ]]; then + logger WARN "Mod '$id' timestamp '$time' != '${remote_version[$id]}'" + needs_update+=($id) + #awk -v var=$id -v var2=$time '$1 == var {$2=var2;print $1","$2; next;};{print}' "$version_file" > "$version_file.new" && + #mv "$versions_file.new" "$version_file" + #TODO: but what if they cancel + #TODO: update timestamps AFTER downloading + fi + done + echo "${needs_update[@]}" +} +merge_modlists(){ + local diff="$1" + readarray -t needs_update < <(check_timestamps) + if [[ ${#needs_update[@]} -eq 0]]; then + echo "$diff" + return 0 + fi + if [[ -z "$diff" ]] && [[ ${#needs_update[@]} -gt 0 ]]; then + printf "%s\n" "${needs_update[@]}" + else + printf "%s\n%s\n" "$diff" "${needs_update[@]}" + fi +} concat_mods(){ readarray -t concat_arr <<< "$@" local id @@ -1087,6 +1239,7 @@ launch(){ fi echo "$concat" > "$_cache_launch" echo "$ip:$gameport" > "$_cache_address" + logger INFO "Saved launch params: '$concat'" printf "Launch conditions satisfied. DayZ will now launch after you confirm this dialog." return 100 } @@ -1095,13 +1248,16 @@ final_handshake(){ local saved_address=$(< "$_cache_address") local res=$(is_dayz_running) if [[ $res -eq 1 ]]; then + logger WARN "DayZ appears to already be running" printf "Is DayZ already running? DZGUI cannot launch DayZ if another process is using it." return 1 fi + logger INFO "Kicking off Steam launch" $steam_cmd -applaunch $aid -connect=$saved_address -nolauncher -nosplash -skipintro -name=$name \"-mod=$saved_mods\" & until [[ $(is_dayz_running) -eq 1 ]]; do sleep 0.1s done + logger INFO "Caught DayZ process" return 6 } manual_mod_install(){ diff --git a/helpers/ui.py b/helpers/ui.py index 48a62ae..2a541b3 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.22 +# 5.0.0-rc.23 app_name = "DZGUI" cache = {} From 2ca5bf31d1ff21735f09e724f1c1289566fd83f7 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 23 Jan 2024 14:40:45 +0900 Subject: [PATCH 056/122] fix: close parens --- dzgui.sh | 6 +++--- helpers/funcs | 10 +++++----- helpers/ui.py | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 43adfbc..0f7d652 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-23 +version=5.0.0.rc-24 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="e7bde2fe61a1edb549c9294e5309ca67" + ["ui.py"]="569a966fd97eddb8f4d0139364f161b2" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="42c38038aa8d915d1207f06c936df288" + ["funcs"]="f290a5d7c16f6ac2a124b78ed473f9ac" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 1f1efdf..ad1038d 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-23 +version=5.0.0.rc-24 #CONSTANTS aid=221100 @@ -1150,10 +1150,10 @@ check_timestamps(){ return 1 fi local aligned=$(<<< "$local_stamps" jq -r '.response.publishedfiledetails[]|"\(.publishedfileid),\(.time_updated)"') - readarray -t remote_ids < <(<<< "$aligned" awk -F, '{print $1}' - readarray -t remote_times < <(<<< "$aligned" awk -F, '{print $2}' - readarray -t old_ids < <(< $version_file awk -F, '{print 1}' - readarray -t old_times < <(< $version_file awk -F, '{print 2}' + readarray -t remote_ids < <(<<< "$aligned" awk -F, '{print $1}') + readarray -t remote_times < <(<<< "$aligned" awk -F, '{print $2}') + readarray -t old_ids < <(< $version_file awk -F, '{print 1}') + readarray -t old_times < <(< $version_file awk -F, '{print 2}') if [[ ! -f $versions_file ]]; then logger INFO "No prior versions file found, creating" diff --git a/helpers/ui.py b/helpers/ui.py index 2a541b3..04b4636 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.23 +# 5.0.0-rc.24 app_name = "DZGUI" cache = {} From 858bd066d7ac1668ad186267dacd563c67cca623 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 23 Jan 2024 14:47:14 +0900 Subject: [PATCH 057/122] fix: conditional expression --- dzgui.sh | 10 +++++----- helpers/funcs | 4 ++-- helpers/ui.py | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 0f7d652..86414d4 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-24 +version=5.0.0.rc-25 #CONSTANTS aid=221100 @@ -449,8 +449,8 @@ steam_deps(){ migrate_files(){ if [[ ! -f $config_path/dztuirc.oldapi ]]; then cp $config_file $config_path/dztuirc.oldapi + logger INFO "Migrated old API file" fi - logger INFO "Migrated old API file" [[ ! -f $hist_file ]] && return rm $hist_file logger INFO "Wiped old history file" @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="569a966fd97eddb8f4d0139364f161b2" + ["ui.py"]="52005a27aa00eb2801068b08838eb58f" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="f290a5d7c16f6ac2a124b78ed473f9ac" + ["funcs"]="2668e6d1df5cb68e35202471228bb1fc" ) local author="aclist" local repo="dztui" @@ -554,7 +554,7 @@ fetch_helpers_by_sum(){ full_path="$helpers_path/$file" url="https://raw.githubusercontent.com/$author/$repo/$branch/helpers/$file" if [[ -f "$full_path" ]] && [[ $(get_hash "$full_path") == $sum ]]; then - logger INFO "'$file' is current" + logger INFO "$file is current" else logger WARN "File '$full_path' checksum != '$sum'" curl -Ls "$url" > "$full_path" diff --git a/helpers/funcs b/helpers/funcs index ad1038d..8d1165d 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-24 +version=5.0.0.rc-25 #CONSTANTS aid=221100 @@ -1190,7 +1190,7 @@ check_timestamps(){ merge_modlists(){ local diff="$1" readarray -t needs_update < <(check_timestamps) - if [[ ${#needs_update[@]} -eq 0]]; then + if [[ ${#needs_update[@]} -eq 0 ]]; then echo "$diff" return 0 fi diff --git a/helpers/ui.py b/helpers/ui.py index 04b4636..9456a0a 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.24 +# 5.0.0-rc.25 app_name = "DZGUI" cache = {} From ecedc4e147433dabdc7184e9d6eba923fa2a7960 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 23 Jan 2024 15:21:43 +0900 Subject: [PATCH 058/122] fix: automod toggle --- dzgui.sh | 4 ++-- helpers/funcs | 10 ++-------- helpers/ui.py | 2 +- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 86414d4..f49ef82 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="52005a27aa00eb2801068b08838eb58f" + ["ui.py"]="4dc76532cd01c221755e59e803456b57" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="2668e6d1df5cb68e35202471228bb1fc" + ["funcs"]="a41432675455a4983c7ba6d2e6681f05" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 8d1165d..be4879f 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-25 +version=5.0.0.rc-26 #CONSTANTS aid=221100 @@ -1025,7 +1025,7 @@ try_connect(){ logger INFO "Connection attempt for $ip:$qport" update_history "$record" - if [[ -z $auto_install ]]; then + if [[ -n $auto_install ]]; then diff=$(merge_modlists "$diff") fi if [[ -n $diff ]]; then @@ -1169,8 +1169,6 @@ check_timestamps(){ for((i = 0; i < ${remote_ids[@]}; ++i)); do remote_version[$remote_ids[$i]]=${remote_times[$i]} done - #TODO: if flag is update all - #fetch list again and write all new stamps into it needs_update=() for((i=0;i<${#old_ids[@]};i++)); do @@ -1179,10 +1177,6 @@ check_timestamps(){ if [[ $time != ${remote_version[$id]} ]]; then logger WARN "Mod '$id' timestamp '$time' != '${remote_version[$id]}'" needs_update+=($id) - #awk -v var=$id -v var2=$time '$1 == var {$2=var2;print $1","$2; next;};{print}' "$version_file" > "$version_file.new" && - #mv "$versions_file.new" "$version_file" - #TODO: but what if they cancel - #TODO: update timestamps AFTER downloading fi done echo "${needs_update[@]}" diff --git a/helpers/ui.py b/helpers/ui.py index 9456a0a..befe546 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.25 +# 5.0.0-rc.26 app_name = "DZGUI" cache = {} From 7d66ffe418d42a659069757ee71428183eb62055 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:04:07 +0900 Subject: [PATCH 059/122] fix: set debug state on boot --- dzgui.sh | 6 +++--- helpers/funcs | 7 ++++--- helpers/ui.py | 4 +++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index f49ef82..a918538 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-25 +version=5.0.0.rc-27 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="4dc76532cd01c221755e59e803456b57" + ["ui.py"]="ce3940391b9c7e80eb7af190e40fae41" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="a41432675455a4983c7ba6d2e6681f05" + ["funcs"]="ded1276c0555577cc03cc36e9381a373" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index be4879f..c80a851 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-26 +version=5.0.0.rc-27 #CONSTANTS aid=221100 @@ -362,7 +362,7 @@ get_unique_maps(){ < "$filter_file" awk -F$separator '{print $2}' | sort -u } query_config(){ - local key="$1" + [[ -n $2 ]] && local key=$2 keys=( "branch" "debug" @@ -1026,6 +1026,7 @@ try_connect(){ update_history "$record" if [[ -n $auto_install ]]; then + logger INFO "Merging modlists" diff=$(merge_modlists "$diff") fi if [[ -n $diff ]]; then @@ -1167,7 +1168,7 @@ check_timestamps(){ declare -A local_version for((i = 0; i < ${remote_ids[@]}; ++i)); do - remote_version[$remote_ids[$i]]=${remote_times[$i]} + remote_version[${remote_ids[$i]}]=${remote_times[$i]} done needs_update=() diff --git a/helpers/ui.py b/helpers/ui.py index befe546..822f6d1 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -15,7 +15,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.26 +# 5.0.0-rc.27 app_name = "DZGUI" cache = {} @@ -1526,6 +1526,8 @@ class FilterPanel(Gtk.Box): self.maps_combo.connect("key-press-event", self._on_esc_pressed) self.debug_toggle = Gtk.ToggleButton(label="Debug mode") + if query_config(None, "debug")[0] == '1': + self.debug_toggle.set_active(True) self.debug_toggle.connect("toggled", self._on_button_toggled, "Toggle debug mode") set_surrounding_margins(self.debug_toggle, 10) From 8effa44a0816be95ee5d7a7c763546a35190c9d6 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:14:47 +0900 Subject: [PATCH 060/122] fix: automod, wrapping --- dzgui.sh | 6 +++--- helpers/funcs | 22 +++++++++++++--------- helpers/ui.py | 10 ++++++++-- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index a918538..fafdccf 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-27 +version=5.0.0.rc-28 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="ce3940391b9c7e80eb7af190e40fae41" + ["ui.py"]="9b6c643d096c5b2e677b4eb17ec09750" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="ded1276c0555577cc03cc36e9381a373" + ["funcs"]="bd5dbe82a840a25704b899e62aab0c5b" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index c80a851..5f8f97c 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-27 +version=5.0.0.rc-28 #CONSTANTS aid=221100 @@ -1071,8 +1071,8 @@ focus_beta_client(){ xdotool mousemove $dim1 $dim2 xdotool click 1 - sleep 0.5s - xdotool key Tab + $steam_cmd steam://open/library 2>/dev/null 1>&2 && + $steam_cmd steam://open/console 2>/dev/null 1>&2 } auto_mod_install(){ local ip="$1" @@ -1083,10 +1083,14 @@ auto_mod_install(){ console_dl "$diff" && $steam_cmd steam://open/downloads + local total=$(<<< "$diff" wc -l) until [[ -z $(compare $diff) ]]; do local missing=$(compare $diff | wc -l) - echo "# Downloaded $((${#modids[@]}-missing)) of ${#modids[@]} mods. ESC cancels" + echo "# Downloaded $(($total-missing)) of $total mods. ESC cancels" done | $steamsafe_zenity --pulsate --progress --title="DZG Watcher" --auto-close --no-cancel --width=500 2>/dev/null + if [[ ! $? -eq 0 ]]; then + exit 7 + fi local diff=$(compare "$sanitized_mods") @@ -1116,11 +1120,11 @@ console_dl(){ done } get_local_stamps(){ - local modlist="$1" + readarray -t modlist < <(printf "%s\n" "$@") local max="${#modlist[@]}" _concat(){ for ((i=0;i<$max;i++)); do - echo "publishedfileids[$i]=${modlist[$i]}&" + printf "publishedfileids[$i]=${modlist[$i]}&" done | awk '{print}' ORS='' } _payload(){ @@ -1135,7 +1139,7 @@ get_local_stamps(){ _post } update_stamps(){ - readarray stamps <<< "$1" + readarray -t stamps <<< "$1" for((i=0;i<${#stamps[@]};i++)); do printf "%s\n" "${stamps[$i]}" >> $versions_file done @@ -1153,8 +1157,8 @@ check_timestamps(){ local aligned=$(<<< "$local_stamps" jq -r '.response.publishedfiledetails[]|"\(.publishedfileid),\(.time_updated)"') readarray -t remote_ids < <(<<< "$aligned" awk -F, '{print $1}') readarray -t remote_times < <(<<< "$aligned" awk -F, '{print $2}') - readarray -t old_ids < <(< $version_file awk -F, '{print 1}') - readarray -t old_times < <(< $version_file awk -F, '{print 2}') + readarray -t old_ids < <(< $versions_file awk -F, '{print 1}') + readarray -t old_times < <(< $versions_file awk -F, '{print 2}') if [[ ! -f $versions_file ]]; then logger INFO "No prior versions file found, creating" diff --git a/helpers/ui.py b/helpers/ui.py index 822f6d1..832b8cd 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -8,6 +8,7 @@ import multiprocessing import re import subprocess import sys +import textwrap import threading import time @@ -15,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.27 +# 5.0.0-rc.28 app_name = "DZGUI" cache = {} @@ -307,6 +308,11 @@ def process_shell_return_code(transient_parent, msg, code, original_input): case 6: # return silently pass + case 7: + # catch zenity dialog cancel and rewrite message + msg = "User canceled connect process. Steam may have mods pending for download." + spawn_dialog(transient_parent, msg, "NOTIFY") + case 90: # used to update configs and metadata in-place treeview = transient_parent.grid.scrollable_treelist.treeview @@ -1198,7 +1204,7 @@ class GenericDialog(Gtk.MessageDialog): flags=0, message_type=dialog_type, text=header_text, - secondary_text=text, + secondary_text=textwrap.fill(text, 50), buttons=button_type, title=app_name, modal=True, From 04cb132219115ca5675bde1a8bed10aab75c7bd3 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 24 Jan 2024 17:50:47 +0900 Subject: [PATCH 061/122] fix: automod WIP --- dzgui.sh | 6 +++--- helpers/funcs | 36 +++++++++++++++++------------------- helpers/ui.py | 9 +++++---- 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index fafdccf..d3748d9 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-28 +version=5.0.0.rc-29 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="9b6c643d096c5b2e677b4eb17ec09750" + ["ui.py"]="12fac5997612367c0716f8575046ac6d" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="bd5dbe82a840a25704b899e62aab0c5b" + ["funcs"]="d2afc23090f4f1e670ac8eb1a5412579" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 5f8f97c..71622ba 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-28 +version=5.0.0.rc-29 #CONSTANTS aid=221100 @@ -161,15 +161,6 @@ validate_and_connect(){ esac try_connect "$record" } -force_update(){ - if [[ ! $auto_install -eq 1 ]]; then - printf "Only available when mod auto-install is ON" - return 1 - fi - #TODO: force update - printf "Currently does nothing" - return 0 -} map_id_to_ip(){ local id="$1" local res=$(curl -s "$bm_api" -H "Authorization: Bearer "$api_key"" \ @@ -1084,12 +1075,13 @@ auto_mod_install(){ $steam_cmd steam://open/downloads local total=$(<<< "$diff" wc -l) - until [[ -z $(compare $diff) ]]; do - local missing=$(compare $diff | wc -l) + until [[ -z $(compare "$diff") ]]; do + local missing=$(compare "$diff" | wc -l) echo "# Downloaded $(($total-missing)) of $total mods. ESC cancels" done | $steamsafe_zenity --pulsate --progress --title="DZG Watcher" --auto-close --no-cancel --width=500 2>/dev/null if [[ ! $? -eq 0 ]]; then - exit 7 + echo "User canceled connect process. Steam may have mods pending for download." + exit 1 fi local diff=$(compare "$sanitized_mods") @@ -1103,10 +1095,15 @@ auto_mod_install(){ fi } force_update(){ + if [[ ! $auto_install -eq 1 ]]; then + printf "Only available when mod auto-install is ON" + return 1 + fi rm "$versions_file" local update=$(check_timestamps) console_dl "$update" && $steam_cmd steam://open/downloads + return 8 } console_dl(){ readarray -t modids <<< "$@" @@ -1157,21 +1154,21 @@ check_timestamps(){ local aligned=$(<<< "$local_stamps" jq -r '.response.publishedfiledetails[]|"\(.publishedfileid),\(.time_updated)"') readarray -t remote_ids < <(<<< "$aligned" awk -F, '{print $1}') readarray -t remote_times < <(<<< "$aligned" awk -F, '{print $2}') - readarray -t old_ids < <(< $versions_file awk -F, '{print 1}') - readarray -t old_times < <(< $versions_file awk -F, '{print 2}') + readarray -t old_ids < <(< $versions_file awk -F, '{print $1}') + readarray -t old_times < <(< $versions_file awk -F, '{print $2}') if [[ ! -f $versions_file ]]; then logger INFO "No prior versions file found, creating" update_stamps "$aligned" #force refresh all mods if versions file was missing - printf "%s\n" "${old_ids[$@]}" + printf "%s\n" "${remote_ids[$@]}" return 0 fi declare -A remote_version declare -A local_version - for((i = 0; i < ${remote_ids[@]}; ++i)); do + for((i = 0; i < ${#remote_ids[@]}; ++i)); do remote_version[${remote_ids[$i]}]=${remote_times[$i]} done @@ -1184,7 +1181,7 @@ check_timestamps(){ needs_update+=($id) fi done - echo "${needs_update[@]}" + printf "%s\n" "${needs_update[@]}" } merge_modlists(){ local diff="$1" @@ -1196,7 +1193,8 @@ merge_modlists(){ if [[ -z "$diff" ]] && [[ ${#needs_update[@]} -gt 0 ]]; then printf "%s\n" "${needs_update[@]}" else - printf "%s\n%s\n" "$diff" "${needs_update[@]}" + printf "%s\n" "$diff" + printf "%s\n" "${needs_update[@]}" fi } concat_mods(){ diff --git a/helpers/ui.py b/helpers/ui.py index 832b8cd..bbe166b 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.28 +# 5.0.0-rc.29 app_name = "DZGUI" cache = {} @@ -309,10 +309,11 @@ def process_shell_return_code(transient_parent, msg, code, original_input): # return silently pass case 7: - # catch zenity dialog cancel and rewrite message - msg = "User canceled connect process. Steam may have mods pending for download." + msg = "Some mods may have failed to download. Try connecting again to resync." + spawn_dialog(transient_parent, msg, "NOTIFY") + case 8: + msg = "Finished requesting mod updates. Steam may have mods pending for download." spawn_dialog(transient_parent, msg, "NOTIFY") - case 90: # used to update configs and metadata in-place treeview = transient_parent.grid.scrollable_treelist.treeview From 2f9c74e13b5bac595bc91a0f23228c9ca4baee2f Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 24 Jan 2024 21:56:47 +0900 Subject: [PATCH 062/122] fix: automod WIP --- dzgui.sh | 6 +++--- helpers/funcs | 7 ++++--- helpers/ui.py | 14 ++++---------- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index d3748d9..9a63630 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-29 +version=5.0.0.rc-30 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="12fac5997612367c0716f8575046ac6d" + ["ui.py"]="ad04fee7066d5fe30fb39e875ff870d2" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="d2afc23090f4f1e670ac8eb1a5412579" + ["funcs"]="26a4200acd85c0e0fc71a7fe57b1e13e" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 71622ba..b2a61a0 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-29 +version=5.0.0.rc-30 #CONSTANTS aid=221100 @@ -1080,7 +1080,7 @@ auto_mod_install(){ echo "# Downloaded $(($total-missing)) of $total mods. ESC cancels" done | $steamsafe_zenity --pulsate --progress --title="DZG Watcher" --auto-close --no-cancel --width=500 2>/dev/null if [[ ! $? -eq 0 ]]; then - echo "User canceled connect process. Steam may have mods pending for download." + echo "User aborted connect process. Steam may have mods pending for download." exit 1 fi @@ -1103,7 +1103,8 @@ force_update(){ local update=$(check_timestamps) console_dl "$update" && $steam_cmd steam://open/downloads - return 8 + echo "Finished requesting mod updates. Steam may have some mods pending for download." + return 0 } console_dl(){ readarray -t modids <<< "$@" diff --git a/helpers/ui.py b/helpers/ui.py index bbe166b..56a4ce3 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.29 +# 5.0.0-rc.30 app_name = "DZGUI" cache = {} @@ -283,13 +283,11 @@ def process_shell_return_code(transient_parent, msg, code, original_input): case 0: # success with notice popup spawn_dialog(transient_parent, msg, "NOTIFY") - pass case 1: # error with notice popup if msg == "": msg = "Something went wrong" spawn_dialog(transient_parent, msg, "NOTIFY") - pass case 2: # warn and recurse (e.g. validation failed) spawn_dialog(transient_parent, msg, "NOTIFY") @@ -308,12 +306,6 @@ def process_shell_return_code(transient_parent, msg, code, original_input): case 6: # return silently pass - case 7: - msg = "Some mods may have failed to download. Try connecting again to resync." - spawn_dialog(transient_parent, msg, "NOTIFY") - case 8: - msg = "Finished requesting mod updates. Steam may have mods pending for download." - spawn_dialog(transient_parent, msg, "NOTIFY") case 90: # used to update configs and metadata in-place treeview = transient_parent.grid.scrollable_treelist.treeview @@ -1010,7 +1002,9 @@ class TreeView(Gtk.TreeView): def load(): dialog.destroy() transient = self.get_outer_window() - process_shell_return_code(transient, proc.stdout, proc.returncode, record) + out = proc.stdout.splitlines() + msg = out[-1] + process_shell_return_code(transient, msg, proc.returncode, record) proc = call_out(self, "Connect from table", record) GLib.idle_add(load) From 0fde301c2143074bbeedcbd440e903533926c4c7 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Thu, 25 Jan 2024 13:29:57 +0900 Subject: [PATCH 063/122] fix: debug key not echoing --- dzgui.sh | 6 +++--- helpers/funcs | 3 ++- helpers/ui.py | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 9a63630..5c31bc5 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-30 +version=5.0.0.rc-31 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="ad04fee7066d5fe30fb39e875ff870d2" + ["ui.py"]="dc5f2ea7d90e93f9405283374aa98a8b" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="26a4200acd85c0e0fc71a7fe57b1e13e" + ["funcs"]="205c27f0ac0f2c89d0aaf1ba1fb73082" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index b2a61a0..da46039 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-30 +version=5.0.0.rc-31 #CONSTANTS aid=221100 @@ -367,6 +367,7 @@ query_config(){ echo "${!key}" return 0 else + echo "" return 1 fi fi diff --git a/helpers/ui.py b/helpers/ui.py index 56a4ce3..e20b564 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.30 +# 5.0.0-rc.31 app_name = "DZGUI" cache = {} From e2781c07cf97f4e31ac7483d568ea428d8d8e943 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:00:18 +0900 Subject: [PATCH 064/122] fix: destroy signals --- dzgui.sh | 6 +++--- helpers/funcs | 2 +- helpers/ui.py | 28 ++++++++++++++++------------ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 5c31bc5..f6ffe7a 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-31 +version=5.0.0.rc-32 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="dc5f2ea7d90e93f9405283374aa98a8b" + ["ui.py"]="34dc74d1330932e36087d2b52e0e42eb" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="205c27f0ac0f2c89d0aaf1ba1fb73082" + ["funcs"]="ae54854dfb45804c92a81f4b95bf3c54" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index da46039..74b8921 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-31 +version=5.0.0.rc-32 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index e20b564..26d4ce6 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.31 +# 5.0.0-rc.32 app_name = "DZGUI" cache = {} @@ -393,7 +393,7 @@ def process_tree_option(input, treeview): case "Connect by IP" | "Add server by IP" | "Change favorite server": flag = True link_label = "" - prompt = "Enter IP in IP:Queryport format\nE.g. 192.168.1.1:27016" + prompt = "Enter IP in IP:Queryport format (e.g. 192.168.1.1:27016)" case "Connect by ID" | "Add server by ID": flag = True link_label = "Open Battlemetrics" @@ -436,7 +436,6 @@ class OuterWindow(Gtk.Window): def __init__(self, is_steam_deck): super().__init__() - self.connect("destroy", self.halt_proc_and_quit) self.connect("delete-event", self.halt_proc_and_quit) # Deprecated in GTK 4.0 self.set_border_width(10) @@ -461,7 +460,7 @@ class OuterWindow(Gtk.Window): self.grid.right_panel.set_filter_visibility(False) self.grid.scrollable_treelist.treeview.grab_focus() - def halt_proc_and_quit(self, window): + def halt_proc_and_quit(self, window, event): self.grid.terminate_treeview_process() Gtk.main_quit() @@ -469,7 +468,6 @@ class OuterWindow(Gtk.Window): class ScrollableTree(Gtk.ScrolledWindow): def __init__(self, is_steam_deck): super().__init__() - #self.set_propagate_natural_height(False) self.treeview = TreeView(is_steam_deck) self.add(self.treeview) @@ -822,14 +820,14 @@ class TreeView(Gtk.TreeView): return False def _on_keypress(self, treeview, event): - if self.get_first_col == "Mod": - return keyname = Gdk.keyval_name(event.keyval) grid = self.get_outer_grid() cur_proc = grid.scrollable_treelist.treeview.current_proc if event.state is Gdk.ModifierType.CONTROL_MASK: match event.keyval: case Gdk.KEY_d: + if self.get_first_col() == "Mod": + return debug = grid.right_panel.filters_vbox.debug_toggle if debug.get_active(): debug.set_active(False) @@ -838,13 +836,19 @@ class TreeView(Gtk.TreeView): case Gdk.KEY_l: self._on_button_release(self, event) case Gdk.KEY_f: + if self.get_first_col() == "Mod": + return grid.right_panel.filters_vbox.grab_keyword_focus() case Gdk.KEY_m: + if self.get_first_col() == "Mod": + return grid.right_panel.filters_vbox.maps_combo.grab_focus() grid.right_panel.filters_vbox.maps_combo.popup() case _: return False elif keyname.isnumeric() and int(keyname) > 0: + if self.get_first_col() == "Mod": + return digit = (int(keyname) - 1) grid.right_panel.filters_vbox.toggle_check(checks[digit]) else: @@ -895,6 +899,7 @@ class TreeView(Gtk.TreeView): self.grab_focus() size = locale.format_string('%.3f', total_size, grouping=True) grid.update_statusbar("Found %s mods taking up %s MiB" %(f'{total_mods:n}', size)) + toggle_signal(self, self, '_on_keypress', True) grid = self.get_outer_grid() right_panel = grid.right_panel @@ -918,11 +923,10 @@ class TreeView(Gtk.TreeView): renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer, text=i) column.set_sort_column_id(i) - #"""Prevent columns from auto-adjusting""" if ("Name" in column_title): column.set_fixed_width(800) - #if (column_title == "Map"): - # column.set_fixed_width(300) + if (column_title == "Map"): + column.set_fixed_width(300) self.append_column(column) self.update_first_col(mode) @@ -1159,8 +1163,8 @@ def filter_servers(transient_parent, filters_vbox, treeview, context): class AppHeaderBar(Gtk.HeaderBar): def __init__(self): super().__init__() - Gtk.HeaderBar() self.props.title = app_name + self.set_decoration_layout("menu:minimize,maximize,close") self.set_show_close_button(True) @@ -1490,7 +1494,7 @@ class App(Gtk.Application): Gtk.main() def _halt_window_subprocess(self, accel_group, window, code, flag): - self.win.halt_proc_and_quit(self) + self.win.halt_proc_and_quit(self, None) class FilterPanel(Gtk.Box): From 9b84a168b8c8c99ce51237d226519e3c86960759 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:29:12 +0900 Subject: [PATCH 065/122] fix: remove duplicates --- dzgui.sh | 6 +++--- helpers/funcs | 12 ++++++++---- helpers/ui.py | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index f6ffe7a..7b9e593 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-32 +version=5.0.0.rc-33 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="34dc74d1330932e36087d2b52e0e42eb" + ["ui.py"]="24c16220d76b5fb8c6964648d509d684" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="ae54854dfb45804c92a81f4b95bf3c54" + ["funcs"]="91144c992c4786c855da659f384caebd" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 74b8921..b4ac4ea 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-32 +version=5.0.0.rc-33 #CONSTANTS aid=221100 @@ -1187,6 +1187,10 @@ check_timestamps(){ } merge_modlists(){ local diff="$1" + _sort(){ + printf "%s\n" "$diff" + printf "%s\n" "${needs_update[@]}" + } readarray -t needs_update < <(check_timestamps) if [[ ${#needs_update[@]} -eq 0 ]]; then echo "$diff" @@ -1195,8 +1199,8 @@ merge_modlists(){ if [[ -z "$diff" ]] && [[ ${#needs_update[@]} -gt 0 ]]; then printf "%s\n" "${needs_update[@]}" else - printf "%s\n" "$diff" - printf "%s\n" "${needs_update[@]}" + # remove duplicates + _sort | sort -u fi } concat_mods(){ @@ -1306,7 +1310,7 @@ manual_mod_install(){ if [[ -z $diff ]]; then launch "$ip" "$gameport" "$sanitized_mods" else - printf "Some mods may have failed to download. Try connecting again to resync." + printf "User aborted download process, or some mods may have failed to download. Try connecting again to resync." exit 1 fi } diff --git a/helpers/ui.py b/helpers/ui.py index 26d4ce6..1b5e0f2 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.32 +# 5.0.0-rc.33 app_name = "DZGUI" cache = {} From 62613d953338d48c8cecc687b6f42d4b3dd1844e Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 26 Jan 2024 18:24:06 +0900 Subject: [PATCH 066/122] fix: set titlebar correctly --- dzgui.sh | 8 ++++---- helpers/funcs | 2 +- helpers/ui.py | 17 +++++++++-------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 7b9e593..f5e0376 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-33 +version=5.0.0.rc-34 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="24c16220d76b5fb8c6964648d509d684" + ["ui.py"]="b4e3ffaede349a6817132a5a7df45bf8" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="91144c992c4786c855da659f384caebd" + ["funcs"]="0ad23d86fe24507c177e9db95c917354" ) local author="aclist" local repo="dztui" @@ -812,7 +812,7 @@ initial_setup(){ steam_deps migrate_files stale_symlinks - fetch_helpers > >(pdialog "Fetching additional helper files") + fetch_helpers > >(pdialog "Checking helper files") local_latlon is_steam_running is_dzg_downloading diff --git a/helpers/funcs b/helpers/funcs index b4ac4ea..dd4263e 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-33 +version=5.0.0.rc-34 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 1b5e0f2..a185615 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.33 +# 5.0.0-rc.34 app_name = "DZGUI" cache = {} @@ -434,7 +434,7 @@ def reinit_checks(): class OuterWindow(Gtk.Window): def __init__(self, is_steam_deck): - super().__init__() + super().__init__(title=app_name) self.connect("delete-event", self.halt_proc_and_quit) # Deprecated in GTK 4.0 @@ -447,13 +447,14 @@ class OuterWindow(Gtk.Window): """ self.grid = Grid(is_steam_deck) self.add(self.grid) - self.hb = AppHeaderBar() +# self.hb = AppHeaderBar() - if is_steam_deck is True: - self.maximize() - self.set_decorated(False) - else: - self.set_titlebar(self.hb) +# if is_steam_deck is True: +# self.maximize() +# self.set_decorated(False) +# else: +# pass +# self.set_titlebar(self.hb) # Hide FilterPanel on main menu self.show_all() From 1a8fd02b60c7c37a4a37efe40aaf258736099aa9 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 26 Jan 2024 18:36:17 +0900 Subject: [PATCH 067/122] fix: newline in modlist --- dzgui.sh | 8 ++++---- helpers/funcs | 4 ++-- helpers/ui.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index f5e0376..c580d1b 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-34 +version=5.0.0.rc-35 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="b4e3ffaede349a6817132a5a7df45bf8" + ["ui.py"]="e8f3f1ff2a46c6a4bb8a692f42da550b" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="0ad23d86fe24507c177e9db95c917354" + ["funcs"]="a37820c4c5da21811bae77f6c43ed9a6" ) local author="aclist" local repo="dztui" @@ -812,7 +812,7 @@ initial_setup(){ steam_deps migrate_files stale_symlinks - fetch_helpers > >(pdialog "Checking helper files") +# fetch_helpers > >(pdialog "Checking helper files") local_latlon is_steam_running is_dzg_downloading diff --git a/helpers/funcs b/helpers/funcs index dd4263e..80bbb2c 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-34 +version=5.0.0.rc-35 #CONSTANTS aid=221100 @@ -1192,7 +1192,7 @@ merge_modlists(){ printf "%s\n" "${needs_update[@]}" } readarray -t needs_update < <(check_timestamps) - if [[ ${#needs_update[@]} -eq 0 ]]; then + if [[ -z ${needs_update[@]} ]]; then echo "$diff" return 0 fi diff --git a/helpers/ui.py b/helpers/ui.py index a185615..57a156a 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.34 +# 5.0.0-rc.35 app_name = "DZGUI" cache = {} From 4beb44efa78187aebf93a9329ef3b75a48ad46b4 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 26 Jan 2024 18:37:28 +0900 Subject: [PATCH 068/122] fix: uncomment fetch helpers --- dzgui.sh | 8 ++++---- helpers/funcs | 2 +- helpers/ui.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index c580d1b..b3bad56 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-35 +version=5.0.0.rc-36 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="e8f3f1ff2a46c6a4bb8a692f42da550b" + ["ui.py"]="4cc79aacfc87ded6989e7a7e077a9b23" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="a37820c4c5da21811bae77f6c43ed9a6" + ["funcs"]="c05444b8db8cb010909eb2763100450a" ) local author="aclist" local repo="dztui" @@ -812,7 +812,7 @@ initial_setup(){ steam_deps migrate_files stale_symlinks -# fetch_helpers > >(pdialog "Checking helper files") + fetch_helpers > >(pdialog "Checking helper files") local_latlon is_steam_running is_dzg_downloading diff --git a/helpers/funcs b/helpers/funcs index 80bbb2c..70d592d 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-35 +version=5.0.0.rc-36 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 57a156a..02261fa 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.35 +# 5.0.0-rc.36 app_name = "DZGUI" cache = {} From e197e07e84adb62dac4d4bb6c48cc3cec54dd9b9 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Mon, 29 Jan 2024 18:09:48 +0900 Subject: [PATCH 069/122] fix: clean up leaky dialogs --- dzgui.sh | 6 +++--- helpers/funcs | 8 +++++--- helpers/ui.py | 15 +++++++++------ 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index b3bad56..b8a1e4e 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-36 +version=5.0.0.rc-37 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="4cc79aacfc87ded6989e7a7e077a9b23" + ["ui.py"]="26032cc056ff1ce25660a2ca58cffc81" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="c05444b8db8cb010909eb2763100450a" + ["funcs"]="4f142d4fe883a6936f94c964dbcf0710" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 70d592d..fcd2d37 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-36 +version=5.0.0.rc-37 #CONSTANTS aid=221100 @@ -89,7 +89,6 @@ else steam_cmd="flatpak run com.valvesoftware.Steam" fi -#TODO: dump servers methods can be merged declare -A funcs=( ["My servers"]="dump_servers" ["Change player name"]="update_config_val" @@ -774,8 +773,10 @@ update_favs_from_table(){ local record="$2" if [[ $context =~ Remove ]]; then remove_from_favs "$record" + echo "Removed $record from saved servers" else add_to_favs "$record" + echo "Added $record to saved servers" fi return 0 } @@ -837,6 +838,7 @@ update_config_val(){ declare -n nr=$key nr="$value" update_config + echo "Updated the key '$key' to '$value'" return 90 } show_log(){ @@ -1163,7 +1165,7 @@ check_timestamps(){ logger INFO "No prior versions file found, creating" update_stamps "$aligned" #force refresh all mods if versions file was missing - printf "%s\n" "${remote_ids[$@]}" + printf "%s\n" "${remote_ids[@]}" return 0 fi diff --git a/helpers/ui.py b/helpers/ui.py index 02261fa..450c90b 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.36 +# 5.0.0-rc.37 app_name = "DZGUI" cache = {} @@ -134,7 +134,7 @@ status_tooltip = { "Server browser": "Used to browse the global server list", "My saved servers": "Browse your saved servers", "Quick-connect to favorite server": "Connect to your favorite server", - "Recent servers": "Shows the last 10 servers you connected to", + "Recent servers": "Shows the last 10 servers you connected to (includes attempts)", "Connect by IP": "Connect to a server by IP", "Connect by ID": "Connect to a server by Battlemetrics ID", "Add server by IP": "Add a server by IP", @@ -341,7 +341,8 @@ def process_tree_option(input, treeview): def _background(subproc, args, dialog): def _load(): wait_dialog.destroy() - msg = proc.stdout + out = proc.stdout.splitlines() + msg = out[-1] rc = proc.returncode logger.info("Subprocess returned code %s with message '%s'" %(rc, msg)) process_shell_return_code(transient_parent, msg, rc, input) @@ -356,7 +357,8 @@ def process_tree_option(input, treeview): # False is used to bypass wait dialogs proc = call_out(transient_parent, subproc, args) rc = proc.returncode - msg = proc.stdout + out = proc.stdout.splitlines() + msg = out[-1] process_shell_return_code(transient_parent, msg, rc, input) @@ -667,11 +669,12 @@ class TreeView(Gtk.TreeView): match context_menu_label: case "Add to my servers" | "Remove from favorites": record = "%s:%s" %(self.get_column_at_index(6), self.get_column_at_index(7)) - call_out(parent, context_menu_label, record) + proc = call_out(parent, context_menu_label, record) if context == "Name (My saved servers)": iter = self.get_current_iter() server_store.remove(iter) - res = spawn_dialog(parent, "Added %s to favorites" %(record), "NOTIFY") + msg = proc.stdout + res = spawn_dialog(parent, msg, "NOTIFY") case "Remove from history": record = "%s:%s" %(self.get_column_at_index(6), self.get_column_at_index(7)) call_out(parent, context_menu_label, record) From a1689b5677c507a4f64c72496d879a9a3ae1f26f Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Mon, 29 Jan 2024 18:32:01 +0900 Subject: [PATCH 070/122] fix: force fullscreen on GM --- dzgui.sh | 22 +++++++++++++++++----- helpers/funcs | 2 +- helpers/ui.py | 23 ++++++++++++----------- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index b8a1e4e..ec9d656 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-37 +version=5.0.0.rc-38 #CONSTANTS aid=221100 @@ -370,10 +370,22 @@ dl_changelog(){ local md="https://raw.githubusercontent.com/$author/dztui/${mdbranch}/CHANGELOG.md" curl -Ls "$md" > "$state_path/CHANGELOG.md" } +test_display_mode(){ + pgrep -a gamescope | grep -q "generate-drm-mode" + if [[ $? -eq 0 ]]; then + echo gm + else + echo dm + fi +} check_architecture(){ local cpu=$(< /proc/cpuinfo grep "AMD Custom APU 0405") if [[ -n "$cpu" ]]; then - is_steam_deck=1 + if [[ $(test_display_mode) == "gm" ]]; then + is_steam_deck=2 + else + is_steam_deck=1 + fi logger INFO "Setting architecture to 'Steam Deck'" else is_steam_deck=0 @@ -536,10 +548,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="26032cc056ff1ce25660a2ca58cffc81" + ["ui.py"]="79f21f63a704389d5aec0731c75b5e0f" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="4f142d4fe883a6936f94c964dbcf0710" + ["funcs"]="e49f7a123134d49f622dba9b671b000e" ) local author="aclist" local repo="dztui" @@ -812,7 +824,7 @@ initial_setup(){ steam_deps migrate_files stale_symlinks - fetch_helpers > >(pdialog "Checking helper files") +# fetch_helpers > >(pdialog "Checking helper files") local_latlon is_steam_running is_dzg_downloading diff --git a/helpers/funcs b/helpers/funcs index fcd2d37..7259960 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-37 +version=5.0.0.rc-38 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 450c90b..e52f8b5 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.37 +# 5.0.0-rc.38 app_name = "DZGUI" cache = {} @@ -435,7 +435,7 @@ def reinit_checks(): class OuterWindow(Gtk.Window): - def __init__(self, is_steam_deck): + def __init__(self, is_steam_deck, is_game_mode): super().__init__(title=app_name) self.connect("delete-event", self.halt_proc_and_quit) @@ -449,14 +449,10 @@ class OuterWindow(Gtk.Window): """ self.grid = Grid(is_steam_deck) self.add(self.grid) -# self.hb = AppHeaderBar() - -# if is_steam_deck is True: -# self.maximize() -# self.set_decorated(False) -# else: -# pass -# self.set_titlebar(self.hb) + if is_game_mode is True: + self.fullscreen() + else: + self.maximize() # Hide FilterPanel on main menu self.show_all() @@ -1485,10 +1481,15 @@ class App(Gtk.Application): _isd = int(sys.argv[3]) if _isd == 1: is_steam_deck = True + is_game_mode = False + elif _isd == 2: + is_steam_deck = True + is_game_mode = True else: is_steam_deck = False + is_game_mode = False - self.win = OuterWindow(is_steam_deck) + self.win = OuterWindow(is_steam_deck, is_game_mode) accel = Gtk.AccelGroup() accel.connect(Gdk.KEY_q, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE, self._halt_window_subprocess) From ba32e14e81660e2bd0502a818c248cc1b2f375d3 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Mon, 29 Jan 2024 18:32:44 +0900 Subject: [PATCH 071/122] chore: test changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67cfc88..c585451 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [5.0.0] 2024-01-29 +### Added +- Test + ## [4.1.1] 2023-12-18 ### Fixed From aaf3cf8ef8e528429b6dda124ef49ab1e1d6412c Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Mon, 29 Jan 2024 18:33:04 +0900 Subject: [PATCH 072/122] fix: uncomment function --- dzgui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index ec9d656..71d0297 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -824,7 +824,7 @@ initial_setup(){ steam_deps migrate_files stale_symlinks -# fetch_helpers > >(pdialog "Checking helper files") + fetch_helpers > >(pdialog "Checking helper files") local_latlon is_steam_running is_dzg_downloading From 274df41748d95981dea71b30fe8e796d2e8c4245 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Mon, 29 Jan 2024 18:36:50 +0900 Subject: [PATCH 073/122] fix: changelog URL --- dzgui.sh | 8 ++++---- helpers/funcs | 2 +- helpers/ui.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 71d0297..4959ad3 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-38 +version=5.0.0.rc-39 #CONSTANTS aid=221100 @@ -366,7 +366,7 @@ prompt_dl(){ dl_changelog(){ local mdbranch [[ $branch == "stable" ]] && mdbranch="dzgui" - [[ $branch == "" ]] && mdbranch="testing" + [[ $branch == "testing" ]] && mdbranch="testing" local md="https://raw.githubusercontent.com/$author/dztui/${mdbranch}/CHANGELOG.md" curl -Ls "$md" > "$state_path/CHANGELOG.md" } @@ -548,10 +548,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="79f21f63a704389d5aec0731c75b5e0f" + ["ui.py"]="2c7b337afc5abc8be83bf3c62e043e71" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="e49f7a123134d49f622dba9b671b000e" + ["funcs"]="1396887afe48f16096089395914a417d" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 7259960..20e7055 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-38 +version=5.0.0.rc-39 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index e52f8b5..3273aec 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.38 +# 5.0.0-rc.39 app_name = "DZGUI" cache = {} From ac8a5f817573f9b7bfe60bed19d02bfa35e11547 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 31 Jan 2024 16:17:45 +0900 Subject: [PATCH 074/122] fix: set margins --- dzgui.sh | 8 ++++---- helpers/funcs | 2 +- helpers/ui.py | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 4959ad3..164ef7e 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-39 +version=5.0.0.rc-40 #CONSTANTS aid=221100 @@ -548,10 +548,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="2c7b337afc5abc8be83bf3c62e043e71" + ["ui.py"]="ff29782f8e6dbc21ffe7c2d620198bfd" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="1396887afe48f16096089395914a417d" + ["funcs"]="9d5d376c585a1c34db388cb2c068aa8b" ) local author="aclist" local repo="dztui" @@ -824,7 +824,7 @@ initial_setup(){ steam_deps migrate_files stale_symlinks - fetch_helpers > >(pdialog "Checking helper files") +# fetch_helpers > >(pdialog "Checking helper files") local_latlon is_steam_running is_dzg_downloading diff --git a/helpers/funcs b/helpers/funcs index 20e7055..532628b 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-39 +version=5.0.0.rc-40 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 3273aec..8aa55b1 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.39 +# 5.0.0-rc.40 app_name = "DZGUI" cache = {} @@ -1520,6 +1520,7 @@ class FilterPanel(Gtk.Box): self.connect("button-release-event", self._on_button_release) self.set_orientation(Gtk.Orientation.VERTICAL) set_surrounding_margins(self, 10) + self.set_margin_top(1) self.filters_label = Gtk.Label(label="Filters") From 419919ffdc65c2d7b42fc4a4a17ce0b56d1841bf Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 31 Jan 2024 16:19:03 +0900 Subject: [PATCH 075/122] fix: uncomment line --- dzgui.sh | 8 ++++---- helpers/funcs | 2 +- helpers/ui.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 164ef7e..992938a 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-40 +version=5.0.0.rc-41 #CONSTANTS aid=221100 @@ -548,10 +548,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="ff29782f8e6dbc21ffe7c2d620198bfd" + ["ui.py"]="cf1542c215b72ded42a3b52068e0653f" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="9d5d376c585a1c34db388cb2c068aa8b" + ["funcs"]="c1b73598bddde3fc3b9c9d12061a5b83" ) local author="aclist" local repo="dztui" @@ -824,7 +824,7 @@ initial_setup(){ steam_deps migrate_files stale_symlinks -# fetch_helpers > >(pdialog "Checking helper files") + fetch_helpers > >(pdialog "Checking helper files") local_latlon is_steam_running is_dzg_downloading diff --git a/helpers/funcs b/helpers/funcs index 532628b..cc485d4 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-40 +version=5.0.0.rc-41 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 8aa55b1..aa8c732 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.40 +# 5.0.0-rc.41 app_name = "DZGUI" cache = {} From 3c679aadaae56bcda249e5c1cfac4240c6ebba2b Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 31 Jan 2024 16:59:25 +0900 Subject: [PATCH 076/122] fix: check for helpers sooner --- dzgui.sh | 11 +++++++---- helpers/funcs | 2 +- helpers/ui.py | 8 ++++---- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 992938a..25339cb 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-41 +version=5.0.0.rc-42 #CONSTANTS aid=221100 @@ -548,14 +548,16 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="cf1542c215b72ded42a3b52068e0653f" + ["ui.py"]="2331665f5a2fb55cc030621812a309ea" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="c1b73598bddde3fc3b9c9d12061a5b83" + ["funcs"]="3f7f374117dd2bbc55e1d055d903cff2" ) local author="aclist" local repo="dztui" local branch="$branch" + #TODO: update to 'dzgui' for first time setup + [[ -z $branch ]] && branch="testing" local file local sum local full_path @@ -565,6 +567,7 @@ fetch_helpers_by_sum(){ sum="${sums[$i]}" full_path="$helpers_path/$file" url="https://raw.githubusercontent.com/$author/$repo/$branch/helpers/$file" + echo "$url" >> $HOME/log if [[ -f "$full_path" ]] && [[ $(get_hash "$full_path") == $sum ]]; then logger INFO "$file is current" else @@ -815,6 +818,7 @@ initial_setup(){ watcher_deps check_architecture test_connection + fetch_helpers > >(pdialog "Checking helper files") varcheck source "$config_file" lock @@ -824,7 +828,6 @@ initial_setup(){ steam_deps migrate_files stale_symlinks - fetch_helpers > >(pdialog "Checking helper files") local_latlon is_steam_running is_dzg_downloading diff --git a/helpers/funcs b/helpers/funcs index cc485d4..c33bafd 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-41 +version=5.0.0.rc-42 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index aa8c732..c7f9f12 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.41 +# 5.0.0-rc.42 app_name = "DZGUI" cache = {} @@ -663,7 +663,7 @@ class TreeView(Gtk.TreeView): logger.info("User clicked context menu '%s'" %(context_menu_label)) match context_menu_label: - case "Add to my servers" | "Remove from favorites": + case "Add to my servers" | "Remove from my servers": record = "%s:%s" %(self.get_column_at_index(6), self.get_column_at_index(7)) proc = call_out(parent, context_menu_label, record) if context == "Name (My saved servers)": @@ -722,7 +722,7 @@ class TreeView(Gtk.TreeView): mod_context_items = ["Open in Steam Workshop", "Delete mod"] subcontext_items = {"Server browser": ["Add to my servers", "Copy IP to clipboard", "Show server-side mods"], - "My saved servers": ["Remove from favorites", "Copy IP to clipboard", "Show server-side mods"], + "My saved servers": ["Remove from my servers", "Copy IP to clipboard", "Show server-side mods"], "Recent servers": ["Remove from history", "Copy IP to clipboard", "Show server-side mods"], } # submenu hierarchy https://stackoverflow.com/questions/52847909/how-to-add-a-sub-menu-to-a-gtk-menu @@ -740,7 +740,7 @@ class TreeView(Gtk.TreeView): record = "%s:%s" %(self.get_column_at_index(6), self.get_column_at_index(7)) proc = call_out(widget, "is_in_favs", record) if proc.returncode == 0: - item = "Remove from favorites" + item = "Remove from my servers" item = Gtk.MenuItem(label=item) item.connect("activate", self._on_menu_click) self.menu.append(item) From 23bd692fca622407c0e2a8669ff313f9469a2826 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 31 Jan 2024 17:21:16 +0900 Subject: [PATCH 077/122] fix: update launch flags --- dzgui.sh | 8 ++++---- helpers/funcs | 2 +- helpers/ui.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 25339cb..623ccf7 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-42 +version=5.0.0.rc-43 #CONSTANTS aid=221100 @@ -393,7 +393,7 @@ check_architecture(){ fi } check_map_count(){ - [[ $is_steam_deck -eq 1 ]] && return 0 + [[ $is_steam_deck -gt 0 ]] && return 0 local count=1048576 local conf_file="/etc/sysctl.d/dayz.conf" if [[ -f $conf_file ]]; then @@ -548,10 +548,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="2331665f5a2fb55cc030621812a309ea" + ["ui.py"]="2828ecfd733c3ebc7024fbe5c8349cb5" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="3f7f374117dd2bbc55e1d055d903cff2" + ["funcs"]="5f9f7af1fae725e295de08a95f14ba6d" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index c33bafd..17d0b8a 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-42 +version=5.0.0.rc-43 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index c7f9f12..45c3ff8 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.42 +# 5.0.0-rc.43 app_name = "DZGUI" cache = {} From 85f4f7e7f275799e0c24b2bba43d0ce3c8704db8 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 31 Jan 2024 17:29:48 +0900 Subject: [PATCH 078/122] fix: check architecture --- dzgui.sh | 6 +++--- helpers/funcs | 12 ++++++++++-- helpers/ui.py | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 623ccf7..f6697a2 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-43 +version=5.0.0.rc-44 #CONSTANTS aid=221100 @@ -548,10 +548,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="2828ecfd733c3ebc7024fbe5c8349cb5" + ["ui.py"]="9411e901a8572568ab129a4fe472a0a3" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="5f9f7af1fae725e295de08a95f14ba6d" + ["funcs"]="722834d7fa7aa60a2cf7f5b7350c5675" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 17d0b8a..cc58af6 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-43 +version=5.0.0.rc-44 #CONSTANTS aid=221100 @@ -1024,7 +1024,7 @@ try_connect(){ diff=$(merge_modlists "$diff") fi if [[ -n $diff ]]; then - if [[ $is_steam_deck -eq 1 ]] && [[ $(test_display_mode) == "gm" ]]; then + if [[ $(check_architecture) -eq 1 ]] && [[ $(test_display_mode) == "gm" ]]; then printf "Use Desktop Mode to download mods on Steam Deck" return 1 fi @@ -1036,6 +1036,14 @@ try_connect(){ launch "$ip" "$gameport" "$sanitized_mods" fi } +check_architecture(){ + local cpu=$(< /proc/cpuinfo grep "AMD Custom APU 0405") + if [[ -n "$cpu" ]]; then + echo 1 + else + echo 0 + fi +} focus_beta_client(){ _wid(){ wmctrl -ilx |\ diff --git a/helpers/ui.py b/helpers/ui.py index 45c3ff8..56f7104 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.43 +# 5.0.0-rc.44 app_name = "DZGUI" cache = {} From 155b1850e38e69558b190765ef4b0ffe4adfa97b Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 31 Jan 2024 18:01:10 +0900 Subject: [PATCH 079/122] fix: set branch on update --- dzgui.sh | 14 +++++++------- helpers/funcs | 2 +- helpers/ui.py | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index f6697a2..9eed3ed 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-44 +version=5.0.0.rc-45 #CONSTANTS aid=221100 @@ -548,25 +548,25 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="9411e901a8572568ab129a4fe472a0a3" + ["ui.py"]="6c6e024633f37915d010bc745fecdf7e" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="722834d7fa7aa60a2cf7f5b7350c5675" + ["funcs"]="609cfc212219f43af70cd86e7cf87c8f" ) local author="aclist" local repo="dztui" - local branch="$branch" - #TODO: update to 'dzgui' for first time setup - [[ -z $branch ]] && branch="testing" + local realbranch local file local sum local full_path + [[ -z $branch ]] && realbranch="dzgui" + [[ $branch == "testing" ]] && realbranch="$branch" for i in "${!sums[@]}"; do file="$i" sum="${sums[$i]}" full_path="$helpers_path/$file" - url="https://raw.githubusercontent.com/$author/$repo/$branch/helpers/$file" + url="https://raw.githubusercontent.com/$author/$repo/$realbranch/helpers/$file" echo "$url" >> $HOME/log if [[ -f "$full_path" ]] && [[ $(get_hash "$full_path") == $sum ]]; then logger INFO "$file is current" diff --git a/helpers/funcs b/helpers/funcs index cc58af6..9e3c2fe 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-44 +version=5.0.0.rc-45 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 56f7104..3a95431 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.44 +# 5.0.0-rc.45 app_name = "DZGUI" cache = {} From dfa70ed3b2c623dcfd6d2b4894b7a7aa90367235 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 31 Jan 2024 18:03:20 +0900 Subject: [PATCH 080/122] docs: update changelog --- CHANGELOG.md | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c585451..75361a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,30 @@ # Changelog -## [5.0.0] 2024-01-29 +## [5.0.0] 2024-01-31 ### Added -- Test +- Context switching: navigate to different pages using side buttons +- Dynamic statusbar: updates metadata and server distance when selecting rows +- Show server-side modlist and allow jumping to Steam Workshop pages to browse, and list whether mod is currently installed +- Print debug logs in-app (Help > Show debug log) +- Functionality to change API keys in-app (used when revoking old API keys) +- Print atomic mod sizes when listing installed mods +- Dialogs show direct links to API key management URLs when changing API keys +- Toggle dry-run mode directly from server browser +- Extensive keybindings for fully controlling the application without the mouse +- Extensive pre-boot sanity checks +- Keybinding help dialog in main menu +- Right-click context menus in server browsers/mod list: add/remove from favorites, show server-side mods, delete mod, copy server IP to clipboard + +### Changed +- Utilize GTK bindings and MVC paradigm for UI creation and data flow +- Filter servers dynamically from within server browser +- Performance and security improvements to DZGUI helper files + +### Fixed +- First-time setup dialogs respawning repeatedly in certain scenarios +- Issues with Steam client switching to the wrong page when using auto-mod install +- Set text input module correctly when launching on Steam Deck +- Separate current/total player count and use proper integer sort method in table ## [4.1.1] 2023-12-18 ### Fixed From eeffd3a29376077a29e25636e55de624260b3a3d Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 31 Jan 2024 18:06:03 +0900 Subject: [PATCH 081/122] fix: set real branch correctly --- dzgui.sh | 15 ++++++++++----- helpers/funcs | 2 +- helpers/ui.py | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 9eed3ed..26b6dcd 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-45 +version=5.0.0.rc-46 #CONSTANTS aid=221100 @@ -548,10 +548,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="6c6e024633f37915d010bc745fecdf7e" + ["ui.py"]="a96a6180ac7ddccf4d37ec3dbdbe9c90" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="609cfc212219f43af70cd86e7cf87c8f" + ["funcs"]="7b4a5388ece7f723d2d3bbc08bbc3187" ) local author="aclist" local repo="dztui" @@ -559,8 +559,13 @@ fetch_helpers_by_sum(){ local file local sum local full_path - [[ -z $branch ]] && realbranch="dzgui" - [[ $branch == "testing" ]] && realbranch="$branch" + + # first time setup + if [[ -z $branch ]]; then + realbranch="dzgui" + else + realbranch="$branch" + fi for i in "${!sums[@]}"; do file="$i" diff --git a/helpers/funcs b/helpers/funcs index 9e3c2fe..844d5ca 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-45 +version=5.0.0.rc-46 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 3a95431..1e74f48 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.45 +# 5.0.0-rc.46 app_name = "DZGUI" cache = {} From e6d62c94fa2b9ebf3dc5d06ef770030f99dbdece Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 31 Jan 2024 18:07:47 +0900 Subject: [PATCH 082/122] chore: drop check news --- dzgui.sh | 18 +++--------------- helpers/funcs | 2 +- helpers/ui.py | 2 +- 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 26b6dcd..6e59616 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-46 +version=5.0.0.rc-47 #CONSTANTS aid=221100 @@ -474,18 +474,6 @@ stale_symlinks(){ unlink $l done } -check_news(){ - [[ $branch == "stable" ]] && news_url="$stable_url/news" - [[ $branch == "testing" ]] && news_url="$testing_url/news" - local result=$(curl -Ls "$news_url") - local sum=$(<<< "$result" md5sum | awk '{print $1}') - if [[ $sum != "$seen_news" ]]; then - logger WARN "Local news checksum '$seen_news' != '$sum'" - seen_news="$sum" - update_config - echo "$result" - fi -} local_latlon(){ if [[ -z $(command -v dig) ]]; then local local_ip=$(curl -Ls "https://ipecho.net/plain") @@ -548,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="a96a6180ac7ddccf4d37ec3dbdbe9c90" + ["ui.py"]="aae6bd048bc4786a914c3ed45bef82da" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="7b4a5388ece7f723d2d3bbc08bbc3187" + ["funcs"]="6f853f3f0fa838ce731f203dddb22702" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 844d5ca..5193f8e 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-46 +version=5.0.0.rc-47 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 1e74f48..e4aa96e 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.46 +# 5.0.0-rc.47 app_name = "DZGUI" cache = {} From 7d86af03f17a56f80130d9087ba20d6adbdb3f12 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 31 Jan 2024 18:52:33 +0900 Subject: [PATCH 083/122] fix: variable name --- dzgui.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 6e59616..e58f3c5 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -259,8 +259,8 @@ Type=Application Terminal=false Exec=$share_path/dzgui.sh Name=$app_name_upper -Comment=$appname -Icon=$share_path/$appname +Comment=$app_name +Icon=$share_path/$app_name Categories=Game END } @@ -272,9 +272,9 @@ freedesktop_dirs(){ for i in dzgui grid.png hero.png logo.png; do curl -s "$img_url/$i" > "$share_path/$i" done - write_desktop_file > "$freedesktop_path/$appname.desktop" + write_desktop_file > "$freedesktop_path/$app_name.desktop" [[ $is_steam_deck -eq 0 ]] && return - write_desktop_file > "$HOME/Desktop/$appname.desktop" + write_desktop_file > "$HOME/Desktop/$app_name.desktop" } legacy_vars(){ local suffix="fav" @@ -313,7 +313,7 @@ check_version(){ version_url="$testing_url/dzgui.sh" fi local upstream=$(curl -Ls "$version_url" | awk -F= '/^version=/ {print $2}') - [[ ! -f "$freedesktop_path/$appname.desktop" ]] && freedesktop_dirs + [[ ! -f "$freedesktop_path/$app_name.desktop" ]] && freedesktop_dirs if [[ $version == $upstream ]]; then logger INFO "Local version is same as upstream" check_unmerged From 71757fe98243fd5ce6f70355a1176d8b2b111e3f Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 31 Jan 2024 19:09:26 +0900 Subject: [PATCH 084/122] fix: print message when adding record --- dzgui.sh | 6 +++--- helpers/funcs | 3 ++- helpers/ui.py | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index e58f3c5..0437df4 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-47 +version=5.0.0.rc-48 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="aae6bd048bc4786a914c3ed45bef82da" + ["ui.py"]="198578bad93a68b6dbc36d3545d0c445" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="6f853f3f0fa838ce731f203dddb22702" + ["funcs"]="9384522c45e7e9d78e872c540e5121ab" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 5193f8e..7703b06 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-47 +version=5.0.0.rc-48 #CONSTANTS aid=221100 @@ -737,6 +737,7 @@ add_to_favs(){ ip_list+=("$record") update_config logger INFO "Added the record $record to saved servers" + printf "Added %s to saved servers" $record return 90 } remove_from_history(){ diff --git a/helpers/ui.py b/helpers/ui.py index e4aa96e..cdaa9c0 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.47 +# 5.0.0-rc.48 app_name = "DZGUI" cache = {} From 73a990cafc34e09bad5d21e2d6ac87fea4dcee8b Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 31 Jan 2024 19:31:48 +0900 Subject: [PATCH 085/122] chore: update warning message --- dzgui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index 0437df4..efbb673 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -130,7 +130,7 @@ test_gobject(){ python3 -c "import gi" if [[ ! $? -eq 0 ]]; then logger CRITICAL "Missing PyGObject" - fdialog "Requires PyGObject" + fdialog "Requires PyGObject (python3-gobject)" exit 1 fi logger INFO "Found PyGObject in Python env" From 131fa6c82476674049206431d5d59bbcfd3794ec Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Thu, 1 Feb 2024 05:38:22 +0900 Subject: [PATCH 086/122] chore: backports --- dzgui.sh | 8 ++++---- helpers/funcs | 4 ++-- helpers/ui.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index efbb673..44c2281 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-48 +version=5.1.0-rc.1 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="198578bad93a68b6dbc36d3545d0c445" + ["ui.py"]="79e577bd18ba3872bbea87c8a23bd71c" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="9384522c45e7e9d78e872c540e5121ab" + ["funcs"]="3cc74e21055f9714e469520b12fe665e" ) local author="aclist" local repo="dztui" @@ -631,7 +631,7 @@ find_default_path(){ -o -path "/sys" -o -path "/etc" -o -path "/var" -o -path "/lost+found" \) -prune \ -o -regex ".*/Steam/ubuntu12_32$" -print -quit 2>/dev/null | sed 's@/ubuntu12_32@@') } - if [[ $is_steam_deck -eq 1 ]]; then + if [[ $is_steam_deck -gt 0 ]]; then default_steam_path="$HOME/.local/share/Steam" logger INFO "Set default Steam path to $default_steam_path" return 0 diff --git a/helpers/funcs b/helpers/funcs index 7703b06..f342957 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.0.0.rc-48 +version=5.1.0-rc.1 #CONSTANTS aid=221100 @@ -1227,7 +1227,7 @@ concat_mods(){ done | tr -d '\n' | perl -ple 'chop' } is_dayz_running(){ - local proc=$(ps aux | grep "DayZ.*\.exe" | grep -v grep) + local proc=$(ps aux | grep "DayZ_x64.exe" | grep -v grep) if [[ -n $proc ]]; then echo 1 else diff --git a/helpers/ui.py b/helpers/ui.py index cdaa9c0..64a86e9 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.0.0-rc.48 +# 5.1.0.rc-1 app_name = "DZGUI" cache = {} From 2da5d0936bd2a8c2463b9e1a0c85cdff51dd72b8 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 10 Feb 2024 18:35:49 +0900 Subject: [PATCH 087/122] chore: backports --- dzgui.sh | 6 +++--- helpers/funcs | 4 ++-- helpers/ui.py | 2 +- news | 1 - 4 files changed, 6 insertions(+), 7 deletions(-) delete mode 100644 news diff --git a/dzgui.sh b/dzgui.sh index 44c2281..3c712c0 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.1.0-rc.1 +version=5.2.0-rc.1 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="79e577bd18ba3872bbea87c8a23bd71c" + ["ui.py"]="b3b5e5917a74317bb19578d961944c6b" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="3cc74e21055f9714e469520b12fe665e" + ["funcs"]="c6b751e3d6c4bee40197f86425b45258" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index f342957..acfd8d0 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.1.0-rc.1 +version=5.2.0-rc.1 #CONSTANTS aid=221100 @@ -36,7 +36,7 @@ versions_file="$state_path/$prefix.versions" lock_file="$state_path/$prefix.lock" #CACHE -cache_dir="$HOME/.cache/$appname" +cache_dir="$HOME/.cache/$app_name" _cache_servers="$cache_dir/$prefix.servers" _cache_my_servers="$cache_dir/$prefix.my_servers" _cache_history="$cache_dir/$prefix.history" diff --git a/helpers/ui.py b/helpers/ui.py index 64a86e9..adc06af 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.1.0.rc-1 +# 5.2.0.rc-1 app_name = "DZGUI" cache = {} diff --git a/news b/news deleted file mode 100644 index 386f0c1..0000000 --- a/news +++ /dev/null @@ -1 +0,0 @@ -NEWS: Added support for LAN servers and restored Steam Deck Game Mode support. See changelog. From a5b565bcb9c9b03efe62ac8002f638c263d075a4 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 10 Feb 2024 18:36:31 +0900 Subject: [PATCH 088/122] chore: update image --- images/example.png | Bin 295831 -> 460709 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/example.png b/images/example.png index eb874d14154f212083555d392474f5012554acd1..307293dfcc249360fb0ea03d4692ddc8ac893d96 100644 GIT binary patch literal 460709 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 z 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

A0Nj!@K2!4Z=BPT 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

lj52xR5`tXoj4nu4}hUBrQg10M= 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 D{;~@a literal 295831 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 r@a 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]?379!59F6 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/p@(aZ@LcX6%rYx?sL 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 From f3c67f08ac7c8704cf488781031d20adb782e2ba Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Thu, 22 Feb 2024 10:55:04 +0900 Subject: [PATCH 089/122] fix: drop extraneous log file --- dzgui.sh | 7 +++---- helpers/funcs | 2 +- helpers/ui.py | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 3c712c0..6c00fac 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.2.0-rc.1 +version=5.2.0-rc.2 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="b3b5e5917a74317bb19578d961944c6b" + ["ui.py"]="b24d91c66498d874f4a611f806fdc41b" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="c6b751e3d6c4bee40197f86425b45258" + ["funcs"]="cf0dbd17948bf3ea3888bf829f116acf" ) local author="aclist" local repo="dztui" @@ -560,7 +560,6 @@ fetch_helpers_by_sum(){ sum="${sums[$i]}" full_path="$helpers_path/$file" url="https://raw.githubusercontent.com/$author/$repo/$realbranch/helpers/$file" - echo "$url" >> $HOME/log if [[ -f "$full_path" ]] && [[ $(get_hash "$full_path") == $sum ]]; then logger INFO "$file is current" else diff --git a/helpers/funcs b/helpers/funcs index acfd8d0..74f83f7 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.2.0-rc.1 +version=5.2.0-rc.2 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index adc06af..83cf33e 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.2.0.rc-1 +# 5.2.0.rc-2 app_name = "DZGUI" cache = {} From 4e2c2ea571adb80ed772d25029b0dc6e45c7f6c9 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 10 Mar 2024 16:29:47 +0900 Subject: [PATCH 090/122] feat: auto mod install --- dzgui.sh | 6 +++--- helpers/funcs | 8 ++++---- helpers/ui.py | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 6c00fac..e2bb0a3 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.2.0-rc.2 +version=5.2.0-rc.3 #CONSTANTS aid=221100 @@ -536,10 +536,10 @@ fetch_dzq(){ fetch_helpers_by_sum(){ declare -A sums sums=( - ["ui.py"]="b24d91c66498d874f4a611f806fdc41b" + ["ui.py"]="7bfed0b2f9aa5ca92b299ba81dbb3f34" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="cf0dbd17948bf3ea3888bf829f116acf" + ["funcs"]="c4a7fc048c58a2d20181591b06b836ad" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 74f83f7..10ed50d 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.2.0-rc.2 +version=5.2.0-rc.3 #CONSTANTS aid=221100 @@ -1031,7 +1031,7 @@ try_connect(){ fi case $auto_install in "") manual_mod_install "$ip" "$gameport" "$diff" "$sanitized_mods";; - 1|2) auto_mod_install "$ip" "$gameport" "$diff" "$sanitized_mods" ;; + 1|2) manual_mod_install "$ip" "$gameport" "$diff" "$sanitized_mods" ;; esac else launch "$ip" "$gameport" "$sanitized_mods" @@ -1289,8 +1289,8 @@ manual_mod_install(){ [[ -f $ex ]] && return 1 log ${stage_mods[$i]} - $steam_cmd "steam://url/CommunityFilePage/${stage_mods[$i]}" - echo "# Opening workshop page for ${stage_mods[$i]}. If you see no progress after subscribing, try unsubscribing and resubscribing again until the download commences." + $steam_cmd "steam://url/CommunityFilePage/${stage_mods[$i]}+workshop_download_item 221100 ${stage_mods[$i]}" + echo "# Opening workshop page for ${stage_mods[$i]}" sleep 1s foreground diff --git a/helpers/ui.py b/helpers/ui.py index 83cf33e..737b123 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.2.0.rc-2 +# 5.2.0.rc-3 app_name = "DZGUI" cache = {} From d0961fddb61e47da8e301ef9a641e94d06a6223b Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 12 Mar 2024 02:29:24 +0900 Subject: [PATCH 091/122] fix: branch selection logic --- dzgui.sh | 7 ++++--- helpers/funcs | 2 +- helpers/ui.py | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index e2bb0a3..ae22ad0 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.2.0-rc.3 +version=5.2.0-rc.4 #CONSTANTS aid=221100 @@ -534,12 +534,13 @@ fetch_dzq(){ logger INFO "Updated DZQ to sha '$sha'" } fetch_helpers_by_sum(){ + source "$config_file" declare -A sums sums=( - ["ui.py"]="7bfed0b2f9aa5ca92b299ba81dbb3f34" + ["ui.py"]="44a88b196ea9d65b429525cf0bad66b6" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="c4a7fc048c58a2d20181591b06b836ad" + ["funcs"]="e4bd26a95060e57582cda046b2302658" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index 10ed50d..f8e6768 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.2.0-rc.3 +version=5.2.0-rc.4 #CONSTANTS aid=221100 diff --git a/helpers/ui.py b/helpers/ui.py index 737b123..c853539 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -16,7 +16,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.2.0.rc-3 +# 5.2.0.rc-4 app_name = "DZGUI" cache = {} From b9872fbb74028f7d84af6b289596a4c60ea0baf7 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 13 Mar 2024 21:24:56 +0900 Subject: [PATCH 092/122] feat: resizable columns --- dzgui.sh | 6 +-- helpers/funcs | 55 ++++++++++++++++++------ helpers/ui.py | 113 ++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 146 insertions(+), 28 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index ae22ad0..1bdc2d1 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.2.0-rc.4 +version=5.1.0-rc.4 #CONSTANTS aid=221100 @@ -537,10 +537,10 @@ fetch_helpers_by_sum(){ source "$config_file" declare -A sums sums=( - ["ui.py"]="44a88b196ea9d65b429525cf0bad66b6" + ["ui.py"]="9b7fddbb8d40818b74c23b0f038ac613" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="e4bd26a95060e57582cda046b2302658" + ["funcs"]="a03224d2085767d8531cacb2dfb21f03" ) local author="aclist" local repo="dztui" diff --git a/helpers/funcs b/helpers/funcs index f8e6768..7bb7806 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.2.0-rc.4 +version=5.1.0-rc.4 #CONSTANTS aid=221100 @@ -111,6 +111,7 @@ declare -A funcs=( ["list_mods"]="list_mods" ["delete"]="delete_local_mod" ["show_server_modlist"]="show_server_modlist" +["test_ping"]="test_ping" ["is_in_favs"]="is_in_favs" ["show_log"]="show_log" ["gen_log"]="generate_log" @@ -560,13 +561,22 @@ dump_servers(){ filter_servers "$file" "$@" } logger(){ - local date="$(date "+%F %T,%3N")" - local tag="$1" - local string="$2" + local date="$(date "+%F %T,%3N")" + local tag="$1" + local string="$2" local self="${BASH_SOURCE[0]}" local caller="${FUNCNAME[1]}" local line="${BASH_LINENO[0]}" - printf "%s␞%s␞%s::%s()::%s␞%s\n" "$date" "$tag" "$self" "$caller" "$line" "$string" >> "$debug_log" + printf "%s␞%s␞%s::%s()::%s␞%s\n" "$date" "$tag" "$self" "$caller" "$line" "$string" >> "$debug_log" +} +test_ping(){ + shift + local ip="$1" + local qport="$2" + local res + res=$(ping -c1 -4 -W0.5 $1 | grep time= | awk -F= '{print $4}') + [[ ! $? -eq 0 ]] && res="Unreachable" + printf "%s" "$res" } show_server_modlist(){ shift @@ -1023,6 +1033,7 @@ try_connect(){ if [[ -n $auto_install ]]; then logger INFO "Merging modlists" diff=$(merge_modlists "$diff") + diff=$(query_defunct "$diff") fi if [[ -n $diff ]]; then if [[ $(check_architecture) -eq 1 ]] && [[ $(test_display_mode) == "gm" ]]; then @@ -1031,7 +1042,7 @@ try_connect(){ fi case $auto_install in "") manual_mod_install "$ip" "$gameport" "$diff" "$sanitized_mods";; - 1|2) manual_mod_install "$ip" "$gameport" "$diff" "$sanitized_mods" ;; + 1|2) manual_mod_install "$ip" "$gameport" "$diff" "$sanitized_mods" "auto" ;; esac else launch "$ip" "$gameport" "$sanitized_mods" @@ -1113,9 +1124,8 @@ force_update(){ fi rm "$versions_file" local update=$(check_timestamps) - console_dl "$update" && - $steam_cmd steam://open/downloads - echo "Finished requesting mod updates. Steam may have some mods pending for download." + manual_mod_install "null" "null" "$update" "null" "force" + echo "Finished requesting mod updates." return 0 } console_dl(){ @@ -1279,6 +1289,7 @@ manual_mod_install(){ local gameport="$2" local diff="$3" local sanitized_mods="$4" + local mode="$5" local ex="$state_path/dzg.watcher" readarray -t stage_mods <<< "$diff" @@ -1289,8 +1300,13 @@ manual_mod_install(){ [[ -f $ex ]] && return 1 log ${stage_mods[$i]} - $steam_cmd "steam://url/CommunityFilePage/${stage_mods[$i]}+workshop_download_item 221100 ${stage_mods[$i]}" - echo "# Opening workshop page for ${stage_mods[$i]}" + if [[ $mode == "auto" ]] || [[ $mode == "force" ]]; then + $steam_cmd "steam://url/CommunityFilePage/${stage_mods[$i]}+workshop_download_item $aid ${stage_mods[$i]}" + echo "# Opening workshop page for ${stage_mods[$i]}" + else + $steam_cmd "steam://url/CommunityFilePage/${stage_mods[$i]}" + echo "# Opening workshop page for ${stage_mods[$i]}. If you see no progress after subscribing, try unsubscribing and resubscribing again until the download commences." + fi sleep 1s foreground @@ -1303,7 +1319,11 @@ manual_mod_install(){ done foreground - echo "# Steam is downloading ${stage_mods[$i]} (mod $((i+1)) of ${#stage_mods[@]})" + if [[ $mode == "auto" ]] || [[ $mode == "force" ]]; then + echo "# Steam is downloading ${stage_mods[$i]} (mod $((i+1)) of ${#stage_mods[@]}). You do not need to manually Subscribe." + else + echo "# Steam is downloading ${stage_mods[$i]} (mod $((i+1)) of ${#stage_mods[@]})" + fi until [[ -d $workshop_dir/${stage_mods[$i]} ]]; do [[ -f $ex ]] && return 1 sleep 0.1s @@ -1316,9 +1336,18 @@ manual_mod_install(){ } _watcher > >($steamsafe_zenity --pulsate --progress --auto-close --title="DZG Watcher" --width=500 2>/dev/null; rc=$?; [[ $rc -eq 1 ]] && touch $ex) - # compare latest installed mods to modlist + if [[ $mode == "force" ]]; then + rm "$versions_file" + check_timestamps + return 0 + fi + local diff=$(compare "$sanitized_mods") if [[ -z $diff ]]; then + if [[ $mode == "auto" ]]; then + rm "$versions_file" + check_timestamps + fi launch "$ip" "$gameport" "$sanitized_mods" else printf "User aborted download process, or some mods may have failed to download. Try connecting again to resync." diff --git a/helpers/ui.py b/helpers/ui.py index c853539..3878fdc 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -1,5 +1,6 @@ import csv import gi +import json import locale import logging import os @@ -16,7 +17,7 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.2.0.rc-4 +# 5.1.0.rc-4 app_name = "DZGUI" cache = {} @@ -47,6 +48,7 @@ state_path = '%s/.local/state/dzgui' %(user_path) helpers_path = '%s/.local/share/dzgui/helpers' %(user_path) log_path = '%s/logs' %(state_path) changelog_path = '%s/CHANGELOG.md' %(state_path) +geometry_path = '%s/dzg.cols.json' %(state_path) funcs = '%s/funcs' %(helpers_path) logger = logging.getLogger(__name__) @@ -147,7 +149,7 @@ status_tooltip = { "Change player name": "Update your in-game name (required by some servers)", "Change Steam API key": "Can be used if you revoked an old API key", "Change Battlemetrics API key": "Can be used if you revoked an old API key", - "Force update local mods": "Attempts to update any local mods out of synch with remote versions (experimental)", + "Force update local mods": "Synchronize the signatures of all local mods with remote versions (experimental)", "Output system info to log file": "Generates a system log for troubleshooting", "View changelog": "Opens the DZGUI changelog in a dialog window", "Show debug log": "Read the DZGUI log generated since startup", @@ -159,6 +161,10 @@ status_tooltip = { } +def format_ping(ping): + ms = " | Ping: %s" %(ping) + return ms + def format_distance(distance): if distance == "Unknown": distance = "| Distance: %s" %(distance) @@ -610,11 +616,13 @@ class CalcDist(multiprocessing.Process): def run(self): if self.addr in cache: logger.info("Address '%s' already in cache" %(self.addr)) - self.result_queue.put([self.addr, cache[self.addr]]) + self.result_queue.put([self.addr, cache[self.addr][0], cache[self.addr][1]]) return proc = call_out(self.widget, "get_dist", self.ip) + proc2 = call_out(self.widget, "test_ping", self.ip) km = proc.stdout - self.result_queue.put([self.addr, km]) + ping = proc2.stdout + self.result_queue.put([self.addr, km, ping]) class TreeView(Gtk.TreeView): @@ -784,9 +792,10 @@ class TreeView(Gtk.TreeView): if addr is None: return if addr in cache: - dist = format_distance(cache[addr]) + dist = format_distance(cache[addr][0]) + ping = format_ping(cache[addr][1]) - tooltip = server_tooltip[0] + dist + tooltip = server_tooltip[0] + dist + ping grid.update_statusbar(tooltip) return self.emit("on_distcalc_started") @@ -873,6 +882,8 @@ class TreeView(Gtk.TreeView): right_panel.set_filter_visibility(True) dialog.destroy() self.grab_focus() + for column in self.get_columns(): + column.connect("notify::width", self._on_col_width_changed) grid = self.get_outer_grid() right_panel = grid.right_panel @@ -911,6 +922,33 @@ class TreeView(Gtk.TreeView): total_mods = result[1] GLib.idle_add(load) + def _on_col_width_changed(self, col, width): + + def write_json(title, size): + data = {"cols": { title: size } } + j = json.dumps(data, indent=2) + with open(geometry_path, "w") as outfile: + outfile.write(j) + logger.info("Wrote initial column widths to '%s'" %(geometry_path)) + + title = col.get_title() + size = col.get_width() + if "Name" in title: + title = "Name" + + if os.path.isfile(geometry_path): + with open(geometry_path, "r") as infile: + try: + data = json.load(infile) + data["cols"][title] = size + with open(geometry_path, "w") as outfile: + outfile.write(json.dumps(data, indent=2)) + except json.decoder.JSONDecodeError: + logger.critical("JSON decode error in '%s'" %(geometry_path)) + write_json(title, size) + else: + write_json(title, size) + def _update_multi_column(self, mode): # Local server lists may have different filter toggles from remote list # FIXME: tree selection updates twice here. attach signal later @@ -919,14 +957,35 @@ class TreeView(Gtk.TreeView): for column in self.get_columns(): self.remove_column(column) row_store.clear() + + if os.path.isfile(geometry_path): + with open(geometry_path, "r") as infile: + try: + data = json.load(infile) + valid_json = True + except json.decoder.JSONDecodeError: + logger.critical("JSON decode error in '%s'" %(geometry_path)) + valid_json = False + else: + valid_json = False + for i, column_title in enumerate(browser_cols): renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer, text=i) + column.set_resizable(True) column.set_sort_column_id(i) - if ("Name" in column_title): - column.set_fixed_width(800) - if (column_title == "Map"): - column.set_fixed_width(300) + + if valid_json: + if "Name" in column_title: + column_title = "Name" + saved_size = data["cols"][column_title] + column.set_fixed_width(saved_size) + else: + if ("Name" in column_title): + column.set_fixed_width(800) + if (column_title == "Map"): + column.set_fixed_width(300) + self.append_column(column) self.update_first_col(mode) @@ -1282,6 +1341,32 @@ def KeysDialog(parent, text, mode): return dialog +class PingDialog(GenericDialog): + def __init__(self, parent, text, mode, record): + super().__init__(parent, text, mode) + dialogBox = self.get_content_area() + self.set_default_response(Gtk.ResponseType.OK) + self.set_size_request(500, 200) + wait_dialog = GenericDialog(parent, "Checking ping", "WAIT") + wait_dialog.show_all() + thread = threading.Thread(target=self._background, args=(wait_dialog, parent, record)) + thread.start() + + def _background(self, dialog, parent, record): + def _load(): + dialog.destroy() + self.show_all() + ping = data.stdout + self.format_secondary_text("Ping to remote server: %s" %(ping)) + res = self.run() + self.destroy() + + addr = record.split(':') + ip = addr[0] + qport = addr[2] + data = call_out(parent, "test_ping", ip, qport) + GLib.idle_add(_load) + class ModDialog(GenericDialog): def __init__(self, parent, text, mode, record): super().__init__(parent, text, mode) @@ -1453,9 +1538,13 @@ class Grid(Gtk.Grid): if latest_result is not None: addr = latest_result[0] km = latest_result[1] - cache[addr] = km + ping = latest_result[2] + + cache[addr] = km, ping + + ping = format_ping(ping) dist = format_distance(km) - tooltip = server_tooltip[1] = server_tooltip[0] + dist + tooltip = server_tooltip[1] = server_tooltip[0] + dist + ping self.update_statusbar(tooltip) return True From 678f1143c5d89ada65cda2203317de5d6a0e5e52 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 13 Mar 2024 22:59:52 +0900 Subject: [PATCH 093/122] docs: update changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75361a2..4c3e085 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [5.1.0] +### Added +- Make columns in the server browser user-resizable (affects Server Browser, My Servers, and Recent Servers) +- Save dragged position of user-resized columns +- Display ping to server in statusbar + +### Fixed +- Fixed a rare scenario in Auto Mod Install Mode where defunct mods (mods no longer available on Steam) would try to be downloaded if the user had previously downloaded the mod + ## [5.0.0] 2024-01-31 ### Added - Context switching: navigate to different pages using side buttons From e11b743cdff3ced8b1e9cf33a7e67a776420b3f5 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Thu, 21 Mar 2024 23:59:55 +0900 Subject: [PATCH 094/122] feat: backports --- CHANGELOG.md | 16 +++++++++++-- dzgui.sh | 9 +++++--- helpers/funcs | 17 +++++++++++--- helpers/ui.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 90 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c3e085..8bfc35b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,22 @@ # Changelog -## [5.1.0] +## [5.2.0] 2024-03-21 +### Added +- Refresh player count for active row: invoke via right-click context meu or directly with the Ctrl-r hotkey. This feature has a 30 second global cooldown to prevent throttling. + +### Fixed +- Improve case-insensitive keyword search to be portable across awk versions (previous version required gawk) +- Fixed a dialog string from being shown twice when adding a server to favorites via context menus + +## [5.1.1] 2024-03-18 +### Fixed +- Hotfix for remote helper files not being fetched correctly + +## [5.1.0] 2024-03-18 ### Added - Make columns in the server browser user-resizable (affects Server Browser, My Servers, and Recent Servers) - Save dragged position of user-resized columns -- Display ping to server in statusbar +- Display ping to server in statusbar: by popular request, added the ability to visualize both distance to server and round-trip latency (ping), at the cost of a small calculation delay. Please leave feedback regarding whether this feature feels fast/responsive enough. ### Fixed - Fixed a rare scenario in Auto Mod Install Mode where defunct mods (mods no longer available on Steam) would try to be downloaded if the user had previously downloaded the mod diff --git a/dzgui.sh b/dzgui.sh index 1bdc2d1..eedf9c4 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.1.0-rc.4 +version=5.2.1.rc.1 #CONSTANTS aid=221100 @@ -537,10 +537,10 @@ fetch_helpers_by_sum(){ source "$config_file" declare -A sums sums=( - ["ui.py"]="9b7fddbb8d40818b74c23b0f038ac613" + ["ui.py"]="d2e78f73933ac945d745a3d822ca89e7" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="a03224d2085767d8531cacb2dfb21f03" + ["funcs"]="3701877b85bc853be3f89d59fe1a6bbe" ) local author="aclist" local repo="dztui" @@ -555,6 +555,9 @@ fetch_helpers_by_sum(){ else realbranch="$branch" fi + if [[ $realbranch == "stable" ]]; then + realbranch="dzgui" + fi for i in "${!sums[@]}"; do file="$i" diff --git a/helpers/funcs b/helpers/funcs index 7bb7806..e725ae2 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.1.0-rc.4 +version=5.2.1.rc-1 #CONSTANTS aid=221100 @@ -121,8 +121,20 @@ declare -A funcs=( ["Remove from history"]="remove_from_history" ["force_update"]="force_update" ["Handshake"]="final_handshake" +["get_player_count"]="get_player_count" ) +get_player_count(){ + shift + local res + local ip="$1" + local qport="$2" + res=$(a2s $ip $qport info) + [[ ! $? -eq 0 ]] && return 1 + local players="$(<<< $res jq -r '.[].players')" + printf "%s" "$players" +} + validate_and_connect(){ local context="$1" local addr="$2" @@ -447,7 +459,7 @@ filter_servers(){ } filter_keyword(){ keyword=$(sanitize "$keyword") - <<< "$filtered" KEYWORD="$keyword" awk -F$separator 'BEGIN{IGNORECASE=1} $0 ~ ENVIRON["KEYWORD"] {print $0}' + <<< "$filtered" awk -F$separator -v keyword="$keyword" 'tolower($0) ~ tolower(keyword)' } filter_duplicates(){ if [[ ${filters[*]} =~ Duplicate ]]; then @@ -787,7 +799,6 @@ update_favs_from_table(){ echo "Removed $record from saved servers" else add_to_favs "$record" - echo "Added $record to saved servers" fi return 0 } diff --git a/helpers/ui.py b/helpers/ui.py index 3878fdc..cf31a17 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -3,10 +3,11 @@ import gi import json import locale import logging -import os -import signal +import math import multiprocessing +import os import re +import signal import subprocess import sys import textwrap @@ -17,9 +18,11 @@ locale.setlocale(locale.LC_ALL, '') gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.1.0.rc-4 +# 5.2.1.rc-1 app_name = "DZGUI" +start_time = 0 + cache = {} config_vals = [] stored_keys = [] @@ -691,6 +694,8 @@ class TreeView(Gtk.TreeView): ip = addr.split(':')[0] record = "%s:%s" %(ip, qport) self.clipboard.set_text(record, -1) + case "Refresh player count": + self.refresh_player_count() case "Show server-side mods": record = "%s:%s" %(self.get_column_at_index(6), self.get_column_at_index(7)) dialog = ModDialog(parent, "Enter/double click a row to open in Steam Workshop. ESC exits this dialog", "Modlist", record) @@ -729,9 +734,9 @@ class TreeView(Gtk.TreeView): self.menu = Gtk.Menu() mod_context_items = ["Open in Steam Workshop", "Delete mod"] - subcontext_items = {"Server browser": ["Add to my servers", "Copy IP to clipboard", "Show server-side mods"], - "My saved servers": ["Remove from my servers", "Copy IP to clipboard", "Show server-side mods"], - "Recent servers": ["Remove from history", "Copy IP to clipboard", "Show server-side mods"], + subcontext_items = {"Server browser": ["Add to my servers", "Copy IP to clipboard", "Show server-side mods", "Refresh player count"], + "My saved servers": ["Remove from my servers", "Copy IP to clipboard", "Show server-side mods", "Refresh player count"], + "Recent servers": ["Remove from history", "Copy IP to clipboard", "Show server-side mods", "Refresh player count"], } # submenu hierarchy https://stackoverflow.com/questions/52847909/how-to-add-a-sub-menu-to-a-gtk-menu if context == "Mod": @@ -760,6 +765,22 @@ class TreeView(Gtk.TreeView): else: self.menu.popup_at_pointer(event) + def refresh_player_count(self): + parent = self.get_outer_window() + + global start_time + then = start_time + now = time.monotonic() + diff = now - then + cooldown = 30 - math.floor(diff) + if ((start_time > 0) and (now - then) < 30): + spawn_dialog(parent, "Global refresh cooldown not met. Wait %s second(s)." %(str(cooldown)), "NOTIFY") + return + start_time = now + + thread = threading.Thread(target=self._background_player_count, args=()) + thread.start() + def get_outer_window(self): win = self.get_parent().get_parent().get_parent() return win @@ -844,6 +865,8 @@ class TreeView(Gtk.TreeView): debug.set_active(True) case Gdk.KEY_l: self._on_button_release(self, event) + case Gdk.KEY_r: + self.refresh_player_count() case Gdk.KEY_f: if self.get_first_col() == "Mod": return @@ -874,6 +897,32 @@ class TreeView(Gtk.TreeView): value = model.get_value(tree_iter, index) return value + def _background_player_count(self): + def _load(): + server_store[path][4] = int(data.stdout) + wait_dialog.destroy() + + parent = self.get_outer_window() + wait_dialog = GenericDialog(parent, "Refreshing player count", "WAIT") + wait_dialog.show_all() + select = self.get_selection() + sels = select.get_selected_rows() + (model, pathlist) = sels + if len(pathlist) < 1: + return + path = pathlist[0] + tree_iter = model.get_iter(path) + addr = server_store[path][6] + qport = server_store[path][7] + ip = addr.split(':')[0] + qport = str(qport) + + data = call_out(self, "get_player_count", ip, qport) + if data.returncode == 1: + wait_dialog.destroy() + return + GLib.idle_add(_load) + def _background(self, dialog, mode): def loadTable(): for map in maps: @@ -1330,6 +1379,7 @@ def KeysDialog(parent, text, mode): Ctrl-f: jump to keyword field Ctrl-m: jump to maps dropdown Ctrl-d: toggle dry run (debug) mode + Ctrl-r: refresh player count for active row 1-9: toggle filter ON/OFF ESC: jump back to main view from keyword/maps """ From bdcd1b651100babd3121a75e9ceb5b06ea7fd061 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 22 Mar 2024 00:00:43 +0900 Subject: [PATCH 095/122] fix: version syntax --- dzgui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index eedf9c4..4acadaf 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.2.1.rc.1 +version=5.2.1-rc.1 #CONSTANTS aid=221100 From e5948ead0283e239f43d1274ab6dfd2cb20a2a3b Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Mon, 1 Apr 2024 17:08:45 +0900 Subject: [PATCH 096/122] fix: auto discovery --- CHANGELOG.md | 7 +++++++ dzgui.sh | 6 +++--- helpers/ui.py | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bfc35b..d55d032 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [5.2.1] 2024-04-01 +### Fixed +- Fixed a regression where where the first-time setup dialog would not trigger auto-path discovery + +### Changed +- Reworded some menus and dialogs for clarity + ## [5.2.0] 2024-03-21 ### Added - Refresh player count for active row: invoke via right-click context meu or directly with the Ctrl-r hotkey. This feature has a 30 second global cooldown to prevent throttling. diff --git a/dzgui.sh b/dzgui.sh index 4acadaf..8717a78 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -130,7 +130,7 @@ test_gobject(){ python3 -c "import gi" if [[ ! $? -eq 0 ]]; then logger CRITICAL "Missing PyGObject" - fdialog "Requires PyGObject (python3-gobject)" + fdialog "Requires PyGObject (python-gobject)" exit 1 fi logger INFO "Found PyGObject in Python env" @@ -537,7 +537,7 @@ fetch_helpers_by_sum(){ source "$config_file" declare -A sums sums=( - ["ui.py"]="d2e78f73933ac945d745a3d822ca89e7" + ["ui.py"]="f98211b1e0a2edc8d2853622d2672ef5" ["query_v2.py"]="1822bd1769ce7d7cb0d686a60f9fa197" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" ["funcs"]="3701877b85bc853be3f89d59fe1a6bbe" @@ -664,7 +664,7 @@ find_default_path(){ $sd_res case "$res" in - *auto*) discover ;; + *auto*) _discover ;; *manual*) zenity --info --text="\nSelect the top-level entry point to the location where Steam (not DayZ)\nis installed and before entering the \"steamapps\" path.\n\nE.g., if Steam is installed at:\n\"/media/mydrive/Steam\"\n\nCorrect:\n- \"/media/mydrive/Steam\"\n\nIncorrect:\n- \"/media/mydrive/Steam/steamapps/common/DayZ\"\n- \"/media/mydrive/\"" --width=500 && file_picker ;; diff --git a/helpers/ui.py b/helpers/ui.py index cf31a17..d1c8a24 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -137,7 +137,7 @@ side_buttons = [ ] status_tooltip = { "Server browser": "Used to browse the global server list", - "My saved servers": "Browse your saved servers", + "My saved servers": "Browse your saved servers. Unreachable/offline servers will be excluded", "Quick-connect to favorite server": "Connect to your favorite server", "Recent servers": "Shows the last 10 servers you connected to (includes attempts)", "Connect by IP": "Connect to a server by IP", From f05010510228f48355713244f3c267b3a53adfc0 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Mon, 1 Apr 2024 17:12:02 +0900 Subject: [PATCH 097/122] docs: update dependencies --- docs/dzgui.adoc | 3 ++- docs/dzgui_dark.adoc | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/dzgui.adoc b/docs/dzgui.adoc index 312c3b6..3c2e61f 100644 --- a/docs/dzgui.adoc +++ b/docs/dzgui.adoc @@ -22,11 +22,12 @@ If not already installed, the below can be found in your system's package manage If any dependencies are missing when the application starts, it will warn you, so you need not take any preemptive measures here. -- `curl` +- `curl` - `jq` - `zenity` - `steam` - `wmctrl` or `xdotool` +- `PyGObject` (`python-gobject`) === Preparation . **Download DZGUI and make it executable:** diff --git a/docs/dzgui_dark.adoc b/docs/dzgui_dark.adoc index 3cc4eb1..ae4ff35 100644 --- a/docs/dzgui_dark.adoc +++ b/docs/dzgui_dark.adoc @@ -27,6 +27,7 @@ If any dependencies are missing when the application starts, it will warn you, s - `zenity` - `steam` - `wmctrl` or `xdotool` +- `PyGObject` (`python-gobject`) === Preparation . **Download DZGUI and make it executable:** From ba3cff4755fd3c499e1d22c347884d876bb2a956 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 2 Apr 2024 11:59:14 +0900 Subject: [PATCH 098/122] docs: correct typo --- docs/dzgui.adoc | 2 +- docs/dzgui_dark.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/dzgui.adoc b/docs/dzgui.adoc index 3c2e61f..49a4113 100644 --- a/docs/dzgui.adoc +++ b/docs/dzgui.adoc @@ -502,5 +502,5 @@ Tracked down several highly obscure but key bugs in the early development of the Played a critical role in the elaboration of many of the features we now take for granted by being an early beta tester who not only reported bugs, but helped workshop and brainstorm various ideas that turned into QOL features. -.Thiughtduck216 +.Thoughtduck216 Contributed extensive beta testing of Steam Deck builds and provided ongoing troubleshooting for Steam Deck users diff --git a/docs/dzgui_dark.adoc b/docs/dzgui_dark.adoc index ae4ff35..54b758c 100644 --- a/docs/dzgui_dark.adoc +++ b/docs/dzgui_dark.adoc @@ -502,5 +502,5 @@ Tracked down several highly obscure but key bugs in the early development of the Played a critical role in the elaboration of many of the features we now take for granted by being an early beta tester who not only reported bugs, but helped workshop and brainstorm various ideas that turned into QOL features. -.Thiughtduck216 +.Thoughtduck216 Contributed extensive beta testing of Steam Deck builds and provided ongoing troubleshooting for Steam Deck users From 73e78257c31b1ad60b90217e98440962b754f66a Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 3 Apr 2024 11:40:51 +0900 Subject: [PATCH 099/122] docs: update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d55d032..0fa2a14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,9 @@ - Improve case-insensitive keyword search to be portable across awk versions (previous version required gawk) - Fixed a dialog string from being shown twice when adding a server to favorites via context menus +### Changed +- Use a more robust method for downloading mods when auto mod install is enabled + ## [5.1.1] 2024-03-18 ### Fixed - Hotfix for remote helper files not being fetched correctly From b9f4e5b6ea129c34869a4d940529ea019ef397f8 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 20 Apr 2024 12:52:47 +0900 Subject: [PATCH 100/122] chore: backports from stable --- CHANGELOG.md | 7 + docs/dzgui.adoc | 485 ++++++++++++++++++++++++------------------ docs/dzgui_dark.adoc | 487 +++++++++++++++++++++++++------------------ dzgui.sh | 9 +- helpers/funcs | 2 +- helpers/ui.py | 2 +- 6 files changed, 589 insertions(+), 403 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fa2a14..ea87f05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [5.2.2] 2024-04-18 +### Added +- Cover artwork/icons for Steam "Recent Games" and tree view + +### Changed +- Updated documentation to the v5.0.0 spec + ## [5.2.1] 2024-04-01 ### Fixed - Fixed a regression where where the first-time setup dialog would not trigger auto-path discovery diff --git a/docs/dzgui.adoc b/docs/dzgui.adoc index 49a4113..a9db6f8 100644 --- a/docs/dzgui.adoc +++ b/docs/dzgui.adoc @@ -2,8 +2,8 @@ :toc: left :stylesheet: custom.css -= DZGUI documentation -DayZ official/community server graphical launcher for Linux | Last updated: {d} += DZGUI documentation (v5.x.x) +DayZ server browser and mod manager for Linux | Last updated: {d} Click https://aclist.github.io/dzgui/dzgui_dark.html[here] for dark mode @@ -22,6 +22,8 @@ If not already installed, the below can be found in your system's package manage If any dependencies are missing when the application starts, it will warn you, so you need not take any preemptive measures here. +All dependencies are installed out of the box on Steam Deck. + - `curl` - `jq` - `zenity` @@ -30,15 +32,16 @@ If any dependencies are missing when the application starts, it will warn you, s - `PyGObject` (`python-gobject`) === Preparation -. **Download DZGUI and make it executable:** +==== Step 1: Download DZGUI and make it executable -Automatic method: generic OS (skip to step 3 below when complete) +**Automatic method: generic OS** + +Invoke the command below from a terminal: ``` curl -s "https://raw.githubusercontent.com/aclist/dztui/dzgui/install.sh" | bash ``` - -Automatic method: nix-based systems (contributed by lelgenio) +**Automatic method: nix-based systems (contributed by lelgenio)** Follow the instructions at https://github.com/lelgenio/dzgui-nix to ingest the package and dependencies into your system using flakes. @@ -50,44 +53,49 @@ git clone https://github.com/aclist/dztui.git chmod +x dzgui.sh ``` -''' -[start=2] -. **Update the `vm.max_map_count` value (see https://www.protondb.com/app/221100)** +==== Step 2: update the vm.max_map_count value + +On most modern distributions, it will seldom be necessary to update this value anymore, since it is set to a sufficiently large number for performance-intensive applications. **Automatic method:** This is handled automatically by DZGUI if you just choose to run the application out of the box. You will be prompted for your sudo password in order to check whether the system map count is too small. This is a one-time check that will not be triggered again once the map count is updated. -If you used the automatic method, you can skip to Step 3 below. [NOTE] -The map count check prompts for a sudo password. If you are using a Steam Deck, this check is not necessary. +If you are using a Steam Deck, this step is not necessary. -This process writes the count to the file `/etc/sysctl.d/dayz.conf`. +The process writes the count to the file `/etc/sysctl.d/dayz.conf`. -If the map count was lower than the threshold, it is updated to 1048576. -If the system map count was already higher, that value is interpolated into this file as a redundancy check. +If the system map count was lower than the threshold, it is updated to `1048576`. +If the system map count was already higher, that value is interpolated into this file for redundancy purposes and to avoid sudo escalation on subsequent launches of the application. [NOTE] If, for reasons unrelated to DayZ, you choose at a later time to raise your system map count higher than it originally was and you find that the count is not sticking, check for the presence of the `dayz.conf` file to see if it is taking precedence and delete it accordingly. -**Ephemeral method:** -the map count will revert after the system is rebooted. +If you used the automatic method, you can skip to <> below. + +**Manual method:** + +If you wish to update this value yourself without intervention from DZGUI, you have two options: + + +Invoke the command below for an **ephemeral change**. Note that if changing the map count on a one-time basis, it will revert to the old value after the system is rebooted. + ``` sudo sysctl -w vm.max_map_count=1048576 ``` -**Persistent method:** +Invoke the command below for a **persistent change**: ``` echo 'vm.max_map_count=1048576' | sudo tee /etc/sysctl.d/dayz.conf ``` -[start=3] -. **Prepare a Steam account with a DayZ license** -. **Enable a Proton version ≥ `6.8` (or use Experimental) in the `Compatibility` field of the game's right-click options.** +==== Step 3: Prepare a Steam account with a DayZ license +Enable a Proton version ≥ `6.8` (or use Proton Experimental) in the `Compatibility` field of the game's right-click options. As of this writing, any recent version of Proton should work, and it is encouraged to use the most recent one. === API key & server IDs @@ -98,107 +106,111 @@ echo 'vm.max_map_count=1048576' | sudo tee /etc/sysctl.d/dayz.conf ==== BattleMetrics API key (optional) -This step is optional. Using this key in conjunction with the above allows you to connect to and query servers by ID instead of by IP. See <>. +This key is optional. Using this key in conjunction with the above allows you to also connect to and query servers by numerical ID instead of by IP. See <>. -1. Register for an API key at https://www.battlemetrics.com/account/register?after=%2Fdevelopers[BattleMetrics] (free) -2. From the **Personal Access Tokens** area, Select **New Token** -3. Give the token any name in the field at the top -4. Leave all options **unchecked** and scroll to the bottom, select **Create Token** +1. Register for an API key at https://www.battlemetrics.com/account/register?after=%2Fdevelopers[BattleMetrics] (free). +2. From the **Personal Access Tokens** area, Select **New Token**. +3. Give the token any name in the field at the top. +4. Leave all options **unchecked** and scroll to the bottom, select **Create Token**. 5. Once configured, you can insert this key in the app when launching it for the first time (optional), or later on when using the connect/query by ID methods in the app for the first time. === First-time launch -0. It is always advised to have Steam running in the background. DayZ is meant to run "on top of" Steam. +It is always advised to have Steam running in the background. DZGUI is meant to run "on top of" Steam, and will warn you if Steam appears to not be running. -1. DZGUI can be launched one of two ways. +DZGUI can be launched one of two ways. -**From the terminal:** +**From a terminal:** ``` ./dzgui.sh ``` -Launching from the terminal gives more verbose information in the event of a crash, and can be a good way of troubleshooting problems. +Launching from a terminal may give more verbose information in the event of a crash, and can be a good way of troubleshooting problems. -**From the shortcut shipped with the application** (if using a desktop environment based on the Freedesktop specification): +**From the shortcut shipped with the application**: -- Located under the "Games" category of your system's applications list. -- Via the "DZGUI" desktop shortcut (Steam Deck only) +If you are using a desktop environment (DE) based on the Freedesktop specification, shortcuts will be installed for you. -[start=2] -2. Follow the menu prompts given by the app. You will be asked to provide: +- One shortcut is located under the "Games" category of your system's applications list. +- The other is accessed via the "DZGUI" desktop icon (Steam Deck only) -- Player name (a generic handle, required by some servers) +After launching the app, follow the menu prompts onscreen. You will be asked to provide the following: + +- Player name (a handle name that identifies your character; required by some servers) - Steam API key (required) - BM API key (optional) ==== Steam path discovery DZGUI will now attempt to locate your default Steam installation and DayZ path. You *must* have DayZ installed in your Steam library in order to proceed. (It can be installed to any drive of your choosing.) + If DZGUI cannot find Steam or cannot find DayZ installed at the detected Steam path, it will prompt you to manually specify the path to your Steam installation. -Specify the top-level entry point to Steam, not DayZ. E.g., +Specify the root, top-level entry point to Steam, not DayZ. E.g., `/media/mydrive/Steam`, not `/media/mydrive/Steam/steamapps/common/DayZ` If your Steam installation is in a hidden folder but the file picker dialog does not show hidden folders, ensure that your GTK settings are set to show hidden files. -For GTK 2, edit the file below so that `ShowHidden=true`: +For GTK 2, update the file `$HOME/.config/gtk-2.0/gtkfilechooser.ini` to contain this line: -`~/.config/gtk-2.0/gtkfilechooser.ini` +`ShowHidden=true` -For GTK 3, invoke the command: +For GTK 3, invoke the command: `gsettings set org.gtk.Settings.FileChooser show-hidden true` -=== Steam integration & artwork +=== Steam integration & artwork -==== Adding to steam +==== Adding DZGUI as a third-party app DZGUI can be added to Steam as a "non-Steam game" in order to facilitate integration with Steam Deck or desktop environments. -1. Launch Steam in the "Large" view. +1. Launch Steam in the "Large" (default) view. [NOTE] -Steam Deck: you must switch to "Desktop Mode" and launch Steam from the desktop. Steam Deck Game Mode does not support keyboard entry on some third party apps. +Steam Deck: you must switch to "Desktop Mode" and launch Steam from the desktop. Steam Deck's Game Mode view has limited support for configuration of custom games. [start=2] -2. Select **Add a Game** > **Add a Non-Steam Game** from the lower left-hand corner. +2. Select **Add a Game** > **Add a Non-Steam Game** from the lower left-hand corner of the Steam client. image::https://github.com/aclist/dztui/raw/dzgui/images/tutorial/01.png[01,500] [start=3] 3. Navigate to `$HOME/.local/share/applications/` and select `dzgui.desktop` -4. Select **Add Selected Programs**. - -==== Controller layout - -An official controller layout for Steam Deck is available in the Steam community layouts section. Search for "DZGUI Official Config" to download it. Long-press the View button and Select button (☰) to toggle D-pad navigation. This creates an additional layer that lets you navigate through menus using the D-pad and A/B to respectively confirm selections and go back. Remember to toggle this layer off again after launching your game to revert back to the master layer. +4. Select **Add Selected Programs** to add a shortcut to DZGUI. ==== Artwork -The application also ships with Steam cover artwork. It is located under: +DZGUI also ships with Steam cover artwork. It is located under: ``` $HOME/.local/share/dzgui ``` -The artwork consists of four parts: +The artwork consists of five parts: -1. Grid: a vertical "box art" grid used on library pages -2. Hero: a large horizontal banner used on the app's details page -3. Logo: a transparent icon used to remove Steam's default app text -4. dzgui: used by freedesktop shortcut to generate a desktop icon; not intended for the user +[%autowidth] +|=== +|Name|Description -Updating the artwork: +|Hero|a large horizontal banner used on the app's details page, and on landscape-orientation covers in the Recent Games section +|Icon|a square icon used for the tree/list view of the Steam library +|Grid|a vertical "box art" cover used on Steam library pages +|Logo|a transparent icon used to remove Steam's default app text +|dzgui|used by freedesktop shortcut to generate a desktop icon; not intended for manual use by the user +|=== -1. Navigate to the app's details page and right-click the blank image header at the top. +===== Updating the artwork + +1. From the main library view, navigate to the app's details page and right-click the blank image header at the top. image::https://github.com/aclist/dztui/raw/dzgui/images/tutorial/03.png[03,700] [start=2] 2. Select **Set Custom Background** -3. Select to display All Files from the File type dropdown +3. Select to display **All Files** from the File type dropdown 4. Navigate to the artwork path described above and select `hero.png`. 5. Next, right-click the image background and select **Set Custom Logo**. @@ -222,6 +234,22 @@ image::https://github.com/aclist/dztui/raw/dzgui/images/tutorial/06.png[06,700] image::https://github.com/aclist/dztui/raw/dzgui/images/tutorial/07.png[07,700] +[start=9] +9. Right-click the DZGUI entry and select Properties to open the properties dialog. Next to the **Shortcut** field, you will see a small square box which represents the game's icon. Click this to open a file explorer and select `icon.png` from the path above. This will add a small icon to the list view. + +image::https://github.com/aclist/dztui/raw/dzgui/images/tutorial/08.png[08,700] + +[start=10] +10. After you launch DZGUI for the first time, you should return to the library view and select the Recent Games dropdown on the right-hand side. Steam shows a collection of box art based on categories like "Play Next", "Recent Games", etc. Look for a downward-pointing caret icon and click it, then select the "Recent Games" category. If DZGUI was the last item played, it will be shown with a landscape, rather than portrait, orientation cover, which is initially blank. To customize this cover, right click it and select `Manage > Set custom artwork`, then select the `hero.png` image again for this area. + +image::https://github.com/aclist/dztui/raw/dzgui/images/tutorial/09.png[09,700] + +==== Controller layout + +A controller layout for Steam Deck is available in the Steam community layouts section. Search for "DZGUI Official Config" to download it. This layout provides modal layers intended to facilitate interaction with the DZGUI interface, but does not attempt to customize in-game DayZ controls in a detailed fashion. + +Long-press the View button and Select button (☰) to toggle D-pad navigation. This creates an additional layer that lets you navigate through menus using the D-pad and A/B to respectively confirm selections and go back. Remember to toggle this layer off again after launching your game to revert back to the master layer. + === Updating the app If DZGUI detects a new upstream version, it will prompt you to download it automatically. @@ -235,248 +263,308 @@ Upgrading is always advised. If you experience a problem or need to restore the prior version of DZGUI and/or your configs, it is enough to simply replace the new version with the old one and relaunch the app. -The files can be found at: +The file can be found at: -Script: ``` -