我想知道如何在 discord.py 重写中制作排行榜 cmd

时间:2021-06-24 13:59:13

标签: python discord.py

嗨,我想知道如何在 discord.py 重写中制作排行榜 cmd 我有一个完全可用的 lvling 系统,但我想知道如何显示最高 lvl 的前十名 ppl。我试过了,但是当我输入 -leaderboard ok 时什么也没有出现,所以我需要输入更多内容来上传这个所以只是忽略我现在正在输入的内容该死的我需要写得更多,这是否足够令人愉快

async def leaderboard(ctx):

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

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

    names = ''
    for postion, user in enumerate(top_users):
        # add 1 to postion to make the index start from 1
        names += f'{postion+1} - <@!{user}> with {top_users[user]}\n'

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

在我的 users.json 文件夹中,它的用户 ID 然后是 xp,然后是 lvl。

这是我的主文件的代码

@client.event
async def on_member_join(member):
    with open('users.json', 'r') as f:
        users = json.load(f)

    await update_data(users, member)

    with open('users.json', 'w') as f:
        json.dump(users, f)


@client.event
async def on_message(message):
    if message.author.bot == False:
        with open('users.json', 'r') as f:
            users = json.load(f)

        await update_data(users, message.author)
        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)


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


async def add_experience(users, user, exp):
    users[f'{user.id}']['experience'] += exp


async def level_up(users, user, message):
    with open('levels.json', 'r') as g:
        levels = json.load(g)
    experience = users[f'{user.id}']['experience']
    lvl_start = users[f'{user.id}']['level']
    lvl_end = int(experience ** (1 / 4))
    if lvl_start < lvl_end:
        await message.channel.send(f'{user.mention} has leveled up to level {lvl_end}')
        users[f'{user.id}']['level'] = lvl_end

@client.command()
async def level(ctx, member: discord.Member = None):
    if not member:
        id = ctx.message.author.id
        with open('users.json', 'r') as f:
            users = json.load(f)
        lvl = users[str(id)]['level']
        await ctx.send(f'You are at level {lvl}!')
    else:
        id = member.id
        with open('users.json', 'r') as f:
            users = json.load(f)
        lvl = users[str(id)]['level']
        await ctx.send(f'{member} is at level {lvl}!')
  

1 个答案:

答案 0 :(得分:1)

请记住,discord.py 中的命令应使用 the command decorator 来指定该函数旨在作为命令进行处理。

因此,在您的主文件中,请添加:

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

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

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

    names = ''
    for postion, user in enumerate(top_users):
        # add 1 to postion to make the index start from 1
        names += f'{postion+1} - <@!{user}> with {top_users[user]}\n'

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

此处添加了 client.command() 装饰器。