первая публикация бота
This commit is contained in:
115
bot/config.py
Normal file
115
bot/config.py
Normal file
@@ -0,0 +1,115 @@
|
||||
"""Модуль для работы с конфигурацией"""
|
||||
|
||||
import os
|
||||
import yaml
|
||||
from pathlib import Path
|
||||
from typing import Dict, Any, List, Optional
|
||||
|
||||
|
||||
class Config:
|
||||
"""Класс для хранения и загрузки конфигурации"""
|
||||
|
||||
def __init__(self, config_path: str = "config/config.yaml"):
|
||||
self.config_path = Path(config_path)
|
||||
self.sources_path = Path("config/sources.yaml")
|
||||
self.config: Dict[str, Any] = {}
|
||||
self.sources: List[Dict[str, str]] = []
|
||||
|
||||
self._load_config()
|
||||
self._load_sources()
|
||||
|
||||
def _load_config(self) -> None:
|
||||
"""Загружает основной конфиг"""
|
||||
if not self.config_path.exists():
|
||||
raise FileNotFoundError(
|
||||
f"Конфиг не найден: {self.config_path}\n"
|
||||
f"Скопируйте config/config.example.yaml в config/config.yaml и настройте его"
|
||||
)
|
||||
|
||||
with open(self.config_path, 'r', encoding='utf-8') as f:
|
||||
self.config = yaml.safe_load(f)
|
||||
|
||||
# Проверяем обязательные поля
|
||||
required_fields = ['homeserver', 'bot_user_id', 'access_token']
|
||||
for field in required_fields:
|
||||
if field not in self.config:
|
||||
raise ValueError(f"В конфиге отсутствует обязательное поле: {field}")
|
||||
|
||||
def _load_sources(self) -> None:
|
||||
"""Загружает список RSS источников"""
|
||||
if not self.sources_path.exists():
|
||||
raise FileNotFoundError(
|
||||
f"Файл с источниками не найден: {self.sources_path}\n"
|
||||
f"Скопируйте config/sources.example.yaml в config/sources.yaml и настройте его"
|
||||
)
|
||||
|
||||
with open(self.sources_path, 'r', encoding='utf-8') as f:
|
||||
data = yaml.safe_load(f)
|
||||
self.sources = data.get('sources', [])
|
||||
|
||||
if not self.sources:
|
||||
raise ValueError("Не найдено ни одного RSS источника в конфиге")
|
||||
|
||||
@property
|
||||
def homeserver(self) -> str:
|
||||
return self.config['homeserver']
|
||||
|
||||
@property
|
||||
def bot_user_id(self) -> str:
|
||||
return self.config['bot_user_id']
|
||||
|
||||
@property
|
||||
def access_token(self) -> str:
|
||||
return self.config['access_token']
|
||||
|
||||
@property
|
||||
def check_interval(self) -> int:
|
||||
return self.config.get('check_interval', 600)
|
||||
|
||||
@property
|
||||
def delay_between_posts(self) -> int:
|
||||
return self.config.get('delay_between_posts', 1)
|
||||
|
||||
@property
|
||||
def history_file(self) -> str:
|
||||
return self.config.get('history_file', 'data/sent_history.json')
|
||||
|
||||
@property
|
||||
def history_days(self) -> int:
|
||||
return self.config.get('history_days', 15)
|
||||
|
||||
@property
|
||||
def max_history_size(self) -> int:
|
||||
return self.config.get('max_history_size', 2000)
|
||||
|
||||
@property
|
||||
def images_dir(self) -> str:
|
||||
return self.config.get('images_dir', 'data/news_images')
|
||||
|
||||
@property
|
||||
def cleanup_images_every(self) -> int:
|
||||
return self.config.get('cleanup_images_every', 144)
|
||||
|
||||
@property
|
||||
def compress_images(self) -> bool:
|
||||
return self.config.get('compress_images', True)
|
||||
|
||||
@property
|
||||
def max_image_size_mb(self) -> float:
|
||||
return self.config.get('max_image_size_mb', 0.5)
|
||||
|
||||
@property
|
||||
def max_image_width(self) -> int:
|
||||
return self.config.get('max_image_width', 1200)
|
||||
|
||||
@property
|
||||
def max_image_height(self) -> int:
|
||||
return self.config.get('max_image_height', 1200)
|
||||
|
||||
@property
|
||||
def log_level(self) -> str:
|
||||
return self.config.get('log_level', 'INFO')
|
||||
|
||||
@property
|
||||
def log_file(self) -> Optional[str]:
|
||||
return self.config.get('log_file', None)
|
||||
Reference in New Issue
Block a user