""" Commands for creating items in bot. """ from typing import Optional import nextcord from nextcord.ext import commands from sqlalchemy import select from sqlalchemy.orm import Session # pylint: disable=import-error from utilities.sql_data_classes import Category, CategoryGroup, engine from utilities.utils import MAX_LINE_LENGTH, autofill_groups class CreateCog(commands.Cog, name="Create Cog"): """ Class holds commands for creating things. """ def __init__(self) -> None: """ Default constructor for CreateCog class. """ @nextcord.slash_command(default_member_permissions=nextcord.Permissions(administrator=True)) async def create(self, interaction: nextcord.Interaction): """ Parent slash command for creating things. Never called. """ @create.subcommand(description="Create a new category. Must not exist already in CategoryGroup.") async def category( self, interaction: nextcord.Interaction, group_id: str = nextcord.SlashOption(name="group", description="Group to add Category to.", required=True), category_name: str = nextcord.SlashOption(description="Name of new Category.", required=True), is_ascending: bool = nextcord.SlashOption(description="If higher value is better score.", required=True), is_time_record: bool = nextcord.SlashOption( description="If the score should be shown in time format. Cannot be changed.", required=True ), is_validated: bool = nextcord.SlashOption( description="If scores need to be validated before posted.", required=True ), size: int = nextcord.SlashOption( description="How many scores to post in Category. Default is 3.", required=False, default=3, min_value=1 ), ) -> None: new_category = Category( CategoryName=category_name, GroupId=int(group_id), Size=size, IsAscending=is_ascending, IsTimeRecord=is_time_record, IsValidated=is_validated, ) with Session(engine) as session: try: session.add(new_category) session.commit() # TODO get correct exception except Exception as ece: # Category name already exists in group print(ece) session.rollback() stmt = select(CategoryGroup.GroupName).where(CategoryGroup.GroupId == int(group_id)) interaction.response.send_message( f"{category_name} already exists in {session.scalar(stmt)}. Please rename.", ephemeral=True ) @create.subcommand(description="Create a new Category Group. Must not exist already for Guild.") async def group( self, interaction: nextcord.Interaction, group_name: str = nextcord.SlashOption(description="Name of new Group.", required=True), pad_length: int = nextcord.SlashOption( description="Number of characters alloted to a category. Default is 26.", required=False, default=26, min_value=7, max_value=MAX_LINE_LENGTH, ), username_length: int = nextcord.SlashOption( description="Number of characters of a username to display. Default is 12.", required=False, default=12, minvalue=1, max_value=30, ), channel: Optional[nextcord.abc.GuildChannel] = nextcord.SlashOption( description="Channel to post Group in. If left empty, defaults to current channel.", required=False, channel_types=[nextcord.ChannelType.text], default=None, ), ) -> None: # if no channel provided, use current channel. if channel is None: channel = interaction.channel @category.on_autocomplete("group_id") async def group_autocomplete(self, interaction: nextcord.Interaction, group_id: str): """ Collects list of table names and compares to input table name for autocomplete assistance. Args: interaction (nextcord.Interaction): Interaction with command. group_id (str): String to run autocomplete compared to. """ await interaction.response.send_autocomplete(autofill_groups(interaction.guild_id, group_id))