【问题标题】:While statement is heroku discord bot stops working after a while虽然声明是 heroku discord bot 在一段时间后停止工作
【发布时间】:2020-07-03 08:43:42
【问题描述】:

我制作了我的第一个不和谐机器人,它的作用是侦听一个名为 +purge 的命令并清除执行它的频道中的所有消息。

但是,就像我其他朋友的机器人一样,机器人变得功能失调。这可能是 Heroku,但我对此表示怀疑?我可能需要一个 break 语句,但不确定。我也试图在多台服务器上运行它,所以我希望布尔变量的每个名称都有服务器 ID。

通过不工作,我的意思是它不会再删除邮件,并且在您运行我认为的命令后发送垃圾邮件时会出现一些故障。它可能与isActive 变量有关。

isActive = False

@bot.command(pass_context=True)
@has_role("Guild Master")
async def purge(ctx):
    global isActive
    isActive = not isActive
    if isActive:
        while isActive:
            await ctx.channel.purge(limit=999)

【问题讨论】:

    标签: python heroku while-loop discord.py


    【解决方案1】:
    • await ctx.channel.purge(limit=999) 不需要放入 while 循环,因为该函数已经使用自己的循环来删除
    • 由于您将布尔值 isActive 声明为全局,布尔值的状态保存在范围之外,导致函数每隔一次调用它就会运行一次
    • 您可以将 isActive 布尔值的概念装箱,因为函数下的代码在调用后会自动变为活动状态
    • 在您的情况下,该函数应该只有几行(并且在任何公会中仍然可以正常工作):
    @bot.command(pass_context=True)
    @has_role("Guild Master")
    async def purge(ctx):
        await ctx.channel.purge(limit=999)
    

    编辑:如果我们想删除频道中发送的每条消息,我们可以使用on_message 监听器,如下所示:

    @commands.Cog.listener()
    async def on_message(message):
        if message.channel == noMessageChannel:
             await message.delete()
    

    【讨论】:

    • 嘿!我正在制作这个命令,让它成为一个切换,总是每秒清除一次命令,而不是一次。这就是我制作while循环的原因。如果您仍然理解我要做什么,我尝试了代码并查看了您的解释,它只清除了一次哈哈。我认为命令的会话以某种方式到期,while 循环将停止。有什么想法吗?
    • 如果您希望在频道中发送的每条消息都被不断删除,那么 on_message 监听器将是您的选择。我将编辑我的答案以包含一个示例
    • 我会为 noMessageChannel 变量添加什么?我怎样才能让这个监听器装饰器被命令触发?
    • 变量noMessageChannel 将是一个通道对象。要获取通道对象,您可以使用bot.get_channel(id),其中id 是一个表示通道ID 的int。您可以通过创建一个编辑布尔变量的命令来打开和关闭它。该变量可以使用简单的 if 语句来指示侦听器是否应该删除消息。如果仍有不清楚的地方,请尽管问!
    猜你喜欢
    • 2021-02-06
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多