diff --git a/server/crew-adresse.js b/server/crew-adresse.js index 96b11afb..7c5dd8c0 100644 --- a/server/crew-adresse.js +++ b/server/crew-adresse.js @@ -72,8 +72,30 @@ Zugangswand sieht aus wie immer, und der Code stimmt nicht. ===================================================================== */ +import { readdirSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + export const CREW_ADRESSE = "https://crew.dogfather-universe.com"; +/* WELCHE SYMBOLGROESSEN HAT DIE CREW-APP EIGENS? + Abgeleitet aus dem Ordner, nicht aufgezaehlt: Fuer jede Datei + crew-.png, zu der es auch workspace-.png gibt, kann umgebogen + werden. Einmal beim Start gelesen -- pro Anfrage waere es ein + Dateisystemzugriff fuer eine Antwort, die sich nie aendert. */ +const CREW_SYMBOLE = (() => { + try { + const ordner = join(dirname(fileURLToPath(import.meta.url)), + "..", "assets", "img", "app-symbole"); + const da = new Set(readdirSync(ordner)); + return new Set([...da] + .map((f) => f.match(/^crew-([0-9a-z-]+)\.png$/)) + .filter(Boolean) + .map((m) => m[1]) + .filter((x) => da.has(`workspace-${x}.png`))); + } catch { return new Set(); } +})(); + /* ===================================================================== DAS TEAM VON DOGI -- WELCHE ROLLEN DAZUGEHOEREN @@ -386,6 +408,42 @@ export function crewWeiche(req, res, next) { return next(); } + /* DAS SYMBOL AUF DEM IPHONE (22.09.2026) — DIE ZWEITE HAELFTE. + =================================================================== + Der Block darueber ist seit dem 10.09. richtig, war aber nur die + halbe Miete, und seine eigene Begruendung sagt, warum: "Sonst + hiesse die App auf dem Startbildschirm eines Modis 'Creator + Workspace' und traege das Zeichen mit der Chili." + + Genau das passierte -- auf dem iPhone. Android nimmt das Symbol + aus dem Manifest (also crew-192.png, richtig). iOS Safari nimmt + es NICHT von dort, sondern aus ``. + Und die Zeile steht in jeder HTML-Datei auf workspace-180.png. + + Gemessen: crew-180.png und workspace-180.png sind verschiedene + Dateien (30 899 gegen 34 850 Byte). Ein Modi mit iPhone bekam die + Chili auf den Startbildschirm; derselbe Modi mit Android das + richtige Zeichen. Beim Blick auf den Bildschirm faellt so etwas + nie auf, weil kaum jemand beide Geraete nebeneinander hat. + + DIESELBE LOESUNG WIE BEIM MANIFEST: umbiegen statt in 37 Dateien + eine zweite Zeile zu setzen. Wer eine Seite anlegt, schreibt + weiterhin workspace-*.png -- und bekommt auf crew. trotzdem das + richtige Symbol. + + ABGELEITET, NICHT AUFGEZAEHLT: Umgebogen wird nur, wenn es die + Crew-Fassung wirklich gibt. workspace-1024.png (fuer TikTok) hat + keine, bleibt also unangetastet -- und eine kuenftige Groesse + kommt von selbst dazu, sobald jemand die Datei anlegt. */ + const symbol = req.path.match( + /^\/assets\/img\/app-symbole\/workspace-([0-9a-z-]+)\.png$/); + if (symbol && CREW_SYMBOLE.has(symbol[1])) { + req.url = req.url.replace( + `/app-symbole/workspace-${symbol[1]}.png`, + `/app-symbole/crew-${symbol[1]}.png`); + return next(); + } + /* DIE ZUGANGSWAND GEHOERT DOGI UND DEN MODIS (10.09.2026). Filipe: "alles soll auf dogfather und die modis perfektionniert diff --git a/server/pruef-crew-adresse.mjs b/server/pruef-crew-adresse.mjs index b8390069..94af9e69 100644 --- a/server/pruef-crew-adresse.mjs +++ b/server/pruef-crew-adresse.mjs @@ -354,6 +354,50 @@ ok(Array.isArray(mw.icons) && mw.icons.length > 0 ok(mc.start_url === "/workspace/start.html" && mc.scope === "/workspace/", "crew.: Bereich und Startseite stimmen"); +/* --------------------------------------------------------------------- + UND DAS SYMBOL AUF DEM IPHONE (22.09.2026) + --------------------------------------------------------------------- + Die Zeilen darueber pruefen das MANIFEST -- daraus nimmt Android sein + Symbol. iOS Safari nimmt es von dort NICHT, sondern aus + ``, und die Zeile steht in jeder HTML + auf workspace-180.png. + + Bis zum 22.09.2026 war das Manifest deshalb richtig und der + Startbildschirm eines Modis trotzdem falsch -- aber nur auf dem + iPhone. Genau die Sorte Fehler, die beim Ansehen nie auffaellt: Man + braeuchte beide Geraete nebeneinander. + + Gemessen wird der AUSGELIEFERTE INHALT, nicht der Pfad. Eine + Umleitung, die auf eine Datei zeigt, die es nicht gibt, waere sonst + gruen. */ +console.log("\n--- Das Symbol auf dem Startbildschirm ---"); +{ + const pfad = "/assets/img/app-symbole/workspace-180.png"; + const aufCrew = await hole(pfad, { host: CREW }); + const aufWs = await hole(pfad, { host: WS }); + const echtCrew = await hole("/assets/img/app-symbole/crew-180.png", { host: CREW }); + + /* DIE ZAHL GEHOERT IN DIE BEDINGUNG: Waeren beide Antworten leer, + waeren sie auch gleich -- und der Vergleich unten trivial gruen. */ + ok(aufCrew.status === 200 && aufWs.status === 200 && echtCrew.status === 200 + && aufCrew.text.length > 1000, + `alle drei Symbole werden ausgeliefert (${aufCrew.text.length} Byte)`); + ok(aufCrew.text === echtCrew.text, + "crew.: hinter apple-touch-icon steckt wirklich das Crew-Zeichen"); + /* GEGENPROBE. Ohne sie wuesste niemand, ob die Umleitung ueberhaupt + etwas tut -- waeren beide Dateien identisch, waere die Zeile + darueber auch ohne jede Umleitung gruen. */ + ok(aufCrew.text !== aufWs.text, + "workspace.: dort unveraendert das Agenturzeichen — die Umleitung greift also"); + + /* UND SIE GREIFT NUR, WO ES EINE CREW-FASSUNG GIBT. workspace-1024.png + ist das TikTok-Symbol und hat keine; wuerde es mit umgebogen, + liefe die Anfrage auf eine Datei, die es nicht gibt. */ + const tiktok = await hole("/assets/img/app-symbole/workspace-1024.png", { host: CREW }); + ok(tiktok.status === 200 && tiktok.text.length > 1000, + `und Groessen ohne Crew-Fassung bleiben unangetastet (1024: ${tiktok.status})`); +} + /* Die Symboldateien muessen es auch wirklich geben -- ein Manifest, das auf nichts zeigt, faellt sonst erst auf dem Startbildschirm auf. */ let symboleDa = 0; @@ -408,20 +452,37 @@ ok(!/Creator/i.test(wandCrew.text), "crew.: und vom Creator Workspace auch nicht "und behauptet nicht mehr, das hier sei nur zum Arbeiten"); } -/* DIE KACHELREIHE HAT SEIT DEM 11.09.2026 VIER EINTRAEGE. +/* DIE KACHELREIHE HAT SEIT DEM 21.09.2026 FUENF EINTRAEGE. Die Geschichte dieser Zeile ist lehrreich und steht deshalb hier: Erst gab es keine Kachelreihe (eine Sorte Zugang, eine Reihe waere eine Huerde gewesen). Dann drei ("3 rollen. dogfather. rechte hand - und modis"). Jetzt vier, weil der Treff hier eingezogen ist. + und modis"). Dann vier, weil der Treff hier eingezogen ist. Jetzt + fuenf -- die linke Hand ist dazugekommen. GEPRUEFT WIRD NICHT DIE ZAHL, SONDERN WELCHE. Eine Zahl war schon zweimal rot, ohne dass etwas kaputt war. Die NAMEN dagegen sagen etwas: Steht dort eines Tages "manager", ist das ein Befund und kein - Umbau. */ + Umbau. + + NACHGETRAGEN AM 22.09.2026, und der Rueckstand gehoert hierher: + Die Karte "Linke Hand" kam am 21.09. auf die Wand (Commit 21793b6), + diese Erwartung blieb bei vier. Die Pruefung war seitdem rot -- an + einer Stelle, an der NICHTS kaputt war. Eine rote Pruefung, die rot + bleibt, gewoehnt einem das Hinsehen ab; die Zeile darunter ("so + viele, wie es Rollen auf der Wand gibt") war die ganze Zeit gruen + und hat den Fehler damit sogar verdeckt. + + Warum die Liste trotzdem stehen bleibt und nicht abgeleitet wird: + Die REIHENFOLGE ist eine Entscheidung (DogFather, rechte Hand, linke + Hand, Modis, Gaeste) und steht sonst nirgends. Abzuleiten hiesse nur, + die Liste woanders hinzuschreiben. Die Zahl daneben ist die + abgeleitete Haelfte -- zwei Fragen, zwei Zeilen. */ const rollenAufWand = [...wandCrew.text.matchAll(/data-rolle="([a-z]+)"/g)].map((m) => m[1]); -ok(JSON.stringify(rollenAufWand) === JSON.stringify(["admin", "hand", "modi", "gast"]), - `crew.: die vier Kacheln in dieser Reihenfolge (${rollenAufWand.join(", ")})`); +const ERWARTETE_REIHE = ["admin", "hand", "linke", "modi", "gast"]; +ok(JSON.stringify(rollenAufWand) === JSON.stringify(ERWARTETE_REIHE), + `crew.: die ${ERWARTETE_REIHE.length} Kacheln in dieser Reihenfolge ` + + `(${rollenAufWand.join(", ")})`); const kachelnCrew = (wandCrew.text.match(/class="rolle"/g) || []).length; const kachelnWs = (wandWs.text.match(/class="rolle"/g) || []).length; ok(kachelnCrew === rollenAufWand.length, diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html index aac28178..d4a7e12b 100644 --- a/workspace/anruf-probe.html +++ b/workspace/anruf-probe.html @@ -16,15 +16,15 @@ verdeckt. Gefunden hat es pruef-struktur. Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. --> - - + + - +