B4 + B5: Loeschen heisst Loeschen, die Schrift wechselt mit, und Blau wird Babyblau

Die beiden Auftraege gehoeren zusammen, und zwar in dieser Reihenfolge:
Eine babyblaue Kachel ist HELL. Ohne mitwechselnde Schrift waere sie
unlesbar (1,63:1 gemessen). Erst B4 macht B5 moeglich.

B4a -- LOESCHEN HEISST LOESCHEN
  "Geloeschte Nachrichten verschwinden vollstaendig - keine Spur, kein
   'wurde geloescht'-Hinweis, bei niemandem, auch nicht bei DogFather."

Bis heute blieb die Zeile stehen: Text geleert, weg_am gesetzt, und im
Chat stand "Nachricht zurueckgenommen". Das war ausdruecklich so
begruendet ("ein Loch im Verlauf wirft mehr Fragen auf"). Das Argument
beantwortet aber eine andere Frage: Ein Hinweis "hier stand etwas"
MARKIERT die Stelle. Wer etwas aus Versehen schreibt, will es weg
haben und nicht unterstrichen.

Jetzt ein echtes DELETE. Vier Raender, an denen eine Spur bleiben
koennte, alle gemessen:
  1. die Zeile selbst
  2. chat_reaktionen    (ON DELETE CASCADE - nachgesehen, nicht angenommen)
  3. chat_erwaehnungen  (ebenso)
  4. letzte_am am Raum  - wird neu gerechnet, sonst stuende er oben in
                          der Liste mit einem Zeitpunkt, zu dem es
                          nichts mehr gibt
Dazu: ein Zitat auf eine geloeschte Nachricht wird weggelassen; in der
Gespraechsliste steht kein Hinweis mehr; der Knopf heisst "loeschen".

Die 5 alten zurueckgenommenen Zeilen (Text bereits leer) raeumt eine
einmalige, wiederholbare Umstellung ab - mit Sicherung davor, und nur
wenn es wirklich etwas zu tun gibt.

B4b -- WER DARF WAS
  "jeder nur seine eigenen - ausser DogFather und rechte Hand"
`darfJedeNachrichtLoeschen` = admin oder hand. NICHT fuehrtTeamDogi
(das schloesse die linke Hand ein) und nicht istLeitung (das schloesse
Spicy Media ein, die private Chats nicht einmal sehen darf). Das Recht
kommt vom Server ins Skript, nicht aus einer Rolle im Browser: chat.js
bekommt jeder, der die Seite oeffnet.

B4c -- DIE SCHRIFT WECHSELT MIT
  "am besten schwarz auf hellen Kacheln - und weiss, wenn jemand eine
   schwarze Kachel waehlt"
`schriftFuer(farbe)` waehlt zwischen zwei Paaren, gerechnet aus der
Leuchtdichte, mit denselben Schwellen wie das Rechenwerkzeug (7:1 fuer
den Text, 4,5:1 fuer die Fusszeile). Keine dritte Spalte in
CHAT_KACHELN, die jemand pflegen muesste. Flaeche und Schrift werden
im Browser in EINEM Griff gesetzt (blaseFaerben) - zwei Stellen waeren
irgendwann eine helle Kachel mit heller Schrift.

B4d -- DIE NAMEN
Der Name ist jetzt ein eigener Streifen mit Kante darunter, .84rem,
und der Rollenpunkt wird ein 3x14-Balken. Vorher stand er als erste
ZEILE in der Blase und las sich wie der Anfang des Satzes.

B5 -- BABYBLAU
  "jedes normales blaues herz durch babyblaues herz ersetzen ... jeder
   normale blaue farbe, sei es die kachel im chat oder emojis, nur
   babyblau bitte."
* Herz: U+1F499 -> U+1FA75. Nicht geglaubt, sondern gemessen: 43,9 px
  breit wie die anderen Herzen, ein Ersatzkaestchen waere 20,7. Die
  vier vorhandenen blauen Herzen in der Datenbank wandern mit - sonst
  waeren es vier Reaktionen, die ERLAUBT nicht mehr kennt: still weg.
