diff --git a/dzgui.sh b/dzgui.sh index f8a2d9e..19b539f 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=4.0.0-rc.7 +version=4.0.0-rc.8 aid=221100 game="dayz" @@ -815,7 +815,7 @@ launch(){ source $config_file mods=$(concat_mods) if [[ ! "$ip:$gameport:$qport" == "$fav_server" ]] && [[ ! ${ip_list[@]} =~ "$ip:$gameport:$qport" ]]; then - qdialog "Before connecting, add this server to your favorites?" + qdialog "Before connecting, add this server to My Servers?" if [[ $? -eq 0 ]]; then ip_list+=("$ip:$gameport:$qport") update_config @@ -1314,6 +1314,12 @@ query_and_connect(){ [[ $? -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)]') } @@ -1420,7 +1426,7 @@ 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" False "Empty" False "Full" TRUE "Low population" FALSE "Non-ASCII titles" FALSE "Keyword search" $sd_res 2>/dev/null) + 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 @@ -1436,13 +1442,13 @@ choose_filters(){ } get_dist(){ local given_ip="$1" - local network="$(echo "$given_ip" | awk -F. '{OFS="."}{print $1"."$2}')" + local network="$(<<< "$given_ip" awk -F. '{OFS="."}{print $1"."$2}')" local binary=$(grep -E "^$network\." $geo_file) - local three=$(echo $given_ip | awk -F. '{print $3}') - local host=$(echo $given_ip | awk -F. '{print $4}') - local res=$(echo "$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=$(echo "$res" | awk '{print $1}') - local remote_lon=$(echo "$res" | awk '{print $2}') + 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" @@ -1460,6 +1466,8 @@ prepare_filters(){ [[ ! "$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 } @@ -1469,9 +1477,12 @@ munge_servers(){ write_fifo(){ [[ -p $fifo ]] && rm $fifo mkfifo $fifo + local dist for((i=0;i<${#qport[@]};i++)); do - printf "%s\n%s\n%s\n%03d\n%03d\n%s\n%s:%s\n%s\n" "${map[$i]}" "${name[$i]}" "${gametime[$i]}" \ - "${players[$i]}" "${max[$i]}" "$(get_dist ${addr[$i]})" "${addr[$i]}" "${gameport[$i]}" "${qport[$i]}" >> $fifo + 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)" @@ -1487,20 +1498,22 @@ munge_servers(){ $steamsafe_zenity --error --text="No matching servers" 2>/dev/null return fi - local addr=$(echo "$response" | jq -r '.[].addr' | awk -F: '{print $1}') - local gameport=$(echo "$response" | jq -r '.[].gameport') - local qport=$(echo "$response" | jq -r '.[].addr' | awk -F: '{print $2}') - #jq bug #1788, raw output cannot be used with ASCII - local name=$(echo "$response" | jq -a '.[].name' | sed 's/\\u[0-9a-z]\{4\}//g;s/^"//;s/"$//') - local players=$(echo "$response" | jq -r '.[].players') - local max=$(echo "$response" | jq -r '.[].max_players') - local map=$(echo "$response" | jq -r '.[].map|if type == "string" then ascii_downcase else . end') - local gametime=$(echo "$response" | jq -r '.[].gametype' | grep -oE '[0-9]{2}:[0-9]{2}$') + #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 @@ -1511,7 +1524,7 @@ munge_servers(){ fi write_fifo & pid=$! - local sel=$($steamsafe_zenity --text="$(pagination)" --title="DZGUI" --list --column=Map --column=Name --column=Gametime --column=Players --column=Max --column=Distance --column=IP --column=Qport $sd_res --print-column=2,7,8 --separator=%% 2>/dev/null < <(while true; do cat $fifo; done)) + 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 @@ -1556,14 +1569,14 @@ server_browser(){ [[ $? -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 + 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]}" @@ -1571,7 +1584,7 @@ server_browser(){ local qport="${address[3]}" unset address - connect "$ip" "$gameport" "$qport" + connect "$ip" "$gameport" "$qport" sd_res="--width=1280 --height=800" } mods_disk_size(){