mirror of
https://github.com/aclist/dztui.git
synced 2024-12-29 13:52:03 +01:00
In-app server browser
This commit is contained in:
parent
7b947e2996
commit
0b4de12ef5
2 changed files with 208 additions and 6 deletions
|
@ -6,6 +6,10 @@
|
||||||
- Standardize dialogs
|
- Standardize dialogs
|
||||||
- Query and connect by IP/port
|
- Query and connect by IP/port
|
||||||
|
|
||||||
|
## [2.7.0-rc.1] 2022-09-12
|
||||||
|
### Added
|
||||||
|
- Initial server browser prototype
|
||||||
|
|
||||||
## [2.6.0-rc.5] 2022-09-03
|
## [2.6.0-rc.5] 2022-09-03
|
||||||
### Fixed
|
### Fixed
|
||||||
- Make variable local
|
- Make variable local
|
||||||
|
|
210
dzgui.sh
210
dzgui.sh
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
version=2.6.0-rc.5
|
version=2.7.0-rc.1
|
||||||
|
|
||||||
aid=221100
|
aid=221100
|
||||||
game="dayz"
|
game="dayz"
|
||||||
|
@ -20,6 +20,10 @@ check_config_msg="Check config values and restart."
|
||||||
news_url="https://raw.githubusercontent.com/aclist/dztui/testing/news"
|
news_url="https://raw.githubusercontent.com/aclist/dztui/testing/news"
|
||||||
freedesktop_path="$HOME/.local/share/applications"
|
freedesktop_path="$HOME/.local/share/applications"
|
||||||
sd_install_path="$HOME/.local/share/dzgui"
|
sd_install_path="$HOME/.local/share/dzgui"
|
||||||
|
helpers_path="$sd_install_path/helpers"
|
||||||
|
geo_file="$HOME/.local/share/dzgui/helpers/ips.csv"
|
||||||
|
km_helper="$HOME/.local/share/dzgui/helpers/lat.py"
|
||||||
|
km_helper_url="https://raw.githubusercontent.com/aclist/dztui/testing/helpers/lat.py"
|
||||||
|
|
||||||
update_last_seen(){
|
update_last_seen(){
|
||||||
mv $config_file ${config_path}dztuirc.old
|
mv $config_file ${config_path}dztuirc.old
|
||||||
|
@ -75,6 +79,7 @@ items=(
|
||||||
"Add server by ID"
|
"Add server by ID"
|
||||||
"Add favorite server"
|
"Add favorite server"
|
||||||
"Delete server"
|
"Delete server"
|
||||||
|
"[NEW] Server browser"
|
||||||
"List installed mods"
|
"List installed mods"
|
||||||
"Toggle debug mode"
|
"Toggle debug mode"
|
||||||
"Report bug (opens in browser)"
|
"Report bug (opens in browser)"
|
||||||
|
@ -776,6 +781,197 @@ query_and_connect(){
|
||||||
populate
|
populate
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
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_sel=$(echo "$maps" | zenity --list --column="Check" --width=1200 --height=800 2>/dev/null --title=DZGUI --text="Select map")
|
||||||
|
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(){
|
||||||
|
local local_ip=$(dig +short myip.opendns.com @resolver1.opendns.com)
|
||||||
|
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 "[Included] %s\n" "$filters"
|
||||||
|
printf "[Excluded] %s\n" "$(disabled)"
|
||||||
|
if [[ -n $search ]]; then
|
||||||
|
printf "[Keyword] %s\n" "$search"
|
||||||
|
fi
|
||||||
|
printf "Returned %s %s" "${#qport[@]}" "$entry"
|
||||||
|
}
|
||||||
|
check_geo_file(){
|
||||||
|
local db_file="https://github.com/aclist/dztui/releases/download/browser/ips.csv.gz"
|
||||||
|
local gzip="$helpers_path/ips.csv.gz"
|
||||||
|
if [[ ! -f $geo_file ]]; then
|
||||||
|
run(){
|
||||||
|
mkdir -p "$helpers_path"
|
||||||
|
echo "# Fetching geolocation DB"
|
||||||
|
curl -Ls "$db_file" > "$gzip"
|
||||||
|
echo "# Extracting coordinates"
|
||||||
|
gunzip "$gzip"
|
||||||
|
echo "# Preparing helper file"
|
||||||
|
curl -Ls "$km_helper_url" > "$km_helper"
|
||||||
|
echo "100"
|
||||||
|
}
|
||||||
|
run > >(zenity --pulsate --progress --auto-close --width=500 2>/dev/null)
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
choose_filters(){
|
||||||
|
sels=$(zenity --title=DZGUI --text="Server search" --list --checklist --column "Check" --column "Option" --hide-header TRUE "All maps" TRUE "Daytime" TRUE "Nighttime" False "Empty" False "Full" False "Low population" FALSE "Non-ASCII titles" FALSE "Keyword search" --width 1200 --height 800 2>/dev/null)
|
||||||
|
if [[ $sels =~ Keyword ]]; then
|
||||||
|
search=$(zenity --entry --text="Search (case insensitive)" --width=500 --title=DZGUI 2>/dev/null | awk '{print tolower($0)}')
|
||||||
|
[[ -z $search ]] && { ret=97; return; }
|
||||||
|
fi
|
||||||
|
[[ -z $sels ]] && return
|
||||||
|
filters=$(echo "$sels" | sed 's/|/, /g')
|
||||||
|
echo "[DZGUI] Filters: $filters"
|
||||||
|
}
|
||||||
|
get_dist(){
|
||||||
|
local given_ip="$1"
|
||||||
|
local subnet="$(echo "$given_ip" | awk -F. '{OFS="."}{print $1,$2,$3}')"
|
||||||
|
local host="$(echo "$given_ip" | awk -F. '{print $4}')"
|
||||||
|
local remote=$(grep -E "^$subnet\." "$geo_file" | awk -F[.,] -v var=$host '$4 < var {print $0}' \
|
||||||
|
| tail -n1 | awk -F, '{print $7,$8}')
|
||||||
|
local remote_lat=$(echo "$remote" | awk '{print $1}')
|
||||||
|
local remote_lon=$(echo "$remote" | awk '{print $2}')
|
||||||
|
if [[ -z $remote_lat ]]; then
|
||||||
|
local dist="Unknown"
|
||||||
|
echo "$dist"
|
||||||
|
else
|
||||||
|
local dist=$(python "$km_helper" "$local_lat" "$local_lon" "$remote_lat" "$remote_lon")
|
||||||
|
printf "%05d %s" "$dist" "km"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
prepare_filters(){
|
||||||
|
echo "# Preparing list"
|
||||||
|
[[ ! "$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") ; }
|
||||||
|
[[ -n "$search" ]] && keyword_filter
|
||||||
|
strip_null
|
||||||
|
echo "100"
|
||||||
|
}
|
||||||
|
munge_servers(){
|
||||||
|
if [[ ! "$sels" =~ "All maps" ]]; then
|
||||||
|
filter_maps > >(zenity --pulsate --progress --auto-close --width=500 2>/dev/null)
|
||||||
|
disabled+=("All maps")
|
||||||
|
fi
|
||||||
|
[[ $ret -eq 97 ]] && return
|
||||||
|
prepare_filters > >(zenity --pulsate --progress --auto-close --width=500 2>/dev/null)
|
||||||
|
if [[ $(echo "$response" | jq 'length') -eq 0 ]]; then
|
||||||
|
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}')
|
||||||
|
local name=$(echo "$response" | jq -r '.[].name')
|
||||||
|
local players=$(echo "$response" | jq -r '.[].players')
|
||||||
|
local max=$(echo "$response" | jq -r '.[].max_players')
|
||||||
|
local map=$(echo "$response" | jq -r '.[].map|ascii_downcase')
|
||||||
|
local gametime=$(echo "$response" | jq -r '.[].gametype' | grep -oE '[0-9]{2}:[0-9]{2}$')
|
||||||
|
readarray -t qport <<< $qport
|
||||||
|
readarray -t gameport <<< $gameport
|
||||||
|
readarray -t addr <<< $addr
|
||||||
|
readarray -t name <<< $name
|
||||||
|
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
|
||||||
|
|
||||||
|
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]}"
|
||||||
|
done | 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=7,8 --separator=%% 2>/dev/null
|
||||||
|
}
|
||||||
|
server_browser(){
|
||||||
|
unset ret
|
||||||
|
file=$(mktemp)
|
||||||
|
local limit=20000
|
||||||
|
local url="https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100&limit=$limit&key=$steam_api"
|
||||||
|
check_geo_file #> >(zenity --pulsate --progress --auto-close 2>/dev/null)
|
||||||
|
local_latlon
|
||||||
|
choose_filters
|
||||||
|
[[ -z $sels ]] && return
|
||||||
|
[[ $ret -eq 97 ]] && return
|
||||||
|
#TODO: some error handling here
|
||||||
|
curl -Ls "$url" > $file
|
||||||
|
response=$(< $file jq -r '.response.servers')
|
||||||
|
local sel=$(munge_servers)
|
||||||
|
if [[ -z $sel ]]; then
|
||||||
|
unset filters
|
||||||
|
unset search
|
||||||
|
ret=98
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
local sel_ip=$(echo "$sel" | awk -F%% '{print $1}')
|
||||||
|
local sel_port=$(echo "$sel" | awk -F%% '{print $2}')
|
||||||
|
qport_list="$sel_ip%%$sel_port"
|
||||||
|
if [[ -n "$sel_ip" ]]; then
|
||||||
|
connect "$sel_ip" "ip"
|
||||||
|
else
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
main_menu(){
|
main_menu(){
|
||||||
print_news
|
print_news
|
||||||
|
@ -806,18 +1002,20 @@ main_menu(){
|
||||||
delete=1
|
delete=1
|
||||||
query_and_connect
|
query_and_connect
|
||||||
elif [[ $sel == "${items[6]}" ]]; then
|
elif [[ $sel == "${items[6]}" ]]; then
|
||||||
list_mods | sed 's/\t/\n/g' | zenity --list --column="Mod" --column="Symlink" --title="DZGUI" $sd_res --print-column="" 2>/dev/null
|
server_browser
|
||||||
elif [[ $sel == "${items[7]}" ]]; then
|
elif [[ $sel == "${items[7]}" ]]; then
|
||||||
|
list_mods | sed 's/\t/\n/g' | zenity --list --column="Mod" --column="Symlink" --title="DZGUI" $sd_res --print-column="" 2>/dev/null
|
||||||
|
elif [[ $sel == "${items[8]}" ]]; then
|
||||||
toggle_debug
|
toggle_debug
|
||||||
main_menu
|
main_menu
|
||||||
return
|
return
|
||||||
elif [[ $sel == "${items[8]}" ]]; then
|
|
||||||
report_bug
|
|
||||||
elif [[ $sel == "${items[9]}" ]]; then
|
elif [[ $sel == "${items[9]}" ]]; then
|
||||||
help_file
|
report_bug
|
||||||
elif [[ $sel == "${items[10]}" ]]; then
|
elif [[ $sel == "${items[10]}" ]]; then
|
||||||
changelog | zenity --text-info $sd_res --title="DZGUI" 2>/dev/null
|
help_file
|
||||||
elif [[ $sel == "${items[11]}" ]]; then
|
elif [[ $sel == "${items[11]}" ]]; then
|
||||||
|
changelog | zenity --text-info $sd_res --title="DZGUI" 2>/dev/null
|
||||||
|
elif [[ $sel == "${items[12]}" ]]; then
|
||||||
debug_menu
|
debug_menu
|
||||||
else
|
else
|
||||||
warn "This feature is not yet implemented."
|
warn "This feature is not yet implemented."
|
||||||
|
|
Loading…
Reference in a new issue