Files
bot-news-linux-gaming/history_manager.py

99 lines
4.3 KiB
Python
Raw 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.

#!/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]]