Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用json的discord.py调平系统。如何将这几样东西添加到代码中?_Python_Json_Python 3.x_Discord.py - Fatal编程技术网

Python 使用json的discord.py调平系统。如何将这几样东西添加到代码中?

Python 使用json的discord.py调平系统。如何将这几样东西添加到代码中?,python,json,python-3.x,discord.py,Python,Json,Python 3.x,Discord.py,所以我有一个不和谐水平系统的代码,每次用户在我的机器人所在的服务器上发送消息时,他们都会随机获得5到10之间的xp。代码如下: @bot.event async def on_member_join(member): with open("users.json", "r") as f: users = json.load(f) await update_data(users, member) with open("users.json"

所以我有一个不和谐水平系统的代码,每次用户在我的机器人所在的服务器上发送消息时,他们都会随机获得5到10之间的xp。代码如下:

@bot.event
async def on_member_join(member):
    with open("users.json", "r") as f:
        users = json.load(f)

        await update_data(users, member)

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

@bot.event
async def on_message(message):
    with open("users.json", "r") as f:
        users = json.load(f)

        if message.author.bot:
            return
        else:
            await update_data(users, message.author)
            number = random.randint(5,10)
            await add_experience(users, message.author, number)
            await level_up(users, message.author, message.channel)

        with open("users.json", "w") as f:
            json.dump(users, f)
    await bot.process_commands(message)

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

async def add_experience(users, user, exp):
    users[user.id]["experience"] += exp

async def level_up(users, user, channel):
    experience = users[user.id]["experience"]
    lvl_start = users[user.id]["level"]
    lvl_end = int(experience ** (1/4))

    if lvl_start < lvl_end:
        await bot.send_message(channel, f":tada: Congrats {user.mention}, you levelled up to level {lvl_end}!")
        users[user.id]["level"] = lvl_end
@bot.event
成员加入时的异步定义(成员):
以open(“users.json”、“r”)作为f:
users=json.load(f)
等待更新_数据(用户、成员)
以open(“users.json”,“w”)作为f:
json.dump(用户,f)
@机器人事件
异步def on_消息(消息):
以open(“users.json”、“r”)作为f:
users=json.load(f)
如果message.author.bot:
回来
其他:
等待更新_数据(用户,message.author)
number=random.randint(5,10)
等待添加体验(用户、message.author、号码)
等待级别(用户、message.author、message.channel)
以open(“users.json”,“w”)作为f:
json.dump(用户,f)
等待bot.process_命令(消息)
异步def更新_数据(用户,用户):
如果不是用户中的user.id:
用户[user.id]={}
用户[user.id][“体验”]=0
用户[user.id][“级别”]=1
异步def添加体验(用户、用户、经验):
用户[user.id][“体验”]+=exp
异步def液位(用户、用户、通道):
体验=用户[user.id][“体验”]
lvl_start=users[user.id][“level”]
第二层=内部(经验**(1/4))
如果lvl_开始
这很好,但是我想添加/更改/修改一些东西来改进它。它们列在下面:

a) 我只希望用户每分钟或每30秒从消息中获取一次xp,以防止垃圾邮件升级

b) 我希望它也能将服务器放入json文件中,这样每个用户对每台服务器都有一个唯一的级别,因为目前,他们的xp会在他们和bot共享的所有服务器上运行

c) 目前,如果用户dm是bot,bot也会给用户xp,这显然是我不想要的。如果是机器人,有没有办法阻止用户获取xp?我不能让机器人忽略dm,因为对于某些命令,用户和机器人需要使用它们

任何帮助都将不胜感激。即使你只能回答一个问题,或给出一个想法或意见,那也太好了

谢谢

酋长

编辑:我现在已经回答了我所有的问题,它们在代码中,希望这有帮助(请不要复制我的代码,谢谢):

