#!/bin/bash # Lade globale Konfiguration CONFIG_FILE_PATH="$(dirname "$0")/config.sh" if [ -f "$CONFIG_FILE_PATH" ]; then source "$CONFIG_FILE_PATH" else echo "FEHLER: Konfigurationsdatei config.sh nicht unter ${CONFIG_FILE_PATH} gefunden!" exit 1 fi # === Abgeleitete Variablen === SCRIPT_BASENAME=$(basename "$0" .sh) LOG_FILE="${LOG_DIR_BASE}/${SCRIPT_BASENAME}.log" LOCK_FILE="${LOCK_FILE_BASE_DIR}/${SCRIPT_BASENAME}.lock" WEB_CONTENT_STATIC_PATH="${WEB_CONTENT_BASE_PATH}/${WEB_CONTENT_STATIC_SUBDIR}" CACHE_BUSTER=$(date +%s) ACTUAL_BANNER_IMG_URL_PATH="${FALLBACK_BANNER_IMG_URL}" # === Logging Funktion === log_message() { local msg; msg="$(date '+%Y-%m-%d %H:%M:%S') - $1"; echo "${msg}" | tee -a "$LOG_FILE"; } # === Hilfsfunktionen für Platzhalter === create_placeholder_file() { local fp="$1"; local dc="$2"; if [ ! -f "$fp" ]; then mkdir -p "$(dirname "$fp")"; echo -e "$dc" > "$fp"; log_message "Platzhalterdatei: $fp"; fi; } get_config_value_from_file() { local cf="$1"; local k="$2"; local dv="${3:-}"; local v; if [ ! -f "$cf" ]; then echo "$dv"; return; fi; v=$(grep -E "^\s*${k}\s*=" "$cf"|tail -n 1|sed -e 's/\s*#.*//' -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'|cut -d'=' -f2-|sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e 's/^"//' -e 's/"$//' -e "s/^'//" -e "s/'$//"); if [ -n "$v" ]; then echo "$v"; else echo "$dv"; fi;} create_placeholder_web_conf() { local target_path="$1" local template_file="${EXAMPLE_TEMPLATE_DIR_PATH}/web.conf.template" if [ -f "$template_file" ]; then cp "$template_file" "$target_path" log_message "Beispiel-Konfiguration web.conf von Template nach ${target_path} kopiert." else log_message "FEHLER: Beispiel-Konfigurations-Template nicht gefunden unter ${template_file}!" local world_key=$(basename "$(dirname "$target_path")") local content="# Minimale Konfiguration für die Welt '${world_key}'\n\nWORLD_DISPLAY_NAME=\"${world_key}\"" create_placeholder_file "$target_path" "$content" fi } # === Template Rendering Funktion === render_template() { local template_path="$1" if [ ! -f "$template_path" ]; then log_message "FEHLER: Template-Datei nicht gefunden: ${template_path}"; return 1; fi local template_content; template_content=$(<"$template_path") eval "cat < "$css_file_path" if [ $? -eq 0 ]; then log_message "CSS-Datei erfolgreich erstellt."; else log_message "FEHLER CSS."; fi } generate_html_header() { local current_page_title="$1" local relative_path_prefix="${2:-.}" local active_page_id="${3:-}" local active_class_home=""; local active_class_worlds=""; local active_class_downloads="" case "$active_page_id" in home) active_class_home="active" ;; worlds) active_class_worlds="active" ;; downloads)active_class_downloads="active" ;; esac render_template "${TEMPLATE_DIR_PATH}/html_header.template" } # --- ANGEPASST: Nutzt jetzt die neue Template-Datei --- generate_html_footer() { render_template "${TEMPLATE_DIR_PATH}/html_footer.template" } generate_homepage() { local p="${WEB_ROOT_PATH}/index.html"; local c="${WEB_CONTENT_STATIC_PATH}/startseite_content.html"; log_message "Erzeuge ${p}..."; generate_html_header "Willkommen" "." "home" > "$p"; if [ -f "$c" ]; then cat "$c" >> "$p"; else echo "

Willkommen!

" >> "$p"; fi; generate_html_footer >> "$p"; } generate_impressum() { local p="${WEB_ROOT_PATH}/impressum.html"; local c="${WEB_CONTENT_STATIC_PATH}/impressum_content.html"; log_message "Erzeuge ${p}..."; generate_html_header "Impressum" > "$p"; if [ -f "$c" ]; then cat "$c" >> "$p"; else echo "

