user.id это ведь число изначально? Число не является правильным ключом при json.dump()
Изначально в коде словарь выглядит так:
{293396418834464768: {"experience": 5, "level": 1}}
После дампа, он запишется в файл как
{"293396418834464768": {"experience": 5, "level": 1}}
Соответственно, если прочитать такой файл и закинуть в
async def update_data(users, user):
if not user.id in users:
users[user.id] = {}
users[user.id]['experience'] = 0
users[user.id]['level'] = 1
То он создат новый объект (ибо после прочтения ключ меняется в строку "293396418834464768", а проверяется числовой 293396418834464768)
Наглядно видно тут:
import json
data = {1: 'value'}
with open('test', 'w') as f:
json.dump(data, f)
print(data)
with open('test', 'r') as f:
data = json.load(f)
print(data)
Вывод:
{1: 'value'}
{'1': 'value'}
ps: код не читал полностью, может в другом ошибка, на быструю руку написал