Initialisiere yourchat2 als eigenständigen Rust-Chatdienst und portiere die Kernfunktionen aus der Altanwendung.

Die Implementierung enthält modulare Command-/State-/DB-Strukturen, DB-basierte Authentifizierung inkl. Rechte- und Raumzugriffsprüfung sowie kompatible Chat- und Dice-Commands.

Made-with: Cursor
This commit is contained in:
Torsten Schulz (local)
2026-03-04 17:04:41 +01:00
commit 0b91b94ae1
10 changed files with 3453 additions and 0 deletions

117
README.md Normal file
View File

@@ -0,0 +1,117 @@
# 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
```bash
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_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:
```bash
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:
```json
{
"host": "127.0.0.1",
"port": 1236
}
```
Dann verbindet sich die bestehende Bridge (`chatTcpBridge.js`) direkt mit `yourchat2`.
## Systemd (optional)
Es liegt eine Beispiel-Datei `yourchat2.service` im Projekt.
Nach Anpassung des User/Paths:
```bash
sudo cp yourchat2.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now yourchat2
```