Torsten Schulz (local) 4cf5f2f713 Refactor room creation argument parsing and enhance error handling
Introduced a new function, `parse_create_room_args_from_command`, to streamline the parsing of room creation arguments from the command structure. Improved error handling in `handle_create_room_command` to provide detailed debug logging for parsing failures and duplicate room names when debugging is enabled. Enhanced the validation of room creation parameters, including age restrictions and room type, ensuring robust input handling.
2026-03-04 23:41:32 +01:00

yourchat2

Rust-basierter Chat-Service/Daemon zur Entlastung des Backends von YourPart3. Die Kommunikation erfolgt ueber WebSocket (Frontend) und optional TCP/Unix-Socket (Bridge/Backend).

Features

  • Asynchroner WebSocket-Server fuer MultiChatDialog (Standard 0.0.0.0:1235)
  • Zusaetzlicher TCP-Server fuer chatTcpBridge.js (Standard 127.0.0.1:1236)
  • Optional zusaetzlicher Unix Domain Socket
  • In-Memory-Room-Management
  • Token-basierte Session-Absicherung pro Verbindung
  • Username-Pruefung (3-32 Zeichen, [a-zA-Z0-9_])
  • Verhindert Mehrfach-Login mit identischem Namen (loggedin)
  • Optionale Allowlist fuer User via CHAT_ALLOWED_USERS
  • Optionale DB-basierte User-Pruefung via Postgres (CHAT_DB_URL)
  • Kompatible Antworttypen fuer die bestehende chatTcpBridge.js

Start

cd ~/Programs/yourchat2
cargo run --release

Der Server lauscht danach standardmaessig auf:

  • ws://0.0.0.0:1235 (Frontend MultiChatDialog)
  • tcp://127.0.0.1:1236 (Backend-Bridge)

Konfiguration (Umgebungsvariablen)

  • CHAT_WS_ADDR (default: 0.0.0.0:1235)
  • CHAT_TCP_ADDR (default: 127.0.0.1:1236)
  • CHAT_UNIX_SOCKET (optional, z. B. /run/yourchat2/yourchat2.sock)
  • CHAT_WS_TLS (optional, true fuer direktes WSS auf CHAT_WS_ADDR)
  • CHAT_TLS_CERT_PATH (Pfad zum PEM-Zertifikat fuer WSS)
  • CHAT_TLS_KEY_PATH (Pfad zum PEM-Private-Key fuer WSS)
  • CHAT_ALLOWED_USERS (optional, CSV-Liste erlaubter Usernamen, z. B. alice,bob,carol)
  • CHAT_DB_URL (optional, PostgreSQL-Connection-String fuer Community-/Chat-User-Checks)
  • SECRET_KEY (benoetigt fuer Entschluesselung verschluesselter Birthdate-Werte aus der DB)

Beispiel:

CHAT_WS_ADDR=0.0.0.0:1235 CHAT_TCP_ADDR=127.0.0.1:1236 CHAT_UNIX_SOCKET=/tmp/yourchat2.sock cargo run --release

Protokoll (Kurzfassung)

Alle Requests/Responses sind JSON-Objekte.

  • WebSocket: ein JSON pro Frame (Text)
  • TCP/Unix-Socket: newline-delimited JSON

Eingehende Commands

  • {"type":"init","name":"alice","room":"lobby"}
  • {"type":"join","room":"sports","token":"..."}
  • {"type":"message","message":"Hi","token":"..."}
  • {"type":"scream","message":"Hallo alle","token":"..."}
  • {"type":"do","message":"winkt","token":"..."}
  • {"type":"dice","message":"1d6","token":"..."}
  • {"type":"roll","value":4,"token":"..."}
  • {"type":"color","value":"#33aaee","token":"..."}
  • {"type":"rooms","token":"..."}
  • {"type":"userlist","token":"..."}
  • {"type":"start_dice_game","rounds":3,"token":"..."}
  • {"type":"end_dice_game","token":"..."}
  • {"type":"reload_rooms","token":"..."}
  • {"type":"ping"}

Zusatz: Bei {"type":"message", ...} werden Slash-Commands erkannt:

  • /join <room> [password]
  • /color <hex>
  • /dice [expr] oder /roll [expr]
  • /start_dice_game <runden 1..10>
  • /end_dice_game
  • /reload_rooms
  • /do <aktion>
  • /scream <text>
  • /rooms und /userlist

Wenn CHAT_DB_URL gesetzt ist, prueft init den User gegen community."user". Falls fuer den Community-User noch kein Eintrag in chat."user" existiert, wird er automatisch angelegt. Farbe und Rechte werden aus der DB geladen. Fuer Alterspruefungen in Raeumen wird community.user_param.value (birthdate) per AES-256-ECB mit einem via scrypt aus SECRET_KEY abgeleiteten Schluessel entschluesselt (kompatibel zur Alt-App).

Wichtige Antworten

  • Token: {"type":1,"message":"<token>"}
  • Roomliste: {"type":3,"message":[{"name":"lobby","users":2}]}
  • Room betreten: {"type":5,"message":"room_entered","to":"lobby"}
  • Farbaenderung: {"type":5,"message":"color_changed","userName":"alice","color":"#33aaee"}
  • Normale Message: {"type":"message","userName":"alice","message":"Hi","color":"#33aaee"}
  • Scream: {"type":6,"userName":"alice","message":"Hallo alle","color":"#33aaee"}

Integration mit YourPart3

In YourPart3/backend/config/chatBridge.json sollte stehen:

{
  "host": "127.0.0.1",
  "port": 1236
}

Dann verbindet sich die bestehende Bridge (chatTcpBridge.js) direkt mit yourchat2.

Raeume per CLI pruefen

Die Raumdefinitionen kommen aus chat.room (bei gesetztem CHAT_DB_URL). Ohne DB-Verbindung gibt es einen Fallback mit lobby.

Pruefen auf Kommandozeile:

cd /home/tsschulz/Programs/yourchat2
CHAT_DB_URL='postgres://user:pass@host:5432/dbname' ./target/release/yourchat2 --list-rooms

Wenn der Service ueber systemd laeuft und die Variablen in /etc/yourchat2/yourchat2.env stehen:

sudo -u tsschulz bash -lc 'set -a; source /etc/yourchat2/yourchat2.env; set +a; /usr/local/bin/yourchat2 --list-rooms'

Systemd (optional)

Es liegt eine Produktions-nahe Unit-Datei yourchat2.service im Projekt. Zusaetzlich gibt es ein Installationsskript install-systemd.sh, das:

  • Release-Binary baut
  • Binary nach /usr/local/bin/yourchat2 installiert
  • Unit nach /etc/systemd/system/yourchat2.service installiert
  • Arbeitsverzeichnis /var/lib/yourchat2 erstellt
  • Environment-Datei unter /etc/yourchat2/yourchat2.env anlegt (falls nicht vorhanden)
  • Service aktiviert und startet
  • Standard-Config aus config/yourchat2.env.example nach /etc/yourchat2/yourchat2.env uebernimmt (falls noch nicht vorhanden)

Installation:

cd /home/tsschulz/Programs/yourchat2
sudo ./install-systemd.sh

Danach Konfiguration ueber:

  • /etc/yourchat2/yourchat2.env

Wichtige Variablen fuer produktiven Betrieb:

  • CHAT_DB_URL
  • SECRET_KEY

Standard-Config-Template im Projekt:

  • config/yourchat2.env.example
Description
No description provided
Readme 275 KiB
Languages
Rust 98.1%
Shell 1.9%