2 votes

Comment ajouter des rangs au système de nivellement par expérience à un bot discord.py?

Comment ajouter des niveaux à un système de niveau d'expérience pour un bot discord.py. Voici le code que j'ai utilisé, toute aide serait appréciée

import discord
from discord.ext import commands
from discord.utils import get
import json
client = commands.Bot(command_prefix="!")

@client.event
async def on_message(message):
    if not message.author.bot:
        await open_account_level(message.author)
        users = await get_level_data()

        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)

#commande pour vérifier les détails de votre niveau
@client.command()
async def level(ctx):
    await open_account_level(ctx.author)

    users = await get_level_data()

    user = ctx.author

    exp_level = users[str(user.id)]["Exp"]
    bank_amt = users[str(user.id)]["Exp Level"]

    em = discord.Embed(title=f"{ctx.author.name}'s balance", color=discord.Color.red())
    em.add_field(name="Exp", value=exp_level)
    em.add_field(name="Exp Level", value=bank_amt)
    await ctx.send(embed=em)

#ajoute de l'expérience à votre compte
async def add_experience(users, user, exp):
    users[f'{user.id}']['Exp'] += exp

#vous fait monter de niveau après une limite d'expérience
async def level_up(users, user, message):
    with open('users.json', 'r') as g:
        levels = json.load(g)
    experience = users[f'{user.id}']['Exp']
    lvl_start = users[f'{user.id}']['Exp Level']
    lvl_end = int(experience ** (1 / 4))
    if lvl_start < lvl_end:
        await message.channel.send(f'{user.mention} a monté de niveau vers le niveau {lvl_end}')
        users[f'{user.id}']['Exp Level'] = lvl_end

#crée un compte pour vous dans un fichier json
async def open_account_level(user):
    users = await get_level_data()
    if str(user.id) in users:
        return False
    else:
        users[str(user.id)] = {}
        users[str(user.id)]["Exp"] = 0
        users[str(user.id)]["Exp Level"] = 0

    with open("users.json", "w") as f:
        json.dump(users, f)
    return True

async def get_level_data():
    with open("users.json", "r") as f:
        users = json.load(f)
    return users
TOKEN = 'token'
client.run(TOKEN)

Je veux les rangs de sorte qu'il montre qui a le plus haut niveau d'expérience et renvoie leur rang parmi les autres dans le serveur N'hésitez pas à signaler toute erreur dans mon code, toute aide serait appréciée.

1voto

StarbuckBarista Points 917

C'est vraiment simple d'indexer une base de données construite en JSON et de simplement trier les données. Dans mon exemple, j'utilise une classe pour accéder facilement à l'expérience de chaque utilisateur.

import discord
import json

@client.command()
async def level(ctx):
    await open_account_level(ctx.author)

    users = await get_level_data()

    class PositionClassement:
        def __init__(self, id, exp):
            self.id = id
            self.exp = exp

    classement = []

    for user in users:
        classement.append(PositionClassement(user, users[user]["exp"]))

    top = sorted(classement, key=lambda x: x.exp, reverse=True)

    for user in top:
        if user.id == str(ctx.author.id):
            classement = top.index(user) + 1

    exp_level = users[str(ctx.author.id)]["exp"]
    bank_amt = users[str(ctx.author.id)]["exp_level"]

    embed = discord.Embed(title=f"{ctx.author.name}'s Balance", 
                          color=discord.Color.red())

    embed.add_field(name="EXP", value=exp_level, inline=True)
    embed.add_field(name="Niveau d'expérience", value=bank_amt, inline=True)
    embed.add_field(name="Classement", value=classement, inline=True)

    await ctx.send(embed=embed)

async def open_account_level(user):
    users = await get_level_data()

    if str(user.id) in users:
        return False
    else:
        users[str(user.id)] = {}
        users[str(user.id)]["exp"] = 0
        users[str(user.id)]["exp_level"] = 0

    with open("users.json", "w") as file:
        json.dump(users, file)

    return True

async def get_level_data():
    with open("users.json", "r") as file:
        return json.load(file)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X