#!/usr/bin/env python3 import json import os from datetime import datetime, timedelta import logging class HistoryManager: def __init__(self, history_file='published_history.json'): self.logger = logging.getLogger(__name__) self.history_file = history_file self.history = self._load_history() def _load_history(self): """Загрузка истории из файла""" if os.path.exists(self.history_file): try: with open(self.history_file, 'r', encoding='utf-8') as f: data = json.load(f) self.logger.info(f"Загружена история: {len(data.get('telegram', []))} записей для Telegram") return data except Exception as e: self.logger.error(f"Ошибка загрузки истории: {e}") return self._get_empty_history() else: self.logger.info("Файл истории не найден, создаём новый") return self._get_empty_history() def _get_empty_history(self): """Создание пустой структуры истории""" return { 'telegram': [], 'vk': [], 'discord': [] } def _save_history(self): """Сохранение истории в файл""" try: with open(self.history_file, 'w', encoding='utf-8') as f: json.dump(self.history, f, ensure_ascii=False, indent=2) self.logger.debug(f"История сохранена в {self.history_file}") except Exception as e: self.logger.error(f"Ошибка сохранения истории: {e}") def is_published(self, platform, title): """Проверка, была ли новость опубликована""" if platform not in self.history: return False # Проверяем по заголовку for entry in self.history[platform]: if entry['title'].lower().strip() == title.lower().strip(): self.logger.debug(f"Новость '{title}' уже была опубликована в {platform}") return True return False def add_published(self, platform, topic_id, title): """Добавление записи об опубликованной новости""" if platform not in self.history: self.history[platform] = [] entry = { 'topic_id': topic_id, 'title': title, 'published_at': datetime.now().isoformat() } self.history[platform].append(entry) self.logger.info(f"Добавлена запись в историю {platform}: {title}") self._save_history() def cleanup_old_entries(self, days=365): """Удаление очень старых записей из истории (по умолчанию старше года) ВНИМАНИЕ: Удаление записей может привести к повторной публикации старых новостей! Используйте этот метод только если файл истории стал слишком большим. """ cutoff_date = datetime.now() - timedelta(days=days) for platform in self.history: original_count = len(self.history[platform]) self.history[platform] = [ entry for entry in self.history[platform] if datetime.fromisoformat(entry['published_at']) > cutoff_date ] removed = original_count - len(self.history[platform]) if removed > 0: self.logger.info(f"Удалено {removed} старых записей из истории {platform} (старше {days} дней)") self._save_history() def get_published_titles(self, platform): """Получение списка опубликованных заголовков для платформы""" if platform not in self.history: return [] return [entry['title'] for entry in self.history[platform]]