discord.py Как показать систему пользовательского уровня, включая новых участников - PullRequest
0 голосов
/ 21 июня 2020

Я сделал код для отображения уровня, который отлично работает, за исключением того, что когда новые участники присоединяются, код не работает, потому что он принимает только информацию о том, что уже находится в файле. json. Я хочу сделать так, чтобы при присоединении новых участников тоже появлялся их уровень.

#THE LEVEL SYSTEM ITSELF 
@client.event
async def on_member_join(member):
  with open(r"C:\Users\Frank\Desktop\BOTZS\test.py", 'r') as f:
      users = json.load(f)

  await update_data(users, member)

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

@client.event
async def on_message(message):
  if message.author.bot == False:
      with open('LvlUP.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('LvlUP.json', 'w') as f:
          json.dump(users, f)

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):
  experience = users[f'{user.id}']['experience']
  lvl_start = users[f'{user.id}']['level']
  lvl_end = int(experience ** (1 / 4))
  if lvl_start < lvl_end:
      embed = discord.Embed(title="**LEVEL UP!**",description=f'{user.mention} has leveled up to level {lvl_end}! :fire: 'f'\n Soundwave Superior,{user.mention} Inferior ',color=discord.Color.dark_red())
      embed.set_thumbnail(url=user.avatar_url)
      users[f'{user.id}']['level'] = lvl_end
      await message.channel.send(embed=embed)

#MY CODE
@client.event
async def on_message(message):
   global m
   with open(r"C:\Users\Frank\Desktop\BOTZS\LvlUP.json", 'r') as f:
       m = json.load(f)
   if message.content == "Level":
       embed=discord.Embed(title="**Current Level**", description=(str(m[str(message.author.id)]["level"])),color=discord.Color.dark_red())
       await message.channel.send(embed=embed)


Большое спасибо!

1 Ответ

0 голосов
/ 23 июня 2020

Я заметил, что вы не использовали событие on_member_remove. Это позволит вам удалять пользователей, когда они покидают ваш сервер Discord. Кроме того, я думаю, что ваш код может быть немного легче и понятнее.

Вот способ сделать очень простую систему уровней для вашего бота:

import discord
from discord.ext import commands

from json import dumps, loads
from random import randint

def get_data():
    with open('members.json', 'r') as file:
        return loads(file.read())

def set_data(members):
    with open('members.json', 'w') as file:
        file.write(dumps(members, indent=2))

@client.event
async def on_member_join(member):
    members = self.get_data()
    members.append({'name': member.name, 'id': member.id, 'level': 0,'xp': 0})
    set_data(members)
    
@client.event
async def on_member_remove(self, member):
    members = self.get_data()
    members.remove({'name': member.name, 'id': member.id, 'level': member.level, 'xp': member.xp})
    set_data(members)

@client.event
async def on_message(message):
    members = self.get_data()
    member = members[message.author.id]
    member['xp'] += 5
    if member['xp'] > member['xp']**(1 / 4):
        member['level'] += 1
        await message.channel.send(f"? {message.author.mention} leveled up! He's now level {member['level']}")
        set_data(members)

@commands.command()
async def xp(self, ctx):
    members = self.get_data()
    for member in members:
        if ctx.author.id == member['id']:
            await ctx.send(f"?️ You're level {member['level']} ({member['xp']}/{self.base_xp * (member['level']+1 * self.factor)})")
...