So, I'm currently creating a currency for my Discord bot, and I'm trying to make a give command so that users can give the currency to other users. I keep getting a KeyError, yet the user ID is already in the json file. Could someone take a look and see if anything can be done? I've seen so many keyerror problems with solutions yet none of them have been of use.
def addCoins(users, member, amount):
try:
users[member.mention] += amount
except KeyError:
users[member.mention] = amount
with open('user_coins.json', 'w') as f:
json.dump(users, f)
`@bot.command()
async def mycoins(ctx):
user = ctx.author
with open('user_coins.json', 'r') as f:
userCoinDic = json.load(f)
users = userCoinDic.keys()
if user.mention in users:
embcoins = discord.Embed(title=f"Your Coins, {user}", description=f"You have {userCoinDic[user.mention]} coins.", color=0xFF8300, inline=False)
await ctx.send(embed=embcoins)
else:
await ctx.send("You don't seem to have any coins...")
def giveCoins(users, member, amount):
try:
users[member] += int(amount)
except KeyError:
users[member] = int(amount)
@bot.command()
async def give(ctx, amount, userToGive):
user = ctx.author
with open('user_coins.json', 'r') as f:
userCoinDic = json.load(f)
giveCoins(userCoinDic, userToGive, amount)
userCoinDic[user.mention] -= int(amount)
await ctx.send(f"Successfully given {userToGive} {amount} lasagna coins")
with open('user_coins.json', 'w') as f:
json.dump(userCoinDic, f)
The json file:
{"<@800485638583091210>": 130, "<@496433501751607316>": 35, "<@805067781769789482>": 30, "<@266012778358243339>": 5, "<@747549629335339149>": 35, "<@761003497239609354>": 100, "<@!878371788852166697>": 55}
And the error:
Traceback (most recent call last):
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "main.py", line 189, in mycoins
embcoins = discord.Embed(title=f"Your Coins, {user}", description=f"You have {userCoinDic[user.mention]} coins.", color=0xFF8300, inline=False)
KeyError: '<@878371788852166697>'
As i have Noticed in the json file the id that's (the last one) giving and error has a typo in it instead of
"<@!878371788852166697>": 55
it has to be
"<@878371788852166697>": 55
The member.mention
is returning <@878371788852166697>
when in the JSON it is stored as <@!878371788852166697>
, hence the KeyError...
To avoid such errors, do not use mentions as keys as mentions returned can change; it will generally be <@id>
but can sometimes be <@!id>
(which means that user has a display name different to their actual username) so there is inconsistency there. Instead of using mentions as the key, I highly suggest using ids
because Discord IDs can never change, hence becoming more reliable and easier to work with.
You can access the ID of a Member/user Object by using the .id
attribute (eg member.id
).
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.