【问题标题】:Discord bot fails to add a role to a user using discord.pyDiscord bot 无法使用 discord.py 向用户添加角色
【发布时间】:2020-09-02 07:01:44
【问题描述】:

我只是想让我的机器人为不和谐的用户添加一个角色。虽然语法看起来很简单,但显然我做错了什么。我是 python 新手,所以我很感激一些正确方向的指针!

bot = commands.Bot(command_prefix='!')

def getdiscordid(discordname):
    for guild in bot.guilds:
        for member in guild.members:
            if member.name == discordname:
                return member.id


@bot.command(name='role')
async def role(ctx):
    await ctx.message.channel.send("Testing roles")
    discordid = getdiscordid("Waldstein")
    print ("id: " , discordid)
    member = bot.get_user(discordid)
    print ("member: ", member)
    role = get(ctx.message.guild.roles, name="Egg")
    print("role: ", role.name)
    await  member.add_roles(role)
    print("done")

# error handler
@bot.event
async def on_command_error(ctx, error):
    if isinstance(error, commands.errors.CheckFailure):
        await ctx.send(error)


bot.run(TOKEN)

在此示例中,他成功检索了成员,但找不到 Egg 角色,并且没有添加角色。 [编辑:我更正了检索角色的行,该行有效,但仍然没有添加角色。添加了错误处理程序]

【问题讨论】:

  • Egg 角色是否已经存在?
  • 确实如此!我在之前的尝试中得到了该部分的工作。
  • 尝试用这个替换添加角色功能:bot.add_role(member, role)
  • 我改成这个了,还是不行:@bot.command(name='role') async def role(ctx): await ctx.message.channel.send("测试角色") member = ctx.message.author print ("member: ", member) role = get(ctx.message.guild.roles, name="Egg") print("role: ", role.name) bot .add_role(成员,角色)
  • 它会抛出任何错误吗?

标签: python discord discord.py


【解决方案1】:

关键问题是add_roles() 将角色添加到成员对象而不是用户。

做了一些调整...

  1. 将get id改为获取成员并返回成员对象。
  2. 将命令名称更改为add_role(),以避免将角色用作命令和变量。
  3. 更改为await member.add_roles(role)

试试:

def get_member(discordname):
    for guild in bot.guilds:
        for member in guild.members:
            if member.name == discordname:
                return member


@bot.command(name='add_role')
async def add_role(ctx):
    await ctx.message.channel.send("Testing roles")
    member = get_member("Waldstein")
    print(f'member is {member} type {type(member)}')
    role = get(ctx.guild.roles, name="Egg")
    print("role: ", role.name)
    await member.add_roles(role)
    print("done")

【讨论】:

    【解决方案2】:

    为了回答问题,我写的是整个discord.utils.get 而不仅仅是get。这是你重写的命令:

    import discord
    
    @bot.command()
    async def role(ctx):
        await ctx.send("Testing roles!")
        member = discord.utils.get(bot.get_all_members(), name="Waldstein")
                 # be careful when getting objects via their name, as if there are duplicates,
                 # then it might not return the one you expect
    
        print(f"id: {member.id}")
        print(f"member: {member}")
        role = discord.utils.get(ctx.guild.roles, name="Egg") # you can do it by ID as well
        print(f"role: {role.name}")
        await member.add_roles(role) # adding to a member object, not a user
        print("Done!")
    

    如果这不起作用,请尝试打印如下内容:

    print(ctx.guild.roles)
    

    它应该返回机器人可以看到的每个角色。这样你就可以手动调试了。

    可能导致此问题的一件事是,如果机器人没有必要的权限,或者如果它的角色低于您尝试获得的角色,即 Egg 处于位置 1在层次结构中,机器人的最高角色在位置 2。


    参考资料:

    【讨论】:

    • 哇,它现在可以工作了。感谢您的努力和信息。我通过这种方式学到了很多东西。它现在可以工作,代码更简洁,是检索用户的更好方法。谢谢!
    • 别担心!很高兴它对你有用,祝机器人好运:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2018-11-26
    • 2021-04-29
    • 2021-04-28
    • 2019-08-11
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多