From 22c1946c98aad9e02639941461d4fe558d82eea0 Mon Sep 17 00:00:00 2001 From: SimolZimol <70102430+SimolZimol@users.noreply.github.com> Date: Sun, 15 Sep 2024 11:15:20 +0200 Subject: [PATCH] modified: bot.py --- bot.py | 138 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 85 insertions(+), 53 deletions(-) diff --git a/bot.py b/bot.py index 644e440..562431f 100644 --- a/bot.py +++ b/bot.py @@ -475,90 +475,122 @@ def read_background_data(filename): def get_current_datetime(): return datetime.now().strftime("%Y-%m-%d %H:%M:%S") -def calculate_level(xp): - if xp is None: - xp = 0 # Setze XP auf 0, wenn es None ist - # Hier die Berechnung für das Level basierend auf der XP - level = 5 * (xp ** 2) + 50 * xp + 100 - return level +def calculate_xp_needed_for_level(level): + """Berechnet die benötigten XP für das nächste Level.""" + return 5 * (level ** 2) + 50 * level + 100 async def add_xp_to_user(user_id, xp_gained): + """Fügt einem Benutzer XP hinzu und überprüft, ob er ein Level aufsteigt.""" + # Lade Benutzerdaten (XP, Level, etc.) user_data = load_user_data(user_id) - current_xp = user_data.get("xp", 0) - current_level = user_data.get("level", 1) - - # Füge die neu verdiente XP hinzu - new_xp = current_xp + xp_gained - next_level_xp = calculate_level(current_level) - # Level-Up-Logik - while new_xp >= next_level_xp: - new_xp -= next_level_xp - current_level += 1 - next_level_xp = calculate_level(current_level) - await notify_level_up(user_id, current_level) # Funktion für Level-Up-Benachrichtigung + # Wenn der Benutzer keine XP oder Level hat, initialisiere sie + if "xp" not in user_data: + user_data["xp"] = 0 + if "level" not in user_data: + user_data["level"] = 1 - # Speichern der neuen XP und des Levels - update_user_data(user_id, "xp", new_xp) - update_user_data(user_id, "level", current_level) + # Füge die gewonnenen XP hinzu + user_data["xp"] += xp_gained -async def notify_level_up(user_id, new_level): - user = await client.fetch_user(user_id) - await user.send(f"Congratulations! You have leveled up to level {new_level}.") + # Berechne die benötigten XP für das aktuelle Level + level = user_data["level"] + xp_needed = calculate_xp_needed_for_level(level) + + # Überprüfe, ob der Benutzer aufgestiegen ist + while user_data["xp"] >= xp_needed: + # Reduziere die überschüssigen XP und erhöhe das Level + user_data["xp"] -= xp_needed + user_data["level"] += 1 + + # Berechne die neuen XP-Anforderungen für das nächste Level + xp_needed = calculate_xp_needed_for_level(user_data["level"]) + + # Speichere die aktualisierten Benutzerdaten in der Datenbank + update_user_data(user_id, "xp", user_data["xp"]) + update_user_data(user_id, "level", user_data["level"]) @client.hybrid_command() async def level(ctx): - """Zeigt dein aktuelles Level und XP an.""" + """Zeigt den aktuellen Level und XP des Benutzers an.""" user_id = ctx.author.id + + # Lade die Benutzerdaten (XP und Level) aus der Datenbank user_data = load_user_data(user_id) - level = user_data.get("level", 1) # Verwende 1 als Standardlevel, wenn nicht vorhanden - xp = user_data.get("xp", 0) # Verwende 0 als Standard-XP, wenn nicht vorhanden - required_xp = calculate_level(level) - + if "xp" not in user_data: + user_data["xp"] = 0 + if "level" not in user_data: + user_data["level"] = 1 + + # Berechne die für das nächste Level benötigten XP + current_level = user_data["level"] + current_xp = user_data["xp"] + xp_needed = calculate_xp_needed_for_level(current_level) + + # Erstelle eine Antwort mit den aktuellen Level-Informationen embed = discord.Embed( - title="Level", - description=f"You are at level {level}.\nYou have {xp}/{required_xp} XP.", - color=0x3498db + title=f"Level Information for {ctx.author.name}", + description=f"Level: {current_level}\nXP: {current_xp}/{xp_needed}", + color=0x00ff00 ) + await ctx.send(embed=embed) @client.hybrid_command() async def leaderboard(ctx): - """Zeigt die Top 10 Benutzer nach Level und XP an.""" + """Zeigt die besten Benutzer im XP-Leaderboard an.""" connection = connect_to_database() - cursor = connection.cursor(dictionary=True) - - select_query = "SELECT user_id, level, xp FROM user_data ORDER BY level DESC, xp DESC LIMIT 10" - cursor.execute(select_query) - top_users = cursor.fetchall() - cursor.close() - connection.close() + cursor = connection.cursor() - embed = discord.Embed(title="🏆 **Leaderboard** 🏆", color=0x3498db) - - for idx, user_data in enumerate(top_users, start=1): - user = client.get_user(user_data["user_id"]) - username = user.display_name if user else f"User ID: {user_data['user_id']}" - embed.add_field(name=f"{idx}. {username}", value=f"Level {user_data['level']} - {user_data['xp']} XP", inline=False) - + # Abfrage, um die Benutzer basierend auf der XP zu sortieren + select_query = """ + SELECT user_id, xp, level FROM user_data ORDER BY level DESC, xp DESC LIMIT 10 + """ + cursor.execute(select_query) + result = cursor.fetchall() + + # Liste, um die Benutzer und ihre XP zu speichern + leaderboard_entries = [] + + # Benutzernamen über die user_id abrufen und in die Liste einfügen + for row in result: + user_id = row[0] + xp = row[1] + level = row[2] + + # Benutzername mit der user_id abrufen + user = await client.fetch_user(user_id) + username = user.name + + leaderboard_entries.append(f"{username}: Level {level}, XP {xp}") + + cursor.close() + close_database_connection(connection) + + # Erstelle die Nachricht für das Leaderboard + leaderboard_message = "\n".join(leaderboard_entries) + + embed = discord.Embed( + title="Leaderboard", + description=leaderboard_message, + color=0x00ff00 + ) await ctx.send(embed=embed) xp_cooldowns = {} @client.event async def on_message(message): + """Event-Handler, der XP vergibt, wenn Nachrichten gesendet werden.""" if message.author.bot: - return + return # Ignoriere Nachrichten von Bots user_id = message.author.id - if user_id in xp_cooldowns and time.time() < xp_cooldowns[user_id] + 60: - return # Der Benutzer hat kürzlich XP erhalten, also überspringen wir das - - xp_gained = random.randint(5, 15) + xp_gained = random.randint(15, 25) # Zufällige XP zwischen 15 und 25 vergeben await add_xp_to_user(user_id, xp_gained) - xp_cooldowns[user_id] = time.time() + # Weiterleiten der Nachricht an andere Event-Handler await client.process_commands(message) # Verwenden Sie die Funktion, um Hintergrunddaten zu laden