Как создать slash-команду с опциями в discord.py

    Многие разработчики сталкиваются с ошибками при использовании Param и Option в discord.py. Чаще всего проблема кроется в неверной регистрации параметров или устаревшем синтаксисе. В этой статье мы разберём рабочий пример команды level_reward с необязательными опциями и объясним, как избежать типичных ошибок.

    Почему Param и Option могут не работать?

    Основные причины - неправильные импорты, отсутствие декораторов или конфликт версий библиотеки. В discord.py 2.x для slash-команд используются декораторы @commands.option или @commands.param, но их синтаксис отличается от обычных команд. Убедитесь, что вы используете актуальную версию библиотеки и правильно указываете типы параметров.

    Пример рабочей slash-команды с опциями

    Рассмотрим реализацию команды level_reward, которая добавляет награду за уровень. Код включает обязательный параметр lvl и необязательный id_delete_role.

    class PingCommand(commands.Cog):
        def __init__(self, bot: commands.Bot, guilds):
            self.bot = bot
            self.guilds = guilds
    
        @commands.slash_command(default_member_permissions=Permissions(administrator=True), name="level_reward")
        @commands.has_permissions(administrator=True)
        @commands.option(name="id_delete_role", description="ID роли, которая будет удалена после получения нового уровня", type=str, required=False)
        async def add_role(self, inter: ApplicationCommandInteraction,
                            lvl: int, id_add_role: str, id_delete_role: str = None):
            """
            Добавить награду за уровень.
            Parameters
            ----------
            lvl : int
                Уровень, за который добавляется роль.
            id_add_role : str
                ID роли, которая будет добавлена после получения нового уровня.
            id_delete_role : str, optional
                ID роли, которая будет удалена после получения нового уровня
                required: False
            """
            # Логика команды
            pass

    Ключевые моменты для корректной работы

    • Импорты: убедитесь, что импортированы commands, Permissions и ApplicationCommandInteraction из discord.ext.
    • Декораторы: используйте @commands.option для каждого необязательного параметра, указывая required=False.
    • Типизация: строго соблюдайте типы (int, str) - discord.py автоматически преобразует ввод пользователя.
    • Права: проверяйте права через default_member_permissions или @commands.has_permissions.

    Частые ошибки и их решение

    Ошибка: команда не отображается в Discord

    Проверьте, зарегистрирован ли cog в боте. Используйте bot.add_cog(PingCommand(bot, guilds)) и синхронизируйте команды через bot.tree.sync().

    Ошибка: Param не распознаётся

    В discord.py 2.x для slash-команд используйте @commands.option, а не Param. Param предназначен для обычных команд, а не для слэш-команд.

    Ошибка: необязательные параметры не работают

    Убедитесь, что для необязательных параметров указано значение по умолчанию (None) и декоратор @commands.option с required=False.

    Заключение

    Создание slash-команд с опциями в discord.py требует внимания к деталям. Используйте правильные декораторы, типизацию и проверяйте синхронизацию команд. Следуя нашему примеру, вы сможете легко реализовать любую команду с обязательными и необязательными параметрами.

    Часто задаваемые вопросы