You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Discord.py的barrels命令添加asyncio.sleep运行状态检查?

解决Discord.py计时器重复触发的问题

首先得纠正你原代码里的一个逻辑问题:你是先等35分钟(2100秒)再发“计时器已启动”的消息,这会让用户触发命令后完全不知道有没有生效,应该先发送启动通知,再进入休眠。

接下来实现“防止重复触发”的功能,核心思路是用一个字典跟踪每个用户的活跃计时器任务,具体步骤如下:

1. 定义全局跟踪字典

在代码开头(命令外部)定义一个字典,用来存储正在运行的用户计时器任务:

import asyncio
import discord
from discord.ext import commands

client = commands.Bot(command_prefix="你的命令前缀", intents=discord.Intents.all())
# 跟踪活跃的桶计时器:键为用户ID,值为asyncio.Task对象
active_barrel_timers = {}

2. 修改barrels命令

重写命令逻辑,加入重复检查和任务管理:

@client.command()
@commands.cooldown(1, 10, commands.BucketType.user)
async def barrels(ctx, member: discord.Member = None):
    target_member = member or ctx.author
    user_id = target_member.id

    # 检查该用户是否已有活跃的计时器
    if user_id in active_barrel_timers:
        existing_task = active_barrel_timers[user_id]
        if not existing_task.done():
            await ctx.send(f"{target_member.mention} 你已经有一个桶计时器在运行了,耐心等它完成吧!")
            return

    # 定义计时器的核心逻辑函数
    async def barrel_timer_logic():
        try:
            # 先通知用户计时器已启动
            await ctx.send("桶计时器已启动,35分钟后提醒你!")
            # 休眠2100秒(35分钟)
            await asyncio.sleep(2100)
            # 时间到了发送提醒
            await ctx.send(f"{target_member.mention} 桶已经准备好可以领取啦!")
        finally:
            # 不管任务正常结束还是异常终止,都从字典里移除该用户记录
            if user_id in active_barrel_timers:
                del active_barrel_timers[user_id]

    # 创建并启动后台异步任务
    task = asyncio.create_task(barrel_timer_logic())
    active_barrel_timers[user_id] = task
    await ctx.send(f"{target_member.mention} 已为你启动桶计时器!")

关键细节说明

  • 全局字典的作用:active_barrel_timers用用户ID作为唯一标识,记录每个用户当前是否有正在运行的计时器任务,避免同一用户重复触发。
  • 任务状态检查:通过task.done()判断任务是否已完成,防止字典里残留已结束的任务记录导致误判。
  • try/finally的必要性:确保不管任务是正常完成还是中途异常终止(比如机器人重启、网络问题),都能清理字典里的用户记录,不影响后续命令使用。
  • 异步任务创建:用asyncio.create_task()把计时器逻辑包装成后台任务,让命令能立即给用户反馈,不用等35分钟才响应。

内容的提问来源于stack exchange,提问作者Clyde Owens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:47:41