""" Callback button handling """ from pyrogram import Client from pyrogram.types import CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton from pyrogram.handlers import CallbackQueryHandler from pyrogram.errors import MessageNotModified from bot.modules.access_control.auth import is_authorized, is_admin, is_owner from bot.modules.message_handler.commands import get_start_keyboard import logging logger = logging.getLogger(__name__) async def callback_handler(client: Client, callback_query: CallbackQuery): """Handle callback queries""" user_id = callback_query.from_user.id data = callback_query.data # Check authorization if not await is_authorized(user_id): await callback_query.answer("❌ У вас нет доступа к этому боту", show_alert=True) return # Handle different callback data if data == "back": # Return to main menu welcome_text = ( "👋 **Привет! Я бот для загрузки медиа-файлов.**\n\n" "📥 **Что я умею:**\n" "• Загружать видео с YouTube, Instagram и других платформ\n" "• Загружать файлы по прямым ссылкам\n" "• Отправлять файлы вам в Telegram\n\n" "**Как использовать:**\n" "Просто отправьте мне ссылку на видео или файл, и я загружу его для вас!\n\n" "Используйте кнопки ниже для управления:" ) keyboard = await get_start_keyboard(user_id) await callback_query.edit_message_text(welcome_text, reply_markup=keyboard) await callback_query.answer() elif data == "help": # Show help help_text = ( "👋 **Привет! Рад помочь!**\n\n" "🎯 **Как начать работу:**\n" "Это очень просто! Просто отправьте мне ссылку на видео или файл, и я сразу начну загрузку.\n\n" "📥 **Что я умею загружать:**\n" "• 🎬 Видео с YouTube, Instagram, TikTok и других платформ\n" "• 📁 Файлы по прямым ссылкам\n" "• 🎵 Аудио и музыку\n" "• 📸 Изображения и фото\n\n" "⌨️ **Основные команды:**\n" "• `/start` - Открыть главное меню с кнопками\n" "• `/help` - Показать эту справку\n" "• `/status` - Посмотреть статус ваших загрузок\n\n" "💡 **Совет:** Используйте кнопки в главном меню для быстрого доступа к функциям!" ) if await is_admin(user_id): help_text += ( "\n\n" "👑 **Команды для администраторов:**\n" "• `/adduser ` - Добавить нового пользователя\n" "• `/removeuser ` - Удалить пользователя\n" "• `/blockuser ` - Заблокировать пользователя\n" "• `/listusers` - Посмотреть список всех пользователей\n\n" "💼 **Управление администраторами:**\n" "• `/addadmin ` - Назначить администратора\n" "• `/removeadmin ` - Снять права администратора\n" "• `/listadmins` - Список всех администраторов" ) keyboard = InlineKeyboardMarkup([[ InlineKeyboardButton("🔙 Назад", callback_data="back") ]]) await callback_query.edit_message_text(help_text, reply_markup=keyboard) await callback_query.answer() elif data == "status": # Show task status from bot.modules.task_scheduler.monitor import get_user_tasks_status from bot.modules.task_scheduler.queue import TaskStatus tasks = await get_user_tasks_status(user_id) active_tasks = [t for t in tasks if t.get('status') in ['pending', 'processing']] completed = [t for t in tasks if t.get('status') == 'completed'] failed = [t for t in tasks if t.get('status') == 'failed'] status_text = ( "📊 **Статус задач:**\n\n" f"⏳ Активных задач: {len(active_tasks)}\n" f"✅ Завершено: {len(completed)}\n" f"❌ Ошибок: {len(failed)}\n\n" ) if active_tasks: status_text += "**Активные задачи:**\n" for task in active_tasks[:5]: # Show first 5 task_id = task.get('id') progress = task.get('progress', 0) status_text += f"• #{task_id} - {progress}%\n" if len(active_tasks) > 5: status_text += f"... и еще {len(active_tasks) - 5}\n" status_text += "\n💡 Используйте `/cancel ` для отмены" keyboard = InlineKeyboardMarkup([[ InlineKeyboardButton("🔄 Обновить", callback_data="status"), InlineKeyboardButton("🔙 Назад", callback_data="back") ]]) try: await callback_query.edit_message_text(status_text, reply_markup=keyboard) await callback_query.answer("✅ Статус обновлен") except MessageNotModified: # If text didn't change, just answer callback await callback_query.answer("✅ Статус актуален") elif data == "download": # Download information download_text = ( "📥 **Загрузка файлов:**\n\n" "**Поддерживаемые источники:**\n" "• YouTube (видео, плейлисты)\n" "• Instagram (посты, истории)\n" "• Прямые ссылки на файлы\n" "• Другие платформы через yt-dlp\n\n" "**Как использовать:**\n" "Просто отправьте мне ссылку на видео или файл, и я начну загрузку!\n\n" "Примеры:\n" "• https://www.youtube.com/watch?v=...\n" "• https://www.instagram.com/p/...\n" "• https://example.com/file.mp4" ) keyboard = InlineKeyboardMarkup([[ InlineKeyboardButton("🔙 Назад", callback_data="back") ]]) await callback_query.edit_message_text(download_text, reply_markup=keyboard) await callback_query.answer() elif data == "admin_users": # User management (admin only) if not await is_admin(user_id): await callback_query.answer("❌ Только для администраторов", show_alert=True) return # Determine user status is_owner_user = await is_owner(user_id) # Form text and buttons depending on status if is_owner_user: # Main admin - full functionality users_text = ( "👥 **Управление пользователями:**\n\n" "**Управление пользователями:**\n" "• /adduser - Добавить пользователя\n" "• /removeuser - Удалить пользователя\n" "• /blockuser - Заблокировать пользователя\n" "• /listusers - Список всех пользователей\n\n" "**Управление администраторами:**\n" "• /addadmin - Назначить администратора\n" "• /removeadmin - Снять права администратора\n" "• /listadmins - Список всех администраторов\n\n" "⚠️ **Внимание:** Вы не можете снять права администратора у самого себя." ) else: # Regular administrator - only user management users_text = ( "👥 **Управление пользователями:**\n\n" "**Доступные команды:**\n" "• /adduser - Добавить пользователя\n" "• /removeuser - Удалить пользователя\n" "• /blockuser - Заблокировать пользователя\n" "• /listusers - Список всех пользователей\n\n" "_Управление через веб-интерфейс будет доступно позже_" ) keyboard = InlineKeyboardMarkup([[ InlineKeyboardButton("🔙 Назад", callback_data="back") ]]) await callback_query.edit_message_text(users_text, reply_markup=keyboard) await callback_query.answer() elif data == "admin_stats": # Statistics (admin only) if not await is_admin(user_id): await callback_query.answer("❌ Только для администраторов", show_alert=True) return stats_text = ( "📈 **Статистика:**\n\n" "👥 Всего пользователей: 0\n" "👑 Администраторов: 0\n" "📥 Всего загрузок: 0\n" "✅ Успешных: 0\n" "❌ Ошибок: 0\n\n" "_Статистика будет реализована в следующем этапе_" ) keyboard = InlineKeyboardMarkup([[ InlineKeyboardButton("🔙 Назад", callback_data="back") ]]) await callback_query.edit_message_text(stats_text, reply_markup=keyboard) await callback_query.answer() else: await callback_query.answer("❓ Неизвестная команда") def register_callbacks(app: Client): """Register all callback handlers""" app.add_handler(CallbackQueryHandler(callback_handler)) logger.info("Callback handlers registered")