在单独的文件列表中找不到用户ID

时间:2019-01-07 21:51:20

标签: python bots discord

这是我要开始工作的python discord机器人。有一个单独的文件,名为users.json,用于保存数据,但是userid,经验和级别没有更新,而是反复添加。

试图在多个点上打印出其ID,它们都显示相同的ID。 从头开始几次,但仍然存在相同的问题。

@client.event
async def on_message(message):
    with open('users.json', 'r') as g:
        users = json.load(g)

    await update_data(users, message.author)
    await add_experience(users, message.author, 5)
    await level_up(users, message.author, message.channel)

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

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

结果在users.json中:

{"162634647XXXXXXXXX": {"experience": 5, "level": 1}}

预期结果:数据(经验,水平)得到更新 实际结果:将相同的数据放入两次

1 个答案:

答案 0 :(得分:0)

在我看来,多个on_message调用正在同时处理,因此JSON被两次写入文件。

如果您对来自同一用户的多条消息有一定的保护(例如,每条消息都有某种确认),那么您可以只锁定打开文件的部分即可逃脱。否则,整个on_message主体将需要位于关键部分,以防止事物进入不一致状态。

另一种可能性是,如果您的密钥不是字符串,则可能会误以为JSON密钥始终是字符串,因此往返JSON不会保留非字符串字典密钥(例如{{ 1}}编码为{42: 'foo'},然后解码为{"42": "foo"})。在这种情况下,仅使用字符串键可能是最容易的,尽管将其转换为字符串以转储为JSON并从JSON加载时解析为int也很合理。