#!/usr/bin/bash # BEGIN: Variables DEBUG=1 ACTION="" DOWNLOAD_URL='https://discord.com/api/download/stable?platform=linux&format=tar.gz' VERSION_REGEX='[0-9]+\.[0-9]+\.[0-9]+' INSTALL_DIR=~/.opt LOCAL_APPLICATION_DIR=~/.local/share/applications EXISTING_INSTALL=$INSTALL_DIR/Discord BUILD_FILE=$EXISTING_INSTALL/resources/build_info.json DESKTOP_FILE=$EXISTING_INSTALL/discord.desktop INSTALLED_DESKTOP_FILE=$LOCAL_APPLICATION_DIR/discord.desktop PACKAGE_DOWNLOAD_URL_BASE='https://dl.discordapp.net/apps/linux/{VERSION}/discord-{VERSION}.tar.gz' ICON_DIR=~/.local/share/icons DESKTOP_FILE_NEEDS_UPDATE=0 # END: Variables # BEGIN: Helper Functions function log () { if [[ $DEBUG -eq 1 ]]; then local DATE=`date` local MESSAGE="${1:?"log: Message not provided"}" echo "$DATE : $MESSAGE" fi } function get_remote_version(){ local REMOTE_VERSION=`curl -s $DOWNLOAD_URL | grep -Eo $VERSION_REGEX | head -n 1` if [[ "$REMOTE_VERSION" ]]; then echo "$REMOTE_VERSION" return 0 else log "error: remote version not found" return 1 fi } function do_download(){ local VERSION="${1:?"do_download : Version was not provided"}" ## If the provided version doesn't match the format #.#.# if [[ ! "$VERSION" =~ ^$VERSION_REGEX$ ]]; then log "do_download : the version ($VERSION) provided, does not match format $VERSION_REGEX." exit 2 fi ## Making the URL to download the package ### replacing all {VERSION} in PACKAGE_DOWNLOAD_URL_BASE with $REMOTE_VERSION using string substitution PACKAGE_DOWNLOAD_URL="${PACKAGE_DOWNLOAD_URL_BASE//\{VERSION\}/$REMOTE_VERSION}" log "Download url created ($PACKAGE_DOWNLOAD_URL)" ## Getting filename from url ### Removing all characters from the last / back to leave only the filename FILENAME="${PACKAGE_DOWNLOAD_URL/*\/}" log "File was downloaded as $FILENAME" ## Downloading the discord package (tar.gz) curl "$PACKAGE_DOWNLOAD_URL" -o "$FILENAME" >/dev/null 2>&1 } function update_desktop_file() { log "Updating desktop file" ## Desktop file in the current/new install DESKTOP_FILE=$EXISTING_INSTALL/discord.desktop ## Escaped becuase it would mess up the replacement syntax PATH_TO_REPLACE=\/usr\/bin PATH_REPLACEMENT=$EXISTING_INSTALL ## Escaped becuase it would mess up the replacement syntax EXEC_TO_REPLACE=\/usr\/share\/discord\/Discord EXEC_REPLACEMENT=$EXISTING_INSTALL/Discord ## Loading the desktop file contents into a variable to use replacement without sed DESKTOP_FILE_CONTENTS="$(<$DESKTOP_FILE)" ## Replacing Path DESKTOP_FILE_CONTENTS="${DESKTOP_FILE_CONTENTS/$PATH_TO_REPLACE/$PATH_REPLACEMENT}" ## Replacing Exec DESKTOP_FILE_CONTENTS="${DESKTOP_FILE_CONTENTS/$EXEC_TO_REPLACE/$EXEC_REPLACEMENT}" ## Pushing replacement values to desktop file echo -e "$DESKTOP_FILE_CONTENTS" > $DESKTOP_FILE log "Desktop file has been updated" } function do_install() { cd "$INSTALL_DIR" REMOTE_VERSION=`get_remote_version` do_download "$REMOTE_VERSION" ## Error handling in case curl couldn't do the download (or error in script) if [[ -f $FILENAME ]]; then tar xf "$FILENAME" else log "$FILENAME failed to download. Exiting now" exit 3 fi update_desktop_file [[ ! -d $ICON_DIR ]] && mkdir -p $ICON_DIR cp $EXISTING_INSTALL/discord.png $ICON_DIR/ } function do_upgrade(){ cd "$INSTALL_DIR" REMOTE_VERSION=`get_remote_version` do_download "$REMOTE_VERSION" ## FILENAME provided by do_download FILENAME="${FILENAME:?"do_upgrade : FILENAME not set by do_download"}" tar xf "$FILENAME" update_desktop_file } # END: Helper Functions # BEGIN: Pre-Work Check if [[ -d $EXISTING_INSTALL ]] && [[ -f $BUILD_FILE ]]; then LOCAL_VERSION=`grep -Eo $VERSION_REGEX $BUILD_FILE` log "Local version was found to be ($LOCAL_VERSION)" else ACTION=INSTALL fi REMOTE_VERSION=`get_remote_version` log "Retrieved remote version ($REMOTE_VERSION)" # END: Pre-Work Check # BEGIN: Work ## If ACTION hasn't already been set if [[ ! $ACTION ]]; then ## Use read to get version numbers in arrays OIFS=$IFS IFS='.' read -a local_versions <<< "$LOCAL_VERSION" read -a remote_versions <<< "$REMOTE_VERSION" IFS=$OIFS ## Check if the remote version is greater than the local for (( i=0; i<3; i++)); do ## If at any point the remote version is greater than the local this will break and set NEEDS_UPGRADE flag if [[ ${local_versions[$i]} -lt ${remote_versions[$i]} ]]; then ACTION=UPGRADE break fi done fi case $ACTION in INSTALL) do_install ;; UPGRADE) do_upgrade ;; esac # END: Work # BEGIN: End Work Check ## If discord isn't already setup, go ahead and mark it for install/update if [[ ! -f $INSTALLED_DESKTOP_FILE ]]; then log "Desktop file not found in the local applications dir ($LOCAL_APPLICATION_DIR) installing now" DESKTOP_FILE_NEEDS_UPDATE=1 else # If there is a change for any reason update it if [[ "$(<$DESKTOP_FILE)" != "$(<$INSTALLED_DESKTOP_FILE)" ]]; then log "Desktop file for new version of discord has changed. Updating the existing installation" DESKTOP_FILE_NEEDS_UPDATE=1 fi fi if [[ $DESKTOP_FILE_NEEDS_UPDATE -eq 1 ]]; then log "Updating/Installing desktop file" desktop-file-install --dir=$LOCAL_APPLICATION_DIR $DESKTOP_FILE if [[ $? -ne 0 ]]; then log "There was an issue with installtion" else log "Desktop file was successfully installed" fi fi # END: End Work Check