Torsten Schulz (local) 16d71a8c1c Enhance room initialization and joining commands with detailed debug logging
Refactored the handling of room names in `handle_init_command` and `handle_join_command` to utilize new functions for extracting requested room names. Added comprehensive debug logging to track client interactions, including requested and resolved room names, and password lengths when debugging is enabled. This update improves troubleshooting capabilities and provides clearer insights into room access processes.
2026-03-27 13:42:52 +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_])
  • Reconnect-freundlich: bestehende Session wird bei erneutem init mit gleichem Namen ersetzt
  • WebSocket Keepalive via Ping/Pong zur Erkennung verwaister Verbindungen
  • 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 305 KiB
Languages
Rust 98.1%
Shell 1.9%