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 += ` -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 += ` -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 = '${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 = ` -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 += ` -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}
- -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}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 += ` -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 += `
+
+
+
+ `;
+ });
+ }
+ })
+ .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}
+
+
+
+ `;
+ });
+ }
+ })
+ .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