> ## Documentation Index
> Fetch the complete documentation index at: https://simplecloud.app/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Events API

> Echtzeit-Events aus deinem Cloud-Netzwerk abonnieren

Die Events API ermöglicht das Reagieren auf Änderungen in deinem Netzwerk in Echtzeit. Zugriff über `api.event()`.

## Event-Kategorien

| Methode                          | Events                                                                    |
| -------------------------------- | ------------------------------------------------------------------------- |
| `api.event().group()`            | Gruppe erstellt, aktualisiert, gelöscht                                   |
| `api.event().server()`           | Server gestartet, gestoppt, Status geändert, aktualisiert, gelöscht       |
| `api.event().persistentServer()` | Persistenter Server erstellt, gestartet, gestoppt, aktualisiert, gelöscht |
| `api.event().blueprint()`        | Blueprint erstellt, aktualisiert, gelöscht                                |

Alle Event-Objekte stellen `getNetworkId()` und `getTimestamp()` bereit.

## Server Events

Server Events werden für laufende Instanzen ausgelöst. Ein Server kann aus einer Gruppe oder aus einem persistenten Server stammen. Nutze das enthaltene `Server`-Model, um die Quelle zu prüfen.

### Server gestartet

```java theme={null}
Subscription sub = api.event().server().onStarted(event -> {
    Server server = event.getServer();

    System.out.println("Server gestartet: " + event.getServerId());

    if (server.isFromPersistentServer()) {
        System.out.println("Persistenter Server: " + server.getPersistentServerId());
    } else {
        System.out.println("Gruppe: " + server.getGroup().getName());
    }
});
```

### Server gestoppt

```java theme={null}
api.event().server().onStopped(event -> {
    System.out.println("Server gestoppt: " + event.getServerId());

    if (event.getCrashed()) {
        System.out.println("Exit-Code: " + event.getExitCode());
        System.out.println("Grund: " + event.getReason());
    }
});
```

### Server-Status geändert

```java theme={null}
api.event().server().onStateChanged(event -> {
    System.out.println(event.getServerId() + ": " +
        event.getOldState() + " -> " + event.getNewState());
});
```

### Server aktualisiert und gelöscht

```java theme={null}
api.event().server().onUpdated(event -> {
    System.out.println("Server aktualisiert: " + event.getServerId());
});

api.event().server().onDeleted(event -> {
    System.out.println("Server gelöscht: " + event.getServerId());
});
```

## Gruppen Events

```java theme={null}
api.event().group().onCreated(event -> {
    System.out.println("Gruppe erstellt: " + event.getGroup().getName());
});

api.event().group().onUpdated(event -> {
    System.out.println("Gruppe aktualisiert: " + event.getGroup().getName());
});

api.event().group().onDeleted(event -> {
    System.out.println("Gruppe gelöscht: " + event.getName());
});
```

## Persistent Server Events

```java theme={null}
api.event().persistentServer().onCreated(event -> {
    System.out.println("Persistenter Server erstellt: " + event.getPersistentServerId());
});

api.event().persistentServer().onStarted(event -> {
    System.out.println("Persistenter Server gestartet: " + event.getPersistentServerId());
    System.out.println("Laufender Server: " + event.getServerId());
});

api.event().persistentServer().onStopped(event -> {
    System.out.println("Persistenter Server gestoppt: " + event.getPersistentServerId());
});

api.event().persistentServer().onUpdated(event -> {
    System.out.println("Persistenter Server aktualisiert: " + event.getName());
});

api.event().persistentServer().onDeleted(event -> {
    System.out.println("Persistenter Server gelöscht: " + event.getName());
});
```

## Blueprint Events

```java theme={null}
api.event().blueprint().onCreated(event -> {
    System.out.println("Blueprint erstellt: " + event.getBlueprint().getName());
});

api.event().blueprint().onUpdated(event -> {
    System.out.println("Blueprint aktualisiert: " + event.getBlueprint().getName());
});

api.event().blueprint().onDeleted(event -> {
    System.out.println("Blueprint gelöscht: " + event.getName());
});
```

## Subscriptions verwalten

Subscriptions implementieren `AutoCloseable`. Räume sie immer auf, wenn du fertig bist.

### Manuelles Aufräumen

