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