161 lines
5.7 KiB
Python
161 lines
5.7 KiB
Python
"""Репозиторий для работы с настройками бота."""
|
||
|
||
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
|