如何根据给定的要求自动拆分列表?

时间:2019-03-02 08:30:30

标签: python discord discord.py discord.py-rewrite

在Discord上,只能接收字符长度为2000或以下的消息。我试图将漫游器所在的每个服务器的服务器名称,成员数量和服务器ID附加到列表中,然后将列表发送到频道。

但是,由于列表长度超过2000,因此我尝试将其拆分,但是该方法要求每次列表变大时都必须手动对其进行更新。如何使脚本根据需要的“分割数”自动分割列表,然后发送这些“分割数”?

到目前为止,我可以运行,但是不是自动的:

@commands.command()
async def getallservers(self, ctx):
    serverslist = []

    def split_list(alist, wanted_parts=1):
        length = len(alist)
        return [ alist[i*length // wanted_parts: (i+1)*length // wanted_parts] 
                for i in range(wanted_parts) ]

    if ctx.author.id == 204616460797083648:
        for x in self.bot.guilds:
            serverslist.append(f'{x.name}: **{len(x.members)}** - {x.id}\n')

        q1,q2,q3,q4,q5,q6 = split_list(serverslist, wanted_parts=6)

        embed = discord.Embed(title='Server List')

        embed.description = ''.join(q1)
        await ctx.send(embed=embed)
        embed.description = ''.join(q2)
        await ctx.send(embed=embed)
        embed.description = ''.join(q3)
        await ctx.send(embed=embed)
        embed.description = ''.join(q4)
        await ctx.send(embed=embed)
        embed.description = ''.join(q5)
        await ctx.send(embed=embed)
        embed.description = ''.join(q6)
        await ctx.send(embed=embed)
    else:
        pass

1 个答案:

答案 0 :(得分:1)

拥有serverslist的人,可以将其传递给构建<2000个字符页面的函数

def paginate(lines, chars=2000):
    size = 0
    message = []
    for line in lines:
        if len(line) + size > chars:
            yield message
            message = []
            size = 0
        message.append(line)
        size += len(line)
    yield message

然后在您的命令中

for message in paginate(serverlist):
    embed.description = ''.join(message)
    await ctx.send(embed=embed)