Files
dogfather-universe/workspace/reaktion-foyer.html
T
DogFatherGit 964590ecbb Teilen: der Beitrag stellt sich selbst in den Agentur-Kanal
Filipe: "ich will dass wenn ich es teile im discord der agentur, dass
ein banner und ein kompletter fertiger text fuer die creator entsteht
und nicht einfach der link kopiert wird." Den fertigen Text gibt es
seit fdadd5d5; was fehlte, war der letzte Schritt -- bisher musste er
ihn selbst einfuegen.

NEU AN DER KACHEL: ein Knopf "In den Agentur-Kanal stellen", sobald ein
Kanal eingerichtet ist. Der Browser schickt dabei KEINEN Text mit --
der Server stellt ihn aus denselben Daten noch einmal zusammen. Sonst
koennte jemand mit einem veraenderten Text unter unserem Namen posten.

EINGERICHTET WIRD IM WORKSPACE, NICHT AUF DER KOMMANDOZEILE. Die
Webhook-Adresse IST der Schluessel zum Kanal; ueber einen Befehl
eingetragen landet sie im Chatverlauf, im Bildschirmfoto und in
~/.bash_history -- am 03.09.2026 ist genau das mit einem Token
passiert. Gemessen am 08.10.2026 kann `claudian` die Datei ohnehin
nicht anlegen: /home/dogiweb/workspace-daten ist drwxr-xr-x
dogiweb:dogiweb, und `sudo -l` deckt `dogiweb` nicht ab. Der Dienst
kann es. Damit braucht der Weg keine Rechteaenderung, kein root und
keinen Neustart.

DAS GEHEIMNIS liegt in /home/dogiweb/workspace-daten/discord-webhook.txt
mit 600, wird bei JEDEM Aufruf gelesen (ein Austausch wirkt sofort) und
kommt nie wieder heraus: GET beantwortet nur "ist eingerichtet" und
"seit wann", das Protokoll nennt sie nicht, und die Teilen-Antwort
auch nicht.

DIE SCHRANKEN, jede einzeln gemessen:
  - nur discord.com/discordapp.com/ptb./canary., nur https, nur Wege
    unter /api/webhooks/ -- sonst waere das Feld ein Weg, den Server zu
    beliebigen Zielen sprechen zu lassen
  - nur die Leitung, nur die Agentur-Adresse; von crew.* aus 404 statt
    403, damit man nicht erahnen kann, was es woanders gibt
  - allowed_mentions leer: im Beitrag steht TikToks Text, und ein
    "@everyone" darin wuerde sonst den ganzen Server anpingen
  - keine flags: die Vorschau bleibt an, denn genau sie ist das Banner
  - ohne Teilen-Link keine Nachricht
  - zwoelf je Stunde und Person, gezaehlt im Protokoll (Erfolge UND
    Fehlschlaege -- sonst bremst sie den nicht, der in einer Schleife
    haengt; derselbe Fehler wie am 07.10. an der Kampagnen-Bremse)

SIEBEN NEUE KENNUNGEN, sieben Saetze in meldung.js -- verlangt hat sie
`pruef-meldungen`, nicht mein Gedaechtnis. Jeder Satz sagt auch, was
stattdessen geht: Der Beitrag liegt in jedem Fall zum Kopieren da.

ZWEI FEHLER FANDEN NUR DIE PRUEFUNGEN:
  - teilenRouter.use("/workspace/api/eintrag", angemeldet) deckte die
    neuen Kanal-Wege nicht ab. Ohne req.person ist istLeitung falsch,
    also antworteten sie JEDEM mit 403 "nicht_erlaubt", auch
    DogFather. Es ist ZU gescheitert, nicht auf -- aber die Auskunft
    schickte in die falsche Richtung.
  - Das Datum im Dateikopf kam aus UTC (pruef-struktur): zwischen 00:00
    und 02:00 stuende dort der Vortag, in einer Zeile, die spaeter
    jemand liest, um zu wissen, seit wann der Kanal gilt.

