(discord.py) Объект «Пользователь» не имеет атрибута «роли» при попытке изменить роли участника - PullRequest
0 голосов
/ 30 апреля 2018

Итак, я пытаюсь написать бота, который дает кому-то приостановленную роль на определенное время, указанное модератором в команде (я знаю, что переменная называется часами, даже если она будет в секундах как в настоящее время это исправлено. Я исправлю это позже.) В основном, это работает модератором, который говорит в сообщении «! suspend @personmention numberofhours», и приостанавливает упомянутое лицо на указанное время. Проблема, с которой я столкнулся, заключается в том, что по какой-то причине бот продолжает говорить мне, что объект пользователя, найденный в строке, где я определяю переменную нарушителя, не имеет ролей атрибута. Насколько я знаю, каждый член сервера раздора имеет атрибуты ролей. Что я делаю не так, что вызывает следующую ошибку, при которой нарушитель не распознает роли?

Вот сообщение об ошибке, которое я получаю:

line 2943, in remove_roles
new_roles = [x.id for x in member.roles]
AttributeError: 'User' object has no attribute 'roles'

А вот фактический код для сценария, который я пишу.

async def suspend(ctx, mention, hours):
    offenderid = mention.replace('<','').replace('>','').replace('!','').replace('@','')
    person = ctx.message.author
    offender = await bot.get_user_info(offenderid)

    if "437778896440524800" in [role.id for role in ctx.message.author.roles] or "437778867940229121" in [role.id for role in ctx.message.author.roles] or "437778794879647755" in [role.id for role in ctx.message.author.roles]:

        role = discord.utils.get(ctx.message.server.roles, name="Raider")
        await bot.remove_roles(offender, role)

        role = discord.utils.get(ctx.message.server.roles, name="Suspended Raider")
        await bot.add_roles(offender, role)

        time.sleep(int(hours))

        role = discord.utils.get(ctx.message.server.roles, name="Suspended Raider")
        await bot.remove_roles(offender, role)

        role = discord.utils.get(ctx.message.server.roles, name="Raider")
        await bot.add_roles(offender, role)

Ответы [ 2 ]

0 голосов
/ 24 июля 2019

Как правило, эта ошибка может возникать, если вы пытаетесь выполнить действие над ботом Discord. Потому что бот - это класс User, а не Member. Итак, если вы больше не хотите получать эту ошибку, вы можете добавить эту строку:

if (ctx.)message.author == bot.user: return
0 голосов
/ 30 апреля 2018

Ошибка говорит о том, что полученный вами объект User, а не Member. Member s обычно имеют роль (по крайней мере, everyone роль), но User s не имеют.

Код, который вы разместили, не содержит пример кода, который вызывает ошибку, поэтому я не могу воспроизвести. Но похоже, что вы пытаетесь выполнить некоторый код для User объекта, а не Member.

...