import logging from aiogram import Bot, Dispatcher, types from aiogram.fsm.storage.redis import RedisStorage from aiogram.fsm.storage.memory import MemoryStorage import redis.asyncio as redis from app.config import settings from app.middlewares.global_error import GlobalErrorMiddleware from app.middlewares.auth import AuthMiddleware from app.middlewares.logging import LoggingMiddleware from app.middlewares.throttling import ThrottlingMiddleware from app.middlewares.subscription_checker import SubscriptionStatusMiddleware from app.middlewares.maintenance import MaintenanceMiddleware from app.middlewares.display_name_restriction import DisplayNameRestrictionMiddleware from app.middlewares.button_stats import ButtonStatsMiddleware from app.services.maintenance_service import maintenance_service from app.utils.cache import cache from app.handlers import ( start, menu, subscription, balance, promocode, referral, support, server_status, common, tickets, ) from app.handlers import polls as user_polls from app.handlers import simple_subscription from app.handlers.admin import ( main as admin_main, blacklist as admin_blacklist, bulk_ban as admin_bulk_ban, users as admin_users, subscriptions as admin_subscriptions, promocodes as admin_promocodes, messages as admin_messages, monitoring as admin_monitoring, referrals as admin_referrals, rules as admin_rules, remnawave as admin_remnawave, statistics as admin_statistics, polls as admin_polls, servers as admin_servers, maintenance as admin_maintenance, promo_groups as admin_promo_groups, campaigns as admin_campaigns, contests as admin_contests, daily_contests as admin_daily_contests, promo_offers as admin_promo_offers, user_messages as admin_user_messages, updates as admin_updates, backup as admin_backup, system_logs as admin_system_logs, welcome_text as admin_welcome_text, tickets as admin_tickets, reports as admin_reports, bot_configuration as admin_bot_configuration, pricing as admin_pricing, privacy_policy as admin_privacy_policy, public_offer as admin_public_offer, faq as admin_faq, payments as admin_payments, trials as admin_trials, tariffs as admin_tariffs, ) from app.handlers import contests as user_contests from app.handlers.stars_payments import register_stars_handlers from app.utils.message_patch import patch_message_methods patch_message_methods() logger = logging.getLogger(__name__) async def debug_callback_handler(callback: types.CallbackQuery): logger.info(f"πŸ” DEBUG CALLBACK:") logger.info(f" - Data: {callback.data}") logger.info(f" - User: {callback.from_user.id}") logger.info(f" - Username: {callback.from_user.username}") async def setup_bot() -> tuple[Bot, Dispatcher]: try: await cache.connect() logger.info("КСш ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½") except Exception as e: logger.warning(f"КСш Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½: {e}") from aiogram.client.default import DefaultBotProperties from aiogram.enums import ParseMode bot = Bot( token=settings.BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML) ) maintenance_service.set_bot(bot) logger.info("Π‘ΠΎΡ‚ установлСн Π² maintenance_service") try: redis_client = redis.from_url(settings.REDIS_URL) await redis_client.ping() storage = RedisStorage(redis_client) logger.info("ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ ΠΊ Redis для FSM storage") except Exception as e: logger.warning(f"НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ Redis: {e}") logger.info("Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ MemoryStorage для FSM") storage = MemoryStorage() dp = Dispatcher(storage=storage) dp.message.middleware(GlobalErrorMiddleware()) dp.callback_query.middleware(GlobalErrorMiddleware()) dp.pre_checkout_query.middleware(GlobalErrorMiddleware()) dp.message.middleware(LoggingMiddleware()) dp.callback_query.middleware(LoggingMiddleware()) dp.message.middleware(MaintenanceMiddleware()) dp.callback_query.middleware(MaintenanceMiddleware()) display_name_middleware = DisplayNameRestrictionMiddleware() dp.message.middleware(display_name_middleware) dp.callback_query.middleware(display_name_middleware) dp.pre_checkout_query.middleware(display_name_middleware) dp.message.middleware(ThrottlingMiddleware()) dp.callback_query.middleware(ThrottlingMiddleware()) # Middleware для автоматичСского логирования ΠΊΠ»ΠΈΠΊΠΎΠ² ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ if settings.MENU_LAYOUT_ENABLED: button_stats_middleware = ButtonStatsMiddleware() dp.callback_query.middleware(button_stats_middleware) logger.info("πŸ“Š ButtonStatsMiddleware Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½") if settings.CHANNEL_IS_REQUIRED_SUB: from app.middlewares.channel_checker import ChannelCheckerMiddleware channel_checker_middleware = ChannelCheckerMiddleware() dp.message.middleware(channel_checker_middleware) dp.callback_query.middleware(channel_checker_middleware) logger.info("πŸ”’ ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ подписка Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° - ChannelCheckerMiddleware Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½") else: logger.info("πŸ”“ ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ подписка ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π° - ChannelCheckerMiddleware Π½Π΅ зарСгистрирован") dp.message.middleware(AuthMiddleware()) dp.callback_query.middleware(AuthMiddleware()) dp.pre_checkout_query.middleware(AuthMiddleware()) dp.message.middleware(SubscriptionStatusMiddleware()) dp.callback_query.middleware(SubscriptionStatusMiddleware()) start.register_handlers(dp) menu.register_handlers(dp) subscription.register_handlers(dp) balance.register_balance_handlers(dp) promocode.register_handlers(dp) referral.register_handlers(dp) support.register_handlers(dp) server_status.register_handlers(dp) tickets.register_handlers(dp) admin_main.register_handlers(dp) admin_users.register_handlers(dp) admin_subscriptions.register_handlers(dp) admin_servers.register_handlers(dp) admin_promocodes.register_handlers(dp) admin_messages.register_handlers(dp) admin_monitoring.register_handlers(dp) admin_referrals.register_handlers(dp) admin_rules.register_handlers(dp) admin_remnawave.register_handlers(dp) admin_statistics.register_handlers(dp) admin_polls.register_handlers(dp) admin_promo_groups.register_handlers(dp) admin_campaigns.register_handlers(dp) admin_contests.register_handlers(dp) admin_daily_contests.register_handlers(dp) admin_promo_offers.register_handlers(dp) admin_maintenance.register_handlers(dp) admin_user_messages.register_handlers(dp) admin_updates.register_handlers(dp) admin_backup.register_handlers(dp) admin_system_logs.register_handlers(dp) admin_welcome_text.register_welcome_text_handlers(dp) admin_tickets.register_handlers(dp) admin_reports.register_handlers(dp) admin_bot_configuration.register_handlers(dp) admin_pricing.register_handlers(dp) admin_privacy_policy.register_handlers(dp) admin_public_offer.register_handlers(dp) admin_faq.register_handlers(dp) admin_payments.register_handlers(dp) admin_trials.register_handlers(dp) admin_tariffs.register_handlers(dp) admin_bulk_ban.register_bulk_ban_handlers(dp) admin_blacklist.register_blacklist_handlers(dp) common.register_handlers(dp) register_stars_handlers(dp) user_contests.register_handlers(dp) user_polls.register_handlers(dp) simple_subscription.register_simple_subscription_handlers(dp) logger.info("⭐ ЗарСгистрированы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Telegram Stars ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ") logger.info("⚑ ЗарСгистрированы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ простой ΠΏΠΎΠΊΡƒΠΏΠΊΠΈ") logger.info("⚑ ЗарСгистрированы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ простой подписки") if settings.is_maintenance_monitoring_enabled(): try: await maintenance_service.start_monitoring() logger.info("ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Ρ‚Π΅Ρ…Ρ€Π°Π±ΠΎΡ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½") except Exception as e: logger.error(f"Ошибка запуска ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Ρ‚Π΅Ρ…Ρ€Π°Π±ΠΎΡ‚: {e}") else: logger.info("ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Ρ‚Π΅Ρ…Ρ€Π°Π±ΠΎΡ‚ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ настройками") logger.info("πŸ›‘οΈ GlobalErrorMiddleware Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ - Π±ΠΎΡ‚ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ ΠΎΡ‚ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… callback queries") logger.info("Π‘ΠΎΡ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ настроСн") return bot, dp async def shutdown_bot(): try: await maintenance_service.stop_monitoring() logger.info("ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Ρ‚Π΅Ρ…Ρ€Π°Π±ΠΎΡ‚ остановлСн") except Exception as e: logger.error(f"Ошибка остановки ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°: {e}") try: await cache.close() logger.info("БоСдинСния с кСшСм Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹") except Exception as e: logger.error(f"Ошибка закрытия кСша: {e}")