Проблема с проверкой времени проверки

#python-3.x #discord.py #discord.py-rewrite

#python-3.x #discord.py

Вопрос:

Привет, в настоящее время у меня возникла проблема с получением времени, выделенного для пользователя, которое сохраняется в базе данных 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}')
  

Ответ №1:

Вы не получаете ошибок, потому tasks что по умолчанию не выдаете никаких ошибок. Чтобы извлечь из них некоторую информацию, вам нужно написать error handler для них пользовательский интерфейс.

С учетом сказанного, я вижу несколько проблем, которые могут привести к разрыву вашего цикла.

Прежде всего, переменные ctx и author никогда не определены нигде в вашем фрагменте кода, но вы их используете. Это приведет к возникновению ошибок и прерыванию цикла.

Вы начинаете использовать свой цикл check_mute.start() ? Задачи необходимо запускать до их запуска, а в вашем фрагменте кода этого нет.

проверка, похоже, не выполняется

Я не вижу, чтобы вы где-либо проверяли разницу во времени. Вы сказали, что проверка не произошла, но ее просто нет в первую очередь. Вы определяете mute_elapsed_time , но никогда не используете его, чтобы проверить, прошло ли достаточно времени или нет.

После их исправления не могли бы вы добавить несколько отладочных отпечатков в свою задачу, чтобы увидеть, куда она попадает и когда она останавливается? Если что-то еще не так, это может помочь определить это.

PS. Это не связано, но вы get работаете restricted_role в цикле для каждого элемента, в то время как вы можете просто сделать это один раз над циклом (и вы уже сделали это над циклом, так что это действительно не нужно). Насколько я вижу, вы даже не используете его, поэтому подумайте о его удалении ^^. Это также строка, в которой ctx есть (которая не существует), поэтому удаление всего этого вместе может быть хорошей идеей.

Комментарии:

1. «проверьте, прошло ли достаточно времени» на данный момент это в основном моя проблема. Я застрял на этом этапе, я хочу иметь возможность проверить, совпадает ли время, сохраненное как временная метка в базе данных, с текущим временем или после него, если оно удаляет роль, иначе нет.

2. сохраните его как временную метку эпохи и проверьте, больше ли она другой?