Как передать сопрограмму в декоратор commands.dynamic_cooldown()?

Пишу бота на disnake.py (аналог discord.py). Он не многим отличается от официальной библиотеки discord, просто он до сих пор поддерживается и обновляется.

У меня проблема с декоратором @commands.dynamic_cooldown().

У меня есть сопрограмма, возвращающая время восстановления:

async def give_guild_cooldown(message):
    if message.author.guild_permissions.administrator:
        return disnake.ext.commands.Cooldown(rate=1, per=0)
    for value in await constants.SQL.execute('SELECT * FROM servers_info'):
        if value[0] == message.guild.id:
            return disnake.ext.commands.Cooldown(rate=1, per=value[3])

У меня есть функция clear, завернутая в декоратор @commands.dynamic_cooldown():

@constants.bot.slash_command(description='Очищает данное количесво сообщений.')
@commands.dynamic_cooldown(function.give_guild_cooldown, commands.BucketType.user)
async def clear(ctx, reason: int = commands.Param(name="number_of_messages_to_clear")):    # slash-command clear
    await function.chq_moder_role(ctx=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)

При вызове функции возникает ошибка:

AttributeError: 'coroutine' object has no attribute 'update_rate_limit'

Я уже понял, что проблема в том, что я передаю сопрограмму, а не функцию. Если передать функцию, декоратор будет работать. Но я не могу отказаться от асинхронных методов в своей сопрограмме. Могу ли я передать сопрограмму декоратору? Или ошибка не в сопрограмме?

P.s. Я точно выяснил, что декоратор не может начать работу, потому что невозможно передать объект класса disnake.Message в coroutine, тоесть ошибка, находится в самом начале.

Заранее спасибо за ответ!


Ответы (0 шт):