Как создать 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 требует внимания к деталям. Используйте правильные декораторы, типизацию и проверяйте синхронизацию команд. Следуя нашему примеру, вы сможете легко реализовать любую команду с обязательными и необязательными параметрами.