python - 如何保存命令冷却时间?
问题描述
下面的代码为命令添加了冷却时间,但是当机器人重新启动时,冷却时间会重置。那么我怎样才能让机器人记住以前的用法呢?如果冷却时间限制是每天 5 次,并且如果成员使用了 3 次,并且如果机器人重新启动,它应该从所有成员的位置开始。
import discord
from discord.ext import commands
import random
from utils import Bot
from utils import CommandWithCooldown
class Members():
def __init__(self, bot):
self.bot = bot
@commands.command(pass_context=True, cls=CommandWithCooldown)
@commands.cooldown(1, 600, commands.BucketType.user)
async def ping(self, ctx):
msg = "Pong {0.author.mention}".format(ctx.message)
await self.bot.say(msg)
def setup(bot):
bot.add_cog(Members(bot))
解决方案
与 Patrick Haugh 建议的类似,冷却映射存储在Command._buckets
. 您可以在机器人启动之前腌制存储桶,并在机器人完成后保存。为方便起见,请将 Bot 类替换为以下内容(也称为“moneypatching”):
token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
prefix = "?"
cooldown_info_path = "cd.pkl"
from discord.ext import commands
class Bot(commands.Bot):
async def start(self, *args, **kwargs):
import os, pickle
if os.path.exists(cooldown_info_path): # on the initial run where "cd.pkl" file hadn't been created yet
with open(cooldown_info_path, 'rb') as f:
d = pickle.load(f)
for name, func in self.commands.items():
if name in d: # if the Command name has a CooldownMapping stored in file, override _bucket
self.commands[name]._buckets = d[name]
return await super().start(*args, **kwargs)
async def logout(self):
import pickle
with open(cooldown_info_path, 'wb') as f:
# dumps a dict of command name to CooldownMapping mapping
pickle.dump({name: func._buckets for name, func in self.commands.items()}, f)
return await super().logout()
bot = Bot(prefix)
# everything else as usual
@bot.event
async def on_ready():
print('Logged in as')
print(bot.user.name)
print(bot.user.id)
print('------')
@bot.command(pass_context=True)
@commands.cooldown(1, 3600, commands.BucketType.user)
async def hello(ctx):
msg = "Hello... {0.author.mention}".format(ctx.message)
await bot.say(msg)
class ACog:
def __init__(self, bot):
self.bot = bot
@commands.command(pass_context=True)
@commands.cooldown(1, 600, commands.BucketType.user)
async def ping(self, ctx):
msg = "Pong {0.author.mention}".format(ctx.message)
await self.bot.say(msg)
bot.add_cog(ACog(bot))
bot.run(token)
当机器人正确注销时,这会将冷却数据保存到“cd.pkl”。
推荐阅读
- google-chrome - Twitter 时间线未显示在 Google Chrome 中
- android - 使用 android:fitsSystemWindows 将快餐栏放在键盘上
- reactjs - 我们什么时候使用 import react
- c++ - Eigen:: 将稀疏矩阵转换为行顺序或列顺序
- c# - 将具有日期时间的字符串转换为日期时间
- cmake - 如何创建需要用户启用语言的目标?
- java - 为什么 array.sorts 对父数组进行排序?
- javascript - 如何同步调用异步 JavaScript 函数?
- ssh - CP 脚本混淆文件名
- asp.net-core - .NET CORE 2.0 尝试激活时无法解析服务类型