Files
dakiny-bot/classes/voting_views.py
T
imcompiling 14f2e13772
build_develop / build (push) Successful in 1m31s
General rework to the voting views.
2023-11-03 11:55:57 -04:00

72 lines
2.5 KiB
Python

"""
Contains various views to be used while voting. Controls the logic when performing the vote.
"""
from typing import List
import nextcord
from nextcord import SelectOption
from nextcord.ext import commands
from nextcord.interactions import Interaction
from sqlalchemy import select
from sqlalchemy.orm import Session
from config import DakinyConfig, ElectionCycle
from database_setup.sql_data_classes import CouncilMembers, ElectionInformation, engine
from utils import build_votes_str, get_election_cycle_name
class VoteSelect(nextcord.ui.StringSelect):
def __init__(self, options: List["SelectOption"], config: DakinyConfig) -> None:
super().__init__(
placeholder="Choose 1",
min_values=1,
max_values=1,
options=options,
)
self.config = config
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)
class VoteView(nextcord.ui.View):
"""
The button to press to start your nomination.
"""
def __init__(self, config: DakinyConfig, guild: nextcord.Guild):
super().__init__(timeout=None)
self.config = config
self.guild = guild
@nextcord.ui.button(label="Vote", style=nextcord.ButtonStyle.primary, custom_id="vote")
async def vote(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None:
"""
TODO
Args:
button (nextcord.ui.Button): Unused. idk why its needed in the decorator
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(
content="Please vote for a clan member!",
view=view,
ephemeral=True,
)