# - *- coding: utf- 8 - *- from sqlalchemy import Boolean, Integer, String 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 # Модель настроек бота class SettingsModel(Base): __tablename__ = "storage_settings" id: Mapped[int] = mapped_column(Integer, primary_key=True, default=1) status_work: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) status_notify: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) misc_message: Mapped[str] = mapped_column(String(4096), nullable=True, default=None) misc_message_media: Mapped[str] = mapped_column( String(255), nullable=True, default=None ) misc_finl_text: Mapped[str] = mapped_column( String(255), nullable=True, default=None ) misc_finl_link: Mapped[str] = mapped_column( String(255), nullable=True, default=None ) # Интервал напоминаний в часах: 0 = выключены, допустимые значения: 5, 12, 24 remind_interval: Mapped[int] = mapped_column(Integer, nullable=False, default=0) ModelBase = SettingsModel BaseModel = SettingsModel # Репозиторий настроек бота class SettingsRepository(BaseRepository[SettingsModel]): def __init__(self): super().__init__() self.table_model = SettingsModel self.storage_name = SettingsModel.__tablename__ # Создание строки настроек если их еще нет async def ensure_default(self) -> None: statement = insert(SettingsModel).values(id=1, status_work=False) statement = statement.on_conflict_do_nothing(index_elements=[SettingsModel.id]) async with session_scope() as session: await session.execute(statement) # Настройки должны быть всегда, поэтому при пустой таблице создаем дефолт async def get(self) -> SettingsModel: settings = await super().get(id=1) if settings is None: await self.ensure_default() settings = await super().get(id=1) if settings is None: raise RuntimeError("Настройки бота по умолчанию не сохранились") return settings # Обновление единственной строки настроек async def update(self, **kwargs) -> None: if not kwargs: return async with session_scope() as session: await session.execute( sqlalchemy_update(SettingsModel) .where(SettingsModel.id == 1) .values(**kwargs) )