#!/usr/bin/env python3 import asyncio import schedule import time from logger import setup_logger from config import DISCORD_CONFIG from content_processor import ContentProcessor from site_api import SiteAPI from telegram_client import TelegramNewsClient from vk_client import VKClient from discord_client import DiscordClient class NewsBot: def __init__(self): self.logger = setup_logger() self.content_processor = ContentProcessor() self.site_api = SiteAPI() self.telegram_client = TelegramNewsClient(self.content_processor) self.vk_client = VKClient(self.content_processor) self.discord_client = DiscordClient(self.content_processor) self.logger.info("Бот инициализирован с модульной архитектурой") if DISCORD_CONFIG['enabled']: self.logger.info("Discord функциональность включена") else: self.logger.info("Discord функциональность отключена") async def run_job(self): """Основная задача бота""" self.logger.info("Запуск основной задачи бота") try: # Проверка и публикация новых версий скриптов self.site_api.check_script_versions(self.content_processor) # Получение списка новостей news_list = self.site_api.get_news() if news_list: self.logger.info(f"Получено {len(news_list)} новостей для обработки") # Публикация в Telegram if self.telegram_client.is_enabled(): await self.telegram_client.check_and_publish_news(news_list) # Публикация в VK if self.vk_client.is_enabled(): await asyncio.get_event_loop().run_in_executor( None, self.vk_client.check_and_publish_news, news_list ) # Публикация в Discord (если включен) if self.discord_client.is_enabled(): await self.discord_client.check_and_publish_news(news_list) else: self.logger.warning("Новостей для обработки не найдено") except Exception as e: self.logger.error(f"Ошибка в основной задаче бота: {e}") def run_sync_job(self): """Синхронная обертка для планировщика""" asyncio.run(self.run_job()) def start(self): """Запуск бота""" self.logger.info("Запуск новостного бота") # Выполнение задачи при старте self.logger.info("Выполнение первоначальной задачи...") self.run_sync_job() # Планирование периодического выполнения schedule.every(30).minutes.do(self.run_sync_job) self.logger.info("Запуск планировщика задач (каждые 30 минут)") # Основной цикл while True: schedule.run_pending() time.sleep(5) def main(): """Точка входа в приложение""" bot = NewsBot() try: bot.start() except KeyboardInterrupt: bot.logger.info("Бот остановлен пользователем") except Exception as e: bot.logger.error(f"Критическая ошибка бота: {e}") if __name__ == '__main__': main()