如何设置Discord bot同一时间仅允许一位用户使用(基于discord.Client)
解决方案
你可以通过asyncio提供的异步互斥锁实现单命令并发限制,完全兼容discord.Client的使用方式,无需切换依赖。
完整实现代码如下:
import discord import asyncio # 全局唯一的异步互斥锁实例 command_lock = asyncio.Lock() # 请根据实际需求调整Intents,需要至少开启message_content才能读取消息内容 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_message(message): # 过滤bot自身发送的消息,避免循环触发 if message.author.bot: return if message.content == "!test": # 锁已被占用,说明有命令正在执行,直接拒绝当前请求 if command_lock.locked(): # 可选:给用户返回提示,不需要可以删除该行仅保留return await message.channel.send("当前命令正被其他用户使用,请稍后重试") return # 通过async with持有锁,执行完成后会自动释放,即使中间报错也不会出现死锁 async with command_lock: await asyncio.sleep(15) # 修正原代码语法错误:感叹号移到字符串引号内部 await message.channel.send("Hello world!") client.run("替换为你的Bot Token")
关键逻辑说明
- 全局唯一的
asyncio.Lock实例可以保证同一时间只有一个协程能持有锁进入执行逻辑 - 使用
async with语法管理锁的生命周期,无需手动调用释放方法,避免异常导致锁永久占用的问题 - 额外新增了过滤bot自身消息的逻辑,避免不必要的触发逻辑
注意:你需要在Discord开发者平台的Bot设置页面开启「Message Content Intent」权限,否则bot无法读取用户发送的消息内容,无法触发命令。
内容的提问来源于stack exchange,提问作者versace1143
相关产品推荐
相关产品推荐

