Как я могу автоматически разделить список на основе заданного требования? - PullRequest
0 голосов
/ 02 марта 2019

На Discord вы можете иметь сообщения длиной не более 2000 символов.Я пытаюсь добавить имя сервера, количество участников и идентификатор сервера для каждого сервера, на котором находится бот, в список, а затем отправлять список на канал.

Однако, поскольку длина списка превышает 2000 Iпытался разделить его, однако метод требует, чтобы он обновлялся каждый раз вручную, поскольку список увеличивается.Как я могу сделать так, чтобы скрипт автоматически разбивал список на основе того, сколько «разделений» требуется, а затем отправлял эти «разбиения»?

То, что у меня есть, работает, но не автоматически:

@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 голосов
/ 02 марта 2019

Если у вас есть serverslist, вы можете передать его функции, которая создает <2000 символов </p>

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)
...