Server Dashboard
-Wähle einen Server aus, um die Einstellungen zu verwalten
-🎯 Deine Server
-Nur Server mit Administrator-Rechten werden angezeigt.
- -Authentifizierung erfolgreich. Leite weiter...
- - - - \ No newline at end of file diff --git a/site/css/styles.css b/site/css/styles.css deleted file mode 100644 index 6be28ad..0000000 --- a/site/css/styles.css +++ /dev/null @@ -1,481 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;800&display=swap'); - -:root { - --primary: #5865F2; - --primary-glow: rgba(88, 101, 242, 0.4); - --bg: #0b0e14; - --card-bg: rgba(255, 255, 255, 0.03); - --border: rgba(255, 255, 255, 0.08); - --text: #ffffff; - --text-muted: #a0a0a0; -} - -* { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', sans-serif; } -body { background: var(--bg); color: var(--text); line-height: 1.6; overflow-x: hidden; } - -#particleCanvas { position: fixed; top: 0; left: 0; z-index: -1; opacity: 0.5; pointer-events: none; } - -/* NAVIGATION - Modern & Clean */ -nav { - display: flex; justify-content: space-between; align-items: center; - padding: 20px 10%; background: rgba(11, 14, 20, 0.8); - backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); - border-bottom: 1px solid var(--border); - position: sticky; top: 0; z-index: 100; -} - -.nav-content { display: flex; justify-content: space-between; align-items: center; width: 100%; } - -.logo { - font-size: 1.6rem; font-weight: 800; - background: linear-gradient(90deg, #fff, var(--primary)); - -webkit-background-clip: text; -webkit-text-fill-color: transparent; -} - -.links { display: flex; align-items: center; gap: 20px; } -.links a { color: var(--text-muted); text-decoration: none; font-weight: 600; transition: 0.3s; } -.links a:hover { color: var(--primary); text-shadow: 0 0 10px var(--primary-glow); } - -.user-profile { display: flex; align-items: center; color: var(--text); font-weight: 600; } - -/* HERO SECTION - Starker Fokus */ -.hero { - height: 65vh; display: flex; flex-direction: column; - justify-content: center; align-items: center; text-align: center; - padding: 0 10%; -} - -.hero h1 { - font-size: 4rem; font-weight: 800; margin-bottom: 15px; - letter-spacing: -2px; line-height: 1.1; - background: linear-gradient(to bottom, #fff 0%, #a0a0a0 100%); - -webkit-background-clip: text; -webkit-text-fill-color: transparent; -} - -.hero p { color: var(--text-muted); font-size: 1.2rem; max-width: 600px; margin-bottom: 35px; } - -/* STATS - Schickes Grid */ -.stats-container { - display: flex; justify-content: center; gap: 50px; - padding: 80px 10%; background: linear-gradient(180deg, rgba(88, 101, 242, 0.05) 0%, transparent 100%); -} - -.stat-card { text-align: center; padding: 20px; } -.stat-value { font-size: 3.5rem; font-weight: 800; color: var(--primary); display: block; text-shadow: 0 0 20px var(--primary-glow); } -.stat-label { color: var(--text-muted); text-transform: uppercase; letter-spacing: 2px; font-size: 0.8rem; } - -/* GLASS CARDS - Das Herzstück */ -.glass-card { - background: rgba(255, 255, 255, 0.03); - border: 1px solid var(--border); - border-radius: 24px; - padding: 40px; - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - box-shadow: 0 20px 40px rgba(0,0,0,0.3); - margin-bottom: 30px; - transition: 0.3s ease; -} - -.glass-card:hover { - transform: translateY(-2px); - box-shadow: 0 25px 50px rgba(0,0,0,0.4); -} - -/* GUILD CARDS */ -.guild-grid { - display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); - gap: 20px; margin-top: 30px; -} - -.guild-card { - background: rgba(255, 255, 255, 0.05); - border: 1px solid var(--border); - border-radius: 16px; - padding: 20px; - text-align: center; - transition: 0.3s ease; - cursor: pointer; -} - -.guild-card:hover { - transform: translateY(-5px); - box-shadow: 0 15px 30px rgba(88, 101, 242, 0.2); - border-color: var(--primary); -} - -.guild-card img { width: 64px; height: 64px; border-radius: 50%; margin-bottom: 15px; } -.guild-card h3 { margin-bottom: 10px; color: var(--text); } -.guild-card a { text-decoration: none; } - -/* MODULE CARDS */ -.module-grid { - display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); - gap: 25px; margin-top: 30px; -} - -.module-card { - background: rgba(255, 255, 255, 0.05); - border: 1px solid var(--border); - border-radius: 20px; - padding: 30px; - text-align: center; - transition: 0.3s ease; - position: relative; - overflow: hidden; -} - -.module-card::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 4px; - background: linear-gradient(90deg, var(--primary), transparent); - opacity: 0; - transition: 0.3s ease; -} - -.module-card:hover { - transform: translateY(-8px); - box-shadow: 0 20px 40px rgba(88, 101, 242, 0.15); - border-color: var(--primary); -} - -.module-card:hover::before { - opacity: 1; -} - -.module-card.disabled { - opacity: 0.6; - cursor: not-allowed; -} - -.module-card.disabled:hover { - transform: none; - box-shadow: none; -} - -.module-icon { - font-size: 2.5rem; margin-bottom: 15px; - display: block; -} - -.module-card h3 { - margin-bottom: 15px; color: var(--text); font-size: 1.3rem; -} - -.module-card p { - color: var(--text-muted); font-size: 0.95rem; line-height: 1.5; margin-bottom: 20px; -} - -/* SERVER HEADER */ -.server-header { - display: flex; - align-items: center; - gap: 20px; - margin-bottom: 40px; -} - -.guild-avatar { - width: 80px; - height: 80px; - border-radius: 50%; - border: 3px solid var(--primary); - box-shadow: 0 0 20px var(--primary-glow); -} - -.guild-info h1 { - font-size: 2.2rem; - margin-bottom: 5px; -} - -.guild-info p { - color: var(--text-muted); -} - -/* MODULE PAGES */ -.module-header { - text-align: center; - margin-bottom: 40px; -} - -.module-icon-large { - font-size: 4rem; - margin-bottom: 20px; - display: block; -} - -.module-header h1 { - font-size: 2.5rem; - margin-bottom: 10px; -} - -.module-header p { - color: var(--text-muted); - font-size: 1.1rem; -} - -/* FORM ELEMENTS */ -.form-section { - margin-bottom: 40px; -} - -.form-section h3 { - color: var(--primary); - margin-bottom: 20px; - font-size: 1.3rem; -} - -.form-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: 20px; -} - -.input-group { - margin-bottom: 20px; -} - -.input-group label { - display: block; - margin-bottom: 8px; - color: var(--text); - font-weight: 600; -} - -.input-group input, -.input-group select { - width: 100%; - padding: 12px 16px; - background: rgba(255, 255, 255, 0.05); - border: 1px solid var(--border); - border-radius: 12px; - color: var(--text); - font-size: 1rem; - transition: 0.3s ease; -} - -.input-group input:focus, -.input-group select:focus { - outline: none; - border-color: var(--primary); - box-shadow: 0 0 0 3px var(--primary-glow); -} - -.input-group small { - display: block; - margin-top: 5px; - color: var(--text-muted); - font-size: 0.85rem; -} - -/* CHECKBOX STYLING */ -.checkbox-label { - display: flex; - align-items: center; - cursor: pointer; - font-weight: 600; -} - -.checkbox-label input[type="checkbox"] { - display: none; -} - -.checkmark { - width: 20px; - height: 20px; - border: 2px solid var(--border); - border-radius: 4px; - margin-right: 10px; - position: relative; - transition: 0.3s ease; -} - -.checkbox-label input[type="checkbox"]:checked + .checkmark { - background: var(--primary); - border-color: var(--primary); -} - -.checkbox-label input[type="checkbox"]:checked + .checkmark::after { - content: '✓'; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - color: white; - font-size: 12px; - font-weight: bold; -} - -/* FORM ACTIONS */ -.form-actions { - display: flex; - align-items: center; - gap: 20px; - margin-top: 30px; -} - -.save-status { - font-weight: 600; - transition: 0.3s ease; -} - -/* BUTTONS - Der Glow ist zurück */ -.btn-primary { - background: var(--primary); color: white !important; - padding: 16px 36px; border-radius: 14px; text-decoration: none; - font-weight: 700; font-size: 1.1rem; display: inline-block; - transition: 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); - box-shadow: 0 8px 25px var(--primary-glow); - will-change: transform; -} - -.btn-primary:hover { - transform: translateY(-4px) scale(1.02); - box-shadow: 0 12px 35px var(--primary-glow); -} - -/* CONTAINER */ -.container { - max-width: 1200px; margin: 0 auto; padding: 0 20px; -} - -/* RESPONSIVE */ -@media (max-width: 768px) { - .hero h1 { font-size: 2.5rem; } - .module-grid { grid-template-columns: 1fr; } - .guild-grid { grid-template-columns: 1fr; } - .form-grid { grid-template-columns: 1fr; } - .server-header { flex-direction: column; text-align: center; } - nav { padding: 15px 5%; } - .glass-card { padding: 20px; } -} - -/* OPTIMIERTE LEGAL PAGES */ -.legal-container { - max-width: 900px; - margin: 60px auto; - background: rgba(255, 255, 255, 0.02); - border: 1px solid var(--border); - border-radius: 32px; - padding: 60px; - backdrop-filter: blur(20px); - box-shadow: 0 40px 100px rgba(0,0,0,0.5); - position: relative; -} - -.legal-header { - text-align: center; - margin-bottom: 50px; - border-bottom: 1px solid var(--border); - padding-bottom: 30px; -} - -.legal-header h1 { - font-size: 3.2rem; - font-weight: 800; - background: linear-gradient(to bottom, #fff, #888); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - margin-bottom: 10px; -} - -.legal-header p { - color: var(--primary); - text-transform: uppercase; - letter-spacing: 3px; - font-weight: 700; - font-size: 0.9rem; -} - -.legal-content section { - margin-bottom: 40px; - padding: 20px; - border-radius: 16px; - transition: background 0.3s ease; -} - -.legal-content section:hover { - background: rgba(255, 255, 255, 0.015); -} - -.legal-content h2 { - color: var(--primary); - font-size: 1.5rem; - margin-bottom: 15px; - display: flex; - align-items: center; - gap: 12px; -} - -.legal-content h2::before { - content: ''; - width: 4px; - height: 24px; - background: var(--primary); - border-radius: 2px; - display: inline-block; -} - -.legal-content p, .legal-content li { - color: var(--text-muted); - font-size: 1.05rem; - line-height: 1.8; -} - -.legal-content ul { - list-style: none; - margin-top: 15px; -} - -.legal-content li { - margin-bottom: 12px; - padding-left: 25px; - position: relative; -} - -.legal-content li::after { - content: '→'; - position: absolute; - left: 0; - color: var(--primary); -} - -.contact-link { - display: flex; - align-items: center; - justify-content: center; - gap: 15px; - background: rgba(88, 101, 242, 0.1); - border: 1px solid var(--primary); - padding: 20px; - border-radius: 16px; - color: #fff; - text-decoration: none; - font-weight: 600; - transition: 0.3s; - margin-top: 20px; -} - -.contact-link:hover { - background: var(--primary); - transform: scale(1.02); - box-shadow: 0 10px 30px var(--primary-glow); -} - -@media (max-width: 768px) { - .legal-container { padding: 30px; margin: 20px; } - .legal-header h1 { font-size: 2.2rem; } -} - -/* FOOTER */ -footer { padding: 60px 10% 40px; border-top: 1px solid var(--border); text-align: center; color: var(--text-muted); } -footer a { color: var(--text-muted); text-decoration: none; margin: 0 15px; font-weight: 600; transition: 0.3s; } -footer a:hover { color: var(--primary); } - -@media (max-width: 768px) { - .hero h1 { font-size: 2.8rem; } - .stats-container { flex-direction: column; gap: 30px; } -} \ No newline at end of file diff --git a/site/dashboard.html b/site/dashboard.html deleted file mode 100644 index d08b66d..0000000 --- a/site/dashboard.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - -Wähle einen Server aus, um die Einstellungen zu verwalten
-Nur Server mit Administrator-Rechten werden angezeigt.
- -Verwalte die Bot-Einstellungen für diesen Server
-Kanäle, Kategorien und Interface-Einstellungen für temporäre Voice-Channels.
- Konfigurieren -Anti-Spam, Moderation und Sicherheitsfeatures.
- Bald verfügbar -Server-Statistiken und Nutzungsanalysen.
- Bald verfügbar -Spaß-Commands und Unterhaltungsfeatures.
- Bald verfügbar -Willkommen zu ManagerX!
-Dein Bot für Discord-Server
- -Keine Server mit Admin-Rechten gefunden.
'; - return; - } - - guildList.innerHTML = ''; - guilds.forEach(guild => { - const guildCard = document.createElement('div'); - guildCard.className = 'guild-card'; - guildCard.innerHTML = ` -❌ Fehler beim Laden der Server.
'; - } -} - -// --- FUNKTION: Guild-Details laden (für guild.html) --- -async function fetchGuildDetails(guildId) { - const token = getToken(); - try { - // Hole Guild-Info von Discord API über unseren Endpoint - const res = await fetch(`${API_BASE}/user/guilds?token=${token}`); - if (!res.ok) throw new Error("Guild-Details laden fehlgeschlagen"); - - const guilds = await res.json(); - const guild = guilds.find(g => g.id == guildId); - - if (guild) { - document.getElementById('guild-icon').src = `https://cdn.discordapp.com/icons/${guild.id}/${guild.icon}.png`; - document.getElementById('guild-icon').onerror = () => this.src = 'https://via.placeholder.com/64x64?text=?'; - document.getElementById('guild-name').textContent = guild.name; - } else { - document.getElementById('guild-name').textContent = 'Server nicht gefunden'; - } - } catch (err) { - console.error("Fehler beim Laden der Guild-Details:", err); - document.getElementById('guild-name').textContent = 'Fehler beim Laden'; - } -} - -// --- FUNKTION: Welcome speichern --- -async function saveWelcome(guildId) { - console.log("Speichervorgang für Welcome ausgelöst:", guildId); - - const payload = { - channel_id: document.getElementById('channel_id').value, - welcome_message: document.getElementById('welcome_message').value, - enabled: document.getElementById('enabled').checked, - embed_enabled: document.getElementById('embed_enabled').checked, - embed_color: document.getElementById('embed_color').value, - embed_title: document.getElementById('embed_title').value, - embed_description: document.getElementById('embed_description').value, - embed_thumbnail: document.getElementById('embed_thumbnail').checked, - embed_footer: document.getElementById('embed_footer').value, - ping_user: document.getElementById('ping_user').checked, - delete_after: parseInt(document.getElementById('delete_after').value) || 0 - }; - - try { - const response = await apiFetch(`${API_BASE}/guild/${guildId}/welcome`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(payload) - }); - - const data = await response.json(); - - if (response.ok) { - alert("✅ Erfolg: " + (data.message || "Gespeichert!")); - } else { - if (response.status === 403 && data.detail && data.detail.includes("deaktiviert")) { - alert("❌ Dieses Feature ist in der Bot-Config deaktiviert."); - return; - } - alert("❌ Fehler: " + (data.detail || "Unbekannter Fehler")); - } - } catch (error) { - console.error("Netzwerkfehler beim Speichern:", error); - alert("❌ Netzwerkfehler: Backend unter http://127.0.0.1:3002 erreichbar?"); - } -} - -// --- FUNKTION: Bot-Stats laden (für index.html) --- -async function loadBotStats() { - try { - const response = await fetch(`${API_BASE}/managerx/stats`); - const data = await response.json(); - - document.getElementById('server-count').textContent = data.stats?.server_count || '0'; - document.getElementById('user-count').textContent = data.stats?.user_count || '0'; - document.getElementById('bot-ping').textContent = data.bot_info?.latency ? data.bot_info.latency + 'ms' : '--ms'; - document.getElementById('bot-status').textContent = data.bot_info?.status || 'Offline'; - - console.log("✅ Bot-Stats erfolgreich geladen"); - } catch (error) { - console.error('❌ Fehler beim Laden der Bot-Stats:', error); - // Bei Fehler Standardwerte setzen - document.getElementById('server-count').textContent = '--'; - document.getElementById('user-count').textContent = '--'; - document.getElementById('bot-ping').textContent = '--ms'; - document.getElementById('bot-status').textContent = 'Offline'; - } -} \ No newline at end of file diff --git a/site/js/particles.js b/site/js/particles.js deleted file mode 100644 index ed47069..0000000 --- a/site/js/particles.js +++ /dev/null @@ -1,66 +0,0 @@ -const canvas = document.getElementById('particleCanvas'); -const ctx = canvas.getContext('2d'); - -let particlesArray = []; -// Weniger Partikel = mehr FPS -const numberOfParticles = 50; - -canvas.width = window.innerWidth; -canvas.height = window.innerHeight; - -class Particle { - constructor() { - this.reset(); - } - reset() { - this.x = Math.random() * canvas.width; - this.y = Math.random() * canvas.height; - this.size = Math.random() * 1.5 + 0.5; - this.speedX = (Math.random() - 0.5) * 0.5; - this.speedY = (Math.random() - 0.5) * 0.5; - } - update() { - this.x += this.speedX; - this.y += this.speedY; - - if (this.x > canvas.width || this.x < 0) this.speedX *= -1; - if (this.y > canvas.height || this.y < 0) this.speedY *= -1; - } - draw() { - ctx.fillStyle = 'rgba(88, 101, 242, 0.3)'; - ctx.beginPath(); - ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2); - ctx.fill(); - } -} - -function init() { - particlesArray = []; - for (let i = 0; i < numberOfParticles; i++) { - particlesArray.push(new Particle()); - } -} - -function animate() { - ctx.clearRect(0, 0, canvas.width, canvas.height); - for (let i = 0; i < particlesArray.length; i++) { - particlesArray[i].update(); - particlesArray[i].draw(); - } - // Verhindert unnötiges Rechnen, wenn man den Tab wechselt - requestAnimationFrame(animate); -} - -// Performance-Check beim Resize -let resizeTimeout; -window.addEventListener('resize', () => { - clearTimeout(resizeTimeout); - resizeTimeout = setTimeout(() => { - canvas.width = window.innerWidth; - canvas.height = window.innerHeight; - init(); - }, 200); -}); - -init(); -animate(); \ No newline at end of file diff --git a/site/modules/index.html b/site/modules/index.html deleted file mode 100644 index 2d256c5..0000000 --- a/site/modules/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - -Weiterleitung zu Server-Modulen...
- - \ No newline at end of file diff --git a/site/modules/levelsystem.html b/site/modules/levelsystem.html deleted file mode 100644 index d7aec5b..0000000 --- a/site/modules/levelsystem.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - -Verwalte temporäre Voice-Channels für deinen Server
-Sicherheit & Transparenz
-Lenny
- E-Mail: contact@oppro-network.de
- Verantwortlich für die Datenverarbeitung im Rahmen der Nutzung von ManagerX.
ManagerX verarbeitet personenbezogene Daten nur soweit nötig für die Funktionsfähigkeit des Bots. Dazu gehören insbesondere:
-Die Daten werden ausschließlich verwendet, um Funktionen des Bots bereitzustellen, Statistiken zu führen, Moderationsaktionen nachzuvollziehen und Fehlerdiagnosen zu ermöglichen. Eine Weitergabe an Dritte erfolgt nicht.
-Die Verarbeitung erfolgt gemäß DSGVO:
-Daten werden so lange gespeichert, wie sie für die Funktion des Servers notwendig sind oder gesetzliche Aufbewahrungsfristen bestehen. Allgemeine Einstellungen bleiben gespeichert, solange der Bot auf dem Server aktiv ist.
-Du hast das Recht auf Auskunft, Berichtigung, Löschung und Widerspruch bezüglich deiner Daten. Kontaktiere uns hierzu bitte unter der unten angegebenen E-Mail.
-ManagerX speichert Daten in SQLite-Datenbanken, die lokal auf dem Server liegen. Es werden angemessene technische Maßnahmen ergriffen, um deine Daten vor unbefugtem Zugriff zu schützen.
-Diese Erklärung kann bei neuen Funktionen angepasst werden. Nutzer werden über Discord oder Bot-Kommunikation über Änderungen informiert.
-Hast du Fragen zu deinen gespeicherten Daten oder möchtest eine Löschung beantragen?
- - - contact@oppro-network.de - -Gültig für den Discord-Bot ManagerX
-Diese Nutzungsbedingungen regeln die Verwendung des Discord-Bots ManagerX, betrieben von OPPRO.NET Network. Mit der Nutzung des Bots erklärst du dich mit diesen Bedingungen einverstanden.
-ManagerX bietet Funktionen wie Moderation (Warnungen, Kicks, Bans), Welcome-System, Temp Voice Channels, Statistiken und weitere Tools. Der Betreiber von ManagerX behält sich das Recht vor, Funktionen zu ändern, hinzuzufügen oder zu entfernen.
-OPPRO.NET Development übernimmt keine Haftung für Schäden, die direkt oder indirekt durch die Nutzung des Bots entstehen. Dies umfasst insbesondere Datenverlust, Serverprobleme oder Einschränkungen durch Discord.
-Alle gesammelten Daten werden gemäß der Datenschutzerklärung von ManagerX verarbeitet. Du bist dafür verantwortlich, die Mitglieder deines Servers über die Nutzung des Bots und die Datenverarbeitung zu informieren.
-Alle von ManagerX bereitgestellten Funktionen, Codes und Datenbanken sind Eigentum von OPPRO.NET Development. Du darfst diese nur im Rahmen der Bot-Nutzung verwenden und nicht für eigene kommerzielle Projekte weitergeben oder kopieren.
-OPPRO.NET Development kann diese Nutzungsbedingungen jederzeit ändern. Änderungen werden auf den Discord-Servern oder per Bot-Kommunikation bekanntgegeben. Die fortgesetzte Nutzung von ManagerX gilt als Zustimmung zu den geänderten Bedingungen.
-Bei Fragen zu den Nutzungsbedingungen oder Problemen mit dem Bot:
- - - development@oppro-network.de - -