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