From 8a2108fc14fdcd4204d9f6ae8cc087f7ee22f5c0 Mon Sep 17 00:00:00 2001 From: alwayscompiling Date: Tue, 22 Nov 2022 17:12:26 -0500 Subject: [PATCH] Create shell commands and autofill functions. Fix set initializer in utils.autofill_users. --- cogs/commands/data_management.py | 119 ++++++++++++++++++++++++++----- utilities/utils.py | 2 +- 2 files changed, 101 insertions(+), 20 deletions(-) diff --git a/cogs/commands/data_management.py b/cogs/commands/data_management.py index e93876f..45830d2 100644 --- a/cogs/commands/data_management.py +++ b/cogs/commands/data_management.py @@ -2,11 +2,16 @@ Commands for managing the tables/categories/scores for a Guild. """ -from nextcord.ext import commands import nextcord +from nextcord.ext import commands from highscores import highscores_data # pylint: disable=import-error -from utilities.utils import send_highscore_message # pylint: disable=import-error +from utilities.utils import ( # pylint: disable=import-error + autofill_categories, + autofill_users, + autofill_tables, + send_highscore_message, +) from .views.update_username_verify import UpdateUsernameVerifyView @@ -35,9 +40,7 @@ class DataManagementCog(commands.Cog, name="Table Management"): Parent slash command for deleting things. Never called. """ - @delete.subcommand( - description="Deletes all scores for this guild. Used for testing. Do Not Use." - ) + @delete.subcommand(description="Deletes all scores for this guild. Used for testing. Do Not Use.") async def scores(self, interaction: nextcord.Interaction): """ Warning: This command only works for developers. @@ -52,18 +55,22 @@ class DataManagementCog(commands.Cog, name="Table Management"): for category in table.categories: category.clear() highscores_data.save_guild_data(highscores_data.get_guild(interaction.guild_id)) - await interaction.response.send_message( - f"Cleared score data for {interaction.guild.name}.", ephemeral=True - ) + await interaction.response.send_message(f"Cleared score data for {interaction.guild.name}.", ephemeral=True) else: await interaction.response.send_message( "You shouldn't be using this command. Deletes everything.", ephemeral=True ) - @delete.subcommand( + @delete.subcommand() + async def user(self, interaction: nextcord.Interaction): + """ + Subcommand parent for deleting user information. Never called. + """ + + @user.subcommand( description="Removes all of a user's scores. Warning: data is destroyed, use with case.", ) - async def user( + async def from_all( self, interaction: nextcord.Interaction, username: str = nextcord.SlashOption( @@ -92,9 +99,7 @@ class DataManagementCog(commands.Cog, name="Table Management"): table_updated = True if table_updated: - await send_highscore_message( - interaction.guild.get_channel(guild.highscore_channel), guild, table - ) + await send_highscore_message(interaction.guild.get_channel(guild.highscore_channel), guild, table) if not user_was_found: await interaction.send(f'User "{username}" was not found.', ephemeral=True) @@ -102,16 +107,92 @@ class DataManagementCog(commands.Cog, name="Table Management"): await interaction.send(f'User "{username}" was removed from all tables.') highscores_data.save_guild_data(guild) + @user.subcommand(description="Deletes a user's scores from a category.") + async def from_category( + self, + interaction: nextcord.Interaction, + table_name: str = nextcord.SlashOption(description="Table to delete user from.", required=True), + category_name: str = nextcord.SlashOption(description="Category to delete user from.", required=True), + user_name: str = nextcord.SlashOption(description="User to delete.", required=True), + ): + """ + _summary_ + + Args: + interaction (nextcord.Interaction): _description_ + table_name (str, optional): _description_. Defaults to nextcord.SlashOption(description="", required=True). + category_name (str, optional): _description_. Defaults to nextcord.SlashOption(description="", required=True). + user_name (str, optional): _description_. Defaults to nextcord.SlashOption(description="", required=True). + """ + + @user.subcommand(description="Deletes a user's scores from entire table.") + async def from_table( + self, + interaction: nextcord.Interaction, + table_name: str = nextcord.SlashOption(description="Table to delete user from.", required=True), + user_name: str = nextcord.SlashOption(description="User to delete.", required=True), + ): + """ + _summary_ + + Args: + interaction (nextcord.Interaction): _description_ + table_name (str, optional): _description_. Defaults to nextcord.SlashOption(description="Table to delete user from.", required=True). + user_name (str, optional): _description_. Defaults to nextcord.SlashOption(description="User to delete.", required=True). + """ + + @from_category.on_autocomplete("table_name") + @from_table.on_autocomplete("table_name") + async def from_category_autocomplete_table(self, interaction: nextcord.Interaction, table_name: str): + """ + _summary_ + + Args: + interaction (nextcord.Interaction): _description_ + table_name (str): _description_ + """ + await interaction.response.send_autocomplete(autofill_tables(interaction.guild_id, table_name)) + + @from_category.on_autocomplete("category_name") + async def from_category_autocomplete_category( + self, interaction: nextcord.Interaction, category_name: str, table_name: str + ): + """ + _summary_ + + Args: + interaction (nextcord.Interaction): _description_ + category_name (str): _description_ + table_name (str): _description_ + """ + await interaction.response.send_autocomplete( + autofill_categories(interaction.guild_id, table_name, category_name) + ) + + @from_category.on_autocomplete("user_name") + @from_table.on_autocomplete("user_name") + async def from_category_autocomplete_user( + self, interaction: nextcord.Interaction, user_name: str, table_name: str, category_name: str = None + ): + """ + _summary_ + + Args: + interaction (nextcord.Interaction): _description_ + user_name (str): _description_ + table_name (str): _description_ + category_name (str): _description_ + """ + await interaction.response.send_autocomplete( + autofill_users(interaction.guild_id, table_name, category_name, user_name) + ) + @nextcord.slash_command(description="Request a username update. Admins must approve.") async def update_username( self, interaction: nextcord.Interaction, - old_username: str = nextcord.SlashOption( - description="Username currently stored in highscores.", required=True - ), - new_username: str = nextcord.SlashOption( - description="Username to update to.", required=True - ), + old_username: str = nextcord.SlashOption(description="Username currently stored in highscores.", required=True), + new_username: str = nextcord.SlashOption(description="Username to update to.", required=True), ): """ Creates a request to send to admins for changing a username. Uses diff --git a/utilities/utils.py b/utilities/utils.py index 954d224..9dde5d6 100644 --- a/utilities/utils.py +++ b/utilities/utils.py @@ -104,7 +104,7 @@ def autofill_users(guild_id: int, table_name: str, category_name: str, user_begi # If no category name, get all users in table. if category_name is None: - user_set: set + user_set: set = set() for category in highscores_data.get_guild(guild_id).get_table(table_name).get_categories().values(): user_set = user_set | set(category.get_users())