问题描述
我已经制作了一个练级系统,但我不知道在on_message中制作一个冷却我想添加一个 BucketType.member 冷却时间,并且因为我使用 MondoDB 作为数据库,所以我无法存储他们最后一次发送消息的时间,而是我正在寻找 on_message 的冷却时间 的作用类似于命令冷却,因此它可以自动执行任何操作
这是目前的代码
I have made a Leveling system but i can't figure out to make a cooldown in on_message
i want to add a BucketType.member cooldown and as im using MondoDB for database so i can't afford to store the last time they send message instead im looking for a cooldown for on_message which works similar to commands cooldown so it can automatically take any action
This is the code so far
@commands.Cog.listener() async def on_message(self , message): if message.channel.id in talk_channels: stats = leveling.find_one({"id":message.author.id}) if not message.author.bot: if stats is None: new_user = {"id" : message.author.id, "xp" : 0} leveling.insert_one(new_user) else: xp = stats["xp"] + 5 leveling.update_one({"id" : message.author.id}, {"$set" : {"xp" : xp}}) lvl = 0 while True: if xp < ((50*(lvl**2))+(50*lvl)): break lvl += 1 xp -= ((50*((lvl-1)**2))+(50*(lvl-1))) if xp == 0: await message.channel.send(f"Congo you leveled up {message.author.mention} to **level: {lvl}**") for i in range(len(level_role)): if lvl == levelnum[i]: await message.author.add_roles(discord.utils.get(message.author.guild.roles, name=level_role[i])) embed = discord.Embed(title="LEVEL UP", description=f"You have reached a mile stone of {lvl} and has got role **{level_role[i]}**", color=0x00ffff) embed.set_thumbnail(url=message.author.avatar_url) await message.channel.send(embed=embed)
推荐答案
您应该使用 CooldownMapping.from_cooldown 为 on_message 事件添加冷却时间,例如:
You should use CooldownMapping.from_cooldown to add cooldowns to the on_message event, example:
import typing import discord from discord.ext import commands class SomeCog(commands.Cog): def __init__(self, bot): self.bot = bot self._cd = commands.CooldownMapping.from_cooldown(1, 6.0, commands.BucketType.member) # Change accordingly # rate, per, BucketType def get_ratelimit(self, message: discord.Message) -> typing.Optional[int]: """Returns the ratelimit left""" bucket = self._cd.get_bucket(message) return bucket.update_rate_limit() @commands.Cog.listener() async def on_message(self, message): if "check something": # Getting the ratelimit left ratelimit = self.get_ratelimit(message) if ratelimit is None: # The user is not ratelimited, you can add the XP or level up the user here else: # The user is ratelimited