224 lines
11 KiB
Python
224 lines
11 KiB
Python
"""
|
||
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 <user_id или @username>` - Добавить нового пользователя\n"
|
||
"• `/blockuser <user_id или @username>` - Заблокировать пользователя\n"
|
||
"• `/unblockuser <user_id или @username>` - Разблокировать пользователя\n"
|
||
"• `/listusers` - Посмотреть список всех пользователей\n\n"
|
||
"💼 **Управление администраторами:**\n"
|
||
"• `/addadmin <user_id или @username>` - Назначить администратора\n"
|
||
"• `/removeadmin <user_id или @username>` - Снять права администратора\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 <task_id>` для отмены"
|
||
|
||
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 <user_id или @username> - Добавить пользователя\n"
|
||
"• /blockuser <user_id или @username> - Заблокировать пользователя\n"
|
||
"• /unblockuser <user_id или @username> - Разблокировать пользователя\n"
|
||
"• /listusers - Список всех пользователей\n\n"
|
||
"**Управление администраторами:**\n"
|
||
"• /addadmin <user_id или @username> - Назначить администратора\n"
|
||
"• /removeadmin <user_id или @username> - Снять права администратора\n"
|
||
"• /listadmins - Список всех администраторов\n\n"
|
||
"⚠️ **Внимание:** Вы не можете снять права администратора у самого себя."
|
||
)
|
||
else:
|
||
# Regular administrator - only user management
|
||
users_text = (
|
||
"👥 **Управление пользователями:**\n\n"
|
||
"**Доступные команды:**\n"
|
||
"• /adduser <user_id или @username> - Добавить пользователя\n"
|
||
"• /blockuser <user_id или @username> - Заблокировать пользователя\n"
|
||
"• /unblockuser <user_id или @username> - Разблокировать пользователя\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")
|
||
|