#!/bin/bash # --- Main Script --- # Generate a unique temporary filename with a timestamp conf_file="packages.conf.$(date +%Y%m%d%H%M%S)" # Set up a trap to delete the temporary file on exit, regardless of how the script ends trap 'rm -f "${conf_file}"' EXIT # Download the configuration file before sourcing it. echo "🔄 Downloading configuration file '${conf_file}'..." if ! curl -fsSL -o "${conf_file}" "https://git.technopunk.space/tomi/Scripts/raw/branch/main/packages.conf"; then echo "❌ Error: Failed to download packages.conf. Exiting." exit 1 fi echo "✅ Configuration file downloaded successfully." # Source the configuration file to load the SCRIPT_PACKAGES array. source "${conf_file}" # Welcome message echo "-------------------------------------" echo "        Script Downloader            " echo "-------------------------------------" # Create an array of options from the package names (the keys of our map) options=("${!SCRIPT_PACKAGES[@]}") options+=("Quit") # Add a Quit option # Set the prompt for the select menu PS3="Please enter the number of the script/package you want to download: " # Display the menu and handle user input select choice in "${options[@]}"; do     case "${choice}" in         "Quit")             echo "👋 Exiting."             break             ;;         *)             # Check if the user's choice is a valid package name             if [[ -n "${SCRIPT_PACKAGES[$choice]}" ]]; then                 echo                 echo "⬇️  Downloading package: '${choice}'..."                                  # Get the space-separated list of URLs for the chosen package                 urls_to_download="${SCRIPT_PACKAGES[$choice]}"                 # Loop through each URL in the list and download the file                 for url in $urls_to_download; do                     filename=$(basename "${url}")                     # If it's a .conf file AND it already exists, ask to overwrite.                     if [[ "${filename}" == *.conf && -f "${filename}" ]]; then                         echo "   -> Found existing config file: '${filename}'."                         # Create a temporary file to download the new version for comparison                         tmp_file=$(mktemp)                         # Download the new version silently to the temp file                         if curl -fsSL -o "${tmp_file}" "${url}"; then                             echo "   🔎 Comparing versions..."                             echo "-------------------- DIFF START --------------------"                             # Show a colorized diff if 'colordiff' is available, otherwise use regular 'diff'                             if command -v colordiff &> /dev/null; then                                 colordiff -u "${filename}" "${tmp_file}"                             else                                 diff --color=always -u "${filename}" "${tmp_file}"                             fi                             echo "--------------------- DIFF END ---------------------"                                                          # Ask the user for confirmation before overwriting                             read -p "Do you want to overwrite '${filename}'? (y/N) " -n 1 -r REPLY                             echo # Move to a new line for cleaner output                             if [[ $REPLY =~ ^[Yy]$ ]]; then                                 mv "${tmp_file}" "${filename}"                                 echo "   ✅ Updated '${filename}'."                             else                                 rm "${tmp_file}"                                 echo "   🤷 Kept existing version of '${filename}'."                             fi                         else                             echo "   ❌ Error: Failed to download new version of '${filename}' for comparison."                             # Clean up the temp file on failure                             rm -f "${tmp_file}"                         fi                     else                         # Original download logic for all other files (or new .conf files)                         echo "   -> Downloading '${filename}'..."                         if curl -fsSL -o "${filename}" "${url}"; then                             echo "   ✅ Successfully downloaded '${filename}'."                             # If the downloaded file is a shell script, make it executable                             if [[ "${filename}" == *.sh ]]; then                                 chmod +x "${filename}"                                 echo "   🤖 Made '${filename}' executable."                             fi                         else                             echo "   ❌ Error: Failed to download '${filename}'."                         fi                     fi                 done                 echo                 echo "📦 Package download complete."                 break             else                 # The user entered an invalid number                 echo "Invalid selection. Please try again."             fi             ;;     esac done