Задать вопрос
@Reaper_sds

Как решить disnake.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'str' object has no attribute 'timeout'?

@commands.slash_command(name="mute", description="Замьютить пользователя")
@commands.has_permissions(mute_members=True)
async def mute(self, inter, member, duration = "Навсегда", reason: str = "Не указана"):
    time_converter = {
        "d": 86400,
        "h": 3600,
        "m": 60,
        "s": 1
    }
    if member == inter.author:
        await inter.send("Вы не можете себя замьютить", ephemeral=True)
        return
    if member == None:
        await inter.send("Укажите пользователя", ephemeral=True)
        return
    if duration.endswith("d"):
        await inter.response.defer()
        duration = int(duration[:-1]) * time_converter["d"]
        await member.timeout(reason=reason, until=duration)
        logembed = disnake.Embed(description=f"**`{member.name}` Был замьючен!**", color=0x4d4d4d)
        logembed.add_field(name="Пользователь", value=member.mention, inline=False)
        logembed.add_field(name="Модератор", value=inter.author.mention, inline=False)
        logembed.add_field(name="Время", value=disnake.utils.format_dt(duration, style='R'), inline=False)
        logembed.add_field(name="Причина", value=f"`{reason}`", inline=False)
        logembed.set_image(url=member.avatar.url)
        logembed.set_footer(text=f"log {datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}")
        channel = inter.guild.get_channel(1234567)
        await channel.send(embed=logembed)
        embed = disnake.Embed(description=f"**`{member.name}` был замьючен**", color=0x4d4d4d)
        await inter.send(embed=embed)
        memberembed = disnake.Embed(description=f"Вы были замьючены модератором {inter.author.mention}", color=0x4d4d4d)
        memberembed.add_field(name="Время", value=disnake.utils.format_dt(duration, style='R'), inline=False)
        memberembed.add_field(name="Причина", value=f"`{reason}`", inline=False)
        memberembed.set_image(url=inter.author.avatar.url)
        await member.send(embed=memberembed)

Вывод: disnake.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'str' object has no attribute 'timeout'
Ну типа я не уверен что вообще проблема в совмещении str с int ._.
  • Вопрос задан
  • 71 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 2
fenrir1121
@fenrir1121 Куратор тега discord.py
Начни с документации
Как решить disnake.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'str' object has no attribute 'timeout

Научиться пользоваться переводчиком. Изучить основы языка. Прочитать документацию к библиотеке, хотя бы основной туториал.

Отсылая к высказыванию классика Vindicar: "Боты это не просто".

Если вы посмотрите на собственный код в предыдущих вопросах и сравните аргументы команды, возможно вы найдете причину. Она тут состоит в том, что библиотека в определенных условиях выполняет приведение типов за разработчика.
Ответ написан
Vindicar
@Vindicar
RTFM!
Включаем логику.
Ты хочешь, чтобы бот сделал вот это:
await member.timeout(reason=reason, until=duration)  # timeout() - метод класса discord.Member

Но! У тебя заголовок функции-обработчика описан так:
async def mute(self, inter, member, duration = "Навсегда", reason: str = "Не указана"):

Ты не указал тип member - по умолчанию это будет строка. Если тебе нужно, чтобы тут была ссылка на участника сервера, ты должен был указать соответствующий тип, как это показано в документации на библиотеку. Для discord.py ссылка тут, в disnake это должно делаться похожим образом, так как диснейк базируется на дискорд пи. В любом случае, если что-то непонятно - сначала находишь и читаешь документацию и примеры в ней.

В твоём случае этого примера должно быть достаточно, чтобы понять, что нужно изменить в заголовке mute().
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы