问题描述
我正在尝试为在大约有 50-60 人输入的房间中输入的消息打分.它将第一次将用户添加到 JSON 文件中,但不会为他们键入的消息添加任何分数.我再次对其进行了测试,只有一个用户获得了他们输入的消息的积分,其余的保持不变.代码如下:
I'm trying to give points for messages typed in a room that has around 50-60 people that type in it. It will add the user to the JSON file the first time, but it won't add any more points for the messages they type. I tested it again and only one user was getting points for the messages they typed and the rest remained the same. Here is the code:
@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
推荐答案
我们应该只需要读取一次文件,然后在需要时将修改保存到文件中.我没有注意到任何会导致所描述行为的逻辑错误,因此这可能是关于允许您的机器人查看哪些消息的权限问题.为了便于调试,我简化了您的代码并添加了一些打印来跟踪正在发生的事情.我还在 on_message 中添加了一个守卫,以阻止机器人对其自身做出响应.
We should only need to read the file once, and then just save our modifications to the file when we need to. I didn't notice any logical errors that would lead to the behavior described, so it may be a permissions issue regarding what messages your bot is allowed to see. To facilitate debugging, I've simplified your code and added some prints to track what's going on. I also added a guard in on_message to stop the bot from responding to itself.
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")