From c5294c943367360839db96718dce2a4fdc946e8b Mon Sep 17 00:00:00 2001 From: SimolZimol <70102430+SimolZimol@users.noreply.github.com> Date: Sun, 17 Aug 2025 18:58:32 +0200 Subject: [PATCH] modified: bot.py --- bot.py | 249 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 163 insertions(+), 86 deletions(-) diff --git a/bot.py b/bot.py index dd61bf1..ce6846f 100644 --- a/bot.py +++ b/bot.py @@ -180,7 +180,9 @@ def get_database_cursor(): pool = mysql.connector.pooling.MySQLConnectionPool( pool_name="mypool", - pool_size=10, + pool_size=30, # Erhöht von 10 auf 30 + pool_reset_session=True, + autocommit=True, host=DB_HOST, port=DB_PORT, user=DB_USER, @@ -189,39 +191,80 @@ pool = mysql.connector.pooling.MySQLConnectionPool( ) def connect_to_database(): - return pool.get_connection() + """Holt eine Verbindung aus dem Pool""" + try: + connection = pool.get_connection() + return connection + except mysql.connector.PoolError as e: + logger.error(f"Pool error: {e}") + raise e def close_database_connection(connection): - connection.close() + """Gibt eine Verbindung an den Pool zurück""" + if connection and connection.is_connected(): + connection.close() def load_user_data_from_mysql(user_id, guild_id): - connection = connect_to_database() - cursor = connection.cursor() - select_query = "SELECT * FROM user_data WHERE user_id = %s AND guild_id = %s" - cursor.execute(select_query, (user_id, guild_id)) - result = cursor.fetchone() - - cursor.close() - close_database_connection(connection) + connection = None + cursor = None + try: + connection = connect_to_database() + cursor = connection.cursor() + select_query = "SELECT * FROM user_data WHERE user_id = %s AND guild_id = %s" + cursor.execute(select_query, (user_id, guild_id)) + result = cursor.fetchone() + + if result: + user_data = { + "user_id": result[0], + "guild_id": result[1], + "permission": result[2], + "points": int(result[3]), + "ban": result[4], + "askmultus": result[5], + "filter_value": result[6], + "rank": result[7], + "chat_history": json.loads(result[8]) if result[8] else [], + "asknotes_history": json.loads(result[9]) if result[9] else [], + "xp": int(result[10]) if result[10] is not None else 0, + "level": int(result[11]) if result[11] is not None else 1, + "nickname": result[12] + } + else: + user_data = { + "user_id": user_id, + "guild_id": guild_id, + "permission": 0, + "points": 0, + "ban": 0, + "askmultus": 0, + "filter_value": 0, + "rank": 0, + "chat_history": [], + "asknotes_history": [], + "xp": 0, + "level": 1, + "nickname": "" + } + insert_user_data( + user_data["user_id"], + user_data["guild_id"], + user_data["permission"], + user_data["points"], + user_data["ban"], + user_data["askmultus"], + user_data["filter_value"], + user_data["chat_history"], + user_data["xp"], + user_data["level"], + user_data["nickname"] + ) - if result: - user_data = { - "user_id": result[0], - "guild_id": result[1], - "permission": result[2], - "points": int(result[3]), - "ban": result[4], - "askmultus": result[5], - "filter_value": result[6], - "rank": result[7], - "chat_history": json.loads(result[8]) if result[8] else [], - "asknotes_history": json.loads(result[9]) if result[9] else [], - "xp": int(result[10]) if result[10] is not None else 0, - "level": int(result[11]) if result[11] is not None else 1, - "nickname": result[12] - } - else: - user_data = { + return user_data + except Exception as e: + logger.error(f"Error loading user data from MySQL: {e}") + # Return default user data in case of error + return { "user_id": user_id, "guild_id": guild_id, "permission": 0, @@ -236,21 +279,11 @@ def load_user_data_from_mysql(user_id, guild_id): "level": 1, "nickname": "" } - insert_user_data( - user_data["user_id"], - user_data["guild_id"], - user_data["permission"], - user_data["points"], - user_data["ban"], - user_data["askmultus"], - user_data["filter_value"], - user_data["chat_history"], - user_data["xp"], - user_data["level"], - user_data["nickname"] - ) - - return user_data + finally: + if cursor: + cursor.close() + if connection: + close_database_connection(connection) cached_user_data = {} pending_deletion = {} @@ -281,28 +314,48 @@ def load_user_data(user_id, guild_id): return user_data def get_global_permission(user_id): - connection = connect_to_database() - cursor = connection.cursor() - select_query = "SELECT global_permission FROM bot_data WHERE user_id = %s" - cursor.execute(select_query, (user_id,)) - result = cursor.fetchone() - cursor.close() - connection.close() - - return result[0] if result else None + connection = None + cursor = None + try: + connection = connect_to_database() + cursor = connection.cursor() + select_query = "SELECT global_permission FROM bot_data WHERE user_id = %s" + cursor.execute(select_query, (user_id,)) + result = cursor.fetchone() + return result[0] if result else None + except Exception as e: + logger.error(f"Error getting global permission: {e}") + return None + finally: + if cursor: + cursor.close() + if connection: + close_database_connection(connection) def save_global_permission(user_id, permission_level): - connection = connect_to_database() - cursor = connection.cursor() - insert_query = """ - INSERT INTO bot_data (user_id, global_permission) - VALUES (%s, %s) - ON DUPLICATE KEY UPDATE global_permission = %s - """ - cursor.execute(insert_query, (user_id, permission_level, permission_level)) - connection.commit() - cursor.close() - connection.close() + connection = None + cursor = None + try: + connection = connect_to_database() + cursor = connection.cursor() + insert_query = """ + INSERT INTO bot_data (user_id, global_permission) + VALUES (%s, %s) + ON DUPLICATE KEY UPDATE global_permission = %s + """ + cursor.execute(insert_query, (user_id, permission_level, permission_level)) + connection.commit() + logger.info(f"Successfully saved global permission for user {user_id}: {permission_level}") + except Exception as e: + logger.error(f"Error saving global permission: {e}") + if connection: + connection.rollback() + raise e + finally: + if cursor: + cursor.close() + if connection: + close_database_connection(connection) #----------------------------------------------------------------------------------------------------------- @@ -342,17 +395,29 @@ async def update_all_users(batch_size=20, pause_duration=1): await asyncio.sleep(pause_duration) def save_giveaway_to_db(guild_id, platform, name, prize_uuid, game_key): - connection = connect_to_database() - cursor = connection.cursor() - insert_query = """ - INSERT INTO giveaway_data (guild_id, uuid, platform, name, game_key) - VALUES (%s, %s, %s, %s, %s) - """ - data = (guild_id, str(prize_uuid), platform, name, game_key) - cursor.execute(insert_query, data) - connection.commit() - cursor.close() - connection.close() + connection = None + cursor = None + try: + connection = connect_to_database() + cursor = connection.cursor() + insert_query = """ + INSERT INTO giveaway_data (guild_id, uuid, platform, name, game_key) + VALUES (%s, %s, %s, %s, %s) + """ + data = (guild_id, str(prize_uuid), platform, name, game_key) + cursor.execute(insert_query, data) + connection.commit() + logger.info(f"Successfully saved giveaway to database: UUID={prize_uuid}") + except Exception as e: + logger.error(f"Error saving giveaway to database: {e}") + if connection: + connection.rollback() + raise e + finally: + if cursor: + cursor.close() + if connection: + close_database_connection(connection) def save_winner_to_db(guild_id, platform, name, winner_dc_id, game_key="PREDEFINED_GAME_KEY"): """Erstellt einen eigenen Datenbankeintrag für jeden Gewinner mit eigener UUID""" @@ -380,19 +445,31 @@ def save_winner_to_db(guild_id, platform, name, winner_dc_id, game_key="PREDEFIN if cursor: cursor.close() if connection: - connection.close() + close_database_connection(connection) def update_winner_in_db(guild_id, prize_uuid, winner_dc_id): - connection = connect_to_database() - cursor = connection.cursor() - update_query = """ - UPDATE giveaway_data SET winner_dc_id = %s WHERE uuid = %s AND guild_id = %s - """ - data = (winner_dc_id, str(prize_uuid), guild_id) - cursor.execute(update_query, data) - connection.commit() - cursor.close() - connection.close() + connection = None + cursor = None + try: + connection = connect_to_database() + cursor = connection.cursor() + update_query = """ + UPDATE giveaway_data SET winner_dc_id = %s WHERE uuid = %s AND guild_id = %s + """ + data = (winner_dc_id, str(prize_uuid), guild_id) + cursor.execute(update_query, data) + connection.commit() + logger.info(f"Successfully updated winner in database: UUID={prize_uuid}, winner_dc_id={winner_dc_id}") + except Exception as e: + logger.error(f"Error updating winner in database: {e}") + if connection: + connection.rollback() + raise e + finally: + if cursor: + cursor.close() + if connection: + close_database_connection(connection) class Giveaway: def __init__(self, ctx, platform, prize, num_winners, title, subtitle, duration, end_time):