I have a problem: I can’t send message in a @tasks.loop() function.
When I try to get the channel object with self.client.get_channel(channlid)
, it return me a Nonetype variable.
My code :
import nextcord from nextcord.ext import commands from nextcord.ext import tasks from datetime import date, datetime channlid = 934533675083792465 global channel def setup(client): client.add_cog(Blagues(client)) class Blagues(commands.Cog): def __init__(self, client): self.client = client self.index = 0 self.blaguedujour.start() @tasks.loop(seconds=1) async def blaguedujour(self): channel = self.client.get_channel(channlid) channel.send("a") @commands.command() async def test(self, ctx): await ctx.send("test")
my error:
PS C:Usersbaron_btjit4i> & C:/Users/baron_btjit4i/AppData/Local/Programs/Python/Python39/python.exe c:/Users/baron_btjit4i/Desktop/Autrebot/main.py Unhandled exception in internal background task 'blaguedujour'. Traceback (most recent call last): File "C:Usersbaron_btjit4iAppDataLocalProgramsPythonPython39libsite-packagesnextcordexttasks__init__.py", line 168, in _loop await self.coro(*args, **kwargs) File "c:Usersbaron_btjit4iDesktopAutrebotCogsblagues.py", line 20, in blaguedujour channel.send("a") AttributeError: 'NoneType' object has no attribute 'send'
Can you help me ?
Advertisement
Answer
Problem
You’re calling client.get_channel
before the client is ready. So, the client cannot find the channel you’re looking for, and channel
becomes None
.
This happens because you are starting blaguedujour
in the initialization of your Blagues
class.
Solution
Explanation
Instead of starting the task in __init__
, you should start in when the client is ready, in on_ready
. This can be accomplished by adding a commands.Cog.listener()
in your Blagues
cog.
Code
class Blagues(commands.Cog): def __init__(self, client): self.client = client self.index = 0 @tasks.loop(seconds=1) async def blaguedujour(self): channel = self.client.get_channel(channlid) channel.send("a") @commands.Cog.listener() async def on_ready(): self.blaguedujour.start() @commands.command() async def test(self, ctx): await ctx.send("test")
Aside
channel.send()
is a coroutine: it must be awaited. Use await channel.send("a")
instead.