"""Contains view and helper functions for confirming and processing deletes.""" import nextcord from sqlalchemy import delete, select from sqlalchemy.orm import Session from database.db import engine from database.models import Category, CategoryGroup from utilities.utils import send_highscore_message class DeleteConfirmView(nextcord.ui.Modal): """View modal popup for confirming deletions.""" def __init__(self, custom_id: str): super().__init__(title="Warning, deletion is permanent.", custom_id=custom_id) self.checker = nextcord.ui.TextInput( label='Type "delete" to confirm deletion.', required=True, placeholder="delete", style=nextcord.TextInputStyle.short, ) self.add_item(self.checker) async def callback(self, interaction: nextcord.Interaction) -> None: """Action for confirming deletion. Args: interaction (nextcord.Interaction): User interaction object with the modal. """ if self.checker.value.lower() != "delete": await interaction.response.send_message('Response was not "delete". Canceling delete.') return del_vals = parse_delete_id(self.custom_id) with Session(engine) as session: stmt = select(CategoryGroup).where(CategoryGroup.id == del_vals["group_id"]) group = session.scalar(stmt) if del_vals["category_id"] is None: # delete entire group session.delete(group) # delete the message related to group channel = interaction.guild.get_channel(group.channel_id) if not isinstance(channel, nextcord.TextChannel): return message: nextcord.Message = await channel.fetch_message(group.message_id) await message.delete() else: stmt = ( delete(Category) .where(Category.group_id == del_vals["group_id"]) .where(Category.id == del_vals["category_id"]) ) session.execute(stmt) # update the message await send_highscore_message(session, interaction.guild, group) session.commit() await interaction.response.send_message("Deletion complete.", ephemeral=True) def create_delete_id(group_id: int, category_id: int | None = None) -> str: """ Creates a delete id string to tell the view what to delete. Args: group_id (int): group id to delete category_id (Optional[int]): category id to delete. Can be None. Returns: str: string representation of the delete id. """ return f"delete-{group_id}-{category_id}" def parse_delete_id(delete_id: str) -> dict: """ Returns a dict containing the values of a delete id. Args: delete_id (str): the delete id Returns: dict: dict containing values from a delete id. """ vals = {} group_id = delete_id.split("-")[1] category_id = delete_id.split("-")[2] vals["group_id"] = group_id if category_id == "None": vals["category_id"] = None else: vals["category_id"] = category_id return vals