"""View for allowing a username update.""" import nextcord from sqlalchemy import distinct, select # pylint: disable=import-error from highscores import Category, CategoryGroup, Score, session 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 """ 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)).subquery() stmt = select(CategoryGroup).where(CategoryGroup.GroupId.in_(group_ids)) for group in session.scalars(stmt): await send_highscore_message(interaction.guild.get_channel(group.ChannelId), group)