【问题标题】:Userid not found in seperate file's list在单独的文件列表中找不到用户 ID
【发布时间】:2019-06-02 14:09:36
【问题描述】:

这是我正在尝试开始工作的 python discord 机器人。有一个名为 users.json 的单独文件保存数据,但用户 ID、体验和级别不会更新而是重复添加。

尝试打印出它在几个点比较的 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}}

预期结果:数据(经验、等级)得到更新 实际结果:相同的数据放入两次

【问题讨论】:

  • 一种旁注:你在 every 消息上加载你的数据库(json)?可能是逻辑问题,使用not in 而不是not x in
  • @TheIncorrigible1 是的,它确实会加载到每条消息上,尝试过not x innot in,两者都不起作用
  • 复制发生在哪里?当您尝试在 JSON 中使用重复键时,您不会收到错误吗?
  • @TheIncorrigible1 它确实给了我一个错误[json] duplicate object key。它像这样复制相同的字符串:{"162634647XXXXXXXXX": {"experience": 5, "level": 1}} 两次,然后由于重复而停止
  • 是否可以同时处理多条消息?

标签: python bots discord


【解决方案1】:

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

如果您对来自同一用户的多条消息有一些保护措施(例如,每条消息都有某种 ack),那么您可能只需锁定打开文件的部分即可。否则,整个on_message 正文将需要处于临界区,以防止事情进入不一致的状态。

另一种可能性是,如果您的键不是字符串,您可能会违反 JSON 键始终是字符串的事实,因此到 JSON 的往返不会保留非字符串字典键(例如 @987654323 @ 编码为{"42": "foo"},解码为{'42': 'foo'})。如果是这种情况,使用字符串键可能是最简单的,尽管转换为字符串以转储为 JSON 并在从 JSON 加载时解析为 int 也是合理的。

【讨论】:

  • 我在封闭的环境中测试,发送消息的延迟很大,看起来它无法比较 user.id 或由于某种原因找不到它
  • @MirroredStance 嗯...user.id 是一个字符串还是别的什么?
  • user.id 实际上是message.author.id 总是会产生一个像"162634647XXXXXXXXX"这样的大数字
猜你喜欢
  • 2017-08-04
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多