首页 > 解决方案 > 等级系统 discord.py 的排行榜

问题描述

我试图为我的练级系统制作排行榜,但它不起作用,这是我的代码:

@client.event
async def on_message(message):
    if not message.author.bot:
  
        with open('level.json','r') as f:
            users = json.load(f)
        xp = random.randint(1, 3)
        await update_data(users, message.author,message.guild)
        await add_experience(users, message.author, xp, message.guild)
        await level_up(users, message.author,message.channel, message.guild)

        with open('level.json','w') as f:
            json.dump(users, f, indent=2)
    await client.process_commands(message)

async def update_data(users, user,server):
    if not str(server.id) in users:
        users[str(server.id)] = {}
        if not str(user.id) in users[str(server.id)]:
            users[str(server.id)][str(user.id)] = {}
            users[str(server.id)][str(user.id)]['experience'] = 0
            users[str(server.id)][str(user.id)]['level'] = 1
    elif not str(user.id) in users[str(server.id)]:
            users[str(server.id)][str(user.id)] = {}
            users[str(server.id)][str(user.id)]['experience'] = 0
            users[str(server.id)][str(user.id)]['level'] = 1

async def add_experience(users, user, exp, server):
  users[str(user.guild.id)][str(user.id)]['experience'] += exp

async def level_up(users, user, channel, server):
  experience = users[str(user.guild.id)][str(user.id)]['experience']
  lvl_start = users[str(user.guild.id)][str(user.id)]['level']
  lvl_end = int(experience ** (1/4))
  if str(user.guild.id) != '757383943116030074':
    if lvl_start < lvl_end:
      channel = client.get_channel(841191976053374997)
      await channel.send('{} has leveled up to Level {} in {}!'.format(user.name, lvl_end, user.guild.name))
      users[str(user.guild.id)][str(user.id)]['level'] = lvl_end

@client.command()
@commands.is_owner()
async def restart(ctx):
  await ctx.send("Restarting bot..")
  await client.logout()
  await client.login()
  

@client.command(aliases = ['rank','lvl', 'r'])
async def level(ctx,member: discord.Member = None):
    if ctx.author.id in blacklist:
      return

    if not member:
        user = ctx.message.author
        with open('level.json','r') as f:
            users = json.load(f)
        lvl = users[str(ctx.guild.id)][str(user.id)]['level']
        exp = users[str(ctx.guild.id)][str(user.id)]['experience']

        embed = discord.Embed(title = 'Level {}'.format(lvl), description = f"{exp} XP " ,color = discord.Color.blue())
        embed.set_author(name = ctx.author, icon_url = ctx.author.avatar_url)
        await ctx.send(embed = embed)
    else:
      with open('level.json','r') as f:
          users = json.load(f)
      lvl = users[str(ctx.guild.id)][str(member.id)]['level']
      exp = users[str(ctx.guild.id)][str(member.id)]['experience']
      embed = discord.Embed(title = 'Level {}'.format(lvl), description = f"{exp} XP" ,color = discord.Color.green())
      embed.set_author(name = member, icon_url = member.avatar_url)

      await ctx.send(embed = embed)

那是调平系统,现在这是我试图制作的排行榜,请记住我的 json 文件如下所示:

{
  "739861800769552525": {
    "791583999361155092": {
      "experience": 7,
      "level": 1
    },
    "689461924038967346": {
      "experience": 626,
      "level": 5
    },
    "814226043924643880": {
      "experience": 538,
      "level": 4
    },

下面是我试图制作的“排行榜”。

@client.command()
async def leaderboard(ctx):

    with open('level.json', 'r') as f:
        data = json.load(f)

    top_users = {k: v for k, v in sorted(data.items(), key=lambda item: item[1]["level"], reverse=True)}

    names = ''
    for postion, user in enumerate(top_users):
        names += f"{postion+1} - <@!{user}> is Level: {top_users[user]['level']} Exp: {top_users[user]['xp']}\n"

    embed = discord.Embed(title="Rangliste")
    embed.add_field(name="Spieler", value=names, inline=False)
    await ctx.send(embed=embed)

我试图为它制作一个排行榜,这有点难。我不知道它是否甚至可以是特定于服务器的,但我在这里寻求帮助。

标签: pythondiscorddiscord.py

解决方案


推荐阅读