mirror of
https://github.com/migatu/conjurer.git
synced 2026-07-14 21:38:38 +00:00
77 lines
2.9 KiB
Python
77 lines
2.9 KiB
Python
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 <entries 1-10> <keywords>
|
|
"""
|
|
# 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))
|