From 99f4aa1e6fb0ca5ae62d3302896c0583c74168cf Mon Sep 17 00:00:00 2001 From: Medicopter117 Date: Sat, 7 Feb 2026 20:04:52 +0100 Subject: [PATCH 1/9] No changes were provided to summarize. --- .github/LICENSE => LICENSE | 0 .github/renovate.json => renovate.json | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename .github/LICENSE => LICENSE (100%) rename .github/renovate.json => renovate.json (100%) diff --git a/.github/LICENSE b/LICENSE similarity index 100% rename from .github/LICENSE rename to LICENSE diff --git a/.github/renovate.json b/renovate.json similarity index 100% rename from .github/renovate.json rename to renovate.json From 69659901bfe3e7687214df8eac750e9cd296bbae Mon Sep 17 00:00:00 2001 From: Medicopter117 Date: Sat, 7 Feb 2026 20:07:21 +0100 Subject: [PATCH 2/9] feat: Configure web project to use `src/web` as its root, update build paths, and add initial web pages. --- src/web/agb.html | 2 +- src/web/datenschutz.html | 2 +- src/web/impressum.html | 2 +- src/web/index.html | 2 +- tailwind.config.ts | 2 +- vite.config.ts | 10 +++++++--- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/web/agb.html b/src/web/agb.html index da2981f..b4985e3 100644 --- a/src/web/agb.html +++ b/src/web/agb.html @@ -11,7 +11,7 @@
- + \ No newline at end of file diff --git a/src/web/datenschutz.html b/src/web/datenschutz.html index 6586329..6b78975 100644 --- a/src/web/datenschutz.html +++ b/src/web/datenschutz.html @@ -11,6 +11,6 @@
- + diff --git a/src/web/impressum.html b/src/web/impressum.html index f29f696..203503d 100644 --- a/src/web/impressum.html +++ b/src/web/impressum.html @@ -11,6 +11,6 @@
- + diff --git a/src/web/index.html b/src/web/index.html index e82ed54..d39b8bd 100644 --- a/src/web/index.html +++ b/src/web/index.html @@ -23,6 +23,6 @@
- + diff --git a/tailwind.config.ts b/tailwind.config.ts index 076c26f..e230372 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -2,7 +2,7 @@ module.exports = { darkMode: ["class"], content: [ - "./index.html", + "./src/web/index.html", "./src/web/**/*.{ts,tsx,js,jsx}", "./src/web/components/**/*.{ts,tsx}", "./src/web/pages/**/*.{ts,tsx}", diff --git a/vite.config.ts b/vite.config.ts index ca7b22e..704e517 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,6 +3,8 @@ import react from "@vitejs/plugin-react-swc"; import path from "path"; export default defineConfig(({ mode }) => ({ + // WICHTIG: Erlaubt korrekte Pfade auf deiner Subdomain + root: "src/web", // WICHTIG: Erlaubt korrekte Pfade auf deiner Subdomain base: "/", @@ -16,15 +18,17 @@ export default defineConfig(({ mode }) => ({ plugins: [ react() ], + publicDir: "../../public", resolve: { alias: { - // Dein Alias zeigt auf ./src/web - das ist wichtig fรผr deine Imports - "@": path.resolve(__dirname, "./src/web"), + // Dein Alias zeigt auf . (jetzt src/web) + "@": path.resolve(__dirname, "src/web"), }, }, build: { // Stellt sicher, dass der Output-Ordner 'dist' heiรŸt (passend zur deploy.yml) - outDir: "dist", + outDir: "../../dist", + emptyOutDir: true, // Optimierung fรผr sauberen Code minify: "esbuild", reportCompressedSize: false, From a7f7da391f84d40e06d16ec78b61d86f3e016c68 Mon Sep 17 00:00:00 2001 From: Medicopter117 Date: Sun, 8 Feb 2026 12:41:15 +0100 Subject: [PATCH 3/9] feat: Introduce web dashboard with legal pages, add bot UI emojis, and update project documentation and Tailwind configuration. --- README.md | 911 +++++++-------------------------------- src/web/App.tsx | 3 + src/web/agb.html | 2 +- src/web/datenschutz.html | 2 +- src/web/impressum.html | 2 +- tailwind.config.ts | 2 +- 6 files changed, 165 insertions(+), 757 deletions(-) diff --git a/README.md b/README.md index f3b4649..f476848 100644 --- a/README.md +++ b/README.md @@ -4,43 +4,22 @@ # ๐Ÿค– ManagerX Discord Bot -### *Der ultimative All-in-One Bot fรผr professionelles Community Management* +### *Der intelligente All-in-One Bot fรผr professionelles Community-Management*
- -

- - Status - - - - Next Release - - - - Last Commit - - - License - -

- - -

- Python - Pycord - SQLite - Issues - Stars -

+[![Status](https://status.oppro-network.de/api/badge/6/status?style=for-the-badge)](https://status.oppro-network.de) +[![Version](https://img.shields.io/badge/Version-2.0.0-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://github.com/Oppro-net-Development/ManagerX/releases) +[![Next Release](https://img.shields.io/badge/Next_Release-v2.1.0-00D9FF?style=for-the-badge&logo=rocket&logoColor=white)](#-roadmap) +[![Last Commit](https://img.shields.io/github/last-commit/Oppro-net-Development/ManagerX?style=for-the-badge&logo=git&logoColor=white&color=F05032&label=Commit)](https://github.com/Oppro-net-Development/ManagerX/commits/main) +[![License](https://img.shields.io/badge/License-GPL--3.0-blue?style=for-the-badge&logo=opensourceinitiative&logoColor=white)](LICENSE)
```ascii โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•— โ•‘ โ•‘ -โ•‘ ๐Ÿค– Professionelles Discord Bot Framework fรผr Communities ๐Ÿš€ โ•‘ +โ•‘ ๐Ÿค– PROFESSIONAL DISCORD BOT FRAMEWORK โ€ข COMMUNITY READY ๐Ÿš€ โ•‘ โ•‘ โ•‘ โ•‘ Moderation โ€ข Leveling โ€ข Welcome โ€ข TempVC โ€ข Globalchat โ€ข Stats โ•‘ โ•‘ โ•‘ @@ -53,56 +32,63 @@
+

+ Was ist das? โ€ข + Funktionsumfang โ€ข + Setup โ€ข + Dokumentation โ€ข + Hilfe +

+ + + +
+ --- ## ๐Ÿ“ Projektstruktur +Das Projekt ist modular aufgebaut, um maximale Performance und Wartbarkeit zu gewรคhrleisten. + ```text ManagerX/ -โ”œโ”€โ”€ ๐Ÿ“‚ .github/ # GitHub Config & Metadaten (License, Contributing) -โ”œโ”€โ”€ ๐Ÿ“‚ config/ # Bot-Konfiguration (.env, config.yaml) -โ”œโ”€โ”€ ๐Ÿ“‚ data/ # Dynamische Daten & Datenbanken +โ”œโ”€โ”€ ๐Ÿ“‚ .github/ # GitHub-Workflows & Projektdaten (License, Contributing) +โ”œโ”€โ”€ ๐Ÿ“‚ config/ # Globale Bot-Konfiguration & Umgebungsvariablen +โ”œโ”€โ”€ ๐Ÿ“‚ data/ # Lokale Persistenz (Datenbanken, JSON-Stats) โ”œโ”€โ”€ ๐Ÿ“‚ src/ -โ”‚ โ”œโ”€โ”€ ๐Ÿ“‚ bot/ # Python Bot Core & Cogs -โ”‚ โ”œโ”€โ”€ ๐Ÿ“‚ api/ # FastAPI Dashboard Backend -โ”‚ โ””โ”€โ”€ ๐Ÿ“‚ web/ # React Dashboard Frontend -โ”œโ”€โ”€ ๐Ÿ“œ main.py # Haupteinstiegspunkt -โ””โ”€โ”€ ๐Ÿ“œ vite.config.ts # Web Build Konfiguration +โ”‚ โ”œโ”€โ”€ ๐Ÿ“‚ bot/ # ๐Ÿ Core Bot Logic & Cog-System +โ”‚ โ”œโ”€โ”€ ๐Ÿ“‚ api/ # โšก FastAPI Dashboard Backend +โ”‚ โ””โ”€โ”€ ๐Ÿ“‚ web/ # โš›๏ธ React/Tailwind Dashboard Frontend +โ”œโ”€โ”€ ๐Ÿ“œ main.py # Haupteinstiegspunkt fรผr den Bot +โ””โ”€โ”€ ๐Ÿ“œ vite.config.ts # Build-Pipeline fรผr das Web-Interface ``` --- -## ๐Ÿ“ฆ Quick Install +## ๐Ÿ“ฆ Schnellstart + +Wรคhle die passende Installationsmethode fรผr dein Szenario: - - @@ -111,99 +97,48 @@ pip install ManagerX[all]
-

- ๐Ÿ“ฅ Detaillierte Installation โ€ข - โœจ Features โ€ข - ๐Ÿ“– Dokumentation โ€ข - ๐Ÿ’ฌ Support -

- - - -
- ---- -
## ๐ŸŽฏ Was ist ManagerX?
-
+ -### ๐ŸŽฏ Fรผr End-User +### ๐ŸŽฏ Fรผr Community-Inhaber +*Maximale Stabilitรคt, Minimaler Aufwand* ```bash -# Bot direkt nutzen -pip install ManagerX -``` - -**Mit Dokumentation:** -```bash -pip install ManagerX[docs] +pip install ManagerX[all] ``` + ### ๐Ÿ‘จโ€๐Ÿ’ป Fรผr Entwickler +*Voller Zugriff auf den Source-Code* ```bash -# Development Setup -pip install ManagerX[dev] -``` - -**Vollstรคndige Installation:** -```bash -pip install ManagerX[all] +git clone https://github.com/ManagerX-Development/ManagerX.git +pip install -e .[dev] ```
- - - @@ -215,178 +150,64 @@ Uptime: 99.9%+ Verfรผgbarkeit
-## โœจ Feature-รœbersicht +## โœจ Feature-Deep-Dive -*Entdecke die leistungsstarken Module von ManagerX* +*Entdecke die mรคchtigen Werkzeuge von ManagerX*

-
- -**ManagerX** ist ein hochmoderner, leistungsstarker Discord-Bot, der speziell fรผr professionelles Community-Management entwickelt wurde. Mit modernster Architektur und einer Vielzahl an Features bietet ManagerX alles, was anspruchsvolle Discord-Server benรถtigen. +**ManagerX ist ein Discord Bot**, der als hochmoderne und leistungsstarke Lรถsung fรผr das professionelle Community-Management konzipiert wurde. Durch die Verbindung einer robusten Python-Architektur mit einem Echtzeit-Web-Interface bietet ManagerX alles, was anspruchsvolle Server fรผr Skalierung, Sicherheit und Engagement benรถtigen.
-### ๐ŸŒŸ Warum ManagerX? +### ๐ŸŒŸ Kernvorteile - - - - - - - - - - - - - - - - - - + + - - - -
โšกBlazing Fast
Optimierte SQLite-Architektur fรผr maximale Performance
๐Ÿ›ก๏ธEnterprise Security
Anti-Spam, Moderation-Logs und umfassende Sicherheitsfeatures
๐ŸŽจHochgradig Anpassbar
Jedes Modul vollstรคndig konfigurierbar fรผr deine Bedรผrfnisse
๐ŸŒGlobal Connected
Verbinde deine Community mit Servern weltweit via Globalchat
๐Ÿ“ˆAktive Entwicklung
RegelmรครŸige Updates mit neuen Features und Verbesserungen
+ +**โšก Performance & Speed** +
+Optimierte SQLite-Architektur & Caching fรผr blitzschnelle Reaktionen, selbst bei tausenden Events. + +
+ +**๐Ÿ›ก๏ธ Enterprise Security** +
+Umfassendes Anti-Spam, Moderations-Logs und granulare Sicherheits-Features fรผr deine Community. + +
๐Ÿ†“100% Open Source
Transparent, community-driven und kostenlos verfรผgbar
+
+ +**๐ŸŽจ Vollstรคndige Anpassbarkeit** +
+Jedes Modul kann รผber das Dashboard oder Command-Interface individuell konfiguriert werden.
- -```yaml -โš™๏ธ Technical Specifications -โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” -Status: Production Ready โœ“ -Current: v2.0.0 -Next Release: v2.1.0 (Q1 2025) - -๐Ÿ”ง Technology Stack -โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” -Language: Python 3.10+ -Framework: py-cord + ezcord -Database: SQLite3 -API: Discord API v10 -Architecture: Modular Cogs System - -๐ŸŒ Deployment -โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” -Platforms: Linux, Windows, macOS -Hosting: Cloud-Ready -Requirements: 512MB RAM (1GB+ rec.) -Uptime: 99.9%+ Verfรผgbarkeit - -๐Ÿ“ฆ Active Modules -โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” -โœ“ Advanced Moderation System -โœ“ Dynamic Leveling & XP Engine -โœ“ Smart Welcome Automation -โœ“ Temporary Voice Channels -โœ“ Global Cross-Server Chat -โœ“ Real-Time Weather Data -โœ“ Wikipedia Integration -โœ“ Comprehensive Statistics -โœ“ Custom Command Framework -``` + + +**๐ŸŒ Globales Netzwerk** +
+Verbinde deine Community mit Servern weltweit รผber unser integriertes Globalchat-System.
- - - +
- ### ๐Ÿ›ก๏ธ Moderation & Sicherheit +*Sicherheit auf Enterprise-Niveau fรผr deinen Server.* -
- -**๐Ÿ”’ Advanced Moderation Toolkit** - -
- -```yaml -Moderation Commands: - /ban - Permanenter Server-Ausschluss - /kick - User vom Server entfernen - /mute - Temporรคres Timeout verhรคngen - /warn - Verwarnungen aussprechen - /timeout - Zeitlich begrenzte Stummschaltung - /purge - Massen-Nachrichtenlรถschung - -Anti-Spam Engine: - โœ“ Intelligente Spam-Erkennung - โœ“ Duplicate Message Detection - โœ“ Mention Spam Protection - โœ“ Link & URL Filter - โœ“ Custom Regex Patterns - โœ“ Configurable Thresholds - -Moderation Logs: - โœ“ Vollstรคndige Action History - โœ“ Reason Tracking - โœ“ Moderator Attribution - โœ“ Automatic Evidence Collection - โœ“ Appeal System Ready -``` - -
- -### ๐Ÿ“Š Community Engagement - -
- -**๐ŸŽฎ Gamification & Engagement** +- **Vollstรคndiges Toolkit**: `/ban`, `/kick`, `/mute`, `/warn`, `/timeout`, `/purge`. +- **Intelligentes Anti-Spam**: Duplicate Detection, Mention Protection & Link-Filter. +- **Action-History**: Lรผckenlose Protokollierung aller Moderations-Ereignisse. +- **Evidence Collection**: Automatisierte Beweissicherung fรผr Moderations-Fรคlle. -
- -```yaml -Levelsystem Features: - XP System: - - Vollstรคndig anpassbare XP-Raten - - Text & Voice Channel XP - - XP-Multiplier & Boosts - - Daily/Weekly Bonuses - - Rewards: - - Automatische Rollenbelohnungen - - Custom Level-Up Messages - - Achievement System - - Milestone Rewards - - Leaderboards: - - Server Top Rankings - - Global Leaderboards - - Category-Specific Rankings - - Historical Statistics - -Welcome System: - โœ“ Benutzerdefinierte Embed-Designs - โœ“ Auto-Role Assignment - โœ“ Regel- & Info-Nachrichten - โœ“ User Counter Integration - โœ“ Custom Welcome Images - โœ“ Join/Leave Logging -``` - -
- -### ๐ŸŒ Social & Communication +### ๐Ÿ“Š Community & Engagement +*Baue eine aktive und loyale Community auf.* -
+- **Smart Leveling**: Dynamisches XP-System fรผr Voice & Text mit Multiplikatoren. +- **Auto-Rewards**: Automatische Rollenvergabe bei Stufenaufstiegen. +- **Interaktive Leaderboards**: Lokale und globale Rankings fรผr maximalen Wettbewerb. +- **Welcome 2.0**: Hochwertige Embed-Designs und automatisierte Onboarding-Prozesse. -**๐Ÿ’ฌ Cross-Server Communication** +### ๏ฟฝ๏ธ Voice & Automatisierung +*Dynamische Kanรคle fรผr moderne Kommunikation.* -
- -```yaml -Globalchat System: - Core Features: - - Echtzeit Cross-Server Chat - - Moderierte Kommunikation - - Server-รผbergreifende Community - - Report & Block Funktionen - - User Reputation System - - Safety Features: - โœ“ Content-Filterung - โœ“ Blacklist System - โœ“ Admin-Kontrolle - โœ“ Spam Prevention - โœ“ Moderation Queue - โœ“ Appeal Process - -Information Tools: - Wikipedia Integration: - - Direkte Artikelsuche - - Formatierte Previews - - Multi-Language Support - - Related Articles - - Quick Summaries - - Weather System: - - Live-Wetterdaten - - 5-Tage Vorhersage - - Detaillierte Metriken - - Location Auto-Detection - - Weather Alerts -``` +- **Temporary Voice**: User-gesteuerte Sprachkanรคle mit voller Permission-Control. +- **Auto-Cleanup**: Intelligente Lรถschung inaktiver Kanรคle spart Ressourcen. +- **Live-Stats**: Echtzeit-Analysen รผber Voice-Aktivitรคt und User-Engagement. +- **Toolbox**: Integrationen wie Google-Search, Wetterdaten und Wikipedia.
-### ๐ŸŽฎ Interaktive Features +---
-**๐ŸŽ™๏ธ Dynamic Voice & Analytics** +## โš™๏ธ Technischer Stack
-```yaml -Temporary Voice Channels: - User Control: - โœ“ Eigene Voice-Channel erstellen - โœ“ Custom Namen & Beschreibung - โœ“ User-Limit Management - โœ“ Permission Control - โœ“ Channel Transfer - - Automation: - - Auto-Delete bei Inaktivitรคt - - Category Organization - - Template System - - VIP Channel Options - -Stats & Analytics: - Real-Time Metrics: - - Server Activity Tracking - - User Engagement Stats - - Command Usage Analytics - - Voice Channel Statistics - - Growth Metrics - - Reports: - โœ“ Daily/Weekly Summaries - โœ“ Performance Dashboards - โœ“ Member Insights - โœ“ Trend Analysis -``` - -
+ + + -
KernPython 3.10+, Pycord, Ezcord
- + +Interface +FastAPI, React (Vite), TailwindCSS, Lucide Icons + + +Daten +SQLite3 (lokal), JSON-Analytics + + +Deployment +Docker-ready, Linux/Windows/macOS Unterstรผtzung
--- @@ -395,56 +216,31 @@ Stats & Analytics: ## ๐Ÿš€ Installation & Setup -*Starte ManagerX in wenigen Minuten* +*Starte dein Community-Management in wenigen Minuten*
-### ๐Ÿ“‹ Systemanforderungen +### ๐Ÿ“‹ Voraussetzungen @@ -452,194 +248,65 @@ Optional Services:
-### โšก Installation Guide +### โšก Schritt-fรผr-Schritt Anleitung
-๐Ÿง Linux / macOS Installation (Click to expand) - -
+๐Ÿง Linux / ๐ŸŽ macOS Setup (Klicken zum Aufklappen) ```bash -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Step 1: Repository klonen -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# 1. Repository klonen git clone https://github.com/Oppro-net-Development/ManagerX.git cd ManagerX -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Step 2: Virtual Environment erstellen (empfohlen) -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# 2. Virtual Environment & Dependencies python3 -m venv venv source venv/bin/activate - -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Step 3: Dependencies installieren -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -pip install --upgrade pip pip install -r requirements.txt -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Step 4: Konfiguration erstellen -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# 3. Konfiguration erstellen cp .env.example .env -nano .env # Passe TOKEN und andere Einstellungen an +nano .env # Token und Einstellungen anpassen -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Step 5: Erste Datenbankinitialisierung -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# 4. Datenbank initialisieren & Start python -c "from utils.database import init_db; init_db()" - -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Step 6: Bot starten -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ python main.py - -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Optional: Systemd Service erstellen (fรผr 24/7 Betrieb) -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -sudo nano /etc/systemd/system/managerx.service -# Fรผge Service-Konfiguration hinzu (siehe Dokumentation) -sudo systemctl enable managerx -sudo systemctl start managerx ```
-๐ŸชŸ Windows Installation (Click to expand) - -
+๐ŸชŸ Windows Setup (Klicken zum Aufklappen) ```powershell -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Step 1: Repository klonen -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# 1. Repository klonen git clone https://github.com/Oppro-net-Development/ManagerX.git cd ManagerX -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Step 2: Virtual Environment erstellen -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# 2. Virtual Environment & Dependencies python -m venv venv venv\Scripts\activate - -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Step 3: Dependencies installieren -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -python -m pip install --upgrade pip pip install -r req.txt -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Step 4: Konfiguration erstellen -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# 3. Konfiguration erstellen copy .env.example .env -notepad .env # TOKEN und Einstellungen anpassen +notepad .env # Token und Einstellungen anpassen -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Step 5: Datenbank initialisieren -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# 4. Datenbank initialisieren & Start python -c "from utils.database import init_db; init_db()" - -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Step 6: Bot starten -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ python main.py - -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Optional: Als Windows Service einrichten -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Siehe Dokumentation fรผr NSSM Setup ```

-### ๐Ÿ”ง Konfiguration - -
-**Minimum Requirements** - -```yaml -Operating System: - - Linux (Ubuntu 20.04+) - - Windows 10/11 - - macOS 11+ - -Software: - - Python 3.10 oder hรถher - - pip (Python Package Manager) - - Git 2.0+ - -Resources: - - RAM: 512 MB minimum - - Storage: 200 MB freier Speicher - - Network: Stabile Internetverbindung -``` +**System-Anforderungen** +- Python 3.10 oder hรถher +- Git 2.0+ +- RAM: 512 MB minimum (1 GB empfohlen) +- OS: Linux (Ubuntu rec.), Windows, macOS -**Empfohlene Konfiguration** - -```yaml -Production Environment: - - Linux Server (Ubuntu 22.04 LTS) - - Python 3.11+ - - 1 GB+ RAM - - SSD Storage - - 24/7 Uptime Hosting - -Optional Services: - - Discord Bot Token (Required) - - Weather API Key (Optional) - - Custom Domain (Optional) - - SSL Certificate (Optional) -``` +**Zusรคtzliche Dienste** +- Discord Bot Token ([Developer Portal](https://discord.com/developers/applications)) +- Weather API Key ([OpenWeatherMap](https://openweathermap.org/api)) - *Optional* +- Eigene Domain & SSL - *Optional fรผr Dashboard*
- - - - -
- -**Environment Variables (.env)** - -```bash -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# Discord Bot Configuration -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -DISCORD_TOKEN=your_bot_token_here -DISCORD_CLIENT_ID=your_client_id -DISCORD_CLIENT_SECRET=your_client_secret -DISCORD_REDIRECT_URI=http://localhost:8080/callback - -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# Optional API Keys -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -WEATHER_API=your_openweathermap_api_key - -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# Bot Settings -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -BOT_PREFIX=! -DEBUG_MODE=false -LOG_LEVEL=INFO - -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# Database Configuration -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -DATABASE_PATH=./data/managerx.db -BACKUP_ENABLED=true -BACKUP_INTERVAL=24h -``` - - - -**๐Ÿ“ Token erstellen** - -1. Besuche [Discord Developer Portal](https://discord.com/developers/applications) -2. Klicke auf "New Application" -3. Gehe zu "Bot" โ†’ "Add Bot" -4. Kopiere den Token -5. Fรผge ihn in `.env` ein - -**๐Ÿ”‘ Wichtige Berechtigungen** - -```yaml -Required Intents: - โœ“ Server Members Intent - โœ“ Message Content Intent - โœ“ Presence Intent - -Bot Permissions: - โœ“ Manage Roles - โœ“ Manage Channels - โœ“ Kick Members - โœ“ Ban Members - โœ“ Send Messages - โœ“ Embed Links - โœ“ Attach Files - โœ“ Manage Messages - โœ“ Read Message History -``` - -**๐ŸŒฆ๏ธ Weather API** - -Kostenloser API-Key: [OpenWeatherMap](https://openweathermap.org/api) - -
- -
- ---
-## ๐Ÿ“‹ Version History & Roadmap +## ๐Ÿ“‹ Roadmap & History -*Entwicklungsgeschichte und zukรผnftige Features* +*Unsere Vision fรผr die Zukunft von ManagerX*
@@ -649,169 +316,45 @@ Kostenloser API-Key: [OpenWeatherMap](https://openweathermap.org/api) ```mermaid gantt - title ManagerX Development Timeline + title ManagerX Entwicklungs-Timeline dateFormat YYYY-MM-DD - section Releases - v1.0.0 Initial Release :done, 2023-01-01, 30d - v1.5.0 Welcome System :done, 2023-05-01, 45d - v1.6.0 Levelsystem :done, 2023-08-01, 60d - v1.7.0 TempVC System :done, 2023-11-01, 45d + section Release-Zyklen v2.0.0 Major Refactor :done, 2024-06-01, 90d v2.1.0 Enhancements :active, 2025-01-01, 60d v2.5.0 Advanced Features :2025-04-01, 90d + v3.0.0 Web-only Dash :2025-10-01, 120d ```
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VersionStatusDatumKey Features
v2.1.0๐Ÿ”œ In DevQ1 2025 -โ€ข Performance Optimierungen
-โ€ข Bug Fixes & Stability
-โ€ข Enhanced Error Handling
-โ€ข UI/UX Improvements -
v2.0.0โœ… Current2024-12 -โ€ข Komplettes Code Refactoring
-โ€ข Globalchat v2 Launch
-โ€ข Enhanced Statistics Module
-โ€ข Improved Database Architecture -
v1.7.1๐Ÿ“ฆ Stable2024-08 -โ€ข Feature Enhancements
-โ€ข Critical Bug Fixes
-โ€ข Security Updates -
v1.7.0๐Ÿ“ฆ Archived2024-05 -โ€ข TempVC System Implementation
-โ€ข Dynamic Voice Channel Management
-โ€ข User Control Features -
v1.6.0๐Ÿ“ฆ Archived2024-02 -โ€ข Advanced Levelsystem
-โ€ข XP & Rewards Engine
-โ€ข Leaderboard System -
v1.5.0๐Ÿ“ฆ Archived2023-11 -โ€ข Welcome System Launch
-โ€ข Auto-Role Assignment
-โ€ข Custom Embeds -
- -
+### ๐Ÿ—บ๏ธ Meilensteine -### ๐Ÿ—บ๏ธ Roadmap +- [x] **v2.0.0**: Kompletter Code-Rewrite, Globalchat v2 & neues API-Backend. +- [/] **v2.1.0**: Performance-Optimierungen, Enhanced Error Recovery & UI/UX Politur. +- [ ] **v2.2.0**: Ticket-System, Fortgeschrittene Umfragen, Musik-Modul 2.0. +- [ ] **v2.5.0**: Plugin-System fรผr Third-Party Module, Deep Learning Moderation. - - - - - +
+
-**๐ŸŽฏ v2.1.0 - Q1 2025** +--- -```yaml -Focus: Stability & Polish +
-Features: - - Performance Tuning - - Memory Optimization - - Enhanced Logging - - Bug Fixes +## ๐Ÿค Mitwirken & Entwicklung -Improvements: - - Error Recovery - - Database Indexing - - Command Response Time - - Resource Management -``` +Werde Teil unserer Open-Source Community! -
- -**๐Ÿš€ v2.2.0 - Q2 2025** - -```yaml -Focus: New Features - -Planned Features: - - Ticket System - - Advanced Polls - - Music Module - - Custom Commands 2.0 - -Enhancements: - - AI Integration - - Multi-Language Support - - Enhanced Analytics - - API Webhooks -``` - - - -**๐Ÿ’ซ v2.3.0 - Q4 2025** - -```yaml -Focus: Major Upgrade - -Revolutionary Features: - - Web Dashboard - - Mobile App Support - - Plugin System - - Advanced AI Features - -Architecture: - - Microservices - - Cloud-Native - - Horizontal Scaling - - GraphQL API -``` +
-
+ + + + +
**๐Ÿ› Bugs**
[Melden โ†’](https://github.com/Oppro-net-Development/ManagerX/issues)
**โœจ Features**
[Vorschlagen โ†’](https://github.com/Oppro-net-Development/ManagerX/issues)
**๐Ÿ’ป PRs**
[Beitregen โ†’](https://github.com/Oppro-net-Development/ManagerX/pulls)
**๐Ÿ“– Docs**
[Verbessern โ†’][def]
-
- -
- -[๐Ÿ“– **Vollstรคndiges Changelog anzeigen** โ†’](CHANGELOG.md) -

@@ -820,161 +363,23 @@ Architecture:
-## ๐Ÿค Contributing & Development - -*Werde Teil unseres Open-Source Projekts!* +## ๐Ÿ’ฌ Support & Community -
+Brauchst du Hilfe? Tritt unserer Community bei!
-### ๐Ÿ’ก Wie kann ich beitragen? - - - - - - - - -
- -**๐Ÿ› Bug Reports** - -Fehler gefunden?
-[Issue erstellen โ†’](https://github.com/Oppro-net-Development/ManagerX/issues/new?template=bug_report.md) - -
- -**โœจ Feature Requests** - -Idee fรผr ein Feature?
-[Feature vorschlagen โ†’](https://github.com/Oppro-net-Development/ManagerX/issues/new?template=feature_request.md) - -
- -**๐Ÿ’ป Code Beitrรคge** - -Code beisteuern?
-[Pull Request โ†’](https://github.com/Oppro-net-Development/ManagerX/pulls) - -
- -**๐Ÿ“– Dokumentation** - -Docs verbessern?
-[Docs bearbeiten โ†’](https://github.com/Oppro-net-Development/ManagerX-Docs) - -
+[![Discord](https://img.shields.io/badge/Discord-Join%20Now-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/oppro) +[![Twitter](https://img.shields.io/badge/Twitter-Follow%20Us-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://twitter.com/ManagerX) +[![Website](https://img.shields.io/badge/Website-Visit%20Us-FF4500?style=for-the-badge&logo=firefox-browser&logoColor=white)](https://managerx-bot.de)
-### ๐Ÿ“ Commit-Konventionen - -Wir verwenden standardisierte Commit-Prefixes fรผr bessere Nachvollziehbarkeit: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PrรคfixVerwendungBeispiel
โœจ FEATURE:Neue Funktion hinzugefรผgtโœจ FEATURE: Add weather command integration
๐Ÿ”„ UPDATE:Bestehende Funktion verbessert๐Ÿ”„ UPDATE: Improve levelsystem performance by 40%
๐Ÿ› BUGFIX:Bug behoben (normal)๐Ÿ› BUGFIX: Fix welcome message formatting issue
๐Ÿš‘ HOTFIX:Kritischer Bug behoben๐Ÿš‘ HOTFIX: Resolve critical database connection error
๐Ÿ“š DOCS:Dokumentation aktualisiert๐Ÿ“š DOCS: Update installation guide with troubleshooting
๐Ÿ—‘๏ธ DELETE:Code/Feature entfernt๐Ÿ—‘๏ธ DELETE: Remove deprecated legacy commands
๐ŸŽจ STYLE:Code-Style ร„nderungen๐ŸŽจ STYLE: Refactor code to match PEP 8 standards
โ™ป๏ธ REFACTOR:Code-Umstrukturierungโ™ป๏ธ REFACTOR: Restructure database module architecture
โšก PERF:Performance-Verbesserungโšก PERF: Optimize query execution time
๐Ÿงช TEST:Tests hinzugefรผgt/geรคndert๐Ÿงช TEST: Add unit tests for moderation module
- +**ManagerX** wird mit โค๏ธ von [OPPRO.NET](https://oppro-network.de) entwickelt.
+*Copyright ยฉ 2026 ManagerX Development โ€ข Lizenziert unter GPL-3.0* -### ๐Ÿ“Œ Versionierungs-Schema - -Um maximale Transparenz und Aktualitรคt zu gewรคhrleisten, nutzen wir eine duale Strategie: - -* **GitHub (Source Code):** Nutzt das **Semantic Versioning** (Beispiel: `2.0.0`). Dies markiert groรŸe Meilensteine und strukturelle ร„nderungen im Code. -* **PyPI (Distribution):** Nutzt **CalVer (Calendar Versioning)** (Beispiel: `2.2026.1.9.1`). Dies ermรถglicht es Entwicklern, sofort zu erkennen, wie aktuell das installierte Paket ist. - -| Plattform | Schema | Beispiel | -| :--- | :--- | :--- | -| **GitHub** | MAJOR.MINOR.PATCH | `2.0.0` | -| **PyPI** | MAJOR.JJJJ.MM.TT | `2.2026.01.09.1` | - -### ๐Ÿ”ง Development Workflow - -```bash -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# 1. Repository forken & klonen -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -git clone https://github.com/YOUR_USERNAME/ManagerX.git -cd ManagerX - -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# 2. Development Branch erstellen -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -git checkout -b feature/amazing-feature -# Oder fรผr Bugfixes: -git checkout -b bugfix/fix-critical-issue + -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# 3. Development Environment aufsetzen -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -python -m venv venv -source venv/bin/activate # Windows: venv\Scripts\activate -pip install -r requirements-dev.txt - -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# 4. ร„nderungen vornehmen und testen -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# Code schreiben... -python main.py # Bot testen -pytest tests/ # Unit Tests ausfรผhren - -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# 5. Code Style prรผfen -# +[def]: https://github.com/Oppro-net-Development/ManagerX-Docs +``` \ No newline at end of file diff --git a/src/web/App.tsx b/src/web/App.tsx index beabac2..ef206d3 100644 --- a/src/web/App.tsx +++ b/src/web/App.tsx @@ -56,8 +56,11 @@ const AppContent = () => { } /> } /> + } /> } /> + } /> } /> + } /> } /> } /> } /> diff --git a/src/web/agb.html b/src/web/agb.html index b4985e3..c20e35c 100644 --- a/src/web/agb.html +++ b/src/web/agb.html @@ -11,7 +11,7 @@
- + \ No newline at end of file diff --git a/src/web/datenschutz.html b/src/web/datenschutz.html index 6b78975..416bd66 100644 --- a/src/web/datenschutz.html +++ b/src/web/datenschutz.html @@ -11,6 +11,6 @@
- + diff --git a/src/web/impressum.html b/src/web/impressum.html index 203503d..1bd4fd7 100644 --- a/src/web/impressum.html +++ b/src/web/impressum.html @@ -11,6 +11,6 @@
- + diff --git a/tailwind.config.ts b/tailwind.config.ts index e230372..6ef6c14 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -2,7 +2,7 @@ module.exports = { darkMode: ["class"], content: [ - "./src/web/index.html", + "./src/web/*.html", "./src/web/**/*.{ts,tsx,js,jsx}", "./src/web/components/**/*.{ts,tsx}", "./src/web/pages/**/*.{ts,tsx}", From 5b5596dec32a3869b0e3818821aabd773b2423fd Mon Sep 17 00:00:00 2001 From: Medicopter117 Date: Mon, 9 Feb 2026 08:38:12 +0100 Subject: [PATCH 4/9] feat: Implement a comprehensive welcome system, bot guild join/leave alerts, and new UI components with examples. --- src/bot/cogs/bot/join_alert.py | 36 ++++++++++++++++++++++++++++++ src/bot/cogs/bot/leave_alert.py | 37 +++++++++++++++++++++++++++++++ src/bot/cogs/guild/welcome.py | 39 ++++++++++++++++++--------------- src/bot/ui/__init__.py | 1 + src/bot/ui/emojis.py | 36 ++++++++++++++++++++++++++++++ src/bot/ui/emojis.yaml | 0 6 files changed, 131 insertions(+), 18 deletions(-) create mode 100644 src/bot/cogs/bot/join_alert.py create mode 100644 src/bot/cogs/bot/leave_alert.py create mode 100644 src/bot/ui/__init__.py create mode 100644 src/bot/ui/emojis.py delete mode 100644 src/bot/ui/emojis.yaml diff --git a/src/bot/cogs/bot/join_alert.py b/src/bot/cogs/bot/join_alert.py new file mode 100644 index 0000000..b4892fe --- /dev/null +++ b/src/bot/cogs/bot/join_alert.py @@ -0,0 +1,36 @@ +import discord +from discord.ui import Container, DesignerView +import ezcord + +class JoinAlert(ezcord.Cog): + def __init__(self, bot): + self.bot = bot + + @discord.Cog.listener() + async def on_guild_join(self, guild: discord.Guild): + # 1. Infos รผber die neue Guild sammeln + owner = guild.owner.display_name if guild.owner else "Unbekannt" + member_count = guild.member_count + + # 2. Den Py-cord Container fรผr dein Team-Log bauen + container = Container() + container.add_text(f"## ๐Ÿ“ฅ Neuer Server!") + container.add_separator() + container.add_text(f"**Name:** {guild.name}") + container.add_text(f"**Owner:** {owner}") + container.add_text(f"**Member:** {member_count}") + + # 3. Den Alert senden + # TIPP: Ersetze LOG_CHANNEL_ID mit der ID deines eigenen Support-Servers + log_channel_id = 1429163147687886889 + log_channel = self.bot.get_channel(log_channel_id) + + if log_channel: + view = DesignerView(container, timeout=None) + await log_channel.send(view=view) + + # Optionale Konsolen-Ausgabe (fรผr den Developer-Vibe) + print(f"[+] Bot ist neu auf: {guild.name}") + +def setup(bot): + bot.add_cog(JoinAlert(bot)) \ No newline at end of file diff --git a/src/bot/cogs/bot/leave_alert.py b/src/bot/cogs/bot/leave_alert.py new file mode 100644 index 0000000..f32fbec --- /dev/null +++ b/src/bot/cogs/bot/leave_alert.py @@ -0,0 +1,37 @@ +import discord +from discord.ui import Container, DesignerView +import ezcord + +class LeaveAlert(ezcord.Cog): + def __init__(self, bot): + self.bot = bot + # ID deines Kanals, in den die Info flieรŸen soll + self.log_channel_id = 1429164270435700849 + + @discord.Cog.listener() + async def on_guild_remove(self, guild: discord.Guild): + # Container fรผr den Abschied bauen + container = Container() + container.add_text("## ๐Ÿ“ค Bot wurde entfernt") + container.add_separator() + + # Falls der Name nicht mehr greifbar ist (selten), nutzen wir die ID + guild_name = guild.name if guild.name else "Unbekannter Server" + + container.add_text(f"**Server:** {guild_name}") + container.add_text(f"**ID:** {guild.id}") + + # Da wir weg sind, wissen wir nicht genau, wie viele Member es zuletzt waren, + # aber wir kรถnnen versuchen, den letzten Stand auszugeben + if guild.member_count: + container.add_text(f"**Letzter Stand:** {guild.member_count} Mitglieder") + + log_channel = self.bot.get_channel(self.log_channel_id) + if log_channel: + view = DesignerView(container, timeout=None) + await log_channel.send(view=view) + + print(f"[-] Bot hat den Server verlassen: {guild_name} ({guild.id})") + +def setup(bot): + bot.add_cog(LeaveAlert(bot)) \ No newline at end of file diff --git a/src/bot/cogs/guild/welcome.py b/src/bot/cogs/guild/welcome.py index cc9fb69..325f154 100644 --- a/src/bot/cogs/guild/welcome.py +++ b/src/bot/cogs/guild/welcome.py @@ -19,6 +19,9 @@ import ezcord from discord.ui import Container +# Emoji Import +from src.bot.ui.emojis import emoji_yes, emoji_no + # Logger Setup logger = logging.getLogger(__name__) @@ -513,7 +516,7 @@ async def set_welcome_channel(self, ctx, channel: discord.TextChannel): container.add_text( f"Welcome Messages werden nun in {channel.mention} gesendet." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) else: container = Container() container.add_text( @@ -523,7 +526,7 @@ async def set_welcome_channel(self, ctx, channel: discord.TextChannel): container.add_text( "Der Welcome Channel konnte nicht gesetzt werden." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) await ctx.respond(view=view) @welcome.command(name="message", description="Setzt die Welcome Message รผber ein Modal") @@ -615,13 +618,13 @@ async def callback(self, interaction: discord.Interaction): f"{preview[:500] + ("..." if len(preview) > 500 else "")}\n\n" "-# ๐Ÿ’ก Tipp: Verwende `/welcome test` fรผr eine vollstรคndige Vorschau oder `/welcome placeholders` fรผr alle verfรผgbaren Optionen." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) else: container = Container() container.add_text( "# โŒ Fehler\nDie Welcome Message konnte nicht gesetzt werden." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) await interaction.response.send_message(view=view) modal = WelcomeMessageModal(self, current_message) @@ -646,7 +649,7 @@ async def toggle_welcome(self, ctx): container.add_text( "# โŒ Fehler\nEs sind noch keine Welcome Einstellungen vorhanden. Setze zuerst einen Channel." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) else: status = "aktiviert" if new_state else "deaktiviert" container = Container() @@ -657,7 +660,7 @@ async def toggle_welcome(self, ctx): container.add_text( f"Das Welcome System wurde **{status}**." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) await ctx.respond(view=view) @welcome.command(name="embed", description="Aktiviert/Deaktiviert Embed Modus") @@ -685,13 +688,13 @@ async def toggle_embed(self, ctx, enabled: bool): container.add_text( f"Welcome Messages werden nun {'als Embed' if enabled else 'als normale Nachricht'} gesendet." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) else: container = Container() container.add_text( "# โŒ Fehler\nDer Embed Modus konnte nicht geรคndert werden." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) await ctx.respond(view=view) @welcome.command(name="autorole", description="Setzt eine Rolle die automatisch vergeben wird") @@ -724,7 +727,7 @@ async def set_auto_role(self, ctx, role: discord.Role = None): container.add_text( "Neue Mitglieder erhalten keine automatische Rolle mehr." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) else: # Rolle validieren @@ -733,7 +736,7 @@ async def set_auto_role(self, ctx, role: discord.Role = None): container.add_text( "# โŒ Fehler\nDiese Rolle ist hรถher als meine hรถchste Rolle. Ich kann sie nicht vergeben." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) await ctx.respond(view=view) return @@ -749,13 +752,13 @@ async def set_auto_role(self, ctx, role: discord.Role = None): container.add_text( f"Neue Mitglieder erhalten automatisch die Rolle {role.mention}." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) else: container = Container() container.add_text( "# โŒ Fehler\nDie Auto-Role konnte nicht gesetzt werden." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) await ctx.respond(view=view) @welcome.command(name="dm", description="Aktiviert/Konfiguriert private Willkommensnachrichten") @@ -797,13 +800,13 @@ async def setup_join_dm(self, ctx, enabled: bool, *, message: str = None): container.add_text( f"{description}" ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) else: container = Container() container.add_text( "# โŒ Fehler\nDie DM Einstellungen konnten nicht aktualisiert werden." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) await ctx.respond(view=view) @welcome.command(name="template", description="Lรคdt eine Vorlage") @@ -919,7 +922,7 @@ async def show_config(self, ctx): container.add_text( "# โŒ Keine Konfiguration gefunden\nEs sind noch keine Welcome Einstellungen vorhanden." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) await ctx.respond(view=view) return @@ -974,7 +977,7 @@ async def show_config(self, ctx): "## ๐Ÿ—‘๏ธ Auto-Delete\n" f"{settings.get('delete_after')} Sekunden" ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) await ctx.respond(view=view) @welcome.command(name="test", description="Testet die Welcome Message") @@ -1000,7 +1003,7 @@ async def test_welcome(self, ctx): container.add_text( "# โŒ Fehler\nEs sind noch keine Welcome Einstellungen vorhanden." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) await ctx.respond(view=view, ephemeral=True) return @@ -1009,7 +1012,7 @@ async def test_welcome(self, ctx): container.add_text( "# โŒ Fehler\nEs ist kein Welcome Channel gesetzt." ) - view = discord.ui.View(container, timeout=None) + view = discord.ui.DesignerView(container, timeout=None) await ctx.respond(view=view, ephemeral=True) return diff --git a/src/bot/ui/__init__.py b/src/bot/ui/__init__.py new file mode 100644 index 0000000..510c498 --- /dev/null +++ b/src/bot/ui/__init__.py @@ -0,0 +1 @@ +from .emojis import * \ No newline at end of file diff --git a/src/bot/ui/emojis.py b/src/bot/ui/emojis.py new file mode 100644 index 0000000..122908c --- /dev/null +++ b/src/bot/ui/emojis.py @@ -0,0 +1,36 @@ +emoji_member = "" +emoji_warn = "" +emoji_locked = "" +emoji_slowmode = "" +emoji_link = "" +emoji_delete = "" +emoji_public = "" +emoji_gift = "" +emoji_media_add = "" +emoji_rules = "" +emoji_voice_channel = "" +emoji_verified_white = "" +emoji_event = "" +emoji_pinned = "" +emoji_student_hub = "" +emoji_search = "<:search:1411749392943284374>" +emoji_manager = "<:manager:1411749363730092057>" +emoji_location = "<:location:1411749336492019915>" +emoji_entertainment = "<:entertainment:1411749311011881032>" +emoji_staff = "<:staff:1411749285627822203>" +emoji_moderator = "<:moderator:1411749252736094208>" +emoji_media = "<:media:1411749223329955860>" +emoji_copy = "<:copy:1411749194817077298>" +emoji_gif = "<:gif:1411749131034300548>" +emoji_summary = "<:summary:1411749103754281081>" +emoji_upload = "<:upload:1411749080169840760>" +emoji_add = "<:add:1411749054282596564>" +emoji_channel = "<:channel:1411749007318974484>" +emoji_developer = "<:developer:1411748983897985075>" +emoji_announcement = "<:announcement:1411748950783955025>" +emoji_statistics = "<:statistics:1411748924359971007>" +emoji_server_guide = "<:serverguide:1411748884463489166>" +emoji_owner = "<:owner:1411748853585023189>" +emoji_forbidden = "<:forbidden:1383743601791471697>" +emoji_no = "<:no:1380796085802500148>" +emoji_yes = "<:yes:1380796058963153017>" \ No newline at end of file diff --git a/src/bot/ui/emojis.yaml b/src/bot/ui/emojis.yaml deleted file mode 100644 index e69de29..0000000 From a291657977b450d57087feb36ab2c0a5389035b6 Mon Sep 17 00:00:00 2001 From: Medicopter117 Date: Mon, 9 Feb 2026 09:32:37 +0100 Subject: [PATCH 5/9] feat: Add example implementations for Discord embeds, slash commands, buttons, cogs, and containers. --- examples/bot/buttons.py | 29 +++++++++++++++++++++++++++++ examples/bot/cog.py | 4 ++-- examples/bot/containers.py | 4 ++-- examples/bot/embeds.py | 4 ++-- examples/bot/slash_command.py | 4 ++-- 5 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 examples/bot/buttons.py diff --git a/examples/bot/buttons.py b/examples/bot/buttons.py new file mode 100644 index 0000000..a1e8b55 --- /dev/null +++ b/examples/bot/buttons.py @@ -0,0 +1,29 @@ +import discord +from discord import slash_command +import ezcord + +class ExampleButtonsCog(ezcord.Cog): + def __init__(self, bot: ezcord.Bot): + self.bot = bot + + @slash_command(description="Button Example") + async def buttons(self, ctx): + await ctx.respond("Click here:", view=ExampleButtonView()) # Send the button + +async def setup(bot): + bot.add_cog(ExampleButtonsCog(bot)) + + +class ExampleButtonView(discord.ui.View): # Create a view + def __init__(self): + super().__init__() + + @discord.ui.button(label="Click Me", style=discord.ButtonStyle.primary) # Create a button + async def button_callback(self, button, interaction): # Define the button + await interaction.response.send_message("You clicked the button!") # Send a message + + # Your can more Buttons adding in a View. + + @discord.ui.button(label="Delete", style=discord.ButtonStyle.danger) # Create a button + async def delete_callback(self, button, interaction): # Define the button + await interaction.message.delete() # Delete the message \ No newline at end of file diff --git a/examples/bot/cog.py b/examples/bot/cog.py index 8657882..c7f6eed 100644 --- a/examples/bot/cog.py +++ b/examples/bot/cog.py @@ -1,9 +1,9 @@ import discord import ezcord -class Cog(ezcord.Cog): # Create a cog +class ExampleCog(ezcord.Cog): # Create a cog def __init__(self, bot): # Initialize the cog self.bot = bot # Set the bot def setup(bot): - bot.add_cog(Cog(bot)) # Add the cog to the bot \ No newline at end of file + bot.add_cog(ExampleCog(bot)) # Add the cog to the bot \ No newline at end of file diff --git a/examples/bot/containers.py b/examples/bot/containers.py index 264dfb8..8eaf6a7 100644 --- a/examples/bot/containers.py +++ b/examples/bot/containers.py @@ -2,7 +2,7 @@ # First import the Modul import discord -from discord.ui import Container # Import the Container Modul +from discord.ui import Container # Import the Container Class import ezcord class ContainerExample(ezcord.Cog): @@ -16,7 +16,7 @@ async def container(self, ctx: discord.ApplicationContext): container.add_separator() # Add a Separator to the Container container.add_text("Hello World") # Add a Text to the Container view = discord.ui.DesignerView(container, timeout=0) # Define the View - await ctx.respond(view=view) + await ctx.respond(view=view) # Send the View def setup(bot): bot.add_cog(ContainerExample(bot)) # Add the Cog to the Bot diff --git a/examples/bot/embeds.py b/examples/bot/embeds.py index ac19583..8d0fef0 100644 --- a/examples/bot/embeds.py +++ b/examples/bot/embeds.py @@ -4,7 +4,7 @@ from discord import slash_command import ezcord -class Embeds(ezcord.Cog): +class ExampleEmbeds(ezcord.Cog): def __init__(self, bot): self.bot = bot @@ -32,4 +32,4 @@ async def embed(self, ctx): await ctx.respond(embed=embed) def setup(bot): - bot.add_cog(Embeds(bot)) # Add the Cog to the Bot \ No newline at end of file + bot.add_cog(ExampleEmbeds(bot)) # Add the Cog to the Bot \ No newline at end of file diff --git a/examples/bot/slash_command.py b/examples/bot/slash_command.py index bf8f46e..1151079 100644 --- a/examples/bot/slash_command.py +++ b/examples/bot/slash_command.py @@ -2,7 +2,7 @@ import ezcord from discord import slash_command -class SlashCommand(ezcord.Cog): +class ExampleSlashCommand(ezcord.Cog): def __init__(self, bot): self.bot = bot @@ -11,4 +11,4 @@ async def ping(self, ctx): # Define the slash command await ctx.respond("Pong!") # Send a message def setup(bot): - bot.add_cog(SlashCommand(bot)) \ No newline at end of file + bot.add_cog(ExampleSlashCommand(bot)) \ No newline at end of file From 2a30fbd1ad9d7e9f80828470aa7b113b2dfb95ee Mon Sep 17 00:00:00 2001 From: Medicopter117 Date: Tue, 10 Feb 2026 09:43:24 +0100 Subject: [PATCH 6/9] feat: Add example environment file, update README, initialize translation handler, and implement bot info and guild join/leave alert cogs. --- README.md | 21 +-------------------- config/example.env | 11 +++++++++++ main.py | 26 ++++++++++++++++++++++---- src/bot/cogs/bot/about.py | 2 +- src/bot/cogs/bot/join_alert.py | 11 ++++------- src/bot/cogs/bot/leave_alert.py | 2 +- 6 files changed, 40 insertions(+), 33 deletions(-) create mode 100644 config/example.env diff --git a/README.md b/README.md index f476848..b935989 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@
-**Entwickelt von** [**OPPRO.NET Development**](https://github.com/Oppro-net-Development) **|** โšก **Powered by OPPRO.NET Networkโ„ข** +**Entwickelt von** [**ManagerX Development**](https://github.com/ManagerX-Development) **|** โšก **Powered by OPPRO.NET Networkโ„ข**
@@ -46,25 +46,6 @@ --- -## ๐Ÿ“ Projektstruktur - -Das Projekt ist modular aufgebaut, um maximale Performance und Wartbarkeit zu gewรคhrleisten. - -```text -ManagerX/ -โ”œโ”€โ”€ ๐Ÿ“‚ .github/ # GitHub-Workflows & Projektdaten (License, Contributing) -โ”œโ”€โ”€ ๐Ÿ“‚ config/ # Globale Bot-Konfiguration & Umgebungsvariablen -โ”œโ”€โ”€ ๐Ÿ“‚ data/ # Lokale Persistenz (Datenbanken, JSON-Stats) -โ”œโ”€โ”€ ๐Ÿ“‚ src/ -โ”‚ โ”œโ”€โ”€ ๐Ÿ“‚ bot/ # ๐Ÿ Core Bot Logic & Cog-System -โ”‚ โ”œโ”€โ”€ ๐Ÿ“‚ api/ # โšก FastAPI Dashboard Backend -โ”‚ โ””โ”€โ”€ ๐Ÿ“‚ web/ # โš›๏ธ React/Tailwind Dashboard Frontend -โ”œโ”€โ”€ ๐Ÿ“œ main.py # Haupteinstiegspunkt fรผr den Bot -โ””โ”€โ”€ ๐Ÿ“œ vite.config.ts # Build-Pipeline fรผr das Web-Interface -``` - ---- - ## ๐Ÿ“ฆ Schnellstart Wรคhle die passende Installationsmethode fรผr dein Szenario: diff --git a/config/example.env b/config/example.env new file mode 100644 index 0000000..b2561c8 --- /dev/null +++ b/config/example.env @@ -0,0 +1,11 @@ +TOKEN=abc123 +WEATHER_API=abc123 +ERROR_WEBHOOK=https://discord.com/api/webhooks + +DISCORD_CLIENT_ID=12345678900 +DISCORD_CLIENT_SECRET=abc123 +DISCORD_REDIRECT_URI=https:// + +URL=https:// + +DASHBOARD_API_KEYS=abc123 \ No newline at end of file diff --git a/main.py b/main.py index 05a36d5..b7c19f0 100644 --- a/main.py +++ b/main.py @@ -35,6 +35,7 @@ # API Routes fรผr Dashboard from src.api.dashboard.routes import set_bot_instance, router as dashboard_router +from mx_handler import TranslationHandler # ============================================================================= # SETUP @@ -43,6 +44,15 @@ load_dotenv(dotenv_path=BASEDIR / 'config' / '.env') colorama_init(autoreset=True) +TranslationHandler.settings( + path="translation/messages", + default_lang="de", + fallback_langs=("en", "de"), + logging=False, + colored=False, + log_level="DEBUG" +) + # Sys-Path if str(BASEDIR) not in sys.path: sys.path.append(str(BASEDIR)) @@ -111,17 +121,16 @@ async def start_webserver(): dashboard = DashboardTask(bot, BASEDIR) dashboard.register() - # Event Handler @bot.event async def on_ready(): logger.success("BOT", f"Logged in as {bot.user.name}") # --- NEU: Status API & Webserver starten --- bot.loop.create_task(start_webserver()) - + # Dashboard starten dashboard.start() - + # Bot-Status if config['features'].get('bot_status', True): await bot.change_presence( @@ -130,11 +139,20 @@ async def on_ready(): name=f"ManagerX v{BotConfig.VERSION}" ) ) - + # Commands sync await bot.sync_commands() logger.success("COMMANDS", "Application Commands synchronisiert") + # --- LIMIT CHECK START --- + all_cmds = bot.pending_application_commands + # Wir zรคhlen nur die echten Top-Level Slash Commands (Slots) + root_slots = [c for c in all_cmds if isinstance(c, discord.SlashCommand)] + + logger.info("LIMITS", f"EzCord zรคhlt (alle Funktionen): {len(bot.commands)}") + logger.info("LIMITS", f"Discord-API Slots belegt: {len(root_slots)} / 100") + # --- LIMIT CHECK ENDE --- + # Minimaler KeepAlive Cog class KeepAlive(discord.ext.commands.Cog): def __init__(self, bot): diff --git a/src/bot/cogs/bot/about.py b/src/bot/cogs/bot/about.py index c3c07e8..8bce586 100644 --- a/src/bot/cogs/bot/about.py +++ b/src/bot/cogs/bot/about.py @@ -33,7 +33,7 @@ async def about(self, ctx: discord.ApplicationContext): member_count = sum(g.member_count for g in self.bot.guilds) # Create Container - container = discord.ui.Container() + container = discord.ui.Container(color=discord.Color.red()) # Header title = await TranslationHandler.get_for_user(self.bot, ctx.author.id, "cog_about.messages.title") diff --git a/src/bot/cogs/bot/join_alert.py b/src/bot/cogs/bot/join_alert.py index b4892fe..178e87c 100644 --- a/src/bot/cogs/bot/join_alert.py +++ b/src/bot/cogs/bot/join_alert.py @@ -8,20 +8,18 @@ def __init__(self, bot): @discord.Cog.listener() async def on_guild_join(self, guild: discord.Guild): - # 1. Infos รผber die neue Guild sammeln owner = guild.owner.display_name if guild.owner else "Unbekannt" member_count = guild.member_count - # 2. Den Py-cord Container fรผr dein Team-Log bauen - container = Container() + + container = Container(color=discord.Color.green()) container.add_text(f"## ๐Ÿ“ฅ Neuer Server!") container.add_separator() container.add_text(f"**Name:** {guild.name}") container.add_text(f"**Owner:** {owner}") container.add_text(f"**Member:** {member_count}") - # 3. Den Alert senden - # TIPP: Ersetze LOG_CHANNEL_ID mit der ID deines eigenen Support-Servers + log_channel_id = 1429163147687886889 log_channel = self.bot.get_channel(log_channel_id) @@ -29,8 +27,7 @@ async def on_guild_join(self, guild: discord.Guild): view = DesignerView(container, timeout=None) await log_channel.send(view=view) - # Optionale Konsolen-Ausgabe (fรผr den Developer-Vibe) - print(f"[+] Bot ist neu auf: {guild.name}") + print(f"[+] Bot ist neu auf: {guild.name}") def setup(bot): bot.add_cog(JoinAlert(bot)) \ No newline at end of file diff --git a/src/bot/cogs/bot/leave_alert.py b/src/bot/cogs/bot/leave_alert.py index f32fbec..593834b 100644 --- a/src/bot/cogs/bot/leave_alert.py +++ b/src/bot/cogs/bot/leave_alert.py @@ -11,7 +11,7 @@ def __init__(self, bot): @discord.Cog.listener() async def on_guild_remove(self, guild: discord.Guild): # Container fรผr den Abschied bauen - container = Container() + container = Container(color=discord.Color.red()) container.add_text("## ๐Ÿ“ค Bot wurde entfernt") container.add_separator() From c3ba6a1cf76440245fcdf82b4f67596a4cb33a5f Mon Sep 17 00:00:00 2001 From: Medicopter117 Date: Tue, 10 Feb 2026 11:40:43 +0100 Subject: [PATCH 7/9] feat: Implement dynamic navigation link to go back or to the home page based on the current path. --- examples/bot/{ => views}/buttons.py | 0 examples/bot/{ => views}/containers.py | 3 --- 2 files changed, 3 deletions(-) rename examples/bot/{ => views}/buttons.py (100%) rename examples/bot/{ => views}/containers.py (98%) diff --git a/examples/bot/buttons.py b/examples/bot/views/buttons.py similarity index 100% rename from examples/bot/buttons.py rename to examples/bot/views/buttons.py diff --git a/examples/bot/containers.py b/examples/bot/views/containers.py similarity index 98% rename from examples/bot/containers.py rename to examples/bot/views/containers.py index 8eaf6a7..fa6dad0 100644 --- a/examples/bot/containers.py +++ b/examples/bot/views/containers.py @@ -20,6 +20,3 @@ async def container(self, ctx: discord.ApplicationContext): def setup(bot): bot.add_cog(ContainerExample(bot)) # Add the Cog to the Bot - - - \ No newline at end of file From e6c4544f3a324dcd1984b560f00e2b89c6c838de Mon Sep 17 00:00:00 2001 From: Medicopter117 Date: Wed, 11 Feb 2026 09:26:49 +0100 Subject: [PATCH 8/9] feat: Introduce `/about` command and extensive internationalization support with new English and German translation files. --- main.py | 1 - src/bot/cogs/bot/about.py | 34 ++ src/bot/cogs/bot/admin.py | 620 +++++++++++++++++++++++++++++++++++ translation/messages/de.yaml | 2 + translation/messages/en.yaml | 2 + 5 files changed, 658 insertions(+), 1 deletion(-) create mode 100644 src/bot/cogs/bot/admin.py diff --git a/main.py b/main.py index b7c19f0..5cac787 100644 --- a/main.py +++ b/main.py @@ -174,7 +174,6 @@ async def on_ready(self): "src/bot/cogs", subdirectories=True, ignored_cogs=ignored, - log=CogLog.sum ) logger.success("BOT", "Cogs geladen") diff --git a/src/bot/cogs/bot/about.py b/src/bot/cogs/bot/about.py index 8bce586..758f20f 100644 --- a/src/bot/cogs/bot/about.py +++ b/src/bot/cogs/bot/about.py @@ -2,6 +2,7 @@ import platform import discord from discord.ext import commands +import psutil import ezcord from mx_handler import TranslationHandler @@ -76,6 +77,39 @@ async def about(self, ctx: discord.ApplicationContext): container.add_text(tech_info) container.add_separator() + # System + system_header = await TranslationHandler.get_for_user(self.bot, ctx.author.id, "cog_about.messages.system_header") + + # Gather System Info + os_info = f"{platform.system()} {platform.release()}" + + memory = psutil.virtual_memory() + ram_info = f"{memory.used / (1024 ** 3):.2f} GB / {memory.total / (1024 ** 3):.2f} GB" + + # CPU can be 0 on first call without interval, but blocking is bad. + # We'll stick to non-blocking. + cpu_usage = f"{psutil.cpu_percent()}%" + + try: + if platform.system() == "Windows": + storage_info = "N/A" + else: + disk = psutil.disk_usage("/") + storage_info = f"{disk.used / (1024 ** 3):.2f} GB / {disk.total / (1024 ** 3):.2f} GB" + except Exception: + storage_info = "N/A" + + system_info = await TranslationHandler.get_for_user(self.bot, ctx.author.id, "cog_about.messages.system_info", + os=os_info, + ram=ram_info, + cpu=cpu_usage, + storage=storage_info + ) + + container.add_text(system_header) + container.add_text(system_info) + container.add_separator() + # Footer footer = await TranslationHandler.get_for_user(self.bot, ctx.author.id, "cog_about.messages.footer", year=datetime.now().year, diff --git a/src/bot/cogs/bot/admin.py b/src/bot/cogs/bot/admin.py new file mode 100644 index 0000000..be68a64 --- /dev/null +++ b/src/bot/cogs/bot/admin.py @@ -0,0 +1,620 @@ +import discord +from discord import SlashCommandGroup +import ezcord +from discord.ui import Container, View, Button +import sys +import os +import psutil +import platform +from datetime import datetime +import asyncio +from pathlib import Path +import math +import subprocess + +ALLOWED_IDS = [1427994077332373554] + +class ServerListView(View): + def __init__(self, guilds, page=0, per_page=20): + super().__init__(timeout=180) # 3 Minuten Timeout + self.guilds = guilds + self.page = page + self.per_page = per_page + self.max_pages = math.ceil(len(guilds) / per_page) + + self.update_buttons() + + def update_buttons(self): + # Entferne alle Buttons + self.clear_items() + + # Erste Seite Button + first_button = Button( + label="โฎ๏ธ", + style=discord.ButtonStyle.gray, + disabled=(self.page == 0) + ) + first_button.callback = self.first_page + self.add_item(first_button) + + # Vorherige Seite Button + prev_button = Button( + label="โ—€๏ธ", + style=discord.ButtonStyle.primary, + disabled=(self.page == 0) + ) + prev_button.callback = self.previous_page + self.add_item(prev_button) + + # Seiten-Anzeige (deaktivierter Button) + page_button = Button( + label=f"Seite {self.page + 1}/{self.max_pages}", + style=discord.ButtonStyle.gray, + disabled=True + ) + self.add_item(page_button) + + # Nรคchste Seite Button + next_button = Button( + label="โ–ถ๏ธ", + style=discord.ButtonStyle.primary, + disabled=(self.page >= self.max_pages - 1) + ) + next_button.callback = self.next_page + self.add_item(next_button) + + # Letzte Seite Button + last_button = Button( + label="โญ๏ธ", + style=discord.ButtonStyle.gray, + disabled=(self.page >= self.max_pages - 1) + ) + last_button.callback = self.last_page + self.add_item(last_button) + + def get_page_container(self): + start = self.page * self.per_page + end = start + self.per_page + page_guilds = self.guilds[start:end] + + guilds_text = "\n".join([ + f"**{i + start + 1}.** {guild.name}\n`ID: {guild.id}` โ€ข {guild.member_count:,} Mitglieder" + for i, guild in enumerate(page_guilds) + ]) + + container = Container(color=discord.Color.blue()) + container.add_text(f"# ๐ŸŒ Server-Liste (Seite {self.page + 1}/{self.max_pages})") + container.add_separator() + container.add_text(guilds_text if guilds_text else "*Keine Server auf dieser Seite*") + container.add_separator() + container.add_text(f"**Gesamt:** {len(self.guilds):,} Server โ€ข **Zeige:** {start + 1}-{min(end, len(self.guilds))}") + + return container + + async def first_page(self, interaction: discord.Interaction): + self.page = 0 + self.update_buttons() + await interaction.response.edit_message( + view=discord.ui.DesignerView(self.get_page_container(), view=self, timeout=180) + ) + + async def previous_page(self, interaction: discord.Interaction): + self.page = max(0, self.page - 1) + self.update_buttons() + await interaction.response.edit_message( + view=discord.ui.DesignerView(self.get_page_container(), view=self, timeout=180) + ) + + async def next_page(self, interaction: discord.Interaction): + self.page = min(self.max_pages - 1, self.page + 1) + self.update_buttons() + await interaction.response.edit_message( + view=discord.ui.DesignerView(self.get_page_container(), view=self, timeout=180) + ) + + async def last_page(self, interaction: discord.Interaction): + self.page = self.max_pages - 1 + self.update_buttons() + await interaction.response.edit_message( + view=discord.ui.DesignerView(self.get_page_container(), view=self, timeout=180) + ) + + async def on_timeout(self): + # Deaktiviere alle Buttons nach Timeout + for item in self.children: + item.disabled = True + +class admin(ezcord.Cog, hidden=True): + def __init__(self, bot): + self.bot = bot + self.start_time = datetime.now() + self.cogs_path = Path("src/bot/cogs") + + admin = SlashCommandGroup("admin", "Admin commands") + bot = admin.create_subgroup("bot", "Bot commands") + system = admin.create_subgroup("system", "System commands") + server = admin.create_subgroup("server", "Server management commands") + + async def cog_check(self, ctx): + if ctx.author.id not in ALLOWED_IDS: + await ctx.respond("Zugriff verweigert: Deine ID ist nicht autorisiert.", ephemeral=True) + return False + return True + + def get_all_cogs(self): + """Scannt das Cogs-Verzeichnis und gibt alle verfรผgbaren Cogs zurรผck""" + cogs = [] + if not self.cogs_path.exists(): + return cogs + + for category_dir in self.cogs_path.iterdir(): + if category_dir.is_dir() and not category_dir.name.startswith('_'): + for cog_file in category_dir.glob('*.py'): + if not cog_file.name.startswith('_'): + # Format: category.cogname + cog_path = f"{category_dir.name}.{cog_file.stem}" + cogs.append(cog_path) + + return sorted(cogs) + + def format_cog_path(self, cog_input: str): + """Formatiert den Cog-Pfad korrekt""" + # Wenn bereits im Format "category.cog", direkt verwenden + if '.' in cog_input: + category, cog_name = cog_input.split('.', 1) + return f"src.bot.cogs.{category}.{cog_name}" + + # Ansonsten nach dem Cog in allen Kategorien suchen + for category_dir in self.cogs_path.iterdir(): + if category_dir.is_dir() and not category_dir.name.startswith('_'): + cog_file = category_dir / f"{cog_input}.py" + if cog_file.exists(): + return f"src.bot.cogs.{category_dir.name}.{cog_input}" + + # Fallback + return f"src.bot.cogs.{cog_input}" + + # ===== SYSTEM COMMANDS ===== + + @system.command(name="shutdown", description="Stoppt den Bot-Prozess") + async def shutdown(self, ctx: discord.ApplicationContext): + container = Container(color=discord.Color.red()) + container.add_text("# โš ๏ธ ManagerX wird heruntergefahren...") + container.add_separator() + container.add_text("Dies kann ein paar Sekunden dauern.") + + await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + await self.bot.close() + sys.exit() + + @system.command(name="restart", description="Startet den Bot neu") + async def restart(self, ctx: discord.ApplicationContext): + container = Container(color=discord.Color.orange()) + container.add_text("# ๐Ÿ”„ ManagerX wird neugestartet...") + container.add_separator() + container.add_text("Der Bot sollte in wenigen Sekunden wieder online sein.") + + await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + await self.bot.close() + os.execv(sys.executable, ['python'] + sys.argv) + + @system.command(name="info", description="Zeigt System-Informationen an") + async def system_info(self, ctx: discord.ApplicationContext): + # CPU Informationen + cpu_percent = psutil.cpu_percent(interval=1) + cpu_count_physical = psutil.cpu_count(logical=False) or "N/A" + cpu_count_logical = psutil.cpu_count(logical=True) or "N/A" + cpu_freq = psutil.cpu_freq() + + # RAM Informationen + ram = psutil.virtual_memory() + ram_used = ram.used / (1024 ** 3) + ram_total = ram.total / (1024 ** 3) + ram_percent = ram.percent + ram_available = ram.available / (1024 ** 3) + + # Disk Informationen - Dynamisch fรผr Windows und Linux + # Nutze os.path.abspath(os.sep) fรผr das System-Laufwerk + disk_path = os.path.abspath(os.sep) + try: + disk = psutil.disk_usage(disk_path) + disk_used_str = f"{disk.used / (1024 ** 3):.2f} GB" + disk_total_str = f"{disk.total / (1024 ** 3):.2f} GB" + disk_percent = disk.percent + disk_free_str = f"{disk.free / (1024 ** 3):.2f} GB" + except Exception: + disk_used_str = "N/A" + disk_total_str = "N/A" + disk_percent = 0 + disk_free_str = "N/A" + + # Pfad fรผr die Anzeige formatieren (Forward Slashes verhindern Markdown-Escaping auf Windows) + display_path = disk_path.replace("\\", "/") + + # Uptime berechnen + uptime = datetime.now() - self.start_time + days = uptime.days + hours, remainder = divmod(uptime.seconds, 3600) + minutes, seconds = divmod(remainder, 60) + + # CPU Frequenz formatieren + cpu_freq_current = f"{cpu_freq.current:.0f} MHz" if cpu_freq else "N/A" + cpu_freq_max = f"{cpu_freq.max:.0f} MHz" if cpu_freq and cpu_freq.max > 0 else "N/A" + + container = Container(color=discord.Color.blue()) + container.add_text("# ๐Ÿ–ฅ๏ธ System-Informationen") + container.add_separator() + + # Betriebssystem + container.add_text("## ๐Ÿ’ป Betriebssystem") + container.add_text(f"**OS:** {platform.system()} ({platform.release()})") + container.add_text(f"**Version:** {platform.version()}") + container.add_text(f"**Architektur:** {platform.machine()}") + container.add_text(f"**Python:** {platform.python_version()}") + container.add_text(f"**Py-cord:** {discord.__version__}") + + # CPU Modell ermitteln (speziell fรผr Linux/vServer) + def get_cpu_model(): + try: + cmd = "cat /proc/cpuinfo | grep 'model name' | head -n 1 | cut -d ':' -f 2" + model = subprocess.check_output(cmd, shell=True).decode().strip() + return model if model else platform.processor() + except: + # Fallback fรผr Windows oder wenn cat/grep fehlt + if platform.system() == "Windows": + return platform.processor() + return "AMD Ryzen 9 7900" # User-Wunsch Fallback + + cpu_model = get_cpu_model() + + # CPU Informationen + container.add_text("## โš™๏ธ CPU") + container.add_text(f"**Prozessor:** {cpu_model or 'Unbekannt'}") + container.add_text(f"**Kerne:** {cpu_count_physical} Physisch, {cpu_count_logical} Logisch") + container.add_text(f"**Frequenz:** {cpu_freq_current} (Max: {cpu_freq_max})") + + # CPU Auslastungs-Balken + cpu_bar = "โ–ˆ" * int(cpu_percent / 10) + "โ–‘" * (10 - int(cpu_percent / 10)) + container.add_text(f"**Auslastung:** `{cpu_bar}` {cpu_percent}%") + + container.add_separator() + + # RAM Informationen + container.add_text("## ๐Ÿง  Arbeitsspeicher (RAM)") + container.add_text(f"**Gesamt:** {ram_total:.2f} GB") + container.add_text(f"**Verwendet:** {ram_used:.2f} GB ({ram_percent}%)") + container.add_text(f"**Verfรผgbar:** {ram_available:.2f} GB") + + # RAM Auslastungs-Balken + ram_bar = "โ–ˆ" * int(ram_percent / 10) + "โ–‘" * (10 - int(ram_percent / 10)) + container.add_text(f"`{ram_bar}` {ram_percent}%") + + container.add_separator() + + # Disk Informationen + container.add_text("## ๐Ÿ’พ Festplatte") + container.add_text(f"**Pfad:** `{display_path}`") + container.add_text(f"**Gesamt:** {disk_total_str}") + container.add_text(f"**Verwendet:** {disk_used_str} ({disk_percent}%)") + container.add_text(f"**Frei:** {disk_free_str}") + + # Disk Auslastungs-Balken + disk_bar = "โ–ˆ" * int(disk_percent / 10) + "โ–‘" * (10 - int(disk_percent / 10)) + container.add_text(f"`{disk_bar}` {disk_percent}%") + + container.add_separator() + + # Uptime + container.add_text("## โฑ๏ธ Bot-Uptime") + container.add_text(f"**Laufzeit:** {days}d {hours}h {minutes}m {seconds}s") + + await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + # ===== BOT COMMANDS ===== + + @bot.command(name="sync", description="Synchronisiert alle Slash-Commands") + async def sync(self, ctx: discord.ApplicationContext): + container = Container(color=discord.Color.blue()) + container.add_text("## ๐Ÿ”„ Synchronisierung...") + container.add_text("Befehle werden an die Discord API รผbertragen.") + + interaction = await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + try: + await self.bot.sync_commands() + + container = Container(color=discord.Color.green()) + container.add_separator() + container.add_text("โœ… **Erfolgreich synchronisiert!**") + + await interaction.edit_original_response(view=discord.ui.DesignerView(container, timeout=0)) + + except Exception as e: + container = Container(color=discord.Color.red()) + container.add_separator() + container.add_text("## โŒ Synchronisierung fehlgeschlagen!") + container.add_text(f"```py\n{e}\n```") + + await interaction.edit_original_response(view=discord.ui.DesignerView(container, timeout=0)) + + @bot.command(name="stats", description="Zeigt Bot-Statistiken an") + async def stats(self, ctx: discord.ApplicationContext): + # Bot Statistiken sammeln + guild_count = len(self.bot.guilds) + user_count = sum(guild.member_count for guild in self.bot.guilds) + text_channels = sum(len(guild.text_channels) for guild in self.bot.guilds) + voice_channels = sum(len(guild.voice_channels) for guild in self.bot.guilds) + + # Latenz + latency = round(self.bot.latency * 1000, 2) + + container = Container(color=discord.Color.green()) + container.add_text("# ๐Ÿ“Š Bot-Statistiken") + container.add_separator() + container.add_text(f"**Server:** {guild_count}") + container.add_text(f"**Benutzer:** {user_count:,}") + container.add_text(f"**Textkanรคle:** {text_channels}") + container.add_text(f"**Sprachkanรคle:** {voice_channels}") + container.add_separator() + container.add_text(f"**Latenz:** {latency} ms") + container.add_text(f"**Geladene Cogs:** {len(self.bot.cogs)}") + + await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + @bot.command(name="reload", description="Lรคdt einen Cog neu") + async def reload_cog(self, ctx: discord.ApplicationContext, cog: str): + container = Container(color=discord.Color.blue()) + container.add_text(f"## ๐Ÿ”„ Lade `{cog}` neu...") + + interaction = await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + try: + cog_path = self.format_cog_path(cog) + self.bot.reload_extension(cog_path) + + container = Container(color=discord.Color.green()) + container.add_separator() + container.add_text(f"โœ… **`{cog}` erfolgreich neu geladen!**") + container.add_text(f"*Pfad: `{cog_path}`*") + + await interaction.edit_original_response(view=discord.ui.DesignerView(container, timeout=0)) + + except Exception as e: + container = Container(color=discord.Color.red()) + container.add_separator() + container.add_text(f"## โŒ Fehler beim Neuladen von `{cog}`!") + container.add_text(f"```py\n{e}\n```") + + await interaction.edit_original_response(view=discord.ui.DesignerView(container, timeout=0)) + + @bot.command(name="load", description="Lรคdt einen Cog") + async def load_cog(self, ctx: discord.ApplicationContext, cog: str): + container = Container(color=discord.Color.blue()) + container.add_text(f"## ๐Ÿ“ฅ Lade `{cog}`...") + + interaction = await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + try: + cog_path = self.format_cog_path(cog) + self.bot.load_extension(cog_path) + + container = Container(color=discord.Color.green()) + container.add_separator() + container.add_text(f"โœ… **`{cog}` erfolgreich geladen!**") + container.add_text(f"*Pfad: `{cog_path}`*") + + await interaction.edit_original_response(view=discord.ui.DesignerView(container, timeout=0)) + + except Exception as e: + container = Container(color=discord.Color.red()) + container.add_separator() + container.add_text(f"## โŒ Fehler beim Laden von `{cog}`!") + container.add_text(f"```py\n{e}\n```") + + await interaction.edit_original_response(view=discord.ui.DesignerView(container, timeout=0)) + + @bot.command(name="unload", description="Entlรคdt einen Cog") + async def unload_cog(self, ctx: discord.ApplicationContext, cog: str): + if cog.lower() == "admin" or "admin" in cog.lower(): + container = Container(color=discord.Color.red()) + container.add_text("## โŒ Fehler!") + container.add_text("Der Admin-Cog kann nicht entladen werden.") + await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + return + + container = Container(color=discord.Color.blue()) + container.add_text(f"## ๐Ÿ“ค Entlade `{cog}`...") + + interaction = await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + try: + cog_path = self.format_cog_path(cog) + self.bot.unload_extension(cog_path) + + container = Container(color=discord.Color.green()) + container.add_separator() + container.add_text(f"โœ… **`{cog}` erfolgreich entladen!**") + container.add_text(f"*Pfad: `{cog_path}`*") + + await interaction.edit_original_response(view=discord.ui.DesignerView(container, timeout=0)) + + except Exception as e: + container = Container(color=discord.Color.red()) + container.add_separator() + container.add_text(f"## โŒ Fehler beim Entladen von `{cog}`!") + container.add_text(f"```py\n{e}\n```") + + await interaction.edit_original_response(view=discord.ui.DesignerView(container, timeout=0)) + + @bot.command(name="list_cogs", description="Listet alle geladenen Cogs auf") + async def list_cogs(self, ctx: discord.ApplicationContext): + loaded_cogs = list(self.bot.cogs.keys()) + loaded_cogs_text = "\n".join([f"โœ… `{cog}`" for cog in loaded_cogs]) + + container = Container(color=discord.Color.blue()) + container.add_text("# ๐Ÿ“ฆ Geladene Cogs") + container.add_separator() + container.add_text(loaded_cogs_text if loaded_cogs_text else "*Keine Cogs geladen*") + container.add_separator() + container.add_text(f"**Gesamt:** {len(loaded_cogs)}") + + await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + @bot.command(name="available_cogs", description="Zeigt alle verfรผgbaren Cogs an") + async def available_cogs(self, ctx: discord.ApplicationContext): + available = self.get_all_cogs() + loaded = [ext.replace('src.bot.cogs.', '') for ext in self.bot.extensions.keys()] + + # Gruppiere nach Kategorien + categories = {} + for cog in available: + category = cog.split('.')[0] + if category not in categories: + categories[category] = [] + + cog_name = cog.split('.')[1] + status = "โœ…" if cog in loaded else "โญ•" + categories[category].append(f"{status} `{cog_name}`") + + # Erstelle Ausgabe + output = [] + for category, cogs in sorted(categories.items()): + output.append(f"**__{category.upper()}__**") + output.extend(cogs) + output.append("") # Leerzeile + + container = Container(color=discord.Color.blue()) + container.add_text("# ๐Ÿ“š Verfรผgbare Cogs") + container.add_separator() + container.add_text("\n".join(output) if output else "*Keine Cogs gefunden*") + container.add_separator() + container.add_text(f"**Verfรผgbar:** {len(available)} | **Geladen:** {len(loaded)}") + container.add_text("\nโœ… = Geladen | โญ• = Nicht geladen") + + await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + @bot.command(name="reload_all", description="Lรคdt alle Cogs neu") + async def reload_all(self, ctx: discord.ApplicationContext): + container = Container(color=discord.Color.blue()) + container.add_text("## ๐Ÿ”„ Lade alle Cogs neu...") + container.add_text("Dies kann einen Moment dauern.") + + interaction = await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + success = [] + failed = [] + + # Liste aller geladenen Extensions (auรŸer admin) + extensions = [ext for ext in list(self.bot.extensions.keys()) if 'admin' not in ext.lower()] + + for ext in extensions: + try: + self.bot.reload_extension(ext) + success.append(ext.replace('src.bot.cogs.', '')) + except Exception as e: + failed.append(f"{ext.replace('src.bot.cogs.', '')}: {str(e)[:50]}") + + # Ergebnis anzeigen + result_text = [] + + if success: + result_text.append("**โœ… Erfolgreich neu geladen:**") + result_text.extend([f"โ€ข `{cog}`" for cog in success]) + + if failed: + result_text.append("\n**โŒ Fehlgeschlagen:**") + result_text.extend([f"โ€ข `{cog}`" for cog in failed]) + + container = Container(color=discord.Color.green() if not failed else discord.Color.orange()) + container.add_separator() + container.add_text("# ๐Ÿ”„ Reload abgeschlossen!") + container.add_separator() + container.add_text("\n".join(result_text)) + container.add_separator() + container.add_text(f"**Erfolgreich:** {len(success)} | **Fehlgeschlagen:** {len(failed)}") + + await interaction.edit_original_response(view=discord.ui.DesignerView(container, timeout=0)) + + # ===== SERVER COMMANDS ===== + + @server.command(name="leave", description="Verlรคsst einen Server") + async def leave_server(self, ctx: discord.ApplicationContext, guild_id: str): + try: + guild = self.bot.get_guild(int(guild_id)) + if guild is None: + container = Container(color=discord.Color.red()) + container.add_text("## โŒ Server nicht gefunden!") + container.add_text(f"Kein Server mit der ID `{guild_id}` gefunden.") + await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + return + + guild_name = guild.name + await guild.leave() + + container = Container(color=discord.Color.green()) + container.add_text("## โœ… Server verlassen!") + container.add_text(f"Erfolgreich **{guild_name}** (`{guild_id}`) verlassen.") + + await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + except Exception as e: + container = Container(color=discord.Color.red()) + container.add_text("## โŒ Fehler!") + container.add_text(f"```py\n{e}\n```") + await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + @server.command(name="list", description="Listet alle Server auf") + async def list_servers(self, ctx: discord.ApplicationContext): + guilds = sorted(self.bot.guilds, key=lambda g: g.member_count, reverse=True) + + # Wenn weniger als 20 Server, normale Anzeige + if len(guilds) <= 20: + guilds_text = "\n".join([ + f"**{i + 1}.** {guild.name}\n`ID: {guild.id}` โ€ข {guild.member_count:,} Mitglieder" + for i, guild in enumerate(guilds) + ]) + + container = Container(color=discord.Color.blue()) + container.add_text("# ๐ŸŒ Server-Liste") + container.add_separator() + container.add_text(guilds_text if guilds_text else "*Keine Server*") + container.add_separator() + container.add_text(f"**Gesamt:** {len(guilds)} Server") + + await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + # Wenn mehr als 20 Server, Pagination verwenden + else: + pagination_view = ServerListView(guilds, page=0, per_page=20) + container = pagination_view.get_page_container() + + await ctx.respond( + view=discord.ui.DesignerView(container, view=pagination_view, timeout=180), + ephemeral=True + ) + + # ===== TEST COMMAND ===== + + @bot.command(name="test", description="Testet die Bot-Funktionalitรคt") + async def test(self, ctx: discord.ApplicationContext): + container = Container(color=discord.Color.blue()) + container.add_text("## ๐Ÿ”„ Test wird ausgefรผhrt...") + + interaction = await ctx.respond(view=discord.ui.DesignerView(container, timeout=0), ephemeral=True) + + # Simuliere eine kurze Verzรถgerung + await asyncio.sleep(1) + + container = Container(color=discord.Color.green()) + container.add_text("# โœ… Test erfolgreich!") + container.add_separator() + container.add_text(f"**Bot Status:** Online") + container.add_text(f"**Latenz:** {round(self.bot.latency * 1000, 2)} ms") + container.add_text(f"**Befehl ausgefรผhrt von:** {ctx.author.mention}") + + await interaction.edit_original_response(view=discord.ui.DesignerView(container, timeout=0)) + +def setup(bot): + bot.add_cog(admin(bot)) \ No newline at end of file diff --git a/translation/messages/de.yaml b/translation/messages/de.yaml index da85db2..05ff464 100644 --- a/translation/messages/de.yaml +++ b/translation/messages/de.yaml @@ -135,4 +135,6 @@ cog_about: stats_info: "โฏ **Server:** `{server_count}`\nโฏ **User:** `{member_count}`\nโฏ **Ping:** {ping}\nโฏ **Uptime:** {uptime}" tech_header: "## ๐Ÿ› ๏ธ Technik & Versionen" tech_info: "โฏ **Python:** `v{python_version}`\nโฏ **PyCord:** `v{discord_version}`\nโฏ **EzCord:** `v{ezcord_version}`" + system_header: "## ๐Ÿ–ฅ๏ธ System" + system_info: "โฏ **OS:** `{os}`\nโฏ **RAM:** {ram}\nโฏ **CPU:** {cpu}\nโฏ **Speicher:** {storage}" footer: "{year} ManagerX Development โ€ข ManagerX v2.0.0" diff --git a/translation/messages/en.yaml b/translation/messages/en.yaml index 326288b..08d3697 100644 --- a/translation/messages/en.yaml +++ b/translation/messages/en.yaml @@ -132,4 +132,6 @@ cog_about: stats_info: "โฏ **Servers:** `{server_count}`\nโฏ **Users:** `{member_count}`\nโฏ **Ping:** {ping}\nโฏ **Uptime:** {uptime}" tech_header: "## ๐Ÿ› ๏ธ Technology & Versions" tech_info: "โฏ **Python:** `v{python_version}`\nโฏ **PyCord:** `v{discord_version}`\nโฏ **EzCord:** `v{ezcord_version}`" + system_header: "## ๐Ÿ–ฅ๏ธ System" + system_info: "โฏ **OS:** `{os}`\nโฏ **RAM:** {ram}\nโฏ **CPU:** {cpu}\nโฏ **Storage:** {storage}" footer: "{year} ManagerX Development โ€ข ManagerX v2.0.0" From 852414e9d9aa4f728e58d022c9f4a81990277032 Mon Sep 17 00:00:00 2001 From: Medicopter117 Date: Wed, 11 Feb 2026 09:30:30 +0100 Subject: [PATCH 9/9] feat: Add comprehensive German and English translation files for various bot features. --- examples/bot/views/containers.py | 2 +- translation/messages/de.yaml | 29 +++++++++++++++-------------- translation/messages/en.yaml | 26 +++++++++++++++----------- 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/examples/bot/views/containers.py b/examples/bot/views/containers.py index fa6dad0..f7e56f2 100644 --- a/examples/bot/views/containers.py +++ b/examples/bot/views/containers.py @@ -11,7 +11,7 @@ def __init__(self, bot): @discord.slash_command(name="container", description="Zeigt ein Container an") async def container(self, ctx: discord.ApplicationContext): - container = Container() # Define the Container + container = Container(color=discord.Color.blue()) # Define the Container with a color container.add_text("## Hello World") # Add a Markdown Text to the Container container.add_separator() # Add a Separator to the Container container.add_text("Hello World") # Add a Text to the Container diff --git a/translation/messages/de.yaml b/translation/messages/de.yaml index 05ff464..ad0f74b 100644 --- a/translation/messages/de.yaml +++ b/translation/messages/de.yaml @@ -1,5 +1,7 @@ +######################################################### +# General System Messages +######################################################### general: - error_types: no_permission: "Du hast keine Berechtigung, diesen Befehl auszufรผhren." user_not_found: "Benutzer nicht gefunden." @@ -7,7 +9,9 @@ general: option_missing: "Eine erforderliche Option fehlt." bot_has_no_permission: "Der Bot hat nicht die erforderlichen Berechtigungen, um diesen Befehl auszufรผhren." - +######################################################### +# Settings Cog +######################################################### cog_settings: language: error_types: @@ -16,15 +20,13 @@ cog_settings: failed_set_language: "Fehler beim Einstellen der Sprache." language_not_set: "Du hast noch keine bevorzugte Sprache eingestellt." - message: language_set: "Die Sprache wurde auf {language} gesetzt." current_language: "Deine aktuelle bevorzugte Sprache ist {language}." ######################################################### -# Fun Cogs +# Fun Cogs (Games & Entertainment) ######################################################### - cog_4gewinnt: error_types: not_your_turn: "Es ist nicht dein Zug." @@ -32,8 +34,6 @@ cog_4gewinnt: is_opponent_bot: "Du kannst nicht gegen einen Bot spielen!" is_opponent_self: "Du kannst nicht gegen dich selbst spielen!" - - win_types: win: "Spiel vorbei! {winner} hat gewonnen!\n\n{board_str}" draw: "Unentschieden!\n\n{board_str}" @@ -42,8 +42,6 @@ cog_4gewinnt: start_game: "4 Gewinnt: {author_mention} (๐Ÿ”ด) vs {opponent_mention} (๐ŸŸก)\n{author_mention} fรคngt an!\n\n" player_turn: "{view.current_player.mention} ist jetzt dran!\n\n{board_str}" - - cog_tictactoe: error_types: not_your_turn: "Es ist nicht dein Zug." @@ -51,8 +49,6 @@ cog_tictactoe: is_opponent_bot: "Du kannst nicht gegen einen Bot spielen!" is_opponent_self: "Du kannst nicht gegen dich selbst spielen!" - - win_types: win: "Spiel vorbei! {winner} hat gewonnen!" draw: "Unentschieden!" @@ -60,6 +56,9 @@ cog_tictactoe: message: start_game: "Tic Tac Toe: {author_mention} (X) gegen {opponent_mention} (O)\n{author_mention} fรคngt an!" +######################################################### +# Utility Cogs (Weather, Tools) +######################################################### cog_weather: error_types: city_not_found: "โš ๏ธ Stadt nicht gefunden." @@ -74,6 +73,9 @@ cog_weather: visibility: "**๐ŸŒซ๏ธ Sichtweite:** {visibility} km\n" pressure: "**๐Ÿงญ Luftdruck:** {pressure} hPa\n" +######################################################### +# Server Management (Autorole, etc.) +######################################################### cog_autorole: error_types: role_to_high: @@ -121,10 +123,9 @@ cog_autorole: error_forbidden: "โŒ Keine Berechtigung, um Rollen zu vergeben" error_http: "โŒ Fehler beim Zuweisen der Rollen: {error}" -####################################### -# About Cog ######################################################### - +# About Cog (System Information) +######################################################### cog_about: messages: title: "# โ„น๏ธ รœber ManagerX" diff --git a/translation/messages/en.yaml b/translation/messages/en.yaml index 08d3697..bb1f281 100644 --- a/translation/messages/en.yaml +++ b/translation/messages/en.yaml @@ -1,3 +1,6 @@ +######################################################### +# General System Messages +######################################################### general: error_types: no_permission: "You do not have permission to execute this command." @@ -6,6 +9,9 @@ general: option_missing: "A required option is missing." bot_has_no_permission: "The bot does not have the necessary permissions to execute this command." +######################################################### +# Settings Cog +######################################################### cog_settings: language: error_types: @@ -18,11 +24,9 @@ cog_settings: language_set: "Language has been set to {language}." current_language: "Your current preferred language is {language}." -################################################################### -# -# Cog Folder: cogs/fun -# -#################################################################### +######################################################### +# Fun Cogs (Games & Entertainment) +######################################################### cog_4gewinnt: error_types: not_your_turn: "It's not your turn." @@ -50,9 +54,11 @@ cog_tictactoe: draw: "It's a draw!" message: - # NEU: Nur einfache Schlรผssel verwenden start_game: "Tic Tac Toe: {author_mention} (X) vs {opponent_mention} (O)\n{author_mention} starts!" +######################################################### +# Utility Cogs (Weather, Tools) +######################################################### cog_weather: error_types: city_not_found: "โš ๏ธ City not found." @@ -68,9 +74,8 @@ cog_weather: pressure: "**๐Ÿงญ Pressure:** {pressure} hPa\n" ######################################################### -# Server Management +# Server Management (Autorole, etc.) ######################################################### - cog_autorole: error_types: role_to_high: @@ -118,10 +123,9 @@ cog_autorole: error_forbidden: "โŒ Missing permissions to assign roles" error_http: "โŒ Error while assigning roles: {error}" -####################################### -# About Cog ######################################################### - +# About Cog (System Information) +######################################################### cog_about: messages: title: "# โ„น๏ธ About ManagerX"