I was wondering if it is possible to use @bot.event in a cog for discord.py. I have tried doing
@self.bot.event
async def on_member_join(self, ctx, member):
channel = discord.utils.get(member.guild.channels, name='general')
await channel.send("hello")
in my cog class, but I get the error
NameError: name 'self' is not defined
even though I define self.bot in my __init __.
Is there a different way of doing bot.event in cogs, or is it just not possible?
According to the maintainer, Discord has told that the bots will continue to work fine even after April 2022.
To register an event from a new-style cog, you must use the commands.Cog.listener
decorator. Below is mental's example converted to the new style:
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))
I do not reccomend qspitzers answer since this is not a sensible way of moving your events to a cog and the answer may throw some unknown/unexpected exceptions.
Instead do something like this.
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))
Keep in mind that to place an event inside a cog you do not need a decorator for it. Also the events inside the cog do not overide the default events and these events will be stored in bot.extra_events
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With