import os import discord from discord.ext import commands import file_search_functions class FileSelectView(discord.ui.View): def __init__(self, files): super().__init__(timeout=60) # Create select options for each file options = [discord.SelectOption(label=os.path.basename(f)[:100], description=f, value=f) for f in files] self.select = discord.ui.Select( placeholder="Select files...", min_values=1, max_values=len(options), options=options ) self.select.callback = self.select_callback self.add_item(self.select) self.selected = [] async def select_callback(self, interaction: discord.Interaction): # Store selected file paths self.selected = self.select.values await interaction.response.defer() @discord.ui.button(label="Accept", style=discord.ButtonStyle.green) async def accept_callback(self, button: discord.ui.Button, interaction: discord.Interaction): # Handle acceptance if not self.selected: await interaction.response.send_message("No files selected.", ephemeral=True) return # Publish selected files links = file_search_functions.publish(self.selected) # Display the returned links await interaction.response.edit_message(content="Published Links:\n" + "\n".join(links), view=None) @discord.ui.button(label="Cancel", style=discord.ButtonStyle.red) async def cancel_callback(self, button: discord.ui.Button, interaction: discord.Interaction): # Handle cancellation await interaction.response.edit_message(content="Operation cancelled.", view=None) class FileSearchCog(commands.Cog): """Cog providing a file search and publish command.""" def __init__(self, bot: commands.Bot): self.bot = bot @commands.command(name="findfiles") async def findfiles(self, ctx: commands.Context, entries: int, *, keywords: str): """ Search for files matching keywords and publish selected ones. Usage: !findfiles """ # Validate entries if entries < 1 or entries > 10: await ctx.send("❌ Entries must be between 1 and 10.") return # Parse keywords keyword_list = keywords.split() # Find matching files files = file_search_functions.find_matches(entries, keyword_list) if not files: await ctx.send("🔍 No matching files found.") return # Send a message with a selection UI view = FileSelectView(files) file_list = "\n".join(f"{i+1}. {f}" for i, f in enumerate(files)) await ctx.send( f"🔍 Found files (select and click Accept or Cancel):\n{file_list}", view=view ) async def setup(bot: commands.Bot): """Load the FileSearchCog.""" await bot.add_cog(FileSearchCog(bot))