notification inactive users

This commit is contained in:
Vladless
2024-12-01 22:24:00 +03:00
parent 2dd3d3e2a7
commit 44bae2b4e6
2 changed files with 17 additions and 27 deletions
+13 -20
View File
@@ -1133,38 +1133,27 @@ async def check_notification_time(tg_id: int, notification_type: str, hours: int
Raises: Raises:
Exception: В случае ошибки при проверке времени уведомления Exception: В случае ошибки при проверке времени уведомления
""" """
conn = None
try: try:
# Если сессия не передана, создаем новое подключение conn = session if session is not None else await asyncpg.connect(DATABASE_URL)
if session is None:
conn = await asyncpg.connect(DATABASE_URL)
else:
conn = session
result = await conn.fetchrow( result = await conn.fetchval(
""" """
SELECT SELECT
CASE CASE
WHEN last_notification_time IS NULL THEN TRUE WHEN MAX(last_notification_time) IS NULL THEN TRUE
WHEN NOW() - last_notification_time > INTERVAL '$1 hours' THEN TRUE WHEN NOW() - MAX(last_notification_time) > ($1 * INTERVAL '1 hour') THEN TRUE
ELSE FALSE ELSE FALSE
END as can_notify END AS can_notify
FROM notifications FROM notifications
WHERE tg_id = $2 AND notification_type = $3 WHERE tg_id = $2 AND notification_type = $3
""", """,
hours, # Убираем преобразование в строку hours,
tg_id, tg_id,
notification_type, notification_type,
) )
# Если сессия не была передана, закрываем подключение can_notify = result if result is not None else True
if session is None and conn:
await conn.close()
# Если записи нет, значит уведомление можно отправить
if result is None:
return True
can_notify = result['can_notify']
logger.info( logger.info(
f"Проверка уведомления типа {notification_type} для пользователя {tg_id}: {'можно отправить' if can_notify else 'слишком рано'}" f"Проверка уведомления типа {notification_type} для пользователя {tg_id}: {'можно отправить' if can_notify else 'слишком рано'}"
@@ -1174,4 +1163,8 @@ async def check_notification_time(tg_id: int, notification_type: str, hours: int
except Exception as e: except Exception as e:
logger.error(f"Ошибка при проверке времени уведомления для пользователя {tg_id}: {e}") logger.error(f"Ошибка при проверке времени уведомления для пользователя {tg_id}: {e}")
return True # По умолчанию разрешаем отправку уведомления return False
finally:
if conn is not None and session is None:
await conn.close()
+4 -7
View File
@@ -34,9 +34,8 @@ async def notify_expiring_keys(bot: Bot):
logger.info("Начало обработки уведомлений.") logger.info("Начало обработки уведомлений.")
# TODO await notify_inactive_trial_users(bot, conn)
# await notify_inactive_trial_users(bot, conn) await asyncio.sleep(1)
# await asyncio.sleep(1)
await check_online_users() await check_online_users()
await asyncio.sleep(1) await asyncio.sleep(1)
await notify_10h_keys(bot, conn, current_time, threshold_time_10h) await notify_10h_keys(bot, conn, current_time, threshold_time_10h)
@@ -229,9 +228,8 @@ async def notify_inactive_trial_users(bot: Bot, conn: asyncpg.Connection):
username = user.get('username', 'Пользователь') username = user.get('username', 'Пользователь')
try: try:
# Проверяем, можно ли отправить уведомление
can_notify = await check_notification_time( can_notify = await check_notification_time(
tg_id, 'inactive_trial', hours=24, session=conn # Уведомление не чаще, чем раз в 24 часа tg_id, 'inactive_trial', hours=24, session=conn
) )
if can_notify and not await is_bot_blocked(bot, tg_id): if can_notify and not await is_bot_blocked(bot, tg_id):
@@ -252,13 +250,12 @@ async def notify_inactive_trial_users(bot: Bot, conn: asyncpg.Connection):
await bot.send_message(tg_id, message, reply_markup=keyboard) await bot.send_message(tg_id, message, reply_markup=keyboard)
logger.info(f"Отправлено уведомление неактивному пользователю {tg_id}.") logger.info(f"Отправлено уведомление неактивному пользователю {tg_id}.")
# Добавляем запись о notification
await add_notification(tg_id, 'inactive_trial', session=conn) await add_notification(tg_id, 'inactive_trial', session=conn)
except Exception as e: except Exception as e:
logger.error(f"Ошибка при отправке уведомления неактивному пользователю {tg_id}: {e}") logger.error(f"Ошибка при отправке уведомления неактивному пользователю {tg_id}: {e}")
await asyncio.sleep(1) # Небольшая задержка между отправками await asyncio.sleep(1)
async def handle_expired_keys(bot: Bot, conn: asyncpg.Connection, current_time: float): async def handle_expired_keys(bot: Bot, conn: asyncpg.Connection, current_time: float):