modified: bot.py
This commit is contained in:
126
bot.py
126
bot.py
@@ -475,90 +475,122 @@ def read_background_data(filename):
|
|||||||
def get_current_datetime():
|
def get_current_datetime():
|
||||||
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
def calculate_level(xp):
|
def calculate_xp_needed_for_level(level):
|
||||||
if xp is None:
|
"""Berechnet die benötigten XP für das nächste Level."""
|
||||||
xp = 0 # Setze XP auf 0, wenn es None ist
|
return 5 * (level ** 2) + 50 * level + 100
|
||||||
# Hier die Berechnung für das Level basierend auf der XP
|
|
||||||
level = 5 * (xp ** 2) + 50 * xp + 100
|
|
||||||
return level
|
|
||||||
|
|
||||||
async def add_xp_to_user(user_id, xp_gained):
|
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)
|
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
|
# Wenn der Benutzer keine XP oder Level hat, initialisiere sie
|
||||||
new_xp = current_xp + xp_gained
|
if "xp" not in user_data:
|
||||||
next_level_xp = calculate_level(current_level)
|
user_data["xp"] = 0
|
||||||
|
if "level" not in user_data:
|
||||||
|
user_data["level"] = 1
|
||||||
|
|
||||||
# Level-Up-Logik
|
# Füge die gewonnenen XP hinzu
|
||||||
while new_xp >= next_level_xp:
|
user_data["xp"] += xp_gained
|
||||||
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
|
|
||||||
|
|
||||||
# Speichern der neuen XP und des Levels
|
# Berechne die benötigten XP für das aktuelle Level
|
||||||
update_user_data(user_id, "xp", new_xp)
|
level = user_data["level"]
|
||||||
update_user_data(user_id, "level", current_level)
|
xp_needed = calculate_xp_needed_for_level(level)
|
||||||
|
|
||||||
async def notify_level_up(user_id, new_level):
|
# Überprüfe, ob der Benutzer aufgestiegen ist
|
||||||
user = await client.fetch_user(user_id)
|
while user_data["xp"] >= xp_needed:
|
||||||
await user.send(f"Congratulations! You have leveled up to level {new_level}.")
|
# 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()
|
@client.hybrid_command()
|
||||||
async def level(ctx):
|
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
|
user_id = ctx.author.id
|
||||||
|
|
||||||
|
# Lade die Benutzerdaten (XP und Level) aus der Datenbank
|
||||||
user_data = load_user_data(user_id)
|
user_data = load_user_data(user_id)
|
||||||
|
|
||||||
level = user_data.get("level", 1) # Verwende 1 als Standardlevel, wenn nicht vorhanden
|
if "xp" not in user_data:
|
||||||
xp = user_data.get("xp", 0) # Verwende 0 als Standard-XP, wenn nicht vorhanden
|
user_data["xp"] = 0
|
||||||
required_xp = calculate_level(level)
|
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(
|
embed = discord.Embed(
|
||||||
title="Level",
|
title=f"Level Information for {ctx.author.name}",
|
||||||
description=f"You are at level {level}.\nYou have {xp}/{required_xp} XP.",
|
description=f"Level: {current_level}\nXP: {current_xp}/{xp_needed}",
|
||||||
color=0x3498db
|
color=0x00ff00
|
||||||
)
|
)
|
||||||
|
|
||||||
await ctx.send(embed=embed)
|
await ctx.send(embed=embed)
|
||||||
|
|
||||||
@client.hybrid_command()
|
@client.hybrid_command()
|
||||||
async def leaderboard(ctx):
|
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()
|
connection = connect_to_database()
|
||||||
cursor = connection.cursor(dictionary=True)
|
cursor = connection.cursor()
|
||||||
|
|
||||||
select_query = "SELECT user_id, level, xp FROM user_data ORDER BY level DESC, xp DESC LIMIT 10"
|
# 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)
|
cursor.execute(select_query)
|
||||||
top_users = cursor.fetchall()
|
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()
|
cursor.close()
|
||||||
connection.close()
|
close_database_connection(connection)
|
||||||
|
|
||||||
embed = discord.Embed(title="🏆 **Leaderboard** 🏆", color=0x3498db)
|
# Erstelle die Nachricht für das Leaderboard
|
||||||
|
leaderboard_message = "\n".join(leaderboard_entries)
|
||||||
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)
|
|
||||||
|
|
||||||
|
embed = discord.Embed(
|
||||||
|
title="Leaderboard",
|
||||||
|
description=leaderboard_message,
|
||||||
|
color=0x00ff00
|
||||||
|
)
|
||||||
await ctx.send(embed=embed)
|
await ctx.send(embed=embed)
|
||||||
|
|
||||||
xp_cooldowns = {}
|
xp_cooldowns = {}
|
||||||
|
|
||||||
@client.event
|
@client.event
|
||||||
async def on_message(message):
|
async def on_message(message):
|
||||||
|
"""Event-Handler, der XP vergibt, wenn Nachrichten gesendet werden."""
|
||||||
if message.author.bot:
|
if message.author.bot:
|
||||||
return
|
return # Ignoriere Nachrichten von Bots
|
||||||
|
|
||||||
user_id = message.author.id
|
user_id = message.author.id
|
||||||
if user_id in xp_cooldowns and time.time() < xp_cooldowns[user_id] + 60:
|
xp_gained = random.randint(15, 25) # Zufällige XP zwischen 15 und 25 vergeben
|
||||||
return # Der Benutzer hat kürzlich XP erhalten, also überspringen wir das
|
|
||||||
|
|
||||||
xp_gained = random.randint(5, 15)
|
|
||||||
await add_xp_to_user(user_id, xp_gained)
|
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)
|
await client.process_commands(message)
|
||||||
|
|
||||||
# Verwenden Sie die Funktion, um Hintergrunddaten zu laden
|
# Verwenden Sie die Funktion, um Hintergrunddaten zu laden
|
||||||
|
|||||||
Reference in New Issue
Block a user