* Kachel: neue, HELLE Kachel "Babyblau" mit dem Wert von --akzent.
  Gemessen: Text 10,78:1, Fusszeile 4,87:1. Sie steht bewusst nicht in
  der Rechnung des Werkzeugs (das rechnet elf Toene auf EINE
  Leuchtdichte) - sie hat eine andere Leuchtdichte und dafuer ihre
  eigene Schrift. Dasselbe Versprechen, anderer Weg.

PRUEFUNGEN
  pruef-loeschen.mjs (NEU, 20/0): alle vier Raender, die vier Faelle
    der Rechtegrenze (auch: die linke Hand darf NICHT), das babyblaue
    Herz am laufenden Server, und dass der Satz "Nachricht
    zurueckgenommen" nur noch in Kommentaren steht - mit Gegenprobe,
    dass die Suche diesen Unterschied wirklich macht.
  pruef-chatkachel.mjs (33/0): misst jede Kachel mit IHRER Schrift und
    fragt dafuer dieselbe Funktion wie der Server. Neu: dass die
    Schrift ueberhaupt wechselt. Die Leuchtdichte-Regel gilt jetzt fuer
    die gerechneten Toene - das Versprechen dahinter loest die
    Kontrastzeile darueber direkt ein.
  Vier alte Pruefungen umgedreht, die den alten Zustand festgeschrieben
    hatten: pruef-chat, pruef-chat-ausbau, pruef-chat-aufloesen,
    pruef-chat-optik. Alle mit scharferer Messung als vorher (Zahl
    davor/danach statt "ein Hinweis ist da").
  Mitgelaufen und gruen: pruef-alle-sehen-es, pruef-treffchat (110/0).

