diff --git a/cogs/commands/create.py b/cogs/commands/create.py index d2a8144..8f2d58c 100644 --- a/cogs/commands/create.py +++ b/cogs/commands/create.py @@ -2,7 +2,6 @@ Commands for creating items in bot. """ - import nextcord from nextcord.ext import commands from sqlalchemy import exc, select diff --git a/cogs/commands/delete.py b/cogs/commands/delete.py index bc3945e..1757a6d 100644 --- a/cogs/commands/delete.py +++ b/cogs/commands/delete.py @@ -2,7 +2,6 @@ Commands for deleting groups/categories/scores in database and messages in discord.. """ - import nextcord from nextcord.ext import commands from sqlalchemy import distinct, select diff --git a/cogs/commands/set.py b/cogs/commands/set.py index 21311ba..c820daa 100644 --- a/cogs/commands/set.py +++ b/cogs/commands/set.py @@ -2,7 +2,6 @@ Set command heirarchy. """ - import nextcord from nextcord.ext import commands from sqlalchemy import select diff --git a/cogs/commands/views/delete_confirm.py b/cogs/commands/views/delete_confirm.py index ffde399..095c449 100644 --- a/cogs/commands/views/delete_confirm.py +++ b/cogs/commands/views/delete_confirm.py @@ -2,7 +2,6 @@ Contains view and helper functions for confirming and processing deletes. """ - import nextcord from sqlalchemy import delete, select from sqlalchemy.orm import Session diff --git a/cogs/commands/views/update_username_verify.py b/cogs/commands/views/update_username_verify.py index 44ea5bf..7af7cb6 100644 --- a/cogs/commands/views/update_username_verify.py +++ b/cogs/commands/views/update_username_verify.py @@ -19,9 +19,7 @@ class UpdateUsernameVerifyView(nextcord.ui.View): super().__init__(timeout=None) @nextcord.ui.button(label="Deny", style=nextcord.ButtonStyle.red, custom_id="deny-username-update") - async def deny_button( - self, button: nextcord.ui.Button, interaction: nextcord.Interaction - ): # pylint: disable=unused-argument + async def deny_button(self, button: nextcord.ui.Button, interaction: nextcord.Interaction): # pylint: disable=unused-argument """ Button for denying username update. Deletes message. @@ -32,9 +30,7 @@ class UpdateUsernameVerifyView(nextcord.ui.View): await interaction.message.delete() @nextcord.ui.button(label="Approve", style=nextcord.ButtonStyle.green, custom_id="approve-username-update") - async def approve_button( - self, button: nextcord.ui.Button, interaction: nextcord.Interaction - ): # pylint: disable=unused-argument + async def approve_button(self, button: nextcord.ui.Button, interaction: nextcord.Interaction): # pylint: disable=unused-argument """ Button for approving username update. Tells guild data to update username, then updates message to show it is complete. diff --git a/cogs/submission/submission_views.py b/cogs/submission/submission_views.py index 83711e0..28c5bff 100644 --- a/cogs/submission/submission_views.py +++ b/cogs/submission/submission_views.py @@ -1,6 +1,5 @@ """Views used for submission process.""" - import nextcord from nextcord.ext import commands from sqlalchemy import select diff --git a/cogs/submission/verification_view.py b/cogs/submission/verification_view.py index 3ce5480..7d79d7d 100644 --- a/cogs/submission/verification_view.py +++ b/cogs/submission/verification_view.py @@ -13,16 +13,12 @@ class VerificationView(nextcord.ui.View): super().__init__(timeout=None) @nextcord.ui.button(label="Deny", style=nextcord.ButtonStyle.red, custom_id="deny-button-submission") - async def deny_button( - self, button: nextcord.ui.Button, interaction: nextcord.Interaction - ): # pylint: disable=unused-argument + async def deny_button(self, button: nextcord.ui.Button, interaction: nextcord.Interaction): # pylint: disable=unused-argument """Button for denying score submission.""" await interaction.message.delete() @nextcord.ui.button(label="Approve", style=nextcord.ButtonStyle.green, custom_id="approve-button-submission") - async def approve_button( - self, button: nextcord.ui.Button, interaction: nextcord.Interaction - ): # pylint: disable=unused-argument + async def approve_button(self, button: nextcord.ui.Button, interaction: nextcord.Interaction): # pylint: disable=unused-argument """Button for approving score submission.""" for embed in interaction.message.embeds: content = embed.to_dict() @@ -38,7 +34,6 @@ class VerificationView(nextcord.ui.View): user = field["value"] try: - await submit_score(interaction, group_id, category_id, user, score) content = interaction.message.content content += f"\nApproved by <@{interaction.user.id}>." diff --git a/utilities/sql_data_classes.py b/utilities/sql_data_classes.py index 649e447..4d2c0d9 100644 --- a/utilities/sql_data_classes.py +++ b/utilities/sql_data_classes.py @@ -1,6 +1,7 @@ """ Simple file to set up the sqlalchemy connection to database. """ + from sqlalchemy import create_engine from sqlalchemy.ext.automap import automap_base diff --git a/utilities/utils.py b/utilities/utils.py index 5082112..4207ecc 100644 --- a/utilities/utils.py +++ b/utilities/utils.py @@ -16,9 +16,7 @@ from utilities.sql_data_classes import Category, CategoryGroup, Guild, Score, en MAX_LINE_LENGTH = 142 -def autofill_categories( - guild_id: int, group_id: int, category_begin: str -) -> "dict[str, str]": +def autofill_categories(guild_id: int, group_id: int, category_begin: str) -> "dict[str, str]": """ Returns all category names that start with category_begin. If category_begin is empty, returns list of all category names. @@ -41,9 +39,7 @@ def autofill_categories( ) cat_group_alias = aliased(CategoryGroup, subq) stmt = select(Category).where(Category.GroupId == cat_group_alias.GroupId) - categories_dict: dict[str, str] = { - cat.CategoryName: str(cat.CategoryId) for cat in session.scalars(stmt) - } + categories_dict: dict[str, str] = {cat.CategoryName: str(cat.CategoryId) for cat in session.scalars(stmt)} # if string empty, return all category names if not category_begin: @@ -52,9 +48,7 @@ def autofill_categories( # else find all categories that start with category_begin # TODO is it better to have sql handle the starts with or python? categories: dict[str, str] = { - cat_name: cat_id - for cat_name, cat_id in categories_dict.items() - if category_begin.lower() in cat_name.lower() + cat_name: cat_id for cat_name, cat_id in categories_dict.items() if category_begin.lower() in cat_name.lower() } return dict(list(categories.items())[:25]) @@ -75,9 +69,7 @@ def autofill_groups(guild_id: int, group_begin: str) -> "dict[str, str]": stmt = select(CategoryGroup).where(CategoryGroup.GuildId == guild_id) # dict has to have key values of same type for discord. - group_dict: dict[str, str] = { - group.GroupName: str(group.GroupId) for group in session.scalars(stmt) - } + group_dict: dict[str, str] = {group.GroupName: str(group.GroupId) for group in session.scalars(stmt)} # if string empty, return all group names if not group_begin: @@ -85,17 +77,13 @@ def autofill_groups(guild_id: int, group_begin: str) -> "dict[str, str]": # else find all groups that start with group_begin groups: dict[str, str] = { - group_name: group_id - for group_name, group_id in group_dict.items() - if group_begin.lower() in group_name.lower() + group_name: group_id for group_name, group_id in group_dict.items() if group_begin.lower() in group_name.lower() } return dict(list(groups.items())[:25]) -def autofill_users_in_group_category( - guild_id: int, group_id: int, category_id: int, user_begin: str -) -> "list[str]": +def autofill_users_in_group_category(guild_id: int, group_id: int, category_id: int, user_begin: str) -> "list[str]": """ Returns list of users that match user_begin. Either all users in group or just users in category if category is not None. Might be expensive due to unioning all users in group. @@ -121,9 +109,7 @@ def autofill_users_in_group_category( # If no category id, get all users in group. if category_id == 0: - subq = select(Category.CategoryId).where( - Category.GroupId == category_group.GroupId - ) + subq = select(Category.CategoryId).where(Category.GroupId == category_group.GroupId) stmt = select(distinct(Score.UserName)).where(Score.CategoryId.in_(subq)) else: @@ -135,9 +121,7 @@ def autofill_users_in_group_category( .subquery() ) category = aliased(Category, subq) - stmt = select(distinct(Score.UserName)).where( - Score.CategoryId == category.CategoryId - ) + stmt = select(distinct(Score.UserName)).where(Score.CategoryId == category.CategoryId) users_list: list[str] = list(session.scalars(stmt)) @@ -146,9 +130,7 @@ def autofill_users_in_group_category( return users_list[:25] # else find all users that start with user_begin - users: list[str] = [ - user for user in users_list if user_begin.lower() in user.lower() - ] + users: list[str] = [user for user in users_list if user_begin.lower() in user.lower()] return users[:25] @@ -165,15 +147,9 @@ def autofill_users_in_guild(guild_id: int, user_begin: str) -> "list[str]": list[str]: All users with submissions in the guild. """ with Session(engine) as session: - group_ids = select(CategoryGroup.GroupId).where( - CategoryGroup.GuildId == guild_id - ) - category_ids = select(Category.CategoryId).where( - Category.GroupId.in_(group_ids) - ) - stmt = select(distinct(Score.UserName)).where( - Score.CategoryId.in_(category_ids) - ) + group_ids = select(CategoryGroup.GroupId).where(CategoryGroup.GuildId == guild_id) + category_ids = select(Category.CategoryId).where(Category.GroupId.in_(group_ids)) + stmt = select(distinct(Score.UserName)).where(Score.CategoryId.in_(category_ids)) users_list: list[str] = list(session.scalars(stmt)) # if string empty, return all users @@ -181,9 +157,7 @@ def autofill_users_in_guild(guild_id: int, user_begin: str) -> "list[str]": return users_list[:25] # else find all users that start with user_begin - users: list[str] = [ - user for user in users_list if user_begin.lower() in user.lower() - ] + users: list[str] = [user for user in users_list if user_begin.lower() in user.lower()] return users[:25] @@ -248,15 +222,11 @@ def format_highscore_message(session: Session, group: CategoryGroup) -> str: # process data. Want each group sorted correctly and only top X results processed_group = ( - group_df.sort_values("Score", ascending=category.IsAscending) - .head(category.Size) - .reset_index() + group_df.sort_values("Score", ascending=category.IsAscending).head(category.Size).reset_index() ) # add each score to list - for ind in range( - max_cat_size - ): # need to subtract to deal with category name string + for ind in range(max_cat_size): # need to subtract to deal with category name string if ind in processed_group.index: username = processed_group["UserName"][ind] score = processed_group["Score"][ind] @@ -357,9 +327,7 @@ def get_time_str(time_in: float) -> str: return time.strftime(f"%-M:%S.{milliseconds}", time.gmtime(time_in)) -async def send_highscore_message( - session: Session, guild: nextcord.Guild, group: CategoryGroup -) -> nextcord.Message: +async def send_highscore_message(session: Session, guild: nextcord.Guild, group: CategoryGroup) -> nextcord.Message: """ Function takes care of checking if a message exists for a group. Creates and sends/edits the message. @@ -416,11 +384,7 @@ async def submit_score( else: score = float(score) - stmt = ( - select(Score) - .where(Score.UserName == username) - .where(Score.CategoryId == category_id) - ) + stmt = select(Score).where(Score.UserName == username).where(Score.CategoryId == category_id) existing_score = session.scalar(stmt) if existing_score: @@ -446,9 +410,7 @@ def add_preset_configuration(guild_id: int, config_str: str) -> None: config_str (str): Config name to add """ with Session(engine) as session: - with open( - f"example_config/{config_str}.json", encoding="utf-8" - ) as file: + with open(f"example_config/{config_str}.json", encoding="utf-8") as file: config = json.load(file) for group_name, categorys in config["tables"].items():