From 5c112831e074babb7822f95da24e784cceb04b68 Mon Sep 17 00:00:00 2001
From: the Sane <3657071+the-sane@users.noreply.github.com>
Date: Wed, 27 Oct 2021 20:53:11 -0400
Subject: [PATCH] Refactor runner and dxvk downloading
---
lug-helper.sh | 638 ++++++++++++++------------------------------------
1 file changed, 178 insertions(+), 460 deletions(-)
diff --git a/lug-helper.sh b/lug-helper.sh
index 8ec9023..fb8de14 100755
--- a/lug-helper.sh
+++ b/lug-helper.sh
@@ -110,8 +110,6 @@ runner_sources=(
"/dev/null" "https://api.github.com/repos/gort818/wine-sc-lug/releases"
"GloriousEggroll" "https://api.github.com/repos/GloriousEggroll/wine-ge-custom/releases"
)
-# Set a maximum number of runner versions to display from each url
-max_runners=20
######## DXVK ##############################################################
@@ -126,8 +124,9 @@ dxvk_sources=(
"Sporif Async" "https://api.github.com/repos/Sporif/dxvk-async/releases"
"/dev/null" "https://api.github.com/repos/gort818/dxvk/releases"
)
-# Set a maximum number of runner versions to display from each url
-max_dxvks=20
+
+# Set a maximum number of versions to display from each download url
+max_download_items=20
# Pixels to add for each Zenity menu option
# used to dynamically determine the height of menus
@@ -805,48 +804,48 @@ lutris_restart() {
lutris_needs_restart="false"
}
-#------------------------- begin runner functions ----------------------------#
+#------------------------- begin download functions ----------------------------#
-# Delete the selected runner
-runner_delete() {
+# Uninstall the selected item
+download_delete() {
# This function expects an index number for the array
- # installed_runners to be passed in as an argument
+ # installed_items to be passed in as an argument
if [ -z "$1" ]; then
- debug_print exit "Script error: The runner_delete function expects an argument. Aborting."
+ debug_print exit "Script error: The download_delete function expects an argument. Aborting."
fi
- runner_to_delete="$1"
- if message question "Are you sure you want to delete the following runner?\n\n${installed_runners[$runner_to_delete]}"; then
- rm -r "${installed_runners[$runner_to_delete]}"
- debug_print continue "Deleted ${installed_runners[$runner_to_delete]}"
+ item_to_delete="$1"
+ if message question "Are you sure you want to delete the following ${download_type}?\n\n${installed_items[$item_to_delete]}"; then
+ rm -r "${installed_items[$item_to_delete]}"
+ debug_print continue "Deleted ${installed_items[$item_to_delete]}"
lutris_needs_restart="true"
fi
}
-# List installed runners for deletion
-runner_select_delete() {
+# List installed items for deletion
+download_select_delete() {
# Configure the menu
- menu_text_zenity="Select the Lutris runner you want to remove:"
- menu_text_terminal="Select the Lutris runner you want to remove:"
+ menu_text_zenity="Select the $download_type you want to remove:"
+ menu_text_terminal="Select the $download_type you want to remove:"
menu_text_height="65"
- goback="Return to the runner management menu"
- unset installed_runners
+ goback="Return to the $download_type management menu"
+ unset installed_items
unset menu_options
unset menu_actions
- # Create an array containing all directories in the runners_dir
- for runners_list in "$runners_dir"/*; do
- if [ -d "$runners_list" ]; then
- installed_runners+=("$runners_list")
+ # Create an array containing all directories in the download_dir
+ for items_list in "$download_dir"/*; do
+ if [ -d "$items_list" ]; then
+ installed_items+=("$items_list")
fi
done
-
- # Create menu options for the installed runners
- for (( i=0; i<"${#installed_runners[@]}"; i++ )); do
- menu_options+=("$(basename "${installed_runners[i]}")")
- menu_actions+=("runner_delete $i")
+
+ # Create menu options for the installed items
+ for (( i=0; i<"${#installed_items[@]}"; i++ )); do
+ menu_options+=("$(basename "${installed_items[i]}")")
+ menu_actions+=("download_delete $i")
done
-
+
# Complete the menu by adding the option to go back to the previous menu
menu_options+=("$goback")
menu_actions+=(":") # no-op
@@ -856,170 +855,170 @@ runner_select_delete() {
if [ "$menu_height" -gt "400" ]; then
menu_height="400"
fi
-
+
# Set the label for the cancel button
cancel_label="Go Back"
-
+
# Call the menu function. It will use the options as configured above
menu
}
-# Download and install the selected runner
-# Note: The variables runner_versions, contributor_url, and runner_url_type
+# Download and install the selected item
+# Note: The variables download_versions, contributor_url, and download_url_type
# are expected to be set before calling this function
-runner_install() {
+download_install() {
# This function expects an index number for the array
- # runner_versions to be passed in as an argument
+ # download_versions to be passed in as an argument
if [ -z "$1" ]; then
- debug_print exit "Script error: The runner_install function expects a numerical argument. Aborting."
+ debug_print exit "Script error: The download_install function expects a numerical argument. Aborting."
fi
- # Get the runner filename including file extension
- runner_file="${runner_versions[$1]}"
+ # Get the filename including file extension
+ download_file="${download_versions[$1]}"
- # Get the selected runner name minus the file extension
+ # Get the selected item name minus the file extension
# To add new file extensions, handle them here and in
- # the runner_select_install function below
- case "$runner_file" in
+ # the download_select_install function below
+ case "$download_file" in
*.tar.gz)
- runner_name="$(basename "$runner_file" .tar.gz)"
+ download_name="$(basename "$download_file" .tar.gz)"
;;
*.tgz)
- runner_name="$(basename "$runner_file" .tgz)"
+ download_name="$(basename "$download_file" .tgz)"
;;
*.tar.xz)
- runner_name="$(basename "$runner_file" .tar.xz)"
+ download_name="$(basename "$download_file" .tar.xz)"
;;
*)
- debug_print exit "Unknown archive filetype in runner_install function. Aborting."
+ debug_print exit "Unknown archive filetype in download_install function. Aborting."
;;
esac
- # Get the selected runner url
+ # Get the selected download url
# To add new sources, handle them here and in the
- # runner_select_install function below
- if [ "$runner_url_type" = "github" ]; then
- runner_dl_url="$(curl -s "$contributor_url" | grep "browser_download_url.*$runner_file" | cut -d \" -f4)"
+ # download_select_install function below
+ if [ "$download_url_type" = "github" ]; then
+ download_url="$(curl -s "$contributor_url" | grep "browser_download_url.*$download_file" | cut -d \" -f4)"
else
- debug_print exit "Script error: Unknown api/url format in runner_sources array. Aborting."
+ debug_print exit "Script error: Unknown api/url format in ${download_type}_sources array. Aborting."
fi
# Sanity check
- if [ -z "$runner_dl_url" ]; then
- message warning "Could not find the requested runner. The source API may be down or rate limited."
+ if [ -z "$download_url" ]; then
+ message warning "Could not find the requested ${download_type}. The source API may be down or rate limited."
return 1
fi
- # Download the runner to the tmp directory
- debug_print continue "Downloading $runner_dl_url into $tmp_dir/$runner_file..."
+ # Download the item to the tmp directory
+ debug_print continue "Downloading $download_url into $tmp_dir/$download_file..."
if [ "$use_zenity" -eq 1 ]; then
# Format the curl progress bar for zenity
mkfifo "$tmp_dir/lugpipe"
- cd "$tmp_dir" && curl -#LO "$runner_dl_url" > "$tmp_dir/lugpipe" 2>&1 & curlpid="$!"
+ cd "$tmp_dir" && curl -#LO "$download_url" > "$tmp_dir/lugpipe" 2>&1 & curlpid="$!"
stdbuf -oL tr '\r' '\n' < "$tmp_dir/lugpipe" | \
grep --line-buffered -ve "100" | grep --line-buffered -o "[0-9]*\.[0-9]" | \
(
trap 'kill "$curlpid"' ERR
- zenity --progress --auto-close --title="Star Citizen LUG Helper" --text="Downloading Runner. This might take a moment.\n" 2>/dev/null
+ zenity --progress --auto-close --title="Star Citizen LUG Helper" --text="Downloading ${download_type}. This might take a moment.\n" 2>/dev/null
)
if [ "$?" -eq 1 ]; then
# User clicked cancel
- debug_print continue "Download aborted. Removing $tmp_dir/$runner_file..."
- rm "$tmp_dir/$runner_file"
+ debug_print continue "Download aborted. Removing $tmp_dir/$download_file..."
+ rm "$tmp_dir/$download_file"
rm "$tmp_dir/lugpipe"
return 1
fi
rm "$tmp_dir/lugpipe"
else
# Standard curl progress bar
- (cd "$tmp_dir" && curl -LO "$runner_dl_url")
+ (cd "$tmp_dir" && curl -LO "$download_url")
fi
# Sanity check
- if [ ! -f "$tmp_dir/$runner_file" ]; then
- debug_print exit "Script error: The requested runner file was not downloaded. Aborting"
+ if [ ! -f "$tmp_dir/$download_file" ]; then
+ debug_print exit "Script error: The requested $download_type file was not downloaded. Aborting"
fi
# Get the path of the first item listed in the archive
# This should either be a subdirectory or the path ./
# depending on how the archive was created
- first_filepath="$(stdbuf -oL tar -tf "$tmp_dir/$runner_file" | head -n 1)"
+ first_filepath="$(stdbuf -oL tar -tf "$tmp_dir/$download_file" | head -n 1)"
- # Extract the runner
+ # Extract the archive
case "$first_filepath" in
# If the files in the archive begin with ./ there is no subdirectory,
# so we must create one
./*)
- debug_print continue "Installing runner into $runners_dir/$runner_name..."
+ debug_print continue "Installing $download_type into $download_dir/$download_name..."
if [ "$use_zenity" -eq 1 ]; then
# Use Zenity progress bar
- mkdir -p "$runners_dir/$runner_name" && tar -xf "$tmp_dir/$runner_file" -C "$runners_dir/$runner_name" | \
- zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Installing runner...\n" 2>/dev/null
+ mkdir -p "$download_dir/$download_name" && tar -xf "$tmp_dir/$download_file" -C "$download_dir/$download_name" | \
+ zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Installing ${download_type}...\n" 2>/dev/null
else
- mkdir -p "$runners_dir/$runner_name" && tar -xf "$tmp_dir/$runner_file" -C "$runners_dir/$runner_name"
+ mkdir -p "$download_dir/$download_name" && tar -xf "$tmp_dir/$download_file" -C "$download_dir/$download_name"
fi
lutris_needs_restart="true"
;;
# If a subdirectory exists and has the same name as the archive,
# extract it as is
- "$runner_name")
- debug_print continue "Installing runner into $runners_dir/$runner_name....."
+ "$download_name")
+ debug_print continue "Installing $download_type into $download_dir/$download_name..."
if [ "$use_zenity" -eq 1 ]; then
# Use Zenity progress bar
- mkdir -p "$runners_dir" && tar -xf "$tmp_dir/$runner_file" -C "$runners_dir" | \
- zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Installing runner...\n" 2>/dev/null
+ mkdir -p "$download_dir/$download_name" && tar -xf "$tmp_dir/$download_file" -C "$download_dir" | \
+ zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Installing ${download_type}...\n" 2>/dev/null
else
- mkdir -p "$runners_dir" && tar -xf "$tmp_dir/$runner_file" -C "$runners_dir"
+ mkdir -p "$download_dir/$download_name" && tar -xf "$tmp_dir/$download_file" -C "$download_dir"
fi
lutris_needs_restart="true"
;;
# If a subdirectory exists and has any other name,
# we must create the correct subdirectory
*)
- debug_print continue "Installing runner into $runners_dir/$runner_name..."
+ debug_print continue "Installing $download_type into $download_dir/$download_name..."
if [ "$use_zenity" -eq 1 ]; then
# Use Zenity progress bar
- mkdir -p "$runners_dir/$runner_name" && tar -xf "$tmp_dir/$runner_file" -C "$runners_dir/$runner_name" | \
- zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Installing runner...\n" 2>/dev/null
+ mkdir -p "$download_dir/$download_name" && tar -xf "$tmp_dir/$download_file" -C "$download_dir/$download_name" | \
+ zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Installing ${download_type}...\n" 2>/dev/null
else
- mkdir -p "$runners_dir/$runner_name" && tar -xf "$tmp_dir/$runner_file" -C "$runners_dir/$runner_name"
+ mkdir -p "$download_dir/$download_name" && tar -xf "$tmp_dir/$download_file" -C "$download_dir/$download_name"
fi
lutris_needs_restart="true"
;;
esac
# Cleanup tmp download
- debug_print continue "Removing $tmp_dir/$runner_file..."
- rm "$tmp_dir/$runner_file"
+ debug_print continue "Removing $tmp_dir/$download_file..."
+ rm "$tmp_dir/$download_file"
}
-# List available runners for download
-runner_select_install() {
- # This function expects an element number for the array
- # runner_sources to be passed in as an argument
+# List available items for download
+download_select_install() {
+ # This function expects an element number for the sources array
+ # to be passed in as an argument
if [ -z "$1" ]; then
- debug_print exit "Script error: The runner_select_install function expects a numerical argument. Aborting."
+ debug_print exit "Script error: The download_select_install function expects a numerical argument. Aborting."
fi
-
+
# Store info from the selected contributor
- contributor_name="${runner_sources[$1]}"
- contributor_url="${runner_sources[$1+1]}"
+ contributor_name="${download_sources[$1]}"
+ contributor_url="${download_sources[$1+1]}"
# Check the provided contributor url to make sure we know how to handle it
# To add new sources, add them here and handle in the if statement
- # just below and the runner_install function above
+ # just below and the download_install function above
case "$contributor_url" in
https://api.github.com*)
- runner_url_type="github"
+ download_url_type="github"
;;
*)
- debug_print exit "Script error: Unknown api/url format in runner_sources array. Aborting."
+ debug_print exit "Script error: Unknown api/url format in ${download_type}_sources array. Aborting."
;;
esac
- # Check GlibC version against the requirements of the selected runner
- if [ "$contributor_name" = "/dev/null" ]; then
+ # For runners, check GlibC version against runner requirements
+ if [ "download_type" = "runner" ] && [ "$contributor_name" = "/dev/null" ]; then
required_glibc="2.33"
system_glibc="$(ldd --version | awk '/ldd/{print $NF}')"
@@ -1029,57 +1028,57 @@ runner_select_install() {
fi
fi
- # Fetch a list of runner versions from the selected contributor
+ # Fetch a list of versions from the selected contributor
# To add new sources, handle them here, in the if statement
- # just above, and the runner_install function above
- if [ "$runner_url_type" = "github" ]; then
- runner_versions=($(curl -s "$contributor_url" | awk '/browser_download_url/ {print $2}' | grep -vE "*.sha512sum" | xargs basename -a))
+ # just above, and the download_install function above
+ if [ "$download_url_type" = "github" ]; then
+ download_versions=($(curl -s "$contributor_url" | awk '/browser_download_url/ {print $2}' | grep -vE "*.sha512sum" | xargs basename -a))
else
- debug_print exit "Script error: Unknown api/url format in runner_sources array. Aborting."
+ debug_print exit "Script error: Unknown api/url format in ${download_type}_sources array. Aborting."
fi
# Sanity check
- if [ "${#runner_versions[@]}" -eq 0 ]; then
- message warning "No runner versions were found. The source API may be down or rate limited."
+ if [ "${#download_versions[@]}" -eq 0 ]; then
+ message warning "No $download_type versions were found. The source API may be down or rate limited."
return 1
fi
# Configure the menu
- menu_text_zenity="Select the Lutris runner you want to install:"
- menu_text_terminal="Select the Lutris runner you want to install:"
+ menu_text_zenity="Select the $download_type you want to install:"
+ menu_text_terminal="Select the $download_type you want to install:"
menu_text_height="65"
- goback="Return to the runner management menu"
+ goback="Return to the $download_type management menu"
unset menu_options
unset menu_actions
# Iterate through the versions, check if they are installed,
# and add them to the menu options
# To add new file extensions, handle them here and in
- # the runner_install function above
- for (( i=0; i<"$max_runners" && i<"${#runner_versions[@]}"; i++ )); do
- # Get the runner name minus the file extension
- case "${runner_versions[i]}" in
+ # the download_install function above
+ for (( i=0; i<"$max_download_items" && i<"${#download_versions[@]}"; i++ )); do
+ # Get the file name minus the extension
+ case "${download_versions[i]}" in
*.tar.gz)
- runner_name="$(basename "${runner_versions[i]}" .tar.gz)"
+ download_name="$(basename "${download_versions[i]}" .tar.gz)"
;;
*.tgz)
- runner_name="$(basename "${runner_versions[i]}" .tgz)"
+ download_name="$(basename "${download_versions[i]}" .tgz)"
;;
*.tar.xz)
- runner_name="$(basename "${runner_versions[i]}" .tar.xz)"
+ download_name="$(basename "${download_versions[i]}" .tar.xz)"
;;
*)
- debug_print exit "Unknown archive filetype in runner_select_install function. Aborting."
+ debug_print exit "Unknown archive filetype in download_select_install function. Aborting."
;;
esac
- # Add the runner names to the menu
- if [ -d "$runners_dir/$runner_name" ]; then
- menu_options+=("$runner_name [installed]")
+ # Add the file names to the menu
+ if [ -d "$download_dir/$download_name" ]; then
+ menu_options+=("$download_name [installed]")
else
- menu_options+=("$runner_name")
+ menu_options+=("$download_name")
fi
- menu_actions+=("runner_install $i")
+ menu_actions+=("download_install $i")
done
# Complete the menu by adding the option to go back to the previous menu
@@ -1099,45 +1098,71 @@ runner_select_install() {
menu
}
-# Manage Lutris runners
-runner_manage() {
+# Manage downloads
+#
+# This function expects the following variables to be set:
+#
+# - The string download_sources is a formatted array containing the URLs
+# of items to download. It should be pointed to the appropriate
+# array set at the top of the script using indirect expansion.
+# See runner_sources at the top and runner_manage() below for examples.
+# - The string download_dir should contain the location the downloaded item
+# will be installed to.
+# - The string "download_menu_heading" should contain the type of item
+# being downloaded. It will appear in the menu heading.
+# - The string "download_menu_description" should contain a description of
+# the item being downloaded. It will appear in the menu subheading.
+# - The integer "download_menu_height" specifies the height of the zenity menu.
+#
+# This function also expects one string argument containing the type of item to
+# be downloaded. ie. runner or dxvk.
+#
+# See runner_manage below for a configuration example.
+download_manage() {
+ # This function expects a string to be passed as an argument
+ if [ -z "$1" ]; then
+ debug_print exit "Script error: The download_manage function expects a string argument. Aborting."
+ fi
# Check if Lutris is installed
if [ ! -x "$(command -v lutris)" ]; then
message info "Lutris does not appear to be installed."
return 0
fi
- if [ ! -d "$runners_dir" ]; then
- message info "Lutris runners directory not found. Unable to continue.\n\n$runners_dir"
+ if [ ! -d "$download_dir" ]; then
+ message info "Lutris $download_type directory not found. Unable to continue.\n\n$download_dir"
return 0
fi
-
- # The runner management menu will loop until the user cancels
+
+ # Get the type of item we're downloading from the function arguments
+ download_type="$1"
+
+ # The download management menu will loop until the user cancels
looping_menu="true"
while [ "$looping_menu" = "true" ]; do
# Configure the menu
- menu_text_zenity="Manage Your Lutris Runners\n\nThe runners listed below are wine builds created for Star Citizen\n\nYou may choose from the following options:"
- menu_text_terminal="Manage Your Lutris Runners\n\nThe runners listed below are wine builds created for Star Citizen\nYou may choose from the following options:"
- menu_text_height="140"
+ menu_text_zenity="Manage Your $download_menu_heading\n\n$download_menu_description\n\nYou may choose from the following options:"
+ menu_text_terminal="Manage Your $download_menu_heading\n\n$download_menu_description\nYou may choose from the following options:"
+ menu_text_height="$download_menu_height"
# Configure the menu options
- delete="Remove an installed runner"
+ delete="Remove an installed $download_type"
back="Return to the main menu"
unset menu_options
unset menu_actions
- # Loop through the runner_sources array and create a menu item
+ # Loop through the download_sources array and create a menu item
# for each one. Even numbered elements will contain the runner name
- for (( i=0; i<"${#runner_sources[@]}"; i=i+2 )); do
+ for (( i=0; i<"${#download_sources[@]}"; i=i+2 )); do
# Set the options to be displayed in the menu
- menu_options+=("Install a runner from ${runner_sources[i]}")
+ menu_options+=("Install a $download_type from ${download_sources[i]}")
# Set the corresponding functions to be called for each of the options
- menu_actions+=("runner_select_install $i")
+ menu_actions+=("download_select_install $i")
done
- # Complete the menu by adding options to remove a runner
+ # Complete the menu by adding options to uninstall an item
# or go back to the previous menu
menu_options+=("$delete" "$back")
- menu_actions+=("runner_select_delete" "menu_loop_done")
+ menu_actions+=("download_select_delete" "menu_loop_done")
# Calculate the total height the menu should be
menu_height="$(($menu_option_height * ${#menu_options[@]} + $menu_text_height))"
@@ -1153,343 +1178,36 @@ runner_manage() {
lutris_restart
}
-#-------------------------- end runner functions -----------------------------#
+#-------------------------- end download functions -----------------------------#
-#------------------------- begin dxvk functions ----------------------------#
+# Configure the download_manage function for runners
+runner_manage() {
+ # Set the required variables to manage runners
+ declare -n download_sources=runner_sources
+ download_dir="$runners_dir"
-# Delete the selected dxvk
-dxvk_delete() {
- # This function expects an index number for the array
- # installed_dxvks to be passed in as an argument
- if [ -z "$1" ]; then
- debug_print exit "Script error: The dxvk_delete function expects an argument. Aborting."
- fi
-
- dxvk_to_delete="$1"
- if message question "Are you sure you want to delete the following DXVK?\n\n${installed_dxvks[$dxvk_to_delete]}"; then
- rm -r "${installed_dxvks[$dxvk_to_delete]}"
- debug_print continue "Deleted ${installed_dxvks[$dxvk_to_delete]}"
- lutris_needs_restart="true"
- fi
+ # Configure the text displayed in the menus
+ download_menu_heading="Lutris Runners"
+ download_menu_description="The runners listed below are wine builds created for Star Citizen"
+ download_menu_height="140"
+
+ # Call the download_manage function with the above configuration
+ download_manage "runner"
}
-# List installed dxvks for deletion
-dxvk_select_delete() {
- # Configure the menu
- menu_text_zenity="Select the DXVK version you want to remove:"
- menu_text_terminal="Select the DXVK version you want to remove:"
- menu_text_height="65"
- goback="Return to the DXVK management menu"
- unset installed_dxvks
- unset menu_options
- unset menu_actions
-
- # Create an array containing all directories in the dxvk_dir
- for dxvks_list in "$dxvk_dir"/*; do
- if [ -d "$dxvks_list" ]; then
- installed_dxvks+=("$dxvks_list")
- fi
- done
-
- # Create menu options for the installed dxvks
- for (( i=0; i<"${#installed_dxvks[@]}"; i++ )); do
- menu_options+=("$(basename "${installed_dxvks[i]}")")
- menu_actions+=("dxvk_delete $i")
- done
-
- # Complete the menu by adding the option to go back to the previous menu
- menu_options+=("$goback")
- menu_actions+=(":") # no-op
-
- # Calculate the total height the menu should be
- menu_height="$(($menu_option_height * ${#menu_options[@]} + $menu_text_height))"
- if [ "$menu_height" -gt "400" ]; then
- menu_height="400"
- fi
-
- # Set the label for the cancel button
- cancel_label="Go Back"
-
- # Call the menu function. It will use the options as configured above
- menu
-}
-
-# Download and install the selected dxvk
-# Note: The variables dxvk_versions, contributor_url, and dxvk_url_type
-# are expected to be set before calling this function
-dxvk_install() {
- # This function expects an index number for the array
- # dxvk_versions to be passed in as an argument
- if [ -z "$1" ]; then
- debug_print exit "Script error: The dxvk_install function expects a numerical argument. Aborting."
- fi
-
- # Get the dxvk filename including file extension
- dxvk_file="${dxvk_versions[$1]}"
-
- # Get the selected dxvk name minus the file extension
- # To add new file extensions, handle them here and in
- # the dxvk_select_install function below
- case "$dxvk_file" in
- *.tar.gz)
- dxvk_name="$(basename "$dxvk_file" .tar.gz)"
- ;;
- *.tgz)
- dxvk_name="$(basename "$dxvk_file" .tgz)"
- ;;
- *.tar.xz)
- dxvk_name="$(basename "$dxvk_file" .tar.xz)"
- ;;
- *)
- debug_print exit "Unknown archive filetype in dxvk_install function. Aborting."
- ;;
- esac
-
- # Get the selected dxvk url
- # To add new sources, handle them here and in the
- # dxvk_select_install function below
- if [ "$dxvk_url_type" = "github" ]; then
- dxvk_dl_url="$(curl -s "$contributor_url" | grep "browser_download_url.*$dxvk_file" | cut -d \" -f4)"
- else
- debug_print exit "Script error: Unknown api/url format in dxvk_sources array. Aborting."
- fi
-
- # Sanity check
- if [ -z "$dxvk_dl_url" ]; then
- message warning "Could not find the requested DXVK. The source API may be down or rate limited."
- return 1
- fi
-
- # Download the dxvk to the tmp directory
- debug_print continue "Downloading $dxvk_dl_url into $tmp_dir/$dxvk_file..."
- if [ "$use_zenity" -eq 1 ]; then
- # Format the curl progress bar for zenity
- mkfifo "$tmp_dir/lugpipe"
- cd "$tmp_dir" && curl -#LO "$dxvk_dl_url" > "$tmp_dir/lugpipe" 2>&1 & curlpid="$!"
- stdbuf -oL tr '\r' '\n' < "$tmp_dir/lugpipe" | \
- grep --line-buffered -ve "100" | grep --line-buffered -o "[0-9]*\.[0-9]" | \
- (
- trap 'kill "$curlpid"' ERR
- zenity --progress --auto-close --title="Star Citizen LUG Helper" --text="Downloading DXVK. This might take a moment.\n" 2>/dev/null
- )
-
- if [ "$?" -eq 1 ]; then
- # User clicked cancel
- debug_print continue "Download aborted. Removing $tmp_dir/$dxvk_file..."
- rm "$tmp_dir/$dxvk_file"
- rm "$tmp_dir/lugpipe"
- return 1
- fi
- rm "$tmp_dir/lugpipe"
- else
- # Standard curl progress bar
- (cd "$tmp_dir" && curl -LO "$dxvk_dl_url")
- fi
-
- # Sanity check
- if [ ! -f "$tmp_dir/$dxvk_file" ]; then
- debug_print exit "Script error: The requested DXVK file was not downloaded. Aborting"
- fi
-
- # Get the path of the first item listed in the archive
- # This should either be a subdirectory or the path ./
- # depending on how the archive was created
- first_filepath="$(stdbuf -oL tar -tf "$tmp_dir/$dxvk_file" | head -n 1)"
-
- # Extract the dxvk
- case "$first_filepath" in
- # If the files in the archive begin with ./ there is no subdirectory,
- # so we must create one
- ./*)
- debug_print continue "Installing DXVK into $dxvk_dir/$dxvk_name..."
- if [ "$use_zenity" -eq 1 ]; then
- # Use Zenity progress bar
- mkdir -p "$dxvk_dir/$dxvk_name" && tar -xf "$tmp_dir/$dxvk_file" -C "$dxvk_dir/$dxvk_name" | \
- zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Installing DXVK...\n" 2>/dev/null
- else
- mkdir -p "$dxvk_dir/$dxvk_name" && tar -xf "$tmp_dir/$dxvk_file" -C "$dxvk_dir/$dxvk_name"
- fi
- lutris_needs_restart="true"
- ;;
- # If a subdirectory exists and has the same name as the archive,
- # extract it as is
- "$dxvk_name")
- debug_print continue "Installing DXVK into $dxvk_dir/$dxvk_name..."
- if [ "$use_zenity" -eq 1 ]; then
- # Use Zenity progress bar
- mkdir -p "$dxvk_dir" && tar -xf "$tmp_dir/$dxvk_file" -C "$dxvk_dir" | \
- zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Installing DXVK...\n" 2>/dev/null
- else
- mkdir -p "$dxvk_dir" && tar -xf "$tmp_dir/$dxvk_file" -C "$dxvk_dir"
- fi
- lutris_needs_restart="true"
- ;;
- # If a subdirectory exists and has any other name,
- # we must create the correct subdirectory
- *)
- debug_print continue "Installing DXVK into $dxvk_dir/$dxvk_name..."
- if [ "$use_zenity" -eq 1 ]; then
- # Use Zenity progress bar
- mkdir -p "$dxvk_dir/$dxvk_name" && tar -xf "$tmp_dir/$dxvk_file" -C "$dxvk_dir/$dxvk_name" | \
- zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Installing DXVK...\n" 2>/dev/null
- else
- mkdir -p "$dxvk_dir/$dxvk_name" && tar -xf "$tmp_dir/$dxvk_file" -C "$dxvk_dir/$dxvk_name"
- fi
- lutris_needs_restart="true"
- ;;
- esac
-
- # Cleanup tmp download
- debug_print continue "Removing $tmp_dir/$dxvk_file..."
- rm "$tmp_dir/$dxvk_file"
-}
-
-# List available dxvks for download
-dxvk_select_install() {
- # This function expects an element number for the array
- # dxvk_sources to be passed in as an argument
- if [ -z "$1" ]; then
- debug_print exit "Script error: The dxvk_select_install function expects a numerical argument. Aborting."
- fi
-
- # Store info from the selected contributor
- contributor_name="${dxvk_sources[$1]}"
- contributor_url="${dxvk_sources[$1+1]}"
-
- # Check the provided contributor url to make sure we know how to handle it
- # To add new sources, add them here and handle in the if statement
- # just below and the dxvk_install function above
- case "$contributor_url" in
- https://api.github.com*)
- dxvk_url_type="github"
- ;;
- *)
- debug_print exit "Script error: Unknown api/url format in dxvk_sources array. Aborting."
- ;;
- esac
-
- # Fetch a list of dxvk versions from the selected contributor
- # To add new sources, handle them here, in the if statement
- # just above, and the dxvk_install function above
- if [ "$dxvk_url_type" = "github" ]; then
- dxvk_versions=($(curl -s "$contributor_url" | awk '/browser_download_url/ {print $2}' | grep -vE "*.sha512sum" | xargs basename -a))
- else
- debug_print exit "Script error: Unknown api/url format in dxvk_sources array. Aborting."
- fi
-
- # Sanity check
- if [ "${#dxvk_versions[@]}" -eq 0 ]; then
- message warning "No DXVK versions were found. The source API may be down or rate limited."
- return 1
- fi
-
- # Configure the menu
- menu_text_zenity="Select the DXVK version you want to install:"
- menu_text_terminal="Select the DXVK version you want to install:"
- menu_text_height="65"
- goback="Return to the DXVK management menu"
- unset menu_options
- unset menu_actions
-
- # Iterate through the versions, check if they are installed,
- # and add them to the menu options
- # To add new file extensions, handle them here and in
- # the dxvk_install function above
- for (( i=0; i<"$max_dxvks" && i<"${#dxvk_versions[@]}"; i++ )); do
- # Get the dxvk name minus the file extension
- case "${dxvk_versions[i]}" in
- *.tar.gz)
- dxvk_name="$(basename "${dxvk_versions[i]}" .tar.gz)"
- ;;
- *.tgz)
- dxvk_name="$(basename "${dxvk_versions[i]}" .tgz)"
- ;;
- *.tar.xz)
- dxvk_name="$(basename "${dxvk_versions[i]}" .tar.xz)"
- ;;
- *)
- debug_print exit "Unknown archive filetype in dxvk_select_install function. Aborting."
- ;;
- esac
-
- # Add the dxvk names to the menu
- if [ -d "$dxvk_dir/$dxvk_name" ]; then
- menu_options+=("$dxvk_name [installed]")
- else
- menu_options+=("$dxvk_name")
- fi
- menu_actions+=("dxvk_install $i")
- done
-
- # Complete the menu by adding the option to go back to the previous menu
- menu_options+=("$goback")
- menu_actions+=(":") # no-op
-
- # Calculate the total height the menu should be
- menu_height="$(($menu_option_height * ${#menu_options[@]} + $menu_text_height))"
- if [ "$menu_height" -gt "400" ]; then
- menu_height="400"
- fi
-
- # Set the label for the cancel button
- cancel_label="Go Back"
-
- # Call the menu function. It will use the options as configured above
- menu
-}
-
-# Manage Lutris dxvks
+# Configure the download_manage function for dxvks
dxvk_manage() {
- # Check if Lutris is installed
- if [ ! -x "$(command -v lutris)" ]; then
- message info "Lutris does not appear to be installed."
- return 0
- fi
- if [ ! -d "$dxvk_dir" ]; then
- message info "Lutris DXVK directory not found. Unable to continue.\n\n$dxvk_dir"
- return 0
- fi
-
- # The dxvk management menu will loop until the user cancels
- looping_menu="true"
- while [ "$looping_menu" = "true" ]; do
- # Configure the menu
- menu_text_zenity="Manage Your DXVK Versions\n\nThe DXVK versions below may help improve game performance\n\nYou may choose from the following options:"
- menu_text_terminal="Manage Your DXVK Versions\n\nThe DXVK versions below may help improve game performance\nYou may choose from the following options:"
- menu_text_height="140"
+ # Set the required variables to manage dxvks
+ declare -n download_sources=dxvk_sources
+ download_dir="$dxvk_dir"
- # Configure the menu options
- delete="Remove an installed DXVK"
- back="Return to the main menu"
- unset menu_options
- unset menu_actions
+ # Configure the text displayed in the menus
+ download_menu_heading="DXVK Versions"
+ download_menu_description="The DXVK versions below may help improve game performance"
+ download_menu_height="140"
- # Loop through the dxvk_sources array and create a menu item
- # for each one. Even numbered elements will contain the dxvk name
- for (( i=0; i<"${#dxvk_sources[@]}"; i=i+2 )); do
- # Set the options to be displayed in the menu
- menu_options+=("Install a DXVK from ${dxvk_sources[i]}")
- # Set the corresponding functions to be called for each of the options
- menu_actions+=("dxvk_select_install $i")
- done
-
- # Complete the menu by adding options to remove a dxvk
- # or go back to the previous menu
- menu_options+=("$delete" "$back")
- menu_actions+=("dxvk_select_delete" "menu_loop_done")
-
- # Calculate the total height the menu should be
- menu_height="$(($menu_option_height * ${#menu_options[@]} + $menu_text_height))"
-
- # Set the label for the cancel button
- cancel_label="Go Back"
-
- # Call the menu function. It will use the options as configured above
- menu
- done
-
- # Check if lutris needs to be restarted after making changes
- lutris_restart
+ # Call the download_manage function with the above configuration
+ download_manage "dxvk"
}
#-------------------------- end dxvk functions -----------------------------#