notification inactive users
This commit is contained in:
+13
-20
@@ -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()
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user