Обновление файла json через модуль python json не работает с помощью команды discord

#python #discord.py-rewrite

#python #discord.py

Вопрос:

У меня есть бот discord, закодированный на python. Я хочу иметь возможность сохранять пользовательские данные в файле JSON, но по какой-то причине этот код, который я написал, не работает. Вот код, который вызывает у меня проблемы.

 @client.command()
async def slash(ctx):

amount = random.randint(1,10)

with open("data.json", "r") as f:
    users = json.load(f)

await userupdateslash(users, ctx.author, amount)

with open("data.json", "w") as f:
    json.dump(users, f, indent=4)

f.close()

embed = discord.Embed(
        title = "Slash!",
        description = (f"{ctx.author} slashed through a stormtrooper and gained {amount}xp"),
        colour = discord.Colour.green()
)

embed.set_footer(text='Created by [VG] Xezo#6969')
embed.set_thumbnail(url='https://cdn.discordapp.com/app-icons/760648752435822613/c1d0d4451e8e3123373709d31b0bffba.png?size=128')
embed.set_author(name='Baby Yoda',
icon_url='https://cdn.discordapp.com/app-icons/760648752435822613/c1d0d4451e8e3123373709d31b0bffba.png?size=128')

await ctx.send(embed=embed)

async def userupdateslash(users, user, xp):
    if user.id in users:
        try:
            users[user.id]["xp"]  = xp
        except Exception as error:
            raise(error)
  

Комментарии:

1. Что значит «это не работает»? Не могли бы вы исправить отступ вашего блока кода для меня?

Ответ №1:

Я получил рабочий код, я реализовал on_message событие, если у пользователя уже есть слот (xp) для data.json.

 @client.event
async def on_message(message):
    if message.author.bot == False:
        with open('data.json', 'r') as f:
            users = json.load(f)

        await update_data_slash(users, message.author)
        await update_slash(users, message.author, 0)
        with open('data.json', 'w') as f:
            json.dump(users, f, sort_keys=True, ensure_ascii=False, indent=4)

    await client.process_commands(message)

async def update_data_slash(users, user):
    if not f'{user.id}' in users:
        users[f'{user.id}'] = {}
        users[f'{user.id}']['xp'] = 0

async def update_slash(users, user, xp):
    users[f'{user.id}']['xp']  = xp

@client.command()
async def slash(ctx):
    amount = random.randint(1, 10)

    with open('data.json', 'r') as f:
        users = json.load(f)

    users[f'{ctx.author.id}']['xp']  = amount

    with open('data.json', 'w') as f:
        json.dump(users, f, sort_keys=True, ensure_ascii=False, indent=4)

    embed = discord.Embed(
        title = "Slash!",
        description = (f"{ctx.author} slashed through a stormtrooper and gained {amount}xp"),
        colour = discord.Colour.green()
        
        ).set_footer(
        text='Created by [VG] Xezo#6969'
        
        ).set_thumbnail(
        url='https://cdn.discordapp.com/app-icons/760648752435822613/c1d0d4451e8e3123373709d31b0bffba.png?size=128'

        ).set_author(
        name='Baby Yoda',
        icon_url='https://cdn.discordapp.com/app-icons/760648752435822613/c1d0d4451e8e3123373709d31b0bffba.png?size=128'
        )

    await ctx.send(ctx.author.mention, embed=embed)
  

Я также улучшил пару вещей, например: он сортирует идентификатор пользователя и exp, и я изменил формат встраивания, и он будет упоминать пользователя с помощью встраивания (не во встраивании, а как бы поверх него)