Python 如何使discord.py bot一次只能运行一个命令或事件
我试图解决一个问题,我的discord机器人小游戏中有很多命令和事件,我希望用户一次只能使用一个命令,因此如果有一个小游戏已经运行,其他命令或事件就不能使用。因此,我创建了on_命令变量,在每个命令和事件开始时,变量变为1,在每个命令和事件结束时,变量变回0。因此,如果有人试图使用某个命令或事件,并且变量为1,则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.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