@NeW_CodeR
Аферюга

Как сделать чтобы уровень и опыт из Json файла всегда передавался в код, а не только при запуске?

Извиняюсь что не смог придумать лучше название.
Дело в том, что у меня есть такой код:
##### START LEVEL COMMAND #####
 
with open("users.json", "ab+") as ab:
    ab.close()
    f = open('users.json','r+')
    f.readline()
    if os.stat("users.json").st_size == 0:
      f.write("{}")
      f.close()
    else:
      pass
 
with open('users.json', 'r') as f:
  users = json.load(f)
 
@bot.event    
async def on_message(message):
    if message.author.bot == False:
        with open('users.json', 'r') as f:
            users = json.load(f)
        await add_experience(users, message.author)
        await level_up(users, message.author, message)
        with open('users.json', 'w') as f:
            json.dump(users, f)
            await bot.process_commands(message)
 
async def add_experience(users, user):
  if not f'{user.id}' in users:
        users[f'{user.id}'] = {}
        users[f'{user.id}']['experience'] = 0
        users[f'{user.id}']['level'] = 0
  users[f'{user.id}']['experience'] += 6
  print(f"{users[f'{user.id}']['level']}")
 
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:
    await message.channel.send(f':tada: {user.mention} has reached level {lvl_end}. Congrats! :tada:')
    users[f'{user.id}']["level"] = lvl_end
 
@bot.command()
async def rank(ctx, member: discord.Member = None):
  if member == None:
    userlvl = users[f'{ctx.author.id}']['level']
    await ctx.send(f'{ctx.author.mention} You are at level {userlvl}!')
  else:
    userlvl2 = users[f'{member.id}']['level']
    await ctx.send(f'{member.mention} is at level {userlvl2}!')
 
##### END LEVEL COMMAND #####

Но когда я пишу команду "rank", Бот показывает тот уровень (и опыт тоже, если его туда добавить в команду), который был при старте, а не текущий, как сделать чтобы оно обновляло опыт пользователей нормально и всегда показывало уровень и опыт который у пользователя в данный момент?
  • Вопрос задан
  • 30 просмотров
Пригласить эксперта
Ответы на вопрос 1
fenrir1121
@fenrir1121 Куратор тега discord.py
Начни с документации
Потому что он работает с переменной users, которая определяется в самом начале. Любая IDE вам выдаст предупреждение 'Shadows name users from outer scope' на таком коде

Вам нужно считывать данные внутри команды rank, но в целом лучше вообще не городить такой велосипед из костылей. Или разберитесь как пользоваться полноценной БД или используйте готовых ботов с экономикой, на json далеко не уедешь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы