繁体   English   中英

Discord 机器人无法使用 discord.py 向用户添加角色

[英]Discord bot fails to add a role to a user using discord.py

我只是想让我的机器人为 discord 中的用户添加一个角色。 虽然语法看起来很简单,但显然我做错了。我是 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 角色,并且没有添加角色。 [编辑:我更正了检索角色的行,该行有效,但仍然没有添加角色。 添加了错误处理程序]

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

做了一些调整...

  1. 将获取 ID 更改为获取成员并返回成员 object。
  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")

为了答案,我正在写整个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 在层次结构中的 position 1 中,并且机器人的最高角色是在 position 2。


参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM