"""View for allowing a username update.""" import nextcord from sqlalchemy import distinct, exc, select from sqlalchemy.orm import Session # pylint: disable=import-error from database_setup.sql_data_classes import Category, CategoryGroup, Score, engine from utilities.utils import send_highscore_message class UpdateUsernameVerifyView(nextcord.ui.View): """Defines view for allowing a username update.""" def __init__(self): """ 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): # pylint: disable=unused-argument """ 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): # pylint: disable=unused-argument """ 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"] new_username: str = embed_content["fields"][1]["value"] stmt = select(distinct(Score.CategoryId)).where(Score.UserName == old_username) category_ids: list[int] = list(session.scalars(stmt)) stmt = select(Score).where(Score.UserName == old_username) for score in session.scalars(stmt): score.UserName = new_username session.commit() group_ids = select(Category.GroupId).where(Category.CategoryId.in_(category_ids)) stmt = select(CategoryGroup).where(CategoryGroup.GroupId.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)