我正在为我的 Discord.py 机器人制作一条信息命令。它还显示用户具有的角色。但它没有正确显示角色。
This is how it looks on Discord
我如何使它像其他机器人一样提到角色。
这是我的代码:
async def info(ctx, member: discord.Member):
info_embed = discord.Embed(color=discord.Color.green())
info_embed.set_thumbnail(url=f"{member.avatar_url_as(format=None, static_format='webp', size=1024)}")
info_embed.add_field(name="Member:", value=f"{member.mention}", inline=False)
info_embed.add_field(name="Member name", value=f"{member}", inline=False)
info_embed.add_field(name="Member id:", value=f"{member.id}", inline=False)
info_embed.add_field(name="Nickname:", value=f"{member.nick}", inline=False)
info_embed.add_field(name="Joined at:", value=f"{member.joined_at}", inline=False)
info_embed.add_field(name="Roles:", value=f"{member.roles}", inline=False)
info_embed.set_footer(text="GG-GamerPub | auto-mod")
await ctx.send(embed=info_embed)
我尝试将其更改为:
member.roles.mention
但这不起作用。它给了我以下错误
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'list' object has no attribute 'mention'
我怎样才能使它起作用?提前致谢
答案 0 :(得分:1)
那是因为您试图在 mention
而非 roles
上使用 role
属性。您可以使用 List Comprehension 和 join()
来提及角色:
f"{' '.join([role.mention for role in member.roles])}"
它将返回以空格分隔的 role.mention
。如果你想排除@everyone,你可以在列表理解中使用 if 语句。像这样:
f"{' '.join([role.mention for role in member.roles if role.name != '@everyone'])}"
答案 1 :(得分:0)
让我们继续努力。 你不能真正提到整个列表。
例如,我有三个角色:“角色 1”、“角色 2”、“角色 3”
当我使用 member.roles
时,它会给我您在嵌入中看到的内容。
但我们可以通过使用 for
循环并遍历角色列表并逐一提及来解决此问题。
因此,在您的嵌入中,您需要将其加入 Roles:
字段
我会这样做:
roles = " ".join([role.mention for role in member.roles])
info_embed.add_field(name="Roles:", value=f"{roles}", inline=False)
这将返回如下内容:
将其添加到您的代码中:
async def info(ctx, member: discord.Member):
info_embed = discord.Embed(color=discord.Color.green())
info_embed.set_thumbnail(url=f"{member.avatar_url_as(format=None, static_format='webp', size=1024)}")
info_embed.add_field(name="Member:", value=f"{member.mention}", inline=False)
info_embed.add_field(name="Member name", value=f"{member}", inline=False)
info_embed.add_field(name="Member id:", value=f"{member.id}", inline=False)
info_embed.add_field(name="Nickname:", value=f"{member.nick}", inline=False)
info_embed.add_field(name="Joined at:", value=f"{member.joined_at}", inline=False)
roles = " ".join([role.mention for role in member.roles if role.name != "@everyone"])
info_embed.add_field(name="Roles:", value=f"{roles}", inline=False)
info_embed.set_footer(text="GG-GamerPub | auto-mod")
await ctx.send(embed=info_embed)
我想添加一个即兴功能,所以我做到了。如果没有提到用户,则成员是执行命令的用户。
async def info(ctx, member: discord.Member=None):
if member:
info_user = member
elif member == None:
info_user = ctx.author
info_embed = discord.Embed(color=discord.Color.green())
info_embed.set_thumbnail(url=f"{info_user.avatar_url_as(format=None, static_format='webp', size=1024)}")
info_embed.add_field(name="Member:", value=f"{info_user.mention}", inline=False)
info_embed.add_field(name="Member name", value=f"{info_user}", inline=False)
info_embed.add_field(name="Member id:", value=f"{info_user.id}", inline=False)
info_embed.add_field(name="Nickname:", value=f"{info_user.nick}", inline=False)
info_embed.add_field(name="Joined at:", value=f"{info_user.joined_at}", inline=False)
roles = " ".join([role.mention for role in info_user.roles if role.name != "@everyone"])
info_embed.add_field(name="Roles:", value=f"{roles}", inline=False)
info_embed.set_footer(text="GG-GamerPub | auto-mod")
await ctx.send(embed=info_embed)
希望您能理解,如果您还有任何疑问,请在评论中问我。
谢谢! :D