#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. сохраните его как временную метку эпохи и проверьте, больше ли она другой?