bleeter/README.md
Bjoern Flessing 20076b0aee Soziales Netz im Spiel: Feed, Werbung, Markt, Kalender und Gewerbe
Jeder Spieler waehlt sich ein Handle mit @, Unternehmen und Behoerden bekommen
eigene Profile, fuer die sie Mitarbeiter freigeben.

Verwaltet wird ueber dieselbe Anmeldung wie das Webhosting: wer am IC-Computer
als Anbieter angemeldet ist, richtet Unternehmensprofile ein. Damit gibt es
genau eine Stelle, an der Verwaltungsrechte haengen - ein zweites Rechtesystem
daneben waere eine zweite Stelle, an der man jemanden zu entziehen vergisst.

Bewusst getrennt: wer fuer ein Unternehmen schreiben darf, kann sich nicht
selbst zum Verwalter machen.

Behoben gegenueber dem Ausgangsstand:

  - Die Resource startete nicht. Eine harte Abhaengigkeit zeigte auf eine
    Resource, die es nicht gibt - das verhindert den Start vollstaendig.
  - Das Schema war gegenueber dem Code stehengeblieben: eine Tabelle fehlte
    ganz, sechs Spalten fehlten. Jede Registrierung eines Handles scheiterte
    deshalb mit einem SQL-Fehler. Zwei Migrationen ziehen das nach.
  - Die Identitaet kommt jetzt von ESX statt von einem Charaktersystem, das
    hier nicht laeuft. Ohne das findet das Mailsystem die Postfaecher nicht.
  - Das Fenster hatte keinen Schliessknopf, nur ESC. Im Computerfenster ist
    diese Taste aber schon vergeben.
  - Bilder laden mit referrerpolicy="no-referrer": Bilderdienste sperren
    Hotlinks anhand der Herkunft, und die eines NUI kennen sie nicht.
  - Der Schluessel fuer den Bilder-Upload steht nicht mehr im Code, sondern in
    der server.cfg (set bleeter_imgbb_key). Er gehoert nicht in ein oeffentlich
    einsehbares Repository.

Neu: Unternehmensprofile und Mitarbeiterfreigabe, ueber Netzwerkereignisse und
Konsolenbefehle. Dazu eine Oberflaeche im IC-Computer, die dieselbe Gestaltung
benutzt - die Stildatei wird dafuer mechanisch gekapselt, statt sie nachzubauen.

Enthaelt README.md mit Einrichtung, Rechten und den Fallstricken.
2026-08-09 12:29:24 +00:00

209 lines
6.7 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.

