Я пытаюсь создать таблицу лидеров, чтобы показать различную статистику, которую пользователи собирают при обмене сообщениями в чате 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)
Ой! Я хотел удалить это, я заменил его на "get_dollars", чтобы вытащить доллары из файла json, но я не уверен, что это приведет к созданию таблицы лидеров так, как я хочу.
В большинстве таблиц лидеров есть два режима: отображение X лучших бомбардиров и отображение местоположения конкретного человека вместе с его рангом и несколькими людьми выше и ниже них. Вам следует написать метод, который возвращает ограниченное количество пар (name, amount), отсортированных по убыванию.
Спасибо, Патрик! После небольшого исследования я пришел к этому, но, похоже, он публикует все данные из JSON от наибольшего до наименьшего. Есть ли способ установить максимум 10? Я отредактировал свое исходное сообщение, чтобы отредактировать код, который я использую.
Глядя на весь этот код, мой мозг закипал. Я добавил приведенный ниже код перед отправкой сообщения, и он работает. if number == 10: break else: number += 1 await client.send_message(message.channel, msg)
Здравствуй. Можете выложить полный код? Я делаю нечто подобное со своим ботом. Заранее спасибо! : D
@Person отредактировал код, чтобы отразить все.
@PatrickHaugh Я попытался отредактировать код, чтобы отразить опцию "page forward" для отображения 11-20, но текущий код отправляет несколько встраиваний, просто добавляя еще одного человека к каждому встраиванию, и не останавливается на 20, у вас есть предположение?






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