通过bot命令更新json

2024-04-25 02:30:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个命令(<;MF_add),该命令向成员的json值添加一个点,并且只有管理员可以使用该点。 这是我现在的代码:

@client.command()
@commands.has_permissions(administrator = True)
async def MF_add(ctx, user: discord.Member):
    with open ("MF Points.json", "r") as f:
        users = json.load(f)   
        
        await client.get_user(user_id)
        user = client.get_user(user_id)
        if user in users:
            users["{user.mention}"]["points"] += 1
            await ctx.message.channel.send(f"You have given {member.mention} 1 MF point.")
                
    with open("MF Points.json", "w") as f:
        json.dump(users, f, indent = 4)   

它没有给出任何错误,但也完全没有响应

谢谢你的帮助


2条回答

实际上,您没有在此处生成命令,@commands.has_permissions(administrator = True)不是用来生成新命令的。在它前面需要一个@bot.command(),如:

@bot.command()
@commands.has_guild_permissions(administrator=True)
async def MF_add(ctx, user: discord.Member):
    with open ("MF Points.json", "r") as f:
        users = json.load(f)   
        
        await client.get_user(user_id)
        user = client.get_user(user_id)
        if user in users:
            users["{user.mention}"]["points"] += 1
            await ctx.message.channel.send(f"You have given {member.mention} 1 MF point.")
                
    with open("MF Points.json", "w") as f:
        json.dump(users, f, indent = 4)

这将解决您的问题,我相信,现在谈谈您的程序,因为它根本不会像您期望的那样运行(或者它只会出错):

  • client.get_user(userid)不是异步的,不需要等待
  • 您似乎从未在任何地方定义用户id(因为它是一个变量)
  • 首先,为什么要再次获取用户?您从您的参数中获取用户,对吗
  • ["{user.mention}"]当您看到用户的键只不过是一个字符串时,您需要在它前面添加一个f,以便它在用户中实际查找一个提及值
  • ctx.message.channel.send可以缩短为ctx.send
  • f“您已经给了{member.antify}1 MF点。”您从未定义过成员值

我已经将您的大部分代码重写为我认为应该可以工作的代码:

@bot.command()
@commands.has_guild_permissions(administrator=True)
async def MF_add(ctx, user: discord.Member):
    with open ("MF Points.json", "r") as f:
        users = json.load(f)   
        
    if str(user.id) in users:
        users[str(user.id)] += 1

    else:
        users[str(user.id)] = 1
    
    await ctx.send(f"You have given {user.mention} 1 MF point.")
                
    with open("MF Points.json", "w") as f:
        json.dump(users, f, indent = 4)

请注意,由于不知道您实际想要用这段代码实现什么/您想要引入哪些其他函数,我不太确定这是最好的方法。但你应该能够以此为基础来解决问题

注意:我将键转换为字符串,因为json不喜欢int键,但是如果您使用自定义对象挂钩,您可以使用int键(我让您了解一下,这可能不适用于您的用例)

首先,我建议您使用SQLLite而不是JSON。JSON不是一个数据库。您确实应该避免使用它来存储可能经常更改的用户数据

关于您目前得到的内容,JSON的使用与字典类似。它使用键和值。我高度怀疑if语句if user in users:是否返回true。您应该(使用打印语句)检查if语句是否正常工作

相关问题 更多 >