Files
matrix-rss-bot/bot/config.py

115 lines
3.9 KiB
Python
Raw Permalink 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.
"""Модуль для работы с конфигурацией"""
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)