有没有办法在on_message事件中包含self,message和ctx?

时间:2020-06-05 05:19:07

标签: python pymongo discord.py

现在,我正在使用齿轮制作表情符号过滤器。要使用on_message事件检查人们是否在向表情符号发送垃圾邮件,我需要在on_message事件中使用self,message和ctx作为args。 (我需要ctx的原因是要检查mongodb中的行会ID,这是即时消息用来存储服务器是否已加入过滤器系统的方法)。我的代码是

    @commands.Cog.listener()
    async def on_message(self, message, ctx):
        existing = collection.find_one({"serverid": ctx.guild.id})
        if not existing:
            return
        else:
            if message.author.bot:
                return
            s = message.content
            s2 = message.content.lower()
            message.content = re.sub("[_~*]", "", message.content)
            message.content = re.sub(r"[\s]+[\s]{2}", "", message.content)
            if emoji_count == 1 and len(without_emojis) < 10:
                current = message.created_at.replace(tzinfo=datetime.timezone.utc).timestamp()
                bucket = self._buckets1.get_bucket(message, current)
                retry_after = bucket.update_rate_limit(current)
                if retry_after:
                    await message.delete()

开始使用过滤器系统的命令运行良好,但是无论我尝试替换它的顺序如何,on_message事件都会引发错误。

这是错误:
Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/client.py", line 312, in _run_event await coro(*args, **kwargs) TypeError: on_message() missing 1 required positional argument: 'ctx'

如果有人知道如何解决该错误,谢谢,谢谢!

1 个答案:

答案 0 :(得分:3)

由于这是一个on_event侦听器,因此没有ctx被传递给您的函数。可以将事件侦听器的参数视为菜单,而不是菜单,您可以在其中订购所需的东西,而更多的人只是可以说出传递给您的一些东西。因此,请保留message参数,因为它是从库内部传递给函数的参数,并删除了ctx参数。

话虽这么说,ctx没什么,只是一种更方便的访问方式,可以通过其他方式找到ctx可以访问的所有内容。当您需要公会ID时,使用消息对象很容易:

guild_id = message.channel.guild.id