How to create a leveling system with discord.py with python?

17,582

Here is a level sytem code that might help you:

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


async def add_experience(users, user, exp):
    users[f'{user.id}']['experience'] += exp


async def level_up(users, user, message):
    with open('levels.json', 'r') as g:
        levels = json.load(g)
    experience = users[f'{user.id}']['experience']
    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} has leveled up to level {lvl_end}')
        users[f'{user.id}']['level'] = lvl_end

@client.command()
async def level(ctx, member: discord.Member = None):
    if not member:
        id = ctx.message.author.id
        with open('users.json', 'r') as f:
            users = json.load(f)
        lvl = users[str(id)]['level']
        await ctx.send(f'You are at level {lvl}!')
    else:
        id = member.id
        with open('users.json', 'r') as f:
            users = json.load(f)
        lvl = users[str(id)]['level']
        await ctx.send(f'{member} is at level {lvl}!')
Share:
17,582
ProstoChelovek
Author by

ProstoChelovek

Updated on June 27, 2022

Comments

  • ProstoChelovek
    ProstoChelovek about 2 years

    I tried to make a levelling system into my bot but something went wrong. The level rose after each message and not after the specified parameter. How to make it work properly? How to create a leveling system with discord.py?

    Here is my code:

    @client.event
    async def on_message( message ):
        if message.author.bot:
            return
        else:
            member = message.author.name
            msg_len = len(message.content)
            rand_number_1 = randint( 1, 10 )
            exp_first = msg_len * rand_number_1
            coins_first = exp_first // 10
            data_levels_member_first = { 'exp': 0, 'coins': 0, 'level': 0}
            filename = f'./Data/Profiles/Profile{message.author.name}{message.guild}.json'
            try:
                data = load( filename )
            except Exception:
                dump( filename, data_levels_member_first )
                data = load( filename )
            exp_member = data['exp']
            coins_member = data['coins']
            lvl_member = data['level']
            exp = exp_first + exp_member
            coins = coins_first + coins_member
            lvl = exp ** (1/4)
            if lvl_member < lvl:
                lvl_member += 1
                print('You lvl up!')
            data_levels_member = { 'exp': exp, 'coins': coins, 'level': lvl_member}
            dump( filename, data_levels_member )
            await client.process_commands(message)
    
    • TheOneMusic
      TheOneMusic about 4 years
      Can you share your code please?
    • Eric Jin
      Eric Jin about 4 years
      Please edit your question to include your existing code, any tracebacks if needed, and your intended behavior (like how much XP to the next level for example)
  • M-Chen-3
    M-Chen-3 over 3 years
    Please explain what your code does and how it does it. Never post code on its own.
  • Blue Guy
    Blue Guy almost 3 years
    It restricts old members.