@bot.event
异步def on_消息(消息):
以open(“users.json”、“r”)作为f:
users=json.load(f)
如果message.author.bot:
回来
如果message.channel.u是私有的:
回来
其他:
等待更新_数据(用户、message.author、message.server)
number=random.randint(5,10)
等待添加体验(用户、message.author、号码、message.server)
等待级别(用户、message.author、message.channel、message.server)
以open(“users.json”,“w”)作为f:
json.dump(用户,f)
等待bot.process_命令(消息)
异步def更新_数据(用户、用户、服务器):
如果用户中没有user.id+“-”+server.id:
用户[user.id+“-”+server.id]={}
用户[user.id+“-”+server.id][“体验”]=0
用户[user.id+“-”+server.id][“level”]=1
用户[user.id+“-”+server.id][“最后一条消息”]=0
异步def添加体验(用户、用户、exp、服务器):
如果time.time()-users[user.id+“-”+server.id][“last_message”]>30:
用户[user.id+“-”+server.id][“体验”]+=exp
用户[user.id+“-”+server.id][“last_message”]=time.time()
其他:
回来
异步def级别(用户、用户、通道、服务器):
体验=用户[user.id+“-”+server.id][“体验”]
lvl_start=users[user.id+“-”+server.id][“level”]
第二层=内部(经验**(1/4))
如果lvl_开始
这是我今天刚做的一个齿轮。它具有您所需要的所有功能

导入不一致
从discord.ext导入命令、任务
导入json
导入操作系统
导入日期时间
从随机导入randint
epoch=datetime.datetime.utcfromtimestamp(0)
time\u diff=round((datetime.datetime.utcnow()-epoch).total\u seconds())
类lvlup(commands.Cog):
定义初始化(自我,客户机):
self.client=client
@commands.Cog.listener()
异步def on_消息(self,ctx):
如果ctx.content.startswith('B')不正确:
如果ctx.guild!=无:
F=打开(“./cogs/level.json”)
level=json.load(F)
user\u time=round((datetime.datetime.utcnow()-epoch).total\u seconds())
如果str(f“{ctx.guild.id}”)不在级别:
级别[f{ctx.guild.id}]={}
打印(f“已为{ctx.Guild.id}/{ctx.Guild.name}创建了帮会文件”)
如果str(f“{ctx.author.id}”)不在级别[f“{ctx.guild.id}]”中:
级别[f{ctx.guild.id}][f{ctx.author.id}]={“级别”:“1”,“xp”:“0”,“NT”:f“0”,“多”:f“1”,“txp”:f“0”,“开始时间”:f“{user_time}”
如果用户_time-int(级别[f{ctx.guild.id}][f{ctx.author.id}][NT]>=60:
RNum=randint(1,5)
MP=int(级别[f”{ctx.guild.id}][f”{ctx.author.id}][“多”])
XP=int(级别[f{ctx.guild.id}][f{ctx.author.id}][“XP”])+(RNum*MP)
TXP=int(级别[f{ctx.guild.id}][f{ctx.author.id}][“TXP]])+(RNum*MP)
LVL=int(级别[f”{ctx.guild.id}][f”{ctx.author.id}][“级别”])
如果XP
@bot.event
async def on_message(message):
    with open("users.json", "r") as f:
        users = json.load(f)

        if message.author.bot:
            return
        if message.channel.is_private:
            return
        else:
            await update_data(users, message.author, message.server)
            number = random.randint(5,10)
            await add_experience(users, message.author, number, message.server)
            await level_up(users, message.author, message.channel, message.server)

        with open("users.json", "w") as f:
            json.dump(users, f)
    await bot.process_commands(message)

async def update_data(users, user, server):
    if not user.id + "-" + server.id in users:
        users[user.id + "-" + server.id] = {}
        users[user.id + "-" + server.id]["experience"] = 0
        users[user.id + "-" + server.id]["level"] = 1
        users[user.id + "-" + server.id]["last_message"] = 0

async def add_experience(users, user, exp, server):
    if time.time() - users[user.id + "-" + server.id]["last_message"] > 30: 
        users[user.id + "-" + server.id]["experience"] += exp
        users[user.id + "-" + server.id]["last_message"] = time.time()
    else:
        return

async def level_up(users, user, channel, server):
    experience = users[user.id + "-" + server.id]["experience"]
    lvl_start = users[user.id + "-" + server.id]["level"]
    lvl_end = int(experience ** (1/4))

    if lvl_start < lvl_end:
        await bot.send_message(channel, f":tada: Congrats {user.mention}, you levelled up to level {lvl_end}!")
        users[user.id + "-" + server.id]["level"] = lvl_end