Filipe: "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." Den fertigen Text gibt es
seit fdadd5d5; was fehlte, war der letzte Schritt -- bisher musste er
ihn selbst einfuegen.
NEU AN DER KACHEL: ein Knopf "In den Agentur-Kanal stellen", sobald ein
Kanal eingerichtet ist. Der Browser schickt dabei KEINEN Text mit --
der Server stellt ihn aus denselben Daten noch einmal zusammen. Sonst
koennte jemand mit einem veraenderten Text unter unserem Namen posten.
EINGERICHTET WIRD IM WORKSPACE, NICHT AUF DER KOMMANDOZEILE. Die
Webhook-Adresse IST der Schluessel zum Kanal; ueber einen Befehl
eingetragen landet sie im Chatverlauf, im Bildschirmfoto und in
~/.bash_history -- am 03.09.2026 ist genau das mit einem Token
passiert. Gemessen am 08.10.2026 kann `claudian` die Datei ohnehin
nicht anlegen: /home/dogiweb/workspace-daten ist drwxr-xr-x
dogiweb:dogiweb, und `sudo -l` deckt `dogiweb` nicht ab. Der Dienst
kann es. Damit braucht der Weg keine Rechteaenderung, kein root und
keinen Neustart.
DAS GEHEIMNIS liegt in /home/dogiweb/workspace-daten/discord-webhook.txt
mit 600, wird bei JEDEM Aufruf gelesen (ein Austausch wirkt sofort) und
kommt nie wieder heraus: GET beantwortet nur "ist eingerichtet" und
"seit wann", das Protokoll nennt sie nicht, und die Teilen-Antwort
auch nicht.
DIE SCHRANKEN, jede einzeln gemessen:
- nur discord.com/discordapp.com/ptb./canary., nur https, nur Wege
unter /api/webhooks/ -- sonst waere das Feld ein Weg, den Server zu
beliebigen Zielen sprechen zu lassen
- nur die Leitung, nur die Agentur-Adresse; von crew.* aus 404 statt
403, damit man nicht erahnen kann, was es woanders gibt
- allowed_mentions leer: im Beitrag steht TikToks Text, und ein
"@everyone" darin wuerde sonst den ganzen Server anpingen
- keine flags: die Vorschau bleibt an, denn genau sie ist das Banner
- ohne Teilen-Link keine Nachricht
- zwoelf je Stunde und Person, gezaehlt im Protokoll (Erfolge UND
Fehlschlaege -- sonst bremst sie den nicht, der in einer Schleife
haengt; derselbe Fehler wie am 07.10. an der Kampagnen-Bremse)
SIEBEN NEUE KENNUNGEN, sieben Saetze in meldung.js -- verlangt hat sie
`pruef-meldungen`, nicht mein Gedaechtnis. Jeder Satz sagt auch, was
stattdessen geht: Der Beitrag liegt in jedem Fall zum Kopieren da.
ZWEI FEHLER FANDEN NUR DIE PRUEFUNGEN:
- teilenRouter.use("/workspace/api/eintrag", angemeldet) deckte die
neuen Kanal-Wege nicht ab. Ohne req.person ist istLeitung falsch,
also antworteten sie JEDEM mit 403 "nicht_erlaubt", auch
DogFather. Es ist ZU gescheitert, nicht auf -- aber die Auskunft
schickte in die falsche Richtung.
- Das Datum im Dateikopf kam aus UTC (pruef-struktur): zwischen 00:00
und 02:00 stuende dort der Vortag, in einer Zeile, die spaeter
jemand liest, um zu wissen, seit wann der Kanal gilt.
Geprueft: pruef-kampagne 190 -> 226 (Abschnitte 12c und 12d), mit einer
ehrlichen Luecke -- die Dateirechte lassen sich auf Windows nicht
messen, auf dem Server schon; die Schlusszeile sagt jetzt "IN ORDNUNG,
mit Luecke" statt "ALLES IN ORDNUNG". bild-kampagne 53 -> 83
(Kanalfeld vermessen und abgebildet, Eingabefeld 45/46 px auf beiden
Breiten). Dazu gruen: meldungen 10, struktur, css-klassen, zeichen,
deutsche-texte, alle-wege, schranke, ports, portnummern, tippziele,
lesbarkeit, agentur 67, eventkarte 190, workspace-seiten 37,
haus-trennung 107, formulare 23, fingermass.
SECHS GEGENPROBEN am Weg in den Kanal, alle sechs schlagen an:
Rechnerliste uebergangen, Erwaehnungen wieder erlaubt, Vorschau
unterdrueckt, Bremse aus, ohne Teilen-Link gesendet, Adresse in die
Antwort gelegt.
NEBENBEI, UND ES WAR MEIN EIGENER REST: pruef-kampagne-lesen war seit
698c23e2 rot, also seit heute Vormittag. Mit dem Bildleser kamen drei
Pruefdaten in den Ordner, und die Wache dort verlangt zu Recht, dass
nichts Unerklaertes liegenbleibt. Ich hatte sie VOR dem Commit
gemessen und danach nicht noch einmal -- ein Pruefstand von vorher ist
keiner. Die drei sind jetzt benannt, mit Grund, und eine Gegenwache
prueft, dass es jede noch gibt. 186 -> 187, zwei Gegenproben: eine
unbekannte Datei faellt auf, ein toter Eintrag in der Liste auch.
208 lines
9.4 KiB
HTML
208 lines
9.4 KiB
HTML
<!doctype html>
|
||
<html lang="de">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||
<title>Scouting · Spicy & Dogi</title>
|
||
<meta name="robots" content="noindex, nofollow" />
|
||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||
eine Flaeche sind statt zweier. -->
|
||
<meta name="theme-color" content="#06090f" />
|
||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610082159" />
|
||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610082159" />
|
||
<link rel="stylesheet" href="assets/css/gate.css?v=202610082159" />
|
||
<link rel="stylesheet" href="assets/css/start.css?v=202610082159" />
|
||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610082159" />
|
||
<link rel="stylesheet" href="assets/css/scouting.css?v=202610082159" />
|
||
<link rel="stylesheet" href="assets/css/module.css?v=202610082159" />
|
||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||
<link rel="stylesheet" href="assets/css/haus.css?v=202610082159" />
|
||
</head>
|
||
|
||
<body class="start" data-buehne="wald">
|
||
|
||
<header class="kopfleiste">
|
||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||
</svg>
|
||
<span class="zurueck-knopf__text">Zurück</span>
|
||
</button>
|
||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Scouting</span></p>
|
||
<div class="kopfleiste__rechts">
|
||
<span class="wer" id="wer">…</span>
|
||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||
</div>
|
||
</header>
|
||
|
||
<main class="inhalt inhalt--breit">
|
||
|
||
<section class="kopf-zeile">
|
||
<div>
|
||
<p class="marke">Scout-CRM</p>
|
||
<h1 class="titel">Pipeline</h1>
|
||
<p class="unterzeile" id="unterzeile">Vom ersten Fund bis zur Übergabe – nachvollziehbar statt im Kopf.</p>
|
||
</div>
|
||
<div class="steuerung">
|
||
<div id="scoutwahl-block" hidden>
|
||
<label class="feld-schild" for="f-scout">Scout</label>
|
||
<select id="f-scout"><option value="">Alle Scouts</option></select>
|
||
</div>
|
||
<button type="button" class="knopf knopf--klein" id="neu-auf">Neuer Kontakt</button>
|
||
</div>
|
||
</section>
|
||
|
||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||
|
||
<!-- Follow-ups: der Teil, der ohne System am ehesten untergeht. -->
|
||
<section class="faellig" id="faellig" hidden>
|
||
<p class="faellig__titel">Follow-up fällig</p>
|
||
<ul class="faellig__liste" id="faellig-liste"></ul>
|
||
</section>
|
||
|
||
<section class="neu" id="neu-block" hidden>
|
||
<h2 class="neu__titel">Neuer Kontakt</h2>
|
||
<form id="neu-form">
|
||
<div class="neu__raster">
|
||
<div class="feld feld--breit">
|
||
<label class="feld-schild" for="n-name">Name</label>
|
||
<input id="n-name" maxlength="120" required placeholder="Wie heißt die Person?" />
|
||
</div>
|
||
<div class="feld">
|
||
<label class="feld-schild" for="n-plattform">Plattform</label>
|
||
<input id="n-plattform" maxlength="60" placeholder="z. B. TikTok" />
|
||
</div>
|
||
<div class="feld">
|
||
<label class="feld-schild" for="n-handle">Profil / Handle</label>
|
||
<input id="n-handle" maxlength="120" placeholder="@…" />
|
||
</div>
|
||
<!-- NORMAL ODER PREMIUM (06.10.2026).
|
||
|
||
Filipe: "auch dass wenn man die einträgt soll man aussuchen
|
||
können zwischen normalen und premium creator."
|
||
|
||
Steht direkt beim Handle und nicht weiter unten: Die Wahl
|
||
entscheidet, in WELCHER Spalte die Karte danach liegt. Wer
|
||
sie erst am Ende des Formulars findet, hat die Karte schon
|
||
zweimal auf der falschen Seite gesucht.
|
||
|
||
Die Auswahl wird beim Laden aus der Serverliste gefuellt
|
||
(siehe scouting.js) -- hier steht nur die Vorgabe, damit das
|
||
Feld auch dann bedienbar ist, wenn die Liste noch nicht da
|
||
ist. -->
|
||
<div class="feld">
|
||
<label class="feld-schild" for="n-art">Art</label>
|
||
<select id="n-art">
|
||
<option value="normal" selected>Normal</option>
|
||
<option value="premium">Premium</option>
|
||
</select>
|
||
</div>
|
||
<div class="feld">
|
||
<label class="feld-schild" for="n-prio">Priorität</label>
|
||
<select id="n-prio">
|
||
<option value="hoch">Hoch</option>
|
||
<option value="mittel" selected>Mittel</option>
|
||
<option value="niedrig">Niedrig</option>
|
||
</select>
|
||
</div>
|
||
<div class="feld" id="n-scout-block" hidden>
|
||
<label class="feld-schild" for="n-scout">Scout</label>
|
||
<select id="n-scout"><option value="">– niemandem zugeordnet –</option></select>
|
||
</div>
|
||
<div class="feld feld--breit">
|
||
<label class="feld-schild" for="n-aktivitaet">Aktivität & LIVE-Fokus</label>
|
||
<input id="n-aktivitaet" maxlength="3000" placeholder="Wie oft LIVE? Welche Zeiten? Welches Format?" />
|
||
</div>
|
||
<div class="feld feld--breit">
|
||
<label class="feld-schild" for="n-potenzial">Potenzial & Stil</label>
|
||
<input id="n-potenzial" maxlength="3000" placeholder="Was macht die Person besonders?" />
|
||
</div>
|
||
<div class="feld">
|
||
<label class="feld-schild" for="n-followup">Nächster Follow-up</label>
|
||
<input id="n-followup" type="date" />
|
||
</div>
|
||
<!-- DIE DREI QUALIFIZIERENDEN FRAGEN (11.09.2026).
|
||
|
||
Sie stehen schon beim Anlegen da, weil sie sonst nie
|
||
gestellt werden: "Schon im Netzwerk?" entscheidet, ob sich
|
||
der ganze Rest lohnt, und wer sie erst nach drei Nachrichten
|
||
stellt, hat drei Nachrichten zu viel geschrieben.
|
||
|
||
Alle drei sind freiwillig. Ein Pflichtfeld beim Anlegen
|
||
wäre die sichere Art, dafür zu sorgen, dass Kontakte gar
|
||
nicht erst eingetragen werden. -->
|
||
<div class="feld">
|
||
<label class="feld-schild" for="n-netzwerk">Schon im Netzwerk?</label>
|
||
<select id="n-netzwerk">
|
||
<option value="">– noch nicht gefragt –</option>
|
||
<option value="nein">frei</option>
|
||
<option value="ja">schon im Netzwerk</option>
|
||
<option value="unbekannt">noch nicht gefragt</option>
|
||
</select>
|
||
</div>
|
||
<div class="feld">
|
||
<label class="feld-schild" for="n-land">Land</label>
|
||
<select id="n-land">
|
||
<option value="">– nicht angegeben –</option>
|
||
<option value="DE">Deutschland</option>
|
||
<option value="AT">Österreich</option>
|
||
<option value="CH">Schweiz</option>
|
||
<option value="LU">Luxemburg</option>
|
||
<option value="andere">anderes Land</option>
|
||
</select>
|
||
</div>
|
||
<div class="feld">
|
||
<label class="feld-schild" for="n-follower">Follower</label>
|
||
<input id="n-follower" maxlength="14" inputmode="numeric" placeholder="z. B. 12400 oder 12,4k" />
|
||
</div>
|
||
</div>
|
||
<p class="fehler" id="n-fehler" role="alert" aria-live="polite"></p>
|
||
<div class="neu__knoepfe">
|
||
<button type="submit" class="knopf knopf--klein" id="n-speichern">Aufnehmen</button>
|
||
<button type="button" class="knopf-still" id="neu-zu">Abbrechen</button>
|
||
</div>
|
||
</form>
|
||
</section>
|
||
|
||
<div id="pipeline" aria-busy="true"><p class="leise">Pipeline wird geladen …</p></div>
|
||
|
||
</main>
|
||
|
||
<!-- Zugangscode nach dem Onboarding: genau einmal sichtbar. -->
|
||
<div class="schleier" id="code-schleier" hidden>
|
||
<div class="code-fenster" role="dialog" aria-modal="true" aria-labelledby="code-titel">
|
||
<p class="marke">Onboarding gestartet</p>
|
||
<h2 class="code-fenster__titel" id="code-titel">Zugangscode</h2>
|
||
<p class="code-fenster__text">
|
||
Dieser Code wird <strong>genau einmal</strong> angezeigt und ist danach nicht mehr
|
||
abrufbar. Gib ihn persönlich weiter, nicht über einen offenen Kanal.
|
||
</p>
|
||
<p class="code-fenster__code" id="code-wert">—</p>
|
||
<div class="neu__knoepfe">
|
||
<button type="button" class="knopf knopf--klein" id="code-kopieren">Kopieren</button>
|
||
<button type="button" class="knopf-still" id="code-zu">Habe ich notiert</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<script src="assets/js/meldung.js?v=202610082159" defer></script>
|
||
<script src="assets/js/nachfrage.js?v=202610082159" defer></script>
|
||
|
||
<script src="assets/js/wahl.js?v=202610082159" defer></script>
|
||
<script src="assets/js/bereiche.js?v=202610082159" defer></script>
|
||
<script src="assets/js/installieren.js?v=202610082159" defer></script>
|
||
<script src="assets/js/kopf.js?v=202610082159" defer></script>
|
||
<script src="assets/js/glocke.js?v=202610082159" defer></script>
|
||
<script src="assets/js/scouting.js?v=202610082159" defer></script>
|
||
</body>
|
||
</html>
|