体验(XP)不适用于所有用户JSON Discord.PY

时间:2018-08-20 00:45:55

标签: python python-3.x discord discord.py

我正在尝试为在大约50至60个人输入的房间中输入的邮件提供积分。它将第一次将用户添加到JSON文件中,但不会为他们键入的消息添加更多点。我再次对其进行了测试,只有一个用户从他们键入的消息中获得积分,其余用户保持不变。这是代码:

 @client.event
async def on_message(message):

    if message.content.lower().startswith('!points'):
        await client.send_message(message.channel, "You have {} points!".format(get_points(message.author.id)))

    user_add_points(message.author.id,1)

def user_add_points(user_id: int, points: int):
    if os.path.isfile("users.json"):
        try: 
            with open('users.json', 'r') as fp:
                users = json.load(fp)
            users[user_id]['points'] += points
            with open('users.json', 'w') as fp:
                json.dump(users, fp, sort_keys=True, indent=4)
        except KeyError:
            with open('users.json', 'r') as fp:
                users = json.load(fp)
            users[user_id] = {}
            users[user_id]['points'] = points
            with open('users.json', 'w') as fp:
                json.dump(users, fp, sort_keys=True, indent = 4)
    else:
        users = {user_id:{}}
        users[user_id]['points'] = points
        with open('users.json', 'w') as fp:
            json.dump(users, fp, sort_keys=True, indent=4)

def get_points(user_id: int):
    if os.path.isfile('users.json'):
        with open('users.json', 'r') as fp:
            users = json.load(fp)
        return users[user_id]['points']
    else:
        return 0

1 个答案:

答案 0 :(得分:1)

我们只需要读取一次文件,然后在需要时将修改保存到文件中。我没有注意到会导致上述行为的任何逻辑错误,因此这可能是关于允许您的漫游器查看哪些消息的权限问题。为了方便调试,我简化了代码,并添加了一些打印信息以跟踪发生的情况。我还在on_message中添加了一个防护措施,以阻止该机器人对其自身做出响应。

import json
import discord

client = discord.Client()

try:
    with open("users.json") as fp:
        users = json.load(fp)
except Exception:
    users = {}

def save_users():
    with open("users.json", "w+") as fp:
        json.dump(users, fp, sort_keys=True, indent=4)

def add_points(user: discord.User, points: int):
    id = user.id
    if id not in users:
        users[id] = {}
    users[id]["points"] = users[id].get("points", 0) + points
    print("{} now has {} points".format(user.name, users[id]["points"]))
    save_users()

def get_points(user: discord.User):
    id = user.id
    if id in users:
        return users[id].get("points", 0)
    return 0

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    print("{} sent a message".format(message.author.name))
    if message.content.lower().startswith("!points"):
        msg = "You have {} points!".format(get_points(message.author))
        await client.send_message(message.channel, msg)
    add_points(message.author, 1)

client.run("token")