# Leitstelle – ESX Admin Panel

Web-Panel für FiveM-Server mit ESX Legacy. Es liest die Datenbank live, zeigt alle Tabellen übersichtlich an und lässt Änderungen sicher vorbereiten, gesammelt ausführen und wieder rückgängig machen. Mit der mitgelieferten Resource `leitstelle_bridge` steuerst du außerdem Spieler direkt im laufenden Spiel.

## Funktionen

- **Verwaltung:** Übersicht mit Auffälligkeiten, Spieler-Akte mit Inventar-Editor, Fahrzeuge, Jobs & Gehälter, Items, Strafenkatalog, Lizenzen, Konten, Fahrzeughändler
- **Script-Bereiche**, die automatisch erscheinen, wenn die Tabellen existieren: EMD-Leitstelle, Einsatz-Ausrüstung, IBIS Busnetz, Drogen, Fahrzeughandel & Betriebe, Housing & Türen, Handy (Roadshop), Konten & Firmen. Alle übrigen Tabellen landen unter „Weitere Tabellen“.
- **Datenbank:** jede Tabelle ansehen, durchsuchen, sortieren, bearbeiten, Zeilen anlegen und löschen. Verknüpfte Einträge über Person, Kennzeichen, Job und Fremdschlüssel. CSV-Export.
- **Sicher ändern:** Änderungen werden vorgemerkt und in einer Transaktion ausgeführt. Protokoll mit Rückgängig-Funktion. Konflikte mit zwischenzeitlichen Änderungen aus dem Spiel werden erkannt.
- **Live** (optional): Online-Spieler, Wiederbeleben, Heilen, Einfrieren, Teleportieren, Kicken, Geld, Job und Items geben, Nachrichten und Ankündigungen
- **Rechte:** Anmeldung über die Tabelle `admin_users`, Rollen und Rechte pro Bereich. Fehlen die Tabellen, legt der Assistent sie an.
- **Suche** über alle Tabellen. Charakternamen finden auch alle zugehörigen Einträge.
- **Moderation:** Bans (zeitlich oder dauerhaft), Verwarnungen und interne Notizen pro Spieler. Bans gelten für den Rockstar-Account und werden von der Bridge beim Verbinden durchgesetzt, auch wenn das Panel gerade nicht läuft.
- **Live-Karte:** Online-Spieler und Orte aus der Datenbank (Häuser, Haltestellen, Job-Punkte, Drogenfelder, platzierte Objekte) auf einer Karte mit Zoom. Eigenes Kartenbild möglich.
- **Wirtschafts-Wächter:** misst regelmäßig alle Kontostände und Firmenkonten, zeigt den Verlauf und schlägt Alarm bei auffälligen Geldsprüngen oder zu hohem Vermögen.
- **Discord-Webhooks:** Änderungen, Rücknahmen, Live-Aktionen, Bans, Wirtschafts-Alarme und Backups automatisch in einen Discord-Kanal.
- **Tickets:** Spieler schreiben im Spiel `/report Text`. Das Team übernimmt, antwortet (Antwort erscheint im Chat) und schließt. Neue Tickets optional an Discord.
- **Spiel-Logs:** Beitritte, Verlassen, Tode mit Täter, Geldänderungen, Item-Übergaben (ox_inventory) und optional Chat. Durchsuchbar, 30 Tage aufbewahrt.
- **Team-Aktivität:** pro Panel-Zugang letzte Anmeldung, Änderungen, Live-Aktionen, Tickets, Bans, Verwarnungen und Online-Zeit im Spiel.
- **Item-Suche:** wer besitzt ein Item wie oft – in Inventaren, Kofferräumen, Handschuhfächern und Lagern. Zeigt auch Items, die nicht in der Tabelle `items` stehen.
- **Zeitachse** in der Spieler-Akte: Logs, Tickets, Moderation, Geld und Panel-Änderungen chronologisch.
- **Assistenten:** Job mit Rängen und Firmenkonto anlegen, Item anlegen, Fahrzeug vergeben, Charakter zurücksetzen oder mit allen Einträgen löschen.
- **Zeitplan:** tägliche Ankündigungen und Serverneustarts mit Countdown (Neustart benötigt txAdmin).
- **Statistik:** Spieler online im Verlauf, Spitzenzeiten nach Wochentag und Uhrzeit, Spieler und neue Spieler pro Tag.
- **Fahrzeuge live:** alle Fahrzeuge in der Welt mit Besitzer, Fahrer und Zustand; reparieren, in die Garage stellen, löschen.
- **Resources:** alle Resources mit Status starten, stoppen, neu starten, neu einlesen.
- **Aufräumen:** inaktive Charaktere, Fahrzeuge/Lizenzen/Konten ohne Besitzer, fremde Einträge der Waschanlage, leere Tabellen.
- **Fraktionsleitung:** eingeschränkter Zugang für Fraktionsleitungen – Mitarbeitende einstellen, befördern, entlassen, Gehälter bis zu einer Obergrenze, ohne Zugriff auf die übrige Datenbank.
- **Whitelist-Bewerbungen:** öffentliches Formular unter `/apply.html`, Prüfung im Panel, automatische Freischaltung über die Bridge.
- **Spieler-Portal** unter `/portal.html`: Spieler melden sich mit einem Code aus dem Spiel (`/portal`) an und sehen Charaktere, Fahrzeuge, Lizenzen, Verwarnungen, Bewerbungsstatus und ihre Tickets – und können dem Team schreiben.
- **Handy-App:** Das Panel lässt sich auf dem Handy als App installieren, mit Push-Benachrichtigungen (z. B. neue Tickets).
- **Backups:** Datenbank-Sicherung per Klick oder nach Zeitplan, als gzip-SQL-Datei zum Herunterladen, mit automatischer Aufräumung.

