Filipe zu dieser Seite: "mach was anderes daraus oder mach es viel krass und geiler ... erstell was was mich von den socken schmeisst. es soll wirklich sogar ein wow effekt fuer die community ergeben." Dazu die eine Auflage: die Kachel bleibt. WAS SIE WAR: zwei Karten mit zwei Adressen. Sauber gebaut, richtig beschriftet -- und niemand kam ein zweites Mal wieder. Wer im Treff ist, kennt die Website. Den Rabattcode merkt man sich beim ersten Mal. DIE FRAGE, DIE WIRKLICH JEMAND HAT, IST EINE ANDERE: Laeuft er gerade? Und wenn nicht -- wie lange noch? Die Antwort kennt das Haus seit dem 20.08.: postfach.dogfather-universe.com/live-status, derselbe Dienst, von dem der oeffentliche Streamplan lebt. Im Treff gab es sie bisher nicht. Jetzt steht oben ein Puls: ein Ring, der sich ueber den Tag bis zur naechsten Sendezeit fuellt, darin der Countdown auf die Sekunde. Sendet er, wird die Karte rot, atmet im Ruhepuls und traegt den Titel des Streams plus einen Weg hin. Darunter die drei Accounts und -- wenn die Verwaltung eines eintraegt -- das besondere Event mit eigener Uhr. DREI AUSGAENGE, NICHT ZWEI. Das ist der eigentliche Unterschied zur oeffentlichen Seite: streamplan.js faengt dort jeden Fehler ab und setzt `istLive = false`. Aus "wir konnten nicht fragen" wird "er sendet nicht" -- und wer das liest, macht die Seite zu und verpasst den Stream. Der Dienst liefert `autoHealthy` sogar mit; gelesen wird es draussen nicht. Hier schon: Bei einer Stoerung steht "Konnten wir gerade nicht nachsehen", dazu der Hinweis, dass das NICHT heisst, dass kein Stream laeuft. Der Countdown laeuft dabei weiter -- er braucht kein Netz. NICHTS IST ABGESCHRIEBEN. Die drei Accounts kommen ueber /workspace/api/draussen aus derselben KANAELE-Liste, an der die Aufgabenverteilung haengt; die Adressen baut der Steckbrief. Die Sendezeit steht im Server, und pruef-draussen haelt sie gegen FIX_STUNDE in streamplan.js -- verschiebt jemand den Termin und aendert nur einen Ort, wird die Pruefung rot. Gemessen, bevor gebaut wurde: der Dienst antwortet und meldet sich gesund, CORS steht auf *, und `connect-src` der Treff-Seiten fuehrt postfach bereits. Ohne das Letzte waere der Abruf still blockiert worden und haette ausgesehen wie ein toter Dienst. Die Kachel heisst jetzt "Draussen" statt "Unsere Seiten" -- drei Dinge statt zwei Adressen. Ziel und Datei bleiben gleich. pruef-wege-nach-draussen schreibt den Namen nicht mehr ab, sondern verlangt, dass Kachel und Seitenueberschrift uebereinstimmen. Zwei Namen fuer denselben Ort waren schon einmal ein echter Fehler. Nebenbefund, dort gleich behoben: Dieselbe Pruefung verlangte, dass die Community-Kacheln restlos in Dreierreihen aufgehen -- obwohl ihr eigener Kommentar sagt, eine freie Zelle am Ende sei erlaubt. Sie war rot bei einwandfreiem Raster. Gemessen wird jetzt, was wirklich schiefgeht: eine doppelt breite Kachel, die in der letzten Spalte beginnt und die Zelle davor leer laesst. Mit Gegenprobe. pruef-draussen: 39 Pruefungen, alle vier Lagen im echten Browser -- die Stoerung wird dafuer absichtlich hergestellt. pruef-wege-nach-draussen: 67 statt 66, keine Fehler mehr. Co-Authored-By: Claude Opus 5 <[email protected]>
122 lines
5.5 KiB
JavaScript
122 lines
5.5 KiB
JavaScript
/* =====================================================================
|
|
DRAUSSEN (21.09.2026) — was die Community-Seite "Unsere Seiten"
|
|
braucht, damit sie nichts abschreiben muss.
|
|
|
|
Filipe: "mach was anderes aus dieser seite oder mach es viel krass
|
|
und geiler ... lass dir was uebelst geiles einfallen und ueberrasch
|
|
mich ... erstell was was mich von den socken schmeisst. es soll
|
|
wirklich sogar ein wow effekt fuer die community ergeben."
|
|
|
|
---------------------------------------------------------------------
|
|
WAS DIESE SEITE VORHER WAR UND WAS DARAN FEHLTE
|
|
|
|
Zwei Karten mit zwei Adressen. Sauber gebaut, richtig beschriftet --
|
|
und trotzdem beantwortete sie keine Frage, die jemand wirklich hat.
|
|
Wer im Treff ist, kennt die Website. Der Rabattcode war das Einzige,
|
|
wofuer man wiederkam, und den merkt man sich beim ersten Mal.
|
|
|
|
DIE FRAGE, DIE DIE COMMUNITY WIRKLICH HAT, IST EINE ANDERE: Laeuft
|
|
er gerade? Und wenn nicht -- wie lange noch?
|
|
|
|
Auf die Antwort gibt es bereits einen Dienst im Haus:
|
|
postfach.dogfather-universe.com/live-status, derselbe, von dem der
|
|
oeffentliche Streamplan lebt. Er wird hier NICHT nachgebaut und auch
|
|
nicht durchgereicht -- der Browser fragt ihn direkt, so wie draussen
|
|
auch. Nachgemessen, bevor darauf gebaut wurde:
|
|
|
|
- der Dienst antwortet und meldet sich selbst als gesund
|
|
("autoHealthy": true, zuletzt geprueft vor drei Minuten)
|
|
- "access-control-allow-origin: *", die Treff-Adresse darf fragen
|
|
- die Inhaltsrichtlinie der Treff-Seiten fuehrt postfach bereits
|
|
in `connect-src` -- der Abruf waere sonst still blockiert worden
|
|
und haette ausgesehen wie ein toter Dienst
|
|
|
|
---------------------------------------------------------------------
|
|
WAS HIER BLEIBT: DIE KANAELE
|
|
|
|
Die drei TikTok-Accounts stehen als KANAELE in workspace.js -- sie
|
|
sind dort die eine Liste, an der die Aufgabenverteilung haengt. Die
|
|
Community-Seite bekommt sie von dort und schreibt sie NICHT ab.
|
|
|
|
Warum das keine Kleinigkeit ist: Am selben Tag stand in dieser Liste
|
|
"@hasidog00804" statt "@hasidog0804" -- eine Null zu viel. Zwei
|
|
Pruefungen hatten denselben Tippfehler abgeschrieben und waren
|
|
deshalb gruen. Eine dritte Abschrift auf einer Seite, die
|
|
Zuschauerinnen sehen, waere ein toter Link gewesen, den niemand
|
|
meldet, weil niemand weiss, dass er falsch ist.
|
|
|
|
DIE ADRESSE WIRD EBENFALLS ABGELEITET, nicht zusammengesetzt: Der
|
|
Steckbrief weiss bereits, wie eine TikTok-Adresse aus einem Handle
|
|
entsteht (KANAELE.tiktok.adresse). Stuende das Muster hier ein
|
|
zweites Mal, gaebe es zwei Stellen, die sich bei einer Aenderung
|
|
widersprechen koennen.
|
|
|
|
---------------------------------------------------------------------
|
|
WER DAS SEHEN DARF
|
|
|
|
Jede angemeldete Person. Nicht weil es egal waere, sondern weil hier
|
|
nichts steht, was nicht ohnehin oeffentlich ist: Dieselben drei
|
|
Accounts sind von dogfather-universe.com aus verlinkt, fuer alle.
|
|
|
|
Das ist BEWUSST ANDERS als `kanaeleFuer` in workspace-bereiche.js,
|
|
wo die Community die Kanalliste ausdruecklich NICHT bekommt. Dort
|
|
geht es um die Frage "wohin soll diese Arbeit" -- eine interne
|
|
Entscheidung, und wer sie nicht treffen darf, soll auch nicht die
|
|
Auswahl sehen. Hier geht es um "wo finde ich ihn". Dieselben Daten,
|
|
zwei verschiedene Fragen; deshalb zwei Wege und nicht einer, der
|
|
beides halb macht.
|
|
===================================================================== */
|
|
|
|
import express from "express";
|
|
import { sitzungLesen, KANAELE } from "./workspace.js";
|
|
import { KANAELE as KANAL_ARTEN } from "./workspace-steckbrief.js";
|
|
|
|
/* DIE FESTE SENDEZEIT.
|
|
|
|
Sie steht auch in assets/js/streamplan.js der oeffentlichen Seite
|
|
(`FIX_STUNDE`). Zwei Zahlen, die dasselbe bedeuten, laufen
|
|
irgendwann auseinander -- und es faellt niemandem auf, weil beide
|
|
fuer sich plausibel aussehen. Deshalb haelt pruef-draussen die
|
|
beiden Orte gegeneinander; verschiebt jemand den Termin und aendert
|
|
nur einen, wird die Pruefung rot und sagt, welche Datei fehlt.
|
|
|
|
WARUM SIE NICHT IN DER VERWALTUNG STEHT: Sie hat sich seit dem
|
|
20.08.2026 nicht geaendert. Eine Oberflaeche fuer eine Zahl, die man
|
|
einmal im Jahr anfasst, ist mehr Pflege als Nutzen -- und ein Feld,
|
|
das niemand benutzt, steht irgendwann falsch. Sobald sich der
|
|
Termin oefter bewegt, gehoert er dorthin.
|
|
|
|
Fuer eine ABWEICHUNG ist sie ohnehin nicht zustaendig: Sendet er
|
|
einmal frueher, sagt das der Live-Status, und der kommt vom Dienst,
|
|
nicht von dieser Zahl. */
|
|
export const SENDEZEIT_STUNDE = 20;
|
|
|
|
export const draussenRouter = express.Router();
|
|
|
|
draussenRouter.get("/workspace/api/draussen", (req, res) => {
|
|
const person = sitzungLesen(req);
|
|
if (!person) return res.status(401).json({ fehler: "nicht_angemeldet" });
|
|
|
|
try {
|
|
const kanaele = KANAELE.map((k) => {
|
|
const ohneAt = k.handle.replace(/^@/, "");
|
|
return {
|
|
wert: k.wert,
|
|
name: k.name,
|
|
handle: k.handle,
|
|
adresse: KANAL_ARTEN.tiktok.adresse(ohneAt),
|
|
satz: k.fuerDraussen || k.text,
|
|
};
|
|
});
|
|
|
|
/* KEIN ZWISCHENSPEICHER MIT LAUFZEIT. Die Liste aendert sich nur,
|
|
wenn jemand den Quelltext aendert -- dann startet der Dienst neu,
|
|
und ein Stempel waere ohnehin hinfaellig. Eine Laufzeit wuerde
|
|
hier nur eine Frage beantworten, die niemand stellt. */
|
|
res.json({ kanaele, sendeStunde: SENDEZEIT_STUNDE });
|
|
} catch (fehler) {
|
|
console.error("[workspace] Draussen:", fehler.message);
|
|
res.status(500).json({ fehler: "nicht_verfuegbar" });
|
|
}
|
|
});
|