diff --git a/cogs/commands/__init__.py b/cogs/commands/__init__.py index f161699..d71232f 100644 --- a/cogs/commands/__init__.py +++ b/cogs/commands/__init__.py @@ -4,6 +4,7 @@ Cog loader. Adds all command cogs to the bot. from nextcord.ext import commands +from cogs.commands.remove import RemoveCog from cogs.commands.request import RequestCog from cogs.commands.set import setCog from cogs.commands.test import TestCog @@ -17,7 +18,8 @@ def setup(bot: commands.Bot): Adds all command classes to bot. """ + bot.add_cog(RemoveCog()) bot.add_cog(RequestCog(bot)) bot.add_cog(TestCog(bot)) - bot.add_cog(setCog()) bot.add_cog(ViewCog()) + bot.add_cog(setCog()) diff --git a/cogs/commands/remove.py b/cogs/commands/remove.py new file mode 100644 index 0000000..1f86346 --- /dev/null +++ b/cogs/commands/remove.py @@ -0,0 +1,86 @@ +""" +Commands for removing information in the database. +""" + +import nextcord +from nextcord.ext import commands +from sqlalchemy import delete, select +from sqlalchemy.orm import Session + +from database_setup.sql_data_classes import Presences, engine + + +class RemoveCog(commands.Cog, name="Remove Commands"): + """ + Holds the view commands. + """ + + def __init__(self) -> None: + """ + Default constructor for RemoveCog class. Does nothing. + """ + + @nextcord.slash_command( + default_member_permissions=nextcord.Permissions(administrator=True), + ) + async def remove(self, interaction: nextcord.Interaction): + """ + Parent slash command for set. Never called. + """ + + @remove.subcommand(description="Remove a presence from the database.") + async def presence( + self, + interaction: nextcord.Interaction, + presence_str: str = nextcord.SlashOption( + description="The presence to remove", required=True + ), + ): + """ + Deletes the given presence id from the database. + + Args: + interaction (nextcord.Interaction): Interaction that invoked the command. + presence (str): Is SlashOption. The presence to remove. Is the ID of the presence. + """ + + presence_id = int(presence_str) + with Session(engine) as session: + stmt = delete(Presences).where(Presences.Id == presence_id) + session.execute(stmt) + session.commit() + + await interaction.response.send_message("Presence deleted.", ephemeral=True) + + @presence.on_autocomplete("presence_str") + async def presence_autocomplete( + self, interaction: nextcord.Interaction, presence_str: str + ): + """ + Collects all presences that start with the presence string. + Sends autocomplete dict {Presence Name, Presence Id} + + Args: + interaction (nextcord.Interaction): Interaction with command. + presence_str (str): String to run autocomplete on. + """ + + with Session(engine) as session: + stmt = select(Presences) + presences_dict: "dict[str,str]" = { + pres.Presence: str(pres.Id) for pres in session.scalars(stmt) + } + + # if empty compare string + if not presence_str: + await interaction.response.send_autocomplete( + dict(list(presences_dict.items())[:25]) + ) + return + + autofilled_presences: "dict[str,str]" = { + pres: pres_id + for pres, pres_id in presences_dict.items() + if presence_str.lower() in pres.lower() + } + await interaction.response.send_autocomplete(autofilled_presences[:25]) diff --git a/cogs/commands/view.py b/cogs/commands/view.py index 776139d..04197e4 100644 --- a/cogs/commands/view.py +++ b/cogs/commands/view.py @@ -126,7 +126,7 @@ class ViewCog(commands.Cog, name="View Commands"): # if empty compare string if not election_name: - await interaction.response.send_autocomplete(elections) + await interaction.response.send_autocomplete(list(elections)[:25]) return autofilled_elections: "list[str]" = [