> For the complete documentation index, see [llms.txt](https://docs.timecord.dev/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.timecord.dev/docs/de/guide/script.md).

# Script

Das TimeCord-Skript erfasst die Zeit automatisch von deinem Gameserver, sodass Spieler keinen Knopf in Discord drücken müssen. Wenn ein Spieler in den Dienst geht, wird sein verknüpfter Discord-Account eingestempelt, und wenn er den Dienst verlässt, wird er ausgestempelt.

Das aktuelle Skript ist in Lua für **FiveM** geschrieben und unterstützt das **ESX**-Framework.

{% hint style="info" %}
Bist du ein guter qbcore-Scripter und möchtest uns helfen, das Skript auf qbcore zu übertragen? Melde dich auf unserem [Discord](https://discord.gg/Jsd9YnJWQw).
{% endhint %}

### So funktioniert es

Das Skript lauscht auf die ESX-Events `esx:playerLoaded` und `esx:playerDropped`. Sobald eines ausgelöst wird, liest es den ESX-**Job** des Spielers, sucht den für diesen Job konfigurierten API-Key und sendet eine HTTP-Anfrage an TimeCord, das den Rest erledigt. TimeCord ordnet den Spieler seinem Discord-Account zu und stempelt ihn ein oder aus. Kurz gesagt: In den Dienst gehen stempelt ein, den Dienst verlassen stempelt aus.

### Download

Hol dir das Skript hier: [github.com/DanielLogisch/timecord\_esx\_script](https://github.com/DanielLogisch/timecord_esx_script)

### Voraussetzungen

Du brauchst die **Node.js-Runtime** auf dem Gameserver, um die Abhängigkeiten des Skripts zu installieren.

* Windows: Lade den Installer von [nodejs.org](https://nodejs.org/en/download) herunter und führe ihn aus.
* Linux: Folge [dieser Anleitung](https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04).

### Installation

#### Windows

1. Gehe zu deinem FXServer-`resources`-Ordner und entpacke das Skript als neuen Ordner.
2. Führe `windows_setup.bat` aus, um die benötigten Abhängigkeiten automatisch zu installieren.
3. Aktiviere den Autostart, indem du dies in deine `server.cfg` einträgst:

```
ensure timecord_esx_script-master
```

#### Linux

1. Gehe zu deinem FXServer-`resources`-Ordner, erstelle einen neuen Ordner und füge die Skriptquelle dort ein.
2. Gehe in den Skriptpfad.
3. Mache das Setup-Skript ausführbar: `chmod +x linux_setup.sh`
4. Führe es aus: `./linux_setup.sh`
5. Aktualisiere deine `server.cfg`, um den Autostart zu aktivieren.

### ESX-Objekt importieren

Neuere ESX-Versionen importieren das Shared Object anders. Wenn du eine neuere Version nutzt, passe das Skript entsprechend an:

```javascript
// Alter ESX-Objekt-Import
let ESX;
emitNet('esx:getSharedObject', (obj) => { ESX = obj })

// Neuer ESX-Objekt-Import
const ESX = exports["es_extended"].getSharedObject();
```

### Konfiguration

TimeCord verknüpft einen **API-Key mit jedem Job**. Ordne in der Skript-Konfiguration Jobnamen den Keys zu:

```json
// BASIC EXAMPLE
"api": {
    "police": "2c76b58e-fa2c-4a84-b9a9-fa79cd305864",
    "ambulance": "1c76258e-fa2c-4a84-b9a9-fa79cd305841"
}
```

Der **Key** ist der exakte Jobname, wie er in deiner Datenbank steht, damit das Skript prüfen kann, ob ein Spieler diesen Job hat. Der **Wert** ist der API-Key für den Server, auf dem dein Bot läuft. Erstelle Keys im Dashboard unter **Settings -> Script**. Du kannst beliebig viele Jobs hinzufügen, und nur die hier gelisteten Jobs werden erfasst.

{% hint style="warning" %}
Stelle in den Skript-Einstellungen des Dashboards sicher, dass die **IP-Adresse deines Gameservers** konfiguriert ist, sonst werden Anfragen abgelehnt. Und gib deinen API-Key niemals weiter.
{% endhint %}

### Eigenes Dienst-Event

Wenn dein Server ein On/Off-Duty-System hat, bei dem Spieler den Dienst umschalten, ohne den Server zu verlassen, nutze das eigene Event, um sie ein- oder auszustempeln. Übergib `true` zum Einstempeln und `false` zum Ausstempeln.

```lua
-- Beachte, dass dies ein Server- / Client-Event ist.
-- Schütze das Event, damit Spieler es nicht spammen können, sonst gibt es einen API-Bann.

-- LUA CLIENT
TriggerServerEvent('timecord:dutyTrigger', playerId, true)  -- einstempeln
TriggerServerEvent('timecord:dutyTrigger', playerId, false) -- ausstempeln

-- LUA SERVER
TriggerEvent('timecord:dutyTrigger', playerId, true)  -- einstempeln
TriggerEvent('timecord:dutyTrigger', playerId, false) -- ausstempeln

-- JS CLIENT
emitNet('timecord:dutyTrigger', playerId, true)  -- einstempeln
emitNet('timecord:dutyTrigger', playerId, false) -- ausstempeln

-- JS SERVER
emit('timecord:dutyTrigger', playerId, true)  -- einstempeln
emit('timecord:dutyTrigger', playerId, false) -- ausstempeln
```

### Fehlerbehebung

* **`esx:playerDropped` wird nicht ausgelöst.** Manche Server berichten, dass dieses Event nicht richtig funktioniert, wodurch eine Sitzung offen bleiben kann. Es kann von deinem ESX-Setup oder einer anderen Ressource überschrieben werden. Als Workaround entfernst du `onNet('esx:playerDropped')` aus dem Skript und ersetzt es durch dein eigenes Event, oder du nutzt stattdessen das FiveM-Event `playerDropped`.
* **Ein Job wird nicht erfasst.** Prüfe, ob der Jobname in der Konfiguration exakt mit dem ESX-Jobnamen übereinstimmt und ob der zugehörige API-Key in deinem Dashboard gültig ist.
* **Vergessene Sitzungen.** Falls ein Ausstempeln einmal verpasst wird, schließt das automatische Ausstempeln von TimeCord Sitzungen, die zu lange offen bleiben (siehe [Statistiken & Zeit](/docs/de/guide/statistiken-and-zeit.md#automatisches-ausstempeln-vergessene-schichten)).

Brauchst du Hilfe beim Schreiben oder Erweitern eines Skripts? Öffne ein Ticket auf unserem [Discord](https://discord.gg/Jsd9YnJWQw).