Impressum

Betreiber: ${SITE_OWNER_NAME}
Kontakt: ${SITE_OWNER_EMAIL}

" >> "$p"; fi; generate_html_footer >> "$p"; } generate_downloads_page() { local p="${WEB_ROOT_PATH}/downloads.html"; local c="${WEB_CONTENT_STATIC_PATH}/downloads_content.html"; log_message "Erzeuge ${p}..."; generate_html_header "Downloads" "." "downloads" > "$p"; if [ -f "$c" ]; then cat "$c" >> "$p"; else cat >>"$p" <Downloads

Offizielle Seite: luanti.org

EOF fi; generate_html_footer >> "$p"; } generate_datenschutz_page() { local p="${WEB_ROOT_PATH}/datenschutz.html"; local c="${WEB_CONTENT_STATIC_PATH}/datenschutz_content.html"; log_message "Erzeuge ${p}..."; generate_html_header "Datenschutz" > "$p"; if [ -f "$c" ]; then cat "$c" >> "$p"; else echo "

Datenschutzerklärung

Platzhalter.

" >> "$p"; fi; generate_html_footer >> "$p"; } generate_worlds_overview() { local overview_file="${WEB_ROOT_PATH}/worlds.html"; log_message "Erzeuge Weltenübersicht: ${overview_file}..." generate_html_header "Weltenübersicht" "." "worlds" > "$overview_file"; echo "

Unsere Welten

" >> "$overview_file" local discovered_worlds_count=0; shopt -s nullglob local world_key_dirs=("${MINETESTMAPPER_WORLD_DATA_BASE_PATH}"/*/) shopt -u nullglob if [ ${#world_key_dirs[@]} -eq 0 ]; then log_message "WARNUNG: Keine Welt-Verzeichnisse in ${MINETESTMAPPER_WORLD_DATA_BASE_PATH}."; echo "

Keine Welten verfügbar.

" >> "$overview_file"; else for world_data_dir_loop_overview in "${world_key_dirs[@]}"; do local current_world_key=$(basename "$world_data_dir_loop_overview"); local world_mt_file="${world_data_dir_loop_overview}world.mt"; local web_conf_file="${world_data_dir_loop_overview}web.conf" if [ ! -f "$world_mt_file" ] || [ ! -f "$web_conf_file" ]; then continue; fi local world_display_name_ov; world_display_name_ov=$(get_config_value_from_file "$web_conf_file" "WORLD_DISPLAY_NAME") local world_short_desc_ov; world_short_desc_ov=$(get_config_value_from_file "$web_conf_file" "WORLD_SHORT_DESCRIPTION" "$DEFAULT_WORLD_SHORT_DESCRIPTION") local admin_name_ov; unset ADMIN_NAME; source "$web_conf_file" &>/dev/null; if [ ${#ADMIN_NAME[@]} -gt 0 ]; then admin_name_ov=$(IFS=', '; echo "${ADMIN_NAME[*]}"); else admin_name_ov="$SITE_OWNER_NAME"; fi local current_map_png_filename_for_preview_ov; current_map_png_filename_for_preview_ov=$(get_config_value_from_file "$web_conf_file" "WEB_MAP_PNG_FILENAME" "$DEFAULT_WEB_MAP_PNG_FILENAME") if [ -z "$world_display_name_ov" ]; then local mt_world_name_from_mt_ov; mt_world_name_from_mt_ov=$(grep -E "^\s*world_name\s*=" "$world_mt_file" | tail -n 1 | cut -d'=' -f2 | xargs) if [ -n "$mt_world_name_from_mt_ov" ]; then world_display_name_ov="$mt_world_name_from_mt_ov"; else world_display_name_ov="${DEFAULT_SERVER_DISPLAY_NAME_PREFIX}${current_world_key}"; if [[ "$world_display_name_ov" == "${DEFAULT_SERVER_DISPLAY_NAME_PREFIX}"* && "$DEFAULT_SERVER_DISPLAY_NAME_PREFIX" == "n/a" ]]; then world_display_name_ov="Welt ${current_world_key}"; fi; fi fi local detail_page_filename="world_${current_world_key}.html" local preview_img_rel_path="${WEB_MAPS_BASE_SUBDIR}/${current_world_key}/${current_map_png_filename_for_preview_ov}" local preview_img_abs_path="${WEB_ROOT_PATH}/${preview_img_rel_path}" local online_status_text="offline"; local online_status_class="offline" local status_file_for_overview="${WEB_ROOT_PATH}/${WEB_MAPS_BASE_SUBDIR}/${current_world_key}/online_status.txt" if [ -f "$status_file_for_overview" ]; then local status_line_overview; status_line_overview=$(cat "$status_file_for_overview"); if [[ "$status_line_overview" == "online"* ]]; then online_status_text="online"; online_status_class="online"; fi; fi local preview_img_html if [ -f "$preview_img_abs_path" ]; then preview_img_html="Vorschau ${world_display_name_ov}"; else preview_img_html="Keine Vorschau für ${world_display_name_ov}"; fi discovered_worlds_count=$((discovered_worlds_count + 1)) render_template "${TEMPLATE_DIR_PATH}/worlds_overview_entry.template" >> "$overview_file" done if [ "$discovered_worlds_count" -eq 0 ]; then echo "

Keine Welten mit gültiger Konfiguration gefunden.

" >> "$overview_file"; fi fi generate_html_footer >> "$overview_file"; if [ $? -eq 0 ]; then log_message "Weltenübersicht erstellt."; else log_message "FEHLER Weltenübersicht."; fi } generate_world_detail_page() { local current_world_key="$1"; local detail_page_file="${WEB_ROOT_PATH}/world_${current_world_key}.html" local current_minetest_world_path="${MINETESTMAPPER_WORLD_DATA_BASE_PATH}${current_world_key}" local world_mt_file="${current_minetest_world_path}/world.mt"; local web_conf_file="${current_minetest_world_path}/web.conf" if [ ! -f "$world_mt_file" ] || [ ! -f "$web_conf_file" ]; then log_message "FEHLER: world.mt oder web.conf für ${current_world_key} fehlt."; return 1; fi local WORLD_DISPLAY_NAME_PAGE=$(get_config_value_from_file "$web_conf_file" "WORLD_DISPLAY_NAME") local SERVER_ADDRESS_PAGE=$(get_config_value_from_file "$web_conf_file" "SERVER_ADDRESS" "$DEFAULT_SERVER_ADDRESS") local SERVER_PORT_PAGE=$(get_config_value_from_file "$web_conf_file" "SERVER_PORT" "$DEFAULT_SERVER_PORT") local SERVER_ACCESS_INFO_PAGE=$(get_config_value_from_file "$web_conf_file" "SERVER_ACCESS_INFO" "$DEFAULT_SERVER_ACCESS_INFO") unset ADMIN_NAME ADMIN_SKIN_URL ADMIN_EMAIL ADMIN_DISCORD ADMIN_MATRIX ADMIN_STEAM ADMIN_TEAMSPEAK ADMIN_MUMBLE WORLD_LONG_DESCRIPTION WORLD_GAME_RULES source "$web_conf_file" local WORLD_LONG_DESCRIPTION_PAGE="${WORLD_LONG_DESCRIPTION:-$DEFAULT_WORLD_LONG_DESCRIPTION}" local WORLD_GAME_RULES_PAGE="${WORLD_GAME_RULES:-}" local STATUS_TEXT_FALLBACK_PAGE="$DEFAULT_SERVER_STATUS_TEXT_FALLBACK" local CURRENT_TILES_SUBDIR_NAME=$(get_config_value_from_file "$web_conf_file" "TILES_SUBDIR_NAME" "$DEFAULT_TILES_SUBDIR_NAME") local CURRENT_GDAL2TILES_ZOOM_LEVELS=$(get_config_value_from_file "$web_conf_file" "GDAL2TILES_ZOOM_LEVELS" "$DEFAULT_GDAL2TILES_ZOOM_LEVELS") local CURRENT_WEB_MAP_PNG_FILENAME=$(get_config_value_from_file "$web_conf_file" "WEB_MAP_PNG_FILENAME" "$DEFAULT_WEB_MAP_PNG_FILENAME") local CURRENT_ARCHIVE_SUBDIR_NAME=$(get_config_value_from_file "$web_conf_file" "ARCHIVE_SUBDIR_NAME" "$DEFAULT_ARCHIVE_SUBDIR_NAME") local LEAFLET_BOUNDS_SOUTH=$(get_config_value_from_file "$web_conf_file" "LEAFLET_BOUNDS_SOUTH" "$DEFAULT_LEAFLET_BOUNDS_SOUTH") local LEAFLET_BOUNDS_WEST=$(get_config_value_from_file "$web_conf_file" "LEAFLET_BOUNDS_WEST" "$DEFAULT_LEAFLET_BOUNDS_WEST") local LEAFLET_BOUNDS_NORTH=$(get_config_value_from_file "$web_conf_file" "LEAFLET_BOUNDS_NORTH" "$DEFAULT_LEAFLET_BOUNDS_NORTH") local LEAFLET_BOUNDS_EAST=$(get_config_value_from_file "$web_conf_file" "LEAFLET_BOUNDS_EAST" "$DEFAULT_LEAFLET_BOUNDS_EAST") local LEAFLET_ZOOM_AFTER_FIT=$(get_config_value_from_file "$web_conf_file" "LEAFLET_ZOOM_AFTER_FIT" "$DEFAULT_LEAFLET_ZOOM_AFTER_FIT") local MT_WORLD_NAME_FROM_MT="$current_world_key"; local MT_GAMEID="$DEFAULT_GAMEID"; local MT_ENABLE_DAMAGE="false"; local MT_CREATIVE_MODE="false" declare -A parsed_mod_packs; declare -a parsed_standalone_mods while IFS='=' read -r key value || [ -n "$key" ]; do key=$(echo "$key"|xargs); value=$(echo "$value"|xargs) case "$key" in world_name) MT_WORLD_NAME_FROM_MT="$value" ;; gameid) MT_GAMEID="$value" ;; enable_damage) MT_ENABLE_DAMAGE="$value" ;; creative_mode) MT_CREATIVE_MODE="$value" ;; load_mod_*) local mod_id="${key#load_mod_}"; mod_id=$(echo "$mod_id"|xargs) if [[ "$value" =~ ^mods/([^/]+)/.+ ]]; then local pack_n="${BASH_REMATCH[1]}"; parsed_mod_packs["$pack_n"]="${parsed_mod_packs[$pack_n]} ${mod_id}"; elif [[ "$value" =~ ^mods/([^/]+)$ ]]; then parsed_standalone_mods+=("$mod_id"); elif [ -n "$value" ]; then parsed_standalone_mods+=("$mod_id"); fi ;; esac; done < "$world_mt_file" if [ -z "$WORLD_DISPLAY_NAME_PAGE" ]; then if [ -n "$MT_WORLD_NAME_FROM_MT" ] && [ "$MT_WORLD_NAME_FROM_MT" != "$current_world_key" ]; then WORLD_DISPLAY_NAME_PAGE="$MT_WORLD_NAME_FROM_MT"; else WORLD_DISPLAY_NAME_PAGE="${DEFAULT_SERVER_DISPLAY_NAME_PREFIX}${current_world_key}"; if [[ "$WORLD_DISPLAY_NAME_PAGE" == "${DEFAULT_SERVER_DISPLAY_NAME_PREFIX}"* && "$DEFAULT_SERVER_DISPLAY_NAME_PREFIX" == "n/a" ]]; then WORLD_DISPLAY_NAME_PAGE="Welt ${current_world_key}"; fi;fi;fi local web_map_preview_rel_path="${WEB_MAPS_BASE_SUBDIR}/${current_world_key}/${CURRENT_WEB_MAP_PNG_FILENAME}" local web_tiles_rel_path="${WEB_MAPS_BASE_SUBDIR}/${current_world_key}/${CURRENT_TILES_SUBDIR_NAME}" local web_last_update_rel_path="${WEB_MAPS_BASE_SUBDIR}/${current_world_key}/last_update.txt" local web_unknown_nodes_rel_path="${WEB_MAPS_BASE_SUBDIR}/${current_world_key}/unknown_nodes.txt" local web_online_status_rel_path="${WEB_MAPS_BASE_SUBDIR}/${current_world_key}/online_status.txt" local web_players_txt_rel_path="${WEB_MAPS_BASE_SUBDIR}/${current_world_key}/players.txt" local web_weather_txt_rel_path="${WEB_MAPS_BASE_SUBDIR}/${current_world_key}/weather.txt" local archive_world_rel_to_webroot="/${WEB_MAPS_BASE_SUBDIR}/${current_world_key}/${CURRENT_ARCHIVE_SUBDIR_NAME}" local map_preview_abs_path="${WEB_ROOT_PATH}/${web_map_preview_rel_path}"; local last_update_abs_path="${WEB_ROOT_PATH}/${web_last_update_rel_path}" local unknown_nodes_abs_path="${WEB_ROOT_PATH}/${web_unknown_nodes_rel_path}"; local min_zoom="${CURRENT_GDAL2TILES_ZOOM_LEVELS%%-*}"; local max_zoom="${CURRENT_GDAL2TILES_ZOOM_LEVELS##*-}" local creative_text="Aus"; local creative_text_class="offline"; if [ "$MT_CREATIVE_MODE" = "true" ]; then creative_text="An"; creative_text_class="online"; fi local damage_text="Aus"; local damage_text_class="online"; if [ "$MT_ENABLE_DAMAGE" = "true" ]; then damage_text="An"; damage_text_class="offline"; fi local ADMIN_BOXES_HTML="" local num_admins=${#ADMIN_NAME[@]} if [ $num_admins -eq 0 ]; then ADMIN_BOXES_HTML="
Admin Skin

${SITE_OWNER_NAME}

" else for i in "${!ADMIN_NAME[@]}"; do local name="${ADMIN_NAME[$i]}"; local skin_url="${ADMIN_SKIN_URL[$i]:-$DEFAULT_PLAYER_SKIN_URL}"; local email="${ADMIN_EMAIL[$i]}"; local discord="${ADMIN_DISCORD[$i]}"; local matrix="${ADMIN_MATRIX[$i]}"; local steam="${ADMIN_STEAM[$i]}"; local teamspeak="${ADMIN_TEAMSPEAK[$i]}"; local mumble="${ADMIN_MUMBLE[$i]}" local contact_links_html="" [ -n "$email" ] && contact_links_html+="Email" [ -n "$discord" ] && contact_links_html+="Discord" [ -n "$matrix" ] && contact_links_html+="Matrix" [ -n "$steam" ] && contact_links_html+="Steam" [ -n "$teamspeak" ] && contact_links_html+="Teamspeak" [ -n "$mumble" ] && contact_links_html+="Mumble" ADMIN_BOXES_HTML+="
Admin Skin ${name}

${name}

"; if [ -n "$contact_links_html" ]; then ADMIN_BOXES_HTML+=""; fi; ADMIN_BOXES_HTML+="
" done fi local MAP_HTML=""; if [ -d "${WEB_ROOT_PATH}/${web_tiles_rel_path}" ]; then local map_sub_info_link=""; if [ -f "$unknown_nodes_abs_path" ]; then map_sub_info_link="Fehlende Map-Nodes"; else map_sub_info_link=" "; fi; MAP_HTML=$(render_template "${TEMPLATE_DIR_PATH}/world_detail_map.template"); else MAP_HTML="

Kartenkacheln nicht verfügbar.

"; [ -f "$map_preview_abs_path" ] && MAP_HTML+="

Statische Vorschau:

Vorschau ${WORLD_DISPLAY_NAME_PAGE}"; fi local ARCHIVE_HTML=""; local available_archive_dates_js_array="[]"; local -a available_archive_dates_bash=(); local archive_scan_base_path="${WEB_ROOT_PATH}/${WEB_MAPS_BASE_SUBDIR}/${current_world_key}/${CURRENT_ARCHIVE_SUBDIR_NAME}"; if [ -d "$archive_scan_base_path" ]; then shopt -s nullglob; for y_d in "${archive_scan_base_path}"/*/; do if [ -d "$y_d" ]; then local y=$(basename "$y_d"); for m_d in "${y_d}"*/; do if [ -d "$m_d" ]; then local m=$(basename "$m_d"); for d_f in "${m_d}"*.png; do if [ -f "$d_f" ]; then local d=$(basename "$d_f" .png); if [[ "$y" =~ ^[0-9]{4}$ && "$m" =~ ^[0-9]{2}$ && "$d" =~ ^[0-9]{2}$ ]]; then available_archive_dates_bash+=("${y}-${m}-${d}");fi;fi;done;fi;done;fi;done; shopt -u nullglob;fi; if [ ${#available_archive_dates_bash[@]} -gt 0 ]; then local sorted_dates_str; sorted_dates_str=$(printf '%s\n' "${available_archive_dates_bash[@]}" | sort -r); local js_dates_temp_array=(); if [ -n "$sorted_dates_str" ]; then mapfile -t js_dates_temp_array < <(echo "$sorted_dates_str"); fi; local js_array_content=""; if [ ${#js_dates_temp_array[@]} -gt 0 ]; then for date_str_loop in "${js_dates_temp_array[@]}"; do if [ -n "$date_str_loop" ]; then js_array_content+="\"${date_str_loop}\","; fi; done; js_array_content=${js_array_content%,}; fi; available_archive_dates_js_array="[${js_array_content}]"; ARCHIVE_HTML=$(render_template "${TEMPLATE_DIR_PATH}/world_detail_archive.template"); else ARCHIVE_HTML="

Keine Archivbilder für diese Welt verfügbar.

"; fi local MODS_HTML=""; if [ ${#parsed_mod_packs[@]} -gt 0 ] || [ ${#parsed_standalone_mods[@]} -gt 0 ]; then MODS_HTML+=""; else MODS_HTML="

Keine Mod-Informationen in world.mt gefunden.

"; fi generate_html_header "Welt: ${WORLD_DISPLAY_NAME_PAGE}" "" "" > "$detail_page_file" render_template "${TEMPLATE_DIR_PATH}/world_detail_page.template" >> "$detail_page_file" generate_html_footer >> "$detail_page_file" if [ $? -eq 0 ]; then log_message "Detailseite ${WORLD_DISPLAY_NAME_PAGE} erstellt."; else log_message "FEHLER Detailseite ${WORLD_DISPLAY_NAME_PAGE}."; fi } # === Hauptlogik für Webseitengenerierung === exec 200>"$LOCK_FILE" flock -n 200 || { echo "$(date '+%Y-%m-%d %H:%M:%S') - Script ${SCRIPT_BASENAME}.sh ist bereits aktiv (Lock: ${LOCK_FILE}). Beende." | tee -a "$LOG_FILE"; exit 1; } trap 'rm -f "$LOCK_FILE"; log_message "Script ${SCRIPT_BASENAME}.sh beendet."' EXIT mkdir -p "$LOG_DIR_BASE"; mkdir -p "${WEB_ROOT_PATH}" log_message "Script ${SCRIPT_BASENAME}.sh gestartet." log_message "Prüfe und erstelle Webseiten-Inhaltsverzeichnisse und Platzhalter..." mkdir -p "${WEB_CONTENT_BASE_PATH}"; mkdir -p "${WEB_CONTENT_STATIC_PATH}"; mkdir -p "${TEMPLATE_DIR_PATH}"; mkdir -p "${EXAMPLE_TEMPLATE_DIR_PATH}" DEFAULT_MINETEST_WORLD_DATA_DIR_FOR_CONF="${MINETESTMAPPER_WORLD_DATA_BASE_PATH}${DEFAULT_WORLD_NAME_KEY}" if [ -d "$DEFAULT_MINETEST_WORLD_DATA_DIR_FOR_CONF" ] && [ -f "${DEFAULT_MINETEST_WORLD_DATA_DIR_FOR_CONF}/world.mt" ]; then if [ ! -f "${DEFAULT_MINETEST_WORLD_DATA_DIR_FOR_CONF}/web.conf" ]; then log_message "Erstelle Beispiel web.conf für '${DEFAULT_WORLD_NAME_KEY}'..."; create_placeholder_web_conf "${DEFAULT_MINETEST_WORLD_DATA_DIR_FOR_CONF}/web.conf"; fi; fi create_placeholder_file "${WEB_CONTENT_STATIC_PATH}/startseite_content.html" "

Willkommen!

Inhalt hier.

" create_placeholder_file "${WEB_CONTENT_STATIC_PATH}/impressum_content.html" "

Impressum

Impressum. Betreiber: ${SITE_OWNER_NAME}, Kontakt: ${SITE_OWNER_EMAIL}

" create_placeholder_file "${WEB_CONTENT_STATIC_PATH}/downloads_content.html" "

Downloads

Infos. Offiziell: luanti.org

" create_placeholder_file "${WEB_CONTENT_STATIC_PATH}/datenschutz_content.html" "

Datenschutzerklärung

Hier deinen Datenschutztext einfügen.

" log_message "Starte Generierung der statischen Webseiten-Dateien..." # --- Asset Copying --- log_message "Kopiere Webseiten-Assets (Bilder, Icons)..." WEB_IMAGES_TARGET_DIR="${WEB_ROOT_PATH}/images" WEB_PLAYER_IMAGES_TARGET_DIR="${WEB_IMAGES_TARGET_DIR}/players" SOURCE_IMAGES_DIR="${WEB_CONTENT_BASE_PATH}/${WEB_CONTENT_IMAGES_SOURCE_SUBDIR:-images_source}" SOURCE_PLAYER_IMAGES_DIR="${SOURCE_IMAGES_DIR}/players" mkdir -p "$WEB_IMAGES_TARGET_DIR"; mkdir -p "$WEB_PLAYER_IMAGES_TARGET_DIR" if [ -d "$SOURCE_IMAGES_DIR" ]; then shopt -s nullglob; for src_file in "$SOURCE_IMAGES_DIR"/* ; do [ -f "$src_file" ] && cp -u "$src_file" "$WEB_IMAGES_TARGET_DIR/"; done; shopt -u nullglob; log_message "Allgemeine Bilder kopiert/aktualisiert."; else log_message "WARNUNG: Quellverz. allgemeine Bilder nicht gefunden: ${SOURCE_IMAGES_DIR}"; fi if [ -d "$SOURCE_PLAYER_IMAGES_DIR" ]; then shopt -s nullglob; for src_file in "$SOURCE_PLAYER_IMAGES_DIR"/*.png ; do [ -f "$src_file" ] && cp -u "$src_file" "$WEB_PLAYER_IMAGES_TARGET_DIR/"; done; shopt -u nullglob; log_message "Spieler-Skins kopiert/aktualisiert."; else log_message "WARNUNG: Quellverz. Spieler-Skins nicht gefunden: ${SOURCE_PLAYER_IMAGES_DIR}"; fi # --- Ende Asset Copying --- if [ -n "$STATIC_BANNER_FILENAME" ]; then ACTUAL_BANNER_IMG_URL_PATH="/images/${STATIC_BANNER_FILENAME}"; if [ ! -f "${WEB_ROOT_PATH}${ACTUAL_BANNER_IMG_URL_PATH}" ]; then log_message "WARNUNG: Statisches Banner '${STATIC_BANNER_FILENAME}' nicht in '${WEB_ROOT_PATH}/images/' gefunden. Fallback: ${FALLBACK_BANNER_IMG_URL}"; ACTUAL_BANNER_IMG_URL_PATH="${FALLBACK_BANNER_IMG_URL}"; else log_message "Verwende statisches Banner: ${ACTUAL_BANNER_IMG_URL_PATH}"; fi else log_message "Kein STATIC_BANNER_FILENAME, verwende Fallback: ${FALLBACK_BANNER_IMG_URL}"; ACTUAL_BANNER_IMG_URL_PATH="${FALLBACK_BANNER_IMG_URL}"; fi generate_css; generate_homepage; generate_impressum; generate_downloads_page; generate_datenschutz_page; generate_worlds_overview processed_world_count=0; shopt -s nullglob site_world_key_dirs_detail_loop=("${MINETESTMAPPER_WORLD_DATA_BASE_PATH}"/*/) shopt -u nullglob if [ ${#site_world_key_dirs_detail_loop[@]} -gt 0 ]; then for site_world_data_dir_item in "${site_world_key_dirs_detail_loop[@]}"; do site_current_world_key_item=$(basename "$site_world_data_dir_item") if [ -z "$site_current_world_key_item" ]; then log_message "WARNUNG: Leerer Welt-Schlüssel '${site_world_data_dir_item}'."; continue; fi if [ -f "${site_world_data_dir_item}world.mt" ] && [ -f "${site_world_data_dir_item}web.conf" ]; then target_web_world_dir_item="${WEB_ROOT_PATH}/${WEB_MAPS_BASE_SUBDIR}/${site_current_world_key_item}" mkdir -p "$target_web_world_dir_item" touch "${target_web_world_dir_item}/areas.txt"; touch "${target_web_world_dir_item}/players.txt"; touch "${target_web_world_dir_item}/weather.txt" log_message "Platzhalter areas.txt, players.txt, weather.txt für Welt '${site_current_world_key_item}' sichergestellt." generate_world_detail_page "$site_current_world_key_item"; processed_world_count=$((processed_world_count + 1)) else log_message "WARNUNG: Für ${site_world_data_dir_item} (Key: ${site_current_world_key_item}) fehlt world.mt oder web.conf.";fi done log_message "${processed_world_count} Welt-Detailseiten generiert/aktualisiert." else log_message "Keine Weltverzeichnisse in ${MINETESTMAPPER_WORLD_DATA_BASE_PATH} gefunden."; fi log_message "Webseiten-Generierung abgeschlossen." exit 0