"""Репозиторий для работы с настройками бота.""" from typing import Dict, Optional from database.base import DatabaseConnection class BotSettingsRepository(DatabaseConnection): """Репозиторий для управления настройками бота в таблице bot_settings.""" async def create_table(self) -> None: """Создает таблицу bot_settings, если она не существует.""" query = """ CREATE TABLE IF NOT EXISTS bot_settings ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, key TEXT NOT NULL UNIQUE, value TEXT NOT NULL, updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) ) """ await self._execute_query(query) self.logger.info("Таблица bot_settings создана или уже существует") async def get_setting(self, key: str) -> Optional[str]: """ Получает значение настройки по ключу. Args: key: Ключ настройки Returns: Значение настройки или None, если не найдено """ query = "SELECT value FROM bot_settings WHERE key = ?" rows = await self._execute_query_with_result(query, (key,)) if rows and len(rows) > 0: return rows[0][0] return None async def set_setting(self, key: str, value: str) -> None: """ Устанавливает значение настройки. Args: key: Ключ настройки value: Значение настройки """ query = """ INSERT INTO bot_settings (key, value, updated_at) VALUES (?, ?, strftime('%s', 'now')) ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = strftime('%s', 'now') """ await self._execute_query(query, (key, value)) self.logger.debug(f"Настройка {key} установлена: {value}") async def get_bool_setting(self, key: str, default: bool = False) -> bool: """ Получает булево значение настройки. Args: key: Ключ настройки default: Значение по умолчанию Returns: True если значение 'true', иначе False """ value = await self.get_setting(key) if value is None: return default return value.lower() == "true" async def set_bool_setting(self, key: str, value: bool) -> None: """ Устанавливает булево значение настройки. Args: key: Ключ настройки value: Булево значение """ await self.set_setting(key, "true" if value else "false") async def get_float_setting(self, key: str, default: float = 0.0) -> float: """ Получает числовое значение настройки. Args: key: Ключ настройки default: Значение по умолчанию Returns: Числовое значение или default """ value = await self.get_setting(key) if value is None: return default try: return float(value) except ValueError: self.logger.warning( f"Невозможно преобразовать значение '{value}' в float для ключа '{key}'" ) return default async def set_float_setting(self, key: str, value: float) -> None: """ Устанавливает числовое значение настройки. Args: key: Ключ настройки value: Числовое значение """ await self.set_setting(key, str(value)) async def get_auto_moderation_settings(self) -> Dict[str, any]: """ Получает все настройки авто-модерации. Returns: Словарь с настройками авто-модерации """ return { "auto_publish_enabled": await self.get_bool_setting( "auto_publish_enabled", False ), "auto_decline_enabled": await self.get_bool_setting( "auto_decline_enabled", False ), "auto_publish_threshold": await self.get_float_setting( "auto_publish_threshold", 0.8 ), "auto_decline_threshold": await self.get_float_setting( "auto_decline_threshold", 0.4 ), } async def toggle_auto_publish(self) -> bool: """ Переключает состояние авто-публикации. Returns: Новое состояние (True/False) """ current = await self.get_bool_setting("auto_publish_enabled", False) new_value = not current await self.set_bool_setting("auto_publish_enabled", new_value) return new_value async def toggle_auto_decline(self) -> bool: """ Переключает состояние авто-отклонения. Returns: Новое состояние (True/False) """ current = await self.get_bool_setting("auto_decline_enabled", False) new_value = not current await self.set_bool_setting("auto_decline_enabled", new_value) return new_value