Geprueft: pruef-kampagne 190 -> 226 (Abschnitte 12c und 12d), mit einer
ehrlichen Luecke -- die Dateirechte lassen sich auf Windows nicht
messen, auf dem Server schon; die Schlusszeile sagt jetzt "IN ORDNUNG,
mit Luecke" statt "ALLES IN ORDNUNG". bild-kampagne 53 -> 83
(Kanalfeld vermessen und abgebildet, Eingabefeld 45/46 px auf beiden
Breiten). Dazu gruen: meldungen 10, struktur, css-klassen, zeichen,
deutsche-texte, alle-wege, schranke, ports, portnummern, tippziele,
lesbarkeit, agentur 67, eventkarte 190, workspace-seiten 37,
haus-trennung 107, formulare 23, fingermass.

SECHS GEGENPROBEN am Weg in den Kanal, alle sechs schlagen an:
Rechnerliste uebergangen, Erwaehnungen wieder erlaubt, Vorschau
unterdrueckt, Bremse aus, ohne Teilen-Link gesendet, Adresse in die
Antwort gelegt.

NEBENBEI, UND ES WAR MEIN EIGENER REST: pruef-kampagne-lesen war seit
698c23e2 rot, also seit heute Vormittag. Mit dem Bildleser kamen drei
Pruefdaten in den Ordner, und die Wache dort verlangt zu Recht, dass
nichts Unerklaertes liegenbleibt. Ich hatte sie VOR dem Commit
gemessen und danach nicht noch einmal -- ein Pruefstand von vorher ist
keiner. Die drei sind jetzt benannt, mit Grund, und eine Gegenwache
prueft, dass es jede noch gibt. 186 -> 187, zwei Gegenproben: eine
unbekannte Datei faellt auf, ein toter Eintrag in der Liste auch.
2026-10-08 22:00:04 +02:00

296 lines
14 KiB
HTML

