根据 JSON 中的数据赋予角色

时间:2021-02-22 13:22:04

标签: python discord.py

所以我的问题是。我的不和谐(自编码)上有一个排名/排行榜机器人。现在我想补充一点,排名 1 的人应该获得一个 排名 1 的角色。我已经创建了这个角色并拥有了 ID,但是现在我不知道如何让我的机器人看到他拥有最多的 xp 给他这个角色,当他失去速度时再接再厉。希望你明白我的意思。 (无论如何我可以使用我的calculate_rank?

我的代码

@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}']['xp'] = 0
        users[f'{user.id}']['level'] = 1
        users[f'{user.id}']["last_message"] = 0
        users[f'{user.id}']["name"] = user.name

def calculate_rank(user_xp: int, data: dict=None) -> int:
    if data is None:
        with open("users.json", "r") as f:
            data = json.load(f)

    xp = [value["xp"] for value in data.values()]
    xp.append(user_xp)
    xp.sort(reverse=True)
    return xp.index(user_xp) + 1


async def add_experience(users, user, exp):
    if time.time() - users[f'{user.id}']["last_message"] > 20:
        users[f'{user.id}']['xp'] += random.randint(1, 10)
        users[f'{user.id}']["last_message"] = time.time()
    else:
        return

async def level_up(users, user, message):
    with open('users.json', 'r') as g:
        levels = json.load(g)
    experience = users[f'{user.id}']['xp']
    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} ist gerade auf Level {lvl_end} gestiegen!')
        users[f'{user.id}']['level'] = lvl_end

@client.command()
async def rank(ctx, *, member:discord.Member=None):
    await ctx.channel.purge(limit=1)
    if member == None:
        memberID = ctx.author.id
        mentioned = ctx.author.name
    else:
        memberID = member.id
        mentioned = member.name
    with open('users.json', 'r') as f:
        users = json.load(f)
    xp = users[str(memberID)]['xp']
    lvl = users[str(memberID)]['level']
    rank = calculate_rank(xp)


    embed = discord.Embed(title='')
    embed.add_field(name="Spieler", value=mentioned, inline=True)
    embed.add_field(name="Level:", value=lvl, inline=True)
    embed.add_field(name="Experience:", value=xp, inline=True)
    embed.add_field(name="Rank:", value=rank, inline=True)
    await ctx.send(embed=embed)

@client.command()
async def levels(ctx):
    await ctx.channel.purge(limit=1)
    with open('users.json', 'r') as f:
        data = json.load(f)

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

    names = ''
    for position, user in enumerate(top_spieler):
        names += f"{position+1} - <@!{user}> mit Level: {top_spieler[user]['level']} Exp: {top_spieler[user]['xp']}\n"
        embed = discord.Embed(title='')
        embed.add_field(name="Spieler", value=names, inline=False)
        if position+1 > 19:
            break
    await ctx.send(embed=embed)

1 个答案:

答案 0 :(得分:0)

考虑到前 1 名是拥有最多经验的 1 名成员,您每次使用 add_experience 时都应检查您添加经验的 user 是否比当前前 1 名多。如果您认为前 1 名是最高级别的人(因此是第一个达到该级别的人),您应该在每次 level_up 用户时检查他现在拥有的级别是否大于最高级别所有其他用户的级别。

如果您提供有关您的级别/用户结构如何的更多详细信息,我可以提供更多详细信息

相关问题