我想问一下如何存储不同服务器的变量,因为我在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”时对其进行更新,但是我不知道该怎么做可以很好地在多台服务器上使用。该机器人主要用于我朋友的服务器,我让该机器人开一些他们想要的笑话,所以我不希望该机器人做更多的事情。
答案 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()
尽管这不能处理代码不能干净退出的情况(例如系统关闭)。