По какой-то причине я получаю сообщение об ошибке при попытке запустить мою команду balance в discord.py при наличии .json-код в моей игре с числами

#python-3.x #discord.py

#python-3.x #discord.py

Вопрос:

Я только начал использовать .json некоторое время назад, чтобы создать экономичного бота, использующего discord.py . В моем коде есть игра в угадывание чисел, которая говорит сама за себя, и когда я играю в игру, все идет хорошо, но когда я пытаюсь проверить свой баланс, я получаю эту ошибку:

 line 59, in numguess
    guess = int(response.content)
ValueError: invalid literal for int() with base 10: 'game.balance'
  

Это мой фактический код:

 @bot.command()
async def numguess(ctx):
    global numguess_earnings

    await open_account(ctx.author)

    user = ctx.author
    users = await get_bank_data()

    #main--------------------
    number = random.randint(0, 100)
    await ctx.send("I am thinking of a number from 1-100. What is it?")

    for i in range(0, 100):
        response = await ctx.bot.wait_for('message')

        guess = int(response.content)

        if guess > number:
            await ctx.send('That guess is too big! Try again!')

        elif guess < number:
            await ctx.send('That guess is too small! Try again!')

        else:
            await ctx.send(f'You got it right! It only took you {i   1} attempts! {100 - (i 1)} coins have been earned!')

            numguess_earnings = 100 - (i   1)
    #endmain-------------------

    users[str(user.id)]["wallet"]  = numguess_earnings

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



#ECONOMY COMMANDS===============================================================================================================================================
#balance-----------------------------------------------------------------------------------------------------------------
@bot.command()
async def balance(ctx):
    await open_account(ctx.author)

    user = ctx.author
    users = await get_bank_data()

    wallet_amt = users[str(user.id)]["wallet"]

    em = discord.Embed(title = f"{ctx.author.name}'s balance", color = discord.Color.red())
    em.add_field(name = "Wallet balance", value = wallet_amt)


    await ctx.send(embed = em)


#helper commands---------------------------------------------------------------------------------------------------------------------------------------
#open account-----------------------------------------------------------------------------
async def open_account(user):

    users = await get_bank_data()

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


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

#get bank data-----------------------------------------------------------------------------
async def get_bank_data():
    with open("main.json", "r") as f:
        users = json.load(f)

    return users
  

Я также хотел бы отметить, что команда работала отлично, когда у меня были разделены обе команды, но как только я начал использовать команды economy в играх с числами, начали возникать ошибки. Спасибо.

Ответ №1:

Бот получил сообщение с содержимым game.balance , которое не может быть преобразовано в целое число. Убедитесь, что вы ввели число.

Более того, используйте проверку, чтобы принимать только сообщения, автором которых является ctx.author, каналом которого является ctx.channel, а содержимое — цифра.

 def check(m):
    return m.author == ctx.author and m.channel == ctx.channel and m.content.isdigit()
response = await ctx.bot.wait_for('message', check=check)
guess = int(response.content)