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:
117
README.md
Normal file
117
README.md
Normal 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
|
||||
```
|
||||
Reference in New Issue
Block a user