## Voraussetzungen

- Linux mit systemd (Debian, Ubuntu u. a.) oder Windows
- Node.js 18 oder neuer (install.sh kann Node.js 20 unter Debian/Ubuntu mitinstallieren)
- MySQL oder MariaDB mit einer ESX-Legacy-Datenbank

## Installation unter Linux

```bash
sudo mkdir -p /opt/leitstelle
sudo unzip leitstelle-esx-panel-1.1.0.zip -d /opt/
cd /opt/leitstelle
sudo ./install.sh
```

Das Skript installiert die Abhängigkeiten, richtet den Dienst `leitstelle` mit eigenem Systembenutzer ein, startet ihn und zeigt den Einrichtungs-Link an. Optionen: `--port 8080`, `--host 127.0.0.1`, `--no-service`, `--yes`. Hilfe mit `./install.sh --help`.

Danach den Link öffnen, den Connection-String aus der `server.cfg` einfügen (`set mysql_connection_string "…"`), Verbindung testen, speichern und anmelden.

Liegt das Panel auf einem entfernten Server, erreichst du die Einrichtung am einfachsten per SSH-Tunnel:

```bash
ssh -L 8080:127.0.0.1:8080 benutzer@server
# dann im eigenen Browser: http://127.0.0.1:8080/setup.html?code=…
```

Nützliche Befehle:

```bash
systemctl status leitstelle      # läuft der Dienst?
journalctl -u leitstelle -f      # Protokoll live
systemctl restart leitstelle     # neu starten
```

## Installation unter Windows

1. Node.js „LTS“ von https://nodejs.org installieren.
2. ZIP entpacken, z. B. nach `C:\leitstelle`.
3. `install.bat` ausführen, danach `start.bat`. Der Browser öffnet die Einrichtung automatisch.

Dauerhaft im Hintergrund: `npm install -g pm2`, dann `pm2 start server.js --name leitstelle` und `pm2 save`.

## Eigener Datenbank-Benutzer (empfohlen)

