"""Admin-bot для получения уведомлений о скачанных файлах.""" import logging from telegram import Update from telegram.ext import ( Application, CommandHandler, MessageHandler, filters, ContextTypes, ) from telegram.request import HTTPXRequest from app.config import Config from app.admin_manager import AdminManager from app.statistics import Statistics logger = logging.getLogger(__name__) def get_user_language(update: Update) -> str: """Определить язык пользователя для локализации.""" user = update.effective_user lang_code = user.language_code or 'en' # Если язык русский или начинается с ru, возвращаем 'ru', иначе 'en' return 'ru' if lang_code.startswith('ru') else 'en' def get_start_message(language: str, first_name: str) -> str: """Получить приветственное сообщение для admin-bot в зависимости от языка.""" if language == 'ru': return ( f"Привет, {first_name}! 👋\n\n" "Это административный бот для мониторинга сервиса YouTube → MP3.\n\n" "Ты зарегистрирован как администратор. " "Ты будешь получать уведомления о всех скачанных файлах с метаданными:\n" "• Название файла\n" "• Пользователь, который запросил\n" "• Исходная ссылка на видео\n" "• Сам MP3 файл\n\n" "Используй /stat для просмотра статистики." ) else: return ( f"Hello, {first_name}! 👋\n\n" "This is an admin bot for monitoring the YouTube → MP3 service.\n\n" "You are registered as an administrator. " "You will receive notifications about all downloaded files with metadata:\n" "• File name\n" "• User who requested\n" "• Original video link\n" "• The MP3 file itself\n\n" "Use /stat to view statistics." ) def get_stat_message(language: str, user_count: int, processed_urls: int) -> str: """Получить сообщение со статистикой в зависимости от языка.""" if language == 'ru': return ( "📊 Статистика сервиса:\n\n" f"👥 Уникальных пользователей: {user_count}\n" f"🔗 Обработано ссылок: {processed_urls}" ) else: return ( "📊 Service Statistics:\n\n" f"👥 Unique users: {user_count}\n" f"🔗 Processed links: {processed_urls}" ) async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE): """Обработчик команды /start для регистрации администратора.""" user = update.effective_user admin_manager: AdminManager = context.bot_data.get('admin_manager') language = get_user_language(update) if admin_manager: admin_manager.add_admin(user.id) message = get_start_message(language, user.first_name or "Admin") await update.message.reply_text(message) logger.info(f"Admin registered: {user.id} (@{user.username})") else: error_msg = "Ошибка: менеджер администраторов не инициализирован." if language == 'ru' else "Error: admin manager not initialized." await update.message.reply_text(error_msg) async def stat_command(update: Update, context: ContextTypes.DEFAULT_TYPE): """Обработчик команды /stat для вывода статистики.""" statistics: Statistics = context.bot_data.get('statistics') language = get_user_language(update) if not statistics: error_msg = "Ошибка: статистика не инициализирована." if language == 'ru' else "Error: statistics not initialized." await update.message.reply_text(error_msg) return user_count = statistics.get_user_count() processed_urls = statistics.get_processed_urls_count() message = get_stat_message(language, user_count, processed_urls) await update.message.reply_text(message) logger.info(f"Statistics requested by admin {update.effective_user.id}") def create_admin_bot_application(config: Config, admin_manager: AdminManager, statistics: Statistics) -> Application: """Создать и настроить приложение admin-bot.""" request = HTTPXRequest( connect_timeout=config.tg_connect_timeout, read_timeout=config.tg_read_timeout, write_timeout=config.tg_write_timeout, pool_timeout=config.tg_pool_timeout, ) app = Application.builder().token(config.admin_bot_token).request(request).build() # Сохраняем в bot_data app.bot_data['config'] = config app.bot_data['admin_manager'] = admin_manager app.bot_data['statistics'] = statistics # Обработчик команды /start app.add_handler(CommandHandler("start", start_command)) # Обработчик команды /stat app.add_handler(CommandHandler("stat", stat_command)) # Обработчик всех остальных сообщений (просто игнорируем) app.add_handler(MessageHandler(filters.ALL, lambda u, c: None)) return app