我想编写用户信息命令,并想显示用户的角色,但当我试图获取他们的角色时,我会收到他们的ID。我怎么能只知道他们的名字?
# User info
@commands.command(aliases = ['usinfo'])
async def userinfo(self, ctx, member: discord.Member = None, guild: discord.Guild = None):
member = ctx.author if not member else member
guild = ctx.guild if not guild else guild
emb = discord.Embed(description = "**{}'s info**".format(member.mention), colour = member.color)
await ctx.channel.purge(limit = 1)
channel = ctx.channel.id
emb.set_author(name = guild, icon_url = guild.icon_url)
emb.add_field(name = "**Status is**", value = '**{}**'.format(
member.status).replace('dnd', '**Do not disturb**'))
emb.add_field(name = '** **', value = '** **')
if member.activity is not None:
emb.add_field(name = "**Activity is**", value = '**{}**'.format(member.activity.name))
else:
emb.add_field(name = "**Activity is**".format(member.mention), value = '**Nothing**')
emb.add_field( name = "**Roles are**", value = '**{}**'.format( member.roles ).replace('[<Role id=', '').replace('<Role id=', '').replace("name='", '').replace("'>", '').replace('@everyone', '').replace(']', '').replace('@everyone,', ''), inline = False )
emb.set_thumbnail(url = member.avatar_url)
await ctx.send(embed = emb)
member.roles
返回一个角色列表。为了获得角色的每个名称,您应该制作一个for loop
。然后,您应该将角色名称保存在另一个列表中。
role_names = []
for role in member.roles:
role_names.append(role.name)
因此,在这里,我为member.roles
制作了一个for loop
,并将role.name
保存在role_names
列表中。
之后,您应该将此列表返回到string
中,以便您的嵌入看起来更好。为此,可以使用str.join()
。
role_names = []
for role in member.roles:
role_names.append(role.name)
role_names = ', '.join(role_names)
所以,如果你把它添加到你的代码中,那么如果你做
emb.add_field(name="**Roles are**", value=f'**{role_names}**')
它将返回一个角色名称列表,如管理员、所有者、主持人。
您可以替换:
emb.add_field( name = "**Roles were**", value = '**{}**'.format( member.roles ).replace('[<Role id=', '').replace('<Role id=', '').replace("name='", '').replace("'>", '').replace('@everyone', '').replace(']', '').replace('@everyone,', ''), inline = False )
收件人:
emb.add_field(name="**Roles were**", value=f"**{', '.join([role.name for role in member.roles])}**")