modified: bot.py

This commit is contained in:
SimolZimol
2025-08-17 18:58:32 +02:00
parent 87f959e596
commit c5294c9433

249
bot.py
View File

@@ -180,7 +180,9 @@ def get_database_cursor():
pool = mysql.connector.pooling.MySQLConnectionPool( pool = mysql.connector.pooling.MySQLConnectionPool(
pool_name="mypool", pool_name="mypool",
pool_size=10, pool_size=30, # Erhöht von 10 auf 30
pool_reset_session=True,
autocommit=True,
host=DB_HOST, host=DB_HOST,
port=DB_PORT, port=DB_PORT,
user=DB_USER, user=DB_USER,
@@ -189,39 +191,80 @@ pool = mysql.connector.pooling.MySQLConnectionPool(
) )
def connect_to_database(): 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): 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): def load_user_data_from_mysql(user_id, guild_id):
connection = connect_to_database() connection = None
cursor = connection.cursor() cursor = None
select_query = "SELECT * FROM user_data WHERE user_id = %s AND guild_id = %s" try:
cursor.execute(select_query, (user_id, guild_id)) connection = connect_to_database()
result = cursor.fetchone() cursor = connection.cursor()
select_query = "SELECT * FROM user_data WHERE user_id = %s AND guild_id = %s"
cursor.close() cursor.execute(select_query, (user_id, guild_id))
close_database_connection(connection) 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: return user_data
user_data = { except Exception as e:
"user_id": result[0], logger.error(f"Error loading user data from MySQL: {e}")
"guild_id": result[1], # Return default user data in case of error
"permission": result[2], return {
"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, "user_id": user_id,
"guild_id": guild_id, "guild_id": guild_id,
"permission": 0, "permission": 0,
@@ -236,21 +279,11 @@ def load_user_data_from_mysql(user_id, guild_id):
"level": 1, "level": 1,
"nickname": "" "nickname": ""
} }
insert_user_data( finally:
user_data["user_id"], if cursor:
user_data["guild_id"], cursor.close()
user_data["permission"], if connection:
user_data["points"], close_database_connection(connection)
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
cached_user_data = {} cached_user_data = {}
pending_deletion = {} pending_deletion = {}
@@ -281,28 +314,48 @@ def load_user_data(user_id, guild_id):
return user_data return user_data
def get_global_permission(user_id): def get_global_permission(user_id):
connection = connect_to_database() connection = None
cursor = connection.cursor() cursor = None
select_query = "SELECT global_permission FROM bot_data WHERE user_id = %s" try:
cursor.execute(select_query, (user_id,)) connection = connect_to_database()
result = cursor.fetchone() cursor = connection.cursor()
cursor.close() select_query = "SELECT global_permission FROM bot_data WHERE user_id = %s"
connection.close() cursor.execute(select_query, (user_id,))
result = cursor.fetchone()
return result[0] if result else None 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): def save_global_permission(user_id, permission_level):
connection = connect_to_database() connection = None
cursor = connection.cursor() cursor = None
insert_query = """ try:
INSERT INTO bot_data (user_id, global_permission) connection = connect_to_database()
VALUES (%s, %s) cursor = connection.cursor()
ON DUPLICATE KEY UPDATE global_permission = %s insert_query = """
""" INSERT INTO bot_data (user_id, global_permission)
cursor.execute(insert_query, (user_id, permission_level, permission_level)) VALUES (%s, %s)
connection.commit() ON DUPLICATE KEY UPDATE global_permission = %s
cursor.close() """
connection.close() 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) await asyncio.sleep(pause_duration)
def save_giveaway_to_db(guild_id, platform, name, prize_uuid, game_key): def save_giveaway_to_db(guild_id, platform, name, prize_uuid, game_key):
connection = connect_to_database() connection = None
cursor = connection.cursor() cursor = None
insert_query = """ try:
INSERT INTO giveaway_data (guild_id, uuid, platform, name, game_key) connection = connect_to_database()
VALUES (%s, %s, %s, %s, %s) cursor = connection.cursor()
""" insert_query = """
data = (guild_id, str(prize_uuid), platform, name, game_key) INSERT INTO giveaway_data (guild_id, uuid, platform, name, game_key)
cursor.execute(insert_query, data) VALUES (%s, %s, %s, %s, %s)
connection.commit() """
cursor.close() data = (guild_id, str(prize_uuid), platform, name, game_key)
connection.close() 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"): 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""" """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: if cursor:
cursor.close() cursor.close()
if connection: if connection:
connection.close() close_database_connection(connection)
def update_winner_in_db(guild_id, prize_uuid, winner_dc_id): def update_winner_in_db(guild_id, prize_uuid, winner_dc_id):
connection = connect_to_database() connection = None
cursor = connection.cursor() cursor = None
update_query = """ try:
UPDATE giveaway_data SET winner_dc_id = %s WHERE uuid = %s AND guild_id = %s connection = connect_to_database()
""" cursor = connection.cursor()
data = (winner_dc_id, str(prize_uuid), guild_id) update_query = """
cursor.execute(update_query, data) UPDATE giveaway_data SET winner_dc_id = %s WHERE uuid = %s AND guild_id = %s
connection.commit() """
cursor.close() data = (winner_dc_id, str(prize_uuid), guild_id)
connection.close() 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: class Giveaway:
def __init__(self, ctx, platform, prize, num_winners, title, subtitle, duration, end_time): def __init__(self, ctx, platform, prize, num_winners, title, subtitle, duration, end_time):