feat(map): Implement interactive area overlays
This major update introduces a complete system for visualizing protected areas on the OpenLayers map. It adds a new sync script to process area data and heavily modifies the frontend to support interactive, multi-layer display with custom popups. Additionally, data-sync scripts were refactored to run globally on all configured worlds, simplifying cron automation.
This commit is contained in:
parent
fa94f0e23d
commit
a225feef98
11 changed files with 568 additions and 687 deletions
|
|
@ -9,11 +9,43 @@ else
|
|||
exit 1
|
||||
fi
|
||||
|
||||
# === Logging Funktion (früh definieren für Wrapper-Logik) ===
|
||||
LOG_FILE_BASE="${LOG_DIR_BASE}/$(basename "$0" .sh)"
|
||||
log_message() {
|
||||
local key="${1:-main}"
|
||||
local msg="$2"
|
||||
local log_target="${LOG_FILE_BASE}.log"
|
||||
[ "$key" != "main" ] && log_target="${LOG_FILE_BASE}_${key}.log"
|
||||
|
||||
local message_to_log; message_to_log="$(date '+%Y-%m-%d %H:%M:%S') - [${key}] - ${msg}"
|
||||
echo "${message_to_log}" | tee -a "$log_target"
|
||||
}
|
||||
|
||||
# --- Wrapper-Logik zur Verarbeitung aller Welten, wenn kein Argument übergeben wird ---
|
||||
if [ -z "$1" ]; then
|
||||
log_message "main" "Kein spezifischer Welt-Schlüssel angegeben. Verarbeite alle Welten mit web.conf..."
|
||||
shopt -s nullglob
|
||||
for world_dir in "${MINETESTMAPPER_WORLD_DATA_BASE_PATH}"/*/; do
|
||||
if [ -f "${world_dir}web.conf" ]; then
|
||||
world_key_to_process=$(basename "$world_dir")
|
||||
log_message "main" "--- Starte Durchlauf für '${world_key_to_process}' ---"
|
||||
# Rufe das Skript für die gefundene Welt rekursiv auf
|
||||
bash "$0" "$world_key_to_process"
|
||||
fi
|
||||
done
|
||||
shopt -u nullglob
|
||||
log_message "main" "Alle Welten verarbeitet."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# #############################################################################
|
||||
# Ab hier beginnt die Logik für eine EINZELNE Welt
|
||||
# #############################################################################
|
||||
|
||||
# Prüfe Abhängigkeiten, bevor irgendetwas anderes passiert
|
||||
/opt/luweb/check_dependencies.sh || exit 1
|
||||
|
||||
# Welt-Schlüssel (Verzeichnisname) aus Argument oder Standardwert
|
||||
WORLD_KEY="${1:-$DEFAULT_WORLD_NAME_KEY}"
|
||||
WORLD_KEY=$1
|
||||
CURRENT_MINETEST_WORLD_DATA_PATH="${MINETESTMAPPER_WORLD_DATA_BASE_PATH}${WORLD_KEY}/"
|
||||
|
||||
# === Abgeleitete Variablen ===
|
||||
|
|
@ -31,44 +63,31 @@ PLAYERS_JSON_TMP_FILE_PATH="${PLAYERS_JSON_FILE_PATH}.tmp"
|
|||
# SQLite-Befehl
|
||||
SQLITE_CMD="sqlite3 -readonly"
|
||||
|
||||
# === Logging Funktion ===
|
||||
log_message() {
|
||||
local message_to_log; message_to_log="$(date '+%Y-%m-%d %H:%M:%S') - [${WORLD_KEY}] - $1"
|
||||
echo "${message_to_log}" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
# === Hauptlogik ===
|
||||
# === Hauptlogik für eine einzelne Welt ===
|
||||
exec 200>"$LOCK_FILE"
|
||||
flock -n 200 || { log_message "Script ${SCRIPT_BASENAME}.sh ist bereits aktiv (Lock: ${LOCK_FILE}). Beende."; exit 1; }
|
||||
trap 'rm -f "$LOCK_FILE"; log_message "Skript beendet."' EXIT
|
||||
flock -n 200 || { log_message "${WORLD_KEY}" "Script ${SCRIPT_BASENAME}.sh ist bereits für diese Welt aktiv (Lock: ${LOCK_FILE}). Beende."; exit 1; }
|
||||
trap 'rm -f "$LOCK_FILE"; log_message "${WORLD_KEY}" "Skript beendet."' EXIT
|
||||
log_message "${WORLD_KEY}" "Script gestartet."
|
||||
|
||||
mkdir -p "$LOG_DIR_BASE"
|
||||
log_message "Script gestartet für Welt: ${WORLD_KEY}"
|
||||
|
||||
# Prüfen, ob die Datenbanken existieren
|
||||
if [ ! -f "$PLAYERS_DB_PATH" ] || [ ! -f "$AUTH_DB_PATH" ]; then
|
||||
log_message "FEHLER: players.sqlite oder auth.sqlite nicht gefunden. Pfade prüfen:"
|
||||
log_message "-> ${PLAYERS_DB_PATH}"
|
||||
log_message "-> ${AUTH_DB_PATH}"
|
||||
log_message "${WORLD_KEY}" "FEHLER: players.sqlite oder auth.sqlite nicht gefunden. Pfade prüfen:"
|
||||
log_message "${WORLD_KEY}" "-> ${PLAYERS_DB_PATH}"
|
||||
log_message "${WORLD_KEY}" "-> ${AUTH_DB_PATH}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Beginne mit dem Schreiben der temporären JSON-Datei
|
||||
echo "{" > "$PLAYERS_JSON_TMP_FILE_PATH"
|
||||
|
||||
first_entry=true
|
||||
|
||||
# Lese alle Spieler aus der auth-Datenbank (ID, Name, Letzter Login)
|
||||
player_list_query="SELECT id, name, last_login FROM auth;"
|
||||
$SQLITE_CMD "$AUTH_DB_PATH" "$player_list_query" | while IFS='|' read -r player_id name last_login; do
|
||||
|
||||
log_message "Verarbeite Spieler: ${name} (ID: ${player_id})"
|
||||
|
||||
log_message "${WORLD_KEY}" "Verarbeite Spieler: ${name} (ID: ${player_id})"
|
||||
player_data_query="SELECT posX, posY, posZ, hp, breath, pitch, yaw, creation_date FROM player WHERE name = '${name}';"
|
||||
player_data=$($SQLITE_CMD "$PLAYERS_DB_PATH" "$player_data_query")
|
||||
|
||||
if [ -z "$player_data" ]; then
|
||||
log_message "WARNUNG: Spieler '${name}' hat keine Positionsdaten in players.sqlite. Wird übersprungen."
|
||||
log_message "${WORLD_KEY}" "WARNUNG: Spieler '${name}' hat keine Positionsdaten in players.sqlite. Wird übersprungen."
|
||||
continue
|
||||
fi
|
||||
|
||||
|
|
@ -87,14 +106,12 @@ $SQLITE_CMD "$AUTH_DB_PATH" "$player_list_query" | while IFS='|' read -r player_
|
|||
privs_query="SELECT privilege FROM user_privileges WHERE id = ${player_id};"
|
||||
privs_string=$($SQLITE_CMD "$AUTH_DB_PATH" "$privs_query" | tr '\n' ',' | sed 's/,$//')
|
||||
|
||||
# Komma vor dem Eintrag hinzufügen, außer beim ersten
|
||||
if [ "$first_entry" = true ]; then
|
||||
first_entry=false
|
||||
else
|
||||
echo "," >> "$PLAYERS_JSON_TMP_FILE_PATH"
|
||||
fi
|
||||
|
||||
# JSON-Objekt für den Spieler erstellen und in die Datei schreiben
|
||||
printf ' "%s": {\n' "$player_id" >> "$PLAYERS_JSON_TMP_FILE_PATH"
|
||||
printf ' "name": "%s",\n' "$name" >> "$PLAYERS_JSON_TMP_FILE_PATH"
|
||||
printf ' "pitch": %d,\n' "$pitch_rounded" >> "$PLAYERS_JSON_TMP_FILE_PATH"
|
||||
|
|
@ -107,21 +124,17 @@ $SQLITE_CMD "$AUTH_DB_PATH" "$player_list_query" | while IFS='|' read -r player_
|
|||
printf ' "stamina": %d,\n' "$stamina_rounded" >> "$PLAYERS_JSON_TMP_FILE_PATH"
|
||||
printf ' "creation_date": "%s",\n' "$(echo "$creation_date" | sed 's/ /T/')Z" >> "$PLAYERS_JSON_TMP_FILE_PATH"
|
||||
printf ' "last_login": %s,\n' "$last_login" >> "$PLAYERS_JSON_TMP_FILE_PATH"
|
||||
# KORREKTUR: Kein Komma nach dem letzten Element
|
||||
printf ' "privilege": "%s"\n' "$privs_string" >> "$PLAYERS_JSON_TMP_FILE_PATH"
|
||||
printf ' }' >> "$PLAYERS_JSON_TMP_FILE_PATH"
|
||||
|
||||
done
|
||||
|
||||
# JSON-Datei abschließen
|
||||
# KORREKTUR: Die überflüssige schließende Klammer wird hier entfernt
|
||||
echo "" >> "$PLAYERS_JSON_TMP_FILE_PATH"
|
||||
echo "}" >> "$PLAYERS_JSON_TMP_FILE_PATH"
|
||||
|
||||
# Temporäre Datei an den Zielort verschieben
|
||||
mkdir -p "$PLAYERS_JSON_TARGET_DIR"
|
||||
mv "$PLAYERS_JSON_TMP_FILE_PATH" "$PLAYERS_JSON_FILE_PATH"
|
||||
|
||||
log_message "players.txt erfolgreich synchronisiert nach ${PLAYERS_JSON_FILE_PATH}"
|
||||
log_message "${WORLD_KEY}" "players.txt erfolgreich synchronisiert nach ${PLAYERS_JSON_FILE_PATH}"
|
||||
|
||||
exit 0
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue