intra_max_chatbot/database/queries/reply_context.py
2026-04-03 00:30:24 +03:00

48 lines
1.7 KiB
Python

"""Контекст быстрого ответа: последняя активная заявка пользователя."""
from datetime import datetime, timedelta, timezone
from database.connection import get_db
_TTL_MINUTES = 60
async def set_reply_context(max_user_id: int, task_id: int, task_number: int | None) -> None:
"""Записать / обновить последнюю активную заявку пользователя."""
db = get_db()
await db.execute(
"""
INSERT INTO user_reply_context (max_user_id, task_id, task_number, updated_at)
VALUES (?, ?, ?, datetime('now'))
ON CONFLICT(max_user_id) DO UPDATE SET
task_id = excluded.task_id,
task_number = excluded.task_number,
updated_at = excluded.updated_at
""",
(max_user_id, task_id, task_number),
)
await db.commit()
async def get_reply_context(max_user_id: int) -> dict | None:
"""Вернуть контекст если он свежий (< TTL минут), иначе None."""
db = get_db()
async with db.execute(
"SELECT task_id, task_number, updated_at FROM user_reply_context WHERE max_user_id = ?",
(max_user_id,),
) as cur:
row = await cur.fetchone()
if not row:
return None
try:
updated_at = datetime.fromisoformat(row["updated_at"]).replace(tzinfo=timezone.utc)
except ValueError:
return None
if datetime.now(tz=timezone.utc) - updated_at > timedelta(minutes=_TTL_MINUTES):
return None
return dict(row)
async def clear_reply_context(max_user_id: int) -> None:
db = get_db()
await db.execute("DELETE FROM user_reply_context WHERE max_user_id = ?", (max_user_id,))
await db.commit()