Files
yourpart-daemon/docs/FALUKANT_UI_WEBSOCKET.md

161 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Falukant: UI-Anpassung WebSocket & Familie / Liebschaften
Dieses Dokument beschreibt die **Nachrichten**, die der **YpDaemon** (`FalukantFamilyWorker`) über den WebSocket-Broadcast sendet, damit die **UI gezielt** reagieren kann (Refresh, Toasts, Family-Ansicht).
> **Transport:** Alle Clients erhalten denselben Broadcast. Die UI sollte Nachrichten **nach `user_id` filtern** (nur Events anzeigen/verarbeiten, die zur eingeloggten Session passen).
---
## 1. Übersicht der Events
| `event` | Pflichtfelder | Typische UI-Reaktion |
|---------|----------------|----------------------|
| `falukantUpdateFamily` | `user_id`, `reason` | Gezielter Refresh Familie/Liebe/Geld je nach `reason` |
| `falukantUpdateStatus` | `user_id` | Allgemeiner Status-/Spielstand-Refresh (wie bisher) |
| `children_update` | `user_id` | Kinderliste / FamilyView aktualisieren |
| `falukant_family_scandal_hint` | `relationship_id` | Optional: Toast, Log **kein** `user_id` (siehe unten) |
---
## 2. JSON-Payloads (exakt)
### 2.1 `falukantUpdateFamily`
```json
{
"event": "falukantUpdateFamily",
"user_id": 123,
"reason": "daily"
}
```
**`reason`** ist immer einer der folgenden **festen** Strings:
| `reason` | Bedeutung (Daemon) | Empfehlung UI |
|----------|---------------------|---------------|
| `daily` | Daily-Tick: Liebschafts-/Ehe-/Ansehens-Logik für den Tag | Family-API + ggf. Charakter/Ansehen neu laden |
| `monthly` | Monthly-Tick: Kosten, Unterversorgung, Monatsstand | **Geld** (`falukant_user.money`) + Family-State neu laden |
| `scandal` | Skandal-Ereignis (zusätzlich zu `daily` möglich) | Kurzer Hinweis / Eintrag „Skandal“; Family + Ruf |
| `lover_birth` | Uneheliches Kind angelegt | Wie `children_update`, plus Eltern-Story |
### 2.2 `falukantUpdateStatus`
```json
{
"event": "falukantUpdateStatus",
"user_id": 123
}
```
Kommt **typischerweise direkt nach** `falukantUpdateFamily` mit derselben `user_id` (gemeinsamer Refresh).
### 2.3 `children_update`
```json
{
"event": "children_update",
"user_id": 123
}
```
Tritt bei **Geburt aus Liebschaft** auf; oft zusammen mit `falukantUpdateFamily` (`reason: lover_birth`) und `falukantUpdateStatus`.
### 2.4 `falukant_family_scandal_hint`
```json
{
"event": "falukant_family_scandal_hint",
"relationship_id": 456
}
```
- **Kein** `user_id` Betroffene erkennst du nur über die **Beziehung** (Backend: `relationship.id` → Charaktere laden) oder du ignorierst das Event und verlässt dich auf `falukantUpdateFamily` mit `reason: scandal` für deine Nutzer.
---
## 3. Empfohlene Handler-Logik (Pseudo)
```text
onMessage(json):
if json.user_id != currentUserId: return // Broadcast filtern
switch json.event:
case "falukantUpdateStatus":
refreshPlayerStatus() // bestehend
return
case "children_update":
refreshChildrenAndFamilyView()
return
case "falukantUpdateFamily":
switch json.reason:
case "daily":
refreshFamilyAndRelationships()
refreshCharactersReputationIfNeeded()
break
case "monthly":
refreshMoney()
refreshFamilyAndRelationships()
break
case "scandal":
showScandalToastOptional()
refreshFamilyAndRelationships()
break
case "lover_birth":
refreshChildrenAndFamilyView()
break
return
case "falukant_family_scandal_hint":
// optional: relationship_id → Detail-Modal / Log
return
```
**Hinweis:** Am selben Tag kann ein Nutzer **`scandal`** und danach **`daily`** erhalten UI kann **deduplizieren** (z. B. nur ein voller Refresh) oder beide verarbeiten (idempotente API-Calls).
---
## 4. Welche Backend-Daten neu laden?
| Situation | Sinnvolle Endpunkte / Daten (konzeptionell) |
|-----------|---------------------------------------------|
| Jede `falukantUpdateFamily` | Family-/Relationship-API mit `relationship_state`, Ehe (`married`/`engaged`/`wooing`) |
| `reason: monthly` | **Geld** des Users, ggf. Kredit/Log |
| `reason: daily` / `scandal` | Ansehen (`character.reputation`), Sichtbarkeit/Diskretion der Liebschaften |
| `children_update` / `lover_birth` | `child_relation` inkl. `legitimacy`, `birth_context`, `public_known` |
Konkrete Routen stehen im **YourPart3**-Backend; das Frontend sollte eine zentrale Funktion `refreshFamilyContext(userId)` kapseln.
---
## 5. Sonderfälle
| Fall | Verhalten |
|------|-----------|
| Charakter ohne `user_id` (NPC) | **Keine** Socket-Events für diesen Charakter nur Spieler mit `falukant_user` erhalten `user_id`-Events. |
| Mehrere Events hintereinander | Normal; Requests sollten **idempotent** sein (mehrfaches Laden ok). |
| Nur `falukantUpdateStatus` ohne Family | Kann von **anderen** Workern kommen nicht nur Familie. |
---
## 6. Bezug zum Code (YpDaemon)
- Worker: `src/worker/falukant_family.rs`
- SQL-Konstanten: `src/worker/sql.rs` (Abschnitt Falukant Familie)
- Schema: `migrations/001_falukant_family_lovers.sql`
- Daemon-Handoff (technisch): `docs/FALUKANT_DAEMON_HANDOFF.md`
---
## 7. Checkliste UI-Integration
- [ ] WebSocket-Handler: `user_id` mit Session abgleichen
- [ ] Auf `falukantUpdateFamily` reagieren und **`reason`** auswerten
- [ ] `falukantUpdateStatus` weiter nutzen (globaler Refresh)
- [ ] `children_update` + `lover_birth`: Kinder-Ansicht
- [ ] Optional: `falukant_family_scandal_hint` mit `relationship_id`
- [ ] Optional: Deduplizierung bei `scandal` + `daily` am selben Tag
Damit kannst du die Oberfläche **gezielt** an die Daemon-Events anbinden, ohne jedes Mal den vollen Spielstand blind zu aktualisieren.