[英]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 而不是用户。
做了一些调整...
add_role()
以避免将角色用作命令和变量。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。
参考:
Guild.roles
Client.get_all_members()
Member.add_roles()
utils.get()
commands.Context
- 我注意到你使用了一些多余的代码,看看这个看看ctx
的所有属性
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.