【问题标题】:Discord.py: Info command, How to mention roles of a member?Discord.py:信息命令,如何提及成员的角色?
【发布时间】:2021-09-05 19:15:02
【问题描述】:

我正在为我的 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'

我怎样才能让它发挥作用?提前致谢

【问题讨论】:

  • 当然是列表。实际上,用户可能有一个或多个角色,因此在列表中。您需要遍历列表并找到要 ping 的特殊角色。

标签: python discord discord.py


【解决方案1】:

让我们继续努力吧。 您不能真正提及整个列表。

例如,我有三个角色:“角色 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

【讨论】:

  • 这也行得通,一切顺利!感谢您的帮助
  • @KipZonderKop101 哇,来吧!我是他在我的回答中更详细的一个! (-_-)
  • 改了@Bhavyadeep Yadav
【解决方案2】:

那是因为您尝试在roles 上使用mention 属性而不是role。您可以使用List Comprehensionjoin() 来获取角色的提及:

f"{' '.join([role.mention for role in member.roles])}"

它将返回role.mentions,以空格分隔。如果你想排除@everyone,你可以在列表理解中使用 if 语句。像这样:

f"{' '.join([role.mention for role in member.roles if role.name != '@everyone'])}"

【讨论】:

  • 你能提到他们应该这样做吗?我的意思是是的,这很明显,但很多其他人可以来找这个!
猜你喜欢
  • 2018-07-27
  • 2022-12-08
  • 2021-02-07
  • 2021-07-26
  • 2021-03-26
  • 2021-11-25
  • 2021-07-26
  • 2020-12-19
  • 1970-01-01
相关资源
最近更新 更多