diff --git a/cogs/commands/__init__.py b/cogs/commands/__init__.py index dff21a5..dbe5bde 100644 --- a/cogs/commands/__init__.py +++ b/cogs/commands/__init__.py @@ -6,7 +6,7 @@ from cogs.commands.record import RecordCog from cogs.commands.refresh import RefreshCog from cogs.commands.remove import RemoveCog from cogs.commands.request import RequestCog -from cogs.commands.set import setCog +from cogs.commands.set import SetCog from cogs.commands.test import TestCog from cogs.commands.view import ViewCog @@ -21,4 +21,4 @@ def setup(bot: commands.Bot) -> None: bot.add_cog(RequestCog(bot)) bot.add_cog(TestCog(bot)) bot.add_cog(ViewCog()) - bot.add_cog(setCog()) + bot.add_cog(SetCog()) diff --git a/cogs/commands/record.py b/cogs/commands/record.py index 765bb40..62d09ce 100644 --- a/cogs/commands/record.py +++ b/cogs/commands/record.py @@ -119,11 +119,11 @@ class EventView(nextcord.ui.View): record_event_points( self.config, non_discord_users_list, - False, self.config.params.event_participate_points, + is_member=False, ) - record_event_points(self.config, [self.host_id], True, self.config.params.event_host_points) + record_event_points(self.config, [self.host_id], self.config.params.event_host_points, is_member=True) event_channel: nextcord.TextChannel = interaction.guild.get_channel(self.config.params.event_post_channel_id) await event_channel.send(embed=interaction.message.embeds[0]) @@ -134,12 +134,13 @@ class EventView(nextcord.ui.View): class ParticipantModal(nextcord.ui.Modal): """ - This modal contains all the text edits for an event. You can change the name, description, and add the usernames - of participants who are not in the discord. + This modal contains all the text edits for an event. + + You can change the name, description, and add the usernames of participants who are not in the discord. """ - # TODO turn this embed into a dict - def __init__(self, embed): + # consider turning this embed into a dict + def __init__(self, embed: nextcord.Embed): super().__init__( "Edit the event.", timeout=5 * 60, @@ -170,6 +171,12 @@ class ParticipantModal(nextcord.ui.Modal): self.add_item(self.participants) async def callback(self, interaction: nextcord.Interaction) -> None: + """ + Edits the interaction message to contain the Non-Discord participants. + + Args: + interaction (nextcord.Interaction): Interaction of the callback. + """ self.embed.title = self.name.value self.embed.description = self.description.value self.embed.set_field_at(index=1, name="Non-Discord Participants", value=self.participants.value) @@ -189,6 +196,12 @@ class ParticipantSelect(nextcord.ui.UserSelect): ) async def callback(self, interaction: nextcord.Interaction) -> None: + """ + Edits the interaction message to contain the Discord participants. + + Args: + interaction (nextcord.Interaction): Interaction of the callback. + """ embed: nextcord.Embed = interaction.message.embeds[0] participants: str = "\n".join([f"<@{participant.id}>" for participant in self.values.members]) embed.set_field_at(0, name="Participants", value=participants) diff --git a/cogs/commands/refresh.py b/cogs/commands/refresh.py index 1bc30bc..2831c1d 100644 --- a/cogs/commands/refresh.py +++ b/cogs/commands/refresh.py @@ -1,8 +1,7 @@ -""" -Contained commands and views for refresh commands. -""" +"""Contained commands and views for refresh commands.""" import os +from pathlib import Path import nextcord from nextcord.ext import commands @@ -11,22 +10,16 @@ from utils import MESSAGES_DIR, edit_clan_council_info, update_clan_messages class RefreshCog(commands.Cog, name="Refresh Commands"): - """ - Class holds refresh commands. - """ + """Class holds refresh commands.""" - def __init__(self, bot) -> None: - """ - Default constructor for RefreshCog class. Does nothing. - """ + def __init__(self, bot: commands.Bot) -> None: + """Default constructor for RefreshCog class. Does nothing.""" super().__init__() self.bot: commands.Bot = bot @nextcord.slash_command(default_member_permissions=nextcord.Permissions(administrator=True)) - async def refresh(self, interaction: nextcord.Interaction): - """ - Parent slash command for refresh. Never called. - """ + async def refresh(self, interaction: nextcord.Interaction) -> None: + """Parent slash command for refresh. Never called.""" @refresh.subcommand(description="Force refresh all of the bot managed messages.") async def messages( @@ -36,8 +29,10 @@ class RefreshCog(commands.Cog, name="Refresh Commands"): description="Channel to refresh messages in.", required=False, ), - ): + ) -> None: """ + Updates all messages. + Calls update_clan_messages() to update all messages. Args: @@ -48,7 +43,7 @@ class RefreshCog(commands.Cog, name="Refresh Commands"): if channel is None: channel_updates = [ - dir_name for dir_name in os.listdir(MESSAGES_DIR) if os.path.isdir(f"{MESSAGES_DIR}/{dir_name}") + dir_name for dir_name in os.listdir(MESSAGES_DIR) if Path(f"{MESSAGES_DIR}/{dir_name}").is_dir() ] else: channel_updates = [channel.name] @@ -57,8 +52,10 @@ class RefreshCog(commands.Cog, name="Refresh Commands"): await interaction.followup.send("Messages have been refreshed.", ephemeral=True) @refresh.subcommand(description="Updates the current council info message.") - async def council_info(self, interaction: nextcord.Interaction): + async def council_info(self, interaction: nextcord.Interaction) -> None: """ + Edits the clan council info message. + Calls edit_clan_council_info(). Args: diff --git a/cogs/commands/remove.py b/cogs/commands/remove.py index 9dde841..81cd49e 100644 --- a/cogs/commands/remove.py +++ b/cogs/commands/remove.py @@ -1,6 +1,4 @@ -""" -Commands for removing information in the database. -""" +"""Commands for removing information in the database.""" import nextcord from nextcord.ext import commands @@ -11,35 +9,29 @@ from database_setup.sql_data_classes import Presences, engine class RemoveCog(commands.Cog, name="Remove Commands"): - """ - Holds the view commands. - """ + """Holds the view commands.""" def __init__(self) -> None: - """ - Default constructor for RemoveCog class. Does nothing. - """ + """Default constructor for RemoveCog class. Does nothing.""" @nextcord.slash_command( default_member_permissions=nextcord.Permissions(administrator=True), ) - async def remove(self, interaction: nextcord.Interaction): - """ - Parent slash command for set. Never called. - """ + async def remove(self, interaction: nextcord.Interaction) -> None: + """Parent slash command for set. Never called.""" @remove.subcommand(description="Remove a presence from the database.") async def presence( self, interaction: nextcord.Interaction, presence_str: str = nextcord.SlashOption(description="The presence to remove", required=True), - ): + ) -> None: """ Deletes the given presence id from the database. Args: interaction (nextcord.Interaction): Interaction that invoked the command. - presence (str): Is SlashOption. The presence to remove. Is the ID of the presence. + presence_str (str): Is SlashOption. The presence to remove. Is the ID of the presence. """ presence_id = int(presence_str) with Session(engine) as session: @@ -50,9 +42,10 @@ class RemoveCog(commands.Cog, name="Remove Commands"): await interaction.response.send_message("Presence deleted.", ephemeral=True) @presence.on_autocomplete("presence_str") - async def presence_autocomplete(self, interaction: nextcord.Interaction, presence_str: str): + async def presence_autocomplete(self, interaction: nextcord.Interaction, presence_str: str) -> None: """ Collects all presences that start with the presence string. + Sends autocomplete dict {Presence Name, Presence Id} Args: diff --git a/cogs/commands/request.py b/cogs/commands/request.py index 2e2638b..c80e39d 100644 --- a/cogs/commands/request.py +++ b/cogs/commands/request.py @@ -1,31 +1,27 @@ -""" -Contains commands and views for request commands. -""" +"""Contains commands and views for request commands.""" + +from typing import TYPE_CHECKING import nextcord from nextcord.ext import commands from sqlalchemy.orm import Session -from config import DakinyConfig from database_setup.sql_data_classes import Presences, engine +if TYPE_CHECKING: + from config import DakinyConfig + class RequestCog(commands.Cog, name="Request Commands"): - """ - Class holds request commands. - """ + """Class holds request commands.""" - def __init__(self, bot) -> None: - """ - Default constructor for RequestCog class. Does nothing. - """ + def __init__(self, bot: commands.Bot) -> None: + """Default constructor for RequestCog class. Does nothing.""" self.bot: commands.Bot = bot @nextcord.slash_command() - async def request(self, interaction: nextcord.Interaction): - """ - Parent slash command for request. Never called. - """ + async def request(self, interaction: nextcord.Interaction) -> None: + """Parent slash command for request. Never called.""" @request.subcommand(description="Request to add a presence to the bot's presence list.") async def add_presence( @@ -37,7 +33,7 @@ class RequestCog(commands.Cog, name="Request Commands"): max_length=100, description="The presence you want to add.", ), - ): + ) -> None: """ Sends a message to admins to request to add a presence. @@ -61,13 +57,13 @@ class RequestCog(commands.Cog, name="Request Commands"): max_length=32, description="Your requested new nickname.", ), - ): + ) -> None: """ Sends a message to admins to request a nickname change. Args: interaction (nextcord.Interaction): Interaction that invoked the command. - new_username(str): The username to change to. + new_nickname(str): The username to change to. """ config: DakinyConfig = self.bot.config content = f'<@{interaction.user.id}> would like to change their username to "{new_nickname}."' @@ -77,9 +73,7 @@ class RequestCog(commands.Cog, name="Request Commands"): class UsernameRequest(nextcord.ui.View): - """ - View provides approve and deny buttons and action for a username change request. - """ + """View provides approve and deny buttons and action for a username change request.""" def __init__( self, @@ -91,9 +85,11 @@ class UsernameRequest(nextcord.ui.View): self.new_nickname = new_nickname @nextcord.ui.button(label="Approve", style=nextcord.ButtonStyle.green) - async def approve(self, button: nextcord.ui.Button, interaction: nextcord.Interaction): + async def approve(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None: # noqa: ARG002 """ - Approve button for a nickname change request. Changes the target's nickname to self.new_nickname. + Approve button for a nickname change request. + + Changes the target's nickname to self.new_nickname. Catches an error if the target as a higher role than the bot. Removes the view from the interaction message. @@ -124,7 +120,7 @@ class UsernameRequest(nextcord.ui.View): ) @nextcord.ui.button(label="Deny", style=nextcord.ButtonStyle.red) - async def deny(self, button: nextcord.ui.Button, interaction: nextcord.Interaction): + async def deny(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None: # noqa: ARG002 """ Deny button for a nickname request. Just removes the view and logs who denied the request. @@ -137,9 +133,7 @@ class UsernameRequest(nextcord.ui.View): class PresenceChange(nextcord.ui.View): - """ - View provides approve and deny buttons and action for a username change request. - """ + """View provides approve and deny buttons and action for a username change request.""" def __init__( self, @@ -149,9 +143,11 @@ class PresenceChange(nextcord.ui.View): self.presence = presence @nextcord.ui.button(label="Approve", style=nextcord.ButtonStyle.green) - async def approve(self, button: nextcord.ui.Button, interaction: nextcord.Interaction): + async def approve(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None: # noqa: ARG002 """ - Approve button for a presence add request. Adds the presence to the database. + Approve button for a presence add request. + + Adds the presence to the database. Removes the view from the interaction message. Args: @@ -166,7 +162,7 @@ class PresenceChange(nextcord.ui.View): await interaction.response.edit_message(content=content, view=None) @nextcord.ui.button(label="Deny", style=nextcord.ButtonStyle.red) - async def deny(self, button: nextcord.ui.Button, interaction: nextcord.Interaction): + async def deny(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None: # noqa: ARG002 """ Deny button for a presence add request. Just removes the view and logs who denied the request. diff --git a/cogs/commands/set.py b/cogs/commands/set.py index 30f8f9c..01c35ed 100644 --- a/cogs/commands/set.py +++ b/cogs/commands/set.py @@ -1,6 +1,4 @@ -""" -Contains commands and views for set commands. -""" +"""Contains commands and views for set commands.""" from datetime import UTC, datetime @@ -14,21 +12,15 @@ from database_setup.sql_data_classes import UserBirthday, engine from main import birthday_list -class setCog(commands.Cog, name="Set Commands"): - """ - Class holds set commands. - """ +class SetCog(commands.Cog, name="Set Commands"): + """Class holds set commands.""" def __init__(self) -> None: - """ - Default constructor for SetCog class. Does nothing. - """ + """Default constructor for SetCog class. Does nothing.""" @nextcord.slash_command() - async def set(self, interaction: nextcord.Interaction): - """ - Parent slash command for set. Never called. - """ + async def set(self, interaction: nextcord.Interaction) -> None: + """Parent slash command for set. Never called.""" @set.subcommand(description="Sets your birth month and day for the Birthday Fun. Use 0/0 to remove yourself.") async def birthday( @@ -36,7 +28,7 @@ class setCog(commands.Cog, name="Set Commands"): interaction: nextcord.Interaction, month: int = nextcord.SlashOption(required=True, min_value=0, max_value=12, description="Your birth month."), day: int = nextcord.SlashOption(required=True, min_value=0, max_value=31, description="Your birth day."), - ): + ) -> None: """ Sets a user's birthday in the database. Removes on input 0/0. If birthday is today, adds to the birthday_list. @@ -59,7 +51,7 @@ class setCog(commands.Cog, name="Set Commands"): # check if valid day today = datetime.now(tz=UTC).date() try: - birthday = datetime(today.year, month, day) + birthday = datetime(today.year, month, day, tzinfo=UTC) except ValueError: await interaction.followup.send(f"Invalid date: {month}/{day}.", ephemeral=True) return diff --git a/cogs/commands/test.py b/cogs/commands/test.py index 51fee65..bc13e73 100644 --- a/cogs/commands/test.py +++ b/cogs/commands/test.py @@ -1,51 +1,50 @@ -""" -Commands for testing. -""" +"""Commands for testing.""" + +from typing import TYPE_CHECKING import nextcord from nextcord.ext import application_checks, commands +from nextcord.ext.application_checks.core import AC from classes.election_cycle import ElectionCycle -from config import DakinyConfig from utils import get_current_election_cycle +if TYPE_CHECKING: + from config import DakinyConfig -def is_me(): - """ - predicate that makes sure only I can run the test commands. - """ - def predicate(interaction: nextcord.Interaction): - return interaction.user.id == 206602713511886849 +ME = 206602713511886849 +GUILDS = [1000247361639030804] + + +def is_me() -> AC: + """Predicate that makes sure only I can run the test commands.""" + + def predicate(interaction: nextcord.Interaction) -> bool: + return interaction.user.id == ME return application_checks.check(predicate) class TestCog(commands.Cog, name="Test commands."): - """ - Class holds commands for testing. - """ + """Class holds commands for testing.""" - def __init__(self, bot) -> None: - """ - Default constructor for HelpCog class. Does nothing. - """ - self.bot = bot + def __init__(self, bot: commands.Bot) -> None: + """Default constructor for HelpCog class. Does nothing.""" + self.bot: commands.Bot = bot - @nextcord.slash_command(guild_ids=[1000247361639030804]) - async def test(self, interaction: nextcord.Interaction): - """ - Parent slash command for help. Never called. - """ + @nextcord.slash_command(guild_ids=GUILDS) + async def test(self, interaction: nextcord.Interaction) -> None: + """Parent slash command for help. Never called.""" @test.subcommand() @is_me() - async def election_start(self, interaction: nextcord.Interaction): + async def election_start(self, interaction: nextcord.Interaction) -> None: """ - idc + Force starts election. Args: - interaction (nextcord.Interaction): _description_ + interaction (nextcord.Interaction): Interaction with the message. """ config: DakinyConfig = self.bot.config cycle = ElectionCycle( @@ -54,15 +53,16 @@ class TestCog(commands.Cog, name="Test commands."): self.bot.get_guild(config.params.guild_id), ) await cycle.election_start_action() + await interaction.send("Test command sent.") @test.subcommand() @is_me() - async def voting_start(self, interaction: nextcord.Interaction): + async def voting_start(self, interaction: nextcord.Interaction) -> None: """ - tests the voting start action + Force starts voting. Args: - interaction (nextcord.Interaction): _description_ + interaction (nextcord.Interaction): Interaction with the message. """ config: DakinyConfig = self.bot.config cycle = ElectionCycle( @@ -71,15 +71,16 @@ class TestCog(commands.Cog, name="Test commands."): self.bot.get_guild(config.params.guild_id), ) await cycle.voting_start_action() + await interaction.send("Test command sent.") @test.subcommand() @is_me() - async def voting_end(self, interaction: nextcord.Interaction): + async def voting_end(self, interaction: nextcord.Interaction) -> None: """ - tests the voting start action + Force ends voting. Args: - interaction (nextcord.Interaction): _description_ + interaction (nextcord.Interaction): Interaction with the message. """ config: DakinyConfig = self.bot.config cycle = ElectionCycle( @@ -88,15 +89,16 @@ class TestCog(commands.Cog, name="Test commands."): self.bot.get_guild(config.params.guild_id), ) await cycle.voting_end_action() + await interaction.send("Test command sent.") @test.subcommand() @is_me() - async def highcouncil_vote(self, interaction: nextcord.Interaction): + async def highcouncil_vote(self, interaction: nextcord.Interaction) -> None: """ - tests the voting start action + Force starts highcouncil voting. Args: - interaction (nextcord.Interaction): _description_ + interaction (nextcord.Interaction): Interaction with the message. """ config: DakinyConfig = self.bot.config cycle = ElectionCycle( @@ -105,10 +107,17 @@ class TestCog(commands.Cog, name="Test commands."): self.bot.get_guild(config.params.guild_id), ) await cycle.highcouncil_election_start_action() + await interaction.send("Test command sent.") @test.subcommand() @is_me() - async def election_reminder(self, interaction: nextcord.Interaction): + async def election_reminder(self, interaction: nextcord.Interaction) -> None: + """ + Forces election reminder. + + Args: + interaction (nextcord.Interaction): Interaction with the message. + """ config: DakinyConfig = self.bot.config cycle = ElectionCycle( get_current_election_cycle(config), @@ -116,10 +125,17 @@ class TestCog(commands.Cog, name="Test commands."): self.bot.get_guild(config.params.guild_id), ) await cycle.election_reminder() + await interaction.send("Test command sent.") @test.subcommand() @is_me() - async def daily(self, interaction: nextcord.Interaction): + async def daily(self, interaction: nextcord.Interaction) -> None: + """ + Forces daily function. + + Args: + interaction (nextcord.Interaction): Interaction with the message. + """ config: DakinyConfig = self.bot.config cycle = ElectionCycle( get_current_election_cycle(config), @@ -127,10 +143,17 @@ class TestCog(commands.Cog, name="Test commands."): self.bot.get_guild(config.params.guild_id), ) await cycle.check_date() + await interaction.send("Test command sent.") @test.subcommand() @is_me() - async def term_start(self, interaction: nextcord.Interaction): + async def term_start(self, interaction: nextcord.Interaction) -> None: + """ + Forces term start. + + Args: + interaction (nextcord.Interaction): Interaction with the message. + """ config: DakinyConfig = self.bot.config cycle = ElectionCycle( get_current_election_cycle(config), @@ -138,3 +161,4 @@ class TestCog(commands.Cog, name="Test commands."): self.bot.get_guild(config.params.guild_id), ) await cycle.term_start_action() + await interaction.send("Test command sent.") diff --git a/cogs/commands/view.py b/cogs/commands/view.py index 9887081..806add8 100644 --- a/cogs/commands/view.py +++ b/cogs/commands/view.py @@ -1,6 +1,4 @@ -""" -Commands for viewing information in the database. -""" +"""Commands for viewing information in the database.""" import nextcord import pandas as pd @@ -14,24 +12,18 @@ from database_setup.sql_data_classes import ( Votes, engine, ) -from utils import VoteType +from utils import MAX_DISCORD_MESSAGE_LENGTH, VoteType class ViewCog(commands.Cog, name="View Commands"): - """ - Holds the view commands. - """ + """Holds the view commands.""" def __init__(self) -> None: - """ - Default constructor for ViewCog class. Does nothing. - """ + """Default constructor for ViewCog class. Does nothing.""" @nextcord.slash_command() - async def view(self, interaction: nextcord.Interaction): - """ - Parent slash command for set. Never called. - """ + async def view(self, interaction: nextcord.Interaction) -> None: + """Parent slash command for set. Never called.""" @view.subcommand(description="Show event points.") async def event_points( @@ -41,38 +33,49 @@ class ViewCog(commands.Cog, name="View Commands"): description="The quarter to view", required=False, ), - ): + ) -> None: + """ + View the event points. + + Builds a message with the event points for the quarter that matches with quarter_name. + + Args: + interaction (nextcord.Interaction): Interaction with the message. + quarter_name (str, optional): Same of quarter to autofill with. Is SlashOption. + """ # just in case await interaction.response.defer(ephemeral=True) with Session(engine) as session: if quarter_name: - df = pd.read_sql_query( + ppdf = pd.read_sql_query( sql=session.query(ParticipationPoints) .where(ParticipationPoints.Cycle.startswith(quarter_name)) .statement, con=engine, ) else: - df = pd.read_sql_query( + ppdf = pd.read_sql_query( sql=session.query(ParticipationPoints).statement, con=engine, ) - if df.empty: + if ppdf.empty: await interaction.followup.send(f'Quarter "{quarter_name}" is invalid.', ephemeral=True) return - cycles = df.groupby("Cycle") + cycles = ppdf.groupby("Cycle") content = "" for cycle in cycles.groups: content += f"**{cycle}**\n" unsorted_all = cycles.get_group(cycle).groupby("DiscordMember") - members = unsorted_all.get_group(True) - non_members = unsorted_all.get_group(False) + members = unsorted_all.get_group(name=True) + non_members = unsorted_all.get_group(name=False) sorted_members = members.sort_values( by="UserId", - key=lambda user_ids: ([interaction.guild.get_member(int(id)).display_name for id in user_ids]), + key=lambda user_ids: ( + [interaction.guild.get_member(int(user_id)).display_name for user_id in user_ids] + ), ) sorted_non_members = non_members.sort_values(by="UserId") sorted_all = pd.concat([sorted_members, sorted_non_members], ignore_index=True, sort=False) @@ -83,7 +86,7 @@ class ViewCog(commands.Cog, name="View Commands"): content += f"<@{userid}>: {points}\n" if discord_member else f"{userid}: {points}\n" content += "\n" - if len(content) > 2000: + if len(content) > MAX_DISCORD_MESSAGE_LENGTH: await interaction.followup.send("Message length is too long, please select search to limit results.") return @@ -97,12 +100,13 @@ class ViewCog(commands.Cog, name="View Commands"): description="A word or string to search for in the presences.", required=False, ), - ): + ) -> None: """ Gathers all presences from the database and responds with a message showing them. Args: interaction (nextcord.Integration): User's interaction with the command. + search (str): string to search for in presences. Is SlashOption. """ # might take a while depending on number of presences await interaction.response.defer(ephemeral=True) @@ -130,8 +134,10 @@ class ViewCog(commands.Cog, name="View Commands"): description="The election type. Council, Discord Manager, or Clan Leader.", choices=VoteType, ), - ): + ) -> None: """ + View all voters and who they voted for. + Takes in an election name and sends a response message to the user with a list of people who voted in that election and who they voted for. Notes those tho abstained. Tells a user if the election is invalid. Uses autocompletion to assist with getting elections. @@ -139,6 +145,7 @@ class ViewCog(commands.Cog, name="View Commands"): Args: interaction (nextcord.Interaction): User's interaction with the command. election_name (str): Is SlashOption. The name of the election to view votes for. + election_type(str): Is SlashOption. The type of election to search for. Choice from StrEnum VoteType. """ stmt = select(Votes).where(Votes.ElectionCycle == election_name).where(Votes.Type == election_type) @@ -160,7 +167,7 @@ class ViewCog(commands.Cog, name="View Commands"): await interaction.response.send_message(content=content, ephemeral=True) @votes.on_autocomplete("election_name") - async def election_autocomplete(self, interaction: nextcord.Interaction, election_name: str): + async def election_autocomplete(self, interaction: nextcord.Interaction, election_name: str) -> None: """ Collects all elections that start with the election string. @@ -183,7 +190,7 @@ class ViewCog(commands.Cog, name="View Commands"): await interaction.response.send_autocomplete(autofilled_elections[:25]) @event_points.on_autocomplete("quarter_name") - async def event_points_autocomplete(self, interaction: nextcord.Interaction, quarter_name: str): + async def event_points_autocomplete(self, interaction: nextcord.Interaction, quarter_name: str) -> None: """ Collects all elections that start with the election string. diff --git a/utils.py b/utils.py index b792300..9ad7d76 100644 --- a/utils.py +++ b/utils.py @@ -26,6 +26,7 @@ NOMINEE_SPLITTER = "========================================\n\n" REPO_DIR = "./dakiny-messages" MESSAGES_DIR = f"{REPO_DIR}/messages" TEMPLATES_DIR = f"{REPO_DIR}/message_templates" +MAX_DISCORD_MESSAGE_LENGTH = 2000 VoteType = StrEnum("VoteType", ["COUNCIL", "DISCORDMANAGER", "CLANLEADER"]) @@ -300,7 +301,7 @@ def decorate_dm_nomination(user_id: int, speech: str) -> str: return msg -def record_event_points(config: DakinyConfig, users: Sequence[str], is_member: bool, add_points: int) -> None: # noqa: FBT001 +def record_event_points(config: DakinyConfig, users: Sequence[str], add_points: int, *, is_member: bool) -> None: """ Adds event points to all users listed. @@ -310,8 +311,8 @@ def record_event_points(config: DakinyConfig, users: Sequence[str], is_member: b Args: config (DakinyConfig): Dakiny config for getting points users (Sequence[int]): users that participated and need points. - is_member (bool): whether the users are a discord member or not add_points (int): number of points to add + is_member (bool): whether the users are a discord member or not """ quarter_name = get_quarter_name(config) with Session(engine) as session: @@ -411,7 +412,9 @@ async def update_clan_messages(guild: nextcord.Guild, channel_updates: Sequence[ message_name = f"{dir_name}/{file_name}" file_path = f"{dir_path}/{file_name}" async with aiofiles.open(file_path, encoding="utf8") as reader: - await edit_clan_message(session, channel, message_name, await reader.read(2000)) + await edit_clan_message( + session, channel, message_name, await reader.read(MAX_DISCORD_MESSAGE_LENGTH) + ) async def get_clan_message_channel(session: Session, channel_name: str, guild: nextcord.Guild) -> nextcord.TextChannel: