modified: bot.py

This commit is contained in:
SimolZimol
2025-10-09 15:17:51 +02:00
parent 688e034039
commit e96f4432fe

247
bot.py
View File

@@ -1520,6 +1520,7 @@ class Giveaway:
self.participants = [] self.participants = []
self.prize_uuid = uuid.uuid4() # Generiert eine eindeutige UUID für das Gewinnspiel self.prize_uuid = uuid.uuid4() # Generiert eine eindeutige UUID für das Gewinnspiel
self.game_key = f"PREDEFINED_GAME_KEY" # Platzhalter für den tatsächlichen Game-Key self.game_key = f"PREDEFINED_GAME_KEY" # Platzhalter für den tatsächlichen Game-Key
self.message_id = None # Store the giveaway message ID for editing
# Erstelle nur die Gewinner-Einträge, KEINEN Haupt-Eintrag # Erstelle nur die Gewinner-Einträge, KEINEN Haupt-Eintrag
self.winner_uuids = create_winner_slots_in_db(self.guild_id, self.platform, self.title, self.num_winners, self.game_key) self.winner_uuids = create_winner_slots_in_db(self.guild_id, self.platform, self.title, self.num_winners, self.game_key)
@@ -1551,6 +1552,7 @@ class Giveaway:
giveaway.game_key = data.get("game_key", "PREDEFINED_GAME_KEY") giveaway.game_key = data.get("game_key", "PREDEFINED_GAME_KEY")
giveaway.winner_uuids = data.get("winner_uuids", []) giveaway.winner_uuids = data.get("winner_uuids", [])
giveaway.process_uuid = None giveaway.process_uuid = None
giveaway.message_id = data.get("message_id", None) # Restore message ID
return giveaway return giveaway
def create_process_entry(self): def create_process_entry(self):
@@ -1597,15 +1599,139 @@ class Giveaway:
logger.error(f"Error creating process entry for giveaway: {e}") logger.error(f"Error creating process entry for giveaway: {e}")
def update_process_data(self, giveaway_id): def update_process_data(self, giveaway_id):
"""Updates the process data with the giveaway ID (now using process UUID)""" """Updates the process data with the giveaway ID and current data"""
try: try:
# Since giveaway_id is now the process UUID, we don't need to update it # Update process data with current giveaway information
# This method is kept for compatibility but doesn't need to do anything giveaway_data = {
logger.info(f"Giveaway using process UUID as ID: {giveaway_id}") "guild_id": self.guild_id,
pass "channel_id": self.ctx.channel.id,
"platform": self.platform,
"prize": self.prize,
"num_winners": self.num_winners,
"title": self.title,
"subtitle": self.subtitle,
"sponsor": self.sponsor,
"sponsor_display": self.sponsor_display,
"game_url": self.game_url,
"game_info": self.game_info,
"winner_uuids": [str(uuid) for uuid in self.winner_uuids],
"prize_uuid": str(self.prize_uuid),
"game_key": self.game_key,
"message_id": self.message_id, # Include message ID
"participants": [{"id": p.id, "name": p.name} for p in self.participants]
}
if self.process_uuid:
update_process_status(self.process_uuid, "active", data=giveaway_data)
logger.info(f"Updated process data for giveaway {giveaway_id}")
except Exception as e: except Exception as e:
logger.error(f"Error updating process data: {e}") logger.error(f"Error updating process data: {e}")
def save_giveaway_data(self):
"""Save current giveaway data to database"""
try:
giveaway_data = {
"guild_id": self.guild_id,
"channel_id": self.ctx.channel.id,
"platform": self.platform,
"prize": self.prize,
"num_winners": self.num_winners,
"title": self.title,
"subtitle": self.subtitle,
"sponsor": self.sponsor,
"sponsor_display": self.sponsor_display,
"game_url": self.game_url,
"game_info": self.game_info,
"winner_uuids": [str(uuid) for uuid in self.winner_uuids],
"prize_uuid": str(self.prize_uuid),
"game_key": self.game_key,
"message_id": self.message_id, # Include message ID
"participants": [{"id": p.id, "name": p.name} for p in self.participants]
}
if self.process_uuid:
update_process_status(self.process_uuid, "active", data=giveaway_data)
except Exception as e:
logger.error(f"Error saving giveaway data: {e}")
async def update_giveaway_message(self):
"""Update the original giveaway message with current data"""
try:
if not self.message_id:
logger.warning("No message ID stored for giveaway, cannot update message")
return False
# Get the channel and message
channel = self.ctx.channel
try:
message = await channel.fetch_message(self.message_id)
except discord.NotFound:
logger.warning(f"Giveaway message {self.message_id} not found")
return False
except discord.Forbidden:
logger.warning(f"No permission to access message {self.message_id}")
return False
# Recreate the embed with updated data
unix_end_time = int(time.mktime(self.end_time.timetuple()))
embed = discord.Embed(
title=f"🎉 {self.title}",
description=f"{self.subtitle}",
color=0xFFD700,
timestamp=self.end_time
)
# Game information with clickable link if available
if self.game_info and self.game_info.get('name'):
if self.game_url:
prize_text = f"**[{self.game_info['name']}]({self.game_url})**"
else:
prize_text = f"**{self.game_info['name']}**"
# Add additional game details if available
if self.game_info.get('description'):
prize_text += f"\n*{self.game_info['description'][:100]}{'...' if len(self.game_info.get('description', '')) > 100 else ''}*"
else:
# Fallback to original prize text with URL if available
if self.game_url:
prize_text = f"**[{self.prize}]({self.game_url})**"
else:
prize_text = f"**{self.prize}**"
# Main prize information
embed.add_field(name="🎁 Prize", value=prize_text, inline=True)
embed.add_field(name="🎮 Platform", value=f"**{self.platform}**", inline=True)
embed.add_field(name="👥 Winners", value=f"**{self.num_winners}**", inline=True)
# Time information
embed.add_field(name="⏰ Ends", value=f"<t:{unix_end_time}:F>\n<t:{unix_end_time}:R>", inline=False)
# Sponsor information if provided
if self.sponsor:
embed.add_field(name="💝 Sponsored by", value=f"**{self.sponsor}**", inline=False)
# Use sponsor_display for footer if available, otherwise fallback to sponsor
footer_sponsor = self.sponsor_display if self.sponsor_display else self.sponsor
embed.set_footer(text=f"Giveaway ID: {str(self.process_uuid)[:8]}... • Sponsored by {footer_sponsor}")
else:
embed.set_footer(text=f"Giveaway ID: {str(self.process_uuid)[:8]}... • Good luck!")
# Set game image if available, otherwise use default
if self.game_info and self.game_info.get('image_url'):
embed.set_image(url=self.game_info['image_url'])
embed.set_thumbnail(url="https://cdn.discordapp.com/emojis/1028701098145587302.png")
else:
embed.set_thumbnail(url="https://cdn.discordapp.com/emojis/1028701098145587302.png")
# Update the message (keep the same view/buttons)
await message.edit(embed=embed)
logger.info(f"Updated giveaway message {self.message_id}")
return True
except Exception as e:
logger.error(f"Error updating giveaway message: {e}")
return False
def add_participant(self, user): def add_participant(self, user):
if user not in self.participants: if user not in self.participants:
self.participants.append(user) self.participants.append(user)
@@ -1760,7 +1886,12 @@ async def startgiveaway(ctx, platform: str, prize: str, num_winners: int, title:
else: else:
embed.set_thumbnail(url="https://cdn.discordapp.com/emojis/1028701098145587302.png") embed.set_thumbnail(url="https://cdn.discordapp.com/emojis/1028701098145587302.png")
await ctx.send(embed=embed, view=view) # Send the message and store the message ID
message = await ctx.send(embed=embed, view=view)
giveaway.message_id = message.id
# Save the updated giveaway data including message_id
giveaway.save_giveaway_data()
# Start the process manager if it's not already running # Start the process manager if it's not already running
if not process_manager.is_running(): if not process_manager.is_running():
@@ -1851,30 +1982,21 @@ async def editgiveaway(ctx, giveaway_id: str, field: str, *, new_value: str):
except Exception as e: except Exception as e:
logger.error(f"Error updating process end_time: {e}") logger.error(f"Error updating process end_time: {e}")
# Update process data in database # Save updated giveaway data to database
try: try:
giveaway_data = { matching_giveaway.save_giveaway_data()
"guild_id": matching_giveaway.guild_id,
"channel_id": matching_giveaway.ctx.channel.id,
"platform": matching_giveaway.platform,
"prize": matching_giveaway.prize,
"num_winners": matching_giveaway.num_winners,
"title": matching_giveaway.title,
"subtitle": matching_giveaway.subtitle,
"sponsor": matching_giveaway.sponsor,
"sponsor_display": matching_giveaway.sponsor_display,
"game_url": matching_giveaway.game_url,
"game_info": matching_giveaway.game_info,
"winner_uuids": [str(uuid) for uuid in matching_giveaway.winner_uuids],
"prize_uuid": str(matching_giveaway.prize_uuid),
"game_key": matching_giveaway.game_key,
"participants": []
}
update_process_status(matching_giveaway.process_uuid, "active", data=giveaway_data)
except Exception as e: except Exception as e:
logger.error(f"Error updating process data: {e}") logger.error(f"Error updating process data: {e}")
# Update the giveaway message with new data
message_updated = False
try:
message_updated = await matching_giveaway.update_giveaway_message()
if not message_updated:
logger.warning(f"Could not update giveaway message for {matching_id[:8]}")
except Exception as e:
logger.error(f"Error updating giveaway message: {e}")
# Success message # Success message
embed = discord.Embed( embed = discord.Embed(
title="✅ Giveaway Updated", title="✅ Giveaway Updated",
@@ -1894,7 +2016,13 @@ async def editgiveaway(ctx, giveaway_id: str, field: str, *, new_value: str):
value=f"<t:{int(matching_giveaway.end_time.timestamp())}:F>\n<t:{int(matching_giveaway.end_time.timestamp())}:R>", value=f"<t:{int(matching_giveaway.end_time.timestamp())}:F>\n<t:{int(matching_giveaway.end_time.timestamp())}:R>",
inline=False) inline=False)
embed.set_footer(text="Changes are immediately effective") # Show message update status
if message_updated:
embed.add_field(name="📝 Message Status", value="✅ Original post updated", inline=False)
embed.set_footer(text="Changes are immediately effective • Original giveaway post updated")
else:
embed.add_field(name="📝 Message Status", value="⚠️ Could not update original post", inline=False)
embed.set_footer(text="Changes are effective • Original post may need manual update")
await ctx.send(embed=embed) await ctx.send(embed=embed)
@@ -1904,6 +2032,64 @@ async def editgiveaway(ctx, giveaway_id: str, field: str, *, new_value: str):
logger.error(f"Error editing giveaway: {e}") logger.error(f"Error editing giveaway: {e}")
await ctx.send(f"❌ Error editing giveaway: {str(e)}") await ctx.send(f"❌ Error editing giveaway: {str(e)}")
@client.hybrid_command()
async def updategiveawaymessage(ctx, giveaway_id: str):
"""Manually update a giveaway message (Only available for admins)"""
guild_id = ctx.guild.id
user_data = load_user_data_sync(ctx.author.id, guild_id)
if user_data["permission"] < 5:
await ctx.send("You don't have permission to update giveaway messages.")
return
# Find giveaway by partial ID
matching_giveaway = None
matching_id = None
for giv_id, giveaway in giveaways.items():
if giv_id.startswith(giveaway_id) or giveaway_id in giv_id:
matching_giveaway = giveaway
matching_id = giv_id
break
if not matching_giveaway:
await ctx.send(f"❌ No active giveaway found with ID starting with `{giveaway_id}`")
return
try:
# Try to update the message
message_updated = await matching_giveaway.update_giveaway_message()
if message_updated:
embed = discord.Embed(
title="✅ Message Updated",
description=f"Successfully updated the giveaway message!",
color=0x00ff00,
timestamp=datetime.now()
)
embed.add_field(name="🆔 Giveaway ID", value=f"`{matching_id[:8]}...`", inline=True)
embed.add_field(name="📝 Updated by", value=ctx.author.mention, inline=True)
embed.set_footer(text="Original giveaway post has been refreshed")
else:
embed = discord.Embed(
title="❌ Update Failed",
description=f"Could not update the giveaway message.",
color=0xff0000,
timestamp=datetime.now()
)
embed.add_field(name="🆔 Giveaway ID", value=f"`{matching_id[:8]}...`", inline=True)
embed.add_field(name="❓ Possible Reasons",
value="• Message was deleted\n• Bot lacks permissions\n• Message ID not found",
inline=False)
embed.set_footer(text="Check logs for more details")
await ctx.send(embed=embed)
logger.info(f"Manual message update attempted for giveaway {matching_id[:8]} by {ctx.author.id}: {message_updated}")
except Exception as e:
logger.error(f"Error updating giveaway message: {e}")
await ctx.send(f"❌ Error updating giveaway message: {str(e)}")
@client.hybrid_command() @client.hybrid_command()
async def listgiveaways(ctx): async def listgiveaways(ctx):
"""List all active giveaways in this server (Only available for admins)""" """List all active giveaways in this server (Only available for admins)"""
@@ -3080,7 +3266,12 @@ async def modhelp(ctx):
"`/restorewarn <warning_id>` - Reactivate a warning (Level 6+)\n" "`/restorewarn <warning_id>` - Reactivate a warning (Level 6+)\n"
"`/modstats [user]` - View moderation statistics\n" "`/modstats [user]` - View moderation statistics\n"
"`/processes <action> [type]` - Manage active processes\n" "`/processes <action> [type]` - Manage active processes\n"
"`/startgiveaway` - Create server giveaways\n" "`/startgiveaway` - Create server giveaways with Steam/Epic integration\n"
"`/editgiveaway <id> <field> <value>` - Edit active giveaways (auto-updates post)\n"
"`/listgiveaways` - List all active giveaways (memory + database)\n"
"`/loadgiveaway <id>` - Load specific giveaway from database\n"
"`/loadallgiveaways` - Load all giveaways from database\n"
"`/updategiveawaymessage <id>` - Manually refresh giveaway post\n"
"`/join` - Make bot join a server\n" "`/join` - Make bot join a server\n"
"`/leave` - Make bot leave a server" "`/leave` - Make bot leave a server"
), ),