Finish up smells in the commands directory.

Add a discord max message length constant.
Move boolean argument to not be positional.
This commit is contained in:
2024-05-22 20:48:44 -04:00
parent 9331e7ba4f
commit b9621a67c9
9 changed files with 180 additions and 155 deletions
+2 -2
View File
@@ -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())
+19 -6
View File
@@ -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)
+14 -17
View File
@@ -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:
+9 -16
View File
@@ -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:
+26 -30
View File
@@ -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.
+8 -16
View File
@@ -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
+62 -38
View File
@@ -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.")
+34 -27
View File
@@ -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.
+6 -3
View File
@@ -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: