【问题标题】:discord.py rank system leaderboarddiscord.py 排名系统排行榜
【发布时间】:2021-10-07 03:31:54
【问题描述】:

我目前正在尝试为我的 Discord.py 关卡系统制作排行榜,以便您进行!排行榜,然后嵌入位置 1、2、3 等等

Level 和 Exp 存储在一个 Json 中看起来像这样:

{"589898942527963157": {"experience": 25, "level": 2, "LastMessage": 202108011409}, "538477109148909599": {"experience": 0, "level": 0, "LastMessage": 202107312203}}

有没有人知道如何根据最高级别对其进行排序,然后使其进入排名为 1 2 3 等的排行榜。

我的代码现在看起来像这样:

import discord
from discord.ext import commands
import json
from datetime import datetime
import os
import random

os.chdir(r'C:\Users\Anwender\PycharmProjects\Normalo-Bot')


class levels(commands.Cog):

    def __init__(self, client):
        self.client = client

    @commands.Cog.listener()
    async def on_member_join(self, member):
        with open('users.json', 'r')as f:
            users = json.load(f)

        await self.update_data(users, member)

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

    @commands.Cog.listener()
    async def on_message(self, message):
      if not message.author.bot:
        with open('users.json','r')as f:
            users = json.load(f)
        await self.update_data(users, message.author)
        if(users[str(message.author.id)]['LastMessage'] < await self.to_integer(datetime.now())):
            await self.add_experience(users, message.author)
        await self.level_up(users, message.author, message.channel)


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

    async def update_data(self, users, user):
        if not str(user.id) in users:
            users[str(user.id)] = {}
            users[str(user.id)]['experience'] = 0
            users[str(user.id)]['level'] = 0
            users[str(user.id)]['LastMessage'] = await self.to_integer(datetime.now())

    async def add_experience(self, users, user):
        users[str(user.id)]['experience'] += random.randint(15,25)
        users[str(user.id)]['LastMessage'] = await self.to_integer(datetime.now())


    async def level_up(self, users, user,message):
        experience = users[str(user.id)]['experience']
        lvl = users[str(user.id)]['level']
        lvl_end = 5 * (lvl ** 2) + (50 * lvl) + 100
        print(user)
        print(f"Level:{lvl}")
        print(f"experience:{experience}")
        print(f"lvl_end: {lvl_end} ")



        if lvl_end <= experience:
            channel=self.client.get_channel(810855960133894154)
            await channel.send('{} has leveld up to level {}'.format(user.mention, lvl+1))
            users[str(user.id)]['level'] = lvl+1
            users[str(user.id)]['experience'] -= lvl_end



    async def to_integer(self, dt_time):
        answer = 100000000 * dt_time.year + 1000000 * dt_time.month + 10000 * dt_time.day + 100 * dt_time.hour + dt_time.minute
        return int(answer)

    @commands.command()
    async def rank(self,ctx, user: discord.Member = None):
        with open('users.json','r')as f:
            users = json.load(f)

        if user is None:
            if not str(ctx.author.id) in users:
                users[str(ctx.author.id)] = {}
                users[str(ctx.author.id)]['experience'] = 0
                users[str(ctx.author.id)]['level'] = 0
                users[str(ctx.author.id)]['LastMessage'] = await self.to_integer(datetime.now())
            user=ctx.author
            lvl = int(users[str(ctx.author.id)]['level'])
            exp = int(5 * (lvl ** 2) + (50 * lvl) + 100)
            embed = discord.Embed(Title=f"**{user}'s Rang**",Description=f"Experience: {lvl}/{5 * (lvl ** 2) + (50 * lvl) + 100}", color=0x0091ff)
            embed.set_thumbnail(url=f"{user.avatar_url}")
            embed.add_field(name=f"**{user}'s Rang**", value="????  ", inline=False)
            embed.add_field(name="Level", value=f"**{users[str(user.id)]['level']}**", inline=True)
            embed.add_field(name="Experience", value=f"**{str(int(users[str(user.id)]['experience']))} / {exp}**",inline=True)
            embed.set_footer(text="Type more to level up!\nSpam is useless")
            await ctx.send(embed=embed)


        else:
            if not str(user.id) in users:
                users[str(user.id)] = {}
                users[str(user.id)]['experience'] = 0
                users[str(user.id)]['level'] = 0
                users[str(user.id)]['LastMessage'] = await self.to_integer(datetime.now())
            lvl = int(users[str(user.id)]['level'])
            exp=int(5 * (lvl ** 2) + (50 * lvl) + 100)
            embed=discord.Embed(Title=f"**{user}'s Rang**",Description=f"Experience: {lvl}/{5 * (lvl ** 2) + (50 * lvl) + 100}",color=0x0091ff)
            embed.set_thumbnail(url=f"{user.avatar_url}")
            embed.add_field(name=f"**{user}'s Rang**", value="????  ", inline=False)
            embed.add_field(name="Level",value=f"**{users[str(user.id)]['level']}**",inline=True)
            embed.add_field(name="Experience", value=f"**{str(int(users[str(user.id)]['experience']))} / {exp}**", inline=True)
            embed.set_footer(text="Type more to level up!\nSpam is useless")
            await ctx.send(embed=embed)
        with open('users.json', 'w')as f:
            json.dump(users, f)

    @commands.command()
    @commands.has_permissions(administrator=True)
    async def add_exp(self, ctx, user: discord.Member,nummer:int):
        with open('users.json', 'r')as f:
            users = json.load(f)
        if not ctx.author.bot:
            users[str(user.id)]['experience']+=int(nummer)
            await ctx.send("exp added")
        with open('users.json', 'w')as f:
            json.dump(users, f)

    @commands.command()
    async def add_lvl(self, ctx, user: discord.Member,nummer:int):
        with open('users.json', 'r')as f:
            users = json.load(f)
        if not ctx.author.bot:
            users[str(user.id)]['level'] += int(nummer)
            await ctx.send("level added")
        with open('users.json', 'w')as f:
            json.dump(users, f)

    @commands.command()
    async def add_database(self,ctx, user: discord.Member):
        with open('users.json', 'r')as f:
            users = json.load(f)
        if not str(user.id) in users:
            users[str(user.id)] = {}
            users[str(user.id)]['experience'] = 0
            users[str(user.id)]['level'] = 0
            users[str(user.id)]['LastMessage'] = await self.to_integer(datetime.now())
            await ctx.send("added to database!")
        else:
            await ctx.send("already in database!")

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


def setup(client):
    client.add_cog(levels(client))

【问题讨论】:

    标签: python json discord.py


    【解决方案1】:

    如果你想要一个快速的单行,sorted(x.items(), key=lambda n: n[1]['level'], reverse=True) 就是它,这将返回一个包含元组的列表,按 dict 值的“级别”从高到低排序,调用 dict() 将给出你是排序字典

    对代码的一种解释,dict.items() 将返回一个基本上是[(key1, value1), (key2, value2)] 形式的可迭代对象,并且列表的每个元素都被传递给 lambda 函数,该函数接受第二个元素, 外层dict的值,并按它的'level'键排序

    【讨论】:

    • 听起来不错,但我不知道如何实现,你能把代码的一部分发给我,比如我必须把sorted(x.items(), key=lambda n: n[1]['level'], reverse=True)我不擅长编码
    • 好吧,这取决于您自己想办法,您知道您希望代码正常运行,而不是我,既然我们在这里,如果您要动态添加内容,它可能会仅使用剩余的元组列表而不是将其转换为 dict 更有意义,因为它可以更快地添加项目,但这是一些小的改进,我怀疑无论如何都会对您的代码产生太大影响
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2021-09-07
    • 2018-01-31
    • 2021-05-30
    • 2020-08-17
    • 2021-09-21
    • 2023-03-30
    相关资源
    最近更新 更多