45 Commits

Author SHA1 Message Date
9f2c72042e Ensure extracted directory matches archive name
This is how we detect installed items in download_select_install()
2021-10-28 12:30:39 -04:00
25b122e891 Improve comments 2021-10-28 02:18:15 -04:00
a76c3d0a1a Improve post download messages 2021-10-28 02:02:48 -04:00
25a773602e Add post-download instructions 2021-10-28 00:35:43 -04:00
d5d7f75dde Cleanup redundant code 2021-10-27 23:54:51 -04:00
44bcbf8161 Improve comments 2021-10-27 23:28:21 -04:00
acad90a0a5 Rewrite download_install function 2021-10-27 22:30:39 -04:00
77c6fd46bb Bump version 2021-10-27 20:53:41 -04:00
5c112831e0 Refactor runner and dxvk downloading 2021-10-27 20:53:11 -04:00
274c674681 Improve archive subdirectory handling 2021-10-24 12:29:55 -04:00
cf491f9151 Add dxvk releases from /dev/null 2021-10-24 12:01:38 -04:00
199e548767 Bump version 2021-10-18 20:38:07 -04:00
8087ffe564 Add dxvk directory to display_dirs 2021-10-18 15:31:59 -04:00
b2b2312ce9 Update README.md 2021-10-18 15:28:45 -04:00
4ad9603aa3 Download and install DXVK versions 2021-10-18 15:27:49 -04:00
709cb6dbae Bump version number 2021-10-11 10:26:31 -04:00
810f21415e Must be beautiful! 2021-10-11 10:25:25 -04:00
3e982b3303 Fix syntax 2021-10-11 10:10:20 -04:00
cfeb3a841f Update contributors 2021-10-11 09:36:14 -04:00
60af93add3 Update README.md 2021-10-11 09:35:57 -04:00
b64eaf88c5 Add referral code 2021-10-11 09:28:15 -04:00
e8d96c45a0 Fix previous sanity check 2021-10-10 22:16:02 -04:00
d8826f608c Add sanity check 2021-10-10 22:12:28 -04:00
07a99d3aa1 Add show directories to command line arguments 2021-10-10 22:06:00 -04:00
b4791a0b7d Formatting 2021-09-24 10:11:10 -04:00
e43a59ce7b Add moar referral codes! 2021-09-20 15:43:26 -04:00
fc98118ac5 List directories used by the helper and game 2021-09-19 23:13:46 -04:00
4fd9fec8f7 Fix version number (don't ask) 2021-09-18 16:33:06 -04:00
130704107b Bump version 2021-09-18 16:31:37 -04:00
15cad464e3 Remove extraneous / from path 2021-09-18 16:22:50 -04:00
cabfd03c29 Bump version number 2021-09-18 15:52:41 -04:00
33170fae78 Add better cancel button labels
Closes #22
2021-09-18 15:51:57 -04:00
b701ea5e3d Fix gzip error for non-gzip archives 2021-09-18 15:27:51 -04:00
05d75ec82f Ignore sha512sum files when creating download list 2021-09-18 15:17:39 -04:00
2f97a8eb2d Revert "ignoring .sha512sum files in runner release pages" and "solving trying to download the .sha512sum as archive"
Reverts commits c07e673 and 675621c.
2021-09-18 15:14:40 -04:00
cb3fc5d0d7 Reorganize version checker 2021-09-18 13:10:44 -04:00
c42d459ef2 Minor syntax, formatting, and organizational tweaks 2021-09-18 12:57:22 -04:00
675621c4c3 solving trying to download the .sha512sum as archive 2021-07-28 11:08:28 +02:00
c07e673c0d ignoring .sha512sum files in runner release pages 2021-07-27 20:32:07 +02:00
b85df29d6d Revert "ignoring .sha512sum files in runner release pages"
This reverts commit 7f3d84a8bc.
2021-07-27 20:31:02 +02:00
7f3d84a8bc ignoring .sha512sum files in runner release pages 2021-07-27 20:29:02 +02:00
6533cf98bd Merge pull request #20 from Wrzlprnft/patch-1
fix locale causing memory preflight check to fail
2021-07-20 08:49:37 +02:00
c7c8cd1ecd fix locale causing memory preflight check to fail
if the locale uses a decimal `,` instead of `.`, the memory preflight check fails
fix provided by @gort818
2021-07-19 16:01:38 +02:00
e0d149494d added script version check and glibc version check for /dev/null 2021-06-15 15:34:40 +02:00
9800420d73 added GloriousEggrolls lutris-Builds - thanks to Eutyches 2021-06-08 17:09:25 +02:00
2 changed files with 455 additions and 168 deletions

View File

@ -23,7 +23,10 @@ Keybinds are backed up to *$XDG_CONFIG_HOME/starcitizen-lug/keybinds/*
`Manage Lutris Runners`
- Quickly install and delete Lutris wine runners
`User Folder Maintenance and Troubleshooting`
`Manage DXVK Versions`
- Quickly install and delete DXVK versions for Lutris
`Maintenance and Troubleshooting`
- `Switch the helper between LIVE and PTU`
- Toggle between targeting LIVE or PTU for all of the above options. Defaults to LIVE on each run.
@ -34,12 +37,15 @@ Keybinds are backed up to *$XDG_CONFIG_HOME/starcitizen-lug/keybinds/*
- To re-import your keybinds from within the game, select them from the list:
- *Options->Keybindings->Control Profiles*
- `Delete my shaders only`
- `Delete my shaders folder only`
- Sometimes all you need to do between major version updates is delete your shaders directory.
- `Delete my DXVK cache`
- A troubleshooting step that sometimes helps fix various issues and crashes.
- `Display Helper and Star Citizen directories`
- Show all the directories currently in use by both the Helper and Star Citizen.
- `Reset Helper configs`
- Delete the configs saved by the helper in *$XDG_CONFIG_HOME/starcitizen-lug/*
@ -62,4 +68,5 @@ Arch Linux: https://aur.archlinux.org/packages/lug-helper/
- https://github.com/pstn
- https://github.com/gort818
- https://github.com/victort
- https://github.com/Wrzlprnft
- Runner Downloader inspired by https://github.com/richardtatum/sc-runner-updater

View File

@ -15,7 +15,7 @@
# - Check your system for optimal settings and
# change them as needed to prevent crashes.
#
# - Easily install and remove Lutris wine Runners.
# - Easily install and remove Lutris wine Runners and DXVK versions.
#
# - Qickly wipe your Star Citizen USER folder as is recommended
# by CIG after major version updates.
@ -43,14 +43,15 @@
# Contributor: https://github.com/pstn
# Contributor: https://github.com/gort818
# Contributor: https://github.com/victort
# Contributor: https://github.com/Wrzlprnft
# Runner Downloader inspired by:
# https://github.com/richardtatum/sc-runner-updater
############################################################################
# Check if script is run as root
if [ "$(id -u)" = 0 ]; then
echo "This script is not supposed to be run as root!"
exit 1
if [ "$(id -u)" -eq 0 ]; then
echo "This script is not supposed to be run as root!"
exit 1
fi
# Check for dependencies
@ -94,7 +95,7 @@ ptu_dir="PTU"
# Remaining directory paths are set at the end of the getdirs() function
############################################################################
######## Runners ###########################################################
# Lutris wine runners directory
runners_dir="$data_dir/lutris/runners/wine"
@ -106,14 +107,33 @@ runners_dir="$data_dir/lutris/runners/wine"
runner_sources=(
"RawFox" "https://api.github.com/repos/rawfoxDE/raw-wine/releases"
"Molotov/Snatella" "https://api.github.com/repos/snatella/wine-runner-sc/releases"
"/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 ##############################################################
# Lutris dxvk directory
dxvk_dir="$data_dir/lutris/runtime/dxvk"
# URLs for downloading dxvk versions
# Elements in this array must be added in quoted pairs of: "description" "url"
# The first string in the pair is expected to contain the runner description
# The second is expected to contain the github api releases url
# ie. "Sporif Async" "https://api.github.com/repos/Sporif/dxvk-async/releases"
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 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
menu_option_height="25"
############################################################################
# Use logo installed by a packaged version of this script if available
# Otherwise, default to the logo in the same directory
if [ -f "/usr/share/pixmaps/lug-logo.png" ]; then
@ -124,6 +144,11 @@ else
lug_logo="info"
fi
# Github repo and script version info
repo="the-sane/lug-helper"
releases_url="https://github.com/the-sane/lug-helper/releases"
current_version="v1.11.1"
############################################################################
############################################################################
@ -256,6 +281,7 @@ message() {
# This text will be displayed above the menu options.
# Zenity supports Pango Markup for text formatting.
# - The integer "menu_height" specifies the height of the zenity menu.
# - The string "cancel_label" should contain the text of the cancel button.
#
# The final element in each array is expected to be a quit option.
#
@ -277,6 +303,8 @@ menu() {
debug_print exit "Script error: The string 'menu_text_terminal' was not set\nbefore calling the menu function. Aborting."
elif [ -z "$menu_height" ]; then
debug_print exit "Script error: The string 'menu_height' was not set\nbefore calling the menu function. Aborting."
elif [ -z "$cancel_label" ]; then
debug_print exit "Script error: The string 'menu_height' was not set\nbefore calling the menu function. Aborting."
fi
# Use Zenity if it is available
@ -296,7 +324,7 @@ menu() {
done
# Display the zenity radio button menu
choice="$(zenity --list --radiolist --width="480" --height="$menu_height" --text="$menu_text_zenity" --title="Star Citizen LUG Helper" --hide-header --window-icon=$lug_logo --column="" --column="Option" "${zen_options[@]}" 2>/dev/null)"
choice="$(zenity --list --radiolist --width="480" --height="$menu_height" --text="$menu_text_zenity" --title="Star Citizen LUG Helper" --hide-header --cancel-label "$cancel_label" --window-icon=$lug_logo --column="" --column="Option" "${zen_options[@]}" 2>/dev/null)"
# Loop through the options array to match the chosen option
matched="false"
@ -470,7 +498,7 @@ getdirs() {
# $live_or_ptu is set in the set_version() function
############################################################################
# The game's user directory
user_dir="$game_path/$live_or_ptu/USER/Client/0/"
user_dir="$game_path/$live_or_ptu/USER/Client/0"
# The location within the USER directory to which the game exports keybinds
keybinds_dir="$user_dir/Controls/Mappings"
# Shaders directory
@ -481,6 +509,42 @@ getdirs() {
backup_path="$conf_dir/$conf_subdir"
}
# Display all directories currently used by this helper and Star Citizen
display_dirs() {
# Helper configs and keybinds
if [ -d "$conf_dir/$conf_subdir" ]; then
dirs_list+=("\n\nHelper configuration:\n$conf_dir/$conf_subdir\n\nKeybind backups:\n$conf_dir/$conf_subdir/keybinds")
fi
# Wine prefix
if [ -f "$conf_dir/$conf_subdir/$wine_conf" ]; then
dirs_list+="\n\nWine prefix:\n$(cat "$conf_dir/$conf_subdir/$wine_conf")"
fi
# Star Citizen installation
if [ -f "$conf_dir/$conf_subdir/$game_conf" ]; then
dirs_list+="\n\nStar Citizen game directory:\n$(cat "$conf_dir/$conf_subdir/$game_conf")"
fi
# Lutris runners
if [ -d "$runners_dir" ]; then
dirs_list+="\n\nLutris Runners:\n$runners_dir"
fi
# Lutris dxvk
if [ -d "$runners_dir" ]; then
dirs_list+="\n\nLutris DXVK Versions:\n$dxvk_dir"
fi
# Formatting
message_heading="These directories are currently being used by this Helper and Star Citizen"
if [ "$use_zenity" -eq 1 ]; then
message_heading="<b>$message_heading</b>"
fi
message info "$message_heading\n${dirs_list[@]}"
}
# Save exported keybinds, wipe the USER directory, and restore keybinds
sanitize() {
# Prompt user to back up the current keybinds in the game
@ -663,7 +727,7 @@ filelimit_check() {
# Check total system memory
memory_check() {
memtotal="$(awk '/MemTotal/ {printf "%.1f \n", $2/1024/1024}' /proc/meminfo)"
memtotal="$(LC_NUMERIC=C awk '/MemTotal/ {printf "%.1f \n", $2/1024/1024}' /proc/meminfo)"
if [ ${memtotal%.*} -ge "15" ]; then
preflight_pass+=("Your system has $memtotal GB of memory.")
else
@ -729,12 +793,10 @@ rm_dxvkcache() {
fi
}
#------------------------- begin runner functions ----------------------------#
# Restart lutris
lutris_restart() {
if [ "$lutris_needs_restart" = "true" ] && [ "$(pgrep lutris)" ]; then
if message question "Lutris must be restarted to detect runner changes.\nWould you like this Helper to restart it for you?"; then
if message question "Lutris must be restarted to detect the changes.\nWould you like this Helper to restart it for you?"; then
debug_print continue "Restarting Lutris..."
pkill -SIGTERM lutris && nohup lutris </dev/null &>/dev/null &
fi
@ -742,46 +804,64 @@ lutris_restart() {
lutris_needs_restart="false"
}
# Delete the selected runner
runner_delete() {
#------------------------- begin download functions ----------------------------#
# Display post download message or instructions if needed
# Expects the variables message_heading, post_download_msg1,
# post_download_msg2, and downloaded_item_name
post_download() {
if [ "$trigger_post_download" = "true" ]; then
message_heading="Download Complete"
if [ "$use_zenity" -eq 1 ]; then
message_heading="<b>$message_heading</b>"
post_download_msg2="<i>$post_download_msg2</i>"
fi
message info "$message_heading\n\n$post_download_msg1\n\n$post_download_msg2\n$downloaded_item_name"
fi
trigger_post_download="false"
}
# 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
@ -791,194 +871,255 @@ 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)
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 -tzf "$tmp_dir/$runner_file" | head -n 1)"
# Extract the runner
case "$first_filepath" in
# If the files in the archive begin with ./ there is no subdirectory
./*)
debug_print continue "Installing runner into $runners_dir/$runner_name..."
if [ "$use_zenity" -eq 1 ]; then
# Use Zenity progress bar
mkdir -p "$runners_dir/$runner_name" && tar -xzf "$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
else
mkdir -p "$runners_dir/$runner_name" && tar -xzf "$tmp_dir/$runner_file" -C "$runners_dir/$runner_name"
fi
lutris_needs_restart="true"
;;
*)
# Runners with a subdirectory in the archive
debug_print continue "Installing runner into $runners_dir..."
if [ "$use_zenity" -eq 1 ]; then
# Use Zenity progress bar
mkdir -p "$runners_dir" && tar -xzf "$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
else
mkdir -p "$runners_dir" && tar -xzf "$tmp_dir/$runner_file" -C "$runners_dir"
fi
lutris_needs_restart="true"
;;
esac
# Cleanup tmp download
debug_print continue "Removing $tmp_dir/$runner_file..."
rm "$tmp_dir/$runner_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
if [ -z "$1" ]; then
debug_print exit "Script error: The runner_select_install function expects a numerical argument. Aborting."
# Extract the archive to the tmp directory
debug_print continue "Extracting $download_type into $tmp_dir/$download_name..."
if [ "$use_zenity" -eq 1 ]; then
# Use Zenity progress bar
mkdir "$tmp_dir/$download_name" && tar -xf "$tmp_dir/$download_file" -C "$tmp_dir/$download_name" | \
zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Extracting ${download_type}...\n" 2>/dev/null
else
mkdir "$tmp_dir/$download_name" && tar -xf "$tmp_dir/$download_file" -C "$tmp_dir/$download_name"
fi
# Store the url from the selected contributor
contributor_url="${runner_sources[$1+1]}"
# Check the contents of the extracted archive to determine the
# directory structure we must create upon installation
num_dirs=0
num_files=0
for extracted_item in "$tmp_dir/$download_name"/*; do
if [ -d "$extracted_item" ]; then
num_dirs="$((num_dirs+1))"
extracted_dir="$(basename "$extracted_item")"
elif [ -f "$extracted_item" ]; then
num_files="$((num_files+1))"
fi
done
# Create the correct directory structure and install the item
if [ "$num_dirs" -eq 0 ] && [ "$num_files" -eq 0 ]; then
# Sanity check
message warning "The downloaded archive is empty. There is nothing to do."
elif [ "$num_dirs" -eq 1 ] && [ "$num_files" -eq 0 ]; then
# If the archive contains only one directory, install that directory
# We rename it to the name of the archive in case it is different
# so we can easily detect installed items in download_select_install()
debug_print continue "Installing $download_type into $download_dir/$download_name..."
if [ "$use_zenity" -eq 1 ]; then
# Use Zenity progress bar
mkdir -p "$download_dir" && cp -r "$tmp_dir/$download_name/$extracted_dir" "$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 "$download_dir" && cp -r "$tmp_dir/$download_name/$extracted_dir" "$download_dir/$download_name"
fi
# We need to restart Lutris for the download to be detected
lutris_needs_restart="true"
# Store the final name of the downloaded directory
downloaded_item_name="$download_name"
# Trigger the post_download() function
trigger_post_download="true"
elif [ "$num_dirs" -gt 1 ] || [ "$num_files" -gt 0 ]; then
# If the archive contains more than one directory or
# one or more files, we must create a subdirectory
debug_print continue "Installing $download_type into $download_dir/$download_name..."
if [ "$use_zenity" -eq 1 ]; then
# Use Zenity progress bar
mkdir -p "$download_dir/$download_name" && cp -r "$tmp_dir"/"$download_name"/* "$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 "$download_dir/$download_name" && cp -r "$tmp_dir"/"$download_name"/* "$download_dir"/"$download_name"
fi
# We need to restart Lutris for the download to be detected
lutris_needs_restart="true"
# Store the final name of the downloaded directory
downloaded_item_name="$download_name"
# Trigger the post_download() function
trigger_post_download="true"
else
# Some unexpected combination of directories and files
debug_print exit "Script error: Unexpected archive contents in download_install function. Aborting"
exit 0
fi
# Cleanup tmp download
debug_print continue "Cleaning up $tmp_dir/$download_file..."
rm "$tmp_dir/$download_file"
# Display any post-download messages or instructions
post_download
}
# 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 download_select_install function expects a numerical argument. Aborting."
fi
# Store info from the selected contributor
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
# 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}')"
# Fetch a list of runner versions from the selected contributor
if [ "$(bc <<< "$required_glibc > $system_glibc")" = "1" ]; then
message warning "Your glibc version is incompatible with the selected runner.\n\nSystem glibc: v$system_glibc\nMinimum required glibc: v$required_glibc"
return 1
fi
fi
# 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}' | 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)
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
@ -991,53 +1132,85 @@ runner_select_install() {
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 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="<b><big>Manage Your Lutris Runners</big>\n\nThe runners listed below are wine builds created for Star Citizen</b>\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="<b><big>Manage Your $download_menu_heading</big>\n\n$download_menu_description</b>\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))"
# 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
@ -1046,7 +1219,71 @@ runner_manage() {
lutris_restart
}
#-------------------------- end runner functions -----------------------------#
#-------------------------- end download functions -----------------------------#
# Configure the download_manage function for runners
runner_manage() {
# Set some defaults
lutris_needs_restart="false"
trigger_post_download="false"
# Use indirect expansion to point download_sources
# to the runner_sources array set at the top of the script
declare -n download_sources=runner_sources
download_dir="$runners_dir"
# 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"
# Set the post download instructions
# Format:
# A header is automatically displayed that reads: Download Complete
# msg1 is displayed below the header
# msg2 is displayed below that in italics when zenity is in use
# Lastly, the downloaded directory name is automatically displayed
post_download_msg1="Select the runner in Lutris from the dropdown menu"
post_download_msg2="Configure->Runner Options->Wine version"
# Call the download_manage function with the above configuration
# The argument passed to the function is used for special handling
# and displayed in the menus and dialogs.
download_manage "runner"
}
# Configure the download_manage function for dxvks
dxvk_manage() {
# Set some defaults
lutris_needs_restart="false"
trigger_post_download="false"
# Use indirect expansion to point download_sources
# to the dxvk_sources array set at the top of the script
declare -n download_sources=dxvk_sources
download_dir="$dxvk_dir"
# 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"
# Set the post download instructions
# Format:
# A header is automatically displayed that reads: Download Complete
# msg1 is displayed below the header
# msg2 is displayed below that in italics when zenity is in use
# Lastly, the downloaded directory name is automatically displayed
post_download_msg1="Type the DXVK folder name in your Lutris settings"
post_download_msg2="Configure->Runner Options->DXVK version"
# Call the download_manage function with the above configuration
# The argument passed to the function is used for special handling
# and displayed in the menus and dialogs.
download_manage "dxvk"
}
#-------------------------- end dxvk functions -----------------------------#
# Check that the system is optimized for Star Citizen
preflight_check() {
@ -1096,7 +1333,13 @@ preflight_check() {
# Display the results of the preflight check
if [ -z "$preflight_fail_string" ]; then
message info "Preflight Check Complete\n\nYour system is optimized for Star Citizen!\n\n$preflight_pass_string"
# Formatting
message_heading="Preflight Check Complete"
if [ "$use_zenity" -eq 1 ]; then
message_heading="<b>$message_heading</b>"
fi
message info "$message_heading\n\nYour system is optimized for Star Citizen!\n\n$preflight_pass_string"
else
if [ -z "$preflight_action_funcs" ]; then
message warning "$preflight_pass_string$preflight_fail_string"
@ -1165,17 +1408,21 @@ maintenance_menu() {
sanitize_msg="Delete my Star Citizen USER folder and preserve my keybinds"
shaders_msg="Delete my shaders folder only (Do this after each game update)"
vidcache_msg="Delete my DXVK cache"
dirs_msg="Display Helper and Star Citizen directories"
reset_msg="Reset Helper configs"
quit_msg="Return to the main menu"
# Set the options to be displayed in the menu
menu_options=("$version_msg" "$sanitize_msg" "$shaders_msg" "$vidcache_msg" "$reset_msg" "$quit_msg")
menu_options=("$version_msg" "$sanitize_msg" "$shaders_msg" "$vidcache_msg" "$dirs_msg" "$reset_msg" "$quit_msg")
# Set the corresponding functions to be called for each of the options
menu_actions=("set_version" "sanitize" "rm_shaders" "rm_dxvkcache" "reset_helper" "menu_loop_done")
menu_actions=("set_version" "sanitize" "rm_shaders" "rm_dxvkcache" "display_dirs" "reset_helper" "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
@ -1184,7 +1431,7 @@ maintenance_menu() {
# Get a random Penguin's Star Citizen referral code
referral_randomizer() {
# Populate the referral codes array
referral_codes=("STAR-4TZD-6KMM" "STAR-4XM2-VM99" "STAR-2NPY-FCR2" "STAR-T9Z9-7W6P" "STAR-VLBF-W2QR" "STAR-BYR6-YHMF" "STAR-3X2H-VZMX" "STAR-BRWN-FB9T" "STAR-FG6Y-N4Q4" "STAR-VLD6-VZRG" "STAR-T9KF-LV77" "STAR-4XHB-R7RF" "STAR-9NVF-MRN7" "STAR-3Q4W-9TC3" "STAR-3SBK-7QTT" "STAR-XFBT-9TTK" "STAR-F3H9-YPHN" "STAR-BYK6-RCCL" "STAR-XCKH-W6T7" "STAR-H292-39WK" "STAR-ZRT5-PJB7" "STAR-GMBP-SH9Y" "STAR-PLWB-LMFY" "STAR-TNZN-H4ZT" "STAR-T5G5-L2GJ" "STAR-6TPV-7QH2" "STAR-THHD-TV3Y")
referral_codes=("STAR-4TZD-6KMM" "STAR-4XM2-VM99" "STAR-2NPY-FCR2" "STAR-T9Z9-7W6P" "STAR-VLBF-W2QR" "STAR-BYR6-YHMF" "STAR-3X2H-VZMX" "STAR-BRWN-FB9T" "STAR-FG6Y-N4Q4" "STAR-VLD6-VZRG" "STAR-T9KF-LV77" "STAR-4XHB-R7RF" "STAR-9NVF-MRN7" "STAR-3Q4W-9TC3" "STAR-3SBK-7QTT" "STAR-XFBT-9TTK" "STAR-F3H9-YPHN" "STAR-BYK6-RCCL" "STAR-XCKH-W6T7" "STAR-H292-39WK" "STAR-ZRT5-PJB7" "STAR-GMBP-SH9Y" "STAR-PLWB-LMFY" "STAR-TNZN-H4ZT" "STAR-T5G5-L2GJ" "STAR-6TPV-7QH2" "STAR-THHD-TV3Y" "STAR-7ZFS-PK2L" "STAR-SRQN-43TB" "STAR-9TDG-D4H9" "STAR-BPH3-THJC" "STAR-HL3M-R5KC" "STAR-GBS5-LTVB" "STAR-CJ3Y-KZZ4" "STAR-5GRM-7HBY" "STAR-G2GX-Y2QJ" "STAR-YWY3-H4XX" "STAR-6VGM-PTKC" "STAR-T6MZ-QFHX" "STAR-T2K6-LXFW" "STAR-XN25-9CJJ" "STAR-47V3-4QGB")
# Pick a random array element. Scale a floating point number for
# a more random distribution than simply calling RANDOM
random_code="${referral_codes[$(awk '{srand($2); print int(rand()*$1)}' <<< "${#referral_codes[@]} $RANDOM")]}"
@ -1216,6 +1463,19 @@ reset_helper() {
fi
}
# Get the latest release version of a repo. Expects "user/repo_name" as input
# Credits for this go to https://gist.github.com/lukechilds/a83e1d7127b78fef38c2914c4ececc3c
get_latest_release() {
# Sanity check
if [ "$#" -lt 1 ]; then
debug_print exit "Script error: The get_latest_release function expects one argument. Aborting."
fi
curl --silent "https://api.github.com/repos/$1/releases/latest" | # Get latest release from GitHub api
grep '"tag_name":' | # Get tag line
sed -E 's/.*"([^"]+)".*/\1/' # Pluck JSON value
}
quit() {
exit 0
}
@ -1231,9 +1491,21 @@ if [ -x "$(command -v zenity)" ]; then
use_zenity=1
fi
# Set some defaults
# Set defaults
live_or_ptu="$live_dir"
lutris_needs_restart="false"
# Check if a newer verison of the script is available
latest_version="$(get_latest_release "$repo")"
if [ "$latest_version" != "$current_version" ]; then
if [ "$use_zenity" -eq 1 ]; then
releases_url_formatted="<a href='$releases_url'>$releases_url</a>"
else
releases_url_formatted="$releases_url"
fi
message info "The latest version of the LUG Helper is $latest_version\nYou are using $current_version\n\nYou can download new releases here:\n$releases_url_formatted"
fi
# If invoked with command line arguments, process them and exit
if [ "$#" -gt 0 ]; then
@ -1250,8 +1522,9 @@ Usage: lug-helper <options>
-s, --delete-shaders Delete Star Citizen shaders directory
-c, --delete-dxvk-cache Delete Star Citizen dxvk cache file
-t, --target=[live|ptu] Target LIVE or PTU (default live)
-g, --use-gui=[yes|no] Use Zenity GUI (default yes)
-g, --use-gui=[yes|no] Use Zenity GUI if available (default yes)
-r, --get-referral Get a random LUG member's Star Citizen referral code
-d, --show-directories Show all Star Citizen and LUG Helper directories
-x, --reset-helper Delete saved lug-helper configs
"
exit 0
@ -1300,6 +1573,9 @@ Usage: lug-helper <options>
--get-referral | -r )
cargs+=("referral_randomizer")
;;
--show-directories | -d )
cargs+=("display_dirs")
;;
--reset-helper | -x )
cargs+=("reset_helper")
;;
@ -1331,18 +1607,22 @@ while true; do
# Configure the menu options
preflight_msg="Preflight Check (System Optimization)"
runners_msg="Manage Lutris Runners"
maintenance_msg="User Folder Maintenance and Troubleshooting"
dxvk_msg="Manage DXVK Versions"
maintenance_msg="Maintenance and Troubleshooting"
randomizer_msg="Get a random Penguin's Star Citizen referral code"
quit_msg="Quit"
# Set the options to be displayed in the menu
menu_options=("$preflight_msg" "$runners_msg" "$maintenance_msg" "$randomizer_msg" "$quit_msg")
menu_options=("$preflight_msg" "$runners_msg" "$dxvk_msg" "$maintenance_msg" "$randomizer_msg" "$quit_msg")
# Set the corresponding functions to be called for each of the options
menu_actions=("preflight_check" "runner_manage" "maintenance_menu" "referral_randomizer" "quit")
menu_actions=("preflight_check" "runner_manage" "dxvk_manage" "maintenance_menu" "referral_randomizer" "quit")
# 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="Quit"
# Call the menu function. It will use the options as configured above
menu
done