Вставка отображается некорректно

#python-3.x #discord #discord.py-rewrite

#python-3.x #Discord #discord.py

Вопрос:

Привет, у меня возникли некоторые проблемы с корректным отображением списков в моем встраивании. Я пытаюсь поместить свои роли под одним заголовком списка, вот проблема, с которой я сталкиваюсь, в том, как мои списки отображаются при встраивании.

введите описание изображения здесь

Кажется, каждая роль дублируется под заголовком списка.

Я пробовал inline=True , похоже, это не устраняет проблему.

      #--- Below is the list command ---

@commands.command(pass_context=True, no_pm=True, name='list', aliases=['roles', 'role'])
async def _list(self, ctx):
    """List of all available roles """
    guild = ctx.message.guild
    author = ctx.message.author
    botroom = self.bot.get_channel(555844758778544160) 
    intros = self.bot.get_channel(485381365366390796)
     #--- Role list Categories ---"
    Colours = ['Blue', 'Green', 'Orange', 'Yellow', 'Pink', 'Purple']
    Colours.sort(key=str.lower)

    Games = ['LoL', 'WoW', 'Overwatch']
    Games.sort(key=str.lower)

    Platforms = ['PC', 'Xbox', 'PS4', 'Nintendo Switch']
    Platforms.sort(key=str.lower)

    if ctx.message.channel == intros:
        pass
    else:
        if ctx.message.channel == botroom:
            title = '**Hey {}, here is a list of roles you can add:**'.format(author.display_name)
            embed = discord.Embed(title=title.format(), colour=0x0080c0)
            embed.add_field(name="**Have a role suggestion?**", value="If you can't find the role you want but would like to see it added to the roles list please tell us in <#555371532390760473>.", inline=False)
            embed.set_footer(text="Tip: to add a role from the list type the command !add/remove followed by the role.")

            #Lets start embed roles list below#
            for role in Games:
                embed.add_field(name="**Game Roles**", value="n{} **({})**".format(role, len([member for member in guild.members if ([r for r in member.roles if r.name == role])])))

            for role in Platforms:
                embed.add_field(name="**Plaforms Roles**", value="n{} **({})**".format(role, len([member for member in guild.members if ([r for r in member.roles if r.name == role])])))
            await ctx.send(embed=embed)
        else:
            await ctx.send('You can only use this command in {}.'.format(botroom.mention))
  

Роли в списках отображаются не так, как должны.

Ответ №1:

В настоящее время вы добавляете категории по одному разу для каждого элемента в категории. Вместо этого вы хотите добавить каждую категорию один раз, перечислив все роли под ней. Вы также можете получить объект роли и получить к нему доступ len(role.members) напрямую:

 def role_name_to_summary(ctx, name):
    role = get(ctx.guild.roles, name=name)
    if not role:
        return None
    return f"{role.name} **({len(role.members)})**"

embed.add_field(name="**Game Roles**", value="n".join(filter(None, [role_name_to_summary(ctx, name) for name in Games]))
  

Комментарии:

1. Я немного запутался, как использовать это в моем коде, является ли def событием? или это должно быть async def не могли бы вы привести мне пример того, как вы бы это использовали.

2. Это просто вспомогательная функция для создания строк. Это должно быть где-то в вашем коде, и строка под ним должна заменить for role in Games: цикл в вашей команде.