2024-10-17 22:47:51 +00:00
|
|
|
|
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 = '<p>Keine offenen Wünsche vorhanden.</p>';
|
|
|
|
|
} else {
|
|
|
|
|
data.forEach((wish) => {
|
|
|
|
|
wishesDiv.innerHTML += `
|
|
|
|
|
<div class="wish-item">
|
|
|
|
|
<div class="wish-message">${wish.message}</div>
|
|
|
|
|
</div>
|
|
|
|
|
`;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch(error => {
|
|
|
|
|
console.error('Fehler beim Laden der Wünsche:', error);
|
|
|
|
|
document.getElementById('wishes-content').innerHTML = '<p>Fehler beim Laden der Wünsche.</p>';
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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 += `
|
|
|
|
|
<div class="feedback-item">
|
|
|
|
|
<div class="feedback-message">${feedbackMessage}</div>
|
|
|
|
|
</div>
|
|
|
|
|
`;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (feedbackLines.length <= 1) { // Überprüfen, ob nur die erste Zeile vorhanden ist
|
|
|
|
|
feedbackDiv.innerHTML = '<p>Kein Feedback vorhanden.</p>';
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch(error => {
|
|
|
|
|
console.error('Fehler beim Laden des Feedbacks:', error);
|
|
|
|
|
document.getElementById('feedback-content').innerHTML = '<p>Fehler beim Laden des Feedbacks.</p>';
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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 = '<h2>Dateiüberprüfung:</h2>';
|
|
|
|
|
data.forEach(file => {
|
|
|
|
|
fileCheckDiv.innerHTML += `<p>${file.exists ? '✅' : '❌'} Datei ${file.file} ${file.exists ? 'ist vorhanden.' : 'fehlt.'}</p>`;
|
|
|
|
|
});
|
|
|
|
|
})
|
|
|
|
|
.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 = `
|
|
|
|
|
<h2>Server-Informationen:</h2>
|
|
|
|
|
<p>Plattform: ${data.platform}</p>
|
|
|
|
|
<p>Architektur: ${data.architecture}</p>
|
|
|
|
|
<p>Gesamter Speicher: ${data.totalMemory} GB</p>
|
|
|
|
|
<p>Freier Speicher: ${data.freeMemory} GB</p>
|
|
|
|
|
`;
|
|
|
|
|
})
|
|
|
|
|
.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 += `
|
|
|
|
|
<div id="error-notification" class="error-notification">
|
|
|
|
|
<strong>Fehler erkannt!</strong> Bitte überprüfen Sie das Fehlerprotokoll.
|
|
|
|
|
</div>
|
|
|
|
|
`;
|
|
|
|
|
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);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-10-22 16:27:52 +00:00
|
|
|
|
// 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
|
2024-10-17 22:47:51 +00:00
|
|
|
|
|
2024-10-22 16:27:52 +00:00
|
|
|
|
if (data.length === 0) {
|
|
|
|
|
usersDiv.innerHTML = '<p>Keine Benutzer vorhanden.</p>';
|
|
|
|
|
} 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
|
|
|
|
|
|
|
|
|
|
// Verwende favoriteGenres (Plural) und überprüfe, ob es Genres gibt
|
|
|
|
|
const favoriteGenres = user.favoriteGenres ? user.favoriteGenres : (user.favoriteGenre || 'Nicht festgelegt');
|
|
|
|
|
|
|
|
|
|
usersDiv.innerHTML += `
|
|
|
|
|
<div class="user-item ${className}">
|
|
|
|
|
<p><strong>Benutzername:</strong> ${user.username}</p>
|
|
|
|
|
<p><strong>Benutzerlevel:</strong> ${user.userLevel}</p>
|
|
|
|
|
<p><strong>Benachrichtigungen:</strong> ${user.notifications ? 'Aktiviert' : 'Deaktiviert'}</p>
|
|
|
|
|
<p><strong>Nachtmodus:</strong> ${user.nightMode}</p> <!-- Nachtmodus-Anzeige -->
|
|
|
|
|
<p><strong>Befehlsanzahl:</strong> ${user.commandCount}</p>
|
|
|
|
|
<p><strong>Erstnutzung:</strong> ${user.firstUsed}</p>
|
|
|
|
|
<p><strong>Lieblingsgenres:</strong> ${favoriteGenres}</p>
|
|
|
|
|
<button class="delete-user" data-user-id="${user.userId}">Löschen</button>
|
|
|
|
|
</div>
|
|
|
|
|
<hr>
|
|
|
|
|
`;
|
2024-10-17 22:47:51 +00:00
|
|
|
|
});
|
|
|
|
|
|
2024-10-22 16:27:52 +00:00
|
|
|
|
// 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);
|
|
|
|
|
};
|
2024-10-17 22:47:51 +00:00
|
|
|
|
});
|
|
|
|
|
}
|
2024-10-22 16:27:52 +00:00
|
|
|
|
})
|
|
|
|
|
.catch(error => {
|
|
|
|
|
console.error('Fehler beim Laden der Benutzer:', error);
|
|
|
|
|
document.getElementById('users-content').innerHTML = '<p>Fehler beim Laden der Benutzerinformationen.</p>';
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-10-17 22:47:51 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 = '<span style="color: red;">Bitte gib eine Nachricht ein.</span>';
|
|
|
|
|
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 = '<span style="color: green;">Nachricht erfolgreich gesendet!</span>';
|
|
|
|
|
} else {
|
|
|
|
|
statusDiv.innerHTML = `<span style="color: red;">Fehler: ${data.error}</span>`;
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch(error => {
|
|
|
|
|
console.error('Fehler beim Senden der Nachricht:', error);
|
|
|
|
|
statusDiv.innerHTML = '<span style="color: red;">Ein Fehler ist aufgetreten.</span>';
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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}<br>
|
|
|
|
|
📺 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 = `<span style="color: green;">Backup erfolgreich erstellt: ${data.fileName}</span>`;
|
|
|
|
|
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 = `<span style="color: red;">Fehler: ${data.error}</span>`;
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch(error => {
|
|
|
|
|
console.error('Fehler beim Erstellen des Backups:', error);
|
|
|
|
|
statusDiv.innerHTML = '<span style="color: red;">Ein Fehler ist aufgetreten.</span>';
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 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 += `
|
|
|
|
|
<div class="backup-item">
|
|
|
|
|
<span>${backup.name} - ${new Date(backup.date).toLocaleString()}</span>
|
|
|
|
|
<a href="/backups/${backup.name}" download class="backup-button">Herunterladen</a>
|
|
|
|
|
<button class="backup-button delete-backup" data-filename="${backup.name}">Löschen</button>
|
|
|
|
|
</div>
|
|
|
|
|
`;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 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 = '<p>Keine Backups vorhanden.</p>';
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch(error => {
|
|
|
|
|
console.error('Fehler beim Laden der Backups:', error);
|
|
|
|
|
document.getElementById('backups-list').innerHTML = '<p>Fehler beim Laden der Backups.</p>';
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-10-18 13:01:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Automatisches Laden der Berichte alle 5 Sekunden (5000 Millisekunden)
|
|
|
|
|
setInterval(loadDevReports, 5000);
|
|
|
|
|
|
2024-10-17 22:47:51 +00:00
|
|
|
|
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 = '<p>Keine Entwicklerberichte vorhanden.</p>';
|
2024-10-18 13:01:10 +00:00
|
|
|
|
document.getElementById('notification').style.display = 'none'; // Benachrichtigung verstecken
|
2024-10-17 22:47:51 +00:00
|
|
|
|
} else {
|
2024-10-18 13:01:10 +00:00
|
|
|
|
// Für jeden Bericht im Dev-Report durchlaufen und anzeigen
|
2024-10-17 22:47:51 +00:00
|
|
|
|
data.forEach(report => {
|
2024-10-18 13:01:10 +00:00
|
|
|
|
const reportClass = report.type === "Bug" ? "bug" :
|
|
|
|
|
report.type === "Funktionswunsch" ? "feature-request" :
|
|
|
|
|
report.type === "Film Report" ? "film-report" : "";
|
|
|
|
|
|
2024-10-17 22:47:51 +00:00
|
|
|
|
const userName = report.user.name; // Den Namen des Benutzers aus dem Bericht holen
|
|
|
|
|
const message = report.message; // Den Text der Nachricht holen
|
|
|
|
|
|
|
|
|
|
devReportDiv.innerHTML += `
|
|
|
|
|
<div class="dev-report-item ${reportClass}">
|
|
|
|
|
<div class="dev-report-type"><strong>${report.type}</strong></div>
|
|
|
|
|
<div class="dev-report-user">@${userName}</div>
|
|
|
|
|
<div class="dev-report-message">"${message}"</div>
|
|
|
|
|
<button onclick="deleteDevReport(${report.id})">Löschen</button>
|
|
|
|
|
</div>
|
|
|
|
|
`;
|
|
|
|
|
});
|
2024-10-18 13:01:10 +00:00
|
|
|
|
|
|
|
|
|
// Wenn Berichte vorhanden sind, zeige die allgemeine Benachrichtigung an
|
|
|
|
|
const notificationDiv = document.getElementById('notification');
|
|
|
|
|
notificationDiv.innerHTML = `<strong>Meldung im Dev-Report bitte prüfen</strong>`;
|
|
|
|
|
notificationDiv.className = 'general-notification'; // Allgemeine Benachrichtigungsklasse
|
|
|
|
|
notificationDiv.style.display = 'block'; // Benachrichtigung anzeigen
|
2024-10-17 22:47:51 +00:00
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch(error => {
|
|
|
|
|
console.error('Fehler beim Laden der Entwicklerberichte:', error);
|
|
|
|
|
document.getElementById('dev-report-content').innerHTML = '<p>Fehler beim Laden der Entwicklerberichte.</p>';
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-18 13:01:10 +00:00
|
|
|
|
// Funktion zum Löschen eines Entwicklerberichts
|
2024-10-17 22:47:51 +00:00
|
|
|
|
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));
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-18 13:01:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-10-17 22:47:51 +00:00
|
|
|
|
// 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 <pre>-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);
|
2024-10-18 23:53:46 +00:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Funktion, um die WEB_NAME-Variable abzurufen und einzufügen
|
|
|
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
|
|
|
fetch('/api/web-name')
|
|
|
|
|
.then(response => response.json())
|
|
|
|
|
.then(data => {
|
|
|
|
|
const webName = data.name;
|
|
|
|
|
// Ersetze den Text im h1- und title-Tag
|
|
|
|
|
document.getElementById('welcome-title').textContent = `Willkommen bei ${webName}`;
|
|
|
|
|
document.getElementById('web-title').textContent = webName;
|
|
|
|
|
})
|
|
|
|
|
.catch(error => console.error('Fehler beim Abrufen des Web-Namens:', error));
|
2024-10-17 21:29:25 +00:00
|
|
|
|
});
|