Python 如何使discord.py bot一次只能运行一个命令或事件

Python 如何使discord.py bot一次只能运行一个命令或事件,python,pycharm,discord.py,discord.py-rewrite,Python,Pycharm,Discord.py,Discord.py Rewrite,我试图解决一个问题,我的discord机器人小游戏中有很多命令和事件,我希望用户一次只能使用一个命令,因此如果有一个小游戏已经运行,其他命令或事件就不能使用。因此,我创建了on_命令变量,在每个命令和事件开始时,变量变为1,在每个命令和事件结束时,变量变回0。因此,如果有人试图使用某个命令或事件,并且变量为1,则bot只会向他发送他现在无法使用该命令的消息。但由于某种原因,它不起作用,我得到了下一个错误: discord.ext.commands.errors.CommandInvokeErro

我试图解决一个问题,我的discord机器人小游戏中有很多命令和事件,我希望用户一次只能使用一个命令,因此如果有一个小游戏已经运行,其他命令或事件就不能使用。因此,我创建了on_命令变量,在每个命令和事件开始时,变量变为1,在每个命令和事件结束时,变量变回0。因此,如果有人试图使用某个命令或事件,并且变量为1,则bot只会向他发送他现在无法使用该命令的消息。但由于某种原因,它不起作用,我得到了下一个错误:

discord.ext.commands.errors.CommandInvokeError: Command raised an exception: UnboundLocalError: local variable 'on_command' referenced before assignment
我的代码:

on_命令=0 @机器人命令 @commands.cooldown180.0,commands.BucketType.guild 异步定义问题消息: 如果msg.channel.id!=频道: 回来 如果on_命令==1: wait msg.send正在运行另一个命令或事件 回来 on_命令=1 .... .... .... on_命令=0 使用python的全局

on_命令=0 @机器人命令 @commands.cooldown180.0,commands.BucketType.guild 异步定义问题消息: 全局on_命令 如果msg.channel.id!=频道: 回来 如果on_命令==1: wait msg.send正在运行另一个命令或事件 回来 on_命令=1 .... .... .... on_命令=0 使用python的全局

on_命令=0 @机器人命令 @commands.cooldown180.0,commands.BucketType.guild 异步定义问题消息: 全局on_命令 如果msg.channel.id!=频道: 回来 如果on_命令==1: wait msg.send正在运行另一个命令或事件 回来 on_命令=1 .... .... .... on_命令=0 您应该将on_命令变量重命名为discord.py在on_命令事件中使用的其他变量,如果将来要使用它,您应该重命名它。 on_命令变量从未真正更改,您应该使用global关键字。 您当前的解决方案一次只允许一个用户使用bot,如果任何其他人想要使用它,他将无法使用 一种解决方案是创建一个名为current_users的bot var,在任何命令之前进行全局检查,并在命令完成后检查用户是否可以播放,将其从变量中删除

bot.current_users=设置空集 @支票 异步定义为用户播放CTX: 如果不是bot.current_用户中的ctx.author: 用户可以玩游戏,将其添加到集合中 bot.current_users.addctx.author 返回真值 返回错误 @机器人命令 异步def testctx: 测试命令 等待ctx.Send开始游戏。。。 等待asyncio.sleep100 等待ctx。完成游戏。。。你现在可以玩其他游戏了 @机器人事件 命令\u completionctx上的异步定义: 在用户玩完游戏后删除该用户 bot.current_users.removectx.author @机器人事件 命令上的异步定义\u errorctx,错误: 如果isinstanceerror,commands.CheckFailure: 用户无法玩游戏,请在此处发送消息 等待ctx.send您不能玩更多游戏,请完成当前游戏 注意:如果它的工作方式不同,则需要手动执行

@bot.event示例事件 _message上的异步定义消息: 如果bot.current_用户中的message.author: return wait message.channel.send您不能玩游戏。。。 bot.current_users.addmessage.author ... bot.current_users.removemessage.author 另一个例子事件 @机器人事件 异步def on_reaction_addreaction,用户: 如果用户在bot.current_用户中: 返回等待反应。消息。频道。发送。。。 bot.current_users.adduser ... bot.current_users.removeuser 参考: 您应该将on_命令变量重命名为discord.py在on_命令事件中使用的其他变量,如果将来要使用它,您应该重命名它。 on_命令变量从未真正更改,您应该使用global关键字。 您当前的解决方案一次只允许一个用户使用bot,如果任何其他人想要使用它,他将无法使用 一种解决方案是创建一个名为current_users的bot var,在任何命令之前进行全局检查,并在命令完成后检查用户是否可以播放,将其从变量中删除

bot.current_users=设置空集 @支票 异步定义为用户播放CTX: 如果不是bot.current_用户中的ctx.author: 用户可以玩游戏,将其添加到集合中 bot.current_users.addctx.author 返回真值 返回错误 @机器人命令 异步def testctx: 测试命令 等待ctx.Send开始游戏。。。 等待asyncio.sleep100 等待ctx。完成游戏。。。你现在可以玩其他游戏了 @机器人事件 命令\u completionctx上的异步定义: 在用户玩完游戏后删除该用户 bot.current_users.removectx.author @机器人事件 命令上的异步定义\u errorctx,错误: 如果isinstanceerror,commands.CheckFailure: 这个 用户无法玩游戏,请在此处发送消息 等待ctx.send您不能玩更多游戏,请完成当前游戏 注意:如果它的工作方式不同,则需要手动执行

@bot.event示例事件 _message上的异步定义消息: 如果bot.current_用户中的message.author: return wait message.channel.send您不能玩游戏。。。 bot.current_users.addmessage.author ... bot.current_users.removemessage.author 另一个例子事件 @机器人事件 异步def on_reaction_addreaction,用户: 如果用户在bot.current_用户中: 返回等待反应。消息。频道。发送。。。 bot.current_users.adduser ... bot.current_users.removeuser 参考:
谢谢您的帮助,discord.py中是否有一些函数,如果在一段时间内未完成,它会自动停止命令或事件的运行?很遗憾,没有@garadosixThank,谢谢您的帮助,另外,discord.py中是否有一些函数,如果在一段时间内没有完成,它会自动停止命令或事件的运行?遗憾的是,没有@garadosix