Files
telegram-helper-bot/database/repositories/bot_settings_repository.py

161 lines
5.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Репозиторий для работы с настройками бота."""
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