LexoNETDocs
Docs 0.6.0Anmelden
Architektur und API

Game API v1

Die Game API ist die Schnittstelle zwischen lexo_bridge auf deinem FiveM-Server und LexoNET. Die Bridge baut alle Verbindungen selbst auf. LexoNET muss deinen Spielserver nie direkt erreichen; du brauchst keine offenen Ports.

#Authentifizierung

  • Pro Spielserver legst du im Kundenbereich unter Spielanbindung einen Server-Schlüssel an. Er gehört zu deinem Workspace und wird nur einmal angezeigt.
  • Jede Anfrage sendet Authorization: Bearer <key> und läuft ausschließlich über HTTPS.
  • Der Kopf X-Lexo-Bridge: <version> meldet die Bridge-Version für Support und Statusanzeige.
  • Unbekannter Schlüssel: 401. Gesperrter Schlüssel oder Mandant: 403.
server.cfg
set lexonet_url "https://lexonet.de"
set lexonet_key "DEIN-SERVER-SCHLUESSEL"
ensure lexo_bridge

Den Schlüssel immer mit set eintragen, nie mit setr. Mit setr würde er an alle Clients verteilt.

#Ereignisse senden

POST /api/v1/game/events überträgt bis zu 50 Ereignisse je Anfrage.

JSON
{
  "events": [
    { "id": 1042, "type": "citizen.online", "ts": 1760338800, "data": { } }
  ]
}

Antwort 200:

JSON
{ "accepted": [1042] }
  • id ist je Server eindeutig und aufsteigend. LexoNET erkennt Duplikate über Server-Schlüssel und id; erneutes Senden ist unschädlich.
  • Die Bridge löscht nur IDs aus accepted aus ihrer Outbox (lexo_bridge_outbox). Fehlerhafte Einzelereignisse fehlen in accepted und werden protokolliert.
  • Unbekannte Ereignistypen nimmt LexoNET an und speichert sie. Eigene Module können so senden, ohne dass sich die API ändert.

#Ereignistypen

TypDaten
server.started{ players }
citizen.online{ identifier, firstname, lastname, dateofbirth, sex, phone, job }
citizen.offline{ identifier }
job.changed{ identifier, job, previous }
vehicle.upsert{ plate, owner, model, label }
duty.started, duty.endedDienstbeginn und Dienstende
job.staffPersonalstand eines Jobs
police.fine, police.jail, police.release, police.jail_failedEreignisse aus lexo_police

job enthält name, label, grade, grade_label und duty. identifier ist der Framework-Identifier des Charakters, bei ESX zum Beispiel char1:….

Eigene Typen sendest du mit exports.lexo_bridge:Send(type, data). Verwende ein Präfix je Modul, zum Beispiel police. oder medic..

#Befehle abholen

Die Bridge fragt alle 3 Sekunden offene Befehle ab.

GET /api/v1/game/commands

JSON
{
  "commands": [
    { "id": "c_81f2", "type": "fine", "data": { "identifier": "char1:…", "amount": 500, "reason": "Rotlicht", "job": "police" } }
  ]
}
  • Es kommen nur nicht quittierte Befehle, höchstens 50, die ältesten zuerst.
  • Ein Befehl, der 60 Sekunden nach Ausgabe nicht quittiert ist, wird erneut ausgegeben.

#Befehle quittieren

POST /api/v1/game/commands/ack

JSON
{ "results": [ { "id": "c_81f2", "ok": true, "result": null } ] }

Bei ok: false steht in result der Grund, zum Beispiel offline, insufficient_funds oder unknown_command. Das MDT zeigt den Status am Vorgang an.

#Befehlstypen

TypDatenMögliche Gründe bei Fehler
notify{ identifier, message }offline
fine{ identifier, amount, reason, job }offline, insufficient_funds, invalid_amount
jail{ identifier, units, reason }, ausgeführt von lexo_policeinvalid; bei Erfolg jailed oder queued_offline
unjail{ identifier }, ausgeführt von lexo_policeinvalid

Eigene Befehle registrierst du mit exports.lexo_bridge:OnCommand(type, handler). Der Handler darf nicht warten und gibt sofort true oder false, 'grund' zurück.

#Fahrzeuge abgleichen

POST /api/v1/game/sync/vehicles

JSON
{ "vehicles": [ { "plate": "LX 123", "owner": "char1:…", "model": 1234567 } ], "final": false }

Der Abgleich startet mit dem Konsolenbefehl lexo_syncvehicles und sendet Pakete zu 200 Fahrzeugen. Mit final: true im letzten Paket entfernt LexoNET Fahrzeuge dieses Servers, die im Lauf nicht vorkamen.

#Statuscodes und Verhalten der Bridge

CodeBedeutungVerhalten der Bridge
200OKweiter
401 / 403Schlüssel ungültig oder gesperrt60 Sekunden Pause, Meldung in der Konsole
429Rate-LimitWartezeit verdoppelt sich bis 60 Sekunden
5xx / TimeoutLexoNET gestörtEreignisse bleiben in der Outbox, Wartezeit verdoppelt sich bis 60 Sekunden

Fällt LexoNET aus, geht nichts verloren. Die Outbox wird nach der Störung in Reihenfolge abgearbeitet.

#Wer darf das?

Server-Schlüssel erzeugen und sperren dürfen berechtigte Mitglieder des Kundenteams. Die Serveradministration trägt den Schlüssel ein. Den Schlüssel nie in Screenshots, Tickets oder Repositories weitergeben.