From de524bd2a5b125e447558ee47b9e143969a9884f Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 6 Jul 2025 12:37:29 +0900 Subject: [PATCH 1/2] chore: backports from testing --- CHANGELOG.md | 24 +++++---- dzgui.sh | 134 +++++++++++++++++++++++++++++++++++++++++++------- helpers/funcs | 21 +++++++- helpers/ui.py | 12 +++-- 4 files changed, 156 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d86472..55d17ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ # Changelog -## [5.7.0] 2024-04-17 +## [5.8.0] 2025-07-06 +## Added +- Filter servers by official/unofficial status +## Changed +- Updated internal versioning of helper files + +## [5.7.0] 2025-04-17 ## Added - Save application dimensions when quitting and restore on subsequent boot ## Fixed @@ -8,35 +14,35 @@ ## Changed - More direct server ping query method that should return marginally more accurate times -## [5.6.7] 2024-04-04 +## [5.6.7] 2025-04-04 ## Dropped - Removed extraneous pre-boot API checks that could cause error messages to be printed if the user had not set up an API key yet -## [5.6.6] 2024-03-16 +## [5.6.6] 2025-03-16 ## Changed - Update IP database records for 2025-03 -## [5.6.5] 2024-03-04 +## [5.6.5] 2025-03-04 ## Fixed - Livonia server results being dropped from batch queries -## [5.6.4] 2024-02-10 +## [5.6.4] 2025-02-10 ### Changed - Drop launch flag and check for invocation through Steam automatically -## [5.6.3] 2024-02-09 +## [5.6.3] 2025-02-09 ### Changed - Update IP database records for 2025-02 -## [5.6.2] 2024-01-22 +## [5.6.2] 2025-01-22 ### Fixed - Resolve regression introduced with IP resolution feature in 5.6.0 (restores functionality of right-click action: Add to My Servers) -## [5.6.1] 2024-01-10 +## [5.6.1] 2025-01-10 ### Fixed - Add fallback support for jq 1.6 -## [5.6.0] 2024-01-06 +## [5.6.0] 2025-01-06 ### Added - Application header bar and controls - Menu context subtitle in header bar diff --git a/dzgui.sh b/dzgui.sh index 02fb76f..02f5274 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=5.7.0 +version=5.8.0 #CONSTANTS aid=221100 @@ -49,10 +49,9 @@ 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" func_helper="$helpers_path/funcs" +geo_helper="$helpers_path/ips.csv" #REMOTE remote_host=gh @@ -63,7 +62,6 @@ 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" -geo_file_url="$releases_url/ips.csv.gz" set_im_module(){ @@ -587,10 +585,10 @@ fetch_helpers_by_sum(){ [[ -f "$config_file" ]] && source "$config_file" declare -A sums sums=( - ["ui.py"]="a6fdbf3e3eb92b7bc78e6ae23882b10b" + ["ui.py"]="f128a97e744e9e11036d707198feb8a8" ["query_v2.py"]="55d339ba02512ac69de288eb3be41067" ["vdf2json.py"]="2f49f6f5d3af919bebaab2e9c220f397" - ["funcs"]="f6e8b113e586a4bb2ea40c9ee56ebc95" + ["funcs"]="94287c75a5ae0a06a95dd439711e6fba" ["lan"]="c62e84ddd1457b71a85ad21da662b9af" ) local author="aclist" @@ -637,18 +635,8 @@ fetch_helpers_by_sum(){ done return 0 } -fetch_geo_file(){ - # for binary releases - local geo_sum="83bf7655a4197214b4be73dfa9a7b319" +fetch_km_helper(){ local km_sum="b038fdb8f655798207bd28de3a004706" - local gzip="$helpers_path/ips.csv.gz" - if [[ ! -f $geo_file ]] || [[ $(get_hash $geo_file) != $geo_sum ]]; then - local res=$(get_response_code "$geo_file_url") - [[ $res -ne 200 ]] && raise_error_and_quit "Remote resource unavailable: '$geo_file_url'" - curl -Ls "$geo_file_url" > "$gzip" - #force overwrite - gunzip -f "$gzip" - fi if [[ ! -f $km_helper ]] || [[ $(get_hash $km_helper) != $km_sum ]]; then local res=$(get_response_code "$km_helper_url") [[ $res -ne 200 ]] && raise_error_and_quit "Remote resource unavailable: '$km_helper_url'" @@ -656,10 +644,119 @@ fetch_geo_file(){ chmod +x "$km_helper" fi } +get_response_code(){ + local url="$1" + curl -Ls -I -o /dev/null -w "%{http_code}" "$url" +} +raise_error_and_quit(){ + echo "$1" + exit 1 +} +fetch_ip_db(){ + parse_dl_url(){ + curl -Ls "$url" \ + | grep "csv.gz" \ + | awk -F"['']" '{print $2}' + } + + parse_dl_url_date(){ + local url="$1" + <<< "$url" \ + awk -F/ '{print $5}' \ + | awk -F"dbip-city-lite-" '{print $2}' \ + | awk -F'.csv.gz' '{print $1}' + } + + fetch(){ + logger INFO "Triggering fetch routine" + local url="$1" + + curl -Ls "$url" > "$base_file" + if [[ $? -ne 0 ]]; then + logger WARN "Abnormal exit while accessing '$url'" + return + fi + + gunzip -f "$base_file" + if [[ $? -ne 0 ]]; then + rm "$base_file" + logger WARN "Abnormal exit while unpacking gzip '$base_file'" + return + fi + + < "$extracted_file" grep -vE "^[a-z0-9]{4}:" | grep -v "::" > "$ip_file" + if [[ $? -ne 0 ]]; then + logger WARN "Abnormal exit while parsing IPs" + return + fi + rm "${state_path}/${month}.csv" + + readarray -t records < <(cat $ip_file | awk -F, 'NR==1 {print $1} END {print $1}') + if [[ ${records[0]} != "0.0.0.0" ]] && [[ ${records[1]} != "224.0.0.0" ]]; then + logger WARN "Anchor records missing in '$ip_file', possibly malformed" + rm "$ip_file" + return + fi + + mv "$ip_file" "$geo_helper" + if [[ $? -ne 0 ]]; then + logger WARN "Abnormal exit while moving '$ip_file' to '$helpers_path'" + rm "$ip_file" + fi + + echo "$month" > "$month_file" + logger INFO "Wrote '$month' to stub '$month_file'" + logger INFO "Updated '$ip_file'" + } + + local url="https://db-ip.com/db/download/ip-to-city-lite" + local month_file="${state_path}/.month" + local ip_file="${state_path}/ips.csv" + + # test main url + local res=$(get_response_code "$url") + if [[ $res -ne 200 ]]; then + logger WARN "Failed to retrieve remote resource: '$url' ($res)" + return + fi + logger INFO "Resolved remote URL: '$url'" + + # test dl url + local dl_url="$(parse_dl_url)" + local res=$(get_response_code "$dl_url") + if [[ $res -ne 200 ]]; then + logger WARN "Remote resource unavailable: '$dl_url' ($res)" + return + fi + logger INFO "Resolved download URL: '$dl_url'" + + local month=$(parse_dl_url_date "$dl_url") + local base_file="${state_path}/${month}.csv.gz" + local extracted_file="${state_path}/${month}.csv" + + # no stub file + if [[ ! -f $month_file ]]; then + logger WARN "No stub file '$month_file' present" + fetch "$dl_url" + return + fi + + # local needs update + local last_month=$(< "$month_file") + if [[ $last_month != "$month" ]]; then + logger WARN "Local stub '$last_month' does not match remote stub '$month'" + fetch "$dl_url" + return + fi + + # if stub is same date, abort + logger INFO "Local stub '$last_month' is identical to remote, skipping" +} fetch_helpers(){ fetch_a2s fetch_dzq - fetch_geo_file + fetch_km_helper + fetch_ip_db fetch_helpers_by_sum [[ ! -f $share_path/icon.png ]] && freedesktop_dirs fetch_icons @@ -899,7 +996,6 @@ test_connection(){ stable_url="$url_prefix/dzgui" testing_url="$url_prefix/testing" km_helper_url="$releases_url/latlon" - geo_file_url="$releases_url/ips.csv.gz" fi } legacy_cols(){ diff --git a/helpers/funcs b/helpers/funcs index 57e87f5..31b5f59 100755 --- a/helpers/funcs +++ b/helpers/funcs @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -o pipefail -version=5.6.0 +version="5.8.0" #CONSTANTS aid=221100 @@ -605,6 +605,20 @@ filter_servers(){ <<< "$filtered" awk -F$separator '!seen[$1]++' fi } + filter_official(){ + if [[ ${filters[*]} =~ Official ]]; then + echo -n "$filtered" + else + <<< "$filtered" awk -F$separator '$10 == "Community"' + fi + } + filter_community(){ + if [[ ${filters[*]} =~ Unoffic ]]; then + echo -n "$filtered" + else + <<< "$filtered" awk -F$separator '$10 == "Official"' + fi + } filtered=$(filter_perspective) filtered=$(filter_full) @@ -615,6 +629,8 @@ filter_servers(){ filtered=$(filter_ascii) filtered=$(filter_duplicates) filtered=$(filter_keyword) + filtered=$(filter_official) + filtered=$(filter_community) if [[ -z "$filtered" ]]; then logger WARN "Filter result is empty" @@ -652,7 +668,8 @@ parse_server_json(){ "\(.max_players)␞" + "\(if .gametype == null then "0" elif .gametype|split("lqs")[1] == null then "0" else .gametype|split("lqs")[1]|split(",")[0] end)␞" + "\(.addr|split(":")[0]):\(if .gameport == null then "XXXX" else .gameport end)␞" + - "\(.addr|split(":")[1])" + "\(.addr|split(":")[1])␞" + + "\(if .gametype == null then "null" else (.gametype|split(",")|if any(. == "external") then "Community" else "Official" end) end)" ' | sort -k1 } align_versions_file(){ diff --git a/helpers/ui.py b/helpers/ui.py index 4180957..e167277 100644 --- a/helpers/ui.py +++ b/helpers/ui.py @@ -17,7 +17,6 @@ import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Gdk, GObject, Pango -# 5.7.0 app_name = "DZGUI" cache = {} @@ -38,7 +37,7 @@ mod_store = Gtk.ListStore(str, str, str, float, str) #cf. log_cols log_store = Gtk.ListStore(str, str, str, str) #cf. browser_cols -server_store = Gtk.ListStore(str, str, str, str, int, int, int, str, int) +server_store = Gtk.ListStore(str, str, str, str, int, int, int, str, int, str) default_tooltip = "Select a row to see its detailed description" server_tooltip = [None, None] @@ -96,7 +95,9 @@ filters = { "Full": False, "Low pop": True, "Non-ASCII": False, - "Duplicate": False + "Duplicate": False, + "Official": True, + "Unoffic.": True, } @@ -553,7 +554,7 @@ def parse_server_rows(data): lines = data.stdout.splitlines() reader = csv.reader(lines, delimiter=delimiter) try: - rows = [[row[0], row[1], row[2], row[3], int(row[4]), int(row[5]), int(row[6]), row[7], int(row[8])] for row in reader if row] + rows = [[row[0], row[1], row[2], row[3], int(row[4]), int(row[5]), int(row[6]), row[7], int(row[8]), row[9]] for row in reader if row] except IndexError: return 1 for row in rows: @@ -1609,7 +1610,8 @@ class TreeView(Gtk.TreeView): if (column_title == "Map"): column.set_fixed_width(300) - self.append_column(column) + if i != 10: + self.append_column(column) self.update_first_col(mode.dict["label"]) From e02f02b775e1af3376dc5e1ec231deba25382c63 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Mon, 7 Jul 2025 10:18:25 +0900 Subject: [PATCH 2/2] chore: update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55d17ee..befe399 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,11 @@ ## [5.8.0] 2025-07-06 ## Added - Filter servers by official/unofficial status +- Automatically fetch geolocation records ## Changed - Updated internal versioning of helper files +## Fixed +- Corrected erroneous 2024 date in prior changelog entries ## [5.7.0] 2025-04-17 ## Added