使用侦听器事件使用 discord.py

时间:2021-04-22 00:32:29

标签: python discord.py

我正在尝试使用侦听器事件来激活使用 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()

2 个答案:

答案 0 :(得分:0)

repeater 是类的函数。所以你可以用 self.repeater 调用它。并使用 start 属性启动不和谐任务。 self.repeater.start() 就是答案。

答案 1 :(得分:0)

在课堂上你必须使用 self. 来访问它的方法 self.repeaterself.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)