Teilen gibt einen fertigen Discord-Beitrag -- und die zwei Seiten bekommen ein Gesicht
Filipe: "beim teilen wird auch nur der link geteilt, und 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 damit die leute drauf gehen. das ist kake."
Und: "perfektionier die zwei events kategorien. ich will es noch viel
krasser und spezieller."
EIN LINK IN EINEM DISCORD-KANAL IST EINE AUFFORDERUNG. Wer ihn nicht
anklickt -- und das sind die meisten -- weiss nicht, dass es die
Kampagne gibt. Was in Discord steht, muss die Kampagne SEIN. Der
Teilen-Knopf legt deshalb einen fertigen Beitrag in die Zwischenablage:
Titel als Ueberschrift, Zeitraum, Einleitung, die Aufgaben als Liste,
die Geschenke mit Coinpreis, "Gut zu wissen" aus Rangliste, Zeitplan
und Teilnahme. Er steht zusaetzlich sichtbar unter der Kachel, mit
Zeichenzaehler und zweitem Kopierknopf -- was man nicht gesehen hat,
fuegt man blind ein.
ZWEI DINGE SIND DABEI NICHT BELIEBIG:
- Der Link steht GANZ AM ENDE. Discord setzt die Bannervorschau
UNTER die Nachricht; steht er oben, schiebt das Banner den Text
aus dem Blick.
- Der Link steht NACKT da. Spitze Klammern unterdruecken die
Vorschau -- und damit genau das Banner, um das es geht.
2000 ZEICHEN, UND NICHT EINS MEHR. Gekuerzt wird auf dem Server, in
fester Reihenfolge und an Abschnittsgrenzen: erst "Gut zu wissen",
dann die Einleitung auf zwei Saetze, dann die Geschenke. Titel,
Zeitraum, Aufgaben und Link bleiben IMMER. Gemessen gegen sieben
Laengen und einen 1500-Zeichen-Titel als Haertefall.
Gebaut wird der Beitrag aus `teilenDaten()` -- derselben Funktion, aus
der auch die offene Seite entsteht. Zwei Aufbauten fuer dasselbe Event
wuerden irgendwann Verschiedenes sagen, und niemand koennte entscheiden,
welcher recht hat.
DIE ZWEI SEITEN: ein gezeichnetes Wappen in der Farbe der Spalte, ein
Kopf mit Lichtkante und Verlauf, der beim Scrollen oben stehen bleibt,
und eine Lagezeile ("2 laufen - 1 kommt - 3 vorbei"). Gezaehlt mit
derselben Regel, die die Gruppen darunter bildet; was null ist,
erscheint nicht. Augenschonend bleibt es ueber Form und Tiefe, nicht
ueber Leuchtkraft.
NEBENBEFUND, BEHOBEN: Der Einlesekasten war durch Seitenwahl und
Bildweg auf 521 px gewachsen -- auf 412 px mehr als ein halber
Telefonbildschirm, bevor man die erste Kachel sieht. Er klappt jetzt zu
(82 px) und merkt sich die Wahl; ein Druck, und er bleibt offen.
BERICHTIGT, WEIL GEMESSEN:
- Der Bindestrich wurde entwertet: "4\-woechige", "Ahorn\-Welt". In
Discord ist "-" nur am Zeilenanfang eine Aufzaehlung.
- Das Klappschild hatte nur eine Handy-Regel und sonst kein
Aussehen -- auf 1400 px ein nackter Knopf mit 27 px statt 48.
- bild-kampagne mass elementFromPoint ausserhalb des
Sichtfensters und meldete "etwas liegt auf dem Knopf", wo nichts
lag; und r(null) liess den ganzen Lauf abstuerzen, statt die
Zusicherung rot zu machen.
- EINE GEGENPROBE WAR BLIND: DISCORD_MAX von 2000 auf 99999 zu
setzen liess die Pruefung gruen -- der Testbeitrag ist 1230
Zeichen lang, die Grenze wurde also nie geprueft. Jetzt mit einem
Beitrag, der ohne Kuerzung sicher zu lang waere.
GEPRUEFT: 190 (Route und Teilen, +8), 183 (Kachel, +13), 69 Messungen
(Bild, +2), 67 (Agentur), 43 (Bildleser), struktur, css-klassen,
zeichen, deutsche-texte, tippziele. Sechs Gegenproben: Link nur noch
Link, Link oben statt unten, Grenze weg, Lagezeile weg, Kopf klebt
nicht, Kasten wieder offen -- alle sechs werden bemerkt, alle Dateien
byte-gleich wiederhergestellt.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -1115,6 +1115,131 @@ melde("=== 12b. Ein Event nach draußen teilen ===");
|
||||
ok(t1.code === 200 && /\/e\/[A-Za-z0-9_-]{20,}$/.test(j1.weg || ""),
|
||||
`der Link entsteht: ${String(j1.weg).replace(/^https?:\/\/[^/]+/, "…")}`);
|
||||
|
||||
/* ==== UND EIN FERTIGER BEITRAG FÜR DISCORD (08.10.2026) ======
|
||||
|
||||
Filipe: „beim teilen wird auch nur der link geteilt, und ich
|
||||
will dass wenn ich es teile im discord der agentur, dass ein
|
||||
banner und ein kompletter fertiger text für die creator
|
||||
entsteht und nicht einfach der link kopiert wird damit die
|
||||
leute drauf gehen. das ist kake.“
|
||||
|
||||
Gemessen wird nicht „es kommt ein Text“, sondern dass der Text
|
||||
die vier Dinge trägt, wegen denen man ihn schreibt: Titel,
|
||||
Zeitraum, Aufgaben, Link — und dass Discord ihn annimmt. */
|
||||
const beitrag = String(j1.text || "");
|
||||
ok(beitrag.length > 200,
|
||||
`der fertige Beitrag kommt mit (${beitrag.length} Zeichen)`);
|
||||
|
||||
/* DISCORD NIMMT 2000 ZEICHEN JE NACHRICHT. Eine längere wird
|
||||
beim Einfügen abgeschnitten — mitten im Wort, und niemand
|
||||
merkt es, bis ein Creator nachfragt. */
|
||||
ok(beitrag.length <= 2000,
|
||||
`und bleibt unter der Discord-Grenze (${beitrag.length} von 2000)`);
|
||||
|
||||
ok(beitrag.includes("Gipfelstürmer"), "der Titel steht drin");
|
||||
ok(/04\.10\.2026/.test(beitrag), "der Zeitraum steht drin");
|
||||
ok(beitrag.includes("1 Diamant = 1 Punkt"),
|
||||
"die Aufgaben stehen drin — genau das, was beim Link fehlte");
|
||||
ok(/Ahorn-Welt/.test(beitrag) && /12\.000 Coins/.test(beitrag),
|
||||
"die Geschenke mit Coinpreis ebenso");
|
||||
|
||||
/* DER LINK STEHT GANZ AM ENDE UND NACKT.
|
||||
Am Ende, weil Discord die Vorschau UNTER die Nachricht setzt --
|
||||
steht er oben, schiebt das Banner den Text aus dem Blick.
|
||||
Nackt, weil spitze Klammern die Vorschau unterdrücken: dann
|
||||
gäbe es genau das Banner nicht, um das es geht. */
|
||||
ok(beitrag.trimEnd().endsWith(j1.weg),
|
||||
`der Link steht ganz am Ende (…${beitrag.trimEnd().slice(-34)})`);
|
||||
ok(!beitrag.includes(`<${j1.weg}>`),
|
||||
" und nackt, nicht in spitzen Klammern — sonst kein Banner");
|
||||
|
||||
/* DISCORD-AUSZEICHNUNG: Überschriften und Aufzählungen, damit es
|
||||
in Discord wie ein Aushang aussieht und nicht wie eine
|
||||
Textwand. */
|
||||
ok(/^# /m.test(beitrag) && /^## /m.test(beitrag),
|
||||
"Überschriften sind gesetzt (# und ##)");
|
||||
ok(/^- /m.test(beitrag), "und die Aufgaben als Aufzählung");
|
||||
|
||||
/* EIN BINDESTRICH MITTEN IM WORT WIRD NICHT ENTWERTET. Beim
|
||||
ersten Blick auf den Beitrag stand dort „Ahorn\\-Welt“ und
|
||||
„4\\-wöchige“ — die Rückstriche sichtbar im Text. In Discord
|
||||
ist `-` nur am Zeilenanfang eine Aufzählung. */
|
||||
ok(!/\w\\-\w/.test(beitrag),
|
||||
"kein Rückstrich mitten im Wort");
|
||||
|
||||
/* ---- DIE GRENZE WIRD AN EINEM LANGEN BEITRAG GEMESSEN -------
|
||||
|
||||
GEFUNDEN DURCH DIE GEGENPROBE (08.10.2026): Als Sabotage wurde
|
||||
`DISCORD_MAX` von 2000 auf 99999 gesetzt -- und die Pruefung
|
||||
blieb GRUEN. Der Beitrag von „Gipfelstuermer" ist 1230 Zeichen
|
||||
lang; ob die Grenze bei 2000 oder bei 99999 steht, aendert daran
|
||||
nichts. `beitrag.length <= 2000` hat also nie die GRENZE
|
||||
geprueft, sondern nur diesen einen Beitrag.
|
||||
|
||||
Genau die Sorte gruener Haken, die nichts misst (CLAUDE.md,
|
||||
01.09.2026). Geprueft wird deshalb mit einem Beitrag, der ohne
|
||||
Kuerzung sicher zu lang WAERE -- und daneben, dass das
|
||||
Wesentliche trotzdem stehen bleibt. Ein Beitrag, der die Grenze
|
||||
einhaelt, indem er alles wegwirft, waere auch keine Loesung. */
|
||||
{
|
||||
const { discordText } = await import("./workspace-teilen.js");
|
||||
const satz = "Gipfelstürmer ist eine TikTok LIVE Kampagne, in welcher "
|
||||
+ "Creator*innen Punkte sammeln können, wenn sie Diamanten sammeln. ";
|
||||
const lang = {
|
||||
titel: "Ein sehr langer Kampagnentitel zum Messen",
|
||||
zeitraum: "04.10.2026 – 07.10.2026",
|
||||
text: satz.repeat(40),
|
||||
basis: "https://beispiel.de/e/abc",
|
||||
vonTikTok: true,
|
||||
aufgaben: Array.from({ length: 12 }, (x, i) =>
|
||||
`Aufgabe ${i + 1} mit einem recht ausführlichen Text dahinter`),
|
||||
gaben: Array.from({ length: 8 }, (x, i) =>
|
||||
({ text: `Geschenk ${i + 1}`, coins: (i + 1) * 999, zusatz: null })),
|
||||
abschnitte: [{ art: "rangliste", titel: "RANGLISTE", zeilen: [
|
||||
{ art: "punkt", text: "Gewertet wird vom 04.10. bis zum 07.10." }] }],
|
||||
};
|
||||
/* ERST BELEGEN, DASS DER FALL UEBERHAUPT EINTRITT. Ohne diese
|
||||
Zeile misst die naechste wieder nichts. */
|
||||
const ungekuerzt = satz.repeat(40).length;
|
||||
ok(ungekuerzt > 2000,
|
||||
`der Probetext allein ist ${ungekuerzt} Zeichen lang -- er MUSS gekürzt werden`);
|
||||
const kurz = discordText(lang);
|
||||
ok(kurz.length <= 2000,
|
||||
`und der Beitrag bleibt bei ${kurz.length} Zeichen`);
|
||||
ok(kurz.length < ungekuerzt,
|
||||
" es wurde also wirklich gekürzt, nicht nur gemessen");
|
||||
/* WAS IMMER STEHEN BLEIBT: Titel, Zeitraum, Aufgaben, Link.
|
||||
Das sind die vier Dinge, wegen denen man den Beitrag
|
||||
schreibt. */
|
||||
ok(kurz.includes("Ein sehr langer Kampagnentitel"), " der Titel bleibt");
|
||||
ok(/04\.10\.2026/.test(kurz), " der Zeitraum bleibt");
|
||||
ok(/^- Aufgabe 1 /m.test(kurz), " die Aufgaben bleiben");
|
||||
ok(kurz.trimEnd().endsWith("https://beispiel.de/e/abc"),
|
||||
" und der Link steht am Ende");
|
||||
|
||||
/* DER AEUSSERSTE FALL: ein Titel, der allein fast die Grenze
|
||||
sprengt. Auch dann muss der Link dastehen -- ohne ihn ist der
|
||||
Beitrag eine Sackgasse. */
|
||||
const riesig = discordText({ ...lang, titel: "A".repeat(1500) });
|
||||
ok(riesig.length <= 2000 && riesig.trimEnd().endsWith("https://beispiel.de/e/abc"),
|
||||
`selbst bei einem 1500-Zeichen-Titel: ${riesig.length} Zeichen, Link am Ende`);
|
||||
}
|
||||
|
||||
/* UND NICHTS ÜBER UNS. Dieselbe Grenze wie auf der offenen
|
||||
Seite: Was die Kampagne sagt, geht hinaus — wer wir sind,
|
||||
nicht. Der Beitrag landet in einem Kanal, den auch Fremde
|
||||
lesen können. */
|
||||
const verbotenImBeitrag = [
|
||||
["ein Name", "Dogfather"], ["eine Rolle", "admin"],
|
||||
["die Kampagnennummer", ID_GIPFEL],
|
||||
["ein Hinweis an DogFather", "bitte nachtragen"],
|
||||
["ein Feldname", "erstellt_von"],
|
||||
].filter(([, w]) => beitrag.includes(w));
|
||||
ok(verbotenImBeitrag.length === 0,
|
||||
"nichts Internes im Beitrag"
|
||||
+ (verbotenImBeitrag.length
|
||||
? `: ${verbotenImBeitrag.map((x) => x[0]).join(", ")}` : ""));
|
||||
|
||||
/* DERSELBE SCHLUESSEL BEIM ZWEITEN DRUCK. Ein neuer wuerde den
|
||||
Link still ins Leere laufen lassen, den jemand schon gepostet
|
||||
hat. */
|
||||
@@ -1123,6 +1248,11 @@ melde("=== 12b. Ein Event nach draußen teilen ===");
|
||||
const j2 = JSON.parse(t2.text || "{}");
|
||||
ok(j2.weg === j1.weg && j2.schon === true,
|
||||
"der zweite Druck gibt denselben Link, keinen neuen");
|
||||
/* UND DEN BEITRAG GLEICH MIT. Wer ihn ein zweites Mal in einen
|
||||
anderen Kanal stellen will, soll nicht erst zurückziehen und
|
||||
neu teilen müssen. */
|
||||
ok(String(j2.text || "") === beitrag,
|
||||
`und denselben Beitrag (${String(j2.text || "").length} Zeichen)`);
|
||||
|
||||
const schluessel = String(j1.weg).split("/e/")[1];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user