Как мне добавить ранги в систему прокачки опыта, чтобы discord.py бот?

#python #discord #discord.py #bots

Вопрос:

Как мне добавить ранги в систему прокачки опыта, чтобы discord.py бот. Это код ,который я использовал, любая помощь будет признательна

 import discord from discord.ext import commands from discord.utils import get import json client = commands.Bot(command_prefix="!")   @client.event async def on_message(message):  if not message.author.bot:  await open_account_level(message.author)  users = await get_level_data()   await add_experience(users, message.author, 5)  await level_up(users, message.author, message)   with open('users.json', 'w') as f:  json.dump(users, f)  await client.process_commands(message)  #command to check your level details @client.command() async def level(ctx):  await open_account_level(ctx.author)   users = await get_level_data()   user = ctx.author   exp_level = users[str(user.id)]["Exp"]  bank_amt = users[str(user.id)]["Exp Level"]   em = discord.Embed(title=f"{ctx.author.name}'s balance", color=discord.Color.red())  em.add_field(name="Exp", value=exp_level)  em.add_field(name="Exp Level", value=bank_amt)  await ctx.send(embed=em)  #adds exp to your account async def add_experience(users, user, exp):  users[f'{user.id}']['Exp']  = exp   #levels you up after an exp limit async def level_up(users, user, message):  with open('users.json', 'r') as g:  levels = json.load(g)  experience = users[f'{user.id}']['Exp']  lvl_start = users[f'{user.id}']['Exp Level']  lvl_end = int(experience ** (1 / 4))  if lvl_start lt; lvl_end:  await message.channel.send(f'{user.mention} has leveled up to level {lvl_end}')  users[f'{user.id}']['Exp Level'] = lvl_end   #creates an account for you in a json file async def open_account_level(user):  users = await get_level_data()  if str(user.id) in users:  return False  else:  users[str(user.id)] = {}  users[str(user.id)]["Exp"] = 0  users[str(user.id)]["Exp Level"] = 0   with open("users.json", "w") as f:  json.dump(users, f)  return True   async def get_level_data():  with open("users.json", "r") as f:  users = json.load(f)  return users TOKEN = 'token' client.run(TOKEN)  

Мне нужны ранги, чтобы он показывал, как имеет самый высокий уровень опыта и возвращает их ранг среди других на сервере Также не стесняйтесь указывать на любые ошибки в моем коде, помощь будет признательна.

Ответ №1:

Очень просто индексировать базу данных, созданную в формате JSON, и просто сортировать данные. В моем примере я использую класс для легкого доступа к опыту каждого пользователя.

 import discord import json  @client.command() async def level(ctx):  await open_account_level(ctx.author)   users = await get_level_data()   class LeaderBoardPosition:  def __init__(self, id, exp):  self.id = id  self.exp = exp   leaderboard = []   for user in users:  leaderboard.append(LeaderBoardPosition(user, users[user]["exp"]))   top = sorted(leaderboard, key=lambda x: x.exp, reverse=True)   for user in top:  if user.id == str(ctx.author.id):  ranking = top.index(user)   1   exp_level = users[str(ctx.author.id)]["exp"]  bank_amt = users[str(ctx.author.id)]["exp_level"]   embed = discord.Embed(title=f"{ctx.author.name}'s Balance",   color=discord.Color.red())    embed.add_field(name="EXP", value=exp_level, inline=True)  embed.add_field(name="EXP Level", value=bank_amt, inline=True)  embed.add_field(name="Ranking", value=ranking, inline=True)   await ctx.send(embed=embed)  async def open_account_level(user):  users = await get_level_data()   if str(user.id) in users:  return False  else:  users[str(user.id)] = {}  users[str(user.id)]["exp"] = 0  users[str(user.id)]["exp_level"] = 0   with open("users.json", "w") as file:  json.dump(users, file)   return True  async def get_level_data():  with open("users.json", "r") as file:  return json.load(file)