import logging from typing import Set, List logger = logging.getLogger(__name__) class ProcessedPostsManager: def __init__(self, file_path: str = "storage/processed.txt"): self.file_path = file_path self.processed_posts: Set[str] = self._load() def _load(self) -> Set[str]: try: with open(self.file_path, "r", encoding="utf-8") as processed: ids = {line.strip() for line in processed if line.strip()} logger.info( f"Загружено {len(ids)} обработанных постов из {self.file_path}." ) return ids except FileNotFoundError: logger.info(f"Файл {self.file_path} не найден, начинаем с пустого списка.") return set() except Exception as e: logger.error( f"Ошибка при загрузке {self.file_path}: {e}. Начинаем с пустого списка." ) return set() def _save(self): """Full rewrite — use for batch operations only.""" with open(self.file_path, "w", encoding="utf-8") as processed: processed.write("".join(f"{pid}\n" for pid in self.processed_posts)) def is_processed(self, post_id: int) -> bool: return str(post_id) in self.processed_posts def mark_processed(self, post_id: int): """Mark a single post processed and append to file (no full rewrite).""" str_id = str(post_id) if str_id in self.processed_posts: return self.processed_posts.add(str_id) with open(self.file_path, "a", encoding="utf-8") as f: f.write(str_id + "\n") logger.debug(f"Пост {post_id} отмечен как обработанный.") def add_existing_posts(self, post_ids: List[int]): before = len(self.processed_posts) for post_id in post_ids: self.processed_posts.add(str(post_id)) self._save() added = len(self.processed_posts) - before logger.info( f"Добавлено {added} новых записей в список обработанных (всего: {len(self.processed_posts)})." )