检查检查时间的问题

Issue wit checking for time on check

您好,我目前在为保存在 postgres 数据库中的用户分配时间时遇到问题。我想要实现的是当用户持续时间到期时角色被删除我想在检查运行时从数据库中获取时间但这似乎不起作用,

我的控制台没有输出错误,但检查似乎不是 运行。

这是我正在使用的内容:

@tasks.loop(seconds=5.0)
async def check_mute(self):
    guild = self.bot.get_guild(750744359632121661)
    restricted = discord.utils.get(member.guild.roles, name="Restricted")
    members = discord.utils.get(member.guild.roles, name="Members")
    for member in list(guild.members):
        conn = psycopg2.connect(DATABASE_URL, sslmode='require')
        cursor = conn.cursor()
        cursor.execute("SELECT time FROM blacklist WHERE username=%s", (member.id, ))
        restricted_role = get(ctx.guild.roles, name="Restricted")
        muted_time = cursor.fetchone()
        current_time = dt.datetime.now()
        mute_elapsed_time = current_time - muted_time 
        
        if member.id:
            await member.add_roles(members)
            await member.remove_roles(restricted, reason=f'Restricted role removed by {author.name}')

您不会收到错误,因为 tasks 默认情况下不会抛出任何错误。为了从它们中获取一些信息,您需要为它们编写自定义 error handler

话虽如此,我确实看到了一些可能导致循环中断的问题。

首先,变量 ctxauthor 从未在您的代码片段中的任何地方定义,但您正在使用它们。这 抛出错误并中断循环。

您是否使用 check_mute.start() 开始循环?任务需要在 运行 之前开始,而您的代码片段没有这个。

the check doesn't seem to be running

我没看到你在任何地方检查时差。你说支票没有发生,但它一开始就不存在。您正在定义 mute_elapsed_time,但 从未使用它来检查是否已经过足够的时间

修复这些问题后,您能否在您的任务中放置一些调试打印以查看它到达何处以及何时停止?如果有其他问题,这可能有助于识别它。

PS。这是不相关的,但是你在每个成员的循环中 get'ing restricted_role,而你可以只在循环之上执行一次(并且你已经在循环之上执行了,所以它是真的没必要)。据我所知你甚至没有使用它所以考虑删除它 ^^。这也是 ctx 所在的行(不存在),因此将其全部删除可能是个好主意。