"""View for allowing a username update.""" import nextcord from sqlalchemy import distinct, exc, select from sqlalchemy.orm import Session from sqlmodel import col from database.db import engine from database.models import Category, CategoryGroup, Score from utilities.utils import send_highscore_message class UpdateUsernameVerifyView(nextcord.ui.View): """Defines view for allowing a username update.""" def __init__(self) -> None: """Default constructor for UpdateUsernameVerifyView. Calls super constructor with no timeout.""" super().__init__(timeout=None) @nextcord.ui.button(label="Deny", style=nextcord.ButtonStyle.red, custom_id="deny-username-update") async def deny_button(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None: # noqa: ARG002 """ Button for denying username update. Deletes message. Args: button (nextcord.ui.Button): unused interaction (nextcord.Interaction): Interaction with the button """ await interaction.message.delete() @nextcord.ui.button(label="Approve", style=nextcord.ButtonStyle.green, custom_id="approve-username-update") async def approve_button(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None: # noqa: ARG002 """ Button for approving username update. Tells guild data to update username, then updates message to show it is complete. Args: button (nextcord.ui.Button): unused interaction (nextcord.Interaction): Interaction with the button """ with Session(engine) as session: try: embed_content = interaction.message.embeds[0].to_dict() old_username: str = embed_content["fields"][0]["value"] # type: ignore reportTypedDictNotRequiredAccess new_username: str = embed_content["fields"][1]["value"] # type: ignore reportTypedDictNotRequiredAccess stmt = select(distinct(col(Score.category_id))).where(col(Score.username) == old_username) category_ids: list[int] = list(session.scalars(stmt)) stmt = select(Score).where(col(Score.username) == old_username) for score in session.scalars(stmt): score.UserName = new_username session.commit() group_ids = select(col(Category.group_id)).where(col(Category.id).in_(category_ids)) stmt = select(CategoryGroup).where(col(CategoryGroup.id).in_(group_ids)) for group in session.scalars(stmt): await send_highscore_message(session, interaction.guild, group) content = interaction.message.content content += f"\nApproved by <@{interaction.user.id}>." await interaction.message.edit(content=content, embeds=interaction.message.embeds, view=None) except exc.DataError: session.rollback() content = interaction.message.content content += "\nError, UserName is too long." await interaction.message.edit(content=content, embeds=interaction.message.embeds, view=None) await interaction.response.send_message(content="User must resubmit with shorter name.", ephemeral=True)