diff --git a/classes/election_cycle.py b/classes/election_cycle.py index d02e7db..22098e2 100644 --- a/classes/election_cycle.py +++ b/classes/election_cycle.py @@ -7,6 +7,9 @@ from datetime import datetime, timedelta import nextcord from nextcord.ext import commands +from config import DakinyConfig +from utils import get_datetime + class ElectionCycle: """ @@ -14,7 +17,7 @@ class ElectionCycle: the cycle. """ - def __init__(self, election_start: datetime, term_start: datetime, term_end: datetime, bot) -> None: + def __init__(self, cycle: int, bot) -> None: """ Generates all dates relevant to the election cycle from input election start, term start and end dates. @@ -24,13 +27,62 @@ class ElectionCycle: term_end (datetime): Date the term being elected ends. bot: the discord bot instance """ - self._election_start: datetime = election_start - self._term_start: datetime = term_start - self._term_end: datetime = term_end - self._voting_start: datetime = self._election_start + timedelta(days=1) - self._voting_end: datetime = self._voting_start + timedelta(days=1) - self._highcouncil_election: datetime = self._voting_end + timedelta(days=1) - self._bot: commands.Bot = bot + self.config: DakinyConfig = bot.config + self.cycle = cycle + self.elecion_cycle = self.config.election_cycles[self.cycle] + self.election_start: datetime = get_datetime(self.elecion_cycle.election_start) + self.term_start: datetime = get_datetime(self.elecion_cycle.term_start) + self.term_end: datetime = get_datetime(self.elecion_cycle.term_end) + self.voting_start: datetime = get_datetime(self.elecion_cycle.voting_start) + self.voting_end: datetime = get_datetime(self.elecion_cycle.voting_end) + self.highcouncil_election: datetime = self.voting_end + timedelta(days=1) + self.bot: commands.Bot = bot + + def build_election_announcement(self) -> list[str]: + """ + Builds the messages to announce the election is starting. + + Returns: + list[str]: A list of message contents in the correct order. + """ + + with open("bot_messages/election_announcement.txt", mode="r", encoding="utf8") as file: + message = file.read() + + next_election = get_datetime(self.config.election_cycles[(self.cycle + 1) % 4].election_start) + + message = message.format( + clan_council_id=self.config.params.clan_council_role_id, + high_council_id=self.config.params.high_council_role_id, + election_start_date=self.election_start.strftime("%B %d"), + term_start_date=self.term_start.strftime("%B %d"), + term_end_date=self.term_end.strftime("%B %d"), + voting_start_date=self.voting_start.strftime("%B %d"), + voting_end_date=self.voting_end.strftime("%B %d"), + highcouncil_election_date=self.highcouncil_election.strftime("%B %d"), + next_election_start_date=next_election.strftime("%B %d"), + ) + + return message.split("---message_break---") + + def build_vote_start(self) -> str: + """ + Builds the voting start message out of template and configurations. + + Returns: + str: Message to send + """ + + with open("bot_messages/vote_start.txt", mode="r", encoding="utf8") as file: + message = file.read() + vote_end: datetime = get_datetime(self.config.election_cycles[self.cycle].voting_end) + + return message.format( + clan_member_id=self.config.params.clan_member_role_id, + voting_emote_id=self.config.params.voting_emote_id, + voting_end_date=vote_end.strftime("%B %d"), + voting_end_day=vote_end.strftime("%A"), + ) async def check_date(self) -> None: """ @@ -40,17 +92,17 @@ class ElectionCycle: print("checking the date") # check all dates if action is needed - if today.date() == self._election_start.date(): + if today.date() == self.election_start.date(): await self.election_start_action() - elif today.date() == self._voting_start.date(): + elif today.date() == self.voting_start.date(): await self.voting_end_action() - elif today.date() == self._voting_end.date(): + elif today.date() == self.voting_end.date(): await self.voting_end_action() - elif today.date() == self._highcouncil_election.date(): + elif today.date() == self.highcouncil_election.date(): await self.highcouncil_election_action() - elif today.date() == self._term_start.date(): + elif today.date() == self.term_start.date(): await self.term_start_action() - elif today.date() == self._term_end.date(): + elif today.date() == self.term_end.date(): await self.term_end_action() else: print("today was not a special date") @@ -99,5 +151,5 @@ class ElectionCycle: """ message a string to me """ - imcompiling: nextcord.User = await self._bot.fetch_user(206602713511886849) + imcompiling: nextcord.User = await self.bot.fetch_user(206602713511886849) await imcompiling.send(msg) diff --git a/classes/message_builder.py b/classes/message_builder.py deleted file mode 100644 index 0804a7c..0000000 --- a/classes/message_builder.py +++ /dev/null @@ -1,59 +0,0 @@ -""" -Contains the MessageBuilder class. -""" - -from datetime import datetime - -from config import DakinyConfig -from utils import get_datetime - - -class MessageBuilder: - """ - Contains all the announcements that the bot will send regarding elections. - """ - - def __init__(self, config: DakinyConfig, cycle: int) -> None: - self.config = config - self.cycle = cycle - - def build_election_announcement(self) -> list[str]: - """ - Builds the messages to announce the election is starting. - - Returns: - list[str]: A list of message contents in the correct order. - """ - - with open("bot_messages/election_announcement.txt", mode="r", encoding="utf8") as file: - message = file.read() - election_start: datetime = get_datetime(self.config.election_cycles[self.cycle].election_start) - term_start: datetime = get_datetime(self.config.election_cycles[self.cycle].term_start) - - message = message.format( - clan_council_id=self.config.params.clan_council_role_id, - high_council_id=self.config.params.high_council_role_id, - election_start_date=election_start.strftime("%B %d"), - term_start_date=term_start.strftime("%B %d"), - ) - - # TODO make sure to split the message on message break. - - def build_vote_start(self) -> str: - """ - Builds the voting start message out of template and configurations. - - Returns: - str: Message to send - """ - - with open("bot_messages/vote_start.txt", mode="r", encoding="utf8") as file: - message = file.read() - vote_end: datetime = get_datetime(self.config.election_cycles[self.cycle].voting_end) - - return message.format( - clan_member_id=self.config.params.clan_member_role_id, - voting_emote_id=self.config.params.voting_emote_id, - voting_end_date=vote_end.strftime("%B %d"), - voting_end_day=vote_end.strftime("%A"), - ) diff --git a/cogs/commands/test.py b/cogs/commands/test.py index 786e590..2d6e032 100644 --- a/cogs/commands/test.py +++ b/cogs/commands/test.py @@ -5,7 +5,7 @@ Commands for testing. import nextcord from nextcord.ext import commands -from classes.message_builder import MessageBuilder +from classes.election_cycle import ElectionCycle class TestCog(commands.Cog, name="Test commands."): @@ -34,8 +34,10 @@ class TestCog(commands.Cog, name="Test commands."): interaction (nextcord.Interaction): Interaction that invoked the command. """ - msg_bulder = MessageBuilder(self.bot.config, 0) - message = msg_bulder.build_vote_start() + cycle = ElectionCycle(0, self.bot) + + message = cycle.build_election_announcement() # doesn't tell discord that the message was responded to. Is a test command so I don't really care atm. - await interaction.channel.send(content=message) + for m in message: + await interaction.channel.send(content=m) diff --git a/cogs/loops/daily_loop.py b/cogs/loops/daily_loop.py index 5112d4d..eed954b 100644 --- a/cogs/loops/daily_loop.py +++ b/cogs/loops/daily_loop.py @@ -2,7 +2,7 @@ _summary_ """ -from datetime import datetime, time +from datetime import time from nextcord.ext import commands, tasks from pytz import timezone @@ -17,7 +17,8 @@ class DailyLoop(commands.Cog, name="Daily Loop"): def __init__(self, bot: commands.Bot) -> None: self.bot = bot - self.election = ElectionCycle(datetime(2023, 5, 25), datetime(2023, 5, 29), datetime(2023, 5, 30), self.bot) + # TODO need to figure out how to determine the current cycle + self.current_election = ElectionCycle(0, self.bot) @commands.Cog.listener() async def on_ready(self): @@ -32,4 +33,5 @@ class DailyLoop(commands.Cog, name="Daily Loop"): async def do_thing(self): """ """ print("loop") - await self.election.check_date() + await self.current_election.check_date() + # TODO need to figure out how to change the election cycle after current one is over