1
0
Fork 0
mirror of https://github.com/aclist/dztui.git synced 2024-12-28 21:32:36 +01:00
dztui/dzgui.sh

1929 lines
61 KiB
Bash
Raw Normal View History

2023-05-16 00:14:56 +02:00
#!/usr/bin/env bash
2022-05-09 13:42:24 +02:00
2022-06-04 22:29:30 +02:00
set -o pipefail
2023-10-21 15:39:23 +02:00
version=3.4.0-rc.10
2022-08-14 04:03:27 +02:00
2022-05-09 13:42:24 +02:00
aid=221100
game="dayz"
workshop="steam://url/CommunityFilePage/"
2022-05-09 13:42:24 +02:00
api="https://api.battlemetrics.com/servers"
2022-05-22 21:20:34 +02:00
sd_res="--width=1280 --height=800"
config_path="$HOME/.config/dztui/"
config_file="${config_path}dztuirc"
2022-11-21 20:54:23 +01:00
hist_file="${config_path}/history"
2022-09-22 11:37:43 +02:00
tmp=/tmp/dzgui.tmp
2022-09-25 22:24:08 +02:00
fifo=/tmp/table.tmp
2023-07-25 03:10:07 +02:00
debug_log="$PWD/DZGUI_DEBUG.log"
2022-05-29 07:41:56 +02:00
separator="%%"
2022-06-15 12:32:10 +02:00
check_config_msg="Check config values and restart."
2022-09-14 06:56:13 +02:00
issues_url="https://github.com/aclist/dztui/issues"
url_prefix="https://raw.githubusercontent.com/aclist/dztui"
stable_url="$url_prefix/dzgui"
2022-10-08 05:58:02 +02:00
testing_url="$url_prefix/testing"
2022-09-14 06:56:13 +02:00
releases_url="https://github.com/aclist/dztui/releases/download/browser"
help_url="https://aclist.github.io/dzgui/dzgui"
2023-05-20 12:53:51 +02:00
sponsor_url="https://github.com/sponsors/aclist"
2022-08-05 20:35:17 +02:00
freedesktop_path="$HOME/.local/share/applications"
2022-08-06 00:42:35 +02:00
sd_install_path="$HOME/.local/share/dzgui"
2022-09-12 16:55:30 +02:00
helpers_path="$sd_install_path/helpers"
2022-09-14 06:56:13 +02:00
geo_file="$helpers_path/ips.csv"
km_helper="$helpers_path/latlon"
sums_path="$helpers_path/sums.md5"
2022-10-07 06:30:09 +02:00
scmd_file="$helpers_path/scmd.sh"
2022-09-14 06:56:13 +02:00
km_helper_url="$releases_url/latlon"
db_file="$releases_url/ips.csv.gz"
sums_url="$testing_url/helpers/sums.md5"
2022-10-07 06:30:09 +02:00
scmd_url="$testing_url/helpers/scmd.sh"
2022-11-24 21:53:35 +01:00
vdf2json_url="$testing_url/helpers/vdf2json.py"
2022-10-08 05:09:08 +02:00
notify_url="$testing_url/helpers/d.html"
notify_img_url="$testing_url/helpers/d.webp"
2023-05-27 08:09:31 +02:00
forum_url="https://github.com/aclist/dztui/discussions"
2022-10-26 02:22:19 +02:00
version_file="$config_path/versions"
2022-12-02 08:25:08 +01:00
steamsafe_zenity="/usr/bin/zenity"
2022-05-09 13:42:24 +02:00
2022-11-24 21:53:35 +01:00
#TODO: prevent connecting to offline servers
#TODO: abstract zenity title params and dimensions
2022-07-24 15:20:06 +02:00
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
printf "[DZGUI] Updated last seen news item to '$sum'\n"
source $config_file
}
check_news(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2023-05-16 00:14:56 +02:00
echo "# Checking news"
2022-10-11 09:24:37 +02:00
[[ $branch == "stable" ]] && news_url="$stable_url/news"
[[ $branch == "testing" ]] && news_url="$testing_url/news"
2022-07-24 15:20:06 +02:00
result=$(curl -Ls "$news_url")
sum=$(echo -n "$result" | md5sum | awk '{print $1}')
2023-07-25 03:10:07 +02:00
logger INFO "News: $result"
2022-07-24 15:20:06 +02:00
}
print_news(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-11-24 21:53:35 +01:00
if [[ $sum == $seen_news || -z $result ]]; then
2022-07-24 15:20:06 +02:00
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
}
2022-05-09 13:42:24 +02:00
declare -A deps
2023-01-19 12:20:30 +01:00
deps=([awk]="5.1.1" [curl]="7.80.0" [jq]="1.6" [tr]="9.0" [$steamsafe_zenity]="3.42.1")
2022-06-12 06:44:30 +02:00
changelog(){
2022-07-24 15:20:06 +02:00
if [[ $branch == "stable" ]]; then
md="https://raw.githubusercontent.com/aclist/dztui/dzgui/changelog.md"
else
md="https://raw.githubusercontent.com/aclist/dztui/testing/changelog.md"
fi
2022-06-12 06:44:30 +02:00
prefix="This window can be scrolled."
echo $prefix
echo ""
2023-05-19 16:29:21 +02:00
curl -Ls "$md"
2022-06-12 06:44:30 +02:00
}
2022-05-09 13:42:24 +02:00
depcheck(){
for dep in "${!deps[@]}"; do
2023-01-19 12:20:30 +01:00
command -v "$dep" 2>&1>/dev/null || (printf "Requires %s >=%s\n" "$dep" ${deps[$dep]}; exit 1)
2022-05-09 13:42:24 +02:00
done
}
2022-10-09 04:07:07 +02:00
watcher_deps(){
2023-10-21 15:39:23 +02:00
logger INFO "${FUNCNAME[0]}"
2023-05-20 04:01:00 +02:00
if [[ ! $(command -v wmctrl) ]] && [[ ! $(command -v xdotool) ]]; then
2022-10-09 04:07:07 +02:00
echo "100"
2023-10-21 15:39:23 +02:00
warn "Missing dependency: requires 'wmctrl' or 'xdotool'.\nInstall from your system's package manager."
logger ERROR "Missing watcher dependencies"
2022-10-09 04:07:07 +02:00
exit 1
fi
}
2022-06-22 15:33:52 +02:00
init_items(){
#array order determines menu selector; this is destructive
2022-05-22 21:20:34 +02:00
items=(
2022-10-03 17:04:13 +02:00
"[Connect]"
2022-10-11 13:58:00 +02:00
" Server browser"
2022-10-03 17:04:13 +02:00
" My servers"
" Quick connect to favorite server"
" Connect by IP"
2022-11-23 18:15:11 +01:00
" Recent servers (last 10)"
2022-11-21 20:54:23 +01:00
"[Manage servers]"
2022-10-03 17:04:13 +02:00
" Add server by ID"
" Add favorite server"
" Delete server"
"[Options]"
" List installed mods"
" View changelog"
2022-10-07 06:30:09 +02:00
" Advanced options"
2022-10-11 14:43:52 +02:00
"[Help]"
" Help file ⧉"
" Report bug ⧉"
2022-11-24 21:53:35 +01:00
" Forum ⧉"
2023-10-21 15:39:23 +02:00
" Sponsor ⧉"
" Hall of fame ⧉"
2022-05-22 21:20:34 +02:00
)
2022-06-22 15:33:52 +02:00
}
2022-05-22 21:20:34 +02:00
warn(){
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --info --title="DZGUI" --text="$1" --width=500 --icon-name="dialog-warning" 2>/dev/null
2022-05-09 13:42:24 +02:00
}
2022-05-22 21:20:34 +02:00
info(){
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --info --title="DZGUI" --text="$1" --width=500 2>/dev/null
2022-05-22 21:20:34 +02:00
}
2022-08-11 00:59:29 +02:00
set_api_params(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-08-11 00:59:29 +02:00
response=$(curl -s "$api" -H "Authorization: Bearer "$api_key"" -G -d "sort=-players" \
-d "filter[game]=$game" -d "filter[ids][whitelist]=$list_of_ids")
2022-08-12 02:52:07 +02:00
list_response=$response
2022-08-14 18:22:21 +02:00
first_entry=1
2022-08-11 00:59:29 +02:00
}
2022-05-09 13:42:24 +02:00
query_api(){
2023-07-25 03:10:07 +02:00
logger INFO ${FUNCNAME[0]}
2023-05-16 00:14:56 +02:00
echo "# Querying API"
2022-06-15 12:32:10 +02:00
#TODO: prevent drawing list if null values returned without API error
if [[ $one_shot_launch -eq 1 ]]; then
list_of_ids="$fav"
else
2022-11-24 21:53:35 +01:00
list_of_ids="$whitelist"
2022-06-15 12:32:10 +02:00
fi
2022-08-11 00:59:29 +02:00
set_api_params
2022-05-09 13:42:24 +02:00
if [[ "$(jq -r 'keys[]' <<< "$response")" == "errors" ]]; then
code=$(jq -r '.errors[] .status' <<< $response)
#TODO: fix granular api codes
2022-06-15 12:32:10 +02:00
if [[ $code -eq 401 ]]; then
2022-09-26 21:04:06 +02:00
warn "Error $code: malformed API key"
return
2022-06-15 12:32:10 +02:00
elif [[ $code -eq 500 ]]; then
2022-09-26 21:04:06 +02:00
warn "Error $code: malformed server list"
return
2022-06-15 12:32:10 +02:00
fi
fi
if [[ -z $(echo $response | jq '.data[]') ]]; then
2022-09-26 21:04:06 +02:00
warn "95: API returned empty response. Check config file."
return
2022-05-09 13:42:24 +02:00
fi
2022-05-22 21:20:34 +02:00
}
write_config(){
2022-06-15 12:32:10 +02:00
cat <<-END
#Path to DayZ installation
steam_path="$steam_path"
2022-05-22 21:20:34 +02:00
#Your unique API key
2022-06-15 12:32:10 +02:00
api_key="$api_key"
2022-05-22 21:20:34 +02:00
#Comma-separated list of server IDs
2022-06-15 12:32:10 +02:00
whitelist="$whitelist"
2022-05-22 21:20:34 +02:00
#Favorite server to fast-connect to (limit one)
2022-06-15 12:32:10 +02:00
fav="$fav"
2022-05-22 21:20:34 +02:00
#Custom player name (optional, required by some servers)
2022-06-15 12:32:10 +02:00
name="$name"
2022-05-22 21:20:34 +02:00
#Set to 1 to perform dry-run and print launch options
2022-07-31 20:01:58 +02:00
debug="$debug"
2022-07-18 10:58:38 +02:00
#Toggle stable/testing branch
2022-07-31 19:52:59 +02:00
branch="$branch"
2022-07-24 15:20:06 +02:00
#Last seen news item
2022-07-31 20:01:58 +02:00
seen_news="$seen_news"
2022-08-16 17:49:51 +02:00
#Steam API key
2022-08-31 10:22:07 +02:00
steam_api="$steam_api"
2022-10-05 10:08:47 +02:00
#Terminal emulator
term="$term"
2022-10-06 14:50:37 +02:00
#Auto-install mods
auto_install="$auto_install"
#Automod staging directory
2022-10-07 09:26:39 +02:00
staging_dir="$staging_dir"
2022-10-23 20:09:35 +02:00
#Path to default Steam client
default_steam_path="$default_steam_path"
#Preferred Steam launch command (for Flatpak support)
2023-01-19 17:55:41 +01:00
preferred_client="$preferred_client"
2022-05-22 21:20:34 +02:00
END
}
2022-08-04 21:14:56 +02:00
write_desktop_file(){
cat <<-END
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
2022-08-06 00:42:35 +02:00
Exec=$sd_install_path/dzgui.sh
2022-08-04 21:14:56 +02:00
Name=DZGUI
Comment=dzgui
2022-08-06 00:42:35 +02:00
Icon=$sd_install_path/dzgui
2022-08-05 20:03:24 +02:00
Categories=Game
2022-08-04 21:14:56 +02:00
END
}
2022-08-05 21:58:59 +02:00
freedesktop_dirs(){
2022-08-06 00:42:35 +02:00
mkdir -p "$sd_install_path"
2022-08-05 21:58:59 +02:00
mkdir -p "$freedesktop_path"
#TODO: update url
2022-08-06 00:42:35 +02:00
curl -s "$version_url" > "$sd_install_path/dzgui.sh"
chmod +x "$sd_install_path/dzgui.sh"
2022-12-03 13:38:27 +01:00
img_url="$testing_url/images"
2022-08-05 21:58:59 +02:00
for i in dzgui grid.png hero.png logo.png; do
2022-08-06 00:42:35 +02:00
curl -s "$img_url/$i" > "$sd_install_path/$i"
2022-08-05 21:58:59 +02:00
done
write_desktop_file > "$freedesktop_path/dzgui.desktop"
2022-08-06 02:42:41 +02:00
if [[ $is_steam_deck -eq 1 ]]; then
write_desktop_file > "$HOME/Desktop/dzgui.desktop"
fi
2022-08-05 21:58:59 +02:00
}
2022-11-24 21:53:35 +01:00
find_library_folder(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
logger INFO "User picked directory: '$1'"
2023-05-16 00:14:56 +02:00
steam_path="$(python3 "$helpers_path/vdf2json.py" -i "$1/steamapps/libraryfolders.vdf" | jq -r '.libraryfolders[]|select(.apps|has("221100")).path')"
2023-07-25 03:10:07 +02:00
logger INFO "Steam path resolved to: $steam_path"
2022-11-24 21:53:35 +01:00
}
2022-08-14 11:10:00 +02:00
file_picker(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-12-02 08:25:08 +01:00
local path=$($steamsafe_zenity --file-selection --directory 2>/dev/null)
2023-07-25 03:10:07 +02:00
logger INFO "File picker path resolve to: $path"
2023-05-16 00:14:56 +02:00
if [[ -z "$path" ]]; then
2023-07-25 03:10:07 +02:00
logger INFO "Path was empty"
2023-05-16 00:14:56 +02:00
return
else
default_steam_path="$path"
find_library_folder "$default_steam_path"
fi
2022-08-14 11:10:00 +02:00
}
2022-05-22 21:20:34 +02:00
create_config(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-11-28 20:52:25 +01:00
check_pyver
2023-05-16 00:14:56 +02:00
write_to_config(){
mkdir -p $config_path
write_config > $config_file
info "Config file created at $config_file."
source $config_file
return
}
2022-08-04 21:14:56 +02:00
while true; do
2023-05-16 00:14:56 +02:00
player_input="$($steamsafe_zenity --forms --add-entry="Player name (required for some servers)" --add-entry="BattleMetrics API key" --add-entry="Steam API key" --title="DZGUI" --text="DZGUI" $sd_res --separator="@" 2>/dev/null)"
2022-12-02 08:25:08 +01:00
#explicitly setting IFS crashes $steamsafe_zenity in loop
2022-11-24 21:53:35 +01:00
#and mapfile does not support high ascii delimiters
#so split fields with newline
2023-05-16 00:14:56 +02:00
readarray -t args < <(echo "$player_input" | sed 's/@/\n/g')
2022-11-24 21:53:35 +01:00
name="${args[0]}"
api_key="${args[1]}"
steam_api="${args[2]}"
2022-08-04 21:14:56 +02:00
2022-11-24 21:53:35 +01:00
[[ -z $player_input ]] && exit
if [[ -z $api_key ]] || [[ -z $steam_api ]]; then
2023-01-02 02:22:58 +01:00
warn "API key cannot be empty"
2022-11-24 21:53:35 +01:00
#TODO: test BM key
elif [[ $(test_steam_api) -eq 1 ]]; then
warn "Invalid Steam API key"
2023-01-02 02:22:58 +01:00
elif [[ $(test_bm_api) -eq 1 ]]; then
warn "Invalid BM API key"
2022-11-24 21:53:35 +01:00
else
while true; do
2023-07-25 03:10:07 +02:00
logger INFO "steamsafe_zenity is $steamsafe_zenity"
2023-05-16 00:14:56 +02:00
[[ -n $steam_path ]] && { write_to_config; return; }
2022-11-24 21:53:35 +01:00
find_default_path
2023-05-16 00:14:56 +02:00
find_library_folder "$default_steam_path"
2022-11-24 21:53:35 +01:00
if [[ -z $steam_path ]]; then
2023-07-25 03:10:07 +02:00
logger WARN "Steam path was empty"
2023-05-11 05:08:15 +02:00
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
2023-07-25 03:10:07 +02:00
logger INFO "User selected file picker"
2023-05-11 05:08:15 +02:00
file_picker
else
exit
fi
2022-11-24 21:53:35 +01:00
else
2023-05-16 00:14:56 +02:00
write_to_config
2022-11-24 21:53:35 +01:00
fi
done
fi
2022-08-04 21:14:56 +02:00
done
2022-05-22 21:20:34 +02:00
}
err(){
printf "[ERROR] %s\n" "$1"
}
varcheck(){
2022-12-03 07:57:33 +01:00
if [[ -z $api_key ]] || [[ ! -d $steam_path ]] || [[ ! -d $game_dir ]]; then
echo 1
fi
2022-05-22 21:20:34 +02:00
}
2022-09-22 11:37:43 +02:00
run_depcheck(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-12-01 10:34:40 +01:00
if [[ -n $(depcheck) ]]; then
2022-10-08 13:09:33 +02:00
echo "100"
2023-07-25 03:10:07 +02:00
logger ERROR "Missing dependencies, quitting"
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --warning --ok-label="Exit" --title="DZGUI" --text="$(depcheck)"
2022-06-04 22:29:30 +02:00
exit
2022-05-22 21:20:34 +02:00
fi
2022-06-15 12:32:10 +02:00
}
2023-07-25 03:10:07 +02:00
logger(){
local date="$(date "+%F %T")"
local tag="$1"
local string="$2"
printf "[%s] [%s] %s\n" "$date" "$tag" "$string" >> "$debug_log"
2023-05-16 00:14:56 +02:00
}
2022-11-28 20:52:25 +01:00
check_pyver(){
2022-12-06 12:52:02 +01:00
pyver=$(python3 --version | awk '{print $2}')
2022-11-28 20:52:25 +01:00
if [[ -z $pyver ]] || [[ ${pyver:0:1} -lt 3 ]]; then
warn "Requires python >=3.0" &&
exit
fi
}
2022-06-15 12:32:10 +02:00
run_varcheck(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-06-15 12:32:10 +02:00
source $config_file
workshop_dir="$steam_path/steamapps/workshop/content/$aid"
game_dir="$steam_path/steamapps/common/DayZ"
2022-12-03 07:57:33 +01:00
if [[ $(varcheck) -eq 1 ]]; then
2022-12-02 08:25:08 +01:00
$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
2023-07-25 03:10:07 +02:00
logger ERROR "Malformed config vars"
exit
else
create_config
fi
2022-05-22 21:20:34 +02:00
fi
}
config(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-05-22 21:20:34 +02:00
if [[ ! -f $config_file ]]; then
2023-07-25 03:10:07 +02:00
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
2022-05-22 21:20:34 +02:00
code=$?
2023-07-25 03:10:07 +02:00
logger INFO "Return code $code"
2022-12-01 10:34:40 +01:00
#TODO: prevent progress if user hits ESC
2022-05-22 21:20:34 +02:00
if [[ $code -eq 1 ]]; then
exit
else
create_config
fi
else
source $config_file
fi
}
2022-10-08 14:12:22 +02:00
steam_deck_mods(){
until [[ -z $diff ]]; do
next=$(echo -e "$diff" | head -n1)
2022-12-02 08:25:08 +01:00
$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
2022-10-08 14:12:22 +02:00
rc=$?
if [[ $rc -eq 0 ]]; then
echo "[DZGUI] Opening ${workshop}$next"
2023-01-19 18:21:59 +01:00
$steam_cmd steam://url/CommunityFilePage/$next 2>/dev/null &
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --info --title="DZGUI" --ok-label="Next" --text="Click [Next] to continue mod check." --width=500 2>/dev/null
2022-10-08 14:12:22 +02:00
else
return 1
fi
compare
done
}
2022-10-08 04:50:47 +02:00
calc_mod_sizes(){
for i in "$diff"; do
2022-10-08 05:09:08 +02:00
local mods+=$(grep -w "$i" /tmp/modsizes | awk '{print $1}')
2022-10-08 04:50:47 +02:00
done
totalmodsize=$(echo -e "${mods[@]}" | awk '{s+=$1}END{print s}')
}
2022-10-08 14:12:22 +02:00
test_display_mode(){
pgrep -a gamescope | grep -q "generate-drm-mode"
[[ $? -eq 0 ]] && gamemode=1
}
2022-10-09 04:07:07 +02:00
foreground(){
if [[ $(command -v wmctrl) ]]; then
wmctrl -a "DZG Watcher"
else
local window_id=$(xdotool search --name "DZG Watcher")
xdotool windowactivate $window_id
fi
}
2022-06-04 22:29:30 +02:00
manual_mod_install(){
2022-10-08 14:12:22 +02:00
[[ $is_steam_deck -eq 1 ]] && test_display_mode
if [[ $gamemode -eq 1 ]]; then
steam_deck_mods
else
local ex="/tmp/dzc.tmp"
2022-10-26 02:22:19 +02:00
[[ -f $ex ]] && rm $ex
2022-10-08 14:12:22 +02:00
watcher(){
readarray -t stage_mods <<< "$diff"
for((i=0;i<${#stage_mods[@]};i++)); do
2022-10-08 13:04:49 +02:00
[[ -f $ex ]] && return 1
2022-10-08 14:12:22 +02:00
local downloads_dir="$steam_path/steamapps/workshop/downloads/$aid"
local workshop_dir="$steam_path/steamapps/workshop/content/$aid"
2023-01-19 18:21:59 +01:00
$steam_cmd "steam://url/CommunityFilePage/${stage_mods[$i]}"
2022-10-08 14:12:22 +02:00
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
2022-10-09 04:07:07 +02:00
foreground
2022-10-08 14:12:22 +02:00
until [[ -d $downloads_dir/${stage_mods[$i]} ]]; do
2022-10-26 02:22:19 +02:00
[[ -f $ex ]] && return 1
2022-10-08 14:12:22 +02:00
sleep 0.1s
if [[ -d $workshop_dir/${stage_mods[$i]} ]]; then
break
fi
2022-10-08 13:04:49 +02:00
done
2022-10-09 04:07:07 +02:00
foreground
2022-10-08 14:12:22 +02:00
echo "# Steam is downloading ${stage_mods[$i]} (mod $((i+1)) of ${#stage_mods[@]})"
until [[ -d $workshop_dir/${stage_mods[$i]} ]]; do
2022-10-26 02:22:19 +02:00
[[ -f $ex ]] && return 1
2022-10-08 14:12:22 +02:00
sleep 0.1s
2023-01-19 12:20:30 +01:00
done
2022-10-09 04:07:07 +02:00
foreground
2022-10-08 14:12:22 +02:00
echo "# ${stage_mods[$i]} moved to mods dir"
done
echo "100"
}
2022-12-02 08:25:08 +01:00
watcher > >($steamsafe_zenity --pulsate --progress --auto-close --title="DZG Watcher" --width=500 2>/dev/null; rc=$?; [[ $rc -eq 1 ]] && touch $ex)
2022-10-08 14:12:22 +02:00
compare
if [[ -z $diff ]]; then
2022-12-02 08:25:08 +01:00
passed_mod_check > >($steamsafe_zenity --pulsate --progress --auto-close --width=500 2>/dev/null)
2022-10-08 14:12:22 +02:00
launch
else
return 1
fi
2022-10-08 09:30:47 +02:00
fi
2022-06-04 22:29:30 +02:00
}
2022-07-24 15:20:06 +02:00
encode(){
2022-08-13 15:00:35 +02:00
echo "$1" | md5sum | cut -c -8
2022-07-24 15:20:06 +02:00
}
stale_symlinks(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-07-24 15:20:06 +02:00
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
2022-08-14 02:38:08 +02:00
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
2022-07-24 15:20:06 +02:00
}
2022-06-04 22:29:30 +02:00
symlinks(){
2023-07-25 03:10:07 +02:00
for d in "$workshop_dir"/*; do
id=$(awk -F"= " '/publishedid/ {print $2}' "$d"/meta.cpp | awk -F\; '{print $1}')
2022-07-24 15:20:06 +02:00
encoded_id=$(encode "$id")
2023-07-25 03:10:07 +02:00
mod=$(awk -F\" '/name/ {print $2}' "$d"/meta.cpp | sed -E 's/[^[:alpha:]0-9]+/_/g; s/^_|_$//g')
2022-07-24 15:20:06 +02:00
link="@$encoded_id"
2022-06-04 22:29:30 +02:00
if [[ -h "$game_dir/$link" ]]; then
2022-07-24 15:20:06 +02:00
:
else
2023-07-25 03:10:07 +02:00
printf "[DZGUI] Creating symlink for $mod\n"
ln -fs "$d" "$game_dir/$link"
2022-07-24 15:20:06 +02:00
fi
done
2022-06-04 22:29:30 +02:00
}
passed_mod_check(){
2023-07-25 03:10:07 +02:00
echo "[DZGUI] Passed mod check"
echo "# Preparing symlinks"
legacy_symlinks
2022-06-04 22:29:30 +02:00
symlinks
2022-09-26 21:04:06 +02:00
echo "100"
2023-07-25 03:10:07 +02:00
2022-05-22 21:20:34 +02:00
}
2022-10-23 20:09:35 +02:00
auto_mod_install(){
popup 300
rc=$?
if [[ $rc -eq 0 ]]; then
2023-07-25 03:10:07 +02:00
#calc_mod_sizes
#local total_size=$(numfmt --to=iec $totalmodsize)
2022-10-26 04:38:52 +02:00
log="$default_steam_path/logs/content_log.txt"
[[ -f "/tmp/dz.status" ]] && rm "/tmp/dz.status"
touch "/tmp/dz.status"
2022-10-23 20:09:35 +02:00
console_dl "$diff" &&
2023-01-19 18:21:59 +01:00
$steam_cmd steam://open/downloads && 2>/dev/null 1>&2
2023-01-19 12:20:30 +01:00
win=$(xdotool search --name "DZG Watcher")
xdotool windowactivate $win
2022-10-26 07:26:06 +02:00
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)
2023-01-19 12:20:30 +01:00
echo "# Downloaded $((${#modids[@]}-missing)) of ${#modids[@]} mods. ESC cancels"
2022-12-02 08:25:08 +01:00
done | $steamsafe_zenity --pulsate --progress --title="DZG Watcher" --auto-close --no-cancel --width=500 2>/dev/null
2022-10-23 20:09:35 +02:00
compare
2022-11-21 20:54:23 +01:00
[[ $force_update -eq 1 ]] && { unset force_update; return; }
2022-10-23 20:09:35 +02:00
if [[ -z $diff ]]; then
2022-10-26 02:22:19 +02:00
check_timestamps
passed_mod_check > >($steamsafe_zenity --pulsate --progress --title="DZGUI" --auto-close --width=500 2>/dev/null)
2022-10-23 20:09:35 +02:00
launch
else
manual_mod_install
fi
else
manual_mod_install
fi
}
2022-10-26 02:22:19 +02:00
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[@]}
2023-01-19 12:20:30 +01:00
[[ $max -eq 0 ]] && return
2022-10-26 02:22:19 +02:00
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(){
2022-11-21 20:54:23 +01:00
[[ $force_update -eq 1 ]] && echo "# Checking mod versions"
2022-10-26 02:22:19 +02:00
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
2023-01-19 12:20:30 +01:00
diff="$(printf "%s\n%s\n" "$diff" "${needs_update[@]}")"
2022-10-26 02:22:19 +02:00
fi
2022-11-21 20:54:23 +01:00
[[ $force_update -eq 1 ]] && echo "100"
}
update_history(){
[[ -n $(grep "$ip" $hist_file) ]] && return
if [[ -f $hist_file ]]; then
old=$(tail -n9 "$hist_file")
old="$old\n"
fi
echo -e "${old}${ip}" > "$hist_file"
2022-10-26 02:22:19 +02:00
}
2022-11-23 17:50:34 +01:00
is_steam_running(){
2023-07-25 03:10:07 +02:00
xdotool search --onlyvisible --name "Steam"
2022-11-23 17:50:34 +01:00
}
2022-06-04 22:29:30 +02:00
connect(){
#TODO: sanitize/validate input
2022-07-18 10:58:38 +02:00
readarray -t qport_arr <<< "$qport_list"
if [[ -z ${qport_arr[@]} ]]; then
2022-09-24 17:42:13 +02:00
err "98: Failed to obtain query ports"
2022-07-18 10:58:38 +02:00
return
fi
2022-06-04 22:29:30 +02:00
ip=$(echo "$1" | awk -F"$separator" '{print $1}')
bid=$(echo "$1" | awk -F"$separator" '{print $2}')
2022-09-03 21:40:21 +02:00
if [[ $2 == "ip" ]]; then
2022-12-02 08:25:08 +01:00
fetch_mods_sa "$ip" > >($steamsafe_zenity --pulsate --progress --auto-close --no-cancel --width=500 2>/dev/null)
2022-09-03 21:40:21 +02:00
else
fetch_mods "$bid"
fi
2022-09-14 06:56:13 +02:00
if [[ $ret -eq 96 ]]; then
unset ret
return
fi
2022-06-04 22:29:30 +02:00
validate_mods
rc=$?
[[ $rc -eq 1 ]] && return
compare
2022-11-21 20:54:23 +01:00
[[ $auto_install -eq 2 ]] && merge_modlists
2022-06-04 22:29:30 +02:00
if [[ -n $diff ]]; then
2022-12-03 13:20:36 +01:00
case $auto_install in
1|2) auto_mod_install ;;
*) manual_mod_install ;;
esac
2022-06-04 22:29:30 +02:00
else
2022-12-02 08:25:08 +01:00
passed_mod_check > >($steamsafe_zenity --pulsate --progress --auto-close --width=500 2>/dev/null)
2022-11-21 20:54:23 +01:00
update_history
2022-10-06 14:58:35 +02:00
launch
2022-06-04 22:29:30 +02:00
fi
}
2022-09-03 06:46:21 +02:00
fetch_mods(){
remote_mods=$(curl -s "$api" -H "Authorization: Bearer "$api_key"" -G -d filter[ids][whitelist]="$1" -d "sort=-players" \
| jq -r '.data[] .attributes .details .modIds[]')
}
fetch_mods_sa(){
2022-08-16 17:49:51 +02:00
sa_ip=$(echo "$1" | awk -F: '{print $1}')
for i in ${qport_arr[@]}; do
2022-07-18 10:58:38 +02:00
if [[ -n $(echo "$i" | awk -v ip=$ip '$0 ~ ip') ]]; then
sa_port=$(echo $i | awk -v ip=$ip -F$separator '$0 ~ ip {print $2}')
fi
done
echo "[DZGUI] Querying modlist on ${sa_ip}:${sa_port}"
2022-09-26 21:04:06 +02:00
echo "# Querying modlist on ${sa_ip}:${sa_port}"
2022-09-14 06:56:13 +02:00
local response=$(curl -Ls "https://dayzsalauncher.com/api/v1/query/$sa_ip/$sa_port")
local status=$(echo "$response" | jq '.status')
if [[ $status -eq 1 ]]; then
2022-09-26 21:04:06 +02:00
echo "100"
2022-09-24 17:42:13 +02:00
err "97: Failed to fetch modlist"
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --error --title="DZGUI" --width=500 --text="[ERROR] 97: Failed to fetch modlist" 2>/dev/null &&
2022-09-14 06:56:13 +02:00
ret=96
2022-07-18 10:58:38 +02:00
return
fi
2022-09-14 06:56:13 +02:00
remote_mods=$(echo "$response" | jq -r '.result.mods[].steamWorkshopId')
2022-08-16 17:49:51 +02:00
qport_arr=()
}
prepare_ip_list(){
2023-01-02 02:22:58 +01:00
ct=$(< "$1" jq '[.response.servers[]]|length' 2>/dev/null)
#old servers may become stale and return nothing
if [[ -n $ct ]]; then
for((i=0;i<$ct;i++));do
name=$(< $json jq --arg i $i -r '[.servers[]][($i|tonumber)].name')
addr=$(< $json jq --arg i $i -r '[.servers[]][($i|tonumber)].addr')
ip=$(echo "$addr" | awk -F: '{print $1}')
local qport=$(awk -F: '{print $2}' <<< $addr)
players=$(< $json jq --arg i $i -r '[.servers[]][($i|tonumber)].players')
max_players=$(< $json jq --arg i $i -r '[.servers[]][($i|tonumber)].max_players')
gameport=$(< $json jq --arg i $i -r '[.servers[]][($i|tonumber)].gameport')
ip_port=$(echo "$ip:$gameport")
time=$(< $json jq --arg i $i -r '[.servers[]][($i|tonumber)].gametype' | grep -oP '(?<!\d)\d{2}:\d{2}(?!\d)')
echo "$name"
echo "$ip_port"
echo "$players/$max_players"
echo "$time"
echo "$qport"
done
fi
2022-08-16 17:49:51 +02:00
}
2022-11-21 20:54:23 +01:00
history_table(){
2022-12-03 07:57:33 +01:00
[[ -f /tmp/dz.hist ]] && rm /tmp/dz.hist
2022-11-21 20:54:23 +01:00
for i in $(cat $hist_file); do
2022-11-24 21:53:35 +01:00
echo "# Getting metadata for $i"
2022-11-21 20:54:23 +01:00
local meta_file=$(mktemp)
source $config_file
local url="https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100\gameaddr\\$i&key=$steam_api"
curl -Ls "$url" > $meta_file
json=$(mktemp)
< $meta_file jq '.response' > $json
res=$(< $meta_file jq -er '.response.servers[]' 2>/dev/null)
2022-11-24 21:53:35 +01:00
prepare_ip_list "$meta_file" >> /tmp/dz.hist
sleep 0.5s
done | $steamsafe_zenity --pulsate --progress --auto-close --title="DZGUI" --width=500 --no-cancel 2>/dev/null
2022-11-24 21:53:35 +01:00
[[ $? -eq 1 ]] && return
2022-11-21 20:54:23 +01:00
while true; do
sel=$(cat /tmp/dz.hist | $steamsafe_zenity --width 1200 --height 800 --title="DZGUI" --text="Recent servers" --list --column=Name --column=IP --column=Players --column=Gametime --column=Qport --print-column=2,5 --separator=%% 2>/dev/null)
2022-11-21 20:54:23 +01:00
if [[ $? -eq 1 ]]; then
return_from_table=1
rm /tmp/dz.hist
return
fi
if [[ -z $sel ]]; then
echo "No selection"
else
2023-01-02 02:22:58 +01:00
local addr="$(echo "$sel" | awk -F"%%" '{print $1}')"
local qport="$(echo "$sel" | awk -F"%%" '{print $2}')"
local ip=$(awk -F: '{print $1}' <<< $addr)
local gameport=$(awk -F: '{print $2}' <<< $addr)
2022-11-21 20:54:23 +01:00
local sa_ip=$(echo "$ip:$gameport%%$qport")
qport_list="$sa_ip"
connect "$sel" "ip"
fi
done
rm /tmp/dz.hist
}
2022-08-16 17:49:51 +02:00
ip_table(){
while true; do
2023-07-25 03:10:07 +02:00
sel=$(prepare_ip_list "$meta_file" | $steamsafe_zenity --width 1200 --height 800 --text="One or more 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=2 --separator=%% 2>/dev/null)
2022-08-16 17:49:51 +02:00
if [[ $? -eq 1 ]]; then
return_from_table=1
return
fi
if [[ -z $sel ]]; then
echo "No selection"
else
local gameport="$(echo "$sel" | awk -F: '{print $2}')"
2022-09-03 21:55:22 +02:00
local ip="$(echo "$sel" | awk -F: '{print $1}')"
2022-08-16 17:49:51 +02:00
local addr=$(< $json jq -r --arg gameport $gameport '.servers[]|select(.gameport == ($gameport|tonumber)).addr')
local qport=$(echo "$addr" | awk -F: '{print $2}')
local sa_ip=$(echo "$ip:$gameport%%$qport")
qport_list="$sa_ip"
2022-09-03 21:40:21 +02:00
connect "$sel" "ip"
2022-08-16 17:49:51 +02:00
fi
done
}
fetch_ip_metadata(){
2023-02-22 08:00:31 +01:00
meta_file=$(mktemp)
2022-08-16 17:49:51 +02:00
source $config_file
url="https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100\gameaddr\\$ip&key=$steam_api"
curl -Ls "$url" > $meta_file
json=$(mktemp)
< $meta_file jq '.response' > $json
res=$(< $meta_file jq -er '.response.servers[]' 2>/dev/null)
}
#TODO: local servers
#local_ip(){
#(^127\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)
#}
2022-10-03 08:42:18 +02:00
test_steam_api(){
local code=$(curl -ILs "https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100&limit=10&key=$steam_api" \
| grep -E "^HTTP")
2022-10-11 13:58:00 +02:00
[[ $code =~ 403 ]] && echo 1
[[ $code =~ 200 ]] && echo 0
2022-10-03 08:42:18 +02:00
}
2023-01-02 02:22:58 +01:00
test_bm_api(){
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
}
2022-08-16 17:49:51 +02:00
add_steam_api(){
2022-10-11 13:58:00 +02:00
[[ $(test_steam_api) -eq 1 ]] && return 1
2022-08-16 17:49:51 +02:00
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"
2022-12-02 08:25:08 +01:00
$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
2022-08-16 17:49:51 +02:00
source $config_file
}
2022-09-13 06:41:26 +02:00
check_steam_api(){
2022-08-16 17:49:51 +02:00
if [[ -z $steam_api ]]; then
2022-12-02 08:25:08 +01:00
steam_api=$($steamsafe_zenity --entry --text="Key 'steam_api' not present in config file. Enter Steam API key:" --title="DZGUI" 2>/dev/null)
2022-08-31 10:22:07 +02:00
if [[ $? -eq 1 ]] ; then
return
2022-10-11 13:58:00 +02:00
elif [[ ${#steam_api} -lt 32 ]] || [[ $(test_steam_api) -eq 1 ]]; then
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --warning --title="DZGUI" --text="Check API key and try again." 2>/dev/null
2022-10-03 08:42:18 +02:00
return 1
2022-08-16 17:49:51 +02:00
else
add_steam_api
fi
fi
2022-09-13 06:41:26 +02:00
}
validate_ip(){
echo "$1" | grep -qP '^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$'
}
connect_by_ip(){
source $config_file
check_steam_api
2022-10-03 08:42:18 +02:00
[[ $? -eq 1 ]] && return
2022-08-16 17:49:51 +02:00
while true; do
2022-08-31 10:22:07 +02:00
if [[ $return_from_table -eq 1 ]]; then
return_from_table=0
return
fi
2022-12-02 08:25:08 +01:00
ip=$($steamsafe_zenity --entry --text="Enter server IP (omit port)" --title="DZGUI" 2>/dev/null)
2022-08-31 10:22:07 +02:00
[[ $? -eq 1 ]] && return
if validate_ip "$ip"; then
fetch_ip_metadata
2023-02-22 08:00:31 +01:00
if [[ ! $? -eq 0 ]]; then
warn "[ERROR] 96: Failed to retrieve IP metadata. Check IP or API key and try again."
echo "[DZGUI] 96: Failed to retrieve IP metadata"
else
ip_table
fi
2022-08-31 10:22:07 +02:00
else
continue
fi
2022-08-16 17:49:51 +02:00
done
}
2022-05-22 21:20:34 +02:00
fetch_mods(){
remote_mods=$(curl -s "$api" -H "Authorization: Bearer "$api_key"" -G -d filter[ids][whitelist]="$1" -d "sort=-players" \
| jq -r '.data[] .attributes .details .modIds[]')
2022-05-09 13:42:24 +02:00
}
2022-06-12 06:44:30 +02:00
query_defunct(){
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'
}
2022-10-06 14:50:37 +02:00
result=$(post | jq -r '.[].publishedfiledetails[] | select(.result==1) | "\(.file_size) \(.publishedfileid)"')
2022-10-08 04:50:47 +02:00
echo "$result" > /tmp/modsizes
2022-10-06 14:50:37 +02:00
readarray -t newlist <<< $(echo -e "$result" | awk '{print $2}')
2022-06-12 06:44:30 +02:00
}
2022-06-04 22:29:30 +02:00
validate_mods(){
url="https://steamcommunity.com/sharedfiles/filedetails/?id="
newlist=()
readarray -t modlist <<< $remote_mods
2022-06-12 06:44:30 +02:00
query_defunct
2022-06-04 22:29:30 +02:00
}
server_modlist(){
for i in "${newlist[@]}"; do
printf "$i\n"
done
}
compare(){
2022-11-25 06:34:16 +01:00
diff=$(comm -23 <(server_modlist | sort -u) <(installed_mods | sort))
2022-06-04 22:29:30 +02:00
}
installed_mods(){
ls -1 "$workshop_dir"
}
2022-05-09 13:42:24 +02:00
concat_mods(){
if [[ -z ${remote_mods[@]} ]]; then
return 1
else
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}')
2022-07-24 15:20:06 +02:00
encoded_id=$(encode $id)
link="@$encoded_id;"
echo -e "$link"
done | tr -d '\n' | perl -ple 'chop'
fi
2022-05-09 13:42:24 +02:00
}
launch(){
mods=$(concat_mods)
if [[ $debug -eq 1 ]]; then
2023-01-19 14:57:09 +01:00
launch_options="$steam_cmd -applaunch $aid -connect=$ip -nolauncher -nosplash -name=$name -skipintro \"-mod=$mods\""
2022-09-26 21:04:06 +02:00
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)"
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --question --title="DZGUI" --ok-label="Write to file" --cancel-label="Back"\
2022-07-24 15:20:06 +02:00
--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
2022-08-15 12:39:05 +02:00
echo "[DZGUI] Wrote launch options to $source_dir/options.log"
2023-07-25 03:10:07 +02:00
$steamsafe_zenity --info --width=500 --title="DZGUI" --text="Wrote launch options to \n$source_dir/options.log" 2>/dev/null
2022-07-24 15:20:06 +02:00
fi
2022-05-09 13:42:24 +02:00
else
2022-06-13 03:16:03 +02:00
echo "[DZGUI] All OK. Launching DayZ"
2023-07-25 03:10:07 +02:00
$steamsafe_zenity --width=500 --title="DZGUI" --info --text="Launch conditions satisfied.\nDayZ will now launch after clicking [OK]." 2>/dev/null
2023-01-19 14:57:09 +01:00
$steam_cmd -applaunch $aid -connect=$ip -nolauncher -nosplash -skipintro -name=$name \"-mod=$mods\"
2022-05-09 13:42:24 +02:00
exit
fi
2022-06-15 12:32:10 +02:00
one_shot_launch=0
}
browser(){
if [[ $is_steam_deck -eq 1 ]]; then
2023-05-19 16:29:21 +02:00
steam steam://openurl/"$1" 2>/dev/null
2022-06-15 12:32:10 +02:00
elif [[ $is_steam_deck -eq 0 ]]; then
2023-05-19 16:29:21 +02:00
if [[ -n "$BROWSER" ]]; then
"$BROWSER" "$1" 2>/dev/null
else
xdg-open "$1" 2>/dev/null
fi
2022-06-15 12:32:10 +02:00
fi
}
2023-05-19 16:29:21 +02:00
report_bug(){
browser "$issues_url"
}
2022-10-11 09:07:34 +02:00
forum(){
2023-05-19 16:29:21 +02:00
browser "$forum_url"
2022-10-11 09:07:34 +02:00
}
2022-06-15 12:32:10 +02:00
help_file(){
2023-05-19 16:29:21 +02:00
browser "$help_url"
}
sponsor(){
browser "$sponsor_url"
}
hof(){
browser "${help_url}#_hall_of_fame"
2022-05-22 21:20:34 +02:00
}
set_mode(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-05-22 21:20:34 +02:00
if [[ $debug -eq 1 ]]; then
2022-06-04 22:29:30 +02:00
mode=debug
2022-05-22 21:20:34 +02:00
else
mode=normal
fi
2023-07-25 03:10:07 +02:00
logger INFO "Mode is $mode"
2022-05-22 21:20:34 +02:00
}
2022-07-24 15:20:06 +02:00
delete_by_id(){
2022-11-24 21:53:35 +01:00
new_whitelist="whitelist=\"$(echo "$whitelist" | sed "s/,$server_id$//;s/^$server_id,//;s/,$server_id,/,/;s/^$server_id$//")\""
2022-07-24 15:20:06 +02:00
mv $config_file ${config_path}dztuirc.old
nr=$(awk '/whitelist=/ {print NR}' ${config_path}dztuirc.old)
awk -v "var=$new_whitelist" -v "nr=$nr" 'NR==nr {$0=var}{print}' ${config_path}dztuirc.old > ${config_path}dztuirc
echo "[DZGUI] Removed $server_id from key 'whitelist'"
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --info --title="DZGUI" --text="Removed "$server_id" from:\n${config_path}dztuirc\nIf errors occur, you can restore the file:\n${config_path}dztuirc.old" --width=500 2>/dev/null
2022-07-24 15:20:06 +02:00
source $config_file
}
delete_or_connect(){
2023-02-22 08:00:31 +01:00
if [[ $delete -eq 1 ]]; then
server_name=$(echo "$sel" | awk -F"%%" '{print $1}')
server_id=$(echo "$sel" | awk -F"%%" '{print $2}')
$steamsafe_zenity --question --text="Delete this server? \n$server_name" --title="DZGUI" --width=500 2>/dev/null
2023-02-22 08:00:31 +01:00
if [[ $? -eq 0 ]]; then
delete_by_id $server_id
fi
source $config_file
unset delete
else
local lookup_ip=$(echo "$sel" | awk -F: '{print $1}')
ip=$lookup_ip
fetch_ip_metadata
if [[ ! $? -eq 0 ]]; then
warn "[ERROR] 96: Failed to retrieve IP metadata. Check IP or API key and try again."
echo "[DZGUI] 96: Failed to retrieve IP metadata"
2022-07-24 15:20:06 +02:00
else
2023-02-22 08:00:31 +01:00
local jad=$(echo "$res" | jq -r '.addr')
if [[ $(<<< "$jad" wc -l ) -gt 1 ]]; then
ip_table
elif [[ $(<<< "$jad" wc -l ) -eq 1 ]]; then
local gameport="$(echo "$res" | jq -r '.gameport')"
local ip="$(echo "$jad" | awk -F: '{print $1}')"
local qport=$(echo "$jad" | awk -F: '{print $2}')
local sa_ip=$(echo "$ip:$gameport%%$qport")
qport_list="$sa_ip"
local sel="$ip:$gameport%%$qport"
connect "$sel" "ip"
fi
2022-07-24 15:20:06 +02:00
fi
2023-02-22 08:00:31 +01:00
fi
2022-07-24 15:20:06 +02:00
}
2022-06-04 22:29:30 +02:00
populate(){
2022-05-22 21:20:34 +02:00
while true; do
2022-07-24 15:20:06 +02:00
if [[ $delete -eq 1 ]]; then
cols="--column="Server" --column="ID""
set_header "delete"
else
cols="--column="Server" --column="IP" --column="Players" --column="Gametime" --column="Status" --column="ID" --column="Ping""
set_header ${FUNCNAME[0]}
fi
2022-06-04 22:29:30 +02:00
rc=$?
if [[ $rc -eq 0 ]]; then
2022-07-18 10:58:38 +02:00
if [[ -z $sel ]]; then
2022-06-04 22:29:30 +02:00
warn "No item was selected."
else
2022-07-24 15:20:06 +02:00
delete_or_connect
return
2022-06-04 22:29:30 +02:00
fi
else
2022-07-24 15:20:06 +02:00
delete=0
2022-06-04 22:29:30 +02:00
return
fi
done
}
list_mods(){
2022-09-29 19:54:39 +02:00
if [[ -z $(installed_mods) ]] || [[ -z $(find $workshop_dir -maxdepth 2 -name "*.cpp" | grep .cpp) ]]; then
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --info --text="94: No mods currently installed or incorrect path given" $sd_res 2>/dev/null
2022-06-15 12:32:10 +02:00
else
2022-07-24 15:20:06 +02:00
for d in $(find $game_dir/* -maxdepth 1 -type l); do
dir=$(basename $d)
2023-05-10 20:08:18 +02:00
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
2022-06-15 12:32:10 +02:00
fi
2022-06-04 22:29:30 +02:00
}
2022-07-24 15:20:06 +02:00
fetch_query_ports(){
qport_list=$(echo "$response" | jq -r '.data[] .attributes | "\(.ip):\(.port)%%\(.portQuery)"')
}
2022-06-04 22:29:30 +02:00
connect_to_fav(){
2022-06-15 12:32:10 +02:00
if [[ -n $fav ]]; then
one_shot_launch=1
query_api
2022-07-24 15:20:06 +02:00
fetch_query_ports
2022-06-15 12:32:10 +02:00
echo "[DZGUI] Attempting connection to $fav_label"
2022-10-03 00:24:27 +02:00
connect "$qport_list" "ip"
one_shot_launch=0
2022-06-15 12:32:10 +02:00
else
2022-09-24 17:42:13 +02:00
warn "93: No fav server configured"
2022-06-15 12:32:10 +02:00
fi
2022-06-04 22:29:30 +02:00
}
2022-07-18 10:58:38 +02:00
set_header(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
logger INFO "Header mode is $1"
2023-05-19 16:29:21 +02:00
print_news
2022-10-23 20:09:35 +02:00
[[ $auto_install -eq 2 ]] && install_mode="auto"
[[ $auto_install -eq 1 ]] && install_mode="headless"
2022-10-07 06:30:09 +02:00
[[ $auto_install -eq 0 ]] && install_mode=manual
2022-07-24 15:20:06 +02:00
if [[ $1 == "delete" ]]; then
2022-12-02 08:25:08 +01:00
sel=$(cat $tmp | $steamsafe_zenity $sd_res --list $cols --title="DZGUI" --text="DZGUI $version | Mode: $mode | Branch: $branch | Mods: $install_mode | Fav: $fav_label" \
2022-07-24 15:20:06 +02:00
--separator="$separator" --print-column=1,2 --ok-label="Delete" 2>/dev/null)
elif [[ $1 == "populate" ]]; then
2022-12-02 08:25:08 +01:00
sel=$(cat $tmp | $steamsafe_zenity $sd_res --list $cols --title="DZGUI" --text="DZGUI $version | Mode: $mode | Branch: $branch | Mods: $install_mode | Fav: $fav_label" \
2022-07-18 10:58:38 +02:00
--separator="$separator" --print-column=2,6 2>/dev/null)
elif [[ $1 == "main_menu" ]]; then
2023-02-22 08:00:31 +01:00
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)
2022-07-18 10:58:38 +02:00
fi
}
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
printf "[DZGUI] Toggled branch to '$branch'\n"
source $config_file
}
2023-07-25 03:10:07 +02:00
generate_log(){
cat <<-DOC
Linux: $(uname -mrs)
Version: $version
Branch: $branch
Whitelist: $whitelist
Steam path: $steam_path
Workshop path: $workshop_dir
Game path: $game_dir
Mods:
$(list_mods)
DOC
2023-05-11 05:10:27 +02:00
}
focus_beta_client(){
2023-10-21 15:39:23 +02:00
steam steam://open/library &&
2023-07-25 03:10:07 +02:00
steam steam://open/console 2>/dev/null 1>&2 &&
sleep 1s
2023-05-11 05:10:27 +02:00
wid(){
2023-10-21 15:39:23 +02:00
wmctrl -ilx |\
awk 'tolower($3) == "steamwebhelper.steam"' |\
grep "Steam Games List" |\
awk '{print $1}'
2023-05-11 05:10:27 +02:00
}
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
}
2022-10-23 20:09:35 +02:00
console_dl(){
readarray -t modids <<< "$@"
2023-07-25 03:10:07 +02:00
focus_beta_client
# steam steam://open/console 2>/dev/null 1>&2 &&
# sleep 1s
2022-11-21 20:54:23 +01:00
#https://github.com/jordansissel/xdotool/issues/67
2023-01-02 02:22:58 +01:00
#https://dwm.suckless.org/patches/current_desktop/
2023-07-25 03:10:07 +02:00
# local wid=$(xdotool search --onlyvisible --name Steam)
#xdotool windowactivate $wid
2023-05-11 05:08:15 +02:00
sleep 1.5s
2022-10-23 20:09:35 +02:00
for i in "${modids[@]}"; do
2023-07-25 03:10:07 +02:00
xdotool type --delay 0 "workshop_download_item $aid $i"
sleep 0.5s
xdotool key Return
sleep 0.5s
2022-10-23 20:09:35 +02:00
done
}
find_default_path(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-11-24 21:53:35 +01:00
discover(){
echo "# Searching for Steam"
2023-05-16 13:05:36 +02:00
default_steam_path=$(find / -type d \( -path "/proc" -o -path "*/timeshift" -o -path \
2022-12-03 05:05:12 +01:00
"/tmp" -o -path "/usr" -o -path "/boot" -o -path "/proc" -o -path "/root" \
2022-11-24 21:53:35 +01:00
-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@@')
}
2022-10-26 02:22:19 +02:00
if [[ $is_steam_deck -eq 1 ]]; then
default_steam_path="$HOME/.local/share/Steam"
else
2023-05-16 13:05:36 +02:00
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"
2022-10-26 02:22:19 +02:00
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)
2022-11-24 21:53:35 +01:00
case "$res" in
2022-12-03 07:57:33 +01:00
*auto*) discover ;;
*manual*)
2022-12-03 13:20:36 +01:00
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 &&
2022-12-03 07:57:33 +01:00
file_picker ;;
2022-11-24 21:53:35 +01:00
esac
2022-10-26 02:22:19 +02:00
fi
fi
2022-10-23 20:09:35 +02:00
}
popup(){
2022-11-21 20:54:23 +01:00
pop(){
$steamsafe_zenity --info --text="$1" --title="DZGUI" --width=500 2>/dev/null
2022-11-21 20:54:23 +01:00
}
case "$1" in
2023-05-16 13:05:36 +02:00
100) pop "This feature requires xdotool and wmctrl.";;
2022-11-21 20:54:23 +01:00
200) pop "This feature is not supported on Gaming Mode.";;
300) pop "\nThe Steam console will now open and briefly issue commands to\ndownload the workshop files, then return to the download progress page.\n\nEnsure that the Steam console has keyboard and mouse focus\n(keep hands off keyboard) while the commands are being issued.\n\nDepending on the number if mods, it may take some time to queue the downloads,\nbut if a popup or notification window steals focus, it could obstruct\nthe process." ;;
400) pop "Automod install enabled. Auto-downloaded mods will not appear\nin your Steam Workshop subscriptions, but DZGUI will\ntrack the version number of downloaded mods internally\nand trigger an update if necessary." ;;
500) pop "Automod install disabled.\nSwitched to manual mode." ;;
2022-11-24 21:53:35 +01:00
600) pop "No preferred servers set." ;;
2023-01-19 12:20:30 +01:00
700) pop "Toggled to Flatpak Steam." ;;
800) pop "Toggled to native Steam." ;;
2023-05-20 12:53:51 +02:00
900) pop "This feature is not supported on Steam Deck." ;;
1000) pop "No recent history."
2022-11-21 20:54:23 +01:00
esac
2022-10-23 20:09:35 +02:00
}
toggle_console_dl(){
2023-05-16 13:05:36 +02:00
[[ $is_steam_deck -eq 1 ]] && { popup 900; return; }
2022-10-23 20:09:35 +02:00
[[ ! $(command -v xdotool) ]] && { popup 100; return; }
2023-05-16 13:05:36 +02:00
[[ ! $(command -v wmctrl) ]] && { popup 100; return; }
2022-10-23 20:09:35 +02:00
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"
2022-11-21 20:54:23 +01:00
popup 500
2022-10-23 20:09:35 +02:00
else
auto_install="2"
2022-11-21 20:54:23 +01:00
popup 400
2022-10-23 20:09:35 +02:00
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
}
2022-11-21 20:54:23 +01:00
force_update_mods(){
if [[ -f $version_file ]]; then
awk '{OFS="\t"}{$2="000"}1' $version_file > /tmp/versions
mv /tmp/versions $version_file
fi
}
2023-01-19 12:20:30 +01:00
toggle_steam_binary(){
2023-01-19 17:55:41 +01:00
case "$steam_cmd" in
2023-01-19 12:20:30 +01:00
steam)
steam_cmd="flatpak run com.valvesoftware.Steam"
2023-01-19 17:55:41 +01:00
update_steam_cmd
2023-01-19 12:20:30 +01:00
popup 700
;;
2023-01-19 17:55:41 +01:00
flatpak*)
steam_cmd="steam"
2023-01-19 17:55:41 +01:00
update_steam_cmd
2023-01-19 12:20:30 +01:00
popup 800;;
esac
}
2022-10-07 06:30:09 +02:00
options_menu(){
2022-10-23 20:09:35 +02:00
case "$auto_install" in
2022-12-03 13:20:36 +01:00
0|1|"") auto_hr="OFF"; ;;
2) auto_hr="ON"; ;;
2022-10-23 20:09:35 +02:00
esac
2022-07-18 10:58:38 +02:00
debug_list=(
"Toggle branch"
2022-10-07 12:19:09 +02:00
"Toggle debug mode"
2023-10-21 15:39:23 +02:00
"Output system info"
2022-10-23 20:09:35 +02:00
"Toggle auto mod install [$auto_hr]"
2022-07-18 10:58:38 +02:00
)
2022-12-03 13:20:36 +01:00
#TODO: tech debt: drop old flags
[[ $auto_install -eq 2 ]] || [[ $auto_install -eq 1 ]] && debug_list+=("Force update local mods")
2023-01-19 17:55:41 +01:00
case "$steam_cmd" in
2023-01-19 12:20:30 +01:00
steam) steam_hr=Steam ;;
2023-01-19 17:55:41 +01:00
flatpak*) steam_hr=Flatpak ;;
2023-01-19 12:20:30 +01:00
esac
[[ $toggle_steam -eq 1 ]] && debug_list+=("Toggle native Steam or Flatpak [$steam_hr]")
2022-12-02 08:25:08 +01:00
debug_sel=$($steamsafe_zenity --list --width=1280 --height=800 --column="Options" --title="DZGUI" --hide-header "${debug_list[@]}" 2>/dev/null)
2022-12-03 13:20:36 +01:00
[[ -z $debug_sel ]] && return
2023-01-19 18:02:36 +01:00
case "$debug_sel" in
"Toggle branch")
enforce_dl=1
toggle_branch &&
check_version
;;
"Toggle debug mode") toggle_debug ;;
2023-10-21 15:39:23 +02:00
"Output system info")
2023-01-19 18:02:36 +01:00
source_script=$(realpath "$0")
source_dir=$(dirname "$source_script")
2023-10-21 15:39:23 +02:00
generate_log > "$source_dir/DZGUI.log"
2023-07-25 03:10:07 +02:00
$steamsafe_zenity --info --width=500 --title="DZGUI" --text="Wrote log file to \n$source_dir/log" 2>/dev/null
2023-10-21 15:39:23 +02:00
printf "[DZGUI] Wrote log file to %s/log\n" "$source_dir"
2023-01-19 18:02:36 +01:00
;;
Toggle[[:space:]]auto*) toggle_console_dl ;;
"Force update local mods")
force_update=1
force_update_mods
merge_modlists > >($steamsafe_zenity --pulsate --progress --no-cancel --auto-close --title="DZGUI" --width=500 2>/dev/null)
2023-01-19 18:02:36 +01:00
auto_mod_install
;;
Toggle[[:space:]]native*) toggle_steam_binary ;;
esac
2022-07-18 10:58:38 +02:00
}
2022-07-24 15:20:06 +02:00
query_and_connect(){
2022-11-24 21:53:35 +01:00
[[ -z $whitelist ]] && { popup 600; return; }
2023-05-16 00:14:56 +02:00
q(){
query_api
parse_json
2022-10-03 08:42:18 +02:00
create_array
2023-05-16 00:14:56 +02:00
}
2023-07-25 03:10:07 +02:00
q | $steamsafe_zenity --width=500 --progress --pulsate --title="DZGUI" --auto-close 2>/dev/null
2022-07-24 15:20:06 +02:00
rc=$?
if [[ $rc -eq 1 ]]; then
:
else
populate
fi
}
2022-09-12 16:55:30 +02:00
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)
2022-09-13 15:45:28 +02:00
local map_ct=$(echo "$maps" | wc -l)
2022-12-02 08:25:08 +01:00
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")
2022-09-12 16:55:30 +02:00
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(){
2022-09-22 11:37:43 +02:00
if [[ -z $(command -v dig) ]]; then
local local_ip=$(curl -Ls "https://ipecho.net/plain")
else
local local_ip=$(dig +short myip.opendns.com @resolver1.opendns.com)
fi
2022-09-12 16:55:30 +02:00
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
2022-09-25 19:29:19 +02:00
printf "DZGUI %s | " "$version"
printf "Mode: %s |" "$mode"
printf "Fav: %s " "$fav_label"
2022-09-23 12:52:22 +02:00
printf "\nIncluded: %s | " "$filters"
2022-09-13 06:41:26 +02:00
printf "Excluded: %s " "$(disabled)"
2022-09-12 16:55:30 +02:00
if [[ -n $search ]]; then
2022-09-23 12:52:22 +02:00
printf "| Keyword: %s " "$search"
2022-09-12 16:55:30 +02:00
fi
2022-09-23 12:52:22 +02:00
printf "\nReturned: %s %s of %s | " "${#qport[@]}" "$entry" "$total_servers"
2023-05-11 03:23:52 +02:00
printf "Players in-game: %s" "$players_online"
2022-09-12 16:55:30 +02:00
}
check_geo_file(){
local gzip="$helpers_path/ips.csv.gz"
2022-09-14 06:22:14 +02:00
curl -Ls "$sums_url" > "$sums_path"
2022-09-14 06:56:13 +02:00
cd "$helpers_path"
md5sum -c "$sums_path" 2>/dev/null 1>&2
2022-09-14 06:22:14 +02:00
local res=$?
2022-10-07 12:19:09 +02:00
cd $OLDPWD
2022-09-14 06:22:14 +02:00
if [[ $res -eq 1 ]]; then
2022-09-12 16:55:30 +02:00
run(){
mkdir -p "$helpers_path"
2022-09-14 06:22:14 +02:00
echo "# Fetching new geolocation DB"
2022-09-12 16:55:30 +02:00
curl -Ls "$db_file" > "$gzip"
echo "# Extracting coordinates"
2022-09-14 06:56:13 +02:00
#force overwrite
gunzip -f "$gzip"
2022-09-12 16:55:30 +02:00
echo "# Preparing helper file"
curl -Ls "$km_helper_url" > "$km_helper"
2022-09-14 06:22:14 +02:00
chmod +x $km_helper
2022-09-12 16:55:30 +02:00
echo "100"
}
2022-12-02 08:25:08 +01:00
run > >($steamsafe_zenity --pulsate --progress --auto-close --width=500 2>/dev/null)
2023-10-21 15:39:23 +02:00
fi
2022-09-12 16:55:30 +02:00
}
choose_filters(){
2022-09-25 22:35:58 +02:00
if [[ $is_steam_deck -eq 0 ]]; then
sd_res="--width=1920 --height=1080"
fi
2023-01-02 02:22:58 +01:00
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)
2022-09-12 16:55:30 +02:00
if [[ $sels =~ Keyword ]]; then
2022-12-02 08:25:08 +01:00
search=$($steamsafe_zenity --entry --text="Search (case insensitive)" --width=500 --title="DZGUI" 2>/dev/null | awk '{print tolower($0)}')
2022-09-12 16:55:30 +02:00
[[ -z $search ]] && { ret=97; return; }
2023-10-21 15:39:23 +02:00
fi
2022-09-12 16:55:30 +02:00
[[ -z $sels ]] && return
2022-09-27 03:40:05 +02:00
filters=$(echo "$sels" | sed 's/|/, /g;s/ (untick to select from map list)//')
2022-09-12 16:55:30 +02:00
}
get_dist(){
local given_ip="$1"
2022-09-13 15:35:13 +02:00
local network="$(echo "$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}')
2022-09-12 16:55:30 +02:00
if [[ -z $remote_lat ]]; then
local dist="Unknown"
echo "$dist"
else
2022-09-14 06:22:14 +02:00
local dist=$($km_helper "$local_lat" "$local_lon" "$remote_lat" "$remote_lon")
2023-10-21 15:39:23 +02:00
LC_NUMERIC=C printf "%05.0f %s" "$dist" "km"
2022-09-12 16:55:30 +02:00
fi
}
prepare_filters(){
2022-09-14 06:22:14 +02:00
echo "# Filtering list"
2022-09-12 16:55:30 +02:00
[[ ! "$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"
}
2022-09-23 12:52:22 +02:00
write_fifo(){
2022-09-25 22:24:08 +02:00
[[ -p $fifo ]] && rm $fifo
mkfifo $fifo
2022-09-23 12:52:22 +02:00
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]}" \
2022-09-25 22:24:08 +02:00
"${players[$i]}" "${max[$i]}" "$(get_dist ${addr[$i]})" "${addr[$i]}" "${gameport[$i]}" "${qport[$i]}" >> $fifo
2022-09-23 12:52:22 +02:00
done
}
2022-09-12 16:55:30 +02:00
munge_servers(){
if [[ ! "$sels" =~ "All maps" ]]; then
2022-12-02 08:25:08 +01:00
filter_maps > >($steamsafe_zenity --pulsate --progress --auto-close --width=500 2>/dev/null)
2022-09-12 16:55:30 +02:00
disabled+=("All maps")
fi
[[ $ret -eq 97 ]] && return
2022-12-02 08:25:08 +01:00
prepare_filters > >($steamsafe_zenity --pulsate --progress --auto-close --width=500 2>/dev/null)
2022-09-12 16:55:30 +02:00
if [[ $(echo "$response" | jq 'length') -eq 0 ]]; then
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --error --text="No matching servers" 2>/dev/null
2022-09-12 16:55:30 +02:00
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}')
2022-09-13 15:35:13 +02:00
#jq bug #1788, raw output cannot be used with ASCII
2022-09-14 15:10:27 +02:00
local name=$(echo "$response" | jq -a '.[].name' | sed 's/\\u[0-9a-z]\{4\}//g;s/^"//;s/"$//')
2022-09-12 16:55:30 +02:00
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
2022-09-23 12:52:22 +02:00
write_fifo &
pid=$!
2022-12-02 08:25:08 +01:00
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=7,8 --separator=%% 2>/dev/null < <(while true; do cat $fifo; done))
2022-09-23 12:52:22 +02:00
if [[ -z $sel ]]; then
2022-09-25 22:24:08 +02:00
rm $fifo
2022-09-23 12:52:22 +02:00
kill -9 $pid
2022-09-25 22:24:08 +02:00
else
rm $fifo
kill -9 $pid
echo $sel
2022-09-23 12:52:22 +02:00
fi
2022-09-12 16:55:30 +02:00
}
2022-10-03 00:24:27 +02:00
debug_servers(){
if [[ -n $steam_api ]]; then
exists=true
else
exists=false
fi
key_len=${#steam_api}
first_char=${steam_api:0:1}
last_char=${steam_api:0-1}
debug_res=$(curl -Ls "https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100&limit=10&key=$steam_api")
debug_len=$(echo "$debug_res" | jq '[.response.servers[]]|length')
[[ -z $debug_len ]] && debug_len=0
}
2022-09-12 16:55:30 +02:00
server_browser(){
2022-09-13 06:41:26 +02:00
check_steam_api
2022-10-03 08:42:18 +02:00
[[ $? -eq 1 ]] && return
2022-09-12 16:55:30 +02:00
unset ret
file=$(mktemp)
local limit=20000
local url="https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100&limit=$limit&key=$steam_api"
2022-11-21 20:54:23 +01:00
check_geo_file
2022-09-12 16:55:30 +02:00
local_latlon
choose_filters
[[ -z $sels ]] && return
[[ $ret -eq 97 ]] && return
#TODO: some error handling here
2022-09-14 06:22:14 +02:00
fetch(){
echo "# Getting server list"
2022-10-23 20:09:35 +02:00
response=$(curl -Ls "$url" | jq -r '.response.servers')
2022-09-14 06:22:14 +02:00
}
2022-12-02 08:25:08 +01:00
fetch > >($steamsafe_zenity --pulsate --progress --auto-close --width=500 2>/dev/null)
2022-12-01 10:34:40 +01:00
total_servers=$(echo "$response" | jq 'length' | numfmt --grouping)
2023-05-16 13:05:36 +02:00
players_online=$(curl -Ls "https://api.steampowered.com/ISteamUserStats/GetNumberOfCurrentPlayers/v1/?appid=$aid" \
2023-05-11 03:23:52 +02:00
| jq '.response.player_count' | numfmt --grouping)
2022-10-03 00:24:27 +02:00
debug_servers
local sel=$(munge_servers)
if [[ -z $sel ]]; then
unset filters
unset search
ret=98
2023-05-16 00:14:56 +02:00
sd_res="--width=1280 --height=800"
2022-10-03 00:24:27 +02:00
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"
2023-05-16 00:14:56 +02:00
sd_res="--width=1280 --height=800"
2022-09-25 19:29:19 +02:00
else
2023-05-16 00:14:56 +02:00
sd_res="--width=1280 --height=800"
2022-10-03 00:24:27 +02:00
return
2022-09-25 19:29:19 +02:00
fi
2022-09-12 16:55:30 +02:00
}
2022-09-29 19:54:39 +02:00
mods_disk_size(){
2023-10-21 15:39:23 +02:00
printf "Total size on disk: %s | " $(du -sh "$workshop_dir" | awk '{print $1}')
printf "%s mods | " $(ls -1 "$workshop_dir" | wc -l)
2022-10-11 17:29:50 +02:00
printf "Location: %s/steamapps/workshop/content/221100" "$steam_path"
2022-09-29 19:54:39 +02:00
}
2022-06-04 22:29:30 +02:00
main_menu(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
logger INFO "Setting mode"
2022-07-24 15:20:06 +02:00
set_mode
2022-06-04 22:29:30 +02:00
while true; do
2022-07-18 10:58:38 +02:00
set_header ${FUNCNAME[0]}
2023-07-25 03:10:07 +02:00
rc=$?
logger INFO "set_header rc is $rc"
if [[ $rc -eq 0 ]]; then
case "$sel" in
"") warn "No item was selected." ;;
" Server browser") server_browser ;;
" My servers") query_and_connect ;;
" Quick connect to favorite server") connect_to_fav ;;
" Connect by IP") connect_by_ip ;;
" Recent servers (last 10)") history_table ;;
" Add server by ID") add_by_id ;;
" Add favorite server") add_by_fav ;;
" Change favorite server") add_by_fav ;;
" Delete server") delete=1; query_and_connect ;;
" 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
2023-05-19 16:29:21 +02:00
;;
2023-07-25 03:10:07 +02:00
" View changelog") changelog | $steamsafe_zenity --text-info $sd_res --title="DZGUI" 2>/dev/null ;;
" Advanced options")
options_menu
main_menu
return
;;
" Help file ⧉") help_file ;;
" Report bug ⧉") report_bug ;;
" Forum ⧉") forum ;;
" NEW: Sponsor ⧉") sponsor ;;
" NEW: Hall of fame ⧉") hof ;;
esac
else
logger INFO "Returning from main menu"
return
fi
2022-05-22 21:20:34 +02:00
done
}
2022-08-11 00:59:29 +02:00
page_through(){
2022-08-12 02:52:07 +02:00
list_response=$(curl -s "$page")
list=$(echo "$list_response" | jq -r '.data[] .attributes | "\(.name)\t\(.ip):\(.port)\t\(.players)/\(.maxPlayers)\t\(.details.time)\t\(.status)\t\(.id)"')
2022-08-11 00:59:29 +02:00
idarr+=("$list")
parse_json
}
2022-05-22 21:20:34 +02:00
parse_json(){
2023-05-16 00:14:56 +02:00
echo "# Parsing servers"
2022-08-12 02:52:07 +02:00
page=$(echo "$list_response" | jq -r '.links.next?')
2022-08-14 18:22:21 +02:00
if [[ $first_entry -eq 1 ]]; then
local list=$(echo "$list_response" | jq -r '.data[] .attributes | "\(.name)\t\(.ip):\(.port)\t\(.players)/\(.maxPlayers)\t\(.details.time)\t\(.status)\t\(.id)"')
2022-08-14 18:22:21 +02:00
idarr+=("$list")
first_entry=0
fi
2022-08-11 00:59:29 +02:00
if [[ "$page" != "null" ]]; then
page_through
else
printf "%s\n" "${idarr[@]}" > $tmp
idarr=()
fetch_query_ports
fi
2022-05-09 13:42:24 +02:00
}
check_ping(){
2022-07-24 15:20:06 +02:00
ping_ip=$(echo "$1" | awk -F'\t' '{print $2}' | awk -F: '{print $1}')
ms=$(ping -c 1 -W 1 "$ping_ip" | awk -Ftime= '/time=/ {print $2}')
if [[ -z $ms ]]; then
echo "Timeout"
else
echo "$ms"
fi
2022-05-22 21:20:34 +02:00
}
2022-05-09 13:42:24 +02:00
create_array(){
rows=()
2022-05-09 13:42:24 +02:00
#TODO: improve error handling for null values
2022-05-29 08:33:14 +02:00
lc=1
2022-05-09 13:42:24 +02:00
while read line; do
name=$(echo "$line" | awk -F'\t' '{print $1}')
2022-05-22 21:20:34 +02:00
#truncate names
2022-06-15 12:32:10 +02:00
if [[ $(echo "$name" | wc -m) -gt 50 ]]; then
2022-08-10 03:08:27 +02:00
name="$(echo "$name" | awk '{print substr($0,1,50) "..."}')"
2022-05-09 13:42:24 +02:00
else
:
fi
ip=$(echo "$line" | awk -F'\t' '{print $2}')
players=$(echo "$line" | awk -F'\t' '{print $3}')
2022-06-15 12:32:10 +02:00
time=$(echo "$line" | awk -F'\t' '{print $4}')
stat=$(echo "$line" | awk -F'\t' '{print $5}')
2022-06-04 22:29:30 +02:00
2022-05-09 13:42:24 +02:00
#TODO: probe offline return codes
2022-06-15 12:32:10 +02:00
id=$(echo "$line" | awk -F'\t' '{print $6}')
2022-05-29 08:33:14 +02:00
tc=$(awk 'END{print NR}' $tmp)
2022-07-24 15:20:06 +02:00
if [[ $delete -eq 1 ]]; then
declare -g -a rows=("${rows[@]}" "$name" "$id")
else
echo "# Checking ping: $lc/$tc"
ping=$(check_ping "$line")
declare -g -a rows=("${rows[@]}" "$name" "$ip" "$players" "$time" "$stat" "$id" "$ping")
fi
2022-05-29 08:33:14 +02:00
let lc++
2023-05-16 00:14:56 +02:00
done < <(cat "$tmp" | sort -k1)
2022-05-29 08:33:14 +02:00
for i in "${rows[@]}"; do echo -e "$i"; done > $tmp
2022-05-09 13:42:24 +02:00
}
2022-06-04 22:29:30 +02:00
set_fav(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-08-12 02:52:07 +02:00
echo "[DZGUI] Querying favorite server"
2022-06-12 06:44:30 +02:00
query_api
2022-06-04 22:29:30 +02:00
fav_label=$(curl -s "$api" -H "Authorization: Bearer "$api_key"" -G -d "filter[game]=$game" -d "filter[ids][whitelist]=$fav" \
| jq -r '.data[] .attributes .name')
2022-06-15 12:32:10 +02:00
if [[ -z $fav_label ]]; then
fav_label=null
2023-05-16 00:14:56 +02:00
else
fav_label="'$fav_label'"
2022-06-12 06:44:30 +02:00
fi
2023-07-25 03:10:07 +02:00
logger INFO "Fav label is $fav_label"
2022-06-04 22:29:30 +02:00
}
2022-06-15 12:32:10 +02:00
check_unmerged(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-06-15 12:32:10 +02:00
if [[ -f ${config_path}.unmerged ]]; then
printf "[DZGUI] Found new config format, merging changes\n"
merge_config
rm ${config_path}.unmerged
fi
}
merge_config(){
source $config_file
mv $config_file ${config_path}dztuirc.old
2022-10-07 09:26:39 +02:00
[[ -z $staging_dir ]] && staging_dir="/tmp"
2022-06-15 12:32:10 +02:00
write_config > $config_file
printf "[DZGUI] Wrote new config file to %sdztuirc\n" $config_path
2023-07-25 03:10:07 +02:00
$steamsafe_zenity --info --width=500 --title="DZGUI" --text="Wrote new config format to \n${config_path}dztuirc\nIf errors occur, you can restore the file:\n${config_path}dztuirc.old" 2>/dev/null
2022-06-15 12:32:10 +02:00
}
2022-06-04 22:29:30 +02:00
download_new_version(){
2022-08-05 22:26:00 +02:00
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
2023-07-25 03:10:07 +02:00
echo "# Downloading version $upstream"
curl -Ls "$version_url" > $source_script
2022-06-04 22:29:30 +02:00
rc=$?
if [[ $rc -eq 0 ]]; then
echo "[DZGUI] Wrote $upstream to $source_script"
chmod +x $source_script
2022-06-15 12:32:10 +02:00
touch ${config_path}.unmerged
2022-10-03 17:04:13 +02:00
echo "100"
2023-07-25 03:10:07 +02:00
$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
2022-06-12 06:44:30 +02:00
code=$?
if [[ $code -eq 0 ]]; then
2022-12-02 08:25:08 +01:00
changelog | $steamsafe_zenity --text-info $sd_res --title="DZGUI" 2>/dev/null
2022-06-12 06:44:30 +02:00
exit
elif [[ $code -eq 1 ]]; then
exit
fi
2022-06-04 22:29:30 +02:00
else
2022-10-03 17:04:13 +02:00
echo "100"
mv $source_script.old $source_script
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --info --title="DZGUI" --text "[ERROR] 99: Failed to download new version." 2>/dev/null
2022-06-04 22:29:30 +02:00
return
fi
}
2022-07-18 10:58:38 +02:00
check_branch(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-07-18 10:58:38 +02:00
if [[ $branch == "stable" ]]; then
2022-09-14 06:56:13 +02:00
version_url="$stable_url/dzgui.sh"
2022-07-18 10:58:38 +02:00
elif [[ $branch == "testing" ]]; then
2022-09-14 06:56:13 +02:00
version_url="$testing_url/dzgui.sh"
2022-07-18 10:58:38 +02:00
fi
2023-07-25 03:10:07 +02:00
logger INFO "Branch is $branch"
2022-07-18 10:58:38 +02:00
upstream=$(curl -Ls "$version_url" | awk -F= '/^version=/ {print $2}')
2023-07-25 03:10:07 +02:00
logger INFO "Upstream version is $version"
2022-07-18 10:58:38 +02:00
}
enforce_dl(){
2023-07-25 03:10:07 +02:00
download_new_version > >($steamsafe_zenity --progress --pulsate --auto-close --no-cancel --width=500)
}
2022-10-03 17:04:13 +02:00
prompt_dl(){
2023-05-16 00:14:56 +02:00
$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
2022-10-03 17:04:13 +02:00
echo "100"
2023-07-25 03:10:07 +02:00
download_new_version > >($steamsafe_zenity --progress --pulsate --auto-close --no-cancel --width=500)
fi
}
2022-06-04 22:29:30 +02:00
check_version(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-10-03 17:04:13 +02:00
[[ -f $config_file ]] && source $config_file
[[ -z $branch ]] && branch="stable"
2022-07-18 10:58:38 +02:00
check_branch
2022-10-27 06:40:42 +02:00
[[ ! -f "$freedesktop_path/dzgui.desktop" ]] && freedesktop_dirs
2022-06-04 22:29:30 +02:00
if [[ $version == $upstream ]]; then
2023-07-25 03:10:07 +02:00
logger INFO "Local version is same as upstream"
2022-06-15 12:32:10 +02:00
check_unmerged
2022-06-04 22:29:30 +02:00
else
2022-10-09 08:43:14 +02:00
# echo "100"
echo "[DZGUI] Upstream ($upstream) != local ($version)"
2023-07-25 03:10:07 +02:00
logger INFO "Local and remote version mismatch"
if [[ $enforce_dl -eq 1 ]]; then
enforce_dl
2022-06-04 22:29:30 +02:00
else
prompt_dl
2022-06-04 22:29:30 +02:00
fi
fi
}
2022-06-15 12:32:10 +02:00
check_architecture(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-07-24 15:20:06 +02:00
cpu=$(cat /proc/cpuinfo | grep "AMD Custom APU 0405")
2022-08-04 21:41:25 +02:00
if [[ -n "$cpu" ]]; then
2022-06-15 12:32:10 +02:00
is_steam_deck=1
2023-07-25 03:10:07 +02:00
logger INFO "Setting architecture to 'Steam Deck'"
2022-06-15 12:32:10 +02:00
echo "[DZGUI] Setting architecture to 'Steam Deck'"
else
is_steam_deck=0
2023-07-25 03:10:07 +02:00
logger INFO "Setting architecture to 'desktop'"
2022-06-15 12:32:10 +02:00
echo "[DZGUI] Setting architecture to 'desktop'"
fi
}
2022-06-04 22:29:30 +02:00
add_by_id(){
2022-08-04 21:14:56 +02:00
#FIXME: prevent redundant creation of existent IDs (for neatness)
2022-06-15 12:32:10 +02:00
while true; do
2022-12-02 08:25:08 +01:00
id=$($steamsafe_zenity --entry --text="Enter server ID" --title="DZGUI" 2>/dev/null)
2022-06-15 12:32:10 +02:00
rc=$?
if [[ $rc -eq 1 ]]; then
return
else
if [[ ! $id =~ ^[0-9]+$ ]]; then
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --warning --title="DZGUI" --text="Invalid ID" 2>/dev/null
2022-06-15 12:32:10 +02:00
else
2022-11-24 21:53:35 +01:00
[[ -z $whitelist ]] && new_whitelist="whitelist=\"$id\""
[[ -n $whitelist ]] && new_whitelist="whitelist=\"$whitelist,$id\""
2022-06-15 12:32:10 +02:00
mv $config_file ${config_path}dztuirc.old
nr=$(awk '/whitelist=/ {print NR}' ${config_path}dztuirc.old)
awk -v "var=$new_whitelist" -v "nr=$nr" 'NR==nr {$0=var}{print}' ${config_path}dztuirc.old > ${config_path}dztuirc
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --info --title="DZGUI" --text="Added "$id" to:\n${config_path}dztuirc\nIf errors occur, you can restore the file:\n${config_path}dztuirc.old" --width=500 2>/dev/null
2022-06-15 12:32:10 +02:00
source $config_file
return
fi
fi
done
}
2022-06-22 15:33:52 +02:00
toggle_debug(){
mv $config_file ${config_path}dztuirc.old
nr=$(awk '/debug=/ {print NR}' ${config_path}dztuirc.old)
if [[ $debug -eq 1 ]]; then
debug=0
else
debug=1
fi
flip_debug="debug=\"$debug\""
awk -v "var=$flip_debug" -v "nr=$nr" 'NR==nr {$0=var}{print}' ${config_path}dztuirc.old > $config_file
printf "[DZGUI] Toggled debug flag to '$debug'\n"
source $config_file
}
setup(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-06-22 15:33:52 +02:00
if [[ -n $fav ]]; then
set_fav
2022-11-21 20:54:23 +01:00
items[8]=" Change favorite server"
2022-06-22 15:33:52 +02:00
fi
}
2022-07-24 15:20:06 +02:00
check_map_count(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2023-05-19 16:29:21 +02:00
[[ $is_steam_deck -eq 1 ]] && return
2023-05-11 05:08:15 +02:00
local count=1048576
2023-07-25 03:10:07 +02:00
logger INFO "Checking system map count"
2022-08-16 17:49:51 +02:00
echo "[DZGUI] Checking system map count"
2023-05-11 05:08:15 +02:00
if [[ ! -f /etc/sysctl.d/dayz.conf ]]; then
2023-07-25 03:10:07 +02:00
$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
2023-05-16 00:14:56 +02:00
local pass
2023-07-25 03:10:07 +02:00
logger INFO "Prompting user for sudo escalation"
2023-05-16 00:14:56 +02:00
pass=$($steamsafe_zenity --password)
2023-07-25 03:10:07 +02:00
local rc
logger INFO "Return code is $rc"
[[ $rc -eq 1 ]] && exit 1
2023-05-11 05:08:15 +02:00
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
2023-07-25 03:10:07 +02:00
logger INFO "Updating map count"
2023-05-11 05:08:15 +02:00
sudo -S <<< "$pass" sh -c "echo 'vm.max_map_count=$ct' > /etc/sysctl.d/dayz.conf"
2023-02-17 13:51:21 +01:00
sudo sysctl -p /etc/sysctl.d/dayz.conf
2023-05-11 05:08:15 +02:00
else
2023-07-25 03:10:07 +02:00
logger INFO "Zenity dialog failed or user exit"
2023-05-11 05:08:15 +02:00
exit 1
2022-07-24 15:20:06 +02:00
fi
fi
}
2022-06-15 12:32:10 +02:00
add_by_fav(){
2022-06-04 22:29:30 +02:00
while true; do
2022-12-02 08:25:08 +01:00
fav_id=$($steamsafe_zenity --entry --text="Enter server ID" --title="DZGUI" 2>/dev/null)
2022-06-04 22:29:30 +02:00
rc=$?
if [[ $rc -eq 1 ]]; then
return
else
2022-06-15 12:32:10 +02:00
if [[ ! $fav_id =~ ^[0-9]+$ ]]; then
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --warning --title="DZGUI" --text="Invalid ID"
2022-06-04 22:29:30 +02:00
else
2022-06-15 12:32:10 +02:00
new_fav="fav=\"$fav_id\""
2022-06-04 22:29:30 +02:00
mv $config_file ${config_path}dztuirc.old
2022-06-15 12:32:10 +02:00
nr=$(awk '/fav=/ {print NR}' ${config_path}dztuirc.old)
awk -v "var=$new_fav" -v "nr=$nr" 'NR==nr {$0=var}{print}' ${config_path}dztuirc.old > ${config_path}dztuirc
echo "[DZGUI] Added $fav_id to key 'fav'"
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --info --title="DZGUI" --text="Added "$fav_id" to:\n${config_path}dztuirc\nIf errors occurred, you can restore the file:\n${config_path}dztuirc.old" 2>/dev/null
2022-06-04 22:29:30 +02:00
source $config_file
2022-06-15 12:32:10 +02:00
set_fav
2022-11-21 20:54:23 +01:00
items[8]=" Change favorite server"
2022-06-04 22:29:30 +02:00
return
fi
fi
done
}
2022-08-13 15:00:35 +02:00
lock(){
2023-05-11 03:28:19 +02:00
[[ ! -d $config_path ]] && return
2022-12-03 13:38:27 +01:00
if [[ ! -f ${config_path}.lockfile ]]; then
touch ${config_path}.lockfile
2022-08-13 15:00:35 +02:00
fi
2022-12-03 13:38:27 +01:00
pid=$(cat ${config_path}.lockfile)
2022-08-13 15:00:35 +02:00
ps -p $pid -o pid= >/dev/null 2>&1
res=$?
if [[ $res -eq 0 ]]; then
echo "[DZGUI] Already running ($pid)"
2022-12-02 08:25:08 +01:00
$steamsafe_zenity --info --text="DZGUI already running (pid $pid)" --width=500 --title="DZGUI" 2>/dev/null
2022-08-13 15:00:35 +02:00
exit
elif [[ $pid == $$ ]]; then
:
else
2022-12-03 13:38:27 +01:00
echo $$ > ${config_path}.lockfile
2022-08-13 15:00:35 +02:00
fi
}
2022-11-24 21:53:35 +01:00
fetch_helpers(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2022-10-08 05:25:46 +02:00
mkdir -p "$helpers_path"
2022-11-24 21:53:35 +01:00
[[ ! -f "$helpers_path/vdf2json.py" ]] && curl -Ls "$vdf2json_url" > "$helpers_path/vdf2json.py"
2022-10-11 13:58:00 +02:00
}
2023-01-19 17:55:41 +01:00
update_steam_cmd(){
local new_cmd
2023-01-19 17:55:41 +01:00
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
}
2023-01-19 12:20:30 +01:00
steam_deps(){
2023-07-25 03:10:07 +02:00
logger INFO "${FUNCNAME[0]}"
2023-01-19 18:05:45 +01:00
local flatpak steam
2023-02-17 13:51:21 +01:00
[[ $(command -v flatpak) ]] && flatpak=$(flatpak list | grep valvesoftware.Steam)
2023-01-19 12:20:30 +01:00
steam=$(command -v steam)
if [[ -z "$steam" ]] && [[ -z "$flatpak" ]]; then
warn "Requires Steam or Flatpak Steam"
2023-07-25 03:10:07 +02:00
logger ERROR "Steam was missing"
2023-01-19 12:20:30 +01:00
exit
elif [[ -n "$steam" ]] && [[ -n "$flatpak" ]]; then
toggle_steam=1
steam_cmd="steam"
2023-01-19 17:55:41 +01:00
[[ -n $preferred_client ]] && steam_cmd="$preferred_client"
[[ -z $preferred_client ]] && update_steam_cmd
2023-01-19 12:20:30 +01:00
elif [[ -n "$steam" ]]; then
steam_cmd="steam"
else
steam_cmd="flatpak run com.valvesoftware.Steam"
2023-01-19 12:20:30 +01:00
fi
2023-07-25 03:10:07 +02:00
logger INFO "steam_cmd set to $steam_cmd"
2023-01-19 12:20:30 +01:00
}
2022-09-24 11:49:01 +02:00
initial_setup(){
echo "# Initial setup"
2022-06-15 12:32:10 +02:00
run_depcheck
2022-10-09 04:07:07 +02:00
watcher_deps
2022-06-15 12:32:10 +02:00
check_architecture
2022-08-05 22:28:52 +02:00
check_version
2022-07-24 15:20:06 +02:00
check_map_count
2022-11-24 21:53:35 +01:00
fetch_helpers
2022-05-22 21:20:34 +02:00
config
steam_deps
2022-06-15 12:32:10 +02:00
run_varcheck
2022-11-21 20:54:23 +01:00
stale_symlinks
2022-06-22 15:33:52 +02:00
init_items
setup
2023-05-16 00:14:56 +02:00
check_news
2022-09-24 11:49:01 +02:00
echo "100"
}
2023-07-25 03:10:07 +02:00
test_zenity_version(){
local current="$1"
2023-09-14 09:50:45 +02:00
local cutoff="3.99.1"
2023-07-25 03:10:07 +02:00
if [[ "$(printf '%s\n' "$cutoff" "$current" | sort -V | head -n1)" == "$cutoff" ]]; then
logger INFO "zenity version greater than or equal to $cutoff"
echo greater
else
logger INFO "zenity version lesser than $cutoff"
echo lesser
fi
}
2022-09-24 11:49:01 +02:00
main(){
2022-09-27 02:42:46 +02:00
lock
2023-07-25 03:10:07 +02:00
local zenv=$(zenity --version 2>/dev/null)
[[ -z $zenv ]] && { logger "Missing zenity"; exit; }
local res=$(test_zenity_version $zenv)
2023-09-14 09:50:45 +02:00
initial_setup > >($steamsafe_zenity --pulsate --progress --auto-close --title="DZGUI" --no-cancel --width=500 2>/dev/null)
2022-05-22 21:20:34 +02:00
main_menu
2022-12-03 07:57:33 +01:00
#TODO: tech debt: cruddy handling for steam forking
2022-09-23 12:52:22 +02:00
[[ $? -eq 1 ]] && pkill -f dzgui.sh
2022-05-09 13:42:24 +02:00
}
2023-05-11 05:08:15 +02:00
parent=$(cat /proc/$PPID/comm)
2023-07-25 03:10:07 +02:00
[[ -f "$debug_log" ]] && rm "$debug_log"
2022-05-09 13:42:24 +02:00
main