Gesichert: workspace-vor-loeschumbau-20260922-233313.db
(946 KB, integrity_check ok, 111 Nachrichten, 49 Reaktionen).

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-22 23:33:43 +02:00
co-authored by Claude Opus 5
parent 95da1345fc
commit 60802170a1
50 changed files with 1464 additions and 690 deletions
+93
View File
@@ -3459,6 +3459,99 @@ function umstellungen(d) {
}
}
/* =====================================================================
DIE ALTEN ZURUECKGENOMMENEN NACHRICHTEN GEHEN GANZ (22.09.2026)
=====================================================================
Filipe: „Geloeschte Nachrichten verschwinden vollstaendig -- keine
Spur, kein ‚wurde geloescht'-Hinweis, bei niemandem, auch nicht
bei DogFather."
Seit heute loescht der Chat wirklich (DELETE). Was davor
zurueckgenommen wurde, steht aber noch als Zeile da: Text leer,
`weg_am` gesetzt. Die Anzeige zeigt sie nicht mehr -- in der
Datenbank waere sie trotzdem. „Keine Spur" gilt dann fuer alles,
was ab heute passiert, und nicht fuer das, was ihn zu dem Satz
gebracht hat.
ES GEHT NUR UM ZEILEN OHNE INHALT. `text = ''` ist die Bedingung,
nicht bloss `weg_am IS NOT NULL`: Der Text wurde beim Zuruecknehmen
geleert, also ist hier nichts zu verlieren. Stuende irgendwo doch
noch Text in einer zurueckgenommenen Zeile, bliebe sie liegen --
lieber ein Rest, den jemand ansehen kann, als ein stiller Verlust.
WIEDERHOLBAR: Beim zweiten Start gibt es nichts mehr zu tun, und
es passiert nichts. Deshalb steht es hier bei den Umstellungen
und nicht in einem einmaligen Skript, das jemand vergessen
koennte.
GESICHERT WIRD VORHER -- aber nur, wenn es wirklich etwas zu tun
gibt. Eine Sicherung bei jedem Start waere eine Datei je Neustart
und damit kein Schutz, sondern Muell. */
try {
const spalten = d.prepare("PRAGMA table_info(chat_nachrichten)").all().map((x) => x.name);
if (spalten.includes("weg_am")) {
const offen = d.prepare(
"SELECT COUNT(*) AS n FROM chat_nachrichten WHERE weg_am IS NOT NULL AND text = ''").get().n;
if (offen > 0) {
const stempel = new Date().toISOString().replace(/[-:T]/g, "").slice(0, 14);
const sicherung = `${DB_PFAD}.vor-loeschspuren-${stempel}`;
d.exec(`VACUUM INTO '${sicherung.replace(/'/g, "''")}'`);
console.log("[workspace] Sicherung vor dem Aufraeumen:", sicherung);
/* Reaktionen und Erwaehnungen haengen mit ON DELETE CASCADE
daran und gehen von selbst mit -- `PRAGMA foreign_keys = ON`
steht beim Oeffnen. Nachgesehen, nicht angenommen. */
const weg = d.prepare(
"DELETE FROM chat_nachrichten WHERE weg_am IS NOT NULL AND text = ''").changes;
/* Und die Raeume rechnen ihren letzten Zeitpunkt neu -- sonst
stuende einer oben in der Liste, zu dessen Zeitpunkt es
nichts mehr gibt. */
d.exec(`UPDATE chat_raeume SET letzte_am =
(SELECT MAX(erstellt) FROM chat_nachrichten WHERE raum_id = chat_raeume.id)`);
console.log(`[workspace] ${weg} zurueckgenommene Nachrichten endgueltig entfernt.`);
}
}
} catch (fehler) {
console.error("[workspace] Aufraeumen der Loeschspuren:", fehler?.message);
}
/* =====================================================================
DIE BLAUEN HERZEN WERDEN BABYBLAU (22.09.2026)
=====================================================================
Filipe: "jedes normales blaues herz durch babyblaues herz
ersetzen ... jeder normale blaue farbe, sei es die kachel im chat
oder emojis, nur babyblau bitte."
Der Katalog (workspace-reaktionen.js) kennt seit heute nur noch
das babyblaue. WAS SCHON IN DER DATENBANK STEHT, WANDERT MIT --
ohne diese Zeilen waeren es vier Reaktionen, die `ERLAUBT` nicht
mehr kennt. Der Verlauf filtert danach: Sie verschwaenden still,
und niemand koennte sagen, wann und warum.
`UPDATE OR IGNORE`, DANN `DELETE`: Der Primaerschluessel ist
(nachricht_id, person_id, zeichen). Hat jemand auf dieselbe
Nachricht BEIDES gesetzt, liefe ein blankes UPDATE auf den
Schluessel auf. So gewinnt das vorhandene babyblaue, und das
blaue faellt weg -- zweimal dasselbe Herz an einer Nachricht
waere ohnehin keine zwei Reaktionen.
WIEDERHOLBAR: Beim zweiten Start gibt es nichts mehr zu tun. */
try {
const blau = "\u{1F499}", babyblau = "\u{1FA75}";
const offen = d.prepare(
"SELECT COUNT(*) AS n FROM chat_reaktionen WHERE zeichen = ?").get(blau).n;
if (offen > 0) {
d.prepare("UPDATE OR IGNORE chat_reaktionen SET zeichen = ? WHERE zeichen = ?")
.run(babyblau, blau);
const rest = d.prepare("DELETE FROM chat_reaktionen WHERE zeichen = ?").run(blau).changes;
console.log(`[workspace] ${offen} blaue Herzen auf babyblau umgestellt`
+ (rest ? ` (${rest} doppelte entfernt)` : ""));
}
} catch (fehler) {
console.error("[workspace] Herzen umstellen:", fehler?.message);
}
/* Content-Saeulen: die drei bis fuenf Themen, aus denen der Kanal
besteht. Aus der Recherche: 3-5 Saeulen nach der 70/20/10-Regel
(70 % Wert, 20 % Community, 10 % Eigenwerbung); eine Saeule wird