```sql
CREATE USER 'panel'@'localhost' IDENTIFIED BY 'ein-starkes-passwort';
GRANT SELECT, INSERT, UPDATE, DELETE ON `deine_datenbank`.* TO 'panel'@'localhost';
FLUSH PRIVILEGES;
```

Gibt es noch keine Tabelle `admin_users`, braucht der Benutzer einmalig auch `CREATE`, damit der Assistent die Admin-Tabellen anlegen kann.

## Von außen erreichbar machen

Das Panel lauscht standardmäßig nur auf `127.0.0.1`. Für den Zugriff über eine Domain einen Reverse-Proxy mit HTTPS davorsetzen. Beispiele liegen in `docs/Caddyfile.example` (Caddy, Zertifikat automatisch) und `docs/nginx.conf.example`. Das Panel niemals ohne HTTPS öffentlich erreichbar machen, denn es kann alles in deiner Datenbank ändern.

## Live-Anbindung an den FiveM-Server

1. Ordner `fivem/leitstelle_bridge` in den `resources`-Ordner des FiveM-Servers kopieren.
2. Im Panel-Ordner `npm run token` ausführen. Die ausgegebenen Zeilen in die `server.cfg` nach `ensure es_extended` eintragen und FiveM neu starten.
3. Im Panel unter **Einstellungen → FiveM-Server (Live)** ganz unten Adresse und Schlüssel eintragen, testen, speichern.

Laufen Panel und FiveM auf verschiedenen Rechnern, als Adresse die IP des FiveM-Servers nehmen und in `fivem/leitstelle_bridge/config.lua` bei `Config.AllowedIPs` die IP des Panel-Rechners eintragen. Wiederbeleben hängt vom Todes-Script ab: Event oder Funktion in `config.lua` anpassen. Details in `fivem/leitstelle_bridge/README.md`.

## Discord-Benachrichtigungen

In Discord: Kanal-Einstellungen → Integrationen → Webhooks → Neuer Webhook → URL kopieren. Im Panel unter **Einstellungen → Discord-Benachrichtigungen** einfügen, gewünschte Ereignisse anhaken, speichern und „Testnachricht senden“.

## Backups

Unter **System → Backups** per Klick sichern oder einen Zeitplan einstellen (z. B. alle 24 Stunden, 14 Stück behalten). Die Dateien liegen unter `backups/db/`. Einspielen:

```bash
gunzip -c DATEI.sql.gz | mysql -u BENUTZER -p DATENBANK
```

oder in phpMyAdmin über „Importieren“. Trigger, Views und Prozeduren sind nicht enthalten. Die Backups enthalten alle Spielerdaten. Lade sie nur über HTTPS herunter und bewahre sie geschützt auf.

## Live-Karte mit eigenem Kartenbild

Am einfachsten mit der **Kalibrierung**: Live-Karte → Kartenbild einstellen → „Kalibrieren mit zwei Punkten“. Du stellst dich im Spiel an zwei weit entfernte Stellen und klickst jeweils auf der Karte dorthin, das Panel berechnet die Grenzen.


Ohne Bild zeigt die Karte ein Raster mit ungefähren Ortsnamen. Für ein echtes Kartenbild eine GTA-V-Karte (z. B. selbst erstellt oder aus einer Quelle, deren Lizenz das erlaubt) als `public/map.jpg` ablegen und unter **Live-Karte → Kartenbild einstellen** `/map.jpg` sowie die Spielkoordinaten der Bildränder eintragen.

## Whitelist mit Bewerbungen

1. Bridge ab Version 1.3 installieren.
2. Im Panel unter **Bewerbungen → Einstellungen** Fragen und Einleitung anpassen. „Bestehende Spieler automatisch freigeschaltet“ lässt alle, die schon einen Charakter haben, weiter rein.
3. Den Link `https://dein-panel/apply.html` in Discord oder auf der Webseite teilen.
4. Whitelist aktivieren. Wer noch nicht freigeschaltet ist, sieht beim Verbinden einen 8-stelligen Code, den er im Formular angibt. Nach dem Annehmen kommt er sofort rein.

