Проблема аргумента 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 шт):

Автор решения: DaYa

Сам далеко не самый опытный но во первых, проверку на наличие нужной роли делайте через декоратор, во вторых, 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) 
→ Ссылка
Автор решения: Farmer

Можно сделать так:

@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) 

И не нужно никому выдавать лишние роли.

→ Ссылка