From 9d1b5026098210022f923bc687b75b904b021823 Mon Sep 17 00:00:00 2001 From: SimolZimol <70102430+SimolZimol@users.noreply.github.com> Date: Thu, 9 Oct 2025 01:50:53 +0200 Subject: [PATCH] modified: bot.py --- bot.py | 85 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 24 deletions(-) diff --git a/bot.py b/bot.py index 0280d03..6c50159 100644 --- a/bot.py +++ b/bot.py @@ -781,15 +781,12 @@ async def handle_expired_process(process_uuid, process_type, data): async def handle_expired_giveaway(process_uuid, data): """Handles expired giveaway processes""" try: - giveaway_id = data.get("giveaway_id") guild_id = data.get("guild_id") channel_id = data.get("channel_id") - if not giveaway_id: - logger.error(f"No giveaway_id found in process data for {process_uuid}") - update_process_status(process_uuid, "failed") - return - + # Use process_uuid as giveaway_id since that's our new system + giveaway_id = str(process_uuid) + # Try to get giveaway from memory first, then from database giveaway = None if giveaway_id in giveaways: @@ -1342,6 +1339,40 @@ def save_winner_to_db(guild_id, platform, name, winner_dc_id, game_key="PREDEFIN if connection: close_database_connection(connection) +async def process_sponsor_mention(ctx, sponsor: str): + """Process sponsor mention to extract display name""" + try: + # Check if it's a user mention <@123456> or <@!123456> + mention_pattern = r'<@!?(\d+)>' + match = re.search(mention_pattern, sponsor) + + if match: + user_id = int(match.group(1)) + try: + # Try to get user from guild first (includes display name) + user = ctx.guild.get_member(user_id) + if user: + return user.display_name + + # Fallback to fetching user globally + user = await client.fetch_user(user_id) + if user: + return user.name + + # If all fails, return formatted user ID + return f"User#{user_id}" + + except Exception as e: + logger.warning(f"Could not fetch user {user_id}: {e}") + return f"User#{user_id}" + else: + # Not a mention, return the text as-is + return sponsor + + except Exception as e: + logger.error(f"Error processing sponsor mention: {e}") + return sponsor + async def extract_game_info(game_url: str): """Extract game information from various game store URLs""" try: @@ -1469,7 +1500,7 @@ def update_winner_in_db(guild_id, prize_uuid, winner_dc_id): close_database_connection(connection) class Giveaway: - def __init__(self, ctx, platform, prize, num_winners, title, subtitle, duration, end_time, sponsor=None, game_url=None, game_info=None): + def __init__(self, ctx, platform, prize, num_winners, title, subtitle, duration, end_time, sponsor=None, game_url=None, game_info=None, sponsor_display=None): self.ctx = ctx self.guild_id = ctx.guild.id # Speichern der guild_id self.platform = platform @@ -1479,7 +1510,8 @@ class Giveaway: self.subtitle = subtitle self.duration = duration self.end_time = end_time - self.sponsor = sponsor # New sponsor field + self.sponsor = sponsor # Original sponsor field (for embed fields) + self.sponsor_display = sponsor_display # Display name for footer self.game_url = game_url # Game store URL self.game_info = game_info # Extracted game information self.participants = [] @@ -1506,6 +1538,7 @@ class Giveaway: giveaway.title = data.get("title", "Unknown Giveaway") giveaway.subtitle = data.get("subtitle", "") giveaway.sponsor = data.get("sponsor", None) # Restore sponsor + giveaway.sponsor_display = data.get("sponsor_display", None) # Restore sponsor display giveaway.game_url = data.get("game_url", None) # Restore game URL giveaway.game_info = data.get("game_info", None) # Restore game info giveaway.duration = "restored" @@ -1521,7 +1554,6 @@ class Giveaway: """Creates an entry in the active_processes table for this giveaway""" try: giveaway_data = { - "giveaway_id": len(giveaways) + 1, # Will be set properly when added to giveaways dict "guild_id": self.guild_id, "channel_id": self.ctx.channel.id, "platform": self.platform, @@ -1530,6 +1562,7 @@ class Giveaway: "title": self.title, "subtitle": self.subtitle, "sponsor": self.sponsor, # Include sponsor in data + "sponsor_display": self.sponsor_display, # Include sponsor display name "game_url": self.game_url, # Include game URL "game_info": self.game_info, # Include game info "winner_uuids": [str(uuid) for uuid in self.winner_uuids], @@ -1561,17 +1594,12 @@ class Giveaway: logger.error(f"Error creating process entry for giveaway: {e}") def update_process_data(self, giveaway_id): - """Updates the process data with the actual giveaway ID""" + """Updates the process data with the giveaway ID (now using process UUID)""" try: - if self.process_uuid: - current_processes = get_active_processes() - for process in current_processes: - if process["uuid"] == str(self.process_uuid): - data = process["data"] or {} - data["giveaway_id"] = giveaway_id - update_process_status(self.process_uuid, "active", data=data) - logger.info(f"Updated process data for giveaway {giveaway_id}") - break + # Since giveaway_id is now the process UUID, we don't need to update it + # This method is kept for compatibility but doesn't need to do anything + logger.info(f"Giveaway using process UUID as ID: {giveaway_id}") + pass except Exception as e: logger.error(f"Error updating process data: {e}") @@ -1659,9 +1687,16 @@ async def startgiveaway(ctx, platform: str, prize: str, num_winners: int, title: if game_url: game_info = await extract_game_info(game_url) + # Process sponsor mention to get display name + sponsor_display = None + if sponsor: + sponsor_display = await process_sponsor_mention(ctx, sponsor) + # Create new giveaway - giveaway = Giveaway(ctx, platform, prize, num_winners, title, subtitle, duration, end_time, sponsor, game_url, game_info) - giveaway_id = len(giveaways) + 1 + giveaway = Giveaway(ctx, platform, prize, num_winners, title, subtitle, duration, end_time, sponsor, game_url, game_info, sponsor_display) + + # Use the process UUID as the giveaway ID (more reliable and unique) + giveaway_id = str(giveaway.process_uuid) giveaways[giveaway_id] = giveaway # Update the process data with the actual giveaway ID @@ -1709,9 +1744,11 @@ async def startgiveaway(ctx, platform: str, prize: str, num_winners: int, title: # Sponsor information if provided if sponsor: embed.add_field(name="💝 Sponsored by", value=f"**{sponsor}**", inline=False) - embed.set_footer(text=f"Giveaway ID: {giveaway_id} • Sponsored by {sponsor}") + # Use sponsor_display for footer if available, otherwise fallback to sponsor + footer_sponsor = sponsor_display if sponsor_display else sponsor + embed.set_footer(text=f"Giveaway ID: {giveaway_id[:8]}... • Sponsored by {footer_sponsor}") else: - embed.set_footer(text=f"Giveaway ID: {giveaway_id} • Good luck!") + embed.set_footer(text=f"Giveaway ID: {giveaway_id[:8]}... • Good luck!") # Set game image if available, otherwise use default if game_info and game_info.get('image_url'): @@ -1870,7 +1907,7 @@ async def on_interaction(interaction): # Nur Button-Interaktionen für Giveaways verarbeiten if interaction.type == discord.InteractionType.component and "custom_id" in interaction.data: if interaction.data["custom_id"].startswith("giveaway_"): - giveaway_id = int(interaction.data["custom_id"].split("_")[1]) + giveaway_id = interaction.data["custom_id"].split("_", 1)[1] # Get everything after "giveaway_" giveaway = giveaways.get(giveaway_id) if giveaway: