Python Раздор Добавить Роль

#python #discord

Вопрос:

Я пытаюсь создать бота, который добавляет роль пользователям на основе набора критериев. У меня есть идентификатор пользователя, хранящийся в базе данных MySQL.

Моя функция добавления роли:

 @client.command(pass_context=True)
@commands.has_permissions(administrator=True)
async def add_role(ctx, member: discord.Member, role: discord.Role):
     await client.get_guild(ctx.guild.id).fetch_member(member).add_roles(role)
 

Позже я вызову эту функцию и попытаюсь передать идентификатор разногласий пользователей, который хранится в базе данных. Значение «d» из массива-это сохраненный идентификатор разногласий.

 @client.command()
async def daily_task(ctx):
    try:
        message = ""
        connectDB()
        cursor = cnx.cursor(buffered=True)
        stmt = """very long sql statement"""
        cursor.execute(stmt)
        for a, b, c, d, e, f, g ,h ,i, j, k, l in cursor.fetchall():
            print(d) #troubleshooting
            if d != 0:
                await add_role(ctx, d, "VEP")
        cursor.close()
        cnx.close()
    except Error as e:
        await ctx.send(e)
        print(e)
 

Сообщение об ошибке:

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

Комментарии:

1. Можете user.add_roles(role) ли вы заменить client.get_user(user).add_roles(role) и попробовать запустить его?

2. @SuneeshJacob «AttributeError: объект» Пользователь «не имеет атрибута «add_roles «» Я так понимаю, мне может потребоваться поменять класс пользователя на члена?

3. Да, вам нужно использовать объект-член. Объект пользователя — это просто объект пользователя Discord, и у него нет никакой информации о каком-либо конкретном сервере, в то время как объект-участник связан с конкретным сервером.

4. Если у вас есть идентификатор сервера, вы можете попробовать что-то вроде этого: client.get_guild('<server id>').fetch_member(user).add_roles(role)

5. @SuneeshJacob Спасибо. Я попробовал это и обновил операцию с моим текущим кодом и новой ошибкой. Ошибка атрибута: объект «сопрограмма» не имеет атрибута «add_roles»

Ответ №1:

 @client.command(pass_context=True)
@commands.has_permissions(administrator=True)
async def add_role(ctx, member : discord.Member, role : discord.Role):
    server = client.get_guild(12345678912344566)
    user = await server.fetch_member(member)
    await user.add_roles(discord.utils.get(user.guild.roles, name="VEP"))
 
 async def daily_task(ctx):
    try:
        message = ""
        connectDB()
        cursor = cnx.cursor(buffered=True)
        stmt = """sql string"""
        cursor.execute(stmt)
        for a, b, c, d, e, f, g ,h ,i, j, k, l in cursor.fetchall():
            if d != 0:
                print(d)
                if (4   g   i) - l > 0:
                    await add_role(ctx, d, "VEP") 
        cursor.close()
        cnx.close()
    except Error as e:
        await ctx.send(e)
        print(e)