General rework to the voting views.
build_develop / build (push) Successful in 1m31s

This commit is contained in:
2023-11-03 11:55:57 -04:00
parent fa3284b9e3
commit 14f2e13772
3 changed files with 40 additions and 23 deletions
+11 -3
View File
@@ -11,8 +11,8 @@ from sqlalchemy.orm import Session
from classes.nominate_views import NominateView from classes.nominate_views import NominateView
from classes.voting_views import VoteView from classes.voting_views import VoteView
from config import DakinyConfig from config import DakinyConfig
from database_setup.sql_data_classes import CouncilMembers, ElectionInformation, Votes, engine from database_setup.sql_data_classes import ElectionInformation, engine
from utils import get_datetime, get_election_cycle_name from utils import build_votes_str, get_datetime, get_election_cycle_name
class ElectionCycle: class ElectionCycle:
@@ -183,7 +183,15 @@ class ElectionCycle:
message = self.build_vote_start() message = self.build_vote_start()
clan_member_role: nextcord.Role = self.guild.get_role(self.config.params.clan_member_role_id) clan_member_role: nextcord.Role = self.guild.get_role(self.config.params.clan_member_role_id)
election_channel: nextcord.TextChannel = self.guild.get_channel(self.get_election_info().ElectionChannel) election_channel: nextcord.TextChannel = self.guild.get_channel(self.get_election_info().ElectionChannel)
await election_channel.send(message, view=VoteView()) await election_channel.send(message, view=VoteView(self.config, self.guild))
vote_msg = await election_channel.send(build_votes_str(self.config))
with Session(engine) as session:
stmt = select(ElectionInformation).where(ElectionCycle == get_election_cycle_name(self.config))
info = session.scalar(stmt)
info.CouncilVoteMsgId = vote_msg.id
session.commit()
await election_channel.set_permissions(clan_member_role, send_messages=False) await election_channel.set_permissions(clan_member_role, send_messages=False)
async def voting_end_action(self) -> None: async def voting_end_action(self) -> None:
+28 -19
View File
@@ -2,40 +2,39 @@
Contains various views to be used while voting. Controls the logic when performing the vote. Contains various views to be used while voting. Controls the logic when performing the vote.
""" """
from typing import List, Optional from typing import List
import nextcord import nextcord
from nextcord import SelectOption from nextcord import SelectOption
from nextcord.ext import commands
from nextcord.interactions import Interaction from nextcord.interactions import Interaction
from nextcord.utils import MISSING
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from config import DakinyConfig from config import DakinyConfig, ElectionCycle
from database_setup.sql_data_classes import CouncilMembers, engine from database_setup.sql_data_classes import CouncilMembers, ElectionInformation, engine
from utils import get_election_cycle_name from utils import build_votes_str, get_election_cycle_name
class VoteActionView(nextcord.ui.View):
"""
Modal for nominating oneself. User writes a speech and then the callback sends the speech into the correct channel.
"""
def __init__(self):
super().__init__(timeout=300)
self.add_item(VoteSelect())
class VoteSelect(nextcord.ui.StringSelect): class VoteSelect(nextcord.ui.StringSelect):
def __init__(self) -> None: def __init__(self, options: List["SelectOption"], config: DakinyConfig) -> None:
super().__init__( super().__init__(
placeholder="Choose 1", placeholder="Choose 1",
min_values=1, min_values=1,
max_values=1, max_values=1,
options=[SelectOption(label="one"), SelectOption(label="two"), SelectOption(label="three")], options=options,
) )
self.config = config
async def callback(self, interaction: Interaction): async def callback(self, interaction: Interaction):
vote_message_str = build_votes_str(self.config)
with Session(engine) as session:
stmt = select(ElectionInformation.CouncilVoteMsgId).where(
ElectionCycle == get_election_cycle_name(self.config)
)
vote_msg_id = session.scalar(stmt)
vote_msg = await interaction.channel.fetch_message(vote_msg_id)
await vote_msg.edit(content=vote_message_str)
await interaction.edit(content=self.values[0], view=None) await interaction.edit(content=self.values[0], view=None)
@@ -44,8 +43,10 @@ class VoteView(nextcord.ui.View):
The button to press to start your nomination. The button to press to start your nomination.
""" """
def __init__(self): def __init__(self, config: DakinyConfig, guild: nextcord.Guild):
super().__init__(timeout=None) super().__init__(timeout=None)
self.config = config
self.guild = guild
@nextcord.ui.button(label="Vote", style=nextcord.ButtonStyle.primary, custom_id="vote") @nextcord.ui.button(label="Vote", style=nextcord.ButtonStyle.primary, custom_id="vote")
async def vote(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None: async def vote(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None:
@@ -57,6 +58,14 @@ class VoteView(nextcord.ui.View):
interaction (nextcord.Interaction): Interaction of user who pressed the button interaction (nextcord.Interaction): Interaction of user who pressed the button
""" """
# TODO get the clan members to vote for. Check if user has voted and add a checkmark to that name.
options = [SelectOption(label="one"), SelectOption(label="two"), SelectOption(label="three")]
view = nextcord.ui.View()
view.add_item(VoteSelect(options=options, config=self.config))
await interaction.response.send_message( await interaction.response.send_message(
content="Please vote for a clan member!", view=VoteActionView(), ephemeral=True content="Please vote for a clan member!",
view=view,
ephemeral=True,
) )
+1 -1
View File
@@ -52,7 +52,7 @@ def main(cfg: DakinyConfig):
assert bot.user is not None assert bot.user is not None
create_database # pylint: disable=pointless-statement create_database # pylint: disable=pointless-statement
bot.add_view(NominateView(cfg)) bot.add_view(NominateView(cfg))
bot.add_view(VoteView()) bot.add_view(VoteView(cfg, bot.get_guild(cfg.params.guild_id)))
print(f"{bot.user.name} has connected to Discord!") print(f"{bot.user.name} has connected to Discord!")
# Run Discord bot # Run Discord bot