<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Reaction · Team Dogi</title>
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610082159" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610082159" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610082159" />
<link rel="stylesheet" href="assets/css/start.css?v=202610082159" />
<link rel="stylesheet" href="assets/css/foyer.css?v=202610082159" />
<link rel="stylesheet" href="assets/css/module.css?v=202610082159" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610082159" />
</head>
<body class="start">
<div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" />
</svg>
<span class="zurueck-knopf__text">Zurück</span>
</button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team&nbsp;Dogi</a> · Reaction</span></p>
<div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div>
</header>
<!-- ======================================================================
DAS FOYER (08.10.2026)
Filipe: „diese kachel soll nicht mehr geschlossen sein, ABER wenn
man drauf drückt geht zuerst eine seite auf mit
reihen/kategorien. links eine reihe wo die nächsten geplanten
videos schon bereit stehen. wan und umd wie viel uhr … und das
soll geschlossen sein außer für vanvan und dogfather. in der
mitte sollen die leute dan wenn eine sendung läuft drauf drücken
können und der sendung beitreten. auch bei der vorschau schon und
dan rechts will ich die letzte reihe/kategorie, da sollen die
leute alle mir videos anraten können."
---------------------------------------------------------------------
WARUM DAS EINE EIGENE SEITE IST UND KEIN VIERTER ZUSTAND DES SAALS
Der Saal meldet jeden an, der ihn oeffnet („dabei"), baut
Verbindungen auf und haelt den Ereignisstrom offen. Das ist
richtig fuer jemanden, der zusieht -- und falsch fuer jemanden,
der nur nachsehen will, ob heute Abend etwas laeuft. Waere das
Foyer der vierte Zustand derselben Seite, zaehlte jeder Blick
als Zuschauer, und die Zahl im Regiepult saehe nach Publikum
aus, wo niemand zusieht.
Hier wird nur GELESEN. Erst der Knopf in der Mitte fuehrt in den
Saal, und ab da gilt alles, was dort gilt.
---------------------------------------------------------------------
DREI REIHEN, UND DIE MITTE IST DIE BREITESTE
Links der Plan, in der Mitte der Weg hinein, rechts die
Vorschlaege. Die Mitte bekommt mehr Platz, weil sie das Einzige
ist, weswegen die meisten hier sind -- und weil ein Knopf, der
in eine laufende Sendung fuehrt, nicht gesucht werden soll.
AM HANDY STEHT DIE MITTE OBEN. Dort ist „links" nur noch „vor
allem anderen", und das waere die falsche Reihenfolge: Wer am
Telefon nachsieht, ob es laeuft, soll es in der ersten Zeile
sehen und nicht nach zwei Bildschirmhoehen Plan.
====================================================================== -->
<main class="inhalt inhalt--breit" id="foyer">
<section class="kopf-zeile">
<div>
<p class="marke">Reaction</p>
<h1 class="titel">Zusammen schauen</h1>
<p class="unterzeile" id="kopf-satz">Wird geladen …</p>
</div>
</section>
<p class="fehler" id="fehler" role="alert" aria-live="polite" hidden></p>
<div class="foyer-reihen" id="reihen">
<!-- ============ LINKS: DER PLAN ===========================
Nur fuer DogFather und VanVan. Filipe: „und das soll
geschlossen sein außer für vanvan und dogfather."
SIE STEHT GAR NICHT ERST DA, statt leer oder gesperrt zu
sein. Ein Kasten mit Schloss darauf erzaehlt, dass es etwas
zu sehen gaebe -- und genau das soll er nicht. -->
<section class="foyer-reihe foyer-reihe--plan" id="reihe-plan" hidden>
<header class="foyer-reihe__kopf">
<h2 class="foyer-reihe__ueber">Was ansteht</h2>
<span class="foyer-reihe__nur">nur ihr zwei</span>
</header>
<p class="foyer-reihe__satz">
Die Warteschlange aus der Regie — hier nach Termin sortiert.
Was noch keinen hat, steht unten.
</p>
<ol class="plan-liste" id="plan-liste"></ol>
<p class="foyer-reihe__fuss">
Termine setzt du im Saal unter <strong>Regie → Warteschlange</strong>.
</p>
</section>
<!-- ============ MITTE: HINEIN ============================= -->
<section class="foyer-reihe foyer-reihe--saal" id="reihe-saal">
<header class="foyer-reihe__kopf">
<h2 class="foyer-reihe__ueber">Die Sendung</h2>
<span class="foyer-lampe" id="lampe" data-stand="laedt">
<span class="foyer-lampe__punkt" aria-hidden="true"></span>
<span class="foyer-lampe__wort" id="lampe-wort">…</span>
</span>
</header>
<div class="saal-karte" id="saal-karte" data-bild="nein">
<img id="saal-bild" alt="" />
<span class="saal-karte__leer" id="saal-leer">Gerade läuft nichts.</span>
</div>
<strong class="saal-titel" id="saal-titel">—</strong>
<p class="saal-satz" id="saal-satz"></p>
<!-- DER KNOPF IST EIN LINK UND KEIN BUTTON. Wer ihn mit der
mittleren Maustaste antippt, bekommt einen neuen Reiter --
genau das tut man, wenn man die Sendung nebenher laufen
lassen will. Ein `button` mit `location.href` kann das
nicht, und man merkt es erst, wenn es nicht geht. -->
<a class="saal-knopf" id="saal-knopf" href="reaktion.html" hidden>
<span class="saal-knopf__wort" id="saal-knopf-wort">Beitreten</span>
</a>
<p class="saal-zahl" id="saal-zahl" hidden></p>
</section>
<!-- ============ RECHTS: ANRATEN ===========================
Filipe: „da sollen die leute alle mir videos anraten können.
also da können die leute videos reinschicken und nur ich und
vanvan sehen sie."
JEDER DARF SCHICKEN, NIEMAND SIEHT FREMDE. Was man selbst
geschickt hat, steht darunter mit seinem Stand -- sonst
waere das Feld ein Loch, in das man etwas wirft. -->
<section class="foyer-reihe foyer-reihe--raten" id="reihe-raten">
<header class="foyer-reihe__kopf">
<h2 class="foyer-reihe__ueber">Video anraten</h2>
<span class="foyer-reihe__zahl" id="raten-zahl" hidden></span>
</header>
<p class="foyer-reihe__satz" id="raten-satz">
Schick uns ein Video, das wir zusammen schauen sollen.
Sehen tun das nur DogFather und VanVan.
</p>
<form class="raten-form" id="raten-form">
<label class="raten-feld">
<span>YouTube-Adresse</span>
<input type="text" id="raten-video" autocomplete="off"
placeholder="Adresse einfügen" />
</label>
<!-- KEIN `maxlength` HIER. Die Zahl stand sonst zweimal: hier
und als `VORSCHLAG_NOTIZ_MAX` im Server. Wer sie dort
aendert, haette hier die alte stehen gelassen, und der
Zaehler neben „Warum?“ hätte eine Grenze gezählt, die es
nicht mehr gibt. Das Feld lernt sie von der Auskunft
(`notiz_max`); bis dahin schneidet der Server ohnehin ab. -->
<label class="raten-feld">
<span>Warum? <span class="raten-rest" id="raten-rest"></span></span>
<input type="text" id="raten-notiz"
placeholder="Freiwillig — ein Satz reicht" />
</label>
<!-- `knopf` und nicht `knopf-still--haupt`: Der Hauptknopf des
Hauses steht in `gate.css`, und die lädt diese Seite.
`knopf-still--haupt` wird in `reaktion.css` gestaltet --
die gehört dem Saal und wird hier nicht geladen. Die
Klasse hätte also im Quelltext ausgesehen, als sei etwas
hervorgehoben, und auf dem Bildschirm wäre es ein
gewöhnlicher Knopf gewesen. Gefunden hat das
`pruef-css-klassen`. -->
<button type="submit" class="knopf" id="raten-los">Abschicken</button>
</form>
<ol class="raten-liste" id="raten-liste"></ol>
<p class="foyer-reihe__fuss" id="raten-fuss"></p>
</section>
</div>
<!-- ==================================================================
DAS REGIE-TOR (08.10.2026)
Filipe: „unter den [Reihen] fehlt eine kachel, die viel kraesser
und spezieller aussehen soll, wo nur dogfather oder vanvan
reinkommen. mit ihren zugangscodes fuer die seite. und das soll
die regie kachel sein. die muss wirklich ultra krass sein."
Und zur Staerke des Schlosses: „die soll jeder sehen aber nur
vanvan und dogfather sollen da rein kommen bitte."
SIE STEHT FUER ALLE DA -- anders als die linke Reihe, und zwar
auf ausdruecklichen Wunsch. Deshalb steht hier NICHTS drin, was
jemand nicht sehen soll: kein Titel, kein Stand, keine Zahl.
Eine verschlossene Tuer mit einem Schild darauf.
EIN `button` UND KEIN LINK. Der Link in der Mitte fuehrt
woandershin; dieser hier fuehrt zunaechst nirgendwohin, sondern
fragt. Ein `a href` waere ein Versprechen, das er nicht haelt --
und in einem neuen Reiter geoeffnet landete man auf einer Seite,
die sofort zurueckschickt.
================================================================== -->
<button type="button" class="regie-tor" id="regie-tor" data-darf="nein" data-offen="nein">
<span class="regie-tor__licht" aria-hidden="true"></span>
<span class="regie-tor__innen">
<span class="regie-tor__zeichen" aria-hidden="true">
<svg viewBox="0 0 24 24" class="regie-tor__glyphe">
<rect x="4.5" y="10.5" width="15" height="10" rx="2.2" />
<path d="M8 10.5V7.3a4 4 0 0 1 8 0v3.2" />
<circle cx="12" cy="15.4" r="1.5" />
</svg>
</span>
<span class="regie-tor__text">
<span class="regie-tor__ueber">Regie</span>
<strong class="regie-tor__titel" id="regie-titel">Der Platz hinter dem Pult</strong>
<span class="regie-tor__satz" id="regie-satz">…</span>
</span>
<span class="regie-tor__marke" id="regie-marke">Nur ihr zwei</span>
</span>
</button>
</main>
<!-- AUSSERHALB VON `main`, und das ist kein Schoenheitsfehler.
`body.start > main` traegt `position: relative; z-index: 1`, die
Kopfleiste steht bei 6 -- und alles INNERHALB von main wird mit
main zusammen eingeordnet. Ein `z-index: 500` darin bliebe unter
der 6 daneben, und der Vorhang laege unter der Kopfleiste.
Gemessen am 08.10.2026 am Vorraum des Saals, dort war es genau
dieser Fehler. -->
<div class="regie-vorhang" id="regie-vorhang" hidden>
<div class="regie-fenster" role="dialog" aria-modal="true"
aria-labelledby="regie-fenster-titel">
<h2 class="regie-fenster__titel" id="regie-fenster-titel">Regie aufschließen</h2>
<p class="regie-fenster__satz" id="regie-fenster-satz">
Tipp deinen Zugangscode ein — denselben, mit dem du dich hier anmeldest.
</p>
<form id="regie-form">
<label class="regie-feld">
<span>Dein Zugangscode</span>
<!-- `type=password` und nicht `text`: Wer in einer Sendung den
Bildschirm teilt, soll ihn nicht mittippen lassen.
`autocomplete="off"` dazu -- das ist kein Anmeldefeld, und
ein Browser, der hier etwas vorschlaegt, schlaegt das
Falsche vor. -->
<input type="password" id="regie-code" autocomplete="off"
inputmode="text" placeholder="CODE-…" />
</label>
<p class="regie-fenster__fehler" id="regie-fehler" role="alert" hidden></p>
<div class="regie-fenster__knoepfe">
<!-- `knopf-still` und nicht ein erfundenes `knopf-leise`: Der
leise Knopf des Hauses heisst so und steht in `gate.css`,
die diese Seite laedt. Genau diese Falle hat heute schon
einmal zugeschlagen (`knopf-still--haupt`, gestaltet in
reaktion.css, die hier gar nicht geladen wird) -- im
Quelltext sah es nach Gestaltung aus, auf dem Bildschirm
war es ein nackter Browserknopf. -->
<button type="button" class="knopf-still" id="regie-ab">Abbrechen</button>
<button type="submit" class="knopf" id="regie-los">Aufschließen</button>
</div>
</form>
<!-- WAS DIESE TUER LEISTET UND WAS NICHT, STEHT DARUNTER.
Eine Sicherung, die staerker aussieht, als sie ist, ist
schlechter als gar keine: Wer sie fuer mehr haelt, laesst
deswegen etwas anderes weg. -->
<p class="regie-fenster__kleingedruckt">
Das hält einen neugierigen Blick auf, nicht jemanden, der an deinem
offenen Rechner sitzt. Danach bleibt die Regie zwölf Stunden offen.
</p>
</div>
</div>
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
liest daraus die Leitungsrollen. -->
<script src="assets/js/bereiche.js?v=202610082159" defer></script>
<script src="assets/js/wahl.js?v=202610082159" defer></script>
<script src="assets/js/nachfrage.js?v=202610082159" defer></script>
<script src="assets/js/meldung.js?v=202610082159" defer></script>
<script src="assets/js/installieren.js?v=202610082159" defer></script>
<script src="assets/js/kopf.js?v=202610082159" defer></script>
<script src="assets/js/glocke.js?v=202610082159" defer></script>
<script src="assets/js/reaktion-foyer.js?v=202610082159" defer></script>
</body>
</html>