modified: bot.py
This commit is contained in:
247
bot.py
247
bot.py
@@ -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"
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user