需要帮助,使用discord.py为不同的服务器存储数据

时间:2019-04-12 22:48:18

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

我想问一下如何存储不同服务器的变量,因为我在message命令中有一个“ F”,该命令将F存储在json中,这样我就可以跟踪在不同服务器上被调用了多少次。我还想知道每当机器人关闭时如何将其转储到json中,因为现在转储的唯一方法是运行命令aut.disconnect。

filename = "respectspaid.json"
respects = 0
with open(filename) as f_obj:
    respects = json.load(f_obj)

@bot.event
async def on_message(message):
    print(f"{message.channel}: {message.author}: {message.author.name}: {message.content}")
    cajo_guild = bot.get_guild(ID)

    if message.author == client.user:
        return

    if message.author.bot:
        return

    if "aut.membercount" == message.content.lower():
        await message.channel.send(f"```py\n{cajo_guild.member_count}```")

    elif "F" == message.content:
        global respects
        respects += 1
        await message.channel.send(f"```Respects paid: {respects}```")

    elif "aut.disconnect" == message.content.lower():
        with open(filename, 'w') as f_obj:
            json.dump(respects, f_obj)
        print("Dumping and closing client...")
        await bot.close()
        sys.exit()

    await bot.process_commands(message)

当我断开机器人连接时(当我关闭PC时),我将转储更新的F计数,并在运行程序时加载它,并在每次发送“ F”时对其进行更新,但是我不知道该怎么做可以很好地在多台服务器上使用。该机器人主要用于我朋友的服务器,我让该机器人开一些他们想要的笑话,所以我不希望该机器人做更多的事情。

1 个答案:

答案 0 :(得分:0)

如果您希望每台服务器具有不同的计数,则需要将统计信息保存在dict json文件中

因此,您不用respects += 1,而要做respects[str(guild.id)] += 1。由于dict是不可变的,因此不需要全局语句也可以带来额外的好处。对公会ID进行字符串化的原因是,尽管python dict键可以是整数,而json对象键只能是字符串。

要回答其他问题,您有两种选择。最简单的方法是在每次调用后保存:

def save_respect():
    with open(fp, "w") as fh:
        json.dump(respects, fp, indent=4)
...
if message.content.lower() == "f":
    respects[str(message.guild.id)] += 1
    save_respects()

替代方法是有一个断开处理程序

try:
    bot.run()
except BaseException:  # Catches keyboard interrupt
    pass
finally:
    save_respects()

尽管这不能处理代码不能干净退出的情况(例如系统关闭)。