在一个cog discord.py中的@ bot.event

时间:2017-12-31 00:12:33

标签: python-3.x discord discord.py

我想知道是否可以使用@ 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,还是不可能?

3 个答案:

答案 0 :(得分:5)

我不推荐qspitzers的答案,因为这不是将你的事件转移到一个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中。

答案 1 :(得分:0)

所以,我找到了一种方法让它发挥作用。我做的是我创建了一个新函数并从setup函数传递了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 :(得分:0)

要注册来自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))