function getAliveTabs() { const now = Date.now(); const alive = []; for (let key in localStorage) { if (key.startsWith("oz_heartbeat_")) { const t = parseInt(localStorage.getItem(key), 10); if (now - t < 10000) alive.push(key.replace("oz_heartbeat_", "")); } } return alive.sort(); }
function cleanupDeadTabs() { const now = Date.now(); for (let key in localStorage) { if (key.startsWith("oz_heartbeat_")) { const t = parseInt(localStorage.getItem(key), 10); if (now - t > 20000) localStorage.removeItem(key); } } } setInterval(cleanupDeadTabs, 10000);
/* --------------------------------------------------------- Helfer --------------------------------------------------------- */ const todayISO = () => new Date().toISOString().slice(0,10); const yesterdayISO = () => { let d = new Date(); d.setDate(d.getDate() - 1); return d.toISOString().slice(0,10); }; const fmt = ms => { let m = (ms/60000)|0, h = (m/60)|0; return String(h).padStart(2,"0")+":"+String(m%60).padStart(2,"0"); };
let lastTick = Date.now(); let lastDay = todayISO();
/* --------------------------------------------------------- 7-Tage Zählung --------------------------------------------------------- */ function cleanup() { let now = Date.now(), keep = {}; for (let d in days) { if ((now - new Date(d).getTime()) / 86400000 <= 7) keep[d] = days[d]; } days = keep; save(days); } cleanup();
/* --------------------------------------------------------- TICK (nur Master zählt!) --------------------------------------------------------- */ function tick() { if (!isMaster()) return;
let now = Date.now(); let diff = now - lastTick; lastTick = now;
if (diff > 0 && diff < 60000) { let t = todayISO();
if (t !== lastDay) { if (!days[t]) days[t] = 0; lastDay = t; }
/* --------------------------------------------------------- Anzeige (alle TABs lesen, synchronisieren) --------------------------------------------------------- */ function updateUI() { days = load(); // Synchronisation
let t = todayISO(); let y = yesterdayISO(); let total = Object.values(days).reduce((a,b)=>a+b,0); let today = days[t] || 0; let yesterday = days[y] || 0; let activeDays = Object.keys(days).length;
/* --------------------------------------------------------- Anzeige EINBINDEN --------------------------------------------------------- */ const box = ` <center> <div class="onlinezeit-details"> <div class="onlinezeit-time" id="oz-reset-btn" title="Onlinezeit neu starten!"> <span class="onlinezeit-uhr">⏱️ Gesamt: <span data-oz-total>00:00</span> <span style="font: 15px Arial;">🗑️</span></span> <span class="onlinezeit-aktiv">(Aktive Tage: <span data-oz-active>0</span> von 7)</span> </div> <div id="oz-info-toggle" title="Info zum Onlinezeitzähler"> <div class="onlinezeit-time"><span class="onlinezeit-uhr">📅 Heute:</span> <span data-oz-today>00:00</span></div> <div class="onlinezeit-time"><span class="onlinezeit-uhr">📅 Gestern:</span> <span data-oz-yesterday>00:00</span></div> <span id="oz-arrow">▼</span> </div> </div><br> <div class="oz-info-spoiler" style="display:none;"> <strong>Wichtige Hinweise:</strong> <ul><li>Die Onlinezeiten werden erfasst, solange mindestens <i>ein Forum-TAB</i> geöffnet ist.</li> <li>TABs synchronisieren sich automatisch gegenseitig.</li> <li>Ein Reset löscht alle Onlinezeiten.</li> <li>Der Tageswechsel wird automatisch erkannt. Die Onlinezeiten von "Heute" werden auf "Gestern" übertragen.</li> <li>Die Onlinezeiten werden im jeweiligen Browser gespeichert.</li> <li>Jeder Browser auf dem PC oder auf dem Handy, zeigt seine eigene Onlinezeit an!</li> <li>Browserübergreifend kann die echte, gesamte Onlinezeit nur durch Addition der geöffneten Browser ermittelt werden!</li> </ul> </div> </center>`;