# bleeter — soziales Netz im Spiel
Feed, Werbeanzeigen, Marktplatz, Veranstaltungskalender und Gewerbeverzeichnis.
Jeder Spieler wählt sich ein Handle mit `@`, Unternehmen und Behörden bekommen
eigene Profile, für die sie Mitarbeiter freigeben.
Zwei Oberflächen, dieselben Daten:
- **`/bleeter`** — eigenes Fenster im Tablet-Format
- **App im IC-Computer** (`pc-live`) — dieselbe Gestaltung, in ein Fenster gesetzt
---
## Installation
### 1. Ordner
```
resources/[haleoe]/bleeter/
```
### 2. Datenbank
Reihenfolge einhalten:
```bash
mysql -u BENUTZER -p DATENBANK < sql/install.sql
mysql -u BENUTZER -p DATENBANK < sql/migration_reservierte_handles.sql
mysql -u BENUTZER -p DATENBANK < sql/migration_fehlende_spalten.sql
```
| Datei | |
|---|---|
| `install.sql` | Konten, Profile, Mitglieder, Beiträge, Kommentare, Medien, Markt, Termine |
| `migration_reservierte_handles.sql` | Sperrliste für Handles **fehlte im Grundschema**, ohne sie scheitert jede Registrierung |
| `migration_fehlende_spalten.sql` | sechs Spalten, die der Code schreibt, die aber nicht angelegt wurden |
Alle wiederholt ausführbar.
### 3. server.cfg
```
ensure oxmysql
ensure ic-mail # optional, liefert die Mailadressen
ensure bleeter
```
### 4. Bilder hochladen einrichten — **wird gebraucht**
Ohne diesen Schritt lässt sich **kein Bild hochladen**. Beiträge, Profilbilder
und Marktanzeigen bleiben dann auf verlinkte Adressen angewiesen — und die
sind unzuverlässig, weil Bilderdienste das Verlinken zeitweise sperren.
Bilder gehen zu **imgbb.com**. Der Schlüssel ist kostenlos:
1. Konto anlegen auf https://imgbb.com
2. Schlüssel holen unter https://api.imgbb.com
3. In die **`server.cfg`** eintragen, **vor** dem `ensure`:
```
set bleeter_imgbb_key "DEIN_SCHLUESSEL"
ensure bleeter
```
`set` statt `setr` — so bleibt der Schlüssel auf dem Server und geht nicht an
die Clients.
> **Warum nicht in die `config.lua`?**
> Die liegt in der Versionsverwaltung. Ein Schlüssel im Code landet damit in
> jeder Kopie und in der gesamten Historie. `Config.Media.imgbbApiKey` gibt es
> weiterhin als Rückfallebene — sinnvoll für eine Testumgebung, nicht für den
> Betrieb.
Fehlt der Schlüssel, meldet der Upload `missing_imgbb_key`.
Weitere Stellschrauben in `shared/config.lua`:
```lua
Config.Media = {
provider = 'imgbb',
maxBytes = 2 * 1024 * 1024, -- 2 MB
allowedExtensions = { 'jpg', 'jpeg', 'png' },
allowExternalUrls = true, -- Verlinken zusätzlich erlauben
requireHttps = true,
}
```
### 5. App im IC-Computer (optional)
Diese Dateien gehören nach `pc-live`:
| Datei | Ziel |
|---|---|
| `client/bleeter.lua` | `pc-live/client/` |
| `nui/js/apps/bleeter.js` | `pc-live/nui/js/apps/` |
| `nui/js/apps/bleeteradmin.js` | `pc-live/nui/js/apps/` |
| `nui/css/bleeter-embedded.css` | `pc-live/nui/css/` |
Dazu in pc-live eintragen: beide Skripte in `fxmanifest.lua` und
`nui/index.html`, die Stildatei in `fxmanifest.lua` und im `<head>`, die
App-Einträge in `desktop.js` (`APP_META` und die `case`-Zweige
`bleeter_data`, `bleeter_notify`, `bleeter_uploaded`) sowie
`AppRegistry.Register` in `server/apps.lua`.
**Zur Stildatei:** `nui/css/bleeter-embedded.css` wird **erzeugt**, nicht von
Hand gepflegt. Sie ist die gekapselte Fassung von `html/style.css` — jeder
Selektor auf `.bl-root` begrenzt. Ohne diese Kapselung würden Bleeters Regeln
für `*`, `html` und `body` den gesamten Computer einfärben. Neu erzeugen:
```bash
python3 pc-live/nui/css/erzeuge-bleeter-css.py
```
Vom Wurzelelement werden dabei nur Farben, Schrift und Variablen übernommen —
**kein Layout**. Im Original ist `.bleeter-root` ein bildschirmfüllendes
Overlay; übernähme man das, läge die App über dem ganzen Computer, auch über
der Titelleiste.
---
## Die drei Ebenen
| | wer | darf |
|---|---|---|
| **Anbieter** | am Computer als `admin@liveinvader.ls` angemeldet | Unternehmensprofile einrichten, verwalten, moderieren |
| **Unternehmen** | wer im Profil `can_manage_members` hat | eigene Leute für das Profil freigeben |
| **Spieler** | jeder | eigenes Handle mit `@` wählen |
Die Anbieterrechte kommen aus der Anmeldung in **`ic-web`** — genau eine Stelle
für alle Verwaltungsrechte. Ein zweites Rechtesystem daneben wäre eine zweite
Stelle, an der man jemanden zu entziehen vergisst.
Die Tabelle `bleeter_lifeinvader_permissions` bleibt als zweiter Weg bestehen —
der Notausgang, falls `ic-web` nicht läuft.
Bewusst getrennt: Wer für ein Unternehmen **schreiben** darf, kann sich nicht
selbst zum **Verwalter** machen.
### Ohne Computer: Konsolenbefehle
| Befehl | |
|---|---|
| `bleeterprofile` | alle Unternehmensprofile auflisten |
| `bleeterprofil <handle> <art> [server-id]` | Profil anlegen; Arten: `small_business`, `company`, `authority`, `lifeinvader` |
| `bleeterfrei <handle> <server-id> [post\|edit\|manage\|weg]` | jemanden freigeben oder entfernen |
Im Spiel nur als Anbieter, in der Serverkonsole immer.
---
## Handles
Kleinbuchstaben, Ziffern, Punkt, Unterstrich, Bindestrich; 2 bis 32 Zeichen.
`bleeter_reserved_handles` verhindert, dass Spieler sich Namen wie `lspd` oder
`weazel` greifen. **Der Anbieter darf sie sehr wohl vergeben** — dafür ist er
da. Die Sperrliste gilt deshalb nur bei der Selbstregistrierung, nicht in der
Verwaltung.
---
## Voraussetzungen
| | |
|---|---|
| `oxmysql` | Datenbankzugriff |
| `ic-mail` | Mailadresse als Ausweis bei der Registrierung |
| `es_extended` | Charaktername und Identifier |
| `ic-web` | optional liefert die Anbieteranmeldung |
| `pc-live` | optional für die App im Computer |
Läuft ohne Charaktersystem: fehlt eines, wird der Lizenz-Identifier als
Charakterkennung benutzt.
---
## Web-Backend
Unter `web-backend/` liegt ein Node-Dienst, der dieselben Daten über HTTP
bereitstellt — für eine Webseite außerhalb des Spiels.
```bash
cd web-backend
npm install
cp .env.example .env # ausfüllen
node server.js
```
Die `.env` enthält Datenbankzugang, JWT-Geheimnis und API-Schlüssel und ist
deshalb von der Versionsverwaltung ausgenommen.
---
## Bekannte Fallstricke
**Bilder aus fremden Quellen bleiben leer.** Bilderdienste sperren das
Verlinken zeitweise. Alle `<img>` laden mit `referrerpolicy="no-referrer"`,
was bei referer-basierten Sperren hilft — gegen eine IP-Sperre nicht. Der
verlässliche Weg ist der Upload.
**Nicht die Adresse der Seite kopieren, sondern die des Bildes.**
`imgur.com/a/…` ist ein Album, `imgur.com/…` eine Bildseite. Die App rechnet
Bildseiten selbst um und holt die Adresse auch aus BBCode-, HTML- und
Markdown-Schnipseln heraus.
**Der Fokus gehört dem Computer.** `SetNuiFocus` gilt global für den Client.
Als App im Computer greift Bleeter deshalb nicht danach — sonst sperren sich
zwei Resources gegenseitig die Maus aus.