簡體   English   中英

Discord.py:信息命令,如何提及成員的角色?

[英]Discord.py: Info command, How to mention roles of a member?

我正在為我的 Discord.py 機器人制作一個 info 命令。 它還顯示用戶具有的角色。 但它沒有正確顯示角色。

這就是它在 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'

我怎樣才能使它起作用? 提前致謝

那是因為您試圖在roles而不是role上使用mention屬性。 您可以使用List Comprehensionjoin()來提及角色:

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”、“角色 2”、“角色 3”

當我使用member.roles它會給我您在嵌入中看到的信息。

但是我們可以通過使用for循環並遍歷角色列表並逐一提及來解決此問題。

因此,在您的嵌入中,您需要將其加入Roles:領域Roles:我會這樣做:

roles = " ".join([role.mention for role in member.roles])
info_embed.add_field(name="Roles:", value=f"{roles}", inline=False)

這將返回如下內容:

1

將其添加到您的代碼中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM