128 lines
3.5 KiB
Bash
128 lines
3.5 KiB
Bash
#!/bin/bash
|
|
set -xeuo pipefail
|
|
source /opt/l4d2/scripts/helpers
|
|
overlay=$(basename "$0")
|
|
|
|
steam mkdir -p /opt/l4d2/overlays/$overlay/left4dead2/addons
|
|
cd /opt/l4d2/overlays/$overlay/left4dead2/addons
|
|
|
|
# https://l4d2center.com/maps/servers/l4d2center_maps_sync.sh.txt ->
|
|
|
|
# Exit immediately if a command exits with a non-zero status.
|
|
set -e
|
|
|
|
# Function to print error messages
|
|
error_exit() {
|
|
echo "Error: $1" >&2
|
|
exit 1
|
|
}
|
|
|
|
# Check if the current directory ends with /left4dead2/addons
|
|
current_dir=$(pwd)
|
|
expected_dir="/left4dead2/addons"
|
|
|
|
if [[ ! "$current_dir" == *"$expected_dir" ]]; then
|
|
error_exit "Script must be run from your L4D2 \"addons\" folder. Current directory: $current_dir"
|
|
fi
|
|
|
|
# Check for required commands
|
|
for cmd in curl md5sum 7z; do
|
|
if ! command -v "$cmd" >/dev/null 2>&1; then
|
|
error_exit "Required command '$cmd' is not installed. Please install it and retry."
|
|
fi
|
|
done
|
|
|
|
# URL of the CSV file
|
|
CSV_URL="https://l4d2center.com/maps/servers/index.csv"
|
|
|
|
# Temporary file to store CSV
|
|
TEMP_CSV=$(mktemp)
|
|
|
|
# Ensure temporary file is removed on exit
|
|
trap 'rm -f "$TEMP_CSV"' EXIT
|
|
|
|
echo "Downloading CSV from $CSV_URL..."
|
|
curl -sSL -o "$TEMP_CSV" "$CSV_URL" || error_exit "Failed to download CSV."
|
|
|
|
declare -A map_md5
|
|
declare -A map_links
|
|
|
|
# Read CSV and populate associative arrays
|
|
{
|
|
# Skip the first line (header)
|
|
IFS= read -r header
|
|
|
|
while IFS=';' read -r Name Size MD5 DownloadLink || [[ $Name ]]; do
|
|
# Trim whitespace
|
|
Name=$(echo "$Name" | xargs)
|
|
MD5=$(echo "$MD5" | xargs)
|
|
DownloadLink=$(echo "$DownloadLink" | xargs)
|
|
|
|
# Populate associative arrays
|
|
map_md5["$Name"]="$MD5"
|
|
map_links["$Name"]="$DownloadLink"
|
|
done
|
|
} < "$TEMP_CSV"
|
|
|
|
# Get list of expected VPK files
|
|
expected_vpk=("${!map_md5[@]}")
|
|
|
|
# Remove VPK files not in expected list or with mismatched MD5
|
|
echo "Cleaning up existing VPK files..."
|
|
for file in *.vpk; do
|
|
# Check if it's a regular file
|
|
if [[ -f "$file" ]]; then
|
|
if [[ -z "${map_md5["$file"]}" ]]; then
|
|
echo "Removing unexpected file: $file"
|
|
rm -f "$file"
|
|
else
|
|
# Calculate MD5
|
|
echo "Calculating MD5 for existing file: $file..."
|
|
current_md5=$(md5sum "$file" | awk '{print $1}')
|
|
expected_md5="${map_md5["$file"]}"
|
|
|
|
if [[ "$current_md5" != "$expected_md5" ]]; then
|
|
echo "MD5 mismatch for $file. Removing."
|
|
rm -f "$file"
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# Download and extract missing or updated VPK files
|
|
echo "Processing required VPK files..."
|
|
for vpk in "${expected_vpk[@]}"; do
|
|
if [[ ! -f "$vpk" ]]; then
|
|
echo "Downloading and extracting $vpk..."
|
|
download_url="${map_links["$vpk"]}"
|
|
|
|
if [[ -z "$download_url" ]]; then
|
|
echo "No download link found for $vpk. Skipping."
|
|
continue
|
|
fi
|
|
|
|
encoded_url=$(echo "$download_url" | sed 's/ /%20/g')
|
|
|
|
# Download the .7z file to a temporary location
|
|
TEMP_7Z=$(mktemp --suffix=.7z)
|
|
curl -# -L -o "$TEMP_7Z" "$encoded_url"
|
|
|
|
# Check if the download was successful
|
|
if [[ $? -ne 0 ]]; then
|
|
echo "Failed to download $download_url. Skipping."
|
|
rm -f "$TEMP_7Z"
|
|
continue
|
|
fi
|
|
|
|
# Extract the .7z file
|
|
7z x -y "$TEMP_7Z" || { echo "Failed to extract $TEMP_7Z. Skipping."; rm -f "$TEMP_7Z"; continue; }
|
|
|
|
# Remove the temporary .7z file
|
|
rm -f "$TEMP_7Z"
|
|
|
|
else
|
|
echo "$vpk is already up to date."
|
|
fi
|
|
done
|
|
|
|
echo "Synchronization complete."
|