diff --git a/bot.py b/bot.py index 61debd4..b2b5bf9 100644 --- a/bot.py +++ b/bot.py @@ -279,52 +279,40 @@ def save_global_permission(user_id, permission_level): #----------------------------------------------------------------------------------------------------------- -async def update_all_users(): +async def update_all_users(batch_size=20, pause_duration=1): connection = connect_to_database() cursor = connection.cursor() - - # Hole alle Guild-IDs aus der guilds-Datenbank - cursor.execute("SELECT guild_id FROM guilds") + cursor.execute("SELECT DISTINCT guild_id FROM guilds") guilds = cursor.fetchall() - - for (guild_id,) in guilds: - guild = client.get_guild(int(guild_id)) - if not guild: - continue # Falls der Bot auf diesem Server nicht mehr aktiv ist, überspringen - - print(f"Updating users for guild: {guild_id}") - - # Aktualisiere Benutzerdaten für alle Mitglieder im Server - for member in guild.members: - user_id = member.id - user_data = load_user_data(user_id, guild_id) - - print(f"Processing member: {member.display_name} (ID: {user_id})") - - # Aktualisiere Nickname, Profilbild und Join-Datum für vorhandene Mitglieder - update_user_data(user_id, guild_id, "nickname", member.display_name) - update_user_data(user_id, guild_id, "profile_picture", str(member.display_avatar.url)) - update_user_data(user_id, guild_id, "join_date", member.joined_at.date()) - - # Entferne leave_date, falls der Benutzer noch auf dem Server ist und leave_date gesetzt war - if user_data.get("leave_date") is not None: - print(f"Clearing leave_date for user: {member.display_name}") - update_user_data(user_id, guild_id, "leave_date", None) - - # Überprüfe alle Benutzer in `user_data`, die nicht mehr auf dem Server sind - cursor.execute("SELECT user_id FROM user_data WHERE guild_id = %s", (guild_id,)) - all_users = cursor.fetchall() - - for (user_id,) in all_users: - member = guild.get_member(int(user_id)) - if member is None: # Benutzer hat den Server verlassen - print(f"User {user_id} has left the guild {guild_id}, setting leave_date.") - leave_date = datetime.now().date() - update_user_data(user_id, guild_id, "leave_date", leave_date) - cursor.close() - connection.close() - print("User data update completed.") + close_database_connection(connection) + + for guild_id_tuple in guilds: + guild_id = guild_id_tuple[0] + guild = client.get_guild(int(guild_id)) + if guild: + members = guild.members + total_members = len(members) + for i in range(0, total_members, batch_size): + batch = members[i:i + batch_size] + + for member in batch: + user_id = member.id + user_data = load_user_data(user_id, guild_id) + + # Daten aktualisieren + nickname = member.display_name + profile_picture = str(member.display_avatar.url) if member.display_avatar else None + join_date = member.joined_at.date() if member.joined_at else None + leave_date = None if member in guild.members else datetime.now().date() + + update_user_data(user_id, guild_id, "nickname", nickname) + update_user_data(user_id, guild_id, "profile_picture", profile_picture) + update_user_data(user_id, guild_id, "join_date", join_date) + update_user_data(user_id, guild_id, "leave_date", leave_date) + + # Pause nach jeder Charge + await asyncio.sleep(pause_duration) def save_giveaway_to_db(guild_id, platform, name, prize_uuid, game_key): connection = connect_to_database()