Как создать доску с уровнями лидеров в discord-py с помощью базы данных MongoDB?

Участники уже могут зарабатывать уровни, но как сделать так что при вводе команды +top (асинхронная функция с аргументом ctx) писались имена и рядом с ними уровни участников в порядке убывания (+опыт). В таком формате:

Топ 10 лидеров по уровням

#1) Member: 17 lvl (120 / 1140 xp)
#2) Member: 14 lvl (600 / 1010 xp)
#3) Member: 13 lvl (150 / 980 xp)
#4) Member: 10 lvl (470 / 830 xp)
#5) Member: 6 lvl (320 / 340 xp)

У меня есть база данных с содержимым:

data = {
    "_id": member.id,
    "name": member,
    "lvl": 1,
    "xp": 0
}

Вот прошу объяснить мне, пожалуйста, какой цикл может помочь или что делать чтобы всё работало как я задумал?


Ответы (1 шт):

Автор решения: Merka

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

Если где то вдруг ошибка выйдет, в комменты напишите

@bot.command()
async def top(ctx, iters = 50):
    rows = collestionuser.find(limit=iters).sort("lvl", -1) # получаем список с рейтингом по убыванию. collestionuser коллекция с пользователями (на свое замените). в дискорде бесконечно нельзя выводить текст, так что давайте ограничим число мест в выводе

    count = 0

    text = ""

    for row in rows:
        nam = ctx.guild.get_member(int(row["_id"])) # получаем имя
        if nam == None: # если имя нельзя получить, т.е пользователь вышел с сервера, то пропускаем. Иначе вместо имени будет просто None
            continue

        lvl = row["lvl"] # получаем лвл
        text += f"#{str(count+1)}) {nam}: {lvl} lvl\n" # {nam.mention} ещё можно поставить для упоминания.

        count += 1

    await ctx.send(text)
→ Ссылка