199 lines
7.3 KiB
Bash
199 lines
7.3 KiB
Bash
# Alerts, for when user needs to read something.
|
|
alert() {
|
|
play -qnV0 synth 3 pluck D3 pluck A3 pluck D4 pluck F4 pluck A4 delay 0 .1 .2 .3 .4 remix - chorus 0.9 0.9 38 0.75 0.3 0.5 -t
|
|
echo
|
|
read -rp "Press enter to continue." continue
|
|
}
|
|
|
|
check_requirements() {
|
|
# Make sure the minimum of curl, sox, wine, and winetricks are installed or fex-emu on aarch64
|
|
if [[ "$(uname -m)" == "aarch64" ]]; then
|
|
minimumDependencies=("FEXLoader")
|
|
wine="FEXLoader -- /usr/bin/wine"
|
|
else
|
|
minimumDependencies=("curl" "sox" "wine")
|
|
fi
|
|
for i in "${minimumDependencies[@]}" ; do
|
|
if ! command -v $i &> /dev/null ; then
|
|
echo "Please install $i before continuing."
|
|
return 1
|
|
fi
|
|
done
|
|
return 0
|
|
}
|
|
|
|
clear_cache() {
|
|
local answer
|
|
if [[ ! -d "${cache}" ]]; then
|
|
echo "No cache found at ${cache}."
|
|
return
|
|
fi
|
|
while ! [[ "${answer,,}" =~ ^yes$|^no$ ]]; do
|
|
echo "This will delete all contents of ${cache}. Are you sure you want to continue?"
|
|
echo "Please type yes or no."
|
|
echo
|
|
read -r answer
|
|
done
|
|
if [[ "$answer" == "no" ]]; then
|
|
return
|
|
fi
|
|
# All safety checks done. Delete the cache.
|
|
rm -rfv "${cache}"
|
|
echo "Cache deleted."
|
|
}
|
|
|
|
download() {
|
|
local source=($@)
|
|
for i in "${source[@]}" ; do
|
|
local dest="${i##*/}"
|
|
dest="${dest//%20/ }"
|
|
dest="${dest#*\?filename=}"
|
|
dest="${dest%\?*}"
|
|
# Remove the destination file if it is empty.
|
|
[[ -s "${cache}/${dest}" ]] || rm -f "${cache}/${dest}" 2> /dev/null
|
|
if [[ "${redownload}" == "true" ]] && [[ -e "${cache}/${dest}" ]]; then
|
|
rm -v "${cache}/${dest}"
|
|
fi
|
|
# Skip if the item is in cache.
|
|
[[ -e "${cache}/${dest}" ]] && continue
|
|
{ if ! curl -L4 -C - --retry 10 --output "${cache}/${dest}" "${i}" ; then
|
|
echo "Could not download \"$i\"..."
|
|
exit 1
|
|
fi; } | dialog --backtitle "Audio Game Manager" \
|
|
--progressbox "Downloading \"$dest\" from \"$i\"" -1 -1
|
|
local downloadError=1
|
|
case "${dest##*.}" in
|
|
"pk3"|"zip")
|
|
unzip -tq "${cache}/${dest}" | dialog --backtitle "Audio Game Manager" \
|
|
--progressbox "Validating ${dest##*.} file" -1 -1 --stdout
|
|
downloadError=$?
|
|
;;
|
|
"7z")
|
|
7z t "${cache}/${dest}" | dialog --backtitle "Audio Game Manager" \
|
|
--progressbox "Validating 7z file" -1 -1 --stdout
|
|
downloadError=$?
|
|
;;
|
|
"exe")
|
|
# Check if it's a valid Windows executable by looking at the MZ header
|
|
hexdump -n 2 -v -e '/1 "%02X"' "${cache}/${dest}" | grep -q "4D5A"
|
|
downloadError=$?
|
|
;;
|
|
"wad")
|
|
if [[ "$(file -b --mime-type "${cache}/${dest}")" != "application/octet-stream" ]]; then
|
|
downloadError=0
|
|
fi
|
|
;;
|
|
*)
|
|
# Add HTML check for other file types
|
|
if file -b "${cache}/${dest}" | grep -q "HTML document" ; then
|
|
echo "File not found: \"$i\" (HTML document probably 404)"
|
|
downloadError=1
|
|
else
|
|
downloadError=0
|
|
fi
|
|
;;
|
|
esac
|
|
if [[ $downloadError -ne 0 ]]; then
|
|
rm -fv "${cache}/${dest}"
|
|
dialog --backtitle "Audio Game Manager" \
|
|
--infobox "Error downloading \"${dest}\". Installation cannot continue." -1 -1 --stdout
|
|
alert
|
|
exit 1
|
|
fi
|
|
done
|
|
}
|
|
|
|
get_installer() {
|
|
trap "exit 0" SIGINT
|
|
# If the file is in cache nothing else needs to be done.
|
|
if [[ -f "${cache}/$1" ]]; then
|
|
return
|
|
fi
|
|
# Create message for dialog.
|
|
local message="Make sure $1 is available in either your Downloads or Desktop directory and press enter to continue."
|
|
if [[ -n "$2" ]]; then
|
|
message+="\n\nThe last good known URL for $game is:"
|
|
message+="\n$2"
|
|
fi
|
|
if echo "$2" | xclip -selection clipboard 2> /dev/null ; then
|
|
message+="\n\nThe URL has been copied to the clipboard."
|
|
fi
|
|
dialog --ok-label "Continue" \
|
|
--backtitle "Audiogame Manager" \
|
|
--msgbox "$message" -1 -1
|
|
# Search the Desktop and Downloads directories for the installation file
|
|
for i in ~/Downloads ~/Desktop ; do
|
|
find $i -type f -name "$1" -exec cp -v {} "${cache}/" \;
|
|
done
|
|
# If the file is still not available abort.
|
|
if [[ ! -f "${cache}/$1" ]]; then
|
|
echo "couldn't find $1. Please download the file and try again."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
get_steam() {
|
|
# Arguments: $1 id of item for download, $2 url for game
|
|
trap "exit 0" SIGINT
|
|
echo "manual intervention required."
|
|
alert
|
|
dialog --backtitle "Audiogame Manager" \
|
|
--yes-label "Continue with Steam" \
|
|
--no-label "Install manually" \
|
|
--extra-button \
|
|
--extra-label "Exit" \
|
|
--yesno "To install the game manually, place files in \"${WINEPREFIX}/drive_c/Program Files/${game}\"" -1 -1 --stdout
|
|
case $? in
|
|
0) echo "The next steps will install through steamcmd." ;;
|
|
1)
|
|
mkdir -p "${WINEPREFIX}/drive_c/Program Files/${game}"
|
|
dialog --backtitle "Audiogame Manager" \
|
|
--msgbox "Place game files in \"${WINEPREFIX}/drive_c/Program Files/${game}\" and press enter to continue." -1 -1 --stdout
|
|
return
|
|
;;
|
|
*) exit 0 ;;
|
|
esac
|
|
# Check for steamcmd
|
|
if ! command -v steamcmd &> /dev/null ; then
|
|
dialog --backtitle "Audiogame Manager" \
|
|
--infobox "This installer requires steamcmd. Please install steamcmd and try again." -1 -1
|
|
exit 1
|
|
fi
|
|
# Create message for dialog.
|
|
local message="Make sure ${game} is available in your Steam library and press enter to continue. The URL for ${game} is $2"
|
|
if echo "$2" | xclip -selection clipboard 2> /dev/null ; then
|
|
message+="\n\nThe URL has been copied to the clipboard."
|
|
fi
|
|
dialog --ok-label "Continue" \
|
|
--backtitle "Audiogame Manager" \
|
|
--msgbox "$message" -1 -1
|
|
# Get Steam user name.
|
|
steamUser="$(dialog --ok-label "Continue" \
|
|
--backtitle "Audiogame Manager" \
|
|
--inputbox "Please enter your Steam user name:" -1 -1 --stdout)"
|
|
# Download the game
|
|
mkdir -p "${WINEPREFIX}/drive_c/Program Files/${game}"
|
|
steamcmd +@sSteamCmdForcePlatformType windows +force_install_dir "${WINEPREFIX}/drive_c/Program Files/$game" +login "$steamUser" +app_update "$1" +quit || { dialog --backtitle "Audiogame Manager" \
|
|
--infobox "Something went wrong. Please make sure you have a stable internet connection, and if the problem persists, contact audiogame-manager's developers." -1 -1
|
|
exit 1; }
|
|
}
|
|
|
|
# Function to open urls across OS.
|
|
open_url() {
|
|
if [[ "$(uname)" == "Darwin" ]]; then
|
|
open "${*}" 2> /dev/null
|
|
else
|
|
xdg-open "${*}" 2> /dev/null
|
|
fi
|
|
}
|
|
|
|
unix2dos() {
|
|
if [[ $# -eq 0 ]]; then
|
|
echo "Usage: unix2dos file(s)."
|
|
exit 1
|
|
fi
|
|
for file in "$@"; do
|
|
sed -i 's/\r\{0,\}$/\r/' "$file"
|
|
done
|
|
}
|