From 7dd356ce69b5add3d582b4987bb35362f2f3d361 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Thu, 17 Oct 2024 21:29:25 +0000 Subject: [PATCH] Dateien nach "public/js" hochladen --- public/js/admin.js | 1025 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1025 insertions(+) create mode 100644 public/js/admin.js diff --git a/public/js/admin.js b/public/js/admin.js new file mode 100644 index 0000000..067f293 --- /dev/null +++ b/public/js/admin.js @@ -0,0 +1,1025 @@ +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);
+});
\ No newline at end of file