Torsten Schulz (local) d620b8f8ae Add create room command and room management enhancements in yourchat2
Implemented the `create_room` command to allow users to create new chat rooms with customizable settings such as privacy, age restrictions, and ownership. Enhanced room management by introducing functions to mark rooms as occupied or possibly empty, and added cleanup logic for stale temporary rooms. Updated the `RoomMeta` structure to include new fields for room creation timestamps and temporary status, ensuring better room lifecycle management.
2026-03-04 22:44:00 +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%