```java theme={null}
Subscription sub = api.event().server().onStarted(event -> {
    System.out.println("Gestartet: " + event.getServer().getServerId());
});

// Später, beim Herunterfahren
sub.close();
```

### Plugin-Lebenszyklus

```java theme={null}
public class MeinPlugin extends JavaPlugin {
    private final List<Subscription> subscriptions = new ArrayList<>();
    private CloudApi api;

    @Override
    public void onEnable() {
        api = CloudApi.create();

        subscriptions.add(api.event().server().onStarted(this::handleServerStart));
        subscriptions.add(api.event().server().onStopped(this::handleServerStop));
    }

    @Override
    public void onDisable() {
        subscriptions.forEach(Subscription::close);
    }

    private void handleServerStart(ServerStartedEvent event) {
        getLogger().info("Server gestartet: " + event.getServerId());
    }

    private void handleServerStop(ServerStoppedEvent event) {
        getLogger().info("Server gestoppt: " + event.getServerId());
    }
}
```

## Event-Referenz

Felder entsprechen Java-Gettern. `serverId` wird zum Beispiel über `getServerId()` bereitgestellt.

Jedes Event enthält diese gemeinsamen Felder:

<ResponseField name="networkId" type="string">
  Netzwerk-ID, zu der das Event gehört.
</ResponseField>

<ResponseField name="timestamp" type="string">
  ISO-8601-Zeitpunkt, zu dem das Event ausgelöst wurde.
</ResponseField>

### Server Events

<AccordionGroup>
  <Accordion title="ServerStartedEvent">
    <ResponseField name="serverId" type="string">
      ID der gestarteten Serverinstanz.
    </ResponseField>

    <ResponseField name="serverGroupId" type="string">
      ID der Servergruppe, zu der dieser Server gehört.
    </ResponseField>

    <ResponseField name="server" type="Server">
      Gestartete Serverinstanz mit vollständiger Konfiguration und Laufzeitinformationen.
    </ResponseField>
  </Accordion>

  <Accordion title="ServerStoppedEvent">
    <ResponseField name="serverId" type="string">
      ID der gestoppten Serverinstanz.
    </ResponseField>

    <ResponseField name="serverGroupId" type="string">
      ID der Servergruppe, zu der dieser Server gehört.
    </ResponseField>

    <ResponseField name="server" type="Server">
      Gestoppte Serverinstanz mit vollständiger Konfiguration und Laufzeitinformationen.
    </ResponseField>

    <ResponseField name="crashed" type="boolean">
      Gibt an, ob der Server unerwartet gestoppt wurde.
    </ResponseField>

    <ResponseField name="exitCode" type="integer | null">
      Exit-Code des Prozesses oder `null`, wenn kein Exit-Code verfügbar ist.
    </ResponseField>

    <ResponseField name="reason" type="string | null">
      Stop-Grund oder `null`, wenn kein Grund verfügbar ist.
    </ResponseField>
  </Accordion>

  <Accordion title="ServerStateChangedEvent">
    <ResponseField name="serverId" type="string">
      ID des Servers, dessen Status sich geändert hat.
    </ResponseField>

    <ResponseField name="oldState" type="ServerState">
      Vorheriger Serverstatus.
    </ResponseField>

    <ResponseField name="newState" type="ServerState">
      Neuer Serverstatus.
    </ResponseField>

    <ResponseField name="server" type="Server">
      Aktuelle Serverinstanz mit vollständiger Konfiguration und Laufzeitinformationen.
    </ResponseField>
  </Accordion>

  <Accordion title="ServerUpdatedEvent">
    <ResponseField name="serverId" type="string">
      ID der aktualisierten Serverinstanz.
    </ResponseField>

    <ResponseField name="serverGroupId" type="string">
      ID der Servergruppe, zu der dieser Server gehört.
    </ResponseField>

    <ResponseField name="server" type="Server">
      Aktualisierte Serverinstanz mit vollständiger Konfiguration und Laufzeitinformationen.
    </ResponseField>
  </Accordion>

  <Accordion title="ServerDeletedEvent">
    <ResponseField name="serverId" type="string">
      ID der gelöschten Serverinstanz.
    </ResponseField>

    <ResponseField name="serverGroupId" type="string">
      ID der Servergruppe, zu der dieser Server gehörte.
    </ResponseField>

    <ResponseField name="server" type="Server">
      Gelöschte Serverinstanz mit den zuletzt verfügbaren Konfigurations- und Laufzeitinformationen.
    </ResponseField>
  </Accordion>
