Ein Discord-Bot mit Levelsystem, Reaction Roles, Musik, Feedback, Willkommensnachrichten und Server-Logging.
- ✨ Funktionen
- 🛠️ Voraussetzungen
- 🚀 Installation
- 🐳 Docker
- ⚙️ Umgebungsvariablen
- 📜 Befehle
- ⭐ Levelsystem
- 🎭 Reaction Roles
- 📝 Logging
- 📁 Projektstruktur
- 🗃️ Datenbank
- 🐛 Fehlerbehebung
- 📄 Lizenz
- 👋 Willkommensnachrichten für neue Mitglieder
- 🧹 Bereinigung ehemaliger Mitglieder
- 🎭 Reaction Roles mit Standard- und benutzerdefinierten Emojis
- ⭐ Levelsystem mit XP und Cooldown
- 🏆 Leaderboard und Server-Rang
- ✨ Moderne Level-Up-Nachrichten
- 🎵 Musik mit Warteschlange
- ⏭️ Skip- und Stop-Funktionen
- 🧹 Nachrichten löschen
- 💬 Feedback-System
- 📝 Server-Logging
- 🔐 Zentrale Berechtigungsprüfungen
- 🛡️ Prüfung der Rollen-Hierarchie
- 🗃️ MariaDB-/MySQL-Unterstützung
- 🐳 Docker-Unterstützung
- 🔄 Sauberes Herunterfahren bei Docker und Unraid
- Node.js 20 oder höher
- MariaDB oder MySQL
- Ein Discord-Bot mit Token
- Eine Discord Application ID
- Optional: Docker und Docker Compose
Für den Bot müssen folgende Discord-Intents aktiviert sein:
GuildsGuildMessagesMessageContentGuildVoiceStatesGuildMembersGuildMessageReactions
Repository klonen:
git clone https://github.com/DarkNinja-Lab/ByteBot-DiscordBot.git
cd ByteBot-DiscordBotAbhängigkeiten installieren:
npm installDatenbank importieren:
mysql -u DEIN_DB_USER -p discord < import.sqlBot starten:
npm startContainer bauen und starten:
docker compose up -d --buildLogs anzeigen:
docker compose logs -fContainer stoppen:
docker compose downNach Änderungen neu bauen:
docker compose down
docker compose up -d --build --force-recreateBeim Herunterfahren reagiert der Bot auf:
SIGINT
SIGTERM
Dabei werden unter anderem:
- Discord-Verbindungen geschlossen
- Voice-Verbindungen beendet
- Warteschlangen geleert
- Datenbankverbindungen geschlossen
Erstelle im Projektverzeichnis eine Datei namens .env:
# Discord
DISCORD_TOKEN=DEIN_DISCORD_BOT_TOKEN
DISCORD_APPLICATION_ID=DEINE_DISCORD_APPLICATION_ID
# Datenbank
DB_HOST=localhost
DB_USER=DEIN_DB_BENUTZER
DB_PASS=DEIN_DB_PASSWORT
DB_NAME=discord
DB_PORT=3306
# Optionale Einstellungen
DB_CONNECTION_LIMIT=10
DEBUG_SQL=falseIm normalen Betrieb:
DEBUG_SQL=falseFür die Fehlersuche:
DEBUG_SQL=trueDanach den Container neu erstellen:
docker compose down
docker compose up -d --build --force-recreateDie .env-Datei darf nicht veröffentlicht oder in Git gespeichert werden.
Die Hilfe im Discord kann mit folgendem Befehl geöffnet werden:
/hilfe
Aktuell vorhandene Befehle:
/clearmessages
/feedback-send
/feedback-setoutput
/hilfe
/leaderboard
/level
/play
/queue
/reactionrole
/removereactionrole
/xp-remove
/xp-setlevelpoints
/xp-setlevelreward
/xp-setlevelupchannel
/setlogchannel
/setwelcomechannel
/skip
/stop
Je nach Befehl werden unterschiedliche Berechtigungen benötigt.
Benutzer erhalten XP durch normale Nachrichten auf dem Server.
Dabei gelten folgende Regeln:
- 🤖 Bot-Nachrichten werden ignoriert
- ✍️ Sehr kurze Nachrichten geben keine XP
- 🎲 Die XP-Menge wird zufällig bestimmt
- ⏱️ Ein Cooldown verhindert XP-Spam
- 📈 Höhere Level benötigen mehr XP
- 🔒 Pro Benutzer und Server gibt es nur einen Level-Datensatz
- 🧹 Leveldaten ehemaliger Mitglieder werden entfernt
- 🛡️ Gleichzeitige XP-Verarbeitung wird abgesichert
Level anzeigen:
/level
Level eines anderen Benutzers anzeigen:
/level user:@Benutzer
Leaderboard anzeigen:
/leaderboard
Die Leveldaten werden in der Tabelle levels gespeichert.
Wichtig ist der eindeutige Datenbankindex:
UNIQUE KEY unique_user_guild (user_id, guild_id)Mit Reaction Roles können Benutzer sich über Reaktionen selbst Rollen geben.
Der Bot prüft vor jeder Vergabe:
- Existiert die Rolle noch?
- Ist die Rolle keine verwaltete Rolle?
- Kann der Bot die Rolle verwalten?
- Steht die Bot-Rolle über der Zielrolle?
- Ist der Benutzer noch Mitglied des Servers?
- Besitzt der Benutzer die Rolle bereits?
Die Bot-Rolle muss in den Servereinstellungen über allen Reaction-Role-Rollen stehen.
Reaction Roles werden in dieser Tabelle gespeichert:
reaction_roles
Beim Start prüft der Bot außerdem bestehende Reaction Roles und bereinigt alte Reaktionen ehemaliger Mitglieder.
Über diesen Befehl kann ein Log-Kanal festgelegt werden:
/setlogchannel
Der Bot kann unter anderem folgende Ereignisse protokollieren:
- 🗑️ Gelöschte Nachrichten
- ✏️ Bearbeitete Nachrichten
- 👋 Neue Mitglieder
- 🚪 Mitglieder, die den Server verlassen
- 👢 Gekickte Mitglieder
- ⛔ Banns
- ✅ Entbannungen
- 📝 Nickname-Änderungen
- 🎙️ Änderungen am Voice-Status
- 😊 Erstellte Emojis
- 🗑️ Gelöschte Emojis
Das Logging ist von der eigentlichen Bot-Logik getrennt.
Dadurch verarbeitet log.js keine Reaction Roles und vergibt keine Rollen doppelt.
.
├── bot.js
├── db.js
├── config.js
├── log.js
├── import.sql
├── package.json
├── Dockerfile
│
├── commands/
│ ├── clear.js
│ ├── feedback.js
│ ├── help.js
│ ├── leaderboard.js
│ ├── level.js
│ ├── play.js
│ ├── queue.js
│ ├── reactionrole.js
│ ├── removexp.js
│ ├── setfeedback.js
│ ├── setlevelpoints.js
│ ├── setlevelreward.js
│ ├── setlevelupchannel.js
│ ├── setlogchannel.js
│ ├── setwelcome.js
│ ├── skip.js
│ └── stop.js
│
├── events/
│ ├── guildMemberAdd.js
│ ├── guildMemberRemove.js
│ ├── messageCreate.js
│ ├── messageReactionAdd.js
│ ├── messageReactionRemove.js
│ └── processExistingReactions.js
│
└── utils/
├── cleanupDepartedMembers.js
├── levelSystem.js
└── permissions.js
| Datei | Aufgabe |
|---|---|
bot.js |
Startet den Bot und lädt Befehle und Events |
db.js |
Verbindung zu MariaDB/MySQL |
config.js |
Serverbezogene Konfiguration |
log.js |
Server-Logging |
utils/levelSystem.js |
XP, Level und Leaderboard |
utils/permissions.js |
Zentrale Berechtigungsprüfungen |
utils/cleanupDepartedMembers.js |
Bereinigung ehemaliger Mitglieder |
import.sql |
Datenbankstruktur |
Die Datenbankstruktur befindet sich in:
import.sql
Wichtige Tabellen:
config
levels
level_settings
levelup_channels
reaction_roles
server_config
feedback_settings
Für die levels-Tabelle sollte dieser Unique-Key vorhanden sein:
UNIQUE KEY unique_user_guild (user_id, guild_id)Für ein Datenbank-Backup:
mysqldump -u DEIN_DB_USER -p discord > bytebot_backup.sqlContainer-Logs anzeigen:
docker compose logs --tail=200 bytebot-discordbotWenn eine Reaction Role nicht funktioniert, prüfe:
- Existiert die Rolle noch?
- Steht die Bot-Rolle über der Zielrolle?
- Hat der Bot
Rollen verwalten? - Stimmen Nachrichten-ID, Kanal-ID und Rollen-ID?
- Ist das Emoji korrekt gespeichert?
Wenn keine XP gespeichert werden, prüfe:
SELECT
user_id,
guild_id,
xp,
level
FROM levels
ORDER BY level DESC, xp DESC;Unique-Index prüfen:
SHOW INDEX FROM levels;Bei Datenbankproblemen kann vorübergehend aktiviert werden:
DEBUG_SQL=trueDieses Projekt steht unter der MIT-Lizenz.
Die Lizenz befindet sich in:
LICENSE.md
⭐