- Neues Modul lib/tiktok-live.js liest den Live-Status direkt von der oeffentlichen TikTok-Live-Seite (SIGI_STATE -> liveRoom.status, 2 = live, alles andere = offline; bestaetigt durch yt-dlp) - Cron-Trigger im Worker prueft jede Minute und schreibt das Ergebnis nach app_settings; schlaegt ein Abruf fehl, bleibt der letzte gute Stand stehen statt faelschlich auf offline zu springen - /live-status liefert jetzt Quelle, Titel und Zeitpunkt der Pruefung - Punkt ist rot wenn offline, gruen+pulsierend wenn live, grau solange der Status laedt; Startseite aktualisiert alle 30 s ohne Neuladen - Handschaltung bleibt als Notfall-Vorrang mit 3-Stunden-Ablauf, plus Knopf "Zurueck zur Automatik" im Postfach Co-Authored-By: Claude Opus 5 <[email protected]>
114 lines
5.2 KiB
HTML
114 lines
5.2 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="de" data-theme="spicymedia">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<meta name="robots" content="noindex, nofollow" />
|
|
<title>Postfach — DOGFATHER UNIVERSE</title>
|
|
<meta name="description" content="Internes Bewerbungs-Postfach — nur mit Code zugänglich." />
|
|
<link rel="icon" type="image/png" href="assets/img/favicon.png" />
|
|
<link rel="stylesheet" href="assets/css/main.css" />
|
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css" />
|
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css" />
|
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css" />
|
|
<style>
|
|
.app-card { display:flex; flex-direction:column; gap:.5rem; }
|
|
.app-card .fields p { margin:.15rem 0; }
|
|
.app-card .actions { display:flex; flex-wrap:wrap; gap:.4rem; margin-top:.6rem; }
|
|
.app-card select.status-select { background:var(--bg-alt); color:var(--text); border:1px solid var(--border); border-radius:8px; padding:.35rem .6rem; font-size:.8rem; }
|
|
.notes-box { margin-top:.7rem; padding-top:.7rem; border-top:1px solid var(--border); display:none; }
|
|
.notes-box.open { display:block; }
|
|
.note-item { font-size:.82rem; padding:.4rem 0; border-bottom:1px solid var(--border); }
|
|
.filter-row { display:flex; gap:.6rem; flex-wrap:wrap; margin-bottom:1.2rem; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div id="site-header"></div>
|
|
|
|
<main>
|
|
<section class="hero">
|
|
<div class="container">
|
|
<span class="eyebrow">🔒 Intern</span>
|
|
<h1>Bewerbungs-Postfach</h1>
|
|
<p class="lead worlds">Nur für Dogfather & ausgewählte Personen mit Code.</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- ===== Login-Gate ===== -->
|
|
<section class="section-tight" id="gate-container">
|
|
<div class="container" style="max-width:520px;">
|
|
<form id="code-gate" class="app-form" novalidate>
|
|
<div class="field">
|
|
<label for="code-input">Zugangscode</label>
|
|
<input id="code-input" name="code" type="password" autocomplete="off" required />
|
|
</div>
|
|
<button class="btn btn-primary" type="submit">Postfach öffnen</button>
|
|
<div class="form-status" id="gate-status"></div>
|
|
</form>
|
|
<p class="small muted" style="margin-top:1rem;">
|
|
Zugänge, Rollen und Rechte fürs Team verwaltest du unter
|
|
<a href="zugaenge.html">Zugänge & Teammitglieder →</a>
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- ===== Session-Leiste ===== -->
|
|
<section class="section-tight" id="session-bar" style="display:none;padding-top:0;">
|
|
<div class="container" style="display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:1rem;">
|
|
<span class="badge rank-1" id="role-badge">Eingeloggt</span>
|
|
<div class="btn-row" style="margin:0;">
|
|
<a class="btn btn-outline" href="zugaenge.html" id="team-link" style="display:none;">Zugänge & Team</a>
|
|
<button class="btn btn-outline" id="logout-btn" type="button">Abmelden</button>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- ===== Live-Status (nur Owner) ===== -->
|
|
<section class="section-tight" id="live-toggle-section" style="display:none;">
|
|
<div class="container text-center">
|
|
<h2>Live-Status</h2>
|
|
<p class="lead" style="max-width:56ch;margin:0 auto;">
|
|
Läuft <strong>automatisch</strong>: Das System schaut jede Minute bei TikTok nach,
|
|
ob du gerade sendest. Du musst nichts melden.
|
|
</p>
|
|
<div class="card" style="max-width:420px;margin:1rem auto 0;">
|
|
<span class="badge rank-1"><span class="live-dot is-unknown" id="admin-live-dot"></span><span id="admin-live-text">Wird geladen …</span></span>
|
|
<p class="small muted" style="margin:.7rem 0 0;" id="admin-live-detail"></p>
|
|
|
|
<div class="btn-row" style="justify-content:center;margin-top:1rem;">
|
|
<button class="btn btn-primary" id="go-live-btn" type="button">🟢 Von Hand live</button>
|
|
<button class="btn btn-outline" id="go-offline-btn" type="button">Von Hand offline</button>
|
|
</div>
|
|
<button class="btn btn-outline" id="go-auto-btn" type="button" style="margin-top:.6rem;display:none;">
|
|
↩︎ Zurück zur Automatik
|
|
</button>
|
|
<p class="small muted" style="margin:.8rem 0 0;">
|
|
Die Handschaltung ist nur ein Notfall-Vorrang (z. B. wenn TikTok mal klemmt)
|
|
und läuft nach 3 Stunden von selbst wieder aus.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- ===== Mailbox ===== -->
|
|
<section class="section-tight" id="inbox-section" style="display:none;">
|
|
<div class="container">
|
|
<div style="display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:1rem;margin-bottom:1rem;">
|
|
<h2 style="margin:0;">Eingegangene Bewerbungen</h2>
|
|
<button class="btn btn-outline" id="refresh-btn" type="button">Aktualisieren</button>
|
|
</div>
|
|
<div class="filter-row">
|
|
<label class="small"><input type="checkbox" id="show-archived" /> Archivierte anzeigen</label>
|
|
</div>
|
|
<div id="inbox-list" class="grid grid-2"></div>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
|
|
<div id="site-footer"></div>
|
|
<script src="assets/js/main.js"></script>
|
|
<script src="assets/js/admin-auth.js"></script>
|
|
<script src="assets/js/postfach.js"></script>
|
|
</body>
|
|
</html>
|