我正在尝试使用侦听器事件来激活使用 discord.py
的 cog 中的函数。相同的代码在主 bot.py 文件中正常运行(删除 self
并使用 @client.event
而不是侦听器)但是在 cog 中使用时,它告诉我 repeater()
函数是在侦听器事件中使用时未定义的变量
import discord
from discord.ext import commands, tasks
class Repeater(commands.Cog):
def __init__(self, client):
self.client = client
@tasks.loop(seconds = 10)
async def repeater(self):
channel = self.client.get_channel(834554679265329172)
await channel.send('test')
@commands.Cog.listener()
async def on_ready(self):
repeater.start()
def setup(client):
client.add_cog(Repeater(client))
编辑:
所以我在评论推荐后更改了代码匹配,并且控制台抛出此错误
@commands.Cog.listener()
async def on_ready(self):
self.repeater()
> discord.ext.commands.errors.ExtensionFailed: Extension 'cogs.repeater'
> raised an error: TypeError: Cog.listener expected str but received
> 'function' instead.
编辑 2:
更改代码以匹配此内容,它将只运行一次循环,但实际上不会循环
@commands.Cog.listener()
async def on_ready(self):
await self.repeater()
答案 0 :(得分:0)
repeater
是类的函数。所以你可以用 self.repeater
调用它。并使用 start 属性启动不和谐任务。 self.repeater.start()
就是答案。
答案 1 :(得分:0)
在课堂上你必须使用 self.
来访问它的方法 self.repeater
和 self.repeater.start()
我在这段代码上测试了它,它对我有用。
import discord
from discord.ext import commands, tasks
import os
import datetime
TOKEN = os.getenv('DISCORD_TOKEN')
CHANNEL = 834554679265329172
class Repeater(commands.Cog):
def __init__(self, client):
self.client = client
@tasks.loop(seconds=10)
async def repeater(self):
#channel = self.client.get_channel(CHANNEL)
await self.channel.send(datetime.datetime.now().strftime("It's %H:%M.%S"))
@commands.Cog.listener()
async def on_ready(self):
self.channel = self.client.get_channel(CHANNEL)
print('starting repeater')
self.repeater.start()
def setup(client):
client.add_cog(Repeater(client))
# --- main ---
client = commands.Bot(command_prefix='!')
setup(client)
print('starting bot')
client.run(TOKEN)