python - 等级系统 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)
我试图为它制作一个排行榜,这有点难。我不知道它是否甚至可以是特定于服务器的,但我在这里寻求帮助。
解决方案
推荐阅读
- docker - .NET Core docker launchSettings.json 中的参数
- scala - Scala:没有参数的单个抽象方法
- javascript - Dynamically change view column names in Google Charts
- sas - SAS:从csv读取时如何用零填充字符变量
- python - 在 ansible_runner python 库中,是否可以使用 runner 从剧本中检索注册变量?
- angular - Angular 无法读取新对象的未定义属性
- javascript - (Angular 6)子函数是否应该返回它正在操作的对象?
- imagemagick - 如何使用 imagemagick 制作这种效果
- neural-network - 模型 Keras 表现不佳
- python-3.x - tar 目录包含 ._ 文件