""" Основная точка входа для Telegram бота Поддерживает запуск бота и API сервера """ import asyncio import argparse import logging import sys import os # Добавляем текущую директорию в PYTHONPATH sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from bot_config import config def setup_logging(): """Настройка системы логирования""" logging.basicConfig( level=getattr(logging, config.LOG_LEVEL), format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.StreamHandler(sys.stdout), logging.FileHandler('bot.log') if config.APP_ENV == 'production' else logging.NullHandler() ] ) async def run_bot(): """Запуск Telegram бота""" try: import telegram_bot logging.info("Запуск Telegram бота...") await telegram_bot.main() except Exception as e: logging.error(f"Ошибка при запуске бота: {e}") raise def run_api(): """Запуск API сервера""" import uvicorn from api.main import app logging.info("Запуск API сервера...") uvicorn.run( app, host=config.DB_HOST if hasattr(config, 'API_HOST') else "0.0.0.0", port=int(os.getenv('API_PORT', 8000)), reload=config.DEBUG, log_level=config.LOG_LEVEL.lower() ) async def run_both(): """Запуск бота и API одновременно""" import uvicorn from api.main import app import telegram_bot logging.info("Запуск бота и API сервера...") # Создаем задачи для параллельного запуска api_config = uvicorn.Config( app, host="0.0.0.0", port=int(os.getenv('API_PORT', 8000)), log_level=config.LOG_LEVEL.lower() ) api_server = uvicorn.Server(api_config) # Запускаем параллельно await asyncio.gather( telegram_bot.main(), api_server.serve() ) def main(): """Основная функция""" parser = argparse.ArgumentParser(description='Telegram Bot Application') parser.add_argument( '--mode', choices=['bot', 'api', 'both'], default='bot', help='Режим запуска: bot (только бот), api (только API), both (бот + API)' ) args = parser.parse_args() # Настраиваем логирование setup_logging() logger = logging.getLogger(__name__) try: # Проверяем конфигурацию config.validate() logger.info(f"Конфигурация проверена. Режим: {config.APP_ENV}") # Запускаем в зависимости от режима if args.mode == 'bot': asyncio.run(run_bot()) elif args.mode == 'api': run_api() elif args.mode == 'both': asyncio.run(run_both()) except KeyboardInterrupt: logger.info("Получен сигнал остановки") except Exception as e: logger.error(f"Критическая ошибка: {e}") sys.exit(1) if __name__ == "__main__": main()