# - *- coding: utf- 8 - *- from sqlalchemy import BigInteger, Integer from sqlalchemy import update as sqlalchemy_update from sqlalchemy.dialects.sqlite import insert from sqlalchemy.orm import Mapped, mapped_column from tgbot.database.core import Base, session_scope from tgbot.database.repository import BaseRepository from tgbot.utils.const_functions import get_unix # Модель для хранения пользователей, которым бот отправил приветствие # и которые ещё не вышли из очереди напоминаний class PendingModel(Base): __tablename__ = "storage_pending" increment: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) user_id: Mapped[int] = mapped_column(BigInteger, nullable=False, unique=True, index=True) joined_at: Mapped[int] = mapped_column(Integer, nullable=False, default=get_unix) last_remind_at: Mapped[int] = mapped_column(Integer, nullable=False, default=0) ModelBase = PendingModel BaseModel = PendingModel # Репозиторий для управления очередью напоминаний class PendingRepository(BaseRepository[PendingModel]): def __init__(self): super().__init__() self.table_model = PendingModel self.storage_name = PendingModel.__tablename__ # Добавляем пользователя в очередь, если его ещё нет async def add(self, user_id: int) -> None: statement = insert(PendingModel).values( user_id=user_id, joined_at=get_unix(), last_remind_at=0, ) statement = statement.on_conflict_do_nothing(index_elements=[PendingModel.user_id]) async with session_scope() as session: await session.execute(statement) # Обновляем время последнего напоминания async def update_remind_at(self, user_id: int) -> None: async with session_scope() as session: await session.execute( sqlalchemy_update(PendingModel) .where(PendingModel.user_id == user_id) .values(last_remind_at=get_unix()) )