@bot.event 在一个 cog discord.py

Posted

技术标签:

【中文标题】@bot.event 在一个 cog discord.py【英文标题】:@bot.event in a cog discord.py 【发布时间】:2018-06-10 20:37:48 【问题描述】:

我想知道是否可以使用@bot.event 在 discord.py 的 cog 中。我试过做

@self.bot.event
async def on_member_join(self, ctx, member):
    channel = discord.utils.get(member.guild.channels, name='general')
    await channel.send("hello")

在我的 cog 类中,但出现错误

NameError: name 'self' is not defined

即使我在 __init __ 中定义了 self.bot。

是否有不同的方式在 cogs 中执行 bot.event,或者它是不可能的?

【问题讨论】:

【参考方案1】:

所以,我想出了一种方法来让它发挥作用。我所做的是创建了一个新函数并将设置函数中的 bot 变量传递给它。然后我创建了新功能的后台任务,并在其中运行了@bot.event。代码是

def xyz(bot):
    @bot.event
    async def on_member_join(member):
        print("ABC")

def setup(bot):
    bot.loop.create_task(xyz(bot))
    bot.add_cog(cogClass(bot))

如果有人不明白我的解释

编辑: 这是一种糟糕的做事方式。改用mental的方式

【讨论】:

【参考方案2】:

我不推荐 qspitzer 回答,因为这不是将事件转移到 cog 的明智方式,而且回答可能会引发一些未知/意外的异常。

改为这样做。

from discord.ext import commands

class Events:
    def __init__(self, bot):
        self.bot = bot

    async def on_ready(self):
        print('Ready!')
        print('Logged in as ---->', self.bot.user)
        print('ID:', self.bot.user.id)

    async def on_message(self, message):
        print(message)

def setup(bot):
    bot.add_cog(Events(bot))

请记住,要将事件放置在 cog 中,您不需要为它使用装饰器。此外,cog 内的事件不会覆盖默认事件,这些事件将存储在 bot.extra_events 中。

【讨论】:

当然,Events 类必须从 commands.Cog 中提取,就像 Patrick Haugh 的回答一样? 这在 v1.0 及更高版本中停止工作。请参阅下面 Patrick Haugh 的回答。【参考方案3】:

要从 new-style cog 注册事件,您必须使用 commands.Cog.listener 装饰器。下面是 mental 转换为新样式的示例:

from discord.ext import commands

class Events(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    @commands.Cog.listener()
    async def on_ready(self):
        print('Ready!')
        print('Logged in as ---->', self.bot.user)
        print('ID:', self.bot.user.id)

    @commands.Cog.listener()
    async def on_message(self, message):
        print(message)

def setup(bot):
    bot.add_cog(Events(bot))

【讨论】:

以上是关于@bot.event 在一个 cog discord.py的主要内容,如果未能解决你的问题,请参考以下文章

on_message() 和@bot.command 问题

加载 cog 时执行函数

geotrellis使用(三十九)COG 写入更新

cogs1958 菜肴制作 拓扑排序

如何在 cog 文件中实现 reset_cooldown?

如何在不和谐中使用命令切换触发 Cog 侦听器