import os import logging from dotenv import load_dotenv from telegram.ext import ( Application, CommandHandler, CallbackQueryHandler, ChatMemberHandler, ConversationHandler, MessageHandler, filters, ) from app.database import init_db from app.handlers import ( start, help_command, start_callback, manage_messages, manage_groups, list_messages, list_groups, send_message, my_chat_member, ) from app.handlers.message_manager import ( create_message_start, create_message_title, create_message_text, select_groups, CREATE_MSG_TITLE, CREATE_MSG_TEXT, SELECT_GROUPS, ) from app.handlers.telethon_client import telethon_manager from app.utils.keyboards import CallbackType from app.settings import Config # Загружаем переменные окружения load_dotenv() # Настройка логирования logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) logger = logging.getLogger(__name__) # Получаем конфигурацию if not Config.validate(): raise ValueError("❌ Конфигурация некорректна. Проверьте .env файл") async def main() -> None: """Запуск бота с поддержкой гибридного режима""" # Инициализируем БД logger.info("Инициализация базы данных...") await init_db() logger.info("✅ База данных инициализирована") # Инициализируем Telethon если включен if Config.USE_TELETHON: logger.info("Инициализация Telethon клиента...") success = await telethon_manager.initialize() if success: logger.info("✅ Telethon клиент инициализирован") else: logger.warning("⚠️ Ошибка инициализации Telethon, продолжим с режимом бота") # Выводим информацию о режиме mode = Config.get_mode() logger.info(f"📡 Режим работы: {mode}") if mode == 'hybrid': logger.info("🔀 Бот будет использовать Telethon как fallback для закрытых групп") # Создаем приложение application = Application.builder().token(Config.TELEGRAM_BOT_TOKEN).build() # Добавляем обработчики команд application.add_handler(CommandHandler("start", start)) application.add_handler(CommandHandler("help", help_command)) # ConversationHandler для создания сообщения create_message_handler = ConversationHandler( entry_points=[CallbackQueryHandler(create_message_start, pattern=f"^{CallbackType.CREATE_MESSAGE}$")], states={ CREATE_MSG_TITLE: [MessageHandler(filters.TEXT & ~filters.COMMAND, create_message_title)], CREATE_MSG_TEXT: [MessageHandler(filters.TEXT & ~filters.COMMAND, create_message_text)], SELECT_GROUPS: [CallbackQueryHandler(select_groups, pattern=r"^(select_group_\d+|done_groups|main_menu)$")], }, fallbacks=[CommandHandler("cancel", start)], ) application.add_handler(create_message_handler) # Добавляем обработчики callback'ов application.add_handler(CallbackQueryHandler(start_callback, pattern=f"^{CallbackType.MAIN_MENU}$")) application.add_handler(CallbackQueryHandler(manage_messages, pattern=f"^{CallbackType.MANAGE_MESSAGES}$")) application.add_handler(CallbackQueryHandler(manage_groups, pattern=f"^{CallbackType.MANAGE_GROUPS}$")) application.add_handler(CallbackQueryHandler(list_messages, pattern=f"^{CallbackType.LIST_MESSAGES}$")) application.add_handler(CallbackQueryHandler(list_groups, pattern=f"^{CallbackType.LIST_GROUPS}$")) # Отправка сообщений application.add_handler(CallbackQueryHandler(send_message, pattern=r"^send_msg_\d+$")) # Обработчик добавления/удаления бота из групп application.add_handler(ChatMemberHandler(my_chat_member, ChatMemberHandler.MY_CHAT_MEMBER)) # Запускаем бота logger.info("🚀 Бот запущен. Ожидание команд...") try: await application.run_polling(allowed_updates=["message", "callback_query", "my_chat_member"]) finally: # Завершить Telethon клиент при выходе if Config.USE_TELETHON: logger.info("Завершение работы Telethon клиента...") await telethon_manager.shutdown() logger.info("✅ Telethon клиент остановлен") if __name__ == "__main__": import asyncio asyncio.run(main())