Files
dogfather-universe/server/unterstuetzung-tabellen.js
T
DogFatherGitandClaude Opus 5 aa2e1a4ae2 Eine Kachel "Unterstuetzen" -- und die Gespraechsliste neu gebaut
=== 1. UNTERSTUETZEN (neue Kachel im Community-Bereich) ===

Filipe: "ich brauch auch noch eine kachel im community bereich. wo mein
paypal und meine amazon liste sein wird. wo die leute alle supporten
koennen auf andere art anstatt nur tiktok. jeder soll diese kachel sehen
aber nur dogfather soll sie veraendern koennen oder vieles mehr sehen."

Neu: unterstuetzen.html + css + js, server/workspace-unterstuetzung.js,
server/unterstuetzung-tabellen.js. Ton 45 (#7567fe) ist gerechnet, das
Kachelzeichen ist ein Herz ueber zwei offenen Haenden.

DIE WEGE STEHEN IN DER DATENBANK, nicht im Quelltext -- ein Recht, das
man nur ueber einen Entwickler ausueben kann, ist keines. DogFather
schreibt Titel, Text, Knopf und Adresse selbst, blendet Wege aus und
nimmt neue dazu.

DER PAYPAL-LINK STEHT LEER UND UNSICHTBAR DA. Filipe schrieb "mein
paypal kennst du ja schon" -- gesucht im ganzen Haus und im Vault,
nirgends gefunden. Eine Zahlungsadresse zu RATEN waere der
gefaehrlichste Fehler dieser Seite: Geld an einen Fremden, und niemand
merkt es. Also steht dort nichts, der Weg ist ausgeblendet, und die
Seite sagt genau EINER Person, dass er fehlt.

DREI ARTEN, UND DIE DRITTE IST DIE WICHTIGSTE: geld, geschenk, frei.
"Kostet nichts" bekommt dieselbe Kartenform und dieselbe Groesse.
Waeren die freien Wege kleiner oder weiter unten, waere die Aussage
"das ist zweite Wahl" -- und die Mehrheit derer, die hier lesen, waere
damit zweite Wahl.

DIE ZAEHLUNG IST ANONYM, UND ZWAR VON DER TABELLE HER. DogFather sieht,
wie oft ein Weg geoeffnet wurde (7/30 Tage/gesamt). Was er NICHT sieht,
ist WER -- weil es in unterstuetzung_striche keine Spalte dafuer gibt.
Geprueft wird das ueber PRAGMA table_info, nicht ueber eine Abfrage:
eine Abfrage liesse sich morgen erweitern, eine fehlende Spalte nicht.

Schreiben haengt an istDogFather, nicht an istLeitung -- die rechte Hand
fuehrt dieses Team mit und kommt trotzdem nicht an diesen Link. Jede
Adresse wird beim SCHREIBEN geprueft (nur https:// oder eine Seite
dieses Hauses); javascript:, data:, http:// und // werden abgewiesen.

Neu: server/pruef-unterstuetzung.mjs -- 70 Pruefungen, alle gruen.
Sie misst ueber die CREW-ADRESSE: Beim ersten Lauf waren vier Rollen
gruen und der Zuschauer rot, und es sah nach einem Rechtefehler aus.
Es war ein Messfehler -- ueber 127.0.0.1 landet man still im
Agenturhaus, und dort gibt es die Rolle "gast" gar nicht.

=== 2. DIE GESPRAECHSLISTE (screen1 + screen2) ===

Filipe: "ich will dass die komplette kachel viel krasser und geiler
aussieht. der hintergrund der kachel soll gleich bleiben."

Der Hintergrund ist unangetastet. Zwei echte Fehler auf seinem Bild:

  - Bei "Das Rudel" stand das "@" rechts oben und die orange "6" eine
    ZEILE TIEFER. Der Knopf ist ein Raster mit DREI Spalten und bekam
    VIER Kinder -- das vierte fiel um. Ausgerechnet die wichtigste
    Auskunft der Liste landete an der unauffaelligsten Stelle.
  - Jedes Gespraech mit Profilbild haengte das Bild ZWEIMAL ein: ein
    Block stand Zeichen fuer Zeichen doppelt da. Zu sehen war nichts,
    gekostet hat es die doppelte Ladelast bei jedem Neuzeichnen.

Und eine tote Regel: `.chat-raum__knopf[data-an="ja"]` beschrieb die
Schiene am offenen Gespraech -- gesetzt wird aber `data-offen` am <li>.
Die Regel griff nie, und daneben stand eine zweite, blassere Fassung
derselben Sache. Jetzt steht alles einmal, und die Schiene ist da.

Dazu: Zeilen als Karten, 44px-Gesichter, ein Zaehler neben "Gespraeche",
Suchfeld als Pille mit Lupe, runder Farbfleck statt Quadrat, und der
leere Raum rechts bekommt eine Mitte statt eines Satzes in der Ecke.

=== 3. VIER FUNDE NEBENBEI ===

  - supportAufraeumen() war exportiert und wurde NIRGENDS gerufen. Die
    Meldungen samt Bildschirmfotos waeren fuer immer liegen geblieben,
    obwohl "90 Tage" dokumentiert ist. Jetzt im Loeschkonzept.
  - aufgaben_zuteilung fehlte ebenfalls im Loeschkonzept (seit 21.09.).
    pruef-aufbewahrung ist damit wieder gruen.
  - pruef-start-ansicht war rot, seit "Aufgaben" am 23.09. die silberne
    Kachel bekam -- die ueberschreibt ihr --ton absichtlich. Die
    Pruefung nimmt sie jetzt aus UND prueft die Ausnahme selbst.
  - pruef-buehne meldete auf entwicklung.html 1,79:1 Kontrast bei "Wen
    gehst du durch?" -- die Ueberschrift lag direkt auf dem Foto. Sie
    steht jetzt auf einer deckenden Flaeche.

OFFEN: pruef-buehne meldet treff-regeln.html mal "0 von 40", mal "3 von
40" -- dieselbe Seite, verschiedene Antworten. Eine Pruefung, die
schwankt, ist schlimmer als eine rote. Nicht in diesem Zug behoben.

Gemessen: pruef-unterstuetzung 70, pruef-start-ansicht, pruef-buehne
(bis auf den Wackler), pruef-workspace-seiten, pruef-aufbewahrung 45,
pruef-rechtetafel 19, pruef-css-klassen, pruef-chatkachel 36,
pruef-chat-ausbau, pruef-entwicklung-kacheln 31 -- gruen.

Neu: server/mess-chat-liste.mjs (zeigt die Liste mit sieben Gespraechen
verschiedener Art, prueft nichts).

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-24 14:14:25 +02:00

180 lines
8.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* =====================================================================
UNTERSTÜTZEN — Tabellen (24.09.2026)
Filipe: „ich brauch auch noch eine kachel im community bereich. wo
mein paypal und meine amazon liste sein wird. wo die leute alle
supporten können auf andere art anstatt nur tiktok. … jeder soll
diese kachel sehen aber nur dogfather soll sie verändern können
oder vieles mehr sehen. alle anderen, rechte und linke hand, modis
und community sollen supporten können."
---------------------------------------------------------------------
WARUM DIE WEGE IN DER DATENBANK STEHEN UND NICHT IM QUELLTEXT
Es wäre kürzer gewesen, PayPal und die Wunschliste als zwei feste
Einträge in eine Datei zu schreiben. Drei Gründe dagegen, und der
dritte ist der entscheidende:
1. EIN LINK ÄNDERT SICH. Eine Wunschliste wird neu angelegt, ein
Zahlungsweg kommt dazu. Stünde er im Quelltext, hinge jede
Änderung an einem Deploy — und damit an mir.
2. FILIPE SOLL IHN SELBST ÄNDERN KÖNNEN. Genau das hat er
verlangt („nur dogfather soll sie verändern können"). Ein Recht,
das man nur über einen Entwickler ausüben kann, ist keines.
3. UND DER PAYPAL-LINK STEHT NIRGENDS IM HAUS. Filipe schrieb
„mein paypal kennst du ja schon" — gesucht habe ich, gefunden
nicht. Ihn zu RATEN wäre der schlimmste Fehler dieser ganzen
Seite: Ein falscher Zahlungslink schickt Geld an einen
Fremden, und niemand merkt es. Deshalb steht dort am Anfang
nichts, der Weg ist unsichtbar, und die Seite sagt DogFather
(und nur ihm), dass dort noch etwas fehlt.
---------------------------------------------------------------------
DREI ARTEN, UND DIE DRITTE IST DIE WICHTIGSTE
geld Direkt Geld — PayPal.
geschenk Etwas schenken — die Wunschliste.
frei Kostet nichts.
„frei" ist nicht Beiwerk. Eine Seite, die nur zwei Wege zum Zahlen
zeigt, liest sich wie eine hohle Hand — und die meisten, die hier
lesen, sind Zuschauer ohne Geld übrig. Wer gar nichts geben kann,
soll trotzdem etwas finden, das er tun kann, statt die Seite mit
einem schlechten Gefühl zu schließen. Deshalb stehen die freien
Wege gleichberechtigt daneben und nicht als Trostpflaster darunter.
---------------------------------------------------------------------
DIE ZÄHLUNG IST ANONYM — UND ZWAR VON DER TABELLE HER
„nur dogfather soll … vieles mehr sehen": Er sieht, wie oft ein Weg
geöffnet wurde. Was er NICHT sieht, ist WER — und das liegt nicht an
einer Abfrage, die man später ändern könnte, sondern daran, dass es
in dieser Tabelle keine Spalte dafür gibt.
Das ist Absicht und keine Nachlässigkeit. „Wer hat auf PayPal
gedrückt und dann doch nichts geschickt" ist eine Frage, die
niemandem nützt und mehrere Leute beschämt. Sie lässt sich hier
nicht beantworten, auch nicht von mir, auch nicht mit Datenbank-
zugriff.
Gezählt wird je Weg und je TAG. Der Tag reicht für „läuft das
überhaupt an?" und ergibt bei einer Community dieser Größe keine
Spur zu einzelnen Menschen.
===================================================================== */
/** Wie lange die Tagesstriche stehen bleiben.
*
* Ein Jahr: Lang genug, um Weihnachten mit Weihnachten zu
* vergleichen, kurz genug, dass hier nichts für immer liegt. Aufgeräumt
* wird im Rundgang, nicht beim Lesen — sonst hinge das Löschen davon
* ab, dass jemand die Seite öffnet. */
export const ZAEHLUNG_TAGE = 365;
/** Die drei Arten. Steht hier und nicht in der Oberfläche: Der Server
* prüft dagegen, und eine zweite Liste im Browser wäre die, die beim
* nächsten Zuwachs vergessen wird. */
export const UNTERSTUETZUNG_ARTEN = {
geld: "Direkt",
geschenk: "Schenken",
frei: "Kostet nichts",
};
/* Die Startbelegung. Sie wird EINMAL eingesetzt (INSERT OR IGNORE über
den Schlüssel) und danach nie wieder angefasst — wer einen Weg
löscht, soll ihn nicht beim nächsten Serverstart wiederfinden.
DER PAYPAL-WEG KOMMT OHNE ADRESSE UND UNSICHTBAR. Siehe oben: Raten
ist hier die gefährlichste aller Abkürzungen. */
const START_WEGE = [
{
schluessel: "paypal", art: "geld", platz: 10, sichtbar: 0,
titel: "PayPal",
text: "Direkt und ohne Umweg. Auch ein kleiner Betrag hilft – "
+ "und niemand muss etwas geben, um dazuzugehören.",
knopf: "Bei PayPal öffnen",
ziel: "",
},
{
schluessel: "amazon", art: "geschenk", platz: 20, sichtbar: 1,
titel: "Wunschliste",
text: "Etwas Konkretes schenken statt Geld – die Liste sagt, "
+ "was gerade gebraucht wird.",
knopf: "Wunschliste ansehen",
ziel: "https://www.amazon.de/hz/wishlist/ls/3BGGNNHYAO5QL?ref_=wl_share",
},
{
schluessel: "dabei", art: "frei", platz: 30, sichtbar: 1,
titel: "Einfach da sein",
text: "Im Live dabei sein, mitreden, jemanden begrüßen, der neu ist. "
+ "Das kostet nichts und ist am meisten wert.",
knopf: "", ziel: "",
},
{
schluessel: "weitersagen", art: "frei", platz: 40, sichtbar: 1,
titel: "Weitersagen",
text: "Einen Clip teilen oder jemandem von hier erzählen. "
+ "Neue Leute kommen über euch, nicht über Werbung.",
knopf: "", ziel: "",
},
{
schluessel: "draussen", art: "frei", platz: 50, sichtbar: 1,
titel: "Wo es Dogi sonst gibt",
text: "Kanäle, Shop und dein Rabatt stehen auf einer eigenen Seite.",
knopf: "Zu „Draußen“",
ziel: "unsere-seiten.html",
},
];
export function unterstuetzungTabellen(d) {
d.exec(`
CREATE TABLE IF NOT EXISTS unterstuetzung_wege (
id INTEGER PRIMARY KEY AUTOINCREMENT,
/* Der Schlüssel ist die Kennung für die Startbelegung und für
die Zählung. Er ändert sich nie — der TITEL darf sich ändern,
ohne dass die Striche der letzten Monate zu einem anderen Weg
gehören. */
schluessel TEXT NOT NULL UNIQUE,
art TEXT NOT NULL CHECK (art IN ('geld','geschenk','frei')),
titel TEXT NOT NULL,
text TEXT NOT NULL DEFAULT '',
/* Die Aufschrift des Knopfes. Leer heißt: Dieser Weg hat keinen
Knopf — es gibt Wege, die man nicht anklickt („einfach da
sein"). Ein Knopf ohne Ziel wäre ein Versprechen ins Leere. */
knopf TEXT NOT NULL DEFAULT '',
/* Die Adresse. Darf leer sein. Geprüft wird sie beim SCHREIBEN
(nur https:// oder eine Seite dieses Hauses) — nicht erst beim
Anzeigen: Eine Adresse, die erst im Browser auffällt, steht
vorher schon in der Datenbank. */
ziel TEXT NOT NULL DEFAULT '',
sichtbar INTEGER NOT NULL DEFAULT 1,
platz INTEGER NOT NULL DEFAULT 0,
geaendert TEXT,
geaendert_von INTEGER REFERENCES personen(id) ON DELETE SET NULL
);
/* KEINE SPALTE FÜR EINE PERSON. Siehe den Kopf dieser Datei — das
ist die eigentliche Zusage dieser Seite, und sie steht hier im
Schema und nicht in einer Abfrage, die jemand später ändert. */
CREATE TABLE IF NOT EXISTS unterstuetzung_striche (
weg_id INTEGER NOT NULL REFERENCES unterstuetzung_wege(id) ON DELETE CASCADE,
tag TEXT NOT NULL,
anzahl INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (weg_id, tag)
);
CREATE INDEX IF NOT EXISTS idx_unterstuetzung_tag
ON unterstuetzung_striche(tag);
`);
/* INSERT OR IGNORE über den eindeutigen Schlüssel: Beim ersten Start
entstehen die fünf Wege, bei jedem weiteren passiert nichts. Wer
einen löscht, findet ihn nicht beim nächsten Neustart wieder — das
wäre eine Änderung, die sich von selbst zurücknimmt, und so etwas
sucht man stundenlang. */
const setz = d.prepare(`INSERT OR IGNORE INTO unterstuetzung_wege
(schluessel, art, titel, text, knopf, ziel, sichtbar, platz)
VALUES (?,?,?,?,?,?,?,?)`);
for (const w of START_WEGE) {
setz.run(w.schluessel, w.art, w.titel, w.text, w.knopf, w.ziel, w.sichtbar, w.platz);
}
}