Проблема аргумента ctx discord.py
Пишу бота используя disnake и столкнулся с вопросом. Ниже две почти аналогичные функции:
@bot.slash_command(description='Очищает данное количесво сообщений.')
async def clear(ctx, reason: int = commands.Param(name="number_of_messages_to_clear")): #slash-command clear
print(ctx)
await check_moderator_role(сtx=ctx)
await ctx.channel.purge(limit=int(reason))
await ctx.response.send_message(embed=disnake.Embed(description=f'**{reason} сообщений(e) удалено!** :white_check_mark:'), delete_after=60)
@bot.command()
async def clear(ctx, reason): #unslash-command clear
print(ctx)
await check_moderator_role(ctx=ctx)
await ctx.channel.purge(limit=int(reason))
await ctx.send(embed=disnake.Embed(description=f'**{reason} сообщений(е) удалено!** :white_check_mark:'), delete_after=60)
В них прописаны две команды, обычная команда работает, слэш - нет.
Ошибка как я уже точно определил во второй строке функции, а именно в её аргументе - await check_moderator_role(ctx=ctx)
check_moderator_role(ctx) - моя сам описная функция, знать что в ней находится не обязательно, сама она рабочая, проблема с её аргументом.
Я выяснил, что аргумент ctx в разных функциях почему - то разный, в слеш - команде он равен: <disnake.interactions.application_command.ApplicationCommandInteraction object at 0x000000000399F740>, а в анслеш: <disnake.ext.commands.context.Context object at 0x0000000003D0E6A0>, я думаю проблема в этом.
Вопрос такой: Почему аргумент ctx в разных функциях имеет разные значения и может ли из-за этого не работать функция?
Стек ошибки: disnake.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: check_moderator_role() got an unexpected keyword argument 'сtx'
Ответы (2 шт):
Сам далеко не самый опытный но во первых, проверку на наличие нужной роли делайте через декоратор, во вторых, ctx не подходит в данном случае и вместо него нужно использовать inter.
@bot.slash_command(description='Очищает данное количесво сообщений.')
@commands.has_any_role('роль') #название вашей роли
async def clear(inter, reason: int = commands.Param(name="number_of_messages_to_clear")): #slash-command clear
await inter.channel.purge(limit=int(reason))
await inter.response.send_message(embed=disnake.Embed(description=f'**{reason} сообщений(e) удалено!** :white_check_mark:'), delete_after=60)
Можно сделать так:
@bot.slash_command(description='Очищает данное количесво сообщений.')
# Все, у кого есть право "Управлять соообщениями" сможет использовать данную команду.
@commands.has_permissions(manage_messages = True)
# slash-command clear
async def clear(inter, reason: int = commands.Param(name="number_of_messages_to_clear")):
await inter.channel.purge(limit=int(reason))
await inter.response.send_message(
embed=disnake.Embed(
description=f'**{reason} сообщений(e) удалено!** :white_check_mark:'),
delete_after=60)
И не нужно никому выдавать лишние роли.