【问题标题】:Discord.py rank commandDiscord.py 排名命令
【发布时间】:2020-09-11 17:10:12
【问题描述】:
{
    "341522422836625408-679072765583556720": {
        "experience": 111157,
        "level": 34,
        "last_message": 1590382008.6055543
    },
    "692075200690520184-679072765583556720": {
        "experience": 51,
        "level": 3,
        "last_message": 1590373878.9466648
    },
    "465887722721116162-679072765583556720": {
        "experience": 34,
        "level": 2,
        "last_message": 1590380700.2158434
    },
    "477106559676317717-679072765583556720": {
        "experience": 350,
        "level": 5,
        "last_message": 1590331947.6997736
    },
    "377116068994482176-679072765583556720": {
        "experience": 20,
        "level": 2,
        "last_message": 1590329384.397424
    },
}

以上是我将用于创建命令的输入数据,其中显示了对服务器最有经验的前 3 名用户。我已经制作了一个命令,让用户 exp 进行打字。现在,代码是:

@client.command()
async def leaderboard(ctx):
    with open('users.json', 'r') as f:
        user = json.load(f)
    guild = str(ctx.guild.id)
    users = str(ctx.author.id)
    order = {k: v for k, v in sorted(user.items(), key = lambda x: x[1]['experience'], reverse=True)}
    await ctx.send(order[str(users + "-" + guild): "experience"])

当前输出为

('', {'experience': experience_count, 'level': level_count, 'last_message': last_message_id})

user.id、guild.id、experience_count、level_count 和 last_message_id 是不同的数字。

如果有人可以帮助我执行命令,那就太好了!我是 python 的初学者,所以代码可能有点混乱或愚蠢。有什么问题可以问我!

【问题讨论】:

  • “user.id、guild.id、experience_count 等”不同的数字是什么意思,还要加上预期的输出
  • 例如,('524434170764722178-679072765583556720', {'experience': 343, 'level': 5, 'last_message': 1590381887.0841906})
  • 添加预期输出
  • 我改了sorted(list(users.items()), key=lambda x: x[1]["experience"], reverse=True)后,错误日志显示有keyerror对于 ctx.send:1
  • 试试这个sorted(user.items(), key = lambda x: x[1]['experience'], reverse=True)。无需将user.items() 转换为列表。

标签: python command discord discord.py


【解决方案1】:

试试这个。


data = {
    "341522422836625408": {
        "experience": 111157,
        "level": 34,
        "last_message": 1590382008.6055543
    },
    "692075200690520184": {
        "experience": 51,
        "level": 3,
        "last_message": 1590373878.9466648
    },
    "465887722721116162": {
        "experience": 34,
        "level": 2,
        "last_message": 1590380700.2158434
    },
    "477106559676317717": {
        "experience": 350,
        "level": 5,
        "last_message": 1590331947.6997736
    },
    "377116068994482176": {
        "experience": 20,
        "level": 2,
        "last_message": 1590329384.397424
    },
}


class ExperienceCount:

    def __init__(self, user, experience):
        self.user = user
        self.experience = experience

    def __repr__(self):
        return f'<@{self.user}> has {self.experience} experience'


def get_top_experience(data):
    users = []
    for k, v in data.items():
        users.append(ExperienceCount(k, v['experience']))
    return sorted(users, key=lambda x: x.experience, reverse=True)

a = get_top_experience(data)

&lt;@USER_ID&gt;@提及用户)

您可以将其合并到命令中。

@client.command
async def leaderboard(ctx):
    leaderboard = get_top_experience(data)
    embed = discord.Embed(title='Top Experience', description='Top experience all time including others not in this server', color=0xff5555)
    embed.add_field(name='**1st Place**', value=leaderboard[0], inline=False)
    embed.add_field(name='**2nd Place**', value=leaderboard[1], inline=False)
    embed.add_field(name='**3rd Place**', value=leaderboard[2], inline=False)
    await ctx.send(embed=embed)

如果您只想在调用该命令的服务器中体验:

@client.command
async def leaderboard(ctx):
    leaderboard1 = get_top_experience(data)
    leaderboard = leaderboard1.copy()
    for i, user in enumerate(leaderboard1):
        if ctx.guild.get_member(user.user) is None:
            del leaderboard[i]
    embed = discord.Embed(title='Top Experience', description='Top experience all time in this server', color=0xff5555)
    embed.add_field(name='**1st Place**', value=leaderboard[0], inline=False)
    embed.add_field(name='**2nd Place**', value=leaderboard[1], inline=False)
    embed.add_field(name='**3rd Place**', value=leaderboard[2], inline=False)
    await ctx.send(embed=embed)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 2021-04-20
    • 2021-03-26
    • 2021-07-03
    • 2021-08-28
    • 2021-01-22
    • 2021-03-30
    • 2021-05-17
    相关资源
    最近更新 更多