现在,我正在使用齿轮制作表情符号过滤器。要使用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'
如果有人知道如何解决该错误,谢谢,谢谢!
答案 0 :(得分:3)
由于这是一个on_event
侦听器,因此没有ctx
被传递给您的函数。可以将事件侦听器的参数视为菜单,而不是菜单,您可以在其中订购所需的东西,而更多的人只是可以说出传递给您的一些东西。因此,请保留message
参数,因为它是从库内部传递给函数的参数,并删除了ctx
参数。
话虽这么说,ctx
没什么,只是一种更方便的访问方式,可以通过其他方式找到ctx
可以访问的所有内容。当您需要公会ID时,使用消息对象很容易:
guild_id = message.channel.guild.id