## Spieler-Portal

In der `config.lua` der Bridge `Config.PortalUrl` auf `https://dein-panel/portal.html` setzen. Spieler geben im Spiel `/portal` ein, bekommen einen 6-stelligen Code und melden sich damit im Portal an (7 Tage angemeldet). Das Portal zeigt nur die eigenen Daten.

## Handy-App und Push

Auf dem Handy das Panel öffnen und „Zum Startbildschirm hinzufügen“ bzw. „App installieren“ wählen. Unter **Einstellungen → Handy-App und Benachrichtigungen** auf dem Gerät Benachrichtigungen aktivieren und die gewünschten Ereignisse wählen. Push funktioniert nur über HTTPS; auf dem iPhone ab iOS 16.4 und nur als installierte App.

## Update

Neue Version in einen **eigenen** Ordner entpacken und von dort aus aufrufen:

```bash
sudo ./update.sh /opt/leitstelle
```

`config.json`, `.env`, `audit.jsonl` und die `config.lua` der Resource bleiben erhalten. Vorher wird ein Backup unter `/opt/leitstelle/backups/` angelegt. Unter Windows: alle Dateien außer `config.json`, `.env`, `audit.jsonl` und `node_modules` überschreiben, dann `install.bat` und `start.bat`.

## Deinstallation

```bash
sudo ./uninstall.sh            # Dienst entfernen, Dateien bleiben
sudo ./uninstall.sh --purge    # zusätzlich Ordner und Systembenutzer löschen
```

Die Datenbank wird dabei nicht verändert. Die Admin-Tabellen (`admin_users`, `admin_roles`, `admin_role_permissions`) bleiben bestehen.

## Dateien

| Datei | Inhalt |
|---|---|
| `config.json` | Datenbank-Verbindung, Sitzungsschlüssel, FiveM-Verbindung. Wird vom Assistenten geschrieben, nur für den Dienst lesbar. |
| `.env` | Port und Adresse des Panels, optional weitere Einstellungen (Vorlage: `.env.example`) |
| `audit.jsonl` | Protokoll aller Änderungen mit alten Werten. Wie ein Backup schützen. |
| `data/` | Bans, Verwarnungen, Notizen, Wirtschaftsverlauf, Alarme und Einstellungen der Erweiterungen |
| `backups/` | Backups von update.sh, Datenbank-Backups unter `backups/db/` |

## Rechte

| Recht | Bereich |
|---|---|
| `dashboard` | Übersicht |
| `players` | Spieler, Live-Seite, Live-Karte, Tickets, Item-Suche, einfache Live-Aktionen, Verwarnungen und Notizen |
| `bans` | Bannen und Entbannen (auch mit `admin` möglich) |
| `faction` | nur die eigene Fraktion verwalten (Zuordnung unter Fraktion → Fraktionsleitungen zuordnen) |
| `whitelist` | Whitelist-Bewerbungen prüfen (auch mit `admin` möglich) |
| `logs` | Spiel-Logs inklusive Chat, Zeitachse mit Logs (auch mit `admin` möglich) |
| `vehicles` | Fahrzeuge, Fahrzeughändler |
| `jobs`, `items`, `fines`, `licenses` | jeweilige Seite |
| `accounts` | Konten, Wirtschafts-Wächter |
| `settings` | Einstellungen |
| `admin` | Admin-Zugänge, Script-Bereiche, Datenbank, Suche, Protokoll, Backups, Discord, Assistenten, Zeitplan, Team-Aktivität, Änderungen ausführen, Geld/Job/Items live |

## Wichtig vor dem Ausführen von Änderungen

- Backup der Datenbank anlegen.
- Betroffene Spieler sollten offline sein, sonst überschreibt ESX die Änderung beim nächsten Speichern. Das Panel warnt, wenn ein betroffener Spieler online ist. Für Online-Spieler die Live-Aktionen nutzen.
