""" 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 Category, CategoryGroup, engine 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 perminant.", 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): 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.GroupId == 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: nextcord.TextChannel = interaction.guild.get_channel(group.ChannelId) message: nextcord.Message = await channel.fetch_message(group.MessageId) await message.delete() else: stmt = ( delete(Category) .where(Category.GroupId == del_vals["group_id"]) .where(Category.CategoryId == 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: 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