Отображение статистики таблицы лидеров из JSON с Discord.py через Embed

Я пытаюсь создать таблицу лидеров, чтобы показать различную статистику, которую пользователи собирают при обмене сообщениями в чате Discord. Я сохраняю данные через файл JSON, и мне было интересно, на правильном ли я пути или есть лучший способ отобразить статистику с помощью Embed?

Обновлено: отредактировал код, чтобы отобразить внесенные изменения. Новый вопрос: как я могу отобразить 11-20 с перемоткой вперед? Пробовал приведенный ниже код, но когда он переходит на отображение 11-20, он отправляет # 11 как вставку, затем # 11-12 как вставку и т. д. И т. Д. И не останавливается на 20, просто продолжает отправлять больше вставок.

client = discord.Client()

try:
    with open("cash.json") as fp:
        cash = json.load(fp)
except Exception:
    cash = {}

def save_cash():
    with open("cash.json", "w+") as fp:
        json.dump(cash, fp, sort_keys=True, indent=4)

def add_dollars(user: discord.User, dollars: int):
    id = user.id
    if id not in cash:
        cash[id] = {}
    cash[id]["dollars"] = cash[id].get("dollars", 0) + dollars
    print("{} now has {} dollars".format(user.name, cash[id]["dollars"]))
    save_cash()

def get_dollars(user: discord.User):
    id = user.id
    if id in cash:
        return cash[id].get("dollars", 0)
    return 0

client.event
async def on_message(message):
    if message.content.startswith('!lb cash'):
        cash_leaderboard = sorted(cash, key=lambda x : cash[x].get('dollars', 0), reverse=True)
        msg = ''
        for number, user in enumerate(cash_leaderboard):
            msg += '{0}. <@!{1}> {2} Dollars\n\n'.format(number +1, user, cash[user].get('dollars', 0))
            if number == 10:
                break
            else:
                number += 1

            embed = discord.Embed(
            title = "TOP BALLER LEADERBOARD\nBallers:",
            color=0x24d7cf,
            description=msg
        )
            embed.set_author(name = "BOT", icon_url = "")
            embed.set_thumbnail(url = "")
            embed.set_footer(text = "BOT", icon_url = "")

        lb_msg = await client.send_message(message.channel, embed=embed)
        await client.add_reaction(lb_msg, "⏩")
        lb_wait = await client.wait_for_reaction(emoji = "⏩", user=message.author, message=lb_msg, timeout=1800)
        if lb_wait:
            await client.delete_message(lb_msg)
            cash_leaderboard2 = sorted(cash, key=lambda x : cash[x].get('dollars', 0), reverse=True)
            msg = ''
            for number, user in enumerate(cash_leaderboard2):
                msg += '{0}. <@!{1}> {2} Dollars\n\n'.format(number +11, user, cash[user].get('dollars', 0))
                if number == 20:
                    break
                else:
                    number += 1

                embed = discord.Embed(
                title = "TOP BALLER LEADERBOARD 11-20\nBallers:",
                color=0x24d7cf,
                description=msg
            )
                embed.set_author(name = "BOT", icon_url = "")
                embed.set_thumbnail(url = "")
                embed.set_footer(text = "BOT", icon_url = "")

            await client.send_message(message.channel, embed=embed)

Ваш on_message выглядит так, как будто в нем отсутствуют детали. Например, что такое dollars_count?

Patrick Haugh 22.08.2018 21:57

Ой! Я хотел удалить это, я заменил его на "get_dollars", чтобы вытащить доллары из файла json, но я не уверен, что это приведет к созданию таблицы лидеров так, как я хочу.

hardestchat 22.08.2018 22:25

В большинстве таблиц лидеров есть два режима: отображение X лучших бомбардиров и отображение местоположения конкретного человека вместе с его рангом и несколькими людьми выше и ниже них. Вам следует написать метод, который возвращает ограниченное количество пар (name, amount), отсортированных по убыванию.

Patrick Haugh 22.08.2018 22:38

Спасибо, Патрик! После небольшого исследования я пришел к этому, но, похоже, он публикует все данные из JSON от наибольшего до наименьшего. Есть ли способ установить максимум 10? Я отредактировал свое исходное сообщение, чтобы отредактировать код, который я использую.

hardestchat 23.08.2018 09:50

Глядя на весь этот код, мой мозг закипал. Я добавил приведенный ниже код перед отправкой сообщения, и он работает. if number == 10: break else: number += 1 await client.send_message(message.channel, msg)

hardestchat 24.08.2018 04:07

Здравствуй. Можете выложить полный код? Я делаю нечто подобное со своим ботом. Заранее спасибо! : D

Person 24.08.2018 06:30

@Person отредактировал код, чтобы отразить все.

hardestchat 25.02.2019 23:03

@PatrickHaugh Я попытался отредактировать код, чтобы отразить опцию "page forward" для отображения 11-20, но текущий код отправляет несколько встраиваний, просто добавляя еще одного человека к каждому встраиванию, и не останавливается на 20, у вас есть предположение?

hardestchat 25.02.2019 23:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
8
1 006
0

Другие вопросы по теме