</AccordionGroup>

### Gruppen Events

<AccordionGroup>
  <Accordion title="GroupCreatedEvent">
    <ResponseField name="serverGroupId" type="string">
      ID der erstellten Servergruppe.
    </ResponseField>

    <ResponseField name="group" type="Group">
      Erstelltes Gruppenmodell.
    </ResponseField>
  </Accordion>

  <Accordion title="GroupUpdatedEvent">
    <ResponseField name="serverGroupId" type="string">
      ID der aktualisierten Servergruppe.
    </ResponseField>

    <ResponseField name="group" type="Group">
      Aktualisiertes Gruppenmodell.
    </ResponseField>
  </Accordion>

  <Accordion title="GroupDeletedEvent">
    <ResponseField name="serverGroupId" type="string">
      ID der gelöschten Servergruppe.
    </ResponseField>

    <ResponseField name="name" type="string | null">
      Name der gelöschten Gruppe oder `null`, wenn der Name nicht mehr verfügbar ist.
    </ResponseField>
  </Accordion>
</AccordionGroup>

### Persistent Server Events

<AccordionGroup>
  <Accordion title="PersistentServerCreatedEvent">
    <ResponseField name="persistentServerId" type="string">
      ID des erstellten persistenten Servers.
    </ResponseField>

    <ResponseField name="name" type="string | null">
      Name des erstellten persistenten Servers oder `null`, wenn kein Name verfügbar ist.
    </ResponseField>
  </Accordion>

  <Accordion title="PersistentServerStartedEvent">
    <ResponseField name="persistentServerId" type="string">
      ID des gestarteten persistenten Servers.
    </ResponseField>

    <ResponseField name="serverId" type="string | null">
      ID der zugehörigen laufenden Serverinstanz oder `null`, wenn sie nicht verfügbar ist.
    </ResponseField>
  </Accordion>

  <Accordion title="PersistentServerStoppedEvent">
    <ResponseField name="persistentServerId" type="string">
      ID des gestoppten persistenten Servers.
    </ResponseField>

    <ResponseField name="serverId" type="string | null">
      ID der zugehörigen Serverinstanz oder `null`, wenn sie nicht verfügbar ist.
    </ResponseField>
  </Accordion>

  <Accordion title="PersistentServerUpdatedEvent">
    <ResponseField name="persistentServerId" type="string">
      ID des aktualisierten persistenten Servers.
    </ResponseField>

    <ResponseField name="name" type="string | null">
      Name des aktualisierten persistenten Servers oder `null`, wenn kein Name verfügbar ist.
    </ResponseField>
  </Accordion>

  <Accordion title="PersistentServerDeletedEvent">
    <ResponseField name="persistentServerId" type="string">
      ID des gelöschten persistenten Servers.
    </ResponseField>

    <ResponseField name="name" type="string | null">
      Name des gelöschten persistenten Servers oder `null`, wenn der Name nicht mehr verfügbar ist.
    </ResponseField>
  </Accordion>
</AccordionGroup>

### Blueprint Events

<AccordionGroup>
  <Accordion title="BlueprintCreatedEvent">
    <ResponseField name="blueprintId" type="string">
      ID des erstellten Blueprints.
    </ResponseField>

    <ResponseField name="blueprint" type="Blueprint">
      Erstelltes Blueprint-Modell.
    </ResponseField>
  </Accordion>

  <Accordion title="BlueprintUpdatedEvent">
    <ResponseField name="blueprintId" type="string">
      ID des aktualisierten Blueprints.
    </ResponseField>

    <ResponseField name="blueprint" type="Blueprint">
      Aktualisiertes Blueprint-Modell.
    </ResponseField>
  </Accordion>

  <Accordion title="BlueprintDeletedEvent">
    <ResponseField name="blueprintId" type="string">
      ID des gelöschten Blueprints.
    </ResponseField>

    <ResponseField name="name" type="string | null">
      Name des gelöschten Blueprints oder `null`, wenn der Name nicht mehr verfügbar ist.
    </ResponseField>
  </Accordion>
</AccordionGroup>
