Feat: Update Nominate classes to use models.
build_develop / build (push) Successful in 44s

This commit is contained in:
2025-07-24 14:28:39 -04:00
parent 530ca5b172
commit 45f17e09d3
2 changed files with 50 additions and 38 deletions
@@ -84,9 +84,7 @@ class NominateDMModal(nextcord.ui.Modal):
session.commit() session.commit()
else: else:
msg: nextcord.Message = await interaction.channel.fetch_message(council_elect.discord_manager_speech_id) msg: nextcord.Message = await interaction.channel.fetch_message(council_elect.discord_manager_speech_id)
await msg.edit( await msg.edit(content=speech)
content=decorate_dm_nomination(interaction.user.id, self.speech.value if self.speech.value else "")
)
class NominateCLModal(nextcord.ui.Modal): class NominateCLModal(nextcord.ui.Modal):
@@ -155,9 +153,7 @@ class NominateCLModal(nextcord.ui.Modal):
session.commit() session.commit()
else: else:
msg: nextcord.Message = await interaction.channel.fetch_message(council_elect.clan_leader_speech_id) msg: nextcord.Message = await interaction.channel.fetch_message(council_elect.clan_leader_speech_id)
await msg.edit( await msg.edit(content=speech)
content=decorate_cl_nomination(interaction.user.id, self.speech.value if self.speech.value else "")
)
class NominateHighCouncilView(nextcord.ui.View): class NominateHighCouncilView(nextcord.ui.View):
@@ -210,12 +206,7 @@ class NominateHighCouncilView(nextcord.ui.View):
) )
council_elect = session.scalar(stmt) council_elect = session.scalar(stmt)
if council_elect is None: if council_elect is not None and council_elect.discord_manager_speech_id is not 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:
usr_nominated = True usr_nominated = True
msg = await interaction.channel.fetch_message(council_elect.discord_manager_speech_id) msg = await interaction.channel.fetch_message(council_elect.discord_manager_speech_id)
speech_content = msg.content.split(NOMINEE_SPLITTER)[1] speech_content = msg.content.split(NOMINEE_SPLITTER)[1]
@@ -265,12 +256,7 @@ class NominateHighCouncilView(nextcord.ui.View):
) )
council_elect = session.scalar(stmt) council_elect = session.scalar(stmt)
if council_elect is None: if council_elect is not None and council_elect.clan_leader_speech_id is not 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:
usr_nominated = True usr_nominated = True
msg = await interaction.channel.fetch_message(council_elect.clan_leader_speech_id) msg = await interaction.channel.fetch_message(council_elect.clan_leader_speech_id)
speech_content = msg.content.split(NOMINEE_SPLITTER)[1] speech_content = msg.content.split(NOMINEE_SPLITTER)[1]
+46 -20
View File
@@ -1,12 +1,16 @@
"""Contains various views to be used in the nomination process.""" """Contains various views to be used in the nomination process."""
import nextcord 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 nextcord.interactions import Interaction
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.orm import Session 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): class NominateModal(nextcord.ui.Modal):
@@ -47,31 +51,45 @@ class NominateModal(nextcord.ui.Modal):
interaction (Interaction): Interaction with user. 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() election_name = get_election_name()
with Session(engine) as session: with Session(engine) as session:
if not self.usr_nominated: if not self.usr_nominated:
msg = await interaction.channel.send(speech) msg = await interaction.channel.send(speech)
council_member = CouncilMembers( council_member = CouncilMember(
ElectionName=election_name, election_name=election_name,
MemberId=interaction.user.id, member_id=interaction.user.id,
SpeechMsgId=msg.id, speech_msg_id=msg.id,
) )
session.add(council_member) session.add(council_member)
session.commit() session.commit()
else: else:
# user already nominated, just need to update the election speech # user already nominated, just need to update the election speech
stmt = ( stmt = (
select(CouncilMembers) select(CouncilMember)
.where(CouncilMembers.ElectionName == election_name) .where(col(CouncilMember.election_name == election_name))
.where(CouncilMembers.MemberId == self.usr_id) .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) if council_elect is None:
await msg.edit(content=decorate_nomination(interaction.user.id, self.speech.value)) 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): 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 button (nextcord.ui.Button): Unused. idk why its needed in the decorator
interaction (nextcord.Interaction): Interaction of user who pressed the button 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 # 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( await interaction.response.send_message(
f"You must have the <@&{settings.role_ids.clan_member}> role to vote.", f"You must have the <@&{settings.role_ids.clan_member}> role to vote.",
ephemeral=True, ephemeral=True,
@@ -110,14 +136,14 @@ class NominateView(nextcord.ui.View):
speech_content = "" speech_content = ""
with Session(engine) as session: with Session(engine) as session:
stmt = ( stmt = (
select(CouncilMembers) select(CouncilMember)
.where(CouncilMembers.ElectionName == election_name) .where(col(CouncilMember.election_name == election_name))
.where(CouncilMembers.MemberId == interaction.user.id) .where(col(CouncilMember.member_id == interaction.user.id))
) )
obj = session.scalar(stmt) 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 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] speech_content = msg.content.split(NOMINEE_SPLITTER)[1]
await interaction.response.send_modal(NominateModal(interaction.user.id, usr_nominated, speech_content)) await interaction.response.send_modal(NominateModal(interaction.user.id, usr_nominated, speech_content))