From 45f17e09d329c5a5aff987abc11662cadeee1b74 Mon Sep 17 00:00:00 2001 From: imcompiling Date: Thu, 24 Jul 2025 14:28:39 -0400 Subject: [PATCH] Feat: Update Nominate classes to use models. --- .../classes/nominate_highcouncil_views.py | 22 ++----- dakiny_bot/classes/nominate_views.py | 66 +++++++++++++------ 2 files changed, 50 insertions(+), 38 deletions(-) diff --git a/dakiny_bot/classes/nominate_highcouncil_views.py b/dakiny_bot/classes/nominate_highcouncil_views.py index da0595f..68bea29 100644 --- a/dakiny_bot/classes/nominate_highcouncil_views.py +++ b/dakiny_bot/classes/nominate_highcouncil_views.py @@ -84,9 +84,7 @@ class NominateDMModal(nextcord.ui.Modal): session.commit() else: msg: nextcord.Message = await interaction.channel.fetch_message(council_elect.discord_manager_speech_id) - await msg.edit( - content=decorate_dm_nomination(interaction.user.id, self.speech.value if self.speech.value else "") - ) + await msg.edit(content=speech) class NominateCLModal(nextcord.ui.Modal): @@ -155,9 +153,7 @@ class NominateCLModal(nextcord.ui.Modal): session.commit() else: msg: nextcord.Message = await interaction.channel.fetch_message(council_elect.clan_leader_speech_id) - await msg.edit( - content=decorate_cl_nomination(interaction.user.id, self.speech.value if self.speech.value else "") - ) + await msg.edit(content=speech) class NominateHighCouncilView(nextcord.ui.View): @@ -210,12 +206,7 @@ class NominateHighCouncilView(nextcord.ui.View): ) council_elect = session.scalar(stmt) - if council_elect is None: - dakiny_logger.error("Did not find member (id: %s) in election %s.", interaction.user.id, election_name) - return - - # user needs to exist to get here anyways... - if council_elect.discord_manager_speech_id is not None: + if council_elect is not None and council_elect.discord_manager_speech_id is not None: usr_nominated = True msg = await interaction.channel.fetch_message(council_elect.discord_manager_speech_id) speech_content = msg.content.split(NOMINEE_SPLITTER)[1] @@ -265,12 +256,7 @@ class NominateHighCouncilView(nextcord.ui.View): ) council_elect = session.scalar(stmt) - if council_elect is None: - dakiny_logger.error("Did not find member (id: %s) in election %s.", interaction.user.id, election_name) - return - - # user needs to exist to get here anyways... - if council_elect.clan_leader_speech_id is not None: + if council_elect is not None and council_elect.clan_leader_speech_id is not None: usr_nominated = True msg = await interaction.channel.fetch_message(council_elect.clan_leader_speech_id) speech_content = msg.content.split(NOMINEE_SPLITTER)[1] diff --git a/dakiny_bot/classes/nominate_views.py b/dakiny_bot/classes/nominate_views.py index 434f6d5..32e6fb0 100644 --- a/dakiny_bot/classes/nominate_views.py +++ b/dakiny_bot/classes/nominate_views.py @@ -1,12 +1,16 @@ """Contains various views to be used in the nomination process.""" import nextcord -from dakiny_bot.dakiny_settings import settings -from dakiny_bot.database.sql_data_classes import CouncilMembers, engine -from dakiny_bot.utils import NOMINEE_SPLITTER, decorate_nomination, get_election_name from nextcord.interactions import Interaction from sqlalchemy import select from sqlalchemy.orm import Session +from sqlmodel import col + +from dakiny_bot.dakiny_settings import settings +from dakiny_bot.database.db import engine +from dakiny_bot.database.models import CouncilMember +from dakiny_bot.logger import dakiny_logger +from dakiny_bot.utils import NOMINEE_SPLITTER, decorate_nomination, get_election_name class NominateModal(nextcord.ui.Modal): @@ -47,31 +51,45 @@ class NominateModal(nextcord.ui.Modal): interaction (Interaction): Interaction with user. """ - speech = decorate_nomination(interaction.user.id, self.speech.value) + if interaction.user is None or not isinstance(interaction.channel, nextcord.TextChannel): + # ignore none... Don't know what situation this is. + # if not textchannel, don't know how callback happened + return + + speech = decorate_nomination(interaction.user.id, self.speech.value if self.speech.value else "") election_name = get_election_name() with Session(engine) as session: if not self.usr_nominated: msg = await interaction.channel.send(speech) - council_member = CouncilMembers( - ElectionName=election_name, - MemberId=interaction.user.id, - SpeechMsgId=msg.id, + council_member = CouncilMember( + election_name=election_name, + member_id=interaction.user.id, + speech_msg_id=msg.id, ) session.add(council_member) session.commit() else: # user already nominated, just need to update the election speech stmt = ( - select(CouncilMembers) - .where(CouncilMembers.ElectionName == election_name) - .where(CouncilMembers.MemberId == self.usr_id) + select(CouncilMember) + .where(col(CouncilMember.election_name == election_name)) + .where(col(CouncilMember.member_id == self.usr_id)) ) - obj = session.scalar(stmt) + council_elect = session.scalar(stmt) - msg: nextcord.Message = await interaction.channel.fetch_message(obj.SpeechMsgId) - await msg.edit(content=decorate_nomination(interaction.user.id, self.speech.value)) + if council_elect is None: + dakiny_logger.error("Did not find member (id: %s) in election %s.", self.usr_id, election_name) + return + + if council_elect.speech_msg_id is None: + msg = await interaction.channel.send(speech) + council_elect.speech_msg_id = msg.id + session.commit() + else: + msg: nextcord.Message = await interaction.channel.fetch_message(council_elect.speech_msg_id) + await msg.edit(content=speech) class NominateView(nextcord.ui.View): @@ -97,8 +115,16 @@ class NominateView(nextcord.ui.View): button (nextcord.ui.Button): Unused. idk why its needed in the decorator interaction (nextcord.Interaction): Interaction of user who pressed the button """ + if interaction.user is None or not isinstance(interaction.channel, nextcord.TextChannel): + # ignore none... Don't know what situation this is. + # if not textchannel, don't know how callback happened + return + # enforce members only - if self.guild.get_role(settings.role_ids.clan_member) not in interaction.user.roles: + if ( + isinstance(interaction.user, nextcord.User) + or self.guild.get_role(settings.role_ids.clan_member) not in interaction.user.roles + ): await interaction.response.send_message( f"You must have the <@&{settings.role_ids.clan_member}> role to vote.", ephemeral=True, @@ -110,14 +136,14 @@ class NominateView(nextcord.ui.View): speech_content = "" with Session(engine) as session: stmt = ( - select(CouncilMembers) - .where(CouncilMembers.ElectionName == election_name) - .where(CouncilMembers.MemberId == interaction.user.id) + select(CouncilMember) + .where(col(CouncilMember.election_name == election_name)) + .where(col(CouncilMember.member_id == interaction.user.id)) ) obj = session.scalar(stmt) - if obj is not None: + if obj is not None and obj.speech_msg_id is not None: usr_nominated = True - msg = await interaction.channel.fetch_message(obj.SpeechMsgId) + msg = await interaction.channel.fetch_message(obj.speech_msg_id) speech_content = msg.content.split(NOMINEE_SPLITTER)[1] await interaction.response.send_modal(NominateModal(interaction.user.id, usr_nominated, speech_content))