【问题标题】:List all guilds with multiple servers on a single embed在单个嵌入中列出所有具有多个服务器的公会
【发布时间】:2021-03-27 00:27:44
【问题描述】:

这是我当前的代码,它显示了它当前所在的服务器。这是我希望它做的事情,但它效率不高,可以避免,而不是为它获得的每个服务器发送嵌入消息。

@client.command()
@commands.is_owner()
async def list_guilds(ctx):
    servers = client.guilds
    for guild in servers:
        embed = discord.Embed(colour=0x7289DA)
        embed.set_footer(text=f"Guilds requested by {ctx.author}", icon_url=ctx.author.avatar_url)
        embed.add_field(name=(str(guild.name)), value=str(guild.member_count)+ " members", inline=False)
        await ctx.send(embed=embed)

我想要做的是循环它所在的所有服务器并仅在单个嵌入中包含 10 个服务器后发送一个嵌入,然后它会发送另一个,避免使用嵌入垃圾邮件。

for client.guilds in range(10):

例如,嵌入应该如下所示:

Guilds list (page 1) showing 10 per embed

Discord server 0
Discord server 1
Discord server 2
Discord server 3
Discord server 4
...
....

这将简单地创建一个包含 10 个服务器的嵌入,名称和服务器所有者等,但目前只需要帮助在一个嵌入上发送多个服务器名称,而不是为每个服务器发送多个嵌入,它会发送目前600+。有人可以帮忙吗?

【问题讨论】:

    标签: python list for-loop discord discord.py


    【解决方案1】:

    我会说你应该在这种情况下使用描述。你可以在关于每个公会的描述中保存你想要的所有信息。在下面我创建的案例中,我检查了机器人所在的每个公会,并将名称和成员计数添加到现有的 description_info 变量中。它只是不断堆积,直到您到达列表的末尾。然后,您可以在嵌入中使用该变量。

    @client.command()
    @commands.is_owner()
    async def list_guilds(ctx):
        servers = client.guilds
        description_info = ""
        
        for guild in servers:
            description_info += "**" + str(guild.name) + "**\n" + str(guild.member_count) + " members\n\n" # This will loop through each guild the bot is in and it the name and member count to a variable that holds everything
    
        embed = discord.Embed(description = description_info, colour=0x7289DA) # Edit the embed line to include the description we created above
        embed.set_footer(text=f"Guilds requested by {ctx.author}", icon_url=ctx.author.avatar_url)
        await ctx.send(embed=embed)
    

    【讨论】:

    • 我会收到一个错误,因为我的机器人在超过 500 多个公会中,所以它不允许将它们放在单个嵌入中
    • 啊,是的,抱歉,我忘了为每个嵌入添加 10 个公会的限制,我的错。
    【解决方案2】:

    迭代列表的每十个值,这是一个示例:

    >>> lst = list(range(1, 26))
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 25]
    >>>
    >>> for i in range(0, len(lst), 10):
    ...     print(lst[i:i + 10])
    ...
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
    [21, 22, 23, 24, 25]
    

    这里适用于您的代码:

    for i in range(0, len(client.guilds), 10):
        embed = discord.Embed(title='Guilds', colour=0x7289DA)
        guilds = client.guilds[i:i + 10]
    
        for guild in guilds:
            embed.add_field(name=guild.name, value='whatever')
    
        await ctx.send(embed=embed)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 2019-09-19
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      相关资源
      最近更新 更多