在discord.py中,@tasks.loop装饰器用于创建一个循环任务,允许我们定期执行某个函数或命令。默认情况下,@tasks.loop装饰器将创建一个仅限于单个用户使用的任务。然而,我们可以通过一些技巧来使不止一个用户能够使用包含@tasks.loop的命令。
一种方法是使用共享数据结构,例如字典或列表,来跟踪每个用户的任务状态。以下是一个示例代码:
import discord
from discord.ext import commands, tasks
bot = commands.Bot(command_prefix='!')
# 创建一个字典来跟踪每个用户的任务状态
user_tasks = {}
@bot.command()
async def start_task(ctx):
# 检查用户是否已经有任务在运行
if ctx.author.id in user_tasks:
await ctx.send("您已经有一个任务在运行中!")
return
# 创建一个新的任务并添加到用户任务字典中
task = my_task.start()
user_tasks[ctx.author.id] = task
await ctx.send("任务已启动!")
@bot.command()
async def stop_task(ctx):
# 检查用户是否有任务在运行
if ctx.author.id not in user_tasks:
await ctx.send("您没有正在运行的任务!")
return
# 停止并移除用户的任务
task = user_tasks.pop(ctx.author.id)
task.cancel()
await ctx.send("任务已停止!")
@tasks.loop(seconds=60) # 每60秒执行一次任务
async def my_task():
# 执行任务的代码
pass
# 在bot启动时运行任务
@bot.event
async def on_ready():
my_task.start()
bot.run("YOUR_BOT_TOKEN")
在上面的示例中,我们使用了一个字典user_tasks
来跟踪每个用户的任务状态。当用户使用!start_task
命令启动任务时,我们首先检查用户是否已经有任务在运行,如果是,则向用户发送一条消息表示已经有任务在运行。否则,我们创建一个新的任务并将其添加到user_tasks
字典中。当用户使用!stop_task
命令停止任务时,我们检查用户是否有任务在运行,如果没有,则向用户发送一条消息表示没有正在运行的任务。否则,我们从user_tasks
字典中移除用户的任务,并取消任务的执行。
需要注意的是,上述代码只是一个示例,您需要根据自己的实际需求进行适当的修改和扩展。
腾讯云相关产品和产品介绍链接地址:
请注意,以上链接仅供参考,具体的产品选择应根据实际需求和情况进行评估和决策。
领取专属 10元无门槛券
手把手带您无忧上云