
本文介绍了如何在 discord.py 的任务循环中使用 `@tasks.loop()` 提及用户。由于任务循环无法直接传递 `ctx` 或 `message` 参数,我们将通过创建一个继承自 `commands.Cog` 的类,并将 `ctx` 存储在类中,从而在任务循环中访问用户的信息并提及他们。
在使用 discord.py 创建 Discord 机器人时,经常需要使用任务循环(@tasks.loop())来定期执行某些操作。一个常见的需求是在任务循环中提及用户,例如在特定时间间隔提醒用户或发送消息。然而,@tasks.loop() 装饰器修饰的函数无法直接访问 ctx (Context) 或 message 对象,这使得直接提及用户变得困难。本文将介绍一种优雅的解决方案,通过使用 commands.Cog 来解决这个问题。
使用 commands.Cog 来存储上下文
commands.Cog 是 discord.py 中用于组织命令和事件的类。我们可以利用它来存储上下文信息,并在任务循环中使用这些信息。
以下是具体步骤:
-
创建 commands.Cog 类
首先,创建一个继承自 commands.Cog 的类。在这个类中,我们将存储 ctx 对象。
from discord.ext import tasks, commands class MyCogTask(commands.Cog): def __init__(self, ctx: commands.Context): self.ctx = ctx
在 __init__ 方法中,我们将传入的 ctx 对象存储为类的属性 self.ctx。
-
创建任务循环
接下来,在 MyCogTask 类中创建任务循环。在这个循环中,我们可以使用 self.ctx 来访问上下文信息,例如用户的 ID 或频道。
from discord.ext import tasks, commands class MyCogTask(commands.Cog): def __init__(self, ctx: commands.Context): self.ctx = ctx @tasks.loop(seconds=120) async def mention_loop(self): await self.ctx.channel.send(f"{self.ctx.author.mention}, 这是一个提醒!")在这个例子中,我们使用 self.ctx.author.mention 来获取用户的提及字符串,并将其包含在发送的消息中。
-
启动任务循环
最后,我们需要启动任务循环。这通常在一个命令中完成。
@client.command() async def start(ctx: commands.Context): my_cog = MyCogTask(ctx) my_cog.mention_loop.start()
在这个命令中,我们首先创建一个 MyCogTask 类的实例,并将 ctx 对象传递给它。然后,我们调用 my_cog.mention_loop.start() 来启动任务循环。
完整代码示例
from discord.ext import tasks, commands client = commands.Bot(command_prefix="!") # Replace "!" with your desired prefix class MyCogTask(commands.Cog): def __init__(self, ctx: commands.Context): self.ctx = ctx @tasks.loop(seconds=120) async def mention_loop(self): await self.ctx.channel.send(f"{self.ctx.author.mention}, 这是一个提醒!") @client.command() async def start(ctx: commands.Context): my_cog = MyCogTask(ctx) my_cog.mention_loop.start() await ctx.send("任务循环已启动!") @client.event async def on_ready(): print(f"机器人已登录为 {client.user}") client.run("YOUR_BOT_TOKEN") # Replace "YOUR_BOT_TOKEN" with your bot token
注意事项
- 确保你的机器人具有发送消息的权限。
- seconds 参数指定任务循环的执行间隔,单位为秒。
- 可以根据实际需求修改任务循环中的逻辑。
- 使用 commands.Cog 可以更好地组织你的代码,并使其更易于维护。
总结
通过使用 commands.Cog,我们可以轻松地在 discord.py 的任务循环中提及用户。这种方法不仅解决了无法直接访问 ctx 对象的问题,还提高了代码的可读性和可维护性。希望本文能够帮助你更好地使用 discord.py 创建 Discord 机器人。


