From 41812c93f59cc03a435e99f8e8969e44f204cc83 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Thu, 17 Oct 2024 22:47:51 +0000 Subject: [PATCH] public/js/admin.js aktualisiert --- public/js/admin.js | 2103 +++++++++++++++++++++++--------------------- 1 file changed, 1079 insertions(+), 1024 deletions(-) diff --git a/public/js/admin.js b/public/js/admin.js index 067f293..4aa24b9 100644 --- a/public/js/admin.js +++ b/public/js/admin.js @@ -1,1025 +1,1080 @@ -document.addEventListener("DOMContentLoaded", function() { - const savedPassword = localStorage.getItem("adminPassword"); - const loginForm = document.getElementById("login-form"); - const adminArea = document.getElementById("admin-area"); - const sidebar = document.getElementById("sidebar"); - const errorMessage = document.getElementById("error-message"); - const passwordInput = document.querySelector("input[name='password']"); - const timerDisplay = document.getElementById('logout-timer'); // Logout-Timer Element - - let inactivityTimeout; - let logoutTimerInterval; // Variable für den Timer-Interval - let timeRemaining = 5 * 60 * 1000; // 5 Minuten in Millisekunden - - function resetInactivityTimer() { - clearTimeout(inactivityTimeout); - clearInterval(logoutTimerInterval); // Timer-Interval zurücksetzen - timeRemaining = 5 * 60 * 1000; // Reset des verbleibenden Zeitlimits - startLogoutTimer(); // Timer neu starten - - inactivityTimeout = setTimeout(() => { - logout(); // Automatischer Logout nach Inaktivität - }, 5 * 60 * 1000); // 5 Minuten Timeout - } - - // Überprüfen, ob ein Passwort gespeichert ist - if (savedPassword) { - loginForm.style.display = 'none'; - adminArea.style.display = 'block'; - sidebar.style.display = 'block'; - timerDisplay.style.display = 'block'; // Timer anzeigen, wenn eingeloggt - loadDashboard(); - resetInactivityTimer(); // Timer bei Start setzen - startLogoutTimer(); // Starte den Timer, wenn der Benutzer eingeloggt ist - } else { - // Standardmäßig den Timer ausblenden, wenn der Benutzer nicht eingeloggt ist - timerDisplay.style.display = 'none'; - } - - // Holen Sie sich das Passwort von der API - fetch('/api/admin-password') - .then(response => response.json()) - .then(data => { - const correctPassword = data.password; - - document.getElementById("form").onsubmit = function(event) { - event.preventDefault(); - const password = event.target.password.value; - - if (password === correctPassword) { - localStorage.setItem("adminPassword", password); - loginForm.style.display = 'none'; - adminArea.style.display = 'block'; - sidebar.style.display = 'block'; - timerDisplay.style.display = 'block'; // Timer anzeigen, wenn eingeloggt - errorMessage.style.display = 'none'; - loadDashboard(); - resetInactivityTimer(); - } else { - // Passwortfeld verstecken und Fehlermeldung anstelle des Passwortfelds anzeigen - passwordInput.style.display = 'none'; - errorMessage.style.display = 'block'; - - // Nach 3 Sekunden das Passwortfeld wieder anzeigen und Fehlermeldung ausblenden - setTimeout(() => { - passwordInput.style.display = 'block'; - errorMessage.style.display = 'none'; - passwordInput.value = ''; // Passwortfeld leeren - }, 3000); // 3 Sekunden Timeout - } - }; - }) - .catch(error => { - console.error('Fehler beim Abrufen des Passworts:', error); - errorMessage.textContent = 'Fehler beim Laden des Passworts.'; - errorMessage.style.display = 'block'; - }); - - window.logout = function() { - localStorage.removeItem("adminPassword"); - adminArea.style.display = 'none'; - loginForm.style.display = 'block'; - sidebar.style.display = 'none'; - timerDisplay.style.display = 'none'; // Timer ausblenden beim Logout - - // Login-Seite neu laden - location.reload(); - }; - - // Events, die Inaktivität verhindern: Mausbewegung, Tastatureingabe, etc. - window.addEventListener('mousemove', resetInactivityTimer); - window.addEventListener('keydown', resetInactivityTimer); - window.addEventListener('click', resetInactivityTimer); - - // Timer-Funktion für den automatischen Logout - function startLogoutTimer() { - logoutTimerInterval = setInterval(() => { - const minutes = Math.floor((timeRemaining / 1000 / 60) % 60); - const seconds = Math.floor((timeRemaining / 1000) % 60); - - timerDisplay.textContent = `Automatischer Logout in: ${minutes}:${seconds < 10 ? '0' : ''}${seconds}`; - - timeRemaining -= 1000; // Jede Sekunde 1000ms abziehen - - if (timeRemaining < 0) { - clearInterval(logoutTimerInterval); - logout(); // Führe Logout-Funktion aus - } - }, 1000); - } - - document.getElementById('dashboard-link').onclick = function() { - document.getElementById('dashboard').style.display = 'block'; - document.getElementById('logs').style.display = 'none'; - document.getElementById('wishes').style.display = 'none'; // Wünsche ausblenden - document.getElementById('feedback').style.display = 'none'; // Feedback ausblenden - document.getElementById('users').style.display = 'none'; - document.getElementById('admin-help').style.display = 'none'; - document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden - document.getElementById('send-message').style.display = 'none'; // Send Message ausblenden - document.getElementById('backups').style.display = 'none'; - document.getElementById('dev-report').style.display = 'none'; - }; - - document.getElementById('logs-link').onclick = function() { - document.getElementById('dashboard').style.display = 'none'; - document.getElementById('logs').style.display = 'block'; - document.getElementById('wishes').style.display = 'none'; // Wünsche ausblenden - document.getElementById('feedback').style.display = 'none'; // Feedback ausblenden - loadLogs(); // Logs laden, wenn der Bereich angezeigt wird - document.getElementById('users').style.display = 'none'; - document.getElementById('admin-help').style.display = 'none'; - document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden - document.getElementById('send-message').style.display = 'none'; // Send Message ausblenden - document.getElementById('backups').style.display = 'none'; - document.getElementById('dev-report').style.display = 'none'; - }; - - document.getElementById('wishes-link').onclick = function() { - document.getElementById('dashboard').style.display = 'none'; - document.getElementById('logs').style.display = 'none'; - document.getElementById('wishes').style.display = 'block'; // Wünsche anzeigen - loadWishes(); // Offene Wünsche laden, wenn der Bereich angezeigt wird - document.getElementById('users').style.display = 'none'; - document.getElementById('feedback').style.display = 'none'; - document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden - document.getElementById('admin-help').style.display = 'none'; - document.getElementById('send-message').style.display = 'none'; // Send Message ausblenden - document.getElementById('backups').style.display = 'none'; - document.getElementById('dev-report').style.display = 'none'; - }; - - document.getElementById('feedback-link').onclick = function() { - document.getElementById('dashboard').style.display = 'none'; - document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden - document.getElementById('logs').style.display = 'none'; - document.getElementById('wishes').style.display = 'none'; // Wünsche ausblenden - document.getElementById('feedback').style.display = 'block'; // Feedback anzeigen - loadFeedback(); // Feedback laden, wenn der Bereich angezeigt wird - document.getElementById('users').style.display = 'none'; - document.getElementById('admin-help').style.display = 'none'; - document.getElementById('send-message').style.display = 'none'; // Send Message ausblenden - document.getElementById('backups').style.display = 'none'; - document.getElementById('dev-report').style.display = 'none'; - }; - - document.getElementById('admin-help-link').onclick = function() { - document.getElementById('dashboard').style.display = 'none'; - document.getElementById('logs').style.display = 'none'; - document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden - document.getElementById('wishes').style.display = 'none'; // Wünsche ausblenden - document.getElementById('feedback').style.display = 'none'; // Feedback ausblenden - document.getElementById('admin-help').style.display = 'block'; // Admin Hilfe anzeigen - document.getElementById('users').style.display = 'none'; - document.getElementById('send-message').style.display = 'none'; // Send Message ausblenden - document.getElementById('backups').style.display = 'none'; - document.getElementById('dev-report').style.display = 'none'; - }; - - document.getElementById('users-link').onclick = function() { - document.getElementById('dashboard').style.display = 'none'; - document.getElementById('logs').style.display = 'none'; - document.getElementById('wishes').style.display = 'none'; - document.getElementById('feedback').style.display = 'none'; - document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden - document.getElementById('users').style.display = 'block'; - loadUsers(); // Benutzer laden, wenn der Bereich angezeigt wird - document.getElementById('admin-help').style.display = 'none'; - document.getElementById('send-message').style.display = 'none'; - document.getElementById('dev-report').style.display = 'none'; - document.getElementById('backups').style.display = 'none'; - }; - - // Send Message Link - document.getElementById('send-message-link').onclick = function() { - document.getElementById('dashboard').style.display = 'none'; - document.getElementById('logs').style.display = 'none'; - document.getElementById('wishes').style.display = 'none'; - document.getElementById('feedback').style.display = 'none'; - document.getElementById('users').style.display = 'none'; - document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden - document.getElementById('admin-help').style.display = 'none'; - document.getElementById('send-message').style.display = 'block'; // Send Message anzeigen - document.getElementById('dev-report').style.display = 'none'; - document.getElementById('backups').style.display = 'none'; - }; - - document.getElementById('backups-link').onclick = function() { - document.getElementById('dashboard').style.display = 'none'; - document.getElementById('logs').style.display = 'none'; - document.getElementById('wishes').style.display = 'none'; - document.getElementById('feedback').style.display = 'none'; - document.getElementById('users').style.display = 'none'; - document.getElementById('admin-help').style.display = 'none'; - document.getElementById('send-message').style.display = 'none'; - document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden - document.getElementById('dev-report').style.display = 'none'; - document.getElementById('backups').style.display = 'block'; // Backups anzeigen - loadBackups(); // Backups laden, wenn der Bereich angezeigt wird - }; - - document.getElementById('dev-report-link').onclick = function() { - document.getElementById('dashboard').style.display = 'none'; - document.getElementById('logs').style.display = 'none'; - document.getElementById('wishes').style.display = 'none'; - document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden - document.getElementById('users').style.display = 'none'; - document.getElementById('feedback').style.display = 'none'; - document.getElementById('admin-help').style.display = 'none'; - document.getElementById('send-message').style.display = 'none'; // Send Message ausblenden - document.getElementById('backups').style.display = 'none'; - document.getElementById('dev-report').style.display = 'block'; // Dev Report anzeigen - loadDevReports(); // Dev Reports laden, wenn der Bereich angezeigt wird - }; - - document.getElementById('faq-link').onclick = function() { - document.getElementById('dashboard').style.display = 'none'; - document.getElementById('logs').style.display = 'none'; - document.getElementById('wishes').style.display = 'none'; - document.getElementById('feedback').style.display = 'none'; - document.getElementById('faq-container').style.display = 'block'; // FAQ-Bereich anzeigen - document.getElementById('users').style.display = 'none'; - document.getElementById('admin-help').style.display = 'none'; - document.getElementById('send-message').style.display = 'none'; - document.getElementById('backups').style.display = 'none'; - document.getElementById('dev-report').style.display = 'none'; - fetchFaqs(); // FAQs laden, wenn der Bereich angezeigt wird - }; - - }); - - function loadDashboard() { - fetchBotUptime(); - fetchFileCheck(); - fetchServerInfo(); - document.getElementById('dashboard').style.display = 'block'; - } - - function loadLogs() { - fetchCommandHistory(); - fetchErrorLog(); - } - // Funktion zum Laden der Wünsche - function loadWishes() { - fetch('/api/wishes') // Endpoint für offene Wünsche - .then(response => response.json()) - .then(data => { - const wishesDiv = document.getElementById('wishes-content'); - wishesDiv.innerHTML = ''; // Vorherige Inhalte leeren - if (data.length === 0) { - wishesDiv.innerHTML = '

Keine offenen Wünsche vorhanden.

'; - } else { - data.forEach((wish) => { - wishesDiv.innerHTML += ` -
-
${wish.message}
-
- `; - }); - } - }) - .catch(error => { - console.error('Fehler beim Laden der Wünsche:', error); - document.getElementById('wishes-content').innerHTML = '

Fehler beim Laden der Wünsche.

'; - }); - } - - // Automatisches Aktualisieren des Wunsch alle 10 Sekunden - setInterval(() => { - loadWishes(); - }, 10000); // 10 Sekunden (10000 Millisekunden) - - - // Funktion zum Laden des Feedbacks - function loadFeedback() { - fetch('/api/feedback') - .then(response => response.text()) - .then(data => { - const feedbackDiv = document.getElementById('feedback-content'); - feedbackDiv.innerHTML = ''; // Vorherige Inhalte leeren - - const feedbackLines = data.split('\n'); - feedbackLines.slice(1).forEach((line) => { // Ignoriere die erste Zeile - if (line.trim()) { - const feedbackMessage = line.split(' - ')[1]; // Nur den Feedback-Teil extrahieren - feedbackDiv.innerHTML += ` -
- -
- `; - } - }); - - if (feedbackLines.length <= 1) { // Überprüfen, ob nur die erste Zeile vorhanden ist - feedbackDiv.innerHTML = '

Kein Feedback vorhanden.

'; - } - }) - .catch(error => { - console.error('Fehler beim Laden des Feedbacks:', error); - document.getElementById('feedback-content').innerHTML = '

Fehler beim Laden des Feedbacks.

'; - }); - } - - // Automatisches Aktualisieren des Feedbacks alle 10 Sekunden - setInterval(() => { - loadFeedback(); - }, 10000); // 10 Sekunden (10000 Millisekunden) - - - function fetchBotUptime() { - fetch('/api/bot-uptime') - .then(response => response.json()) - .then(data => { - document.getElementById('bot-uptime').innerText = `Aktuelle Laufzeit des Bots: ${data.runtime}`; - }) - .catch(error => console.error('Fehler beim Abrufen der Bot-Laufzeit:', error)); - } - - // Funktion, um die Bot-Laufzeit regelmäßig zu aktualisieren - function startUptimeUpdate() { - fetchBotUptime(); // Initialen Aufruf - setInterval(fetchBotUptime, 1000); // Alle 5 Sekunden aktualisieren - } - - // Aufruf der Startfunktion, wenn das Admin-Dashboard geladen wird - document.addEventListener("DOMContentLoaded", function() { - startUptimeUpdate(); - }); - - function fetchFileCheck() { - fetch('/api/file-check') - .then(response => response.json()) - .then(data => { - const fileCheckDiv = document.getElementById('file-check'); - fileCheckDiv.innerHTML = '

Dateiüberprüfung:

'; - data.forEach(file => { - fileCheckDiv.innerHTML += `

${file.exists ? '✅' : '❌'} Datei ${file.file} ${file.exists ? 'ist vorhanden.' : 'fehlt.'}

`; - }); - }) - .catch(error => console.error('Fehler beim Abrufen der Dateiüberprüfung:', error)); - } - - // Automatisches Abrufen der Dateiüberprüfung alle 10 Sekunden - setInterval(fetchFileCheck, 10000); - - // Optional: Einmaliges Abrufen, wenn die Seite geladen wird - window.onload = fetchFileCheck; - - function fetchServerInfo() { - fetch('/api/server-info') - .then(response => response.json()) - .then(data => { - document.getElementById('server-info').innerHTML = ` -

Server-Informationen:

-

Plattform: ${data.platform}

-

Architektur: ${data.architecture}

-

Gesamter Speicher: ${data.totalMemory} GB

-

Freier Speicher: ${data.freeMemory} GB

- `; - }) - .catch(error => console.error('Fehler beim Abrufen der Serverinformationen:', error)); - } - - // Funktion zum Abrufen des Fehlerprotokolls -function fetchErrorLog() { - fetch('/api/error-log') - .then(response => response.text()) - .then(data => { - document.getElementById('error-log').querySelector('pre').innerText = data; - }) - .catch(error => console.error('Fehler beim Abrufen des Fehlerprotokolls:', error)); -} - -let errorNotified = false; // Variable, um den Status der Benachrichtigung zu verfolgen - -// Funktion zum Überprüfen des error.log -function checkErrorLog() { - const savedPassword = localStorage.getItem("adminPassword"); // Überprüfen, ob der Benutzer eingeloggt ist - - if (!savedPassword) return; // Beende die Funktion, wenn der Benutzer nicht eingeloggt ist - - fetch('/api/error-log') - .then(response => response.text()) - .then(data => { - const welcomeBox = document.querySelector('.welcome-box'); - - // Überprüfe, ob Fehler im Log vorhanden sind - if (data && data.trim().length > 0) { - if (!errorNotified) { // Nur Benachrichtigung anzeigen, wenn sie noch nicht angezeigt wird - welcomeBox.innerHTML += ` -
- Fehler erkannt! Bitte überprüfen Sie das Fehlerprotokoll. -
- `; - errorNotified = true; // Status aktualisieren - } - } else { - // Fehler-Meldung entfernen, wenn kein Fehler mehr vorhanden ist - const errorNotification = document.getElementById('error-notification'); - if (errorNotification) { - errorNotification.remove(); - errorNotified = false; // Status zurücksetzen - } - } - }) - .catch(error => { - console.error('Fehler beim Abrufen des Fehlerprotokolls:', error); - }); -} - -// Regelmäßige Überprüfung alle 10 Sekunden -setInterval(checkErrorLog, 10000); // Alle 10 Sekunden - - -// Funktion zum Abrufen der Kommando-Historie -function fetchCommandHistory() { - fetch('/api/command-history') - .then(response => response.text()) - .then(data => { - document.getElementById('command-history').querySelector('pre').innerText = data; - }) - .catch(error => console.error('Fehler beim Abrufen der Kommando-Historie:', error)); -} - -// Funktion zum Herunterladen des Error Logs -function downloadErrorLog() { - fetch('/api/error-log') - .then(response => response.text()) - .then(data => { - const blob = new Blob([data], { type: 'text/plain' }); - const url = window.URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = 'error_log.txt'; // Dateiname - a.click(); - window.URL.revokeObjectURL(url); - }) - .catch(error => console.error('Fehler beim Herunterladen des Fehlerprotokolls:', error)); -} - -// Funktion zum Herunterladen der Kommando-Historie -function downloadCommandHistory() { - fetch('/api/command-history') - .then(response => response.text()) - .then(data => { - const blob = new Blob([data], { type: 'text/plain' }); - const url = window.URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = 'command_history.txt'; // Dateiname - a.click(); - window.URL.revokeObjectURL(url); - }) - .catch(error => console.error('Fehler beim Herunterladen der Kommando-Historie:', error)); -} - -// Funktion zum Löschen des Fehlerprotokolls -function deleteErrorLog() { - if (confirm('Möchten Sie das komplette Fehlerprotokoll wirklich löschen?')) { - fetch('/api/clear-error-log', { - method: 'POST', // Ändere DELETE zu POST - }) - .then(response => response.json()) - .then(data => { - if (data.success) { - alert('Fehlerprotokoll erfolgreich gelöscht.'); - fetchErrorLog(); // Log-Datei neu laden - } else { - alert('Fehler beim Löschen des Fehlerprotokolls.'); - } - }) - .catch(error => console.error('Fehler beim Löschen des Fehlerprotokolls:', error)); - } -} - -// Funktion zum Löschen der Kommando-Historie -function deleteCommandHistory() { - if (confirm('Möchten Sie die gesamte Kommando-Historie wirklich löschen?')) { - fetch('/api/clear-command-history', { - method: 'POST', // Ändere DELETE zu POST - }) - .then(response => response.json()) - .then(data => { - if (data.success) { - alert('Kommando-Historie erfolgreich gelöscht.'); - fetchCommandHistory(); // Command-Historie neu laden - } else { - alert('Fehler beim Löschen der Kommando-Historie.'); - } - }) - .catch(error => console.error('Fehler beim Löschen der Kommando-Historie:', error)); - } -} - - -// Automatisches Aktualisieren alle 10 Sekunden -setInterval(() => { - fetchErrorLog(); - fetchCommandHistory(); -}, 10000); // 10 Sekunden (10000 Millisekunden) - - - - // Funktion zum Abfragen des Debug-Status - function checkDebugStatus() { - fetch('/api/debug-status') - .then(response => response.json()) - .then(data => { - if (data.debugMode) { - showDebugMessage(); // Zeige die Debug-Meldung, wenn Debug aktiviert ist - updateDebugButton(true); // Aktualisiere den Button - } else { - hideDebugMessage(); // Verstecke die Debug-Meldung, wenn Debug deaktiviert ist - updateDebugButton(false); // Aktualisiere den Button - } - }) - .catch(error => { - console.error('Fehler beim Abfragen des Debug-Status:', error); - }); - } - - // Funktion zur Aktualisierung des Debug-Toggle-Buttons - function updateDebugButton(isDebugActive) { - const debugButton = document.getElementById('debug-button'); - - if (isDebugActive) { - debugButton.textContent = 'Debug ON'; - debugButton.style.backgroundColor = 'red'; // Rot für aktiviert - } else { - debugButton.textContent = 'Debug OFF'; - debugButton.style.backgroundColor = 'green'; // Grün für deaktiviert - } - } - - // Setze ein Intervall, um den Debug-Status alle 5 Sekunden zu überprüfen - setInterval(checkDebugStatus, 5000); - - // Debug-Meldung anzeigen - function showDebugMessage() { - let debugBox = document.getElementById('debug-message-box'); - - if (!debugBox) { - debugBox = document.createElement('div'); - debugBox.id = 'debug-message-box'; - debugBox.textContent = 'Debug-Modus aktiviert'; - debugBox.style.position = 'fixed'; - debugBox.style.top = '20px'; - debugBox.style.right = '20px'; - debugBox.style.backgroundColor = 'orange'; - debugBox.style.color = 'white'; - debugBox.style.padding = '10px 20px'; - debugBox.style.borderRadius = '5px'; - debugBox.style.zIndex = '1000'; - document.body.appendChild(debugBox); - } - } - - // Debug-Meldung verstecken - function hideDebugMessage() { - const debugBox = document.getElementById('debug-message-box'); - if (debugBox) { - debugBox.remove(); - } - } - - // Seite initial mit dem aktuellen Debug-Status laden - checkDebugStatus(); - - // Funktion zum Umschalten des Debug-Modus - function toggleDebugMode() { - const debugButton = document.getElementById('debug-button'); - const isDebugActive = debugButton.textContent === 'Debug ON'; - - fetch('/api/toggle-debug', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ debugMode: !isDebugActive }) - }) - .then(response => response.json()) - .then(data => { - updateDebugButton(data.debugMode); // Aktualisiere den Button nach der Rückmeldung des Servers - }) - .catch(error => { - console.error('Fehler beim Umschalten des Debug-Modus:', error); - }); - } - - - // Funktion zum Laden der Benutzerinformationen - function loadUsers() { - fetch('/api/users') // API-Endpunkt für Benutzerinformationen - .then(response => response.json()) - .then(data => { - const usersDiv = document.getElementById('users-content'); - usersDiv.innerHTML = ''; // Vorherige Inhalte leeren - - if (data.length === 0) { - usersDiv.innerHTML = '

Keine Benutzer vorhanden.

'; - } else { - data.forEach((user, index) => { - // Bestimme die Klasse basierend auf der Index-Position - const className = index % 2 === 0 ? 'even' : 'odd'; // Klassen für gerade und ungerade Indizes - - usersDiv.innerHTML += ` -
-

Benutzername: ${user.username}

-

Benachrichtigungen: ${user.notifications ? 'Aktiviert' : 'Deaktiviert'}

-

Erstnutzung: ${user.firstUsed}

-

Lieblingsgenre: ${user.favoriteGenre || 'Nicht festgelegt'}

-

Befehlsanzahl: ${user.commandCount}

-

Benutzerlevel: ${user.userLevel}

- -
-
- `; - }); - - // Event Listener für die Lösch-Buttons - document.querySelectorAll('.delete-user').forEach(button => { - button.onclick = function() { - const userId = this.getAttribute('data-user-id'); - deleteUser(userId); - }; - }); - } - }) - .catch(error => { - console.error('Fehler beim Laden der Benutzer:', error); - document.getElementById('users-content').innerHTML = '

Fehler beim Laden der Benutzerinformationen.

'; - }); - } - - // Funktion zum Löschen eines Benutzers - function deleteUser(userId) { - if (confirm('Möchtest du diesen Benutzer wirklich löschen?')) { - fetch(`/api/users/${userId}`, { - method: 'DELETE', - }) - .then(response => response.json()) - .then(data => { - alert(data.message); - loadUsers(); // Nach dem Löschen die Benutzerliste neu laden - }) - .catch(error => { - console.error('Fehler beim Löschen des Benutzers:', error); - alert('Fehler beim Löschen des Benutzers.'); - }); - } - } - - // Funktion zum Starten der automatischen Aktualisierung - function startAutoRefresh() { - loadUsers(); // Einmaliges Laden der Benutzer beim Start - setInterval(loadUsers, 10000); // Alle 10 Sekunden aktualisieren - } - - // Stelle sicher, dass die Funktion beim Laden der Seite aufgerufen wird - window.onload = startAutoRefresh; - - - - function fetchLastRestart() { - fetch('/api/last-restart') - .then(response => response.json()) - .then(data => { - document.getElementById('bot-restart').innerText = `Letzter Neustart: ${data.lastRestart}`; - }) - .catch(error => console.error('Fehler beim Abrufen des letzten Neustarts:', error)); -} - -// Stelle sicher, dass die Funktion beim Laden des Dashboards aufgerufen wird -function loadDashboard() { - fetchBotUptime(); - fetchLastRestart(); // Hinzufügen dieser Zeile - fetchFileCheck(); - fetchServerInfo(); - document.getElementById('dashboard').style.display = 'block'; -} - - - function sendMessage() { - const message = document.getElementById('message-input').value; - const statusDiv = document.getElementById('send-message-status'); - - if (!message) { - statusDiv.innerHTML = 'Bitte gib eine Nachricht ein.'; - return; - } - - fetch('/api/send-message', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ message }), - }) - .then(response => response.json()) - .then(data => { - if (data.success) { - statusDiv.innerHTML = 'Nachricht erfolgreich gesendet!'; - } else { - statusDiv.innerHTML = `Fehler: ${data.error}`; - } - }) - .catch(error => { - console.error('Fehler beim Senden der Nachricht:', error); - statusDiv.innerHTML = 'Ein Fehler ist aufgetreten.'; - }); - } - - // Hier kann eine Funktion hinzugefügt werden, um den Abschnitt anzuzeigen - document.getElementById('send-message-link').addEventListener('click', function() { - document.getElementById('send-message').style.display = 'block'; - }); - - async function loadMediaCount() { - try { - const response = await fetch('/api/media-count'); - if (!response.ok) { - throw new Error('Netzwerkantwort war nicht ok'); - } - const data = await response.json(); - console.log('Medienanzahl-Daten:', data); // Debugging-Ausgabe - - const mediaCountContent = document.getElementById('media-count-content'); - mediaCountContent.innerHTML = ` - 📽️ Filme: ${data.movieCount}
- 📺 Serien: ${data.showCount} - `; - } catch (error) { - console.error('Fehler beim Laden der Medienanzahl:', error); - document.getElementById('media-count-content').innerHTML = 'Fehler beim Laden der Medienanzahl.'; - } - } - - document.addEventListener('DOMContentLoaded', function() { - loadMediaCount(); // Medienanzahl laden, wenn das Dashboard geladen wird - }); - - document.getElementById('create-backup').onclick = function() { - const statusDiv = document.getElementById('backup-status'); - - fetch('/api/create-backup', { - method: 'POST', - }) - .then(response => response.json()) - .then(data => { - if (data.success) { - statusDiv.innerHTML = `Backup erfolgreich erstellt: ${data.fileName}`; - loadBackups(); // Lade die Backups nach dem Erstellen - - // Blende die Meldung nach 10 Sekunden aus - setTimeout(() => { - statusDiv.innerHTML = ''; - }, 10000); // 10 Sekunden in Millisekunden - } else { - statusDiv.innerHTML = `Fehler: ${data.error}`; - } - }) - .catch(error => { - console.error('Fehler beim Erstellen des Backups:', error); - statusDiv.innerHTML = 'Ein Fehler ist aufgetreten.'; - }); - }; - - - - // Funktion zum Laden der Backups - function loadBackups() { - fetch('/api/backups') - .then(response => response.json()) - .then(data => { - const backupsDiv = document.getElementById('backups-list'); - backupsDiv.innerHTML = ''; // Leeren vorherige Inhalte - - if (data.success && data.backups.length > 0) { - data.backups.forEach(backup => { - backupsDiv.innerHTML += ` -
- ${backup.name} - ${new Date(backup.date).toLocaleString()} - Herunterladen - -
- `; - }); - - // Event Listener für die Löschen-Buttons - document.querySelectorAll('.delete-backup').forEach(button => { - button.onclick = function() { - const backupName = this.getAttribute('data-filename'); - deleteBackup(backupName); - }; - }); - } else { - backupsDiv.innerHTML = '

Keine Backups vorhanden.

'; - } - }) - .catch(error => { - console.error('Fehler beim Laden der Backups:', error); - document.getElementById('backups-list').innerHTML = '

Fehler beim Laden der Backups.

'; - }); - } - - // Funktion zum Löschen eines Backups -function deleteBackup(backupName) { - fetch('/api/delete-backup', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ backupName }) - }) - .then(response => response.json()) - .then(data => { - if (data.success) { - // Nach dem Löschen die Backups erneut laden - loadBackups(); - } else { - console.error('Fehler beim Löschen des Backups:', data.error); - } - }) - .catch(error => { - console.error('Fehler beim Löschen des Backups:', error); - }); -} - - // Automatisches Laden der Berichte alle 5 Sekunden (5000 Millisekunden) - setInterval(loadDevReports, 5000); - - -function loadDevReports() { - fetch('/api/dev-reports') // Ersetze den URL mit deinem tatsächlichen Endpunkt - .then(response => response.json()) - .then(data => { - const devReportDiv = document.getElementById('dev-report-content'); - devReportDiv.innerHTML = ''; // Vorherige Inhalte leeren - - if (data.length === 0) { - devReportDiv.innerHTML = '

Keine Entwicklerberichte vorhanden.

'; - } else { - data.forEach(report => { - const reportClass = report.type === "Bug" ? "bug" : "feature-request"; // Klasse basierend auf dem Typ auswählen - const userName = report.user.name; // Den Namen des Benutzers aus dem Bericht holen - const message = report.message; // Den Text der Nachricht holen - - devReportDiv.innerHTML += ` -
-
${report.type}
-
@${userName}
-
"${message}"
- -
- `; - }); - } - }) - .catch(error => { - console.error('Fehler beim Laden der Entwicklerberichte:', error); - document.getElementById('dev-report-content').innerHTML = '

Fehler beim Laden der Entwicklerberichte.

'; - }); -} - -function deleteDevReport(reportId) { - fetch(`/api/dev-reports?id=${reportId}`, { method: 'DELETE' }) // Verwende hier die korrekte URL mit Query-Parameter - .then(response => { - if (response.ok) { - loadDevReports(); // Berichte nach dem Löschen neu laden - } else { - console.error('Fehler beim Löschen des Berichts:', response.statusText); - } - }) - .catch(error => console.error('Fehler beim Löschen des Berichts:', error)); -} - -// Funktion zum Abrufen der FAQs -function fetchFaqs() { - fetch('/api/faqs') - .then(response => response.json()) - .then(data => { - const faqSection = document.getElementById('faq-container'); // ID anpassen - let faqText = ''; - - if (data.length === 0) { - faqText = 'Es gibt derzeit keine FAQs.'; - } else { - data.forEach((faq, index) => { - faqText += `${index + 1}. *${faq.question}*\n${faq.answer}\n\n`; - }); - } - faqSection.querySelector('pre').innerText = faqText; // Text im
-Tag setzen
-        })
-        .catch(error => console.error('Fehler beim Abrufen der FAQs:', error));
-}
-
-// Funktion zum Hinzufügen einer neuen FAQ
-function addFaq() {
-    const question = prompt('Bitte geben Sie die FAQ-Frage ein:');
-    if (question) {
-        const answer = prompt('Bitte geben Sie die Antwort ein:');
-        if (answer) {
-            fetch('/api/add-faq', {
-                method: 'POST',
-                headers: { 'Content-Type': 'application/json' },
-                body: JSON.stringify({ question, answer }),
-            })
-            .then(response => response.json())
-            .then(data => {
-                const alertBox = document.createElement('div');
-                alertBox.className = 'alert'; // Grundlegende Alert-Klasse
-
-                if (data.success) {
-                    alertBox.classList.add('success'); // Erfolgsklasse hinzufügen
-                    alertBox.innerText = '✅ FAQ erfolgreich hinzugefügt.';
-                } else {
-                    alertBox.classList.add('error'); // Fehlerklasse hinzufügen
-                    alertBox.innerText = '❌ Fehler beim Hinzufügen der FAQ.';
-                }
-
-                // Füge die Alert-Meldung zum FAQ-Bereich hinzu
-                document.getElementById('faq-container').appendChild(alertBox);
-                alertBox.style.display = 'block'; // Zeige die Meldung an
-
-                // Nach einer kurzen Zeit die Meldung ausblenden
-                setTimeout(() => {
-                    alertBox.style.display = 'none';
-                }, 5000); // 5 Sekunden warten, dann ausblenden
-
-                fetchFaqs(); // FAQs neu laden
-            })
-            .catch(error => {
-                const alertBox = document.createElement('div');
-                alertBox.className = 'alert error'; // Fehlerklasse hinzufügen
-                alertBox.innerText = '❌ Fehler beim Hinzufügen der FAQ.';
-                document.getElementById('faq-container').appendChild(alertBox);
-                alertBox.style.display = 'block'; // Zeige die Fehlermeldung an
-
-                // Nach einer kurzen Zeit die Meldung ausblenden
-                setTimeout(() => {
-                    alertBox.style.display = 'none';
-                }, 5000); // 5 Sekunden warten, dann ausblenden
-
-                console.error('Fehler beim Hinzufügen der FAQ:', error);
-            });
-        }
-    }
-}
-
-// Funktion zum Löschen einer FAQ
-function deleteFaq() {
-    fetch('/api/faqs')
-        .then(response => response.json())
-        .then(data => {
-            if (data.length === 0) {
-                alert('Es gibt derzeit keine FAQs zum Löschen.');
-                return;
-            }
-
-            let faqText = 'Welche FAQ möchten Sie löschen?\n\n';
-            data.forEach((faq, index) => {
-                faqText += `${index + 1}. *${faq.question}*\n`;
-            });
-
-            const faqIndex = prompt(faqText);
-            const index = parseInt(faqIndex, 10) - 1;
-
-            if (index >= 0 && index < data.length) {
-                fetch('/api/delete-faq', {
-                    method: 'DELETE',
-                    headers: { 'Content-Type': 'application/json' },
-                    body: JSON.stringify({ index }),
-                })
-                .then(response => response.json())
-                .then(data => {
-                    if (data.success) {
-                        alert('✅ FAQ erfolgreich gelöscht.');
-                        fetchFaqs(); // FAQs neu laden
-                    } else {
-                        alert('❌ Fehler beim Löschen der FAQ.');
-                    }
-                })
-                .catch(error => console.error('Fehler beim Löschen der FAQ:', error));
-            } else {
-                alert('❌ Ungültige Auswahl.');
-            }
-        })
-        .catch(error => console.error('Fehler beim Abrufen der FAQs:', error));
-}
-
-// Darkmode umschalten
-const toggle = document.getElementById('dark-mode-toggle');
-
-// Darkmode-Zustand beim Laden der Seite überprüfen und anwenden
-const darkModeEnabled = localStorage.getItem('darkMode') === 'true';
-toggle.checked = darkModeEnabled;
-if (darkModeEnabled) {
-    document.body.classList.add('dark-mode');
-}
-
-toggle.addEventListener('change', () => {
-    const isChecked = toggle.checked;
-    document.body.classList.toggle('dark-mode', isChecked);
-    // Speichere den Zustand in localStorage
-    localStorage.setItem('darkMode', isChecked);
+document.addEventListener("DOMContentLoaded", function() {
+    const savedPassword = localStorage.getItem("adminPassword");
+    const loginForm = document.getElementById("login-form");
+    const adminArea = document.getElementById("admin-area");
+    const sidebar = document.getElementById("sidebar");
+    const errorMessage = document.getElementById("error-message");
+    const passwordInput = document.querySelector("input[name='password']");
+    const timerDisplay = document.getElementById('logout-timer'); // Logout-Timer Element
+
+    let inactivityTimeout;
+    let logoutTimerInterval; // Variable für den Timer-Interval
+    let timeRemaining = 5 * 60 * 1000; // 5 Minuten in Millisekunden
+
+    function resetInactivityTimer() {
+        clearTimeout(inactivityTimeout);
+        clearInterval(logoutTimerInterval); // Timer-Interval zurücksetzen
+        timeRemaining = 5 * 60 * 1000; // Reset des verbleibenden Zeitlimits
+        startLogoutTimer(); // Timer neu starten
+
+        inactivityTimeout = setTimeout(() => {
+            logout();  // Automatischer Logout nach Inaktivität
+        }, 5 * 60 * 1000); // 5 Minuten Timeout
+    }
+
+    // Überprüfen, ob ein Passwort gespeichert ist
+    if (savedPassword) {
+        loginForm.style.display = 'none';
+        adminArea.style.display = 'block';
+        sidebar.style.display = 'block';
+        timerDisplay.style.display = 'block'; // Timer anzeigen, wenn eingeloggt
+        loadDashboard();
+        resetInactivityTimer();  // Timer bei Start setzen
+        startLogoutTimer(); // Starte den Timer, wenn der Benutzer eingeloggt ist
+    } else {
+        // Standardmäßig den Timer ausblenden, wenn der Benutzer nicht eingeloggt ist
+        timerDisplay.style.display = 'none';
+    }
+
+    // Holen Sie sich das Passwort und die letzten 3 Passwörter von der API
+    fetch('/api/admin-password')
+        .then(response => response.json())
+        .then(data => {
+            const correctPassword = data.password;
+            const passwordChangeRequired = data.passwordChangeRequired; // Passwortänderung erforderlich
+            const lastThreePasswords = data.lastThreePasswords || []; // Letzte 3 Passwörter
+
+            // Wenn Passwortänderung erforderlich ist, blockiere den Login
+            if (passwordChangeRequired) {
+                errorMessage.textContent = "⚠️ Das Passwort muss geändert werden, bevor ein Login möglich ist.";
+                errorMessage.style.display = 'block';
+                loginForm.style.display = 'none'; // Verhindere den Login
+                return;
+            }
+
+            document.getElementById("form").onsubmit = function(event) {
+                event.preventDefault();
+                const password = event.target.password.value;
+
+                if (password === correctPassword) {
+                    localStorage.setItem("adminPassword", password);
+                    loginForm.style.display = 'none';
+                    adminArea.style.display = 'block';
+                    sidebar.style.display = 'block';
+                    timerDisplay.style.display = 'block'; // Timer anzeigen, wenn eingeloggt
+                    errorMessage.style.display = 'none';
+                    loadDashboard();
+                    resetInactivityTimer();
+                } else {
+                    // Passwortfeld verstecken und Fehlermeldung anstelle des Passwortfelds anzeigen
+                    passwordInput.style.display = 'none';
+                    errorMessage.style.display = 'block';
+
+                    // Nach 3 Sekunden das Passwortfeld wieder anzeigen und Fehlermeldung ausblenden
+                    setTimeout(() => {
+                        passwordInput.style.display = 'block';
+                        errorMessage.style.display = 'none';
+                        passwordInput.value = '';  // Passwortfeld leeren
+                    }, 3000); // 3 Sekunden Timeout
+                }
+            };
+        })
+        .catch(error => {
+            console.error('Fehler beim Abrufen des Passworts:', error);
+            errorMessage.textContent = 'Fehler beim Laden des Passworts.';
+            errorMessage.style.display = 'block';
+        });
+
+    // Passwortänderungsfunktion mit Überprüfung der letzten 3 Passwörter
+    window.changePassword = function(newPassword) {
+        fetch('/api/change-password', {
+            method: 'POST',
+            headers: {
+                'Content-Type': 'application/json',
+            },
+            body: JSON.stringify({ newPassword }),
+        })
+        .then(response => response.json())
+        .then(data => {
+            const lastThreePasswords = data.lastThreePasswords || [];
+
+            // Prüfen, ob das neue Passwort in den letzten 3 Passwörtern enthalten ist
+            if (lastThreePasswords.includes(newPassword)) {
+                alert("⚠️ Das neue Passwort darf nicht eines der letzten 3 verwendeten Passwörter sein.");
+                return;
+            }
+
+            // Passwort ändern und aktualisieren
+            fetch('/api/update-password', {
+                method: 'POST',
+                headers: {
+                    'Content-Type': 'application/json',
+                },
+                body: JSON.stringify({ newPassword }),
+            })
+            .then(() => {
+                alert("✅ Passwort erfolgreich geändert.");
+                localStorage.setItem("adminPassword", newPassword); // Neues Passwort speichern
+                location.reload(); // Seite neu laden, um das neue Passwort zu aktivieren
+            })
+            .catch(error => {
+                console.error('Fehler beim Ändern des Passworts:', error);
+                alert("❌ Fehler beim Ändern des Passworts.");
+            });
+        })
+        .catch(error => {
+            console.error('Fehler beim Überprüfen des Passworts:', error);
+        });
+    };
+
+    window.logout = function() {
+        localStorage.removeItem("adminPassword");
+        adminArea.style.display = 'none';
+        loginForm.style.display = 'block';
+        sidebar.style.display = 'none';
+        timerDisplay.style.display = 'none'; // Timer ausblenden beim Logout
+        
+        // Login-Seite neu laden
+        location.reload();
+    };
+
+    // Events, die Inaktivität verhindern: Mausbewegung, Tastatureingabe, etc.
+    window.addEventListener('mousemove', resetInactivityTimer);
+    window.addEventListener('keydown', resetInactivityTimer);
+    window.addEventListener('click', resetInactivityTimer);
+
+    // Timer-Funktion für den automatischen Logout
+    function startLogoutTimer() {
+        logoutTimerInterval = setInterval(() => {
+            const minutes = Math.floor((timeRemaining / 1000 / 60) % 60);
+            const seconds = Math.floor((timeRemaining / 1000) % 60);
+            
+            timerDisplay.textContent = `Automatischer Logout in: ${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
+            
+            timeRemaining -= 1000; // Jede Sekunde 1000ms abziehen
+            
+            if (timeRemaining < 0) {
+                clearInterval(logoutTimerInterval);
+                logout(); // Führe Logout-Funktion aus
+            }
+        }, 1000);
+    }
+
+
+
+
+            document.getElementById('dashboard-link').onclick = function() {
+                document.getElementById('dashboard').style.display = 'block';
+                document.getElementById('logs').style.display = 'none';
+                document.getElementById('wishes').style.display = 'none'; // Wünsche ausblenden
+                document.getElementById('feedback').style.display = 'none'; // Feedback ausblenden
+                document.getElementById('users').style.display = 'none';
+                document.getElementById('admin-help').style.display = 'none';
+                document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden
+                document.getElementById('send-message').style.display = 'none'; // Send Message ausblenden
+                document.getElementById('backups').style.display = 'none';
+                document.getElementById('dev-report').style.display = 'none';
+            };
+
+            document.getElementById('logs-link').onclick = function() {
+                document.getElementById('dashboard').style.display = 'none';
+                document.getElementById('logs').style.display = 'block';
+                document.getElementById('wishes').style.display = 'none'; // Wünsche ausblenden
+                document.getElementById('feedback').style.display = 'none'; // Feedback ausblenden
+                loadLogs(); // Logs laden, wenn der Bereich angezeigt wird
+                document.getElementById('users').style.display = 'none';
+                document.getElementById('admin-help').style.display = 'none';
+                document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden
+                document.getElementById('send-message').style.display = 'none'; // Send Message ausblenden
+                document.getElementById('backups').style.display = 'none';
+                document.getElementById('dev-report').style.display = 'none';
+            };
+
+            document.getElementById('wishes-link').onclick = function() {
+                document.getElementById('dashboard').style.display = 'none';
+                document.getElementById('logs').style.display = 'none';
+                document.getElementById('wishes').style.display = 'block'; // Wünsche anzeigen
+                loadWishes(); // Offene Wünsche laden, wenn der Bereich angezeigt wird
+                document.getElementById('users').style.display = 'none';
+                document.getElementById('feedback').style.display = 'none';
+                document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden
+                document.getElementById('admin-help').style.display = 'none';
+                document.getElementById('send-message').style.display = 'none'; // Send Message ausblenden
+                document.getElementById('backups').style.display = 'none';
+                document.getElementById('dev-report').style.display = 'none';
+            };
+
+            document.getElementById('feedback-link').onclick = function() {
+                document.getElementById('dashboard').style.display = 'none';
+                document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden
+                document.getElementById('logs').style.display = 'none';
+                document.getElementById('wishes').style.display = 'none'; // Wünsche ausblenden
+                document.getElementById('feedback').style.display = 'block'; // Feedback anzeigen
+                loadFeedback(); // Feedback laden, wenn der Bereich angezeigt wird
+                document.getElementById('users').style.display = 'none';
+                document.getElementById('admin-help').style.display = 'none';
+                document.getElementById('send-message').style.display = 'none'; // Send Message ausblenden
+                document.getElementById('backups').style.display = 'none';
+                document.getElementById('dev-report').style.display = 'none';
+            };
+
+            document.getElementById('admin-help-link').onclick = function() {
+                document.getElementById('dashboard').style.display = 'none';
+                document.getElementById('logs').style.display = 'none';
+                document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden
+                document.getElementById('wishes').style.display = 'none'; // Wünsche ausblenden
+                document.getElementById('feedback').style.display = 'none'; // Feedback ausblenden
+                document.getElementById('admin-help').style.display = 'block'; // Admin Hilfe anzeigen
+                document.getElementById('users').style.display = 'none';
+                document.getElementById('send-message').style.display = 'none'; // Send Message ausblenden
+                document.getElementById('backups').style.display = 'none';
+                document.getElementById('dev-report').style.display = 'none';
+            };
+
+            document.getElementById('users-link').onclick = function() {
+                document.getElementById('dashboard').style.display = 'none';
+                document.getElementById('logs').style.display = 'none';
+                document.getElementById('wishes').style.display = 'none';
+                document.getElementById('feedback').style.display = 'none';
+                document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden
+                document.getElementById('users').style.display = 'block';
+                loadUsers(); // Benutzer laden, wenn der Bereich angezeigt wird
+                document.getElementById('admin-help').style.display = 'none';
+                document.getElementById('send-message').style.display = 'none'; 
+                document.getElementById('dev-report').style.display = 'none';
+                document.getElementById('backups').style.display = 'none';
+            };
+
+            // Send Message Link
+            document.getElementById('send-message-link').onclick = function() {
+                document.getElementById('dashboard').style.display = 'none';
+                document.getElementById('logs').style.display = 'none';
+                document.getElementById('wishes').style.display = 'none';
+                document.getElementById('feedback').style.display = 'none';
+                document.getElementById('users').style.display = 'none';
+                document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden
+                document.getElementById('admin-help').style.display = 'none';
+                document.getElementById('send-message').style.display = 'block'; // Send Message anzeigen
+                document.getElementById('dev-report').style.display = 'none';
+                document.getElementById('backups').style.display = 'none';
+            };
+
+            document.getElementById('backups-link').onclick = function() {
+                document.getElementById('dashboard').style.display = 'none';
+                document.getElementById('logs').style.display = 'none';
+                document.getElementById('wishes').style.display = 'none';
+                document.getElementById('feedback').style.display = 'none';
+                document.getElementById('users').style.display = 'none';
+                document.getElementById('admin-help').style.display = 'none';
+                document.getElementById('send-message').style.display = 'none';
+                document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden
+                document.getElementById('dev-report').style.display = 'none';
+                document.getElementById('backups').style.display = 'block'; // Backups anzeigen
+                loadBackups(); // Backups laden, wenn der Bereich angezeigt wird
+            };
+
+            document.getElementById('dev-report-link').onclick = function() {
+                document.getElementById('dashboard').style.display = 'none';
+                document.getElementById('logs').style.display = 'none';
+                document.getElementById('wishes').style.display = 'none';
+                document.getElementById('faq-container').style.display = 'none'; // FAQ-Bereich ausblenden
+                document.getElementById('users').style.display = 'none';
+                document.getElementById('feedback').style.display = 'none';
+                document.getElementById('admin-help').style.display = 'none';
+                document.getElementById('send-message').style.display = 'none'; // Send Message ausblenden
+                document.getElementById('backups').style.display = 'none';
+                document.getElementById('dev-report').style.display = 'block'; // Dev Report anzeigen
+                loadDevReports(); // Dev Reports laden, wenn der Bereich angezeigt wird
+            };
+
+            document.getElementById('faq-link').onclick = function() {
+                document.getElementById('dashboard').style.display = 'none';
+                document.getElementById('logs').style.display = 'none';
+                document.getElementById('wishes').style.display = 'none';
+                document.getElementById('feedback').style.display = 'none';
+                document.getElementById('faq-container').style.display = 'block'; // FAQ-Bereich anzeigen
+                document.getElementById('users').style.display = 'none';
+                document.getElementById('admin-help').style.display = 'none';
+                document.getElementById('send-message').style.display = 'none';
+                document.getElementById('backups').style.display = 'none';
+                document.getElementById('dev-report').style.display = 'none';
+                fetchFaqs(); // FAQs laden, wenn der Bereich angezeigt wird
+            };
+
+        });
+
+        function loadDashboard() {
+            fetchBotUptime();
+            fetchFileCheck();
+            fetchServerInfo();
+            document.getElementById('dashboard').style.display = 'block';
+        }
+    
+        function loadLogs() {
+            fetchCommandHistory();
+            fetchErrorLog();
+        }
+        // Funktion zum Laden der Wünsche
+        function loadWishes() {
+            fetch('/api/wishes') // Endpoint für offene Wünsche
+                .then(response => response.json())
+                .then(data => {
+                    const wishesDiv = document.getElementById('wishes-content');
+                    wishesDiv.innerHTML = ''; // Vorherige Inhalte leeren
+                    if (data.length === 0) {
+                        wishesDiv.innerHTML = '

Keine offenen Wünsche vorhanden.

'; + } else { + data.forEach((wish) => { + wishesDiv.innerHTML += ` +
+
${wish.message}
+
+ `; + }); + } + }) + .catch(error => { + console.error('Fehler beim Laden der Wünsche:', error); + document.getElementById('wishes-content').innerHTML = '

Fehler beim Laden der Wünsche.

'; + }); + } + + // Automatisches Aktualisieren des Wunsch alle 10 Sekunden + setInterval(() => { + loadWishes(); + }, 10000); // 10 Sekunden (10000 Millisekunden) + + + // Funktion zum Laden des Feedbacks + function loadFeedback() { + fetch('/api/feedback') + .then(response => response.text()) + .then(data => { + const feedbackDiv = document.getElementById('feedback-content'); + feedbackDiv.innerHTML = ''; // Vorherige Inhalte leeren + + const feedbackLines = data.split('\n'); + feedbackLines.slice(1).forEach((line) => { // Ignoriere die erste Zeile + if (line.trim()) { + const feedbackMessage = line.split(' - ')[1]; // Nur den Feedback-Teil extrahieren + feedbackDiv.innerHTML += ` + + `; + } + }); + + if (feedbackLines.length <= 1) { // Überprüfen, ob nur die erste Zeile vorhanden ist + feedbackDiv.innerHTML = '

Kein Feedback vorhanden.

'; + } + }) + .catch(error => { + console.error('Fehler beim Laden des Feedbacks:', error); + document.getElementById('feedback-content').innerHTML = '

Fehler beim Laden des Feedbacks.

'; + }); + } + + // Automatisches Aktualisieren des Feedbacks alle 10 Sekunden + setInterval(() => { + loadFeedback(); + }, 10000); // 10 Sekunden (10000 Millisekunden) + + + function fetchBotUptime() { + fetch('/api/bot-uptime') + .then(response => response.json()) + .then(data => { + document.getElementById('bot-uptime').innerText = `Aktuelle Laufzeit des Bots: ${data.runtime}`; + }) + .catch(error => console.error('Fehler beim Abrufen der Bot-Laufzeit:', error)); + } + + // Funktion, um die Bot-Laufzeit regelmäßig zu aktualisieren + function startUptimeUpdate() { + fetchBotUptime(); // Initialen Aufruf + setInterval(fetchBotUptime, 1000); // Alle 5 Sekunden aktualisieren + } + + // Aufruf der Startfunktion, wenn das Admin-Dashboard geladen wird + document.addEventListener("DOMContentLoaded", function() { + startUptimeUpdate(); + }); + + function fetchFileCheck() { + fetch('/api/file-check') + .then(response => response.json()) + .then(data => { + const fileCheckDiv = document.getElementById('file-check'); + fileCheckDiv.innerHTML = '

Dateiüberprüfung:

'; + data.forEach(file => { + fileCheckDiv.innerHTML += `

${file.exists ? '✅' : '❌'} Datei ${file.file} ${file.exists ? 'ist vorhanden.' : 'fehlt.'}

`; + }); + }) + .catch(error => console.error('Fehler beim Abrufen der Dateiüberprüfung:', error)); + } + + // Automatisches Abrufen der Dateiüberprüfung alle 10 Sekunden + setInterval(fetchFileCheck, 10000); + + // Optional: Einmaliges Abrufen, wenn die Seite geladen wird + window.onload = fetchFileCheck; + + function fetchServerInfo() { + fetch('/api/server-info') + .then(response => response.json()) + .then(data => { + document.getElementById('server-info').innerHTML = ` +

Server-Informationen:

+

Plattform: ${data.platform}

+

Architektur: ${data.architecture}

+

Gesamter Speicher: ${data.totalMemory} GB

+

Freier Speicher: ${data.freeMemory} GB

+ `; + }) + .catch(error => console.error('Fehler beim Abrufen der Serverinformationen:', error)); + } + + // Funktion zum Abrufen des Fehlerprotokolls +function fetchErrorLog() { + fetch('/api/error-log') + .then(response => response.text()) + .then(data => { + document.getElementById('error-log').querySelector('pre').innerText = data; + }) + .catch(error => console.error('Fehler beim Abrufen des Fehlerprotokolls:', error)); +} + +let errorNotified = false; // Variable, um den Status der Benachrichtigung zu verfolgen + +// Funktion zum Überprüfen des error.log +function checkErrorLog() { + const savedPassword = localStorage.getItem("adminPassword"); // Überprüfen, ob der Benutzer eingeloggt ist + + if (!savedPassword) return; // Beende die Funktion, wenn der Benutzer nicht eingeloggt ist + + fetch('/api/error-log') + .then(response => response.text()) + .then(data => { + const welcomeBox = document.querySelector('.welcome-box'); + + // Überprüfe, ob Fehler im Log vorhanden sind + if (data && data.trim().length > 0) { + if (!errorNotified) { // Nur Benachrichtigung anzeigen, wenn sie noch nicht angezeigt wird + welcomeBox.innerHTML += ` +
+ Fehler erkannt! Bitte überprüfen Sie das Fehlerprotokoll. +
+ `; + errorNotified = true; // Status aktualisieren + } + } else { + // Fehler-Meldung entfernen, wenn kein Fehler mehr vorhanden ist + const errorNotification = document.getElementById('error-notification'); + if (errorNotification) { + errorNotification.remove(); + errorNotified = false; // Status zurücksetzen + } + } + }) + .catch(error => { + console.error('Fehler beim Abrufen des Fehlerprotokolls:', error); + }); +} + +// Regelmäßige Überprüfung alle 10 Sekunden +setInterval(checkErrorLog, 10000); // Alle 10 Sekunden + + +// Funktion zum Abrufen der Kommando-Historie +function fetchCommandHistory() { + fetch('/api/command-history') + .then(response => response.text()) + .then(data => { + document.getElementById('command-history').querySelector('pre').innerText = data; + }) + .catch(error => console.error('Fehler beim Abrufen der Kommando-Historie:', error)); +} + +// Funktion zum Herunterladen des Error Logs +function downloadErrorLog() { + fetch('/api/error-log') + .then(response => response.text()) + .then(data => { + const blob = new Blob([data], { type: 'text/plain' }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'error_log.txt'; // Dateiname + a.click(); + window.URL.revokeObjectURL(url); + }) + .catch(error => console.error('Fehler beim Herunterladen des Fehlerprotokolls:', error)); +} + +// Funktion zum Herunterladen der Kommando-Historie +function downloadCommandHistory() { + fetch('/api/command-history') + .then(response => response.text()) + .then(data => { + const blob = new Blob([data], { type: 'text/plain' }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'command_history.txt'; // Dateiname + a.click(); + window.URL.revokeObjectURL(url); + }) + .catch(error => console.error('Fehler beim Herunterladen der Kommando-Historie:', error)); +} + +// Funktion zum Löschen des Fehlerprotokolls +function deleteErrorLog() { + if (confirm('Möchten Sie das komplette Fehlerprotokoll wirklich löschen?')) { + fetch('/api/clear-error-log', { + method: 'POST', // Ändere DELETE zu POST + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + alert('Fehlerprotokoll erfolgreich gelöscht.'); + fetchErrorLog(); // Log-Datei neu laden + } else { + alert('Fehler beim Löschen des Fehlerprotokolls.'); + } + }) + .catch(error => console.error('Fehler beim Löschen des Fehlerprotokolls:', error)); + } +} + +// Funktion zum Löschen der Kommando-Historie +function deleteCommandHistory() { + if (confirm('Möchten Sie die gesamte Kommando-Historie wirklich löschen?')) { + fetch('/api/clear-command-history', { + method: 'POST', // Ändere DELETE zu POST + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + alert('Kommando-Historie erfolgreich gelöscht.'); + fetchCommandHistory(); // Command-Historie neu laden + } else { + alert('Fehler beim Löschen der Kommando-Historie.'); + } + }) + .catch(error => console.error('Fehler beim Löschen der Kommando-Historie:', error)); + } +} + + +// Automatisches Aktualisieren alle 10 Sekunden +setInterval(() => { + fetchErrorLog(); + fetchCommandHistory(); +}, 10000); // 10 Sekunden (10000 Millisekunden) + + + + // Funktion zum Abfragen des Debug-Status + function checkDebugStatus() { + fetch('/api/debug-status') + .then(response => response.json()) + .then(data => { + if (data.debugMode) { + showDebugMessage(); // Zeige die Debug-Meldung, wenn Debug aktiviert ist + updateDebugButton(true); // Aktualisiere den Button + } else { + hideDebugMessage(); // Verstecke die Debug-Meldung, wenn Debug deaktiviert ist + updateDebugButton(false); // Aktualisiere den Button + } + }) + .catch(error => { + console.error('Fehler beim Abfragen des Debug-Status:', error); + }); + } + + // Funktion zur Aktualisierung des Debug-Toggle-Buttons + function updateDebugButton(isDebugActive) { + const debugButton = document.getElementById('debug-button'); + + if (isDebugActive) { + debugButton.textContent = 'Debug ON'; + debugButton.style.backgroundColor = 'red'; // Rot für aktiviert + } else { + debugButton.textContent = 'Debug OFF'; + debugButton.style.backgroundColor = 'green'; // Grün für deaktiviert + } + } + + // Setze ein Intervall, um den Debug-Status alle 5 Sekunden zu überprüfen + setInterval(checkDebugStatus, 5000); + + // Debug-Meldung anzeigen + function showDebugMessage() { + let debugBox = document.getElementById('debug-message-box'); + + if (!debugBox) { + debugBox = document.createElement('div'); + debugBox.id = 'debug-message-box'; + debugBox.textContent = 'Debug-Modus aktiviert'; + debugBox.style.position = 'fixed'; + debugBox.style.top = '20px'; + debugBox.style.right = '20px'; + debugBox.style.backgroundColor = 'orange'; + debugBox.style.color = 'white'; + debugBox.style.padding = '10px 20px'; + debugBox.style.borderRadius = '5px'; + debugBox.style.zIndex = '1000'; + document.body.appendChild(debugBox); + } + } + + // Debug-Meldung verstecken + function hideDebugMessage() { + const debugBox = document.getElementById('debug-message-box'); + if (debugBox) { + debugBox.remove(); + } + } + + // Seite initial mit dem aktuellen Debug-Status laden + checkDebugStatus(); + + // Funktion zum Umschalten des Debug-Modus + function toggleDebugMode() { + const debugButton = document.getElementById('debug-button'); + const isDebugActive = debugButton.textContent === 'Debug ON'; + + fetch('/api/toggle-debug', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ debugMode: !isDebugActive }) + }) + .then(response => response.json()) + .then(data => { + updateDebugButton(data.debugMode); // Aktualisiere den Button nach der Rückmeldung des Servers + }) + .catch(error => { + console.error('Fehler beim Umschalten des Debug-Modus:', error); + }); + } + + + // Funktion zum Laden der Benutzerinformationen + function loadUsers() { + fetch('/api/users') // API-Endpunkt für Benutzerinformationen + .then(response => response.json()) + .then(data => { + const usersDiv = document.getElementById('users-content'); + usersDiv.innerHTML = ''; // Vorherige Inhalte leeren + + if (data.length === 0) { + usersDiv.innerHTML = '

Keine Benutzer vorhanden.

'; + } else { + data.forEach((user, index) => { + // Bestimme die Klasse basierend auf der Index-Position + const className = index % 2 === 0 ? 'even' : 'odd'; // Klassen für gerade und ungerade Indizes + + usersDiv.innerHTML += ` +
+

Benutzername: ${user.username}

+

Benachrichtigungen: ${user.notifications ? 'Aktiviert' : 'Deaktiviert'}

+

Erstnutzung: ${user.firstUsed}

+

Lieblingsgenre: ${user.favoriteGenre || 'Nicht festgelegt'}

+

Befehlsanzahl: ${user.commandCount}

+

Benutzerlevel: ${user.userLevel}

+ +
+
+ `; + }); + + // Event Listener für die Lösch-Buttons + document.querySelectorAll('.delete-user').forEach(button => { + button.onclick = function() { + const userId = this.getAttribute('data-user-id'); + deleteUser(userId); + }; + }); + } + }) + .catch(error => { + console.error('Fehler beim Laden der Benutzer:', error); + document.getElementById('users-content').innerHTML = '

Fehler beim Laden der Benutzerinformationen.

'; + }); + } + + // Funktion zum Löschen eines Benutzers + function deleteUser(userId) { + if (confirm('Möchtest du diesen Benutzer wirklich löschen?')) { + fetch(`/api/users/${userId}`, { + method: 'DELETE', + }) + .then(response => response.json()) + .then(data => { + alert(data.message); + loadUsers(); // Nach dem Löschen die Benutzerliste neu laden + }) + .catch(error => { + console.error('Fehler beim Löschen des Benutzers:', error); + alert('Fehler beim Löschen des Benutzers.'); + }); + } + } + + // Funktion zum Starten der automatischen Aktualisierung + function startAutoRefresh() { + loadUsers(); // Einmaliges Laden der Benutzer beim Start + setInterval(loadUsers, 10000); // Alle 10 Sekunden aktualisieren + } + + // Stelle sicher, dass die Funktion beim Laden der Seite aufgerufen wird + window.onload = startAutoRefresh; + + + + function fetchLastRestart() { + fetch('/api/last-restart') + .then(response => response.json()) + .then(data => { + document.getElementById('bot-restart').innerText = `Letzter Neustart: ${data.lastRestart}`; + }) + .catch(error => console.error('Fehler beim Abrufen des letzten Neustarts:', error)); +} + +// Stelle sicher, dass die Funktion beim Laden des Dashboards aufgerufen wird +function loadDashboard() { + fetchBotUptime(); + fetchLastRestart(); // Hinzufügen dieser Zeile + fetchFileCheck(); + fetchServerInfo(); + document.getElementById('dashboard').style.display = 'block'; +} + + + function sendMessage() { + const message = document.getElementById('message-input').value; + const statusDiv = document.getElementById('send-message-status'); + + if (!message) { + statusDiv.innerHTML = 'Bitte gib eine Nachricht ein.'; + return; + } + + fetch('/api/send-message', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ message }), + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + statusDiv.innerHTML = 'Nachricht erfolgreich gesendet!'; + } else { + statusDiv.innerHTML = `Fehler: ${data.error}`; + } + }) + .catch(error => { + console.error('Fehler beim Senden der Nachricht:', error); + statusDiv.innerHTML = 'Ein Fehler ist aufgetreten.'; + }); + } + + // Hier kann eine Funktion hinzugefügt werden, um den Abschnitt anzuzeigen + document.getElementById('send-message-link').addEventListener('click', function() { + document.getElementById('send-message').style.display = 'block'; + }); + + async function loadMediaCount() { + try { + const response = await fetch('/api/media-count'); + if (!response.ok) { + throw new Error('Netzwerkantwort war nicht ok'); + } + const data = await response.json(); + console.log('Medienanzahl-Daten:', data); // Debugging-Ausgabe + + const mediaCountContent = document.getElementById('media-count-content'); + mediaCountContent.innerHTML = ` + 📽️ Filme: ${data.movieCount}
+ 📺 Serien: ${data.showCount} + `; + } catch (error) { + console.error('Fehler beim Laden der Medienanzahl:', error); + document.getElementById('media-count-content').innerHTML = 'Fehler beim Laden der Medienanzahl.'; + } + } + + document.addEventListener('DOMContentLoaded', function() { + loadMediaCount(); // Medienanzahl laden, wenn das Dashboard geladen wird + }); + + document.getElementById('create-backup').onclick = function() { + const statusDiv = document.getElementById('backup-status'); + + fetch('/api/create-backup', { + method: 'POST', + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + statusDiv.innerHTML = `Backup erfolgreich erstellt: ${data.fileName}`; + loadBackups(); // Lade die Backups nach dem Erstellen + + // Blende die Meldung nach 10 Sekunden aus + setTimeout(() => { + statusDiv.innerHTML = ''; + }, 10000); // 10 Sekunden in Millisekunden + } else { + statusDiv.innerHTML = `Fehler: ${data.error}`; + } + }) + .catch(error => { + console.error('Fehler beim Erstellen des Backups:', error); + statusDiv.innerHTML = 'Ein Fehler ist aufgetreten.'; + }); + }; + + + + // Funktion zum Laden der Backups + function loadBackups() { + fetch('/api/backups') + .then(response => response.json()) + .then(data => { + const backupsDiv = document.getElementById('backups-list'); + backupsDiv.innerHTML = ''; // Leeren vorherige Inhalte + + if (data.success && data.backups.length > 0) { + data.backups.forEach(backup => { + backupsDiv.innerHTML += ` +
+ ${backup.name} - ${new Date(backup.date).toLocaleString()} + Herunterladen + +
+ `; + }); + + // Event Listener für die Löschen-Buttons + document.querySelectorAll('.delete-backup').forEach(button => { + button.onclick = function() { + const backupName = this.getAttribute('data-filename'); + deleteBackup(backupName); + }; + }); + } else { + backupsDiv.innerHTML = '

Keine Backups vorhanden.

'; + } + }) + .catch(error => { + console.error('Fehler beim Laden der Backups:', error); + document.getElementById('backups-list').innerHTML = '

Fehler beim Laden der Backups.

'; + }); + } + + // Funktion zum Löschen eines Backups +function deleteBackup(backupName) { + fetch('/api/delete-backup', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ backupName }) + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + // Nach dem Löschen die Backups erneut laden + loadBackups(); + } else { + console.error('Fehler beim Löschen des Backups:', data.error); + } + }) + .catch(error => { + console.error('Fehler beim Löschen des Backups:', error); + }); +} + + // Automatisches Laden der Berichte alle 5 Sekunden (5000 Millisekunden) + setInterval(loadDevReports, 5000); + + +function loadDevReports() { + fetch('/api/dev-reports') // Ersetze den URL mit deinem tatsächlichen Endpunkt + .then(response => response.json()) + .then(data => { + const devReportDiv = document.getElementById('dev-report-content'); + devReportDiv.innerHTML = ''; // Vorherige Inhalte leeren + + if (data.length === 0) { + devReportDiv.innerHTML = '

Keine Entwicklerberichte vorhanden.

'; + } else { + data.forEach(report => { + const reportClass = report.type === "Bug" ? "bug" : "feature-request"; // Klasse basierend auf dem Typ auswählen + const userName = report.user.name; // Den Namen des Benutzers aus dem Bericht holen + const message = report.message; // Den Text der Nachricht holen + + devReportDiv.innerHTML += ` +
+
${report.type}
+
@${userName}
+
"${message}"
+ +
+ `; + }); + } + }) + .catch(error => { + console.error('Fehler beim Laden der Entwicklerberichte:', error); + document.getElementById('dev-report-content').innerHTML = '

Fehler beim Laden der Entwicklerberichte.

'; + }); +} + +function deleteDevReport(reportId) { + fetch(`/api/dev-reports?id=${reportId}`, { method: 'DELETE' }) // Verwende hier die korrekte URL mit Query-Parameter + .then(response => { + if (response.ok) { + loadDevReports(); // Berichte nach dem Löschen neu laden + } else { + console.error('Fehler beim Löschen des Berichts:', response.statusText); + } + }) + .catch(error => console.error('Fehler beim Löschen des Berichts:', error)); +} + +// Funktion zum Abrufen der FAQs +function fetchFaqs() { + fetch('/api/faqs') + .then(response => response.json()) + .then(data => { + const faqSection = document.getElementById('faq-container'); // ID anpassen + let faqText = ''; + + if (data.length === 0) { + faqText = 'Es gibt derzeit keine FAQs.'; + } else { + data.forEach((faq, index) => { + faqText += `${index + 1}. *${faq.question}*\n${faq.answer}\n\n`; + }); + } + faqSection.querySelector('pre').innerText = faqText; // Text im
-Tag setzen
+        })
+        .catch(error => console.error('Fehler beim Abrufen der FAQs:', error));
+}
+
+// Funktion zum Hinzufügen einer neuen FAQ
+function addFaq() {
+    const question = prompt('Bitte geben Sie die FAQ-Frage ein:');
+    if (question) {
+        const answer = prompt('Bitte geben Sie die Antwort ein:');
+        if (answer) {
+            fetch('/api/add-faq', {
+                method: 'POST',
+                headers: { 'Content-Type': 'application/json' },
+                body: JSON.stringify({ question, answer }),
+            })
+            .then(response => response.json())
+            .then(data => {
+                const alertBox = document.createElement('div');
+                alertBox.className = 'alert'; // Grundlegende Alert-Klasse
+
+                if (data.success) {
+                    alertBox.classList.add('success'); // Erfolgsklasse hinzufügen
+                    alertBox.innerText = '✅ FAQ erfolgreich hinzugefügt.';
+                } else {
+                    alertBox.classList.add('error'); // Fehlerklasse hinzufügen
+                    alertBox.innerText = '❌ Fehler beim Hinzufügen der FAQ.';
+                }
+
+                // Füge die Alert-Meldung zum FAQ-Bereich hinzu
+                document.getElementById('faq-container').appendChild(alertBox);
+                alertBox.style.display = 'block'; // Zeige die Meldung an
+
+                // Nach einer kurzen Zeit die Meldung ausblenden
+                setTimeout(() => {
+                    alertBox.style.display = 'none';
+                }, 5000); // 5 Sekunden warten, dann ausblenden
+
+                fetchFaqs(); // FAQs neu laden
+            })
+            .catch(error => {
+                const alertBox = document.createElement('div');
+                alertBox.className = 'alert error'; // Fehlerklasse hinzufügen
+                alertBox.innerText = '❌ Fehler beim Hinzufügen der FAQ.';
+                document.getElementById('faq-container').appendChild(alertBox);
+                alertBox.style.display = 'block'; // Zeige die Fehlermeldung an
+
+                // Nach einer kurzen Zeit die Meldung ausblenden
+                setTimeout(() => {
+                    alertBox.style.display = 'none';
+                }, 5000); // 5 Sekunden warten, dann ausblenden
+
+                console.error('Fehler beim Hinzufügen der FAQ:', error);
+            });
+        }
+    }
+}
+
+// Funktion zum Löschen einer FAQ
+function deleteFaq() {
+    fetch('/api/faqs')
+        .then(response => response.json())
+        .then(data => {
+            if (data.length === 0) {
+                alert('Es gibt derzeit keine FAQs zum Löschen.');
+                return;
+            }
+
+            let faqText = 'Welche FAQ möchten Sie löschen?\n\n';
+            data.forEach((faq, index) => {
+                faqText += `${index + 1}. *${faq.question}*\n`;
+            });
+
+            const faqIndex = prompt(faqText);
+            const index = parseInt(faqIndex, 10) - 1;
+
+            if (index >= 0 && index < data.length) {
+                fetch('/api/delete-faq', {
+                    method: 'DELETE',
+                    headers: { 'Content-Type': 'application/json' },
+                    body: JSON.stringify({ index }),
+                })
+                .then(response => response.json())
+                .then(data => {
+                    if (data.success) {
+                        alert('✅ FAQ erfolgreich gelöscht.');
+                        fetchFaqs(); // FAQs neu laden
+                    } else {
+                        alert('❌ Fehler beim Löschen der FAQ.');
+                    }
+                })
+                .catch(error => console.error('Fehler beim Löschen der FAQ:', error));
+            } else {
+                alert('❌ Ungültige Auswahl.');
+            }
+        })
+        .catch(error => console.error('Fehler beim Abrufen der FAQs:', error));
+}
+
+// Darkmode umschalten
+const toggle = document.getElementById('dark-mode-toggle');
+
+// Darkmode-Zustand beim Laden der Seite überprüfen und anwenden
+const darkModeEnabled = localStorage.getItem('darkMode') === 'true';
+toggle.checked = darkModeEnabled;
+if (darkModeEnabled) {
+    document.body.classList.add('dark-mode');
+}
+
+toggle.addEventListener('change', () => {
+    const isChecked = toggle.checked;
+    document.body.classList.toggle('dark-mode', isChecked);
+    // Speichere den Zustand in localStorage
+    localStorage.setItem('darkMode', isChecked);
 });
\ No newline at end of file