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

# Einführung in den Strawberry Communication Standard

> Dies sollte dir eine allgemeine Vorstellung davon geben, worum es bei dem Strawberry Communication Standard geht

# Was ist das?

Der Strawberry Communication Standard (Strawberry's Kommunikationsstandard) (*kurz stbm, **St**raw**b**erry Co**m**munication Standard*) ist ein Kommunikationstandard für unsere Projekte.
Das heißt das alle unsere Projekte, die was mit Nachrichtenübertragungen oder ähnliches zu tun haben, dieses System nutzen.

Aktuell haben wir 2 Hauptversionen des Strawberry Communication Standards.
Um das alte System vom neuen System zu unterscheiden zu können, führen wir das Strawberry Communication System ein (kurz stbm).
Dieses Kommunikationssystem bildet einen Standard für Strawberry Chat und möglicherweise für andere Projekte von Strawberry Foundations.

### Versionen des Strawberry Communication Standards

<Warning>
  Aktuell planen wir eine Umbennenung der kurzen Version vom Strawberry Communication Standard.
  Die aktuelle kurze Version ist `stbm` (***St**raw**b**erry Co**m**munication Standard*).
  Wir planen dies zu `stbc` umzubennenen um möglicherweise weniger Verwirrung zu verursachen
</Warning>

<CardGroup cols={1}>
  <Card title="Strawberry Communication Standard v1" icon="toilet-paper" iconType="duotone" color="#55d799">
    Version 1 `(stbmv1/stbcv1)` ist eine "Legacy" Version und erhält keine Updates mehr.
    Diese Version sendete pure Python-Strings über Sockets und der Client empfängt diese ohne vieles entschlüsseln der Daten.
    Die Daten werden jediglich nur entkodiert.<br /><br />

    <Accordion title="Hinweis" icon="info" iconType="duotone" color="#55d799">
      Für diese Version bieten wir keinen weiteren Support an.
      Die letzte Strawberry Chat Version (v1.8.3) mit diesem Kommunikationssystem erschien am 10. Dezember 2023.
      Dies war die letzte Legacy Version von Strawberry Chat und wird mit der Veröffentlichung von v1.10 oder v1.11 keinen weiteren Support erhalten.
    </Accordion>
  </Card>

  <Card title="Strawberry Communication Standard v2" icon="satellite-dish" iconType="duotone" color="#55d799">
    Version 2 `(stbmv2/stbcv2)` ist eine neue, verbesserte Version unseres Kommunikationssystemes.
    Diese verwendet JSON, um Nachrichten über den Benutzern zu übertragen.
    Mit unserem neuen Kommunizierungsstandard können Nutzer nun ihre eigenen Message Builder erstellen und damit selber entscheiden wie eine Nachricht angezeigt sein soll,
    unabhängig davon wie der Server eigentlich die Nachrichten gesendet hätte.<br /><br />

    <Accordion title="Strawberry Communication Standard v2.1" icon="tower-cell" iconType="duotone" color="#55d799">
      Zusätzlich gibt es noch Version 2.1 `(stbmv2.1)` für Nachrichten-Proxying, diese Version ist aber aktuell nicht verfügbar.
    </Accordion>
  </Card>

  <Card title="Strawberry Communication Standard v3" icon="right-left-large" iconType="duotone" color="#55d799">
    Version 3 `(stbcv3)` wurde mit dem Rust-rewrite von Strawberry Chat veröffentlicht.
    Diese Version implementiert das senden von JSON-Daten auf beiden Seiten (Server & Client).
    Das bedeutet, dass der Client dann auch JSON senden muss. Aufgrund von aktuellen Performanceproblemen steht dies aber noch nicht fest und könnte daher sich noch ändern.
    Durch die Implementierung von JSON für den Client stehen viele neue Möglichkeiten offen. Dadurch kann der Client spezielle Daten am Server senden und dieser verarbeitet diese.
    So könnten Commands, die Client-spezifisch sind, am Server verarbeitet werden.

    Die Veröffentlichung fand am 19. April 2024 statt. Version 3 ist nicht rückwärtskompatibel.
  </Card>
</CardGroup>

### Unterstützung

| Unterstützte Features  | stbcv1 | stbcv2 | stbcv2.1 | stbcv3 |
| ---------------------- | ------ | ------ | -------- | ------ |
| Python Strings¹        | ✅      | ✅      | ✅        | ❌      |
| pure String Transfer²  | ✅      | ❌      | ✅        | ❌      |
| Kompatiblitätsmodus    | ✅      | ✅      | ✅        | ❌      |
| JSON Server-to-Client³ | ❌      | ✅      | ✅        | ✅      |
| JSON Client-to-Server⁴ | ❌      | ❌      | ❌        | ✅      |
| Msgpack                | ❌      | ❌      | ❌        | ✅      |

<AccordionGroup>
  <Accordion title="Python Strings¹" icon="python" iconType="duotone" color="#55d799">
    Das Feature Python Strings¹ bedeutet so viel wie "Unterstützung für reine Python-Strings".
    Dies sollte in jedem Fall immer "Ja"/"✅" sein, andersfalls können keine Strings verwendet werden.

    Die Interne Bezeichnung für Python Strings lautet `ps_com` oder `feat@ps`
  </Accordion>

  <Accordion title="pure String Transfer²" icon="arrow-right-arrow-left" iconType="duotone" color="#55d799">
    Das Feature "pure String Transfer" wird für die erste Version des Strawberry Communication Standards verwendet.
    Dieses Feature verwendet reine Python Strings zum austausch von Daten und Events.

    Die Interne Bezeichnung für pure String Transfer lautet `pST_com` oder `feat@pst`
  </Accordion>

  <Accordion title="JSON Server-to-Client³" icon="satellite-dish" iconType="duotone" color="#55d799">
    Das JSON Feature Server-to-Client ist die Weiterentwicklung von pure String Transfer und bietet nun eine kompakte Datenstruktur an,
    um einfach Daten und Events am Client zu senden. So können auch "leise" Events im Hintergrund passieren

    Die Interne Bezeichnung für JSON Server-to-Client lautet `json_stc` oder `json@stc`
  </Accordion>

  <Accordion title="JSON Client-to-Server³" icon="satellite" iconType="duotone" color="#55d799">
    Das JSON Feature Client-to-Server ist die Implementierung von JSON für den Server, sodass der Server nun JSON-Daten vom Client annimmt statt pure String Transfer² Daten.
    Die zweite Version des Strawberry Communication Standards verwendet von Client zum Server weiterhin pure String Transfer,
    während die dritte Version vermutlich JSON Client-to-Server verwendet.

    Die Interne Bezeichnung für JSON Client-to-Server lautet `json_cts` oder `json@cts`
  </Accordion>
</AccordionGroup>

# Datentypen (stbcv2)

Ab stbcv2 verwenden wir neue und eigene JSON-Datentypen.
Hier ist ein kleiner überblick von unseren Datentypen

<AccordionGroup>
  <Accordion title="Nutzernachrichten (user_message)" icon="user" iconType="duotone" color="#55d799">
    Nutzernachrichten (`user_message`) sind Nachrichten die von einem Nutzer gesendet wurden.
    Der Datentyp beinhaltet wichtige Daten, wie z.B. der Nutzername, das Badge, die Rollenfarbe und am wichtigsten, die Nachricht des Nutzers.
    Die Struktur könnte sich mit stbcv3 ändern.

    ```json JSON theme={null}
    {
        "message_type": "user_message", 
        "username": "julian",
        "nickname": "Julian The Great",
        "badge": "👑",
        "role_color": "\u001b[31m\u001b[1m",
        "avatar_url": "https://example.com/some-avatar-url.png",
        "message": {
            "content": "Hello World!"
        }
    }
    ```
  </Accordion>

  <Accordion title="Systemnachrichten (system_message)" icon="gear" iconType="duotone" color="#55d799">
    Systemnachrichten (`system_message`) sind Nachrichten die vom System gesendet wurden.
    Dort handelt es sich meist um Nachrichten, dass ein neuer Nutzer beigetreten ist, allerdings können Systemnachrichten auch die eingebauten Slash-Commands sein.
    Dieser Datentyp ist ziemlich kompakt und sehr klein. Dies könnte sich aber eventuell mit stbcv3 ändern.

    ```json JSON theme={null}
    {
        "message_type": "system_message", 
        "message": {
            "content": "Hello from the system!"
        }
    }
    ```
  </Accordion>

  <Accordion title="Benachrichtigungs-Backend (stbchat_notification)" icon="bell" iconType="duotone" color="#55d799">
    Benachrichtigungs-Backend (`stbchat_notification`) sind interne Nachrichtenevents die vom System gesendet wurden.
    Diese Nachricht siehst du nicht, aber führt im Hintergrund ein Prozess aus, nämlich der, um dir eine Desktop-Benachrichtigung zu senden.
    Dieser Datentyp ist etwas komplexer. Die Struktur dieses Datentypes könnte sich mit stbcv3 ändern.

    ```json JSON theme={null}
    {
        "message_type": "stbchat_notification",
        "title": "Strawberry Chat",
        "username": "Julian",
        "avatar_url": "https://example.com/some-avatar-url.png",
        "content": "Hello, Julian!",
        "bell": true
    }
    ```
  </Accordion>

  <Accordion title="Chatdatenübertragungs-Backend (stbchat_backend)" icon="satellite" iconType="duotone" color="#55d799">
    Chatdatenübertragungs-Backend (`stbchat_backend`) sind interne Nachrichtenevents die vom System gesendet wurden.
    Diese Nachricht siehst du nicht, aber führt im Hintergrund ein Prozess aus. Dieser Prozess kann unterschiedlich sein.
    Aktuell sendet `stbchat_backend` nur den Nutzernamen an den Client zurück. Der Client kann den Nutzernamen dann für verschiedene Dinge verwenden.
    Dieser Datentyp ist aufgrund seiner Neuheit sehr klein. Mit stbcv3 oder vielleicht sogar stbcv2 erhält dieser Datentyp allerdings noch mehr Features und damit eine höhere Bedeutung.

    ```json JSON theme={null}
    {
        "message_type": "stbchat_backend", 
        "user_meta": {
            "username": "Julian"
        }
    }
    ```
  </Accordion>
</AccordionGroup>

# Was? Wieso? Wie?

Du wunderst dich vielleicht und fragst dich was das überhaupt ist? Naja, dies ist wie 2 Socket Instanzen miteinander Kommunizieren.
Dies wurde ursprünglich für Strawberry Chat entwickelt um Daten zwischen Server und Client, wie zum Beispiel Nutzername, Badge und Nachrichten zu senden,
aber wir haben uns dazu entschieden, ein kleines Tutorial zu geben wie du dieses System auch in deinem Client implementieren kannst!

<Tip>JSON-Kommunikation (JSON-Communication) ist auch ein anderer Name für unser Strawberry Communication Standard v2 (`stbmv2`). [Hier](/german/stbchat/stbm) kannst du mehr darüber erfahren</Tip>

# Die Idee

Das originale Konzept dafür wurde auf unserem Projekteboard auf GitHub [GitHub](https://github.com/orgs/Strawberry-Foundations/projects/1?pane=issue\&itemId=44311144) am 10. November 2023 gepostet.
Beachte das dies aktuell nur in Deutsch zur Verfügung steht.

# Beispielcode

<Info>Dies ist ein sehr einfaches Beispiel für JSON-Kommunikation welches in Strawberry Chat verwendet wird</Info>

<CodeGroup>
  ```json JSON theme={null}
  {
      "message_type": "user_message", // Typ der Nachricht, meist user_message
      "username": "julian", // Der Nutzername sollte komplett kleingeschrieben werden und ohne Leerzeichen
      "nickname": "Julian The Great", // Der Nickname kann jede Art von UTF-8 Zeichen sowie Leerzeichen beinhalten
      "badge": "👑", // Emoji
      "role_color": "\u001b[31m\u001b[1m", // Dieses verwendet ANSI Farben, das Beispiel hier zeigt ein Rot mit Bold
      "message": {
          "content": "Hello World!"
      }
  }
  ```

  ```python Python theme={null}
  # Receive code of the client
  def receive(sock):
      while threadFlag:
          try:
              message = sock.recv(2048).decode('utf-8')

              try: message = conv_json_data(message)
              except: message = message

              if message:
                  try:
                      try: message_type = message["message_type"]
                      except: message_type = "unknown"

                      if message_type == "user_message":
                      username    = message["username"]
                      nickname    = message["nickname"]
                      badge       = badge_handler(message["badge"])
                      role_color  = message["role_color"]
                      message     = message["message"]["content"]

                      if nickname == username:
                          fmt = f"[{current_time()}] {role_color}{username}{badge}:{CRESET} {message}"
                      else:
                          fmt = f"[{current_time()}] {role_color}{nickname} (@{username.lower()}){badge}:{CRESET} {message}"

                      print(fmt)

                  else:
                      message     = message["message"]["content"]
                      print(f"[{current_time()}] {message}")

              except Exception as e:
                  time.sleep(0.05)
                  message         = message["message"]["content"]
                  print(f"[{current_time()}] {message}")

          else: break

      except Exception as e:
          if experimental_debug_mode: print(f"{Fore.RED + BOLD}{Str[lang]['ConnectionInterrupt']}{Fore.RESET + CRESET}")
  pass
  ```
</CodeGroup>

# Unterstützte Versionen in Strawberry Chat

<Warning>
  Dies gilt nur für Strawberry Chat, kein anderes Programm
</Warning>

Siehe Tabelle

|                     | v1.8.0 - v1.8.2 ![](https://img.shields.io/badge/Legacy-green) | v1.8.3 ![](https://img.shields.io/badge/Legacy-gray) | v1.9.0 ![](https://img.shields.io/badge/Stable-success) |
| ------------------- | -------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------- |
| Standard `<=2.4.0`  | ✅                                                              | ✅                                                    | ❌                                                       |
| Standard `v2.5.0`   | ❌                                                              | ❌                                                    | ✅                                                       |
| Standard `>=v2.5.1` | ✅ (CM)                                                         | ✅ (CM)                                               | ✅ (CM)                                                  |
| Lite `<=v1.0.1`     | ✅                                                              | ✅                                                    | ❌                                                       |
| Lite `>=v1.1.0`     | ❌                                                              | ❌                                                    | ✅                                                       |
| Nano `<=v1.0.1`     | ✅                                                              | ✅                                                    | ❌                                                       |
| Nano `>=v1.1.0`     | ❌                                                              | ❌                                                    | ✅                                                       |
| Berryjuice-pico     | ✅                                                              | ✅                                                    | ❌                                                       |

<Tip>
  ### Kompatiblitätsmodus (CM)

  Seit Client v2.5.1 haben wir ein Feature hinzugefügt welches Nutzern erlaubt, sich mit alten Servern zu verbinden.
  Dies heißt Kompatiblitätsmodus. Um den Kompatiblitätsmodus zu aktivieren musst du entweder `compatibility_mode: true` zu deinem Legacy Servereintrag hinzufügen oder starte den Client mit dem `--compatibility-mode